import { Dispatch, SetStateAction, createContext, use, RefObject, } from 'react'; import { AnimationConfig } from '@/components/AnimateItems'; import { ShareModalProps } from '@/share'; import { InsightsIndicatorStatus } from '@/admin/insights'; import { INITIAL_UPLOAD_STATE, UploadState } from '@/admin/upload'; import { AdminData } from '@/admin/actions'; import { RecipeProps } from '@/recipe'; import { getCountsForCategoriesCachedAction } from '@/category/actions'; export type AppStateContextType = { // CORE previousPathname?: string hasLoaded?: boolean setHasLoaded?: Dispatch> swrTimestamp?: number invalidateSwr?: () => void nextPhotoAnimation?: AnimationConfig setNextPhotoAnimation?: (animationConfig?: AnimationConfig) => void getNextPhotoAnimationId?: () => string clearNextPhotoAnimation?: (id?: string) => void shouldRespondToKeyboardCommands?: boolean setShouldRespondToKeyboardCommands?: Dispatch> categoriesWithCounts?: Awaited> // MODAL isCommandKOpen?: boolean setIsCommandKOpen?: Dispatch> shareModalProps?: ShareModalProps setShareModalProps?: Dispatch> recipeModalProps?: RecipeProps setRecipeModalProps?: Dispatch> // AUTH userEmail?: string setUserEmail?: Dispatch> isUserSignedIn?: boolean isUserSignedInEager?: boolean clearAuthStateAndRedirectIfNecessary?: () => void // ADMIN isCheckingAuth?: boolean adminUpdateTimes?: Date[] registerAdminUpdate?: () => void hasAdminData?: boolean isLoadingAdminData?: boolean refreshAdminData?: () => void updateAdminData?: (updatedData: Partial) => void selectedPhotoIds?: string[] setSelectedPhotoIds?: Dispatch> isPerformingSelectEdit?: boolean setIsPerformingSelectEdit?: Dispatch> insightsIndicatorStatus?: InsightsIndicatorStatus // UPLOAD startUpload?: (onStart?: () => void) => void uploadInputRef?: RefObject uploadState: UploadState setUploadState?: (uploadState: Partial) => void resetUploadState?: () => void // DEBUG isGridHighDensity?: boolean setIsGridHighDensity?: Dispatch> areZoomControlsShown?: boolean setAreZoomControlsShown?: Dispatch> arePhotosMatted?: boolean setArePhotosMatted?: Dispatch> shouldDebugImageFallbacks?: boolean setShouldDebugImageFallbacks?: Dispatch> shouldShowBaselineGrid?: boolean setShouldShowBaselineGrid?: Dispatch> shouldDebugInsights?: boolean setShouldDebugInsights?: Dispatch> shouldDebugRecipeOverlays?: boolean setShouldDebugRecipeOverlays?: Dispatch> } & Partial export const AppStateContext = createContext({ uploadState: INITIAL_UPLOAD_STATE, }); export const useAppState = () => use(AppStateContext);