Skip to content

Commit 9ee0388

Browse files
authored
feat: rework task creation layout (#146)
1 parent c28f4b4 commit 9ee0388

32 files changed

+1155
-1523
lines changed

package.json

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,22 @@
7171
"@codemirror/state": "^6.5.2",
7272
"@codemirror/view": "^6.38.8",
7373
"@dnd-kit/react": "^0.1.21",
74+
"@floating-ui/dom": "^1.7.4",
7475
"@phosphor-icons/react": "^2.1.10",
7576
"@posthog/agent": "1.20.0",
7677
"@radix-ui/react-icons": "^1.3.2",
7778
"@radix-ui/themes": "^3.2.1",
7879
"@tanstack/react-query": "^5.90.2",
79-
"@tiptap/extension-link": "^3.6.6",
80-
"@tiptap/extension-mention": "^3.6.6",
81-
"@tiptap/extension-placeholder": "^3.6.6",
82-
"@tiptap/extension-typography": "^3.6.6",
83-
"@tiptap/extension-underline": "^3.6.6",
84-
"@tiptap/pm": "^3.6.6",
85-
"@tiptap/react": "^3.6.6",
86-
"@tiptap/starter-kit": "^3.6.6",
87-
"@tiptap/suggestion": "^3.6.6",
80+
"@tiptap/core": "^3.11.0",
81+
"@tiptap/extension-link": "^3.11.0",
82+
"@tiptap/extension-mention": "^3.11.0",
83+
"@tiptap/extension-placeholder": "^3.11.0",
84+
"@tiptap/extension-typography": "^3.11.0",
85+
"@tiptap/extension-underline": "^3.11.0",
86+
"@tiptap/pm": "^3.11.0",
87+
"@tiptap/react": "^3.11.0",
88+
"@tiptap/starter-kit": "^3.11.0",
89+
"@tiptap/suggestion": "^3.11.0",
8890
"@xterm/addon-fit": "^0.10.0",
8991
"@xterm/addon-web-links": "^0.11.0",
9092
"@xterm/xterm": "^5.5.0",

pnpm-lock.yaml

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

src/main/index.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,18 @@ function createWindow(): void {
107107
{ role: "quit" },
108108
],
109109
},
110+
{
111+
label: "File",
112+
submenu: [
113+
{
114+
label: "New task",
115+
accelerator: "CmdOrCtrl+N",
116+
click: () => {
117+
mainWindow?.webContents.send("new-task");
118+
},
119+
},
120+
],
121+
},
110122
{
111123
label: "Edit",
112124
submenu: [

src/main/preload.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ contextBridge.exposeInMainWorld("electronAPI", {
212212
ipcRenderer.on("open-settings", wrapped);
213213
return () => ipcRenderer.removeListener("open-settings", wrapped);
214214
},
215+
onNewTask: (listener: () => void): (() => void) => {
216+
const wrapped = () => listener();
217+
ipcRenderer.on("new-task", wrapped);
218+
return () => ipcRenderer.removeListener("new-task", wrapped);
219+
},
215220
getAppVersion: (): Promise<string> => ipcRenderer.invoke("app:get-version"),
216221
onUpdateReady: (listener: () => void): (() => void) => {
217222
const channel = "updates:ready";

src/renderer/components/MainLayout.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,22 @@ import { TopBar } from "@components/ui/topnav/TopBar";
55
import { CommandMenu } from "@features/command/components/CommandMenu";
66
import { SettingsView } from "@features/settings/components/SettingsView";
77
import { TaskDetail } from "@features/task-detail/components/TaskDetail";
8+
import { TaskInput } from "@features/task-detail/components/TaskInput";
89
import { TaskList } from "@features/task-list/components/TaskList";
910
import { useIntegrations } from "@hooks/useIntegrations";
1011
import { Box, Flex } from "@radix-ui/themes";
1112
import type { Task } from "@shared/types";
12-
import { useLayoutStore } from "@stores/layoutStore";
1313
import { useNavigationStore } from "@stores/navigationStore";
1414
import { useCallback, useEffect, useState } from "react";
1515
import { useHotkeys } from "react-hotkeys-hook";
1616
import { Toaster } from "sonner";
1717

1818
export function MainLayout() {
19-
const { setCliMode } = useLayoutStore();
2019
const {
2120
view,
2221
toggleSettings,
23-
navigateToTaskList,
2422
navigateToTask,
23+
navigateToTaskInput,
2524
goBack,
2625
goForward,
2726
} = useNavigationStore();
@@ -33,9 +32,8 @@ export function MainLayout() {
3332
}, [toggleSettings]);
3433

3534
const handleFocusTaskMode = useCallback(() => {
36-
navigateToTaskList();
37-
setCliMode("task");
38-
}, [setCliMode, navigateToTaskList]);
35+
navigateToTaskInput();
36+
}, [navigateToTaskInput]);
3937

4038
useHotkeys("mod+k", () => setCommandMenuOpen((prev) => !prev), {
4139
enabled: !commandMenuOpen,
@@ -52,14 +50,19 @@ export function MainLayout() {
5250
useHotkeys("mod+]", () => goForward());
5351

5452
useEffect(() => {
55-
const unsubscribe = window.electronAPI?.onOpenSettings(() => {
53+
const unsubscribeSettings = window.electronAPI?.onOpenSettings(() => {
5654
handleOpenSettings();
5755
});
5856

57+
const unsubscribeNewTask = window.electronAPI?.onNewTask(() => {
58+
handleFocusTaskMode();
59+
});
60+
5961
return () => {
60-
unsubscribe?.();
62+
unsubscribeSettings?.();
63+
unsubscribeNewTask?.();
6164
};
62-
}, [handleOpenSettings]);
65+
}, [handleOpenSettings, handleFocusTaskMode]);
6366

6467
const handleSelectTask = (task: Task) => {
6568
navigateToTask(task);
@@ -76,6 +79,8 @@ export function MainLayout() {
7679
<TaskList onSelectTask={handleSelectTask} />
7780
)}
7881

82+
{view.type === "task-input" && <TaskInput />}
83+
7984
{view.type === "task-detail" && view.data && (
8085
<TaskDetail key={view.data.id} task={view.data} />
8186
)}

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,21 @@ import { useTaskContextMenu } from "@hooks/useTaskContextMenu";
99
import { ArrowsInSimpleIcon, ArrowsOutSimpleIcon } from "@phosphor-icons/react";
1010
import { Box, Button, Flex, IconButton, Tooltip } from "@radix-ui/themes";
1111
import type { Task } from "@shared/types";
12-
import { useLayoutStore } from "@stores/layoutStore";
1312
import { useNavigationStore } from "@stores/navigationStore";
1413
import { useSidebarStore } from "@stores/sidebarStore";
1514
import type React from "react";
1615
import { useState } from "react";
1716

1817
export const SidebarContent: React.FC = () => {
19-
const { view, navigateToTaskList, navigateToTask, navigateToSettings } =
20-
useNavigationStore();
18+
const {
19+
view,
20+
navigateToTaskList,
21+
navigateToTask,
22+
navigateToTaskInput,
23+
navigateToSettings,
24+
} = useNavigationStore();
2125
const expandedNodesArray = useSidebarStore((state) => state.expandedNodes);
2226
const { toggleNode, expandAll, collapseAll } = useSidebarStore();
23-
const { setCliMode } = useLayoutStore();
2427
const { isLoading } = useTasks();
2528
const activeFilters = useTaskStore((state) => state.activeFilters);
2629
const setActiveFilters = useTaskStore((state) => state.setActiveFilters);
@@ -45,8 +48,7 @@ export const SidebarContent: React.FC = () => {
4548
};
4649

4750
const handleCreateTask = () => {
48-
navigateToTaskList();
49-
setCliMode("task");
51+
navigateToTaskInput();
5052
};
5153

5254
const handleProjectClick = (repository: string) => {
@@ -93,7 +95,8 @@ export const SidebarContent: React.FC = () => {
9395
<Box
9496
style={{
9597
flexGrow: 1,
96-
overflow: "auto",
98+
overflowY: "auto",
99+
overflowX: "hidden",
97100
}}
98101
>
99102
<Flex direction="column" gap="4" p="2">

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ interface TaskView {
1919
}
2020

2121
interface ViewState {
22-
type: "task-list" | "task-detail" | "settings";
22+
type: "task-list" | "task-detail" | "task-input" | "settings";
2323
data?: Task;
2424
}
2525

src/renderer/components/ui/topnav/TopBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ interface TopBarProps {
99
export const TopBar = ({ onSearchClick }: TopBarProps) => {
1010
return (
1111
<Flex
12-
className="drag h-10 w-full border-gray-6 border-b"
12+
className="drag h-10 min-h-10 w-full border-gray-6 border-b"
1313
align="center"
1414
justify="center"
1515
px="2"

src/renderer/features/auth/stores/authStore.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { PostHogAPIClient } from "@api/posthogClient";
22
import { identifyUser, resetUser, track } from "@renderer/lib/analytics";
33
import { queryClient } from "@renderer/lib/queryClient";
4-
import { useNavigationStore } from "@renderer/stores/navigationStore";
54
import type { CloudRegion } from "@shared/types/oauth";
65
import { create } from "zustand";
76
import { persist } from "zustand/middleware";
@@ -135,9 +134,6 @@ export const useAuthStore = create<AuthState>()(
135134
project_id: projectId.toString(),
136135
region,
137136
});
138-
139-
// Navigate to task list after successful authentication
140-
useNavigationStore.getState().navigateToTaskList();
141137
} catch {
142138
throw new Error("Failed to authenticate with PostHog");
143139
}
@@ -310,9 +306,6 @@ export const useAuthStore = create<AuthState>()(
310306
region: tokens.cloudRegion,
311307
});
312308

313-
// Navigate to task list after successful authentication
314-
useNavigationStore.getState().navigateToTaskList();
315-
316309
if (state.encryptedOpenaiKey) {
317310
const decryptedOpenaiKey =
318311
await window.electronAPI.retrieveApiKey(

src/renderer/features/command/components/CommandMenu.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { useTasks } from "@features/tasks/hooks/useTasks";
44
import { FileTextIcon, ListBulletIcon } from "@radix-ui/react-icons";
55
import { Flex, Text } from "@radix-ui/themes";
66
import type { Task } from "@shared/types";
7-
import { useLayoutStore } from "@stores/layoutStore";
87
import { useNavigationStore } from "@stores/navigationStore";
98
import { useCallback, useEffect, useRef } from "react";
109
import { useHotkeys } from "react-hotkeys-hook";
@@ -15,8 +14,8 @@ interface CommandMenuProps {
1514
}
1615

1716
export function CommandMenu({ open, onOpenChange }: CommandMenuProps) {
18-
const { navigateToTaskList, navigateToTask } = useNavigationStore();
19-
const { setCliMode } = useLayoutStore();
17+
const { navigateToTaskList, navigateToTask, navigateToTaskInput } =
18+
useNavigationStore();
2019
const { data: tasks = [] } = useTasks();
2120
const commandRef = useRef<HTMLDivElement>(null);
2221

@@ -71,8 +70,7 @@ export function CommandMenu({ open, onOpenChange }: CommandMenuProps) {
7170
};
7271

7372
const handleCreateTask = () => {
74-
navigateToTaskList();
75-
setCliMode("task");
73+
navigateToTaskInput();
7674
onOpenChange(false);
7775
};
7876

0 commit comments

Comments
 (0)