// app/add-item/page.js 'use client'; import { useState, useTransition, useRef } from 'react'; import { createItem } from './actions'; // Server Action import { useRouter } from 'next/navigation'; import { supabase } from '@/lib/supabaseClient'; export default function AddItemPage() { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [error, setError] = useState(null); const [successMessage, setSuccessMessage] = useState(''); const [isUploading, setIsUploading] = useState(false); const formRef = useRef(null); const handleSubmit = async (event) => { event.preventDefault(); setError(null); setSuccessMessage(''); setIsUploading(true); try { const formData = new FormData(event.currentTarget); const pictureFile = formData.get('picture_file'); let pictureUrl = null; // Handle image upload directly from client if a file is selected if (pictureFile && pictureFile.size > 0) { // Upload to Supabase Storage directly from client const BUCKET_NAME = 'item_images'; const fileName = `public/${Date.now()}-${pictureFile.name.replace(/[^a-zA-Z0-9.]/g, '_')}`; const { data: uploadData, error: uploadError } = await supabase.storage .from(BUCKET_NAME) .upload(fileName, pictureFile); if (uploadError) { throw new Error(`Failed to upload image: ${uploadError.message}`); } const { data: publicUrlData } = supabase.storage .from(BUCKET_NAME) .getPublicUrl(fileName); if (!publicUrlData || !publicUrlData.publicUrl) { throw new Error('Failed to get image public URL after upload.'); } pictureUrl = publicUrlData.publicUrl; } // Create a new FormData without the file to reduce payload size const serverFormData = new FormData(); serverFormData.append('title', formData.get('title')); serverFormData.append('type', formData.get('type')); if (formData.get('rating')) { serverFormData.append('rating', formData.get('rating')); } if (formData.get('notes')) { serverFormData.append('notes', formData.get('notes')); } // Send the image URL instead of the file if (pictureUrl) { serverFormData.append('picture_url', pictureUrl); } // Call server action with the form data (minus the image file) startTransition(async () => { const result = await createItem(serverFormData); if (result.error) { setError(result.error); } else if (result.success) { setSuccessMessage(result.message); // Clear form fields formRef.current.reset(); // Redirect after a delay setTimeout(() => router.push('/'), 1500); } }); } catch (err) { setError(err.message); } finally { setIsUploading(false); } }; return (
Fill in the details below to add a new item to your collection.
Error:
{error}
Success:
{successMessage}