diff --git a/desktop/src/app/AppShell.tsx b/desktop/src/app/AppShell.tsx index ebfe13fd0..9bc6a7fe3 100644 --- a/desktop/src/app/AppShell.tsx +++ b/desktop/src/app/AppShell.tsx @@ -126,9 +126,6 @@ export function AppShell() { activeChannel, identityQuery.data, ); - const homeUrgentCount = - (homeFeedQuery.data?.feed.mentions.length ?? 0) + - (homeFeedQuery.data?.feed.needsAction.length ?? 0); const availableChannelIds = React.useMemo( () => new Set(channels.map((channel) => channel.id)), [channels], @@ -411,7 +408,6 @@ export function AppShell() { : undefined } fallbackDisplayName={identityQuery.data?.displayName} - homeUrgentCount={homeUrgentCount} isCreatingChannel={createChannelMutation.isPending} isLoading={channelsQuery.isLoading} selfPresenceStatus={presenceSession.currentStatus} @@ -511,7 +507,6 @@ export function AppShell() { } feed={homeFeedQuery.data} isLoading={homeFeedQuery.isLoading} - isRefreshing={homeFeedQuery.isRefetching} onOpenChannel={handleOpenChannel} onRefresh={() => { void homeFeedQuery.refetch(); diff --git a/desktop/src/features/home/hooks.ts b/desktop/src/features/home/hooks.ts index 6d378482b..1df0c8329 100644 --- a/desktop/src/features/home/hooks.ts +++ b/desktop/src/features/home/hooks.ts @@ -5,7 +5,7 @@ import { getHomeFeed } from "@/shared/api/tauri"; export function useHomeFeedQuery() { return useQuery({ queryKey: ["home-feed"], - queryFn: () => getHomeFeed({ limit: 12 }), + queryFn: () => getHomeFeed({ limit: 12, types: "mentions,needs_action" }), staleTime: 15_000, gcTime: 5 * 60 * 1_000, refetchInterval: 30_000, diff --git a/desktop/src/features/home/ui/HomeView.tsx b/desktop/src/features/home/ui/HomeView.tsx index 72d4b6c84..e252f0acc 100644 --- a/desktop/src/features/home/ui/HomeView.tsx +++ b/desktop/src/features/home/ui/HomeView.tsx @@ -1,12 +1,4 @@ -import { - Activity, - AtSign, - Bot, - CircleAlert, - RefreshCcw, - Sparkles, - type LucideIcon, -} from "lucide-react"; +import { AtSign, CircleAlert, RefreshCcw, type LucideIcon } from "lucide-react"; import { resolveUserLabel, @@ -14,7 +6,6 @@ import { } from "@/features/profile/lib/identity"; import { useUsersBatchQuery } from "@/features/profile/hooks"; import type { FeedItem, HomeFeedResponse } from "@/shared/api/types"; -import { cn } from "@/shared/lib/cn"; import { Button } from "@/shared/ui/button"; import { Markdown } from "@/shared/ui/markdown"; import { Skeleton } from "@/shared/ui/skeleton"; @@ -54,13 +45,6 @@ function formatRelativeTime(unixSeconds: number) { }).format(new Date(unixSeconds * 1_000)); } -function formatUpdatedAt(unixSeconds: number) { - return new Intl.DateTimeFormat("en-US", { - hour: "numeric", - minute: "2-digit", - }).format(new Date(unixSeconds * 1_000)); -} - function feedHeadline(item: FeedItem) { switch (item.kind) { case 40007: @@ -257,65 +241,17 @@ function FeedSection({ ); } -function SummaryCard({ - title, - value, - icon: Icon, - tone, -}: { - title: string; - value: number; - icon: LucideIcon; - tone: "urgent" | "calm"; -}) { - return ( -
-
-
- -
-
-

- {title} -

-

{value}

-
-
-
- ); -} - function HomeLoadingState() { return (
- - - -
- {["first", "second", "third", "fourth"].map((item) => ( - - ))} -
+ +
- {["mentions", "actions", "activity", "agents"].map((section) => ( + {["mentions", "actions"].map((section) => (
; @@ -349,7 +284,6 @@ type HomeViewProps = { export function HomeView({ feed, isLoading = false, - isRefreshing = false, errorMessage, currentPubkey, availableChannelIds, @@ -357,12 +291,7 @@ export function HomeView({ onRefresh, }: HomeViewProps) { const feedItems = feed - ? [ - ...feed.feed.mentions, - ...feed.feed.needsAction, - ...feed.feed.activity, - ...feed.feed.agentActivity, - ] + ? [...feed.feed.mentions, ...feed.feed.needsAction] : []; const feedProfilesQuery = useUsersBatchQuery( feedItems.map((item) => item.pubkey), @@ -397,80 +326,9 @@ export function HomeView({ ); } - const totalUrgent = feed.feed.mentions.length + feed.feed.needsAction.length; - return (
-
-
-
-
-
-
- -
-
-

- Focus queue -

-

- Mentions, reminders, channel activity, and agent work in one - feed. -

-
-
- - {errorMessage ? ( -

{errorMessage}

- ) : null} -
- -
-

- Updated {formatUpdatedAt(feed.meta.generatedAt)} -

- -
-
- -
- - - - -
-
- +
- -
diff --git a/desktop/src/features/sidebar/ui/AppSidebar.tsx b/desktop/src/features/sidebar/ui/AppSidebar.tsx index a90d3a14b..cc79cf6a5 100644 --- a/desktop/src/features/sidebar/ui/AppSidebar.tsx +++ b/desktop/src/features/sidebar/ui/AppSidebar.tsx @@ -43,7 +43,6 @@ type AppSidebarProps = { profile?: Profile; selfPresenceStatus: PresenceStatus; errorMessage?: string; - homeUrgentCount?: number; selectedChannelId: string | null; selectedView: "home" | "channel" | "settings"; unreadChannelIds: Set; @@ -294,7 +293,6 @@ export function AppSidebar({ profile, selfPresenceStatus, errorMessage, - homeUrgentCount, selectedChannelId, selectedView, unreadChannelIds, @@ -435,11 +433,6 @@ export function AppSidebar({ > Home - {homeUrgentCount && homeUrgentCount > 0 ? ( - - {homeUrgentCount} - - ) : null} diff --git a/desktop/tests/e2e/smoke.spec.ts b/desktop/tests/e2e/smoke.spec.ts index 15c97b147..d2ff850f9 100644 --- a/desktop/tests/e2e/smoke.spec.ts +++ b/desktop/tests/e2e/smoke.spec.ts @@ -76,9 +76,7 @@ test("opens a mocked channel from the home feed", async ({ page }) => { await page.goto("/"); await expect(page.getByTestId("chat-title")).toHaveText("Home"); - await expect( - page.getByRole("heading", { name: "Focus queue" }), - ).toBeVisible(); + await expect(page.getByRole("heading", { name: "@Mentions" })).toBeVisible(); await expect( page.getByText("Please review the release checklist."), ).toBeVisible(); @@ -91,20 +89,15 @@ test("opens a mocked channel from the home feed", async ({ page }) => { ); }); -test("home feed uses your resolved profile label instead of You", async ({ - page, -}) => { - const activitySection = page.locator("section").filter({ - has: page.getByRole("heading", { name: "Channel Activity" }), +test("home feed renders resolved author labels", async ({ page }) => { + const mentionsSection = page.locator("section").filter({ + has: page.getByRole("heading", { name: "@Mentions" }), }); await page.goto("/"); - await expect(activitySection).toContainText( - "I posted a note about the launch checklist.", - ); - await expect(activitySection).toContainText("npub1mock..."); - await expect(activitySection).not.toContainText("You"); + await expect(mentionsSection).toContainText("alice"); + await expect(mentionsSection).not.toContainText("You"); }); test("opens relay-backed search from the sidebar and loads the exact result", async ({ diff --git a/desktop/tests/e2e/stream.spec.ts b/desktop/tests/e2e/stream.spec.ts index 76873143d..a81fd81f2 100644 --- a/desktop/tests/e2e/stream.spec.ts +++ b/desktop/tests/e2e/stream.spec.ts @@ -102,13 +102,13 @@ test("loads the home feed from the relay", async ({ page }) => { await page.goto("/"); await expect(page.getByTestId("chat-title")).toHaveText("Home"); - await expect( - page.getByRole("heading", { name: "Focus queue" }), - ).toBeVisible(); await expect(page.getByRole("heading", { name: "@Mentions" })).toBeVisible(); await expect( page.getByRole("heading", { name: "Needs Action" }), ).toBeVisible(); + await expect( + page.getByRole("heading", { name: "Channel Activity" }), + ).toHaveCount(0); }); test("creates a relay-backed stream", async ({ page }) => {