-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy path_home.tsx
123 lines (117 loc) · 3.87 KB
/
_home.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import { AppSidebar } from "@/components/app";
import {
Badge,
Container,
Nav,
NavGroup,
NavItem,
ProgressBar,
} from "@/components/common";
import { StatusBadge } from "@/components/quests";
import { api } from "@convex/_generated/api";
import { CATEGORIES, CORE_QUESTS, type Status } from "@convex/constants";
import { Outlet, createFileRoute } from "@tanstack/react-router";
import { useQuery } from "convex/react";
export const Route = createFileRoute("/_authenticated/_home")({
component: IndexRoute,
});
function IndexRoute() {
const MyQuests = () => {
const user = useQuery(api.users.getCurrent);
const userQuestCount = useQuery(api.userQuests.count);
const completedQuests = useQuery(api.userQuests.countCompleted);
const questsByCategory = useQuery(api.userQuests.getByCategory);
if (questsByCategory === undefined) return;
return (
<AppSidebar>
<div className="flex items-center mb-4">
<ProgressBar
label="Quest progress"
value={completedQuests}
maxValue={userQuestCount}
valueLabel={
<span className="text-gray-normal">
<span className="text-gray-normal text-base font-medium mr-0.5 leading-none">
{completedQuests}
</span>{" "}
<span className="text-gray-8 dark:text-graydark-8">/</span>{" "}
<span className="text-gray-dim">{userQuestCount} complete</span>
</span>
}
labelHidden
/>
</div>
<Nav>
<NavItem
href={{ to: "/court-order" }}
icon={CORE_QUESTS["court-order"].icon}
size="large"
>
Court Order
{user?.residence && <Badge size="xs">{user.residence}</Badge>}
</NavItem>
<NavItem
href={{ to: "/state-id" }}
icon={CORE_QUESTS["state-id"].icon}
size="large"
>
State ID
{user?.residence && <Badge size="xs">{user.residence}</Badge>}
</NavItem>
<NavItem
href={{ to: "/social-security" }}
icon={CORE_QUESTS["social-security"].icon}
size="large"
>
Social Security
</NavItem>
<NavItem
href={{ to: "/passport" }}
icon={CORE_QUESTS.passport.icon}
size="large"
>
Passport
</NavItem>
<NavItem
href={{ to: "/birth-certificate" }}
icon={CORE_QUESTS["birth-certificate"].icon}
size="large"
>
Birth Certificate
{user?.birthplace && <Badge size="xs">{user.birthplace}</Badge>}
</NavItem>
{Object.keys(questsByCategory).length > 0 &&
Object.entries(questsByCategory).map(([group, quests]) => {
if (quests.length === 0) return null;
const { label } = CATEGORIES[group as keyof typeof CATEGORIES];
return (
<NavGroup key={label} label={label} count={quests.length}>
{quests.map((quest) => (
<NavItem
key={quest._id}
href={{
to: "/quests/$questId",
params: { questId: quest.questId },
}}
>
<StatusBadge status={quest.status as Status} condensed />
{quest.title}
{quest.jurisdiction && (
<Badge size="xs">{quest.jurisdiction}</Badge>
)}
</NavItem>
))}
</NavGroup>
);
})}
</Nav>
</AppSidebar>
);
};
return (
<Container className="flex">
<MyQuests />
<Outlet />
</Container>
);
}