'use client' import { useState } from 'react' import { t2d, d2s, getNow, isSameDate } from '@/lib/utils' import { Button } from '@/components/ui/button' import { formatNumber } from '@/lib/utils/formatNumber' import { History } from 'lucide-react' import EmptyState from './EmptyState' import { Input } from '@/components/ui/input' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { settingsAtom } from '@/lib/atoms' import Link from 'next/link' import { useAtom } from 'jotai' import { useCoins } from '@/hooks/useCoins' export default function CoinsManager() { const { add, remove, balance, transactions } = useCoins() const [settings] = useAtom(settingsAtom) const DEFAULT_AMOUNT = '0' const [amount, setAmount] = useState(DEFAULT_AMOUNT) const handleAddRemoveCoins = async () => { const numAmount = Number(amount) if (numAmount > 0) { await add(numAmount, "Manual addition") setAmount(DEFAULT_AMOUNT) } else if (numAmount < 0) { await remove(Math.abs(numAmount), "Manual removal") setAmount(DEFAULT_AMOUNT) } } return (

Coins Management

🪙
Current Balance
{formatNumber({ amount: balance, settings })} coins
setAmount(e.target.value)} className="text-center text-xl font-medium h-12" />
🪙
Statistics
Total Earned
{formatNumber({ amount: transactions .filter(t => { if (t.type === 'HABIT_COMPLETION' && t.relatedItemId) { return !transactions.some(undoT => undoT.type === 'HABIT_UNDO' && undoT.relatedItemId === t.relatedItemId ) } return t.amount > 0 && t.type !== 'HABIT_UNDO' }) .reduce((sum, t) => sum + t.amount, 0) , settings })} 🪙
Total Spent
{formatNumber({ amount: Math.abs( transactions .filter(t => t.type === 'WISH_REDEMPTION' || t.type === 'MANUAL_ADJUSTMENT') .reduce((sum, t) => sum + (t.amount < 0 ? t.amount : 0), 0) ), settings })} 🪙
Today's Transactions
{transactions.filter(t => isSameDate(getNow({}), t2d({ timestamp: t.timestamp })) ).length} 📊
Transaction History Total: {transactions.length} transactions
{transactions.length === 0 ? ( ) : ( transactions.map((transaction) => { const getBadgeStyles = () => { switch (transaction.type) { case 'HABIT_COMPLETION': return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-100' case 'HABIT_UNDO': return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-100' case 'WISH_REDEMPTION': return 'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-100' case 'MANUAL_ADJUSTMENT': return 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-100' default: return 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-100' } } return (
{transaction.relatedItemId ? ( {transaction.description} ) : (

{transaction.description}

)} {transaction.type.split('_').join(' ')}

{d2s({ dateTime: t2d({ timestamp: transaction.timestamp, timezone: settings.system.timezone }), timezone: settings.system.timezone })}

= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400' }`} > {transaction.amount >= 0 ? '+' : ''}{transaction.amount}
) }) )}
) }