import type { ExtendedSupportCategories } from './Support.constants' import { neverGuard } from '@/lib/helpers' export type SupportFormState = | { type: 'initializing' } | { type: 'editing' } | { type: 'submitting' } | { type: 'success' sentProjectRef: string | undefined sentOrgSlug: string | undefined sentCategory: ExtendedSupportCategories } | { type: 'error' message: string } export type SupportFormActions = | { type: 'INITIALIZE'; debugSource?: string } | { type: 'SUBMIT'; debugSource?: string } | { type: 'SUCCESS' sentProjectRef: string | undefined sentOrgSlug: string | undefined sentCategory: ExtendedSupportCategories debugSource?: string } | { type: 'ERROR'; message: string; debugSource?: string } | { type: 'RETURN_TO_EDITING'; debugSource?: string } export function createInitialSupportFormState(): SupportFormState { return { type: 'initializing', } } export function supportFormReducer( state: SupportFormState, action: SupportFormActions ): SupportFormState { switch (state.type) { case 'initializing': if (action.type === 'INITIALIZE') { return { type: 'editing' } } console.warn( `[SupportForm > supportFormReducer] ${action.type} action not allowed in 'initializing' state` ) return state case 'editing': if (action.type === 'SUBMIT') { return { type: 'submitting' } } console.warn( `[SupportForm > supportFromReducer] ${action.type} action not allowed in 'filling_out' state` ) return state case 'submitting': if (action.type === 'SUCCESS') { return { type: 'success', sentProjectRef: action.sentProjectRef, sentOrgSlug: action.sentOrgSlug, sentCategory: action.sentCategory, } } if (action.type === 'ERROR') { return { type: 'error', message: action.message, } } console.warn( `[SupportForm > supportFormReducer] ${action.type} action not allowed in 'submitting' state` ) return state case 'success': console.warn(`[SupportForm > supportFormReducer] ${action.type} allowed in 'success' state`) return state case 'error': if (action.type === 'RETURN_TO_EDITING') { return { type: 'editing' } } console.warn(`[SupportForm > supportFormReducer] ${action.type} allowed in 'success' state`) return state default: return neverGuard(state) } }