Skip to content

Commit 308eda3

Browse files
fix(inbox): preserve host filter contracts
Generated-By: PostHog Code Task-Id: c1bbe3cf-742b-4b24-bf96-d11a18b4cf22
1 parent af7f306 commit 308eda3

6 files changed

Lines changed: 32 additions & 25 deletions

File tree

apps/mobile/src/app/(tabs)/inbox.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export default function InboxScreen() {
7171
visibleReports: reports,
7272
totalCount,
7373
filters: {
74+
surface: "mobile",
7475
sourceProductFilter,
7576
statusFilter,
7677
suggestedReviewerFilter,

apps/mobile/src/features/inbox/utils.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ function buildMobileInboxViewedProperties(
2929
return buildInboxViewedProperties({
3030
visibleReports: reports,
3131
totalCount,
32-
filters,
32+
filters: { surface: "mobile", ...filters },
3333
});
3434
}
3535

packages/core/src/inbox/engagement.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ function fakeReport(overrides: Partial<SignalReport> = {}): SignalReport {
2828
}
2929

3030
const NO_FILTERS = {
31+
surface: "desktop" as const,
3132
sourceProductFilter: [],
3233
priorityFilter: [],
3334
searchQuery: "",

packages/core/src/inbox/engagement.ts

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -170,21 +170,35 @@ export function buildBulkActionEvents(
170170
}));
171171
}
172172

173-
export interface InboxViewedFilterState {
173+
interface InboxViewedFilterStateBase {
174174
sourceProductFilter: string[];
175175
priorityFilter: string[];
176-
searchQuery?: string;
177-
statusFilter?: readonly string[];
178-
defaultStatusFilter?: readonly string[];
179-
suggestedReviewerFilter?: string[];
176+
}
177+
178+
export interface DesktopInboxViewedFilterState
179+
extends InboxViewedFilterStateBase {
180+
surface: "desktop";
181+
searchQuery: string;
180182
/**
181183
* True when the reviewer scope is the default ("For you"). False when the
182184
* user has narrowed to a teammate or the whole project — treated as an
183185
* active filter for `has_active_filters`.
184186
*/
185-
isDefaultScope?: boolean;
187+
isDefaultScope: boolean;
186188
}
187189

190+
export interface MobileInboxViewedFilterState
191+
extends InboxViewedFilterStateBase {
192+
surface: "mobile";
193+
statusFilter: readonly string[];
194+
defaultStatusFilter: readonly string[];
195+
suggestedReviewerFilter: string[];
196+
}
197+
198+
export type InboxViewedFilterState =
199+
| DesktopInboxViewedFilterState
200+
| MobileInboxViewedFilterState;
201+
188202
export interface BuildInboxViewedInput {
189203
/**
190204
* Reports currently visible to the user (after reviewer scope + search), used
@@ -241,27 +255,28 @@ export function buildInboxViewedProperties(
241255
}
242256

243257
const statusFiltered =
244-
filters.statusFilter !== undefined &&
245-
filters.defaultStatusFilter !== undefined &&
258+
filters.surface === "mobile" &&
246259
(filters.statusFilter.length !== filters.defaultStatusFilter.length ||
247260
filters.statusFilter.some(
248-
(status) => !filters.defaultStatusFilter?.includes(status),
261+
(status) => !filters.defaultStatusFilter.includes(status),
249262
));
250263
const hasActiveFilters =
251264
filters.sourceProductFilter.length > 0 ||
252265
filters.priorityFilter.length > 0 ||
253-
(filters.searchQuery?.trim().length ?? 0) > 0 ||
266+
(filters.surface === "desktop" && filters.searchQuery.trim().length > 0) ||
254267
statusFiltered ||
255-
(filters.suggestedReviewerFilter?.length ?? 0) > 0 ||
256-
filters.isDefaultScope === false;
268+
(filters.surface === "mobile" &&
269+
filters.suggestedReviewerFilter.length > 0) ||
270+
(filters.surface === "desktop" && !filters.isDefaultScope);
257271

258272
return {
259273
report_count: visibleReports.length,
260274
total_count: totalCount,
261275
ready_count: readyCount,
262276
has_active_filters: hasActiveFilters,
263277
source_product_filter: filters.sourceProductFilter,
264-
status_filter_count: filters.statusFilter?.length ?? 0,
278+
status_filter_count:
279+
filters.surface === "mobile" ? filters.statusFilter.length : 0,
265280
is_empty: totalCount === 0,
266281
priority_p0_count: priorityCounts.P0,
267282
priority_p1_count: priorityCounts.P1,

packages/core/src/inbox/reportMembership.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,6 @@ export function isRestorableReport(
4141
return report.status === "suppressed";
4242
}
4343

44-
export function getImmediatelyActionableReports(
45-
reports: SignalReport[],
46-
): SignalReport[] {
47-
return reports.filter(
48-
(report) =>
49-
report.status === "ready" &&
50-
report.actionability === "immediately_actionable" &&
51-
!report.already_addressed,
52-
);
53-
}
54-
5544
export type InboxScope = "for-you" | "entire-project" | `teammate:${string}`;
5645

5746
export const INBOX_SCOPE_FOR_YOU: InboxScope = "for-you";

packages/ui/src/features/inbox/hooks/useTrackInboxViewed.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export function useTrackInboxViewed(): void {
4141
totalCount,
4242
tabCounts: counts,
4343
filters: {
44+
surface: "desktop",
4445
sourceProductFilter,
4546
priorityFilter,
4647
searchQuery,

0 commit comments

Comments
 (0)