import ImageMedium from '@/components/image/ImageMedium'; import { UrlAddStatus } from './AdminUploadsClient'; import clsx from 'clsx/lite'; import ResponsiveDate from '@/components/ResponsiveDate'; import Spinner from '@/components/Spinner'; import { FaRegCircleCheck } from 'react-icons/fa6'; import { pathForAdminUploadUrl } from '@/app/path'; import DeleteUploadButton from './DeleteUploadButton'; import { Dispatch, SetStateAction, useEffect, useRef } from 'react'; import { isElementEntirelyInViewport } from '@/utility/dom'; import FieldsetWithStatus from '@/components/FieldsetWithStatus'; import EditButton from './EditButton'; import AddUploadButton from './AddUploadButton'; import { getFileNamePartsFromStorageUrl } from '@/platforms/storage'; export default function AdminUploadsTableRow({ url, status, statusMessage, draftTitle = '', uploadedAt, size, tabIndex, shouldRedirectAfterAction, isAdding, isDeleting, isComplete, setIsDeleting, setUrlAddStatuses, }: UrlAddStatus & { tabIndex: number shouldRedirectAfterAction: boolean isAdding?: boolean isDeleting?: boolean isComplete?: boolean setIsDeleting?: Dispatch> setUrlAddStatuses?: Dispatch> }) { const ref = useRef(null); const { fileExtension, fileId, } = getFileNamePartsFromStorageUrl(url); const extension = fileExtension?.toUpperCase(); useEffect(() => { if ( status === 'adding' && !isElementEntirelyInViewport(ref.current) ) { window.scrollTo({ top: (ref.current?.offsetTop ?? 0) - 16, behavior: 'smooth', }); } }, [status]); const isRowLoading = isAdding || isDeleting || isComplete || Boolean(status); const updateStatus = (updatedStatus: Partial) => { setUrlAddStatuses?.(statuses => statuses.map(status => status.url === url ? { ...status, ...updatedStatus, } : status)); }; const removeRow = () => setUrlAddStatuses?.(statuses => statuses .filter(({ url: urlToRemove }) => urlToRemove !== url)); return (
updateStatus({ draftTitle: titleUpdated })} placeholder="Title (optional)" tabIndex={tabIndex} readOnly={isRowLoading} capitalize hideLabel />
{isAdding || isComplete ? <> {status === 'added' ? : status === 'adding' && } : <> updateStatus({ status: 'adding', statusMessage: 'Adding ...', })} onAddFinish={removeRow} shouldRedirectToAdminPhotos={shouldRedirectAfterAction} disabled={isRowLoading} tooltipSide="bottom" /> setIsDeleting?.(true)} onDelete={() => { setIsDeleting?.(false); removeRow(); }} disabled={isRowLoading} tooltip="Delete upload" tooltipSide="bottom" /> }
{isAdding || isComplete ? status === 'added' ? 'Added' : status === 'adding' ? statusMessage ?? 'Adding ...' : 'Waiting' : <> {uploadedAt ? : '—'}
{size ? `${size} ${extension}` : extension}
}
); }