From fff47f52b75b446b02576845e4e8a2b8577a6321 Mon Sep 17 00:00:00 2001 From: prudentbird Date: Wed, 21 Jan 2026 23:20:22 +0100 Subject: [PATCH] feat: Enforce photo upload requirement in store forms and update validation schemas --- frontend/src/app/user/actions.ts | 18 ++++++++++++++++++ frontend/src/app/user/locations/add/form.tsx | 8 +++++++- .../src/app/user/locations/edit/[id]/form.tsx | 8 +++++++- frontend/src/app/user/schema.ts | 3 ++- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/user/actions.ts b/frontend/src/app/user/actions.ts index 077bd0e..979e4ea 100644 --- a/frontend/src/app/user/actions.ts +++ b/frontend/src/app/user/actions.ts @@ -163,6 +163,15 @@ export const addStore = async ( } } + if (uploadedPhotoUrls.length === 0) { + return { + inputs: rawData, + message: 'At least one photo is required', + timestamp: new Date().toISOString(), + error: 'At least one photo is required', + }; + } + rawData.photos = uploadedPhotoUrls; const finalValidation = addStoreFormSchema.safeParse(rawData); @@ -327,6 +336,15 @@ export const editStore = async ( } } + if (existingPhotoUrls.length === 0 && uploadedPhotoUrls.length === 0) { + return { + inputs: rawData, + message: 'At least one photo is required', + timestamp: new Date().toISOString(), + error: 'At least one photo is required', + }; + } + rawData.photos = [...existingPhotoUrls, ...uploadedPhotoUrls]; const finalValidation = editStoreFormSchema.safeParse(rawData); diff --git a/frontend/src/app/user/locations/add/form.tsx b/frontend/src/app/user/locations/add/form.tsx index 55bdc6e..25fc316 100644 --- a/frontend/src/app/user/locations/add/form.tsx +++ b/frontend/src/app/user/locations/add/form.tsx @@ -311,6 +311,12 @@ export function AddStoreForm({ const handleSubmit = useCallback( (event: React.FormEvent) => { event.preventDefault(); + + if (selectedImages.length === 0) { + toast.error('Please add at least one photo'); + return; + } + const formData = new FormData(event.currentTarget); const latInput = latitudeRef.current?.value ?? ''; const lngInput = longitudeRef.current?.value ?? ''; @@ -678,7 +684,7 @@ export function AddStoreForm({
- + ) => { event.preventDefault(); + + if (keptExistingPhotos.length === 0 && selectedImages.length === 0) { + toast.error('Please add at least one photo'); + return; + } + const formData = new FormData(event.currentTarget); const latInput = latitudeRef.current?.value ?? ''; const lngInput = longitudeRef.current?.value ?? ''; @@ -731,7 +737,7 @@ const EditStoreForm = ({
- + {keptExistingPhotos.length > 0 ? (
diff --git a/frontend/src/app/user/schema.ts b/frontend/src/app/user/schema.ts index c478d36..bfd39ad 100644 --- a/frontend/src/app/user/schema.ts +++ b/frontend/src/app/user/schema.ts @@ -12,7 +12,7 @@ export const addStoreFormSchema = z .max(500, 'Store type description must be 500 characters or less') .optional(), landmarks: z.string().optional(), - photos: z.array(z.string()).optional(), + photos: z.array(z.string()).min(1, 'At least one photo is required'), latitude: z.number(), longitude: z.number(), phase_id: z.string().optional(), @@ -40,6 +40,7 @@ export type AddStoreFormData = z.infer; export const editStoreFormSchema = addStoreFormSchema.partial().extend({ id: z.string().min(1, 'Store ID is required'), + photos: z.array(z.string()).min(1, 'At least one photo is required'), }); export type EditStoreFormData = z.infer;