Includes room interior with floor, walls, glass you can see through, and all uncommitted production changes that were running live. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
64 lines
1.4 KiB
TypeScript
64 lines
1.4 KiB
TypeScript
"use client";
|
|
|
|
import {
|
|
createContext,
|
|
useContext,
|
|
useState,
|
|
useCallback,
|
|
type ReactNode,
|
|
} from "react";
|
|
|
|
const TOTAL_STEPS = 6; // Product, Dimensions, Options, Extras, Contact, Summary
|
|
|
|
interface FormContextValue {
|
|
currentStep: number;
|
|
totalSteps: number;
|
|
nextStep: () => void;
|
|
prevStep: () => void;
|
|
goToStep: (step: number) => void;
|
|
reset: () => void;
|
|
}
|
|
|
|
const FormContext = createContext<FormContextValue | null>(null);
|
|
|
|
export function FormProvider({ children }: { children: ReactNode }) {
|
|
const [currentStep, setCurrentStep] = useState(0);
|
|
|
|
const nextStep = useCallback(() => {
|
|
setCurrentStep((s) => Math.min(s + 1, TOTAL_STEPS - 1));
|
|
}, []);
|
|
|
|
const prevStep = useCallback(() => {
|
|
setCurrentStep((s) => Math.max(s - 1, 0));
|
|
}, []);
|
|
|
|
const goToStep = useCallback((step: number) => {
|
|
setCurrentStep(Math.max(0, Math.min(step, TOTAL_STEPS - 1)));
|
|
}, []);
|
|
|
|
const reset = useCallback(() => {
|
|
setCurrentStep(0);
|
|
}, []);
|
|
|
|
return (
|
|
<FormContext.Provider
|
|
value={{
|
|
currentStep,
|
|
totalSteps: TOTAL_STEPS,
|
|
nextStep,
|
|
prevStep,
|
|
goToStep,
|
|
reset,
|
|
}}
|
|
>
|
|
{children}
|
|
</FormContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useFormContext() {
|
|
const ctx = useContext(FormContext);
|
|
if (!ctx) throw new Error("useFormContext must be used within <FormProvider>");
|
|
return ctx;
|
|
}
|