From 3d505d88c9842a8e224ff990f1286c8e09def127 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Tue, 2 Jul 2024 23:01:30 -0500 Subject: [PATCH] Make adding all uploads status more granular --- src/admin/AdminAddAllUploads.tsx | 11 ++++--- src/photo/actions.ts | 52 +++++++++++++++----------------- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/admin/AdminAddAllUploads.tsx b/src/admin/AdminAddAllUploads.tsx index 0b5a2886..f4b3187d 100644 --- a/src/admin/AdminAddAllUploads.tsx +++ b/src/admin/AdminAddAllUploads.tsx @@ -65,10 +65,6 @@ 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 @@ -77,6 +73,11 @@ export default function AdminAddAllUploads({ addedUploadUrls.current = updatedUrls; return updatedUrls; }); + setAddingProgress(( + // eslint-disable-next-line max-len + (((addedUploadUrls.current.length || 1) - 1) + (data?.progress ?? 0)) / + storageUrls.length + ) * 0.95); } } catch (e: any) { setIsAdding(false); @@ -151,7 +152,7 @@ export default function AdminAddAllUploads({ // eslint-disable-next-line max-len if (confirm(`Are you sure you want to add all ${storageUrls.length} uploads?`)) { setIsAdding(true); - let uploadsToAdd = storageUrls.slice(); + const uploadsToAdd = storageUrls.slice(); try { while (uploadsToAdd.length > 0) { await addUploadUrls( diff --git a/src/photo/actions.ts b/src/photo/actions.ts index 696eb056..71abf6cb 100644 --- a/src/photo/actions.ts +++ b/src/photo/actions.ts @@ -81,21 +81,29 @@ export const addAllUploadsAction = async ({ takenAtNaiveLocal: string }) => runAuthenticatedAdminServerAction(async () => { - const uploadTotal = uploadUrls.length; - const addedUploadUrls: string[] = []; + const PROGRESS_TASK_COUNT = AI_TEXT_GENERATION_ENABLED ? 5 : 4; - const stream = createStreamableValue({ - subhead: '', - addedUploadUrls: '', - }); + const addedUploadUrls: string[] = []; + let progress = 0; + + const stream = createStreamableValue<{ + subhead: string + addedUploadUrls: string + progress: number + }>(); + + const streamUpdate = (subhead: string) => + stream.update({ + subhead, + addedUploadUrls: addedUploadUrls.join(','), + progress: ++progress / PROGRESS_TASK_COUNT, + }); (async () => { try { for (const url of uploadUrls) { - stream.update({ - subhead: 'Parsing EXIF data', - addedUploadUrls: addedUploadUrls.join(','), - }); + progress = 0; + streamUpdate('Parsing EXIF data'); const { photoFormExif, @@ -110,10 +118,7 @@ export const addAllUploadsAction = async ({ if (photoFormExif) { if (AI_TEXT_GENERATION_ENABLED) { - stream.update({ - subhead: 'Generating AI text', - addedUploadUrls: addedUploadUrls.join(','), - }); + streamUpdate('Generating AI text'); } const { @@ -136,10 +141,7 @@ export const addAllUploadsAction = async ({ takenAtNaive: photoFormExif.takenAtNaive || takenAtNaiveLocal, }; - stream.update({ - subhead: 'Moving upload to photo storage', - addedUploadUrls: addedUploadUrls.join(','), - }); + streamUpdate('Moving upload to photo storage'); const updatedUrl = await convertUploadToPhoto({ urlOrigin: url, @@ -147,26 +149,20 @@ export const addAllUploadsAction = async ({ shouldStripGpsData, }); if (updatedUrl) { - const subhead = 'Adding to database'; - stream.update({ - subhead, - addedUploadUrls: addedUploadUrls.join(','), - }); + const subheadFinal = 'Adding to database'; + streamUpdate(subheadFinal); const photo = convertFormDataToPhotoDbInsert(form); photo.url = updatedUrl; await insertPhoto(photo); addedUploadUrls.push(url); // Re-submit with updated url - stream.update({ - subhead, - addedUploadUrls: addedUploadUrls.join(','), - }); + streamUpdate(subheadFinal); } } }; } catch (error: any) { // eslint-disable-next-line max-len - stream.error(`${error.message} (${addedUploadUrls.length} of ${uploadTotal} photos successfully added)`); + stream.error(`${error.message} (${addedUploadUrls.length} of ${uploadUrls.length} photos successfully added)`); } revalidateAllKeysAndPaths(); stream.done();