* Make /db top-level module * Create Album type * Pin pnpm version * Generalize query modules * Finalize album postgres data type * Remove temp albums prop * Create basic album primitives * Fix temporary album bugs * Add albums to sidebar * Disambiguate string date utilities * Localize album language * Add album join option to core photo queries * Tweak album icon placement * Add album photo detail page * Refine Album data model * Display album subhead when available * Generate album og images * Finalize album share modal * Add albums to sitemap * Statically pre-render albums * Display tags on albums * Add albums to cmd-k menu * Handle album tag overflow * Stop truncating album subheads * Create core admin album views * Make albums editable * Create/edit albums on photo save, add delete album
93 lines
2.4 KiB
TypeScript
93 lines
2.4 KiB
TypeScript
'use client';
|
|
|
|
import AdminChildPage from '@/components/AdminChildPage';
|
|
import { PATH_ADMIN_UPLOADS } from '@/app/path';
|
|
import {
|
|
PhotoFormData,
|
|
generateTakenAtFields,
|
|
} from './form';
|
|
import PhotoForm from './form/PhotoForm';
|
|
import { Tags } from '@/tag';
|
|
import usePhotoFormParent from './form/usePhotoFormParent';
|
|
import AiButton from './ai/AiButton';
|
|
import { AiAutoGeneratedField } from './ai';
|
|
import { useMemo } from 'react';
|
|
import { Recipes } from '@/recipe';
|
|
import { Films } from '@/film';
|
|
import { Albums } from '@/album';
|
|
|
|
export default function UploadPageClient({
|
|
blobId,
|
|
formDataFromExif,
|
|
albums,
|
|
uniqueTags,
|
|
uniqueRecipes,
|
|
uniqueFilms,
|
|
hasAiTextGeneration,
|
|
textFieldsToAutoGenerate,
|
|
imageThumbnailBase64,
|
|
shouldStripGpsData,
|
|
}: {
|
|
blobId?: string
|
|
formDataFromExif: Partial<PhotoFormData>
|
|
albums: Albums
|
|
uniqueTags: Tags
|
|
uniqueRecipes: Recipes
|
|
uniqueFilms: Films
|
|
hasAiTextGeneration?: boolean
|
|
textFieldsToAutoGenerate?: AiAutoGeneratedField[],
|
|
imageThumbnailBase64?: string
|
|
shouldStripGpsData?: boolean
|
|
}) {
|
|
const {
|
|
pending,
|
|
setIsPending,
|
|
updatedTitle,
|
|
setUpdatedTitle,
|
|
shouldConfirmAiTextGeneration,
|
|
setShouldConfirmAiTextGeneration,
|
|
aiContent,
|
|
} = usePhotoFormParent({
|
|
photoForm: formDataFromExif,
|
|
textFieldsToAutoGenerate,
|
|
imageThumbnailBase64,
|
|
});
|
|
|
|
const initialPhotoForm = useMemo(() => ({
|
|
...formDataFromExif,
|
|
// Generate missing dates on client to avoid timezone issues
|
|
...generateTakenAtFields(formDataFromExif),
|
|
}), [formDataFromExif]);
|
|
|
|
return (
|
|
<AdminChildPage
|
|
backPath={PATH_ADMIN_UPLOADS}
|
|
backLabel="Uploads"
|
|
breadcrumb={pending && updatedTitle
|
|
? updatedTitle
|
|
: blobId}
|
|
breadcrumbEllipsis
|
|
accessory={hasAiTextGeneration &&
|
|
<AiButton {...{
|
|
aiContent,
|
|
shouldConfirm: shouldConfirmAiTextGeneration,
|
|
tooltip: 'Generate AI text for all fields',
|
|
}} />}
|
|
isLoading={pending}
|
|
>
|
|
<PhotoForm
|
|
initialPhotoForm={initialPhotoForm}
|
|
albums={albums}
|
|
uniqueTags={uniqueTags}
|
|
uniqueRecipes={uniqueRecipes}
|
|
uniqueFilms={uniqueFilms}
|
|
aiContent={hasAiTextGeneration ? aiContent : undefined}
|
|
shouldStripGpsData={shouldStripGpsData}
|
|
onTitleChange={setUpdatedTitle}
|
|
onFormStatusChange={setIsPending}
|
|
onFormDataChange={setShouldConfirmAiTextGeneration}
|
|
/>
|
|
</AdminChildPage>
|
|
);
|
|
}
|