Skip to main content
Glama
useStep.ts2.91 kB
'use client'; import { usePersistedStore } from '@intlayer/design-system/hooks'; import { useParams, useRouter, useSearchParams } from 'next/navigation'; import { formatOnboardUrl } from './formatOnboardUrl'; import { getPlanDetails } from './getPlanDetails'; import { type OnboardingStepIds, onboardingSteps, sessionStorageIndex, } from './steps'; export const useStep = <T extends OnboardingStepIds>(stepId: T) => { type Step = (typeof onboardingSteps)[T]; const router = useRouter(); const step = onboardingSteps[stepId] as Step; const { details } = useParams<{ details: string[] }>(); const pageDetails = getPlanDetails(details); const searchParams = useSearchParams(); const { origin, ...otherParams } = Object.fromEntries(searchParams.entries()); const [dynamicsContent, setDynamicsContent] = usePersistedStore<Pick< Step, 'state' | 'formData' > | null>(`${sessionStorageIndex}${stepId}`, { state: step.state, formData: step.formData, }); type NextUrlType = Step['getNextStep'] extends undefined ? undefined : string; const nextUrl: NextUrlType = ( step.getNextStep ? formatOnboardUrl({ ...pageDetails, origin, step: step.getNextStep(pageDetails), otherParams, }) : undefined ) as NextUrlType; type PreviousUrlType = Step['getPreviousStep'] extends undefined ? undefined : string; const previousUrl: PreviousUrlType = ( step.getPreviousStep ? formatOnboardUrl({ ...pageDetails, origin, step: step.getPreviousStep(pageDetails), otherParams, }) : undefined ) as PreviousUrlType; type GoNextStepType = Step['getNextStep'] extends undefined ? undefined : () => void; const goNextStep: GoNextStepType = ( nextUrl ? () => { if (nextUrl) { router.push(nextUrl); } } : undefined ) as GoNextStepType; type GoPreviousStepType = Step['getPreviousStep'] extends undefined ? () => undefined : () => void; const goPreviousStep: GoPreviousStepType = ( previousUrl ? () => { if (previousUrl) { router.push(previousUrl); } } : origin ? () => router.push(origin) : undefined ) as GoPreviousStepType; const setState = (data: Partial<Step['state']>) => setDynamicsContent((prev) => ({ ...prev, state: { ...(prev?.state as Step['state']), ...data, }, })); const setFormData = (data: Partial<Step['formData']>) => setDynamicsContent((prev) => ({ ...prev, formData: { ...(prev?.formData as Step['formData']), ...data, }, })); return { ...step, ...dynamicsContent, nextUrl, previousUrl, goNextStep, goPreviousStep, setState, setFormData, }; };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aymericzip/intlayer'

If you have feedback or need assistance with the MCP directory API, please join our Discord server