Use built-in Table rowSelection

This commit is contained in:
CPTProgrammer 2026-07-16 20:43:00 +08:00
parent 9d63c2028f
commit ea657c78b5
No known key found for this signature in database

View File

@ -1,12 +1,11 @@
"use client";
import { useState, useCallback, useMemo, useEffect } from "react";
import { useState, useCallback, useMemo, useEffect, useRef } from "react";
import {
Modal,
Steps,
Button,
Space,
Checkbox,
Table,
Select,
Row,
@ -95,9 +94,8 @@ export function PublishModal({
const [currentStep, setCurrentStep] = useState(0);
// Version selection
const [selectedVersions, setSelectedVersions] = useState<Set<string>>(
new Set(),
);
const [selectedModrinth, setSelectedModrinth] = useState<string[]>([]);
const [selectedCurseforge, setSelectedCurseforge] = useState<string[]>([]);
// Publish settings
const [changelog, setChangelog] = useState("");
@ -202,21 +200,30 @@ export function PublishModal({
[project, versionTmpl, versionNameTmpl, mrExplicitMap, cfExplicitMap, existingModrinth, existingCurseforge],
);
// Auto-select all non-existing versions when data first loads
const initRef = useRef(false);
useEffect(() => {
if (open) {
initRef.current = false;
}
}, [open]);
useEffect(() => {
if (!loadingExisting && publishVersions.length > 0 && !initRef.current) {
initRef.current = true;
setSelectedModrinth(
publishVersions.filter((v) => !v.existsModrinth).map((v) => v.key),
);
setSelectedCurseforge(
publishVersions.filter((v) => !v.existsCurseforge).map((v) => v.key),
);
}
}, [loadingExisting, publishVersions]);
// --------------- Steps handling ---------------
const handleNext = useCallback(() => {
if (currentStep === 0) {
// Init selection with all non-existing entries
const preselected = new Set<string>();
for (const v of publishVersions) {
if (!v.existsModrinth || !v.existsCurseforge) {
preselected.add(v.key);
}
}
setSelectedVersions(preselected);
}
setCurrentStep((prev) => Math.min(prev + 1, 2));
}, [currentStep, publishVersions]);
}, []);
const handlePrev = useCallback(() => {
setCurrentStep((prev) => Math.max(prev - 1, 0));
@ -236,7 +243,8 @@ export function PublishModal({
const handleClose = useCallback(() => {
if (publishing) return;
setCurrentStep(0);
setSelectedVersions(new Set());
setSelectedModrinth([]);
setSelectedCurseforge([]);
setChangelog("");
setVersionType("release");
setPublishResult(null);
@ -265,25 +273,6 @@ export function PublishModal({
dataIndex: "modrinthVersionName",
key: "modrinthVersionName",
},
{
title: "",
key: "select",
width: 50,
render: (_: unknown, record: PublishVersion) => (
<Checkbox
disabled={record.existsModrinth}
checked={
record.existsModrinth || selectedVersions.has(record.key)
}
onChange={(e) => {
const next = new Set(selectedVersions);
if (e.target.checked) next.add(record.key);
else next.delete(record.key);
setSelectedVersions(next);
}}
/>
),
},
];
const curseforgeColumns = [
@ -306,25 +295,6 @@ export function PublishModal({
key: "artifact",
ellipsis: true,
},
{
title: "",
key: "select",
width: 50,
render: (_: unknown, record: PublishVersion) => (
<Checkbox
disabled={record.existsCurseforge}
checked={
record.existsCurseforge || selectedVersions.has(record.key)
}
onChange={(e) => {
const next = new Set(selectedVersions);
if (e.target.checked) next.add(record.key);
else next.delete(record.key);
setSelectedVersions(next);
}}
/>
),
},
];
return (
@ -360,6 +330,13 @@ export function PublishModal({
<Table
dataSource={publishVersions}
columns={modrinthColumns}
rowSelection={{
selectedRowKeys: selectedModrinth,
onChange: (keys) => setSelectedModrinth(keys as string[]),
getCheckboxProps: (r: PublishVersion) => ({
disabled: r.existsModrinth,
}),
}}
pagination={false}
size="small"
bordered
@ -376,6 +353,13 @@ export function PublishModal({
<Table
dataSource={publishVersions}
columns={curseforgeColumns}
rowSelection={{
selectedRowKeys: selectedCurseforge,
onChange: (keys) => setSelectedCurseforge(keys as string[]),
getCheckboxProps: (r: PublishVersion) => ({
disabled: r.existsCurseforge,
}),
}}
pagination={false}
size="small"
bordered
@ -436,16 +420,8 @@ export function PublishModal({
// --------------- Render: Step 3 — Progress & Result ---------------
const renderStep3 = () => {
const hasModrinth = publishVersions.some(
(v) =>
!v.existsModrinth &&
(selectedVersions.has(v.key) || v.existsModrinth),
);
const hasCurseforge = publishVersions.some(
(v) =>
!v.existsCurseforge &&
(selectedVersions.has(v.key) || v.existsCurseforge),
);
const hasModrinth = selectedModrinth.length > 0;
const hasCurseforge = selectedCurseforge.length > 0;
return (
<div>