'use client' import { useState, useEffect } from 'react' import { RRule, RRuleSet, rrulestr } from 'rrule' import { useAtom } from 'jotai' import { settingsAtom } from '@/lib/atoms' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' import { Info, SmilePlus } from 'lucide-react' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' import data from '@emoji-mart/data' import Picker from '@emoji-mart/react' import { Habit } from '@/lib/types' import { parseNaturalLanguageRRule, parseRRule, serializeRRule } from '@/lib/utils' import { INITIAL_RECURRENCE_RULE } from '@/lib/constants' interface AddEditHabitModalProps { onClose: () => void onSave: (habit: Omit) => Promise habit?: Habit | null } export default function AddEditHabitModal({ onClose, onSave, habit }: AddEditHabitModalProps) { const [settings] = useAtom(settingsAtom) const [name, setName] = useState(habit?.name || '') const [description, setDescription] = useState(habit?.description || '') const [coinReward, setCoinReward] = useState(habit?.coinReward || 1) const [targetCompletions, setTargetCompletions] = useState(habit?.targetCompletions || 1) const origRuleText = parseRRule(habit?.frequency || INITIAL_RECURRENCE_RULE).toText() const [ruleText, setRuleText] = useState(origRuleText) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() await onSave({ name, description, coinReward, targetCompletions: targetCompletions > 1 ? targetCompletions : undefined, completions: habit?.completions || [], frequency: habit ? ( origRuleText === ruleText ? habit.frequency : serializeRRule(parseNaturalLanguageRRule(ruleText)) ) : serializeRRule(parseNaturalLanguageRRule(ruleText)), }) } return ( {habit ? 'Edit Habit' : 'Add New Habit'}
setName(e.target.value)} required /> { setName(prev => { // Add space before emoji if there isn't one already const space = prev.length > 0 && !prev.endsWith(' ') ? ' ' : ''; return `${prev}${space}${emoji.native}`; }) // Focus back on input after selection const input = document.getElementById('name') as HTMLInputElement input?.focus() }} />