import { Circle, Coins, ArrowRight, CircleCheck, ChevronDown, ChevronUp } from 'lucide-react' import { cn } from '@/lib/utils' import Link from 'next/link' import { useState } from 'react' import { useAtom } from 'jotai' import { settingsAtom } from '@/lib/atoms' import { getTodayInTimezone, isSameDate, t2d, d2t, getNow, getCompletedHabitsForDate, getCompletionsForDate } 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 { WishlistItemType } from '@/lib/types' import { Habit } from '@/lib/types' import Linkify from './linkify' import { useHabits } from '@/hooks/useHabits' interface UpcomingItemsProps { habits: Habit[] wishlistItems: WishlistItemType[] coinBalance: number } export default function DailyOverview({ habits, wishlistItems, coinBalance, }: UpcomingItemsProps) { const { completeHabit, undoComplete } = useHabits() const [settings] = useAtom(settingsAtom) const today = getTodayInTimezone(settings.system.timezone) const todayCompletions = getCompletedHabitsForDate({ habits, date: getNow({ timezone: settings.system.timezone }), timezone: settings.system.timezone }) // Filter daily habits const dailyHabits = habits.filter(habit => habit.frequency === 'daily') // Get achievable wishlist items sorted by coin cost const achievableWishlistItems = wishlistItems .filter(item => item.coinCost > coinBalance) .sort((a, b) => a.coinCost - b.coinCost) const [expandedHabits, setExpandedHabits] = useState(false) const [expandedWishlist, setExpandedWishlist] = useState(false) return ( Today's Overview

Daily Habits

{dailyHabits.reduce((sum, habit) => sum + getCompletionsForDate({ habit, date: today, timezone: settings.system.timezone }), 0)}/ {dailyHabits.reduce((sum, habit) => sum + (habit.targetCompletions || 1), 0)} Completions
    {dailyHabits .sort((a, b) => { const aCompleted = todayCompletions.includes(a); const bCompleted = todayCompletions.includes(b); return aCompleted === bCompleted ? 0 : aCompleted ? 1 : -1; }) .slice(0, expandedHabits ? undefined : 3) .map((habit) => { const completionsToday = habit.completions.filter(completion => isSameDate(t2d({ timestamp: completion, timezone: settings.system.timezone }), t2d({ timestamp: d2t({ dateTime: getNow({ timezone: settings.system.timezone }) }), timezone: settings.system.timezone })) ).length const target = habit.targetCompletions || 1 const isCompleted = completionsToday >= target return (
  • {habit.name} {habit.targetCompletions && ( {completionsToday}/{target} )} {habit.coinReward}
  • ) })}
View

Wishlist Goals

{wishlistItems.filter(item => item.coinCost <= coinBalance).length}/{wishlistItems.length} Redeemable
{achievableWishlistItems.length > 0 && (
{achievableWishlistItems .slice(0, expandedWishlist ? undefined : 1) .map((item) => (
{item.name} {item.coinCost}

{item.coinCost - coinBalance} coins to go

))}
)}
View
) }