'use client'; import React, { useState, useEffect } from 'react'; import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; import { Calendar, Plus, GlassWater, Loader2, ChevronRight, Users, Check } from 'lucide-react'; import Link from 'next/link'; import { useI18n } from '@/i18n/I18nContext'; import { useSession } from '@/context/SessionContext'; interface Session { id: string; name: string; scheduled_at: string; participant_count?: number; whisky_count?: number; } export default function SessionList() { const { t, locale } = useI18n(); const supabase = createClientComponentClient(); const [sessions, setSessions] = useState([]); const [isLoading, setIsLoading] = useState(true); const [isCreating, setIsCreating] = useState(false); const [newName, setNewName] = useState(''); const { activeSession, setActiveSession } = useSession(); useEffect(() => { fetchSessions(); }, []); const fetchSessions = async () => { const { data, error } = await supabase .from('tasting_sessions') .select(` *, session_participants (count), tastings (count) `) .order('scheduled_at', { ascending: false }); if (error) { console.error('Error fetching sessions:', error); } else { setSessions(data.map(s => ({ ...s, participant_count: s.session_participants[0]?.count || 0, whisky_count: s.tastings[0]?.count || 0 })) || []); } setIsLoading(false); }; const handleCreateSession = async (e: React.FormEvent) => { e.preventDefault(); if (!newName.trim()) return; setIsCreating(true); const { data: { user } } = await supabase.auth.getUser(); if (!user) return; const { data, error } = await supabase .from('tasting_sessions') .insert([{ name: newName.trim(), user_id: user.id }]) .select() .single(); if (error) { console.error('Error creating session:', error); } else { setSessions(prev => [data, ...prev]); setNewName(''); setActiveSession({ id: data.id, name: data.name }); } setIsCreating(false); }; return (

{t('session.title')}

setNewName(e.target.value)} placeholder={t('session.sessionName')} className="flex-1 bg-zinc-50 dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 rounded-xl px-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-amber-500/50" />
{isLoading ? (
) : sessions.length === 0 ? (
{t('session.noSessions')}
) : (
{sessions.map((session) => (
{session.name}
{new Date(session.scheduled_at).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')} {session.participant_count! > 0 && ( {session.participant_count} {t('tasting.participants')} )} {session.whisky_count! > 0 && ( {session.whisky_count} Whiskys )}
{activeSession?.id !== session.id ? ( ) : (
)}
)) }
)}
); }