'use client'; import React, { useState, useEffect } from 'react'; import { saveTasting } from '@/services/save-tasting'; import { Loader2, Send, Star, Users, Check, Sparkles, Droplets, Wind, Utensils, Zap } from 'lucide-react'; import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; import { useI18n } from '@/i18n/I18nContext'; import { useSession } from '@/context/SessionContext'; import TagSelector from './TagSelector'; interface Buddy { id: string; name: string; } interface TastingNoteFormProps { bottleId: string; sessionId?: string; } export default function TastingNoteForm({ bottleId, sessionId }: TastingNoteFormProps) { const { t } = useI18n(); const supabase = createClientComponentClient(); const [rating, setRating] = useState(85); const [nose, setNose] = useState(''); const [palate, setPalate] = useState(''); const [finish, setFinish] = useState(''); const [isSample, setIsSample] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [buddies, setBuddies] = useState([]); const [selectedBuddyIds, setSelectedBuddyIds] = useState([]); const [noseTagIds, setNoseTagIds] = useState([]); const [palateTagIds, setPalateTagIds] = useState([]); const [finishTagIds, setFinishTagIds] = useState([]); const [suggestedTags, setSuggestedTags] = useState([]); const [suggestedCustomTags, setSuggestedCustomTags] = useState([]); const { activeSession } = useSession(); const effectiveSessionId = sessionId || activeSession?.id; useEffect(() => { const fetchData = async () => { // Fetch All Buddies const { data: buddiesData } = await supabase.from('buddies').select('id, name').order('name'); setBuddies(buddiesData || []); // Fetch Bottle Suggestions const { data: bottleData } = await supabase .from('bottles') .select('suggested_tags, suggested_custom_tags') .eq('id', bottleId) .maybeSingle(); if (bottleData?.suggested_tags) { setSuggestedTags(bottleData.suggested_tags); } if (bottleData?.suggested_custom_tags) { setSuggestedCustomTags(bottleData.suggested_custom_tags); } // If Session ID, fetch session participants and pre-select them if (effectiveSessionId) { const { data: participants } = await supabase .from('session_participants') .select('buddy_id') .eq('session_id', effectiveSessionId); if (participants) { setSelectedBuddyIds(participants.map(p => p.buddy_id)); } } else { setSelectedBuddyIds([]); } }; fetchData(); }, [effectiveSessionId, bottleId]); const toggleBuddy = (id: string) => { setSelectedBuddyIds(prev => prev.includes(id) ? prev.filter(bid => bid !== id) : [...prev, id] ); }; const toggleNoseTag = (id: string) => { setNoseTagIds(prev => prev.includes(id) ? prev.filter(tid => tid !== id) : [...prev, id]); }; const togglePalateTag = (id: string) => { setPalateTagIds(prev => prev.includes(id) ? prev.filter(tid => tid !== id) : [...prev, id]); }; const toggleFinishTag = (id: string) => { setFinishTagIds(prev => prev.includes(id) ? prev.filter(tid => tid !== id) : [...prev, id]); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setError(null); try { const result = await saveTasting({ bottle_id: bottleId, session_id: effectiveSessionId, rating, nose_notes: nose, palate_notes: palate, finish_notes: finish, is_sample: isSample, buddy_ids: selectedBuddyIds, tag_ids: [...noseTagIds, ...palateTagIds, ...finishTagIds], }); if (result.success) { setNose(''); setPalate(''); setFinish(''); setSelectedBuddyIds([]); setNoseTagIds([]); setPalateTagIds([]); setFinishTagIds([]); // We don't need to manually refresh because of revalidatePath in the server action } else { setError(result.error || t('common.error')); } } catch (err) { setError(t('common.error')); } finally { setLoading(false); } }; return (
{activeSession && (

Recording for Session

{activeSession.name}

)}
{rating}/100
setRating(parseInt(e.target.value))} className="w-full h-1.5 bg-zinc-200 dark:bg-zinc-800 rounded-full appearance-none cursor-pointer accent-amber-600 hover:accent-amber-500 transition-all" />
Swill Dram Legendary