Skip to content

Commit a013671

Browse files
committed
feat: done tasks hidden until clicked to reveal
1 parent 2da5d64 commit a013671

File tree

5 files changed

+164
-9
lines changed

5 files changed

+164
-9
lines changed

apps/desktop-v2/app/auth/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const AuthPage = () => {
1818
}
1919
router.replace(homeRoute);
2020
})();
21-
}, []);
21+
}, [router]);
2222

2323
return (
2424
<main className="flex flex-col items-center justify-center h-screen max-h-screen bg-dark-teal-gradient">

apps/desktop-v2/app/page.tsx

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
"use client";
22

33
import { withAuth } from "@/hocs/withAuth";
4-
import { useCallback, useEffect, useMemo, useState, useRef } from "react";
54
import {
65
SupernovaTaskComponent,
76
createBlankTask,
87
} from "../components/supernova-task";
9-
import Mousetrap from "mousetrap";
108
import { TaskBuilderDialog } from "../components/task-builder-dialog";
11-
import { ISupernovaTask } from "@supernova/types";
12-
import { GearIcon } from "@radix-ui/react-icons";
9+
import { ChevronDownIcon, GearIcon } from "@radix-ui/react-icons";
1310
import Link from "next/link";
1411
import { settingsRoute } from "./settings/meta";
1512
import { SupernovaCommandCenter } from "../components/command-center";
@@ -18,6 +15,8 @@ import { Kbd } from "../components/kbd";
1815
import { CreateTaskPlaceholder } from "@/components/create-task-placeholder";
1916
import { SupernovaGlobeLogoImage } from "@/components/icons";
2017
import useSupernovaTasksUI from "@/hooks/useSupernovaTasksUI";
18+
import * as Accordion from "@radix-ui/react-accordion";
19+
import React from "react";
2120

2221
function Home() {
2322
// get today's date in this format: Tue, 26th Aug
@@ -27,8 +26,9 @@ function Home() {
2726
month: "short",
2827
});
2928
const {
29+
accordionValue,
30+
setAccordionValue,
3031
taskFetchState,
31-
setTasks,
3232
taskBuilderIsOpen,
3333
setTaskBuilderIsOpen,
3434
chosenTaskIndex,
@@ -42,6 +42,8 @@ function Home() {
4242
taskListRef,
4343
commands,
4444
handleClickTask,
45+
doneTasks,
46+
undoneTasks,
4547
} = useSupernovaTasksUI();
4648

4749
return (
@@ -113,7 +115,7 @@ function Home() {
113115
</p>
114116
</div>
115117
)}
116-
{memoizedTasksView.map((task, index) => (
118+
{undoneTasks.map((task, undoneIndex) => (
117119
<SupernovaTaskComponent
118120
key={task.id}
119121
task={task}
@@ -122,7 +124,7 @@ function Home() {
122124
memoizedTasksView[chosenTaskIndex].id === task.id
123125
}
124126
onClickCheck={handleCheckTask(task.id)}
125-
onClick={handleClickTask(index)}
127+
onClick={handleClickTask(undoneIndex)}
126128
/>
127129
))}
128130
</div>
@@ -131,11 +133,45 @@ function Home() {
131133
<div className="text-red-600 text-[16px]">{taskFetchState.error}</div>
132134
</div>
133135
)}
136+
134137
<CreateTaskPlaceholder
135138
onClick={() => {
136139
openTaskBuilder();
137140
}}
138141
/>
142+
<Accordion.Root
143+
className="w-full max-w-xl"
144+
type="single"
145+
value={accordionValue}
146+
onValueChange={setAccordionValue}
147+
collapsible
148+
>
149+
<Accordion.AccordionItem value="supernova-dones">
150+
<Accordion.AccordionTrigger className="flex items-center justify-between w-full hover:bg-gray-100 rounded px-1">
151+
<p className="text-xs text-teal-800">Dones ({doneTasks.length})</p>{" "}
152+
<ChevronDownIcon className="text-teal-800" />
153+
</Accordion.AccordionTrigger>
154+
<Accordion.AccordionContent className="py-2">
155+
<div
156+
className="flex flex-col items-center w-full max-h-full gap-2 overflow-clip"
157+
ref={taskListRef}
158+
>
159+
{doneTasks.map((task, doneIndex) => (
160+
<SupernovaTaskComponent
161+
key={task.id}
162+
task={task}
163+
focused={
164+
chosenTaskIndex !== -1 &&
165+
memoizedTasksView[chosenTaskIndex].id === task.id
166+
}
167+
onClickCheck={handleCheckTask(task.id)}
168+
onClick={handleClickTask(undoneTasks.length + doneIndex)}
169+
/>
170+
))}
171+
</div>
172+
</Accordion.AccordionContent>
173+
</Accordion.AccordionItem>
174+
</Accordion.Root>
139175
</main>
140176
);
141177
}

apps/desktop-v2/hooks/useSupernovaTasksUI.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ export default function useSupernovaTasksUI() {
2929

3030
const [taskBuilderIsOpen, setTaskBuilderIsOpen] = useState<boolean>(false);
3131
const [refetchTasks, setRefetchTasks] = useState<boolean>(false); // refetch the tasks from the backend for consistency and sorting
32+
const [accordionValue, setAccordionValue] = useState<string | undefined>(
33+
undefined
34+
);
35+
const doneAccordionOpened = accordionValue === "supernova-dones";
36+
37+
const undoneTasks = memoizedTasksView.filter((task) => !task.isComplete);
38+
const doneTasks = memoizedTasksView.filter((task) => task.isComplete);
39+
3240
const anyModalOpen = useMemo(() => {
3341
return taskBuilderIsOpen || showAreYouSureDialog;
3442
}, [showAreYouSureDialog, taskBuilderIsOpen]);
@@ -252,7 +260,7 @@ export default function useSupernovaTasksUI() {
252260
},
253261
{
254262
label: "Mark done/undone",
255-
shortcut: "d",
263+
shortcut: ["d", "e"],
256264
cb: () => {
257265
if (chosenTaskIndex !== -1) {
258266
handleCheckTask(tasks[chosenTaskIndex].id)(
@@ -297,6 +305,11 @@ export default function useSupernovaTasksUI() {
297305
});
298306
// go down
299307
Mousetrap.bind(["j", "down"], () => {
308+
// if modal isn't opened and it's at the last undone task,
309+
// then don't go down more (will go into the done tasks)
310+
if (chosenTaskIndex === undoneTasks.length - 1 && !doneAccordionOpened) {
311+
return;
312+
}
300313
if (chosenTaskIndex < tasks.length - 1) {
301314
setChosenTaskIndex(chosenTaskIndex + 1);
302315
}
@@ -330,12 +343,14 @@ export default function useSupernovaTasksUI() {
330343
}, [
331344
chosenTaskIndex,
332345
commands,
346+
doneAccordionOpened,
333347
handleCheckTask,
334348
handleDeleteTask,
335349
setChosenTaskIndex,
336350
showAreYouSureDialog,
337351
taskBuilderIsOpen,
338352
tasks,
353+
undoneTasks.length,
339354
]);
340355

341356
// fetch the task in the beginning
@@ -405,5 +420,10 @@ export default function useSupernovaTasksUI() {
405420
handleSubmitAreYouSure,
406421
taskListRef,
407422
memoizedTasksView,
423+
accordionValue,
424+
setAccordionValue,
425+
doneAccordionOpened,
426+
undoneTasks,
427+
doneTasks,
408428
};
409429
}

apps/desktop-v2/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"lint": "next lint"
1010
},
1111
"dependencies": {
12+
"@radix-ui/react-accordion": "^1.1.2",
1213
"@radix-ui/react-checkbox": "^1.0.4",
1314
"@radix-ui/react-dialog": "^1.0.4",
1415
"@radix-ui/react-icons": "^1.3.0",

pnpm-lock.yaml

Lines changed: 98 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)