From 236b11fa389252a55cd8698cd3e7b6784633b25e Mon Sep 17 00:00:00 2001 From: Oliver Browne Date: Tue, 31 Mar 2026 15:52:57 +0300 Subject: [PATCH] Always show the inbox is there are any reports, and give me the ability to view all tasks in dev --- .../inbox/components/InboxSignalsTab.tsx | 36 ++++++++++++++ .../features/inbox/components/InboxView.tsx | 46 +---------------- .../sidebar/components/TaskListView.tsx | 49 +++++++++++++++++++ .../features/sidebar/hooks/useSidebarData.ts | 11 +++-- .../features/sidebar/stores/sidebarStore.ts | 7 +++ .../renderer/features/tasks/hooks/useTasks.ts | 10 ++-- 6 files changed, 109 insertions(+), 50 deletions(-) diff --git a/apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx b/apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx index 902a86621..e759cef77 100644 --- a/apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx +++ b/apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx @@ -6,6 +6,7 @@ import { useInboxReportSignals, useInboxReportsInfinite, } from "@features/inbox/hooks/useInboxReports"; +import { useSignalSourceConfigs } from "@features/inbox/hooks/useSignalSourceConfigs"; import { useInboxCloudTaskStore } from "@features/inbox/stores/inboxCloudTaskStore"; import { useInboxSignalsFilterStore } from "@features/inbox/stores/inboxSignalsFilterStore"; import { useInboxSignalsSidebarStore } from "@features/inbox/stores/inboxSignalsSidebarStore"; @@ -19,6 +20,7 @@ import { INBOX_REFETCH_INTERVAL_MS, } from "@features/inbox/utils/inboxConstants"; import { useDraftStore } from "@features/message-editor/stores/draftStore"; +import { useSettingsDialogStore } from "@features/settings/stores/settingsDialogStore"; import { useCreateTask } from "@features/tasks/hooks/useTasks"; import { useFeatureFlag } from "@hooks/useFeatureFlag"; import { useRepositoryIntegration } from "@hooks/useIntegrations"; @@ -116,6 +118,9 @@ export function InboxSignalsTab() { const sortField = useInboxSignalsFilterStore((s) => s.sortField); const sortDirection = useInboxSignalsFilterStore((s) => s.sortDirection); const searchQuery = useInboxSignalsFilterStore((s) => s.searchQuery); + const { data: signalSourceConfigs } = useSignalSourceConfigs(); + const hasSignalSources = signalSourceConfigs?.some((c) => c.enabled) ?? false; + const openSettings = useSettingsDialogStore((s) => s.open); const windowFocused = useRendererWindowFocusStore((s) => s.focused); const isInboxView = useNavigationStore((s) => s.view.type === "inbox"); @@ -307,6 +312,37 @@ export function InboxSignalsTab() { } if (allReports.length === 0) { + if (!hasSignalSources) { + return ( + + + + Enable Inbox + + + Inbox automatically analyzes your product data and prioritizes + actionable tasks. Choose which sources to enable for this project. + + + + + ); + } return ; } diff --git a/apps/code/src/renderer/features/inbox/components/InboxView.tsx b/apps/code/src/renderer/features/inbox/components/InboxView.tsx index bec083931..edfb34758 100644 --- a/apps/code/src/renderer/features/inbox/components/InboxView.tsx +++ b/apps/code/src/renderer/features/inbox/components/InboxView.tsx @@ -1,49 +1,11 @@ import { useSettingsDialogStore } from "@features/settings/stores/settingsDialogStore"; import { useSetHeaderContent } from "@hooks/useSetHeaderContent"; import { EnvelopeSimpleIcon, GearSixIcon } from "@phosphor-icons/react"; -import { Box, Button, Flex, Text } from "@radix-ui/themes"; +import { Box, Flex, Text } from "@radix-ui/themes"; import { useMemo } from "react"; -import { useSignalSourceConfigs } from "../hooks/useSignalSourceConfigs"; import { InboxSignalsTab } from "./InboxSignalsTab"; -function SignalsNotConfiguredState() { - const openSettings = useSettingsDialogStore((s) => s.open); - - return ( - - - - Enable Inbox - - - Inbox automatically analyzes your product data and prioritizes - actionable tasks. Choose which sources to enable for this project. - - - - - - ); -} - export function InboxView() { - const { data: configs, isLoading } = useSignalSourceConfigs(); - const hasConfigs = configs?.some((c) => c.enabled) ?? false; const openSettings = useSettingsDialogStore((s) => s.open); const headerContent = useMemo( @@ -75,11 +37,7 @@ export function InboxView() { return ( - {isLoading ? null : hasConfigs ? ( - - ) : ( - - )} + ); } diff --git a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx index cade61235..fd63c5d73 100644 --- a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx +++ b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx @@ -10,6 +10,8 @@ import { FolderOpenIcon, FolderSimple, FunnelSimple as FunnelSimpleIcon, + User, + Users, } from "@phosphor-icons/react"; import { Box, Flex, Popover, Text } from "@radix-ui/themes"; import { useWorkspace } from "@renderer/features/workspace/hooks/useWorkspace"; @@ -120,8 +122,10 @@ function TaskRow({ function TaskFilterMenu() { const organizeMode = useSidebarStore((state) => state.organizeMode); const sortMode = useSidebarStore((state) => state.sortMode); + const showAllUsers = useSidebarStore((state) => state.showAllUsers); const setOrganizeMode = useSidebarStore((state) => state.setOrganizeMode); const setSortMode = useSidebarStore((state) => state.setSortMode); + const setShowAllUsers = useSidebarStore((state) => state.setShowAllUsers); const itemClassName = "flex w-full items-center justify-between rounded-sm px-1 py-1 text-left text-[13px] text-gray-12 transition-colors hover:bg-gray-3"; @@ -223,6 +227,51 @@ function TaskFilterMenu() { + + {import.meta.env.DEV && ( + <> +
+ + + + Show + + + + + + + + )} diff --git a/apps/code/src/renderer/features/sidebar/hooks/useSidebarData.ts b/apps/code/src/renderer/features/sidebar/hooks/useSidebarData.ts index 2a774265a..24a582062 100644 --- a/apps/code/src/renderer/features/sidebar/hooks/useSidebarData.ts +++ b/apps/code/src/renderer/features/sidebar/hooks/useSidebarData.ts @@ -145,7 +145,10 @@ function groupByRepository( export function useSidebarData({ activeView, }: UseSidebarDataProps): SidebarData { - const { data: rawTasks = [], isLoading: isLoadingTasks } = useTasks(); + const showAllUsers = useSidebarStore((state) => state.showAllUsers); + const { data: rawTasks = [], isLoading: isLoadingTasks } = useTasks({ + showAllUsers, + }); const { data: workspaces, isFetched: isWorkspacesFetched } = useWorkspaces(); const archivedTaskIds = useArchivedTaskIds(); const suspendedTaskIds = useSuspendedTaskIds(); @@ -153,9 +156,11 @@ export function useSidebarData({ const allTasks = useMemo( () => rawTasks.filter( - (task) => !archivedTaskIds.has(task.id) && !!workspaces?.[task.id], + (task) => + !archivedTaskIds.has(task.id) && + (showAllUsers || !!workspaces?.[task.id]), ), - [rawTasks, archivedTaskIds, workspaces], + [rawTasks, archivedTaskIds, workspaces, showAllUsers], ); const sessions = useSessions(); const { timestamps } = useTaskViewed(); diff --git a/apps/code/src/renderer/features/sidebar/stores/sidebarStore.ts b/apps/code/src/renderer/features/sidebar/stores/sidebarStore.ts index 3276b8d8f..b13473435 100644 --- a/apps/code/src/renderer/features/sidebar/stores/sidebarStore.ts +++ b/apps/code/src/renderer/features/sidebar/stores/sidebarStore.ts @@ -11,6 +11,7 @@ interface SidebarStoreState { historyVisibleCount: number; organizeMode: "by-project" | "chronological"; sortMode: "updated" | "created"; + showAllUsers: boolean; } interface SidebarStoreActions { @@ -27,6 +28,7 @@ interface SidebarStoreActions { resetHistoryVisibleCount: () => void; setOrganizeMode: (mode: SidebarStoreState["organizeMode"]) => void; setSortMode: (mode: SidebarStoreState["sortMode"]) => void; + setShowAllUsers: (showAllUsers: boolean) => void; } type SidebarStore = SidebarStoreState & SidebarStoreActions; @@ -43,6 +45,7 @@ export const useSidebarStore = create()( historyVisibleCount: 25, organizeMode: "by-project", sortMode: "updated", + showAllUsers: false, setOpen: (open) => set({ open, hasUserSetOpen: true }), setOpenAuto: (open) => set((state) => (state.hasUserSetOpen ? state : { open })), @@ -91,6 +94,7 @@ export const useSidebarStore = create()( resetHistoryVisibleCount: () => set({ historyVisibleCount: 25 }), setOrganizeMode: (organizeMode) => set({ organizeMode }), setSortMode: (sortMode) => set({ sortMode }), + setShowAllUsers: (showAllUsers) => set({ showAllUsers }), }), { name: "sidebar-storage", @@ -103,6 +107,7 @@ export const useSidebarStore = create()( historyVisibleCount: state.historyVisibleCount, organizeMode: state.organizeMode, sortMode: state.sortMode, + showAllUsers: state.showAllUsers, }), merge: (persisted, current) => { const persistedState = persisted as { @@ -114,6 +119,7 @@ export const useSidebarStore = create()( historyVisibleCount?: number; organizeMode?: SidebarStoreState["organizeMode"]; sortMode?: SidebarStoreState["sortMode"]; + showAllUsers?: boolean; }; return { ...current, @@ -127,6 +133,7 @@ export const useSidebarStore = create()( persistedState.historyVisibleCount ?? current.historyVisibleCount, organizeMode: persistedState.organizeMode ?? current.organizeMode, sortMode: persistedState.sortMode ?? current.sortMode, + showAllUsers: persistedState.showAllUsers ?? current.showAllUsers, }; }, }, diff --git a/apps/code/src/renderer/features/tasks/hooks/useTasks.ts b/apps/code/src/renderer/features/tasks/hooks/useTasks.ts index 8071b3eb7..4097200c8 100644 --- a/apps/code/src/renderer/features/tasks/hooks/useTasks.ts +++ b/apps/code/src/renderer/features/tasks/hooks/useTasks.ts @@ -29,15 +29,19 @@ const taskKeys = { detail: (id: string) => [...taskKeys.details(), id] as const, }; -export function useTasks(filters?: { repository?: string }) { +export function useTasks(filters?: { + repository?: string; + showAllUsers?: boolean; +}) { const { data: currentUser } = useMeQuery(); + const createdBy = filters?.showAllUsers ? undefined : currentUser?.id; return useAuthenticatedQuery( - taskKeys.list({ ...filters, createdBy: currentUser?.id }), + taskKeys.list({ ...filters, createdBy }), (client) => client.getTasks({ repository: filters?.repository, - createdBy: currentUser?.id, + createdBy, }) as unknown as Promise, { enabled: !!currentUser?.id, refetchInterval: TASK_LIST_POLL_INTERVAL_MS }, );