'use client'; import SubmitButtonWithStatus from '@/components/SubmitButtonWithStatus'; import Link from 'next/link'; import { PATH_ADMIN_ALBUMS } from '@/app/path'; import FieldsetWithStatus from '@/components/FieldsetWithStatus'; import { ReactNode, useCallback, useMemo, useState } from 'react'; import { useAppState } from '@/app/AppState'; import { Album } from '@/album'; import { ALBUM_FORM_META } from '@/album/form'; import { parameterize } from '@/utility/string'; import { updateAlbumAction } from '@/album/actions'; import clsx from 'clsx/lite'; import PlaceInput from '@/place/PlaceInput'; import { convertPlaceToAutocomplete, Place } from '@/place'; import deepEqual from 'fast-deep-equal/es6/react'; export default function AdminAlbumForm({ album, children, }: { album: Album children?: ReactNode }) { const { invalidateSwr } = useAppState(); const [albumForm, setAlbumForm] = useState(album); const initialPlace = useMemo(() => convertPlaceToAutocomplete(album.location), [album.location]); const [isLoadingPlace, setIsLoadingPlace] = useState(false); const setPlace = useCallback((place?: Place) => setAlbumForm(form => ({ ...form, location: place, })), []); const isFormValid = useMemo(() => { return ALBUM_FORM_META.every(({ key, required }) => { return !required || Boolean(albumForm[key]); }); }, [albumForm]); return (
{ALBUM_FORM_META .map(({ key, label, type, readOnly }) => ( setAlbumForm(form => ({ ...form, [key]: value, ...key === 'title' && { slug: parameterize(value) }, })) } isModified={albumForm[key] !== album[key]} readOnly={readOnly} className={clsx(key === 'description' && '[&_textarea]:h-36')} />))} {(albumForm.location || isLoadingPlace) &&
setAlbumForm(form => ({ ...form, ...form.location && { location: { ...form.location, nameFormatted: value }, }, }))} isModified={ // eslint-disable-next-line max-len (albumForm.location?.nameFormatted ?? albumForm.location?.name) !== (album.location?.nameFormatted ?? album.location?.name) } readOnly={isLoadingPlace} />
} {children}
Cancel Update
); }