diff --git a/chatgpt-to-claude/src/components/wizard/useWizardState.ts b/chatgpt-to-claude/src/components/wizard/useWizardState.ts new file mode 100644 index 000000000..8e17b7444 --- /dev/null +++ b/chatgpt-to-claude/src/components/wizard/useWizardState.ts @@ -0,0 +1,113 @@ +import { useState, useEffect, useCallback } from "react"; + +export type WizardStep = 1 | 2 | 3 | 4; + +interface WizardState { + currentStep: WizardStep; + extractedText: string; + trimmedText: string; + isComplete: boolean; +} + +const STORAGE_KEY = "ctc-wizard-state"; + +const defaultState: WizardState = { + currentStep: 1, + extractedText: "", + trimmedText: "", + isComplete: false, +}; + +function loadState(): WizardState { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return defaultState; + const parsed = JSON.parse(raw) as Partial; + return { ...defaultState, ...parsed }; + } catch { + return defaultState; + } +} + +function saveState(state: WizardState) { + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); + } catch { + // localStorage full or unavailable + } +} + +export function useWizardState() { + const [state, setState] = useState(defaultState); + const [loaded, setLoaded] = useState(false); + + useEffect(() => { + setState(loadState()); + setLoaded(true); + }, []); + + useEffect(() => { + if (loaded) saveState(state); + }, [state, loaded]); + + const setStep = useCallback((step: WizardStep) => { + setState((prev) => ({ ...prev, currentStep: step })); + }, []); + + const setExtractedText = useCallback((text: string) => { + setState((prev) => ({ ...prev, extractedText: text, trimmedText: text })); + }, []); + + const setTrimmedText = useCallback((text: string) => { + setState((prev) => ({ ...prev, trimmedText: text })); + }, []); + + const setComplete = useCallback(() => { + setState((prev) => ({ ...prev, isComplete: true })); + }, []); + + const reset = useCallback(() => { + setState(defaultState); + localStorage.removeItem(STORAGE_KEY); + }, []); + + const canGoNext = useCallback((): boolean => { + switch (state.currentStep) { + case 1: + return true; + case 2: + return state.extractedText.trim().length > 0; + case 3: + return true; + case 4: + return true; + default: + return false; + } + }, [state.currentStep, state.extractedText]); + + const next = useCallback(() => { + if (state.currentStep < 4 && canGoNext()) { + setStep((state.currentStep + 1) as WizardStep); + } + }, [state.currentStep, canGoNext, setStep]); + + const back = useCallback(() => { + if (state.currentStep > 1) { + setStep((state.currentStep - 1) as WizardStep); + } + }, [state.currentStep, setStep]); + + return { + ...state, + loaded, + setStep, + setExtractedText, + setTrimmedText, + setComplete, + reset, + canGoNext, + next, + back, + }; +} diff --git a/memory/memories.db-shm b/memory/memories.db-shm index d86df62a4..ee075945a 100644 Binary files a/memory/memories.db-shm and b/memory/memories.db-shm differ diff --git a/memory/memories.db-wal b/memory/memories.db-wal index a8bf41584..a46752f41 100644 Binary files a/memory/memories.db-wal and b/memory/memories.db-wal differ