'use client'; import { useState, useEffect, useTransition, useRef } from 'react'; import { useRouter } from 'next/navigation'; import { supabase } from '@/lib/supabaseClient'; import { updateItem } from './actions'; export default function EditItemPage({ params }) { const router = useRouter(); const { id } = params; const formRef = useRef(null); const [isPending, startTransition] = useTransition(); const [isLoading, setIsLoading] = useState(true); const [isUploading, setIsUploading] = useState(false); const [item, setItem] = useState(null); const [error, setError] = useState(null); const [successMessage, setSuccessMessage] = useState(''); // Fetch the item data useEffect(() => { async function fetchItem() { setIsLoading(true); setError(null); if (!supabase) { setError('Could not connect to the database.'); setIsLoading(false); return; } try { const { data, error } = await supabase .from('items') .select('*') .eq('id', id) .single(); if (error) { throw error; } if (!data) { throw new Error('Item not found'); } setItem(data); } catch (err) { console.error('Error fetching item:', err); setError(err.message || 'Failed to load item'); } finally { setIsLoading(false); } } if (id) { fetchItem(); } }, [id]); 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 = item.picture_url; // Keep existing URL by default // Handle image upload directly from client if a new 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('id', id); 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 updateItem(serverFormData); if (result.error) { setError(result.error); } else if (result.success) { setSuccessMessage(result.message); // Redirect after a delay setTimeout(() => router.push('/'), 1500); } }); } catch (err) { setError(err.message); } finally { setIsUploading(false); } }; const handleDeleteClick = () => { if (confirm('Are you sure you want to delete this item? This cannot be undone.')) { startTransition(async () => { try { const { error } = await supabase .from('items') .delete() .eq('id', id); if (error) { setError(`Failed to delete: ${error.message}`); return; } setSuccessMessage('Item deleted successfully'); setTimeout(() => router.push('/'), 1500); } catch (err) { setError(err.message || 'Failed to delete item'); } }); } }; if (isLoading) { return (
); } if (error && !item) { return (

Error

{error}

); } return (

Edit Item

Update information about "{item?.title || 'this item'}"

{error && (

Error:

{error}

)} {successMessage && (

Success:

{successMessage}

)}
{item?.picture_url && (

Current image:

{item.title

Upload a new image to replace the current one

)}
); }