import { useHaptics } from '@/aesthetics/useHaptics'; import { computeActiveIngredients } from '@/add-log/utils/ingredients'; import type { StagedFoodLog } from '@/types/foodlog'; import type { Dispatch, SetStateAction } from 'react'; import { useCallback, useState } from 'react'; type UseFoodLogEditorParams = { setStagedFoodLogs: Dispatch>; }; export function useFoodLogEditor({ setStagedFoodLogs }: UseFoodLogEditorParams) { const { impact } = useHaptics(); const [editingLog, setEditingLog] = useState(null); const [editFoodName, setEditFoodName] = useState(''); const [editIngredients, setEditIngredients] = useState([]); const [newIngredient, setNewIngredient] = useState(''); const handleToggleIngredient = useCallback( (logId: string, ingredient: string, isCurrentlyEnabled: boolean) => { impact(); setStagedFoodLogs(prev => prev.map(log => { if (log.id !== logId) return log; const userEnabledIngredients = isCurrentlyEnabled ? log.userEnabledIngredients.filter(i => i !== ingredient) : log.userEnabledIngredients.includes(ingredient) ? log.userEnabledIngredients : [...log.userEnabledIngredients, ingredient]; const userDisabledIngredients = isCurrentlyEnabled ? log.userDisabledIngredients.includes(ingredient) ? log.userDisabledIngredients : [...log.userDisabledIngredients, ingredient] : log.userDisabledIngredients.filter(i => i !== ingredient); return { ...log, userEnabledIngredients, userDisabledIngredients }; }) ); }, [setStagedFoodLogs, impact] ); const handleEditStagedLog = useCallback((log: StagedFoodLog) => { setEditingLog(log); setEditFoodName(log.foodName); const activeIngredients = computeActiveIngredients(log); setEditIngredients([...new Set(activeIngredients)]); setNewIngredient(''); }, []); const handleSaveEdit = useCallback(() => { if (!editingLog) return; setStagedFoodLogs(prev => prev.map(log => log.id === editingLog.id ? { ...log, foodName: editFoodName, aiHPPredIngredients: editIngredients, aiHRPredIngredients: [], userEnabledIngredients: [], userDisabledIngredients: [], } : log ) ); setEditingLog(null); }, [editingLog, editFoodName, editIngredients, setStagedFoodLogs]); const handleAddIngredient = useCallback(() => { const trimmed = newIngredient.trim(); if (!trimmed) return; if (!editIngredients.includes(trimmed)) { setEditIngredients(prev => [...prev, trimmed]); } setNewIngredient(''); }, [newIngredient, editIngredients]); const handleRemoveIngredient = useCallback((ingredient: string) => { setEditIngredients(prev => prev.filter(i => i !== ingredient)); }, []); return { editingLog, setEditingLog, editFoodName, setEditFoodName, editIngredients, newIngredient, setNewIngredient, handleToggleIngredient, handleEditStagedLog, handleSaveEdit, handleAddIngredient, handleRemoveIngredient, }; }