diff --git a/src/admin/AdminAddAllUploads.tsx b/src/admin/AdminAddAllUploads.tsx index 3810a115..0b5a2886 100644 --- a/src/admin/AdminAddAllUploads.tsx +++ b/src/admin/AdminAddAllUploads.tsx @@ -3,7 +3,6 @@ import ErrorNote from '@/components/ErrorNote'; import FieldSetWithStatus from '@/components/FieldSetWithStatus'; import Container from '@/components/Container'; -import LoaderButton from '@/components/primitives/LoaderButton'; import { addAllUploadsAction } from '@/photo/actions'; import { PATH_ADMIN_PHOTOS } from '@/site/paths'; import { @@ -21,6 +20,7 @@ import { clsx } from 'clsx/lite'; import { useRouter } from 'next/navigation'; import { Dispatch, SetStateAction, useRef, useState } from 'react'; import { BiCheckCircle, BiImageAdd } from 'react-icons/bi'; +import ProgressButton from '@/components/primitives/ProgressButton'; const UPLOAD_BATCH_SIZE = 4; @@ -45,6 +45,7 @@ export default function AdminAddAllUploads({ const [tags, setTags] = useState(''); const [actionErrorMessage, setActionErrorMessage] = useState(''); const [tagErrorMessage, setTagErrorMessage] = useState(''); + const [addingProgress, setAddingProgress] = useState(); const [isAddingComplete, setIsAddingComplete] = useState(false); const router = useRouter(); @@ -64,6 +65,10 @@ export default function AdminAddAllUploads({ : `Adding ${addedUploadUrls.current.length} of ${storageUrls.length}` ); setButtonSubheadText(data?.subhead ?? ''); + setAddingProgress(( + addedUploadUrls.current.length / + storageUrls.length + ) * 0.95); setAddedUploadUrls?.(current => { const urls = data?.addedUploadUrls.split(',') ?? []; const updatedUrls = current @@ -76,6 +81,7 @@ export default function AdminAddAllUploads({ } catch (e: any) { setIsAdding(false); setButtonText('Try Again'); + setAddingProgress(undefined); setActionErrorMessage(e); } }; @@ -131,8 +137,10 @@ export default function AdminAddAllUploads({ />
- router.push(PATH_ADMIN_PHOTOS)); } catch (e: any) { + setAddingProgress(undefined); setIsAdding(false); setButtonText('Try Again'); setActionErrorMessage(e); @@ -166,7 +176,7 @@ export default function AdminAddAllUploads({ hideTextOnMobile={false} > {buttonText} - + {buttonSubheadText &&
{buttonSubheadText} diff --git a/src/admin/AdminOutdatedClient.tsx b/src/admin/AdminOutdatedClient.tsx index 2f5d9e1e..46c3aea7 100644 --- a/src/admin/AdminOutdatedClient.tsx +++ b/src/admin/AdminOutdatedClient.tsx @@ -42,9 +42,9 @@ export default function AdminOutdatedClient({ } accessory={} hideTextOnMobile={false} - className="primary" onClick={async () => { if (window.confirm( // eslint-disable-next-line max-len diff --git a/src/admin/AdminPhotosClient.tsx b/src/admin/AdminPhotosClient.tsx index 64bdea98..ac63fd2e 100644 --- a/src/admin/AdminPhotosClient.tsx +++ b/src/admin/AdminPhotosClient.tsx @@ -38,7 +38,7 @@ export default function AdminPhotosClient({ contentMain={
-
+
inputRef.current?.click()} hideTextOnMobile={false} + primary > {loading ? 'Uploading' diff --git a/src/components/SubmitButtonWithStatus.tsx b/src/components/SubmitButtonWithStatus.tsx index 3b6ab685..a9b90590 100644 --- a/src/components/SubmitButtonWithStatus.tsx +++ b/src/components/SubmitButtonWithStatus.tsx @@ -16,14 +16,12 @@ export default function SubmitButtonWithStatus({ children, disabled, className, - primary, type: _type, ...buttonProps }: { onFormStatusChange?: (pending: boolean) => void onFormSubmitToastMessage?: string onFormSubmit?: () => void - primary?: boolean } & ComponentProps) { const { pending } = useFormStatus(); @@ -45,18 +43,17 @@ export default function SubmitButtonWithStatus({ return ( {children} diff --git a/src/components/primitives/LoaderButton.tsx b/src/components/primitives/LoaderButton.tsx index 46aee2fe..74ea4fb9 100644 --- a/src/components/primitives/LoaderButton.tsx +++ b/src/components/primitives/LoaderButton.tsx @@ -11,6 +11,7 @@ export default function LoaderButton(props: { styleAs?: 'button' | 'link' | 'link-without-hover' hideTextOnMobile?: boolean shouldPreventDefault?: boolean + primary?: boolean } & ButtonHTMLAttributes) { const { children, @@ -20,6 +21,7 @@ export default function LoaderButton(props: { styleAs = 'button', hideTextOnMobile = true, shouldPreventDefault, + primary, type = 'button', onClick, disabled, @@ -41,10 +43,12 @@ export default function LoaderButton(props: { 'link h-4 active:text-medium', 'disabled:!bg-transparent', ] - : ['h-9']), + : ['h-9'] + ), styleAs === 'link' && 'hover:text-dim', styleAs === 'link-without-hover' && 'hover:text-main', 'inline-flex items-center gap-2 self-start whitespace-nowrap', + primary && 'primary', className, )} disabled={isLoading || disabled} diff --git a/src/components/primitives/ProgressButton.tsx b/src/components/primitives/ProgressButton.tsx new file mode 100644 index 00000000..5e9f3fa8 --- /dev/null +++ b/src/components/primitives/ProgressButton.tsx @@ -0,0 +1,37 @@ +'use client'; + +import { ComponentProps } from 'react'; +import LoaderButton from './LoaderButton'; +import { clsx } from 'clsx/lite'; + +export default function ProgressButton({ + progress, + isLoading, + className, + children, + ...props +}: { + progress?: number +} & ComponentProps) { + return ( + +
+ {children} + + ); +}