import { Circle, Coins, ArrowRight, CircleCheck, ChevronDown, ChevronUp, Timer, Plus, Pin, Calendar } from 'lucide-react' import CompletionCountBadge from './CompletionCountBadge' import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@/components/ui/context-menu" import { cn, getHabitFreq } from '@/lib/utils' import Link from 'next/link' import { useState } from 'react' import { useAtom } from 'jotai' import { pomodoroAtom, settingsAtom, completedHabitsMapAtom, browserSettingsAtom, BrowserSettings, hasTasksAtom, dailyHabitsAtom } from '@/lib/atoms' import { getTodayInTimezone, isSameDate, t2d, d2t, getNow } from '@/lib/utils' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Progress } from '@/components/ui/progress' import { Settings, WishlistItemType } from '@/lib/types' import { Habit } from '@/lib/types' import Linkify from './linkify' import { useHabits } from '@/hooks/useHabits' import AddEditHabitModal from './AddEditHabitModal' import { Button } from './ui/button' interface UpcomingItemsProps { habits: Habit[] wishlistItems: WishlistItemType[] coinBalance: number } interface ItemSectionProps { title: string; items: Habit[]; emptyMessage: string; isTask: boolean; viewLink: string; expanded: boolean; setExpanded: (value: boolean) => void; addNewItem: () => void; badgeType: "tasks" | "habits"; todayCompletions: Habit[]; settings: Settings; setBrowserSettings: (value: React.SetStateAction) => void; } const ItemSection = ({ title, items, emptyMessage, isTask, viewLink, expanded, setExpanded, addNewItem, badgeType, todayCompletions, settings, setBrowserSettings, }: ItemSectionProps) => { const { completeHabit, undoComplete, saveHabit } = useHabits(); const [_, setPomo] = useAtom(pomodoroAtom); if (items.length === 0) { return (

{title}

{emptyMessage}
); } return (

{title}

{ if (isTask) { setBrowserSettings(prev => ({ ...prev, viewType: 'tasks' })); } else { setBrowserSettings(prev => ({ ...prev, viewType: 'habits' })); } }} > View
); }; export default function DailyOverview({ habits, wishlistItems, coinBalance, }: UpcomingItemsProps) { const { completeHabit, undoComplete } = useHabits() const [settings] = useAtom(settingsAtom) const [completedHabitsMap] = useAtom(completedHabitsMapAtom) const [dailyItems] = useAtom(dailyHabitsAtom) const [browserSettings, setBrowserSettings] = useAtom(browserSettingsAtom) const dailyTasks = dailyItems.filter(habit => habit.isTask) const dailyHabits = dailyItems.filter(habit => !habit.isTask) const today = getTodayInTimezone(settings.system.timezone) const todayCompletions = completedHabitsMap.get(today) || [] const { saveHabit } = useHabits() // Get all wishlist items sorted by redeemable status (non-redeemable first) then by coin cost // Filter out archived wishlist items const sortedWishlistItems = wishlistItems .filter(item => !item.archived) .sort((a, b) => { const aRedeemable = a.coinCost <= coinBalance const bRedeemable = b.coinCost <= coinBalance // Non-redeemable items first if (aRedeemable !== bRedeemable) { return aRedeemable ? 1 : -1 } // Then sort by coin cost (lower cost first) return a.coinCost - b.coinCost }) const [hasTasks] = useAtom(hasTasksAtom) const [, setPomo] = useAtom(pomodoroAtom) const [modalConfig, setModalConfig] = useState<{ isOpen: boolean, isTask: boolean }>({ isOpen: false, isTask: false }); return ( <> Today's Overview
{/* Tasks Section */} {hasTasks && ( setBrowserSettings(prev => ({ ...prev, expandedTasks: value }))} addNewItem={() => setModalConfig({ isOpen: true, isTask: true })} badgeType="tasks" todayCompletions={todayCompletions} settings={settings} setBrowserSettings={setBrowserSettings} /> )} {/* Habits Section */} setBrowserSettings(prev => ({ ...prev, expandedHabits: value }))} addNewItem={() => setModalConfig({ isOpen: true, isTask: false })} badgeType="habits" todayCompletions={todayCompletions} settings={settings} setBrowserSettings={setBrowserSettings} />

Wishlist Goals

{wishlistItems.filter(item => item.coinCost <= coinBalance).length}/{wishlistItems.length} Redeemable
{sortedWishlistItems.length === 0 ? (
No wishlist items yet. Add some goals to work towards!
) : ( <> {sortedWishlistItems .slice(0, browserSettings.expandedWishlist ? undefined : 5) .map((item) => { const isRedeemable = item.coinCost <= coinBalance return (
{item.name} {item.coinCost}

{isRedeemable ? "Ready to redeem!" : `${item.coinCost - coinBalance} coins to go` }

) })} )}
View
{modalConfig.isOpen && ( setModalConfig({ isOpen: false, isTask: false })} onSave={async (habit) => { await saveHabit({ ...habit, isTask: modalConfig.isTask }) setModalConfig({ isOpen: false, isTask: false }); }} habit={null} isTask={modalConfig.isTask} /> )} ) }