import { useAtom } from 'jotai' import { habitsAtom, coinsAtom, settingsAtom } from '@/lib/atoms' import { addCoins, removeCoins, saveHabitsData } from '@/app/actions/data' import { Habit } from '@/lib/types' import { getNowInMilliseconds, getTodayInTimezone } from '@/lib/utils' import { toast } from '@/hooks/use-toast' import { ToastAction } from '@/components/ui/toast' import { Undo2 } from 'lucide-react' export function useHabits() { const [habitsData, setHabitsData] = useAtom(habitsAtom) const [coins, setCoins] = useAtom(coinsAtom) const [settings] = useAtom(settingsAtom) const completeHabit = async (habit: Habit) => { const timezone = settings.system.timezone const today = getTodayInTimezone(timezone) if (!habit.completions.includes(today)) { const updatedHabit = { ...habit, completions: [...habit.completions, today] } const updatedHabits = habitsData.habits.map(h => h.id === habit.id ? updatedHabit : h ) await saveHabitsData({ habits: updatedHabits }) setHabitsData({ habits: updatedHabits }) const coinsData = await addCoins(habit.coinReward, `Completed habit: ${habit.name}`, 'HABIT_COMPLETION', habit.id) setCoins(coinsData) toast({ title: "Habit completed!", description: `You earned ${habit.coinReward} coins.`, action: undoComplete(habit)}> Undo }) return { updatedHabits, newBalance: coinsData.balance, newTransactions: coinsData.transactions } } else { toast({ title: "Habit already completed", description: "You've already completed this habit today.", variant: "destructive", }) return null } } const undoComplete = async (habit: Habit) => { const timezone = settings.system.timezone const today = getTodayInTimezone(timezone) const updatedHabit = { ...habit, completions: habit.completions.filter(date => date !== today) } const updatedHabits = habitsData.habits.map(h => h.id === habit.id ? updatedHabit : h ) await saveHabitsData({ habits: updatedHabits }) setHabitsData({ habits: updatedHabits }) const coinsData = await removeCoins(habit.coinReward, `Undid habit completion: ${habit.name}`, 'HABIT_UNDO', habit.id) setCoins(coinsData) toast({ title: "Completion undone", description: `${habit.coinReward} coins have been deducted.`, action: completeHabit(habit)}> Undo }) return { updatedHabits, newBalance: coinsData.balance, newTransactions: coinsData.transactions } } const saveHabit = async (habit: Omit & { id?: string }) => { const newHabit = { ...habit, id: habit.id || getNowInMilliseconds().toString() } const updatedHabits = habit.id ? habitsData.habits.map(h => h.id === habit.id ? newHabit : h) : [...habitsData.habits, newHabit] await saveHabitsData({ habits: updatedHabits }) setHabitsData({ habits: updatedHabits }) return updatedHabits } const deleteHabit = async (id: string) => { const updatedHabits = habitsData.habits.filter(h => h.id !== id) await saveHabitsData({ habits: updatedHabits }) setHabitsData({ habits: updatedHabits }) return updatedHabits } return { completeHabit, undoComplete, saveHabit, deleteHabit } }