2026-03-02T08-39-06_auto_memory/memories.db-wal
This commit is contained in:
parent
6c47cf28d7
commit
abf5ab161d
113
chatgpt-to-claude/src/components/wizard/useWizardState.ts
Normal file
113
chatgpt-to-claude/src/components/wizard/useWizardState.ts
Normal file
@ -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<WizardState>;
|
||||
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<WizardState>(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,
|
||||
};
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user