feat: unified navigation hub + categories tab + mobile scroll fix
Some checks failed
CI / ci (push) Has been cancelled

- Navigation: 4 items (Home, Tracker, Finance, Settings)
- Tracker page: tabs for Habits, Tasks, Stats
- Finance: added Categories tab (CRUD)
- AddTransactionModal: fixed mobile scroll with sticky button
- Home: added finance balance widget
- Legacy routes (/habits, /tasks, /stats) redirect to /tracker
This commit is contained in:
Cosmo
2026-03-01 04:34:59 +00:00
parent 0ec0eede76
commit 8baddf1914
10 changed files with 478 additions and 140 deletions

View File

@@ -6,6 +6,7 @@ import { format, startOfWeek, differenceInDays, parseISO, isToday, isTomorrow, i
import { ru } from 'date-fns/locale'
import { habitsApi } from '../api/habits'
import { tasksApi } from '../api/tasks'
import { financeApi } from '../api/finance'
import { useAuthStore } from '../store/auth'
import Navigation from '../components/Navigation'
import CreateTaskModal from '../components/CreateTaskModal'
@@ -96,6 +97,11 @@ export default function Home() {
queryFn: tasksApi.today,
})
const { data: financeSummary } = useQuery({
queryKey: ["finance-summary"],
queryFn: () => financeApi.getSummary(),
})
useEffect(() => {
if (habits.length > 0) {
loadTodayLogs()
@@ -301,6 +307,27 @@ export default function Home() {
)}
{/* Tasks */}
{/* Finance Summary */}
{financeSummary && (
<motion.div initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} className="card p-5">
<h2 className="font-semibold text-gray-900 dark:text-white mb-3">💰 Баланс</h2>
<div className="grid grid-cols-3 gap-3">
<div className="text-center">
<p className="text-lg font-bold text-green-500">+{(financeSummary.total_income || 0).toLocaleString("ru-RU")} </p>
<p className="text-xs text-gray-500">Доходы</p>
</div>
<div className="text-center">
<p className="text-lg font-bold text-red-500">-{(financeSummary.total_expense || 0).toLocaleString("ru-RU")} </p>
<p className="text-xs text-gray-500">Расходы</p>
</div>
<div className="text-center">
<p className={"text-lg font-bold " + ((financeSummary.balance || 0) >= 0 ? "text-primary-500" : "text-red-500")}>{(financeSummary.balance || 0).toLocaleString("ru-RU")} </p>
<p className="text-xs text-gray-500">Баланс</p>
</div>
</div>
</motion.div>
)}
{(activeTasks.length > 0 || !tasksLoading) && (
<div>
<div className="flex items-center justify-between mb-4">