2026-03-02T08-39-06_auto_memory/memories.db-wal

This commit is contained in:
Nicholai Vogel 2026-03-02 01:39:06 -07:00
parent 6c47cf28d7
commit abf5ab161d
3 changed files with 113 additions and 0 deletions

View 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.