feat: unified navigation hub + categories tab + mobile scroll fix
Some checks failed
CI / ci (push) Has been cancelled
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:
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user