"use client" import { useRef, useState } from "react" import { allowedImageContentTypes, maxUploadSizeBytes } from "@/lib/validation/upload" interface PhotoUploadLabels { title: string description: string current: string choose: string upload: string replace: string uploading: string success: string error: string disabled: string requirements: string } export function PhotoUpload({ token, labels, disabled, existingFilename, }: { token: string labels: PhotoUploadLabels disabled: boolean existingFilename: string | null }) { const inputRef = useRef(null) const [filename, setFilename] = useState(existingFilename) const [status, setStatus] = useState<"idle" | "uploading" | "success" | "error">("idle") async function uploadSelectedFile() { const file = inputRef.current?.files?.[0] if (!file) return if ( !allowedImageContentTypes.includes( file.type as (typeof allowedImageContentTypes)[number], ) || file.size > maxUploadSizeBytes ) { setStatus("error") return } setStatus("uploading") try { const presignResponse = await fetch("/api/uploads/presign", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ token, filename: file.name, contentType: file.type, sizeBytes: file.size, }), }) if (!presignResponse.ok) throw new Error("Could not presign upload") const { uploadUrl, objectKey } = (await presignResponse.json()) as { uploadUrl: string objectKey: string } const uploadResponse = await fetch(uploadUrl, { method: "PUT", headers: { "content-type": file.type }, body: file, }) if (!uploadResponse.ok) throw new Error("Could not upload file") const completeResponse = await fetch("/api/uploads/complete", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ token, filename: file.name, contentType: file.type, sizeBytes: file.size, objectKey, }), }) if (!completeResponse.ok) throw new Error("Could not complete upload") setFilename(file.name) setStatus("success") if (inputRef.current) inputRef.current.value = "" } catch { setStatus("error") } } return (

04

{labels.title}

{labels.description}

{labels.requirements}

{filename ? (

{labels.current.replace("{filename}", filename)}

) : null} {disabled ? (

{labels.disabled}

) : (
)} {status === "success" ? (

{labels.success}

) : null} {status === "error" ?

{labels.error}

: null}
) }