import { useState } from "react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Textarea } from "@/components/ui/textarea" import { MoodPicker } from "@/components/mood/mood-picker" import { ActivityPicker } from "@/components/activity/activity-picker" import { PhotoPicker } from "@/components/media/photo-picker" import { VoiceMemoPicker } from "@/components/media/voice-memo-picker" import { useActivities } from "@/hooks/use-activities" import { media as mediaApi } from "@/api/client" import { toast } from "@/components/ui/toast" import type { MoodValue } from "@/lib/mood" import type { MediaItem } from "@/lib/media" import { getExistingIds, getPendingFiles } from "@/lib/media" export interface EntryFormData { mood: number content?: string activityIds?: string[] photoIds?: string[] voiceMemoIds?: string[] } interface EntryFormProps { title: string submitLabel: string isPending: boolean onSubmit: (data: EntryFormData) => void initial?: { mood?: number content?: string activities?: string[] photos?: string[] voiceMemos?: string[] } } export function EntryForm({ title, submitLabel, isPending, onSubmit, initial, }: EntryFormProps) { const [mood, setMood] = useState( initial?.mood as MoodValue | undefined ) const [content, setContent] = useState(initial?.content ?? "") const [selectedActivities, setSelectedActivities] = useState( initial?.activities ?? [] ) const [photoItems, setPhotoItems] = useState( (initial?.photos ?? []).map((id) => ({ type: "existing" as const, id })) ) const [voiceMemoItems, setVoiceMemoItems] = useState( (initial?.voiceMemos ?? []).map((id) => ({ type: "existing" as const, id })) ) const [uploading, setUploading] = useState(false) const { data: activities } = useActivities() const toggleActivity = (id: string) => { setSelectedActivities((prev) => prev.includes(id) ? prev.filter((a) => a !== id) : [...prev, id] ) } const handleSubmit = async () => { if (!mood) return setUploading(true) try { const photoIds = [...getExistingIds(photoItems)] for (const file of getPendingFiles(photoItems)) { const result = await mediaApi.uploadPhoto(file) photoIds.push(result.id) } const voiceMemoIds = [...getExistingIds(voiceMemoItems)] for (const file of getPendingFiles(voiceMemoItems)) { const result = await mediaApi.uploadVoiceMemo(file) voiceMemoIds.push(result.id) } onSubmit({ mood, content: content.trim() || undefined, activityIds: selectedActivities.length ? selectedActivities : undefined, photoIds: photoIds.length ? photoIds : undefined, voiceMemoIds: voiceMemoIds.length ? voiceMemoIds : undefined, }) } catch { toast.add({ title: "Failed to upload media", type: "error" }) } finally { setUploading(false) } } const busy = isPending || uploading return (

{title}

{activities?.length ? ( Activities ) : null} Note