Skip to content

Commit f0dd45c

Browse files
committed
refactor(inbox): move reviewer-seed policy into the store
Collapse the two-step "set filter, then mark initialized" dance into a single store action that owns the idempotency check. The component effect becomes a trivial bridge from `useCurrentUser` to the store. Adds tests covering the seed, the no-op-after-init, and the preserve-existing-choice cases. Generated-By: PostHog Code Task-Id: 9fcb5fbc-ec76-4b37-a0bc-dc4556c0d8a6
1 parent 44c13a4 commit f0dd45c

3 files changed

Lines changed: 61 additions & 23 deletions

File tree

apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,8 @@ export function InboxSignalsTab() {
6868
const suggestedReviewerFilter = useInboxSignalsFilterStore(
6969
(s) => s.suggestedReviewerFilter,
7070
);
71-
const hasInitializedSuggestedReviewerFilter = useInboxSignalsFilterStore(
72-
(s) => s.hasInitializedSuggestedReviewerFilter,
73-
);
74-
const setSuggestedReviewerFilter = useInboxSignalsFilterStore(
75-
(s) => s.setSuggestedReviewerFilter,
76-
);
77-
const markSuggestedReviewerFilterInitialized = useInboxSignalsFilterStore(
78-
(s) => s.markSuggestedReviewerFilterInitialized,
71+
const seedSuggestedReviewerFilterWithCurrentUser = useInboxSignalsFilterStore(
72+
(s) => s.seedSuggestedReviewerFilterWithCurrentUser,
7973
);
8074

8175
// ── Current user (seeds reviewer filter on first inbox visit) ───────────
@@ -86,19 +80,9 @@ export function InboxSignalsTab() {
8680
});
8781

8882
useEffect(() => {
89-
if (hasInitializedSuggestedReviewerFilter) return;
9083
if (!currentUser?.uuid) return;
91-
if (suggestedReviewerFilter.length === 0) {
92-
setSuggestedReviewerFilter([currentUser.uuid]);
93-
}
94-
markSuggestedReviewerFilterInitialized();
95-
}, [
96-
hasInitializedSuggestedReviewerFilter,
97-
currentUser?.uuid,
98-
suggestedReviewerFilter.length,
99-
setSuggestedReviewerFilter,
100-
markSuggestedReviewerFilterInitialized,
101-
]);
84+
seedSuggestedReviewerFilterWithCurrentUser(currentUser.uuid);
85+
}, [currentUser?.uuid, seedSuggestedReviewerFilterWithCurrentUser]);
10286

10387
// ── GitHub integration ───────────────────────────────────────────────
10488
const { hasGithubIntegration } = useRepositoryIntegration();

apps/code/src/renderer/features/inbox/stores/inboxSignalsFilterStore.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ describe("inboxSignalsFilterStore", () => {
1818
],
1919
sourceProductFilter: [],
2020
suggestedReviewerFilter: [],
21+
hasInitializedSuggestedReviewerFilter: false,
2122
});
2223
});
2324

@@ -129,6 +130,45 @@ describe("inboxSignalsFilterStore", () => {
129130
expect(state.suggestedReviewerFilter).toEqual([]);
130131
});
131132

133+
it("seedSuggestedReviewerFilterWithCurrentUser seeds when empty and uninitialized", () => {
134+
useInboxSignalsFilterStore
135+
.getState()
136+
.seedSuggestedReviewerFilterWithCurrentUser("me-uuid");
137+
138+
const state = useInboxSignalsFilterStore.getState();
139+
expect(state.suggestedReviewerFilter).toEqual(["me-uuid"]);
140+
expect(state.hasInitializedSuggestedReviewerFilter).toBe(true);
141+
});
142+
143+
it("seedSuggestedReviewerFilterWithCurrentUser is a no-op once initialized", () => {
144+
useInboxSignalsFilterStore
145+
.getState()
146+
.seedSuggestedReviewerFilterWithCurrentUser("me-uuid");
147+
useInboxSignalsFilterStore.getState().setSuggestedReviewerFilter([]);
148+
149+
useInboxSignalsFilterStore
150+
.getState()
151+
.seedSuggestedReviewerFilterWithCurrentUser("me-uuid");
152+
153+
expect(
154+
useInboxSignalsFilterStore.getState().suggestedReviewerFilter,
155+
).toEqual([]);
156+
});
157+
158+
it("seedSuggestedReviewerFilterWithCurrentUser preserves an existing non-empty filter", () => {
159+
useInboxSignalsFilterStore
160+
.getState()
161+
.setSuggestedReviewerFilter(["someone-else"]);
162+
163+
useInboxSignalsFilterStore
164+
.getState()
165+
.seedSuggestedReviewerFilterWithCurrentUser("me-uuid");
166+
167+
const state = useInboxSignalsFilterStore.getState();
168+
expect(state.suggestedReviewerFilter).toEqual(["someone-else"]);
169+
expect(state.hasInitializedSuggestedReviewerFilter).toBe(true);
170+
});
171+
132172
it("resetFilters preserves sort preferences", () => {
133173
useInboxSignalsFilterStore.getState().setSort("created_at", "asc");
134174

apps/code/src/renderer/features/inbox/stores/inboxSignalsFilterStore.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ interface InboxSignalsFilterActions {
5151
toggleSourceProduct: (source: SourceProduct) => void;
5252
toggleSuggestedReviewer: (reviewerUuid: string) => void;
5353
setSuggestedReviewerFilter: (reviewerUuids: string[]) => void;
54-
markSuggestedReviewerFilterInitialized: () => void;
54+
/**
55+
* Seed the reviewer filter with the current user on first inbox visit.
56+
* No-op if already initialized, or if the user has actively chosen reviewers.
57+
* Always flips the initialized flag so we don't override later user choices.
58+
*/
59+
seedSuggestedReviewerFilterWithCurrentUser: (currentUserUuid: string) => void;
5560
/** Reset all filters when a deep link arrives so the linked report isn't hidden. */
5661
resetFilters: () => void;
5762
}
@@ -100,8 +105,17 @@ export const useInboxSignalsFilterStore = create<InboxSignalsFilterStore>()(
100105
set({
101106
suggestedReviewerFilter: Array.from(new Set(reviewerUuids)),
102107
}),
103-
markSuggestedReviewerFilterInitialized: () =>
104-
set({ hasInitializedSuggestedReviewerFilter: true }),
108+
seedSuggestedReviewerFilterWithCurrentUser: (currentUserUuid) =>
109+
set((state) => {
110+
if (state.hasInitializedSuggestedReviewerFilter) return {};
111+
return {
112+
hasInitializedSuggestedReviewerFilter: true,
113+
suggestedReviewerFilter:
114+
state.suggestedReviewerFilter.length === 0
115+
? [currentUserUuid]
116+
: state.suggestedReviewerFilter,
117+
};
118+
}),
105119
resetFilters: () =>
106120
set({
107121
searchQuery: "",

0 commit comments

Comments
 (0)