From b71f9e94e80efc9c132f31c721b5c1988d1a1e83 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Tue, 12 Mar 2024 15:36:41 -0500 Subject: [PATCH] Show spinner when creating/updating photos --- src/app/admin/uploads/[uploadPath]/page.tsx | 16 ++-------- src/components/AdminChildPage.tsx | 13 ++++++-- src/components/SubmitButtonWithStatus.tsx | 8 ++++- src/photo/PhotoEditPageClient.tsx | 5 +++ src/photo/UploadPageClient.tsx | 35 +++++++++++++++++++++ src/photo/form/PhotoForm.tsx | 7 ++++- 6 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 src/photo/UploadPageClient.tsx diff --git a/src/app/admin/uploads/[uploadPath]/page.tsx b/src/app/admin/uploads/[uploadPath]/page.tsx index 9dca170b..b59ccc45 100644 --- a/src/app/admin/uploads/[uploadPath]/page.tsx +++ b/src/app/admin/uploads/[uploadPath]/page.tsx @@ -1,9 +1,8 @@ -import PhotoForm from '@/photo/form/PhotoForm'; -import AdminChildPage from '@/components/AdminChildPage'; -import { PATH_ADMIN, PATH_ADMIN_UPLOADS } from '@/site/paths'; +import { PATH_ADMIN } from '@/site/paths'; import { extractExifDataFromBlobPath } from '@/photo/server'; import { redirect } from 'next/navigation'; import { getUniqueTagsCached } from '@/photo/cache'; +import UploadPageClient from '@/photo/UploadPageClient'; interface Params { params: { uploadPath: string } @@ -20,15 +19,6 @@ export default async function UploadPage({ params: { uploadPath } }: Params) { if (!photoFormExif) { redirect(PATH_ADMIN); } return ( - - - + ); }; diff --git a/src/components/AdminChildPage.tsx b/src/components/AdminChildPage.tsx index 3b6b906e..d5afc963 100644 --- a/src/components/AdminChildPage.tsx +++ b/src/components/AdminChildPage.tsx @@ -4,18 +4,21 @@ import { FiArrowLeft } from 'react-icons/fi'; import SiteGrid from './SiteGrid'; import { clsx } from 'clsx/lite'; import Badge from './Badge'; +import Spinner from './Spinner'; function AdminChildPage({ backPath, backLabel, breadcrumb, accessory, + isLoading, children, }: { backPath?: string backLabel?: string breadcrumb?: ReactNode accessory?: ReactNode + isLoading?: boolean children: ReactNode, }) { return ( @@ -42,10 +45,14 @@ function AdminChildPage({ {breadcrumb && <> / - - {breadcrumb} - + + + {breadcrumb} + + } + {isLoading && + } {accessory &&
{accessory}
} diff --git a/src/components/SubmitButtonWithStatus.tsx b/src/components/SubmitButtonWithStatus.tsx index ef6cd05e..7bd2e551 100644 --- a/src/components/SubmitButtonWithStatus.tsx +++ b/src/components/SubmitButtonWithStatus.tsx @@ -10,6 +10,7 @@ interface Props extends HTMLProps { icon?: JSX.Element styleAsLink?: boolean spinnerColor?: SpinnerColor + onFormStatusChange?: (pending: boolean) => void onFormSubmitToastMessage?: string } @@ -17,6 +18,7 @@ export default function SubmitButtonWithStatus({ icon, styleAsLink, spinnerColor, + onFormStatusChange, onFormSubmitToastMessage, children, disabled, @@ -24,8 +26,8 @@ export default function SubmitButtonWithStatus({ type: _type, ...buttonProps }: Props) { - const { pending } = useFormStatus(); + const pendingPrevious = useRef(pending); useEffect(() => { @@ -39,6 +41,10 @@ export default function SubmitButtonWithStatus({ pendingPrevious.current = pending; }, [pending, onFormSubmitToastMessage]); + useEffect(() => { + onFormStatusChange?.(pending); + }, [onFormStatusChange, pending]); + return (