diff --git a/apps/mobile/src/features/inbox/components/FilterSheet.tsx b/apps/mobile/src/features/inbox/components/FilterSheet.tsx index 9c05fd1c1..5243c6764 100644 --- a/apps/mobile/src/features/inbox/components/FilterSheet.tsx +++ b/apps/mobile/src/features/inbox/components/FilterSheet.tsx @@ -76,6 +76,7 @@ const SOURCE_PRODUCT_OPTIONS: { value: SourceProduct; label: string }[] = [ { value: "linear", label: "Linear" }, { value: "zendesk", label: "Zendesk" }, { value: "conversations", label: "Conversations" }, + { value: "signals_scout", label: "Scout" }, ]; function SectionHeader({ title }: { title: string }) { diff --git a/apps/mobile/src/features/inbox/components/SignalCard.tsx b/apps/mobile/src/features/inbox/components/SignalCard.tsx index a8c871828..a32ff002d 100644 --- a/apps/mobile/src/features/inbox/components/SignalCard.tsx +++ b/apps/mobile/src/features/inbox/components/SignalCard.tsx @@ -7,6 +7,7 @@ import { ChatCircle, CheckCircle, Code, + Compass, GithubLogo, LinkSimple, Question, @@ -46,6 +47,12 @@ function sourceLine(signal: Signal): string { return "GitHub · Issue"; if (source_product === "linear" && source_type === "issue") return "Linear · Issue"; + if ( + source_product === "signals_scout" && + source_type === "cross_source_issue" + ) + return "Scout · Cross-source issue"; + if (source_product === "signals_scout") return "Scout"; const product = source_product.replace(/_/g, " "); const type = source_type.replace(/_/g, " "); return `${product} · ${type}`; @@ -73,6 +80,8 @@ function SourceIcon({ return ; case "linear": return ; + case "signals_scout": + return ; default: return ; } diff --git a/apps/mobile/src/features/inbox/stores/inboxFilterStore.test.ts b/apps/mobile/src/features/inbox/stores/inboxFilterStore.test.ts index 31cae025d..e8dfa483f 100644 --- a/apps/mobile/src/features/inbox/stores/inboxFilterStore.test.ts +++ b/apps/mobile/src/features/inbox/stores/inboxFilterStore.test.ts @@ -1,14 +1,43 @@ -import { beforeEach, describe, expect, it } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; -import { useInboxFilterStore } from "./inboxFilterStore"; +vi.mock("@react-native-async-storage/async-storage", () => ({ + default: { + getItem: vi.fn(), + setItem: vi.fn(), + removeItem: vi.fn(), + }, +})); -const INITIAL_STATE = useInboxFilterStore.getState(); +import { type SourceProduct, useInboxFilterStore } from "./inboxFilterStore"; + +describe("inboxFilterStore", () => { + beforeEach(() => { + useInboxFilterStore.getState().resetFilters(); + }); + + it.each(["signals_scout", "error_tracking", "github"])( + "toggles %s in and out of the source filter", + (source) => { + const { toggleSourceProduct } = useInboxFilterStore.getState(); -beforeEach(() => { - useInboxFilterStore.setState(INITIAL_STATE, true); + toggleSourceProduct(source); + expect(useInboxFilterStore.getState().sourceProductFilter).toEqual([ + source, + ]); + + toggleSourceProduct(source); + expect(useInboxFilterStore.getState().sourceProductFilter).toEqual([]); + }, + ); }); +const INITIAL_STATE = useInboxFilterStore.getState(); + describe("inboxFilterStore priority filter", () => { + beforeEach(() => { + useInboxFilterStore.setState(INITIAL_STATE, true); + }); + it("starts empty (no priority filter)", () => { expect(useInboxFilterStore.getState().priorityFilter).toEqual([]); }); diff --git a/apps/mobile/src/features/inbox/stores/inboxFilterStore.ts b/apps/mobile/src/features/inbox/stores/inboxFilterStore.ts index e777738bf..ea363b4e4 100644 --- a/apps/mobile/src/features/inbox/stores/inboxFilterStore.ts +++ b/apps/mobile/src/features/inbox/stores/inboxFilterStore.ts @@ -21,7 +21,8 @@ export type SourceProduct = | "github" | "linear" | "zendesk" - | "conversations"; + | "conversations" + | "signals_scout"; export const DEFAULT_STATUS_FILTER: SignalReportStatus[] = [ "ready",