From ea657c78b5e7b63649a96b92c7b04701702ace69 Mon Sep 17 00:00:00 2001 From: CPTProgrammer <46586216+CPTProgrammer@users.noreply.github.com> Date: Thu, 16 Jul 2026 20:43:00 +0800 Subject: [PATCH] Use built-in Table rowSelection --- src/components/PublishModal.tsx | 106 ++++++++++++-------------------- 1 file changed, 41 insertions(+), 65 deletions(-) diff --git a/src/components/PublishModal.tsx b/src/components/PublishModal.tsx index b13378d..e1e6874 100644 --- a/src/components/PublishModal.tsx +++ b/src/components/PublishModal.tsx @@ -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>( - new Set(), - ); + const [selectedModrinth, setSelectedModrinth] = useState([]); + const [selectedCurseforge, setSelectedCurseforge] = useState([]); // 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(); - 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) => ( - { - 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) => ( - { - 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({ setSelectedModrinth(keys as string[]), + getCheckboxProps: (r: PublishVersion) => ({ + disabled: r.existsModrinth, + }), + }} pagination={false} size="small" bordered @@ -376,6 +353,13 @@ export function PublishModal({
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 (