diff --git a/components/admin/guide-section-editor.tsx b/components/admin/guide-section-editor.tsx index cc2239f..a5d8c08 100644 --- a/components/admin/guide-section-editor.tsx +++ b/components/admin/guide-section-editor.tsx @@ -190,6 +190,8 @@ const teamMemberApplyOptions = [ ["refinement", "R"], ["damage", "Damage"], ] as const satisfies readonly (readonly [TeamMemberApplyField, string])[]; +const multipleApplyStorageKey = (guideId: string) => + `buzz-sheet:team-multiple-apply:${guideId}`; type Guide = { id: string; characterKey: string; @@ -2244,6 +2246,7 @@ function TeamEditor({ const [presetsHydrated, setPresetsHydrated] = useState(false); const [presetsGuideId, setPresetsGuideId] = useState(null); const [applyFields, setApplyFields] = useState([]); + const [multipleApplyGuideId, setMultipleApplyGuideId] = useState(null); const [searchQuery, setSearchQuery] = useState(""); const [searchTarget, setSearchTarget] = useState("all"); const filteredTeams = useMemo(() => { @@ -2310,6 +2313,49 @@ function TeamEditor({ }, 0); return () => window.clearTimeout(timer); }, [guide.id]); + useEffect(() => { + const timer = window.setTimeout(() => { + try { + const stored = JSON.parse( + window.localStorage.getItem(multipleApplyStorageKey(guide.id)) ?? "null", + ) as { selectedTeamIds?: unknown; applyFields?: unknown } | null; + const teamIds = new Set(initial.teams.map((team) => team.id)); + setSelectedTeamIds(new Set( + Array.isArray(stored?.selectedTeamIds) + ? stored.selectedTeamIds.filter( + (id): id is string => typeof id === "string" && teamIds.has(id), + ) + : [], + )); + setApplyFields( + Array.isArray(stored?.applyFields) + ? stored.applyFields.filter( + (field): field is TeamApplySelection => typeof field === "string", + ) + : [], + ); + } catch { + setSelectedTeamIds(new Set()); + setApplyFields([]); + } + setMultipleApplyGuideId(guide.id); + }, 0); + return () => window.clearTimeout(timer); + }, [guide.id, initial.teams]); + useEffect(() => { + if (multipleApplyGuideId !== guide.id) return; + try { + window.localStorage.setItem( + multipleApplyStorageKey(guide.id), + JSON.stringify({ + selectedTeamIds: [...selectedTeamIds], + applyFields, + }), + ); + } catch { + // Browser storage is optional; multiple apply remains usable without it. + } + }, [applyFields, guide.id, multipleApplyGuideId, selectedTeamIds]); useEffect(() => { if (!presetsHydrated || presetsGuideId !== guide.id) return; try {