Vercel/src/state/AppStateProvider.tsx
2025-02-17 17:54:00 -06:00

147 lines
4.3 KiB
TypeScript

'use client';
import { useState, useEffect, ReactNode, useCallback } from 'react';
import { AppStateContext } from './AppState';
import { AnimationConfig } from '@/components/AnimateItems';
import usePathnames from '@/utility/usePathnames';
import { getAuthAction } from '@/auth/actions';
import useSWR from 'swr';
import {
HIGH_DENSITY_GRID,
MATTE_PHOTOS,
SHOW_ZOOM_CONTROLS,
} from '@/app/config';
import { getPhotosHiddenMetaCachedAction } from '@/photo/actions';
import { ShareModalProps } from '@/share';
import { storeTimezoneCookie } from '@/utility/timezone';
import { getShouldShowInsightsIndicatorAction } from '@/admin/insights/actions';
import { InsightIndicatorStatus } from '@/admin/insights';
export default function AppStateProvider({
children,
}: {
children: ReactNode
}) {
const { previousPathname } = usePathnames();
// CORE
const [hasLoaded, setHasLoaded] =
useState(false);
const [swrTimestamp, setSwrTimestamp] =
useState(Date.now());
const [nextPhotoAnimation, setNextPhotoAnimation] =
useState<AnimationConfig>();
const [shouldRespondToKeyboardCommands, setShouldRespondToKeyboardCommands] =
useState(true);
// MODAL
const [isCommandKOpen, setIsCommandKOpen] =
useState(false);
const [shareModalProps, setShareModalProps] =
useState<ShareModalProps>();
// ADMIN
const [userEmail, setUserEmail] =
useState<string>();
const [adminUpdateTimes, setAdminUpdateTimes] =
useState<Date[]>([]);
const [hiddenPhotosCount, setHiddenPhotosCount] =
useState(0);
const [selectedPhotoIds, setSelectedPhotoIds] =
useState<string[] | undefined>();
const [isPerformingSelectEdit, setIsPerformingSelectEdit] =
useState(false);
const [insightIndicatorStatus, setInsightIndicatorStatus] =
useState<InsightIndicatorStatus>();
// DEBUG
const [isGridHighDensity, setIsGridHighDensity] =
useState(HIGH_DENSITY_GRID);
const [areZoomControlsShown, setAreZoomControlsShown] =
useState(SHOW_ZOOM_CONTROLS);
const [arePhotosMatted, setArePhotosMatted] =
useState(MATTE_PHOTOS);
const [shouldDebugImageFallbacks, setShouldDebugImageFallbacks] =
useState(false);
const [shouldShowBaselineGrid, setShouldShowBaselineGrid] =
useState(false);
const invalidateSwr = useCallback(() => setSwrTimestamp(Date.now()), []);
const { data, error } = useSWR('getAuth', getAuthAction);
useEffect(() => {
if (!error) {
setUserEmail(data?.user?.email ?? undefined);
}
}, [data, error]);
const isUserSignedIn = Boolean(userEmail);
useEffect(() => {
if (isUserSignedIn) {
const timeout = setTimeout(() =>{
getPhotosHiddenMetaCachedAction()
.then(({ count }) => setHiddenPhotosCount(count));
getShouldShowInsightsIndicatorAction()
.then(setInsightIndicatorStatus);
}, 100);
return () => clearTimeout(timeout);
} else {
setHiddenPhotosCount(0);
}
}, [isUserSignedIn]);
const registerAdminUpdate = useCallback(() =>
setAdminUpdateTimes(updates => [...updates, new Date()])
, []);
useEffect(() => {
setHasLoaded?.(true);
storeTimezoneCookie();
}, []);
return (
<AppStateContext.Provider
value={{
// CORE
previousPathname,
hasLoaded,
setHasLoaded,
swrTimestamp,
invalidateSwr,
nextPhotoAnimation,
setNextPhotoAnimation,
clearNextPhotoAnimation: () => setNextPhotoAnimation?.(undefined),
shouldRespondToKeyboardCommands,
setShouldRespondToKeyboardCommands,
// MODAL
isCommandKOpen,
setIsCommandKOpen,
shareModalProps,
setShareModalProps,
// ADMIN
userEmail,
setUserEmail,
isUserSignedIn,
adminUpdateTimes,
registerAdminUpdate,
hiddenPhotosCount,
selectedPhotoIds,
setSelectedPhotoIds,
isPerformingSelectEdit,
setIsPerformingSelectEdit,
insightIndicatorStatus,
setInsightIndicatorStatus,
// DEBUG
isGridHighDensity,
setIsGridHighDensity,
areZoomControlsShown,
setAreZoomControlsShown,
arePhotosMatted,
setArePhotosMatted,
shouldDebugImageFallbacks,
setShouldDebugImageFallbacks,
shouldShowBaselineGrid,
setShouldShowBaselineGrid,
}}
>
{children}
</AppStateContext.Provider>
);
};