Skip to content

Commit a858340

Browse files
authored
feat: show my tasks by default (#106)
1 parent 85e4a87 commit a858340

File tree

4 files changed

+75
-39
lines changed

4 files changed

+75
-39
lines changed

src/renderer/components/ui/sidebar/SidebarContent.tsx

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
import { SidebarTreeItem } from "@components/ui/sidebar/SidebarTreeItem";
22
import { useSidebarMenuData } from "@components/ui/sidebar/UseSidebarMenuData";
33
import { buildTreeLines, getAllNodeIds } from "@components/ui/sidebar/Utils";
4-
import { useAuthStore } from "@features/auth/stores/authStore";
54
import { useAudioRecorder } from "@features/recordings/hooks/useAudioRecorder";
65
import { useRecordings } from "@features/recordings/hooks/useRecordings";
76
import { useTasks } from "@features/tasks/hooks/useTasks";
87
import { useTaskStore } from "@features/tasks/stores/taskStore";
8+
import { useMeQuery } from "@hooks/useMeQuery";
99
import { ArrowsInSimpleIcon, ArrowsOutSimpleIcon } from "@phosphor-icons/react";
1010
import { Box, Flex, IconButton, Tooltip } from "@radix-ui/themes";
1111
import type { Task } from "@shared/types";
1212
import { useLayoutStore } from "@stores/layoutStore";
1313
import { useSidebarStore } from "@stores/sidebarStore";
1414
import { useTabStore } from "@stores/tabStore";
1515
import type React from "react";
16-
import { useEffect, useState } from "react";
16+
import { useState } from "react";
1717

1818
export const SidebarContent: React.FC = () => {
19-
const { client } = useAuthStore();
2019
const { tabs, createTab, setActiveTab, activeTabId } = useTabStore();
2120
const expandedNodesArray = useSidebarStore((state) => state.expandedNodes);
2221
const { toggleNode, expandAll, collapseAll } = useSidebarStore();
@@ -26,26 +25,12 @@ export const SidebarContent: React.FC = () => {
2625
const { isLoading } = useTasks();
2726
const activeFilters = useTaskStore((state) => state.activeFilters);
2827
const setActiveFilters = useTaskStore((state) => state.setActiveFilters);
29-
const [userName, setUserName] = useState<string>("Loading...");
28+
const { data: currentUser } = useMeQuery();
3029
const [hoveredLineIndex, setHoveredLineIndex] = useState<number | null>(null);
3130

3231
const expandedNodes = new Set(expandedNodesArray);
3332
const activeTab = tabs.find((tab) => tab.id === activeTabId);
34-
35-
useEffect(() => {
36-
async function fetchUser() {
37-
if (client) {
38-
try {
39-
const user = await client.getCurrentUser();
40-
setUserName(user.first_name || user.email || "Account");
41-
} catch (error) {
42-
console.error("Failed to fetch user:", error);
43-
setUserName("Account");
44-
}
45-
}
46-
}
47-
fetchUser();
48-
}, [client]);
33+
const userName = currentUser?.first_name || currentUser?.email || "Account";
4934

5035
const handleNavigate = (
5136
type: "task-list" | "recordings" | "notetaker" | "settings",
@@ -106,6 +91,8 @@ export const SidebarContent: React.FC = () => {
10691
activeTab,
10792
isLoading,
10893
activeFilters,
94+
currentUser,
95+
setActiveFilters,
10996
onNavigate: handleNavigate,
11097
onTaskClick: handleTaskClick,
11198
onCreateTask: handleCreateTask,

src/renderer/components/ui/sidebar/UseSidebarMenuData.tsx

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,33 @@
1+
import type { Schemas } from "@api/generated";
12
import type { TreeNode } from "@components/ui/sidebar/Types";
23
import { useTasks } from "@features/tasks/hooks/useTasks";
34
import type { ActiveFilters } from "@features/tasks/stores/taskStore";
5+
import { getUserDisplayName } from "@hooks/useUsers";
6+
import { filtersMatch } from "@lib/filters";
47
import {
58
CheckCircleIcon,
69
CircleIcon,
710
FolderIcon,
811
GearIcon,
912
ListNumbersIcon,
1013
PlusIcon,
11-
SquaresFourIcon,
1214
VideoIcon,
1315
XCircleIcon,
1416
} from "@phosphor-icons/react";
1517
import type { TabState, Task } from "@shared/types";
1618

19+
interface TaskView {
20+
label: string;
21+
filters: ActiveFilters;
22+
}
23+
1724
interface UseSidebarMenuDataProps {
1825
userName: string;
1926
activeTab: TabState | undefined;
2027
isLoading: boolean;
2128
activeFilters: ActiveFilters;
29+
currentUser: Schemas.User | undefined;
30+
setActiveFilters: (filters: ActiveFilters) => void;
2231
onNavigate: (
2332
type: "task-list" | "recordings" | "notetaker" | "settings",
2433
title: string,
@@ -58,6 +67,8 @@ export function useSidebarMenuData({
5867
activeTab,
5968
isLoading,
6069
activeFilters,
70+
currentUser,
71+
setActiveFilters,
6172
onNavigate,
6273
onTaskClick,
6374
onCreateTask,
@@ -89,22 +100,44 @@ export function useSidebarMenuData({
89100
? activeRepositoryFilters[0].value
90101
: null;
91102

103+
const views: TaskView[] = [];
104+
105+
if (currentUser) {
106+
const userDisplayName = getUserDisplayName(currentUser);
107+
views.push({
108+
label: "My tasks",
109+
filters: {
110+
creator: [{ value: userDisplayName, operator: "is" }],
111+
},
112+
});
113+
}
114+
115+
views.push({
116+
label: "All tasks",
117+
filters: {},
118+
});
119+
92120
return {
93121
label: userName,
94122
children: [
95-
{
96-
label: "My tasks",
97-
icon: (
98-
<ListNumbersIcon
99-
size={12}
100-
weight={activeTab?.type === "task-list" ? "fill" : "regular"}
101-
/>
102-
),
103-
action: () => onNavigate("task-list", "Tasks"),
104-
isActive: activeTab?.type === "task-list",
105-
hoverAction: onCreateTask,
106-
hoverIcon: <PlusIcon size={12} />,
107-
},
123+
...views.map((view): TreeNode => {
124+
const isActive =
125+
activeTab?.type === "task-list" &&
126+
filtersMatch(activeFilters, view.filters);
127+
return {
128+
label: view.label,
129+
icon: (
130+
<ListNumbersIcon size={12} weight={isActive ? "fill" : "regular"} />
131+
),
132+
action: () => {
133+
setActiveFilters(view.filters);
134+
onNavigate("task-list", "Tasks");
135+
},
136+
isActive,
137+
hoverAction: onCreateTask,
138+
hoverIcon: <PlusIcon size={12} />,
139+
};
140+
}),
108141
{
109142
label: "Notetaker",
110143
icon: (
@@ -155,11 +188,6 @@ export function useSidebarMenuData({
155188
},
156189
]
157190
: []),
158-
{
159-
label: "Views",
160-
icon: <SquaresFourIcon size={12} />,
161-
children: [{ label: "Work in progress" }],
162-
},
163191
{
164192
label: "Projects",
165193
icon: <FolderIcon size={12} />,

src/renderer/lib/filters.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { ActiveFilters } from "@features/tasks/stores/taskStore";
2+
3+
const normalizeFilters = (filters: ActiveFilters) => {
4+
const sorted: Record<string, Array<{ value: string; operator: string }>> = {};
5+
for (const [key, values] of Object.entries(filters)) {
6+
if (values && values.length > 0) {
7+
sorted[key] = [...values].sort((a, b) =>
8+
`${a.value}:${a.operator}`.localeCompare(`${b.value}:${b.operator}`),
9+
);
10+
}
11+
}
12+
return JSON.stringify(sorted);
13+
};
14+
15+
export function filtersMatch(
16+
filters1: ActiveFilters,
17+
filters2: ActiveFilters,
18+
): boolean {
19+
return normalizeFilters(filters1) === normalizeFilters(filters2);
20+
}

tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
"@components/*": ["renderer/components/*"],
2828
"@stores/*": ["renderer/stores/*"],
2929
"@hooks/*": ["renderer/hooks/*"],
30-
"@utils/*": ["renderer/utils/*"]
30+
"@utils/*": ["renderer/utils/*"],
31+
"@lib/*": ["renderer/lib/*"]
3132
},
3233
"resolveJsonModule": true,
3334
"skipLibCheck": true,

0 commit comments

Comments
 (0)