Skip to content

Commit d0273f4

Browse files
authored
fix(code): Do not show empty Inbox to users no GitHub social integration (#2371)
1 parent e021fb7 commit d0273f4

3 files changed

Lines changed: 94 additions & 9 deletions

File tree

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
useInboxReportsInfinite,
2020
useInboxSignalProcessingState,
2121
} from "@features/inbox/hooks/useInboxReports";
22+
import { useSeedSuggestedReviewerFilter } from "@features/inbox/hooks/useSeedSuggestedReviewerFilter";
2223
import { useSignalSourceConfigs } from "@features/inbox/hooks/useSignalSourceConfigs";
2324
import { useInboxReportSelectionStore } from "@features/inbox/stores/inboxReportSelectionStore";
2425
import { useInboxSignalsFilterStore } from "@features/inbox/stores/inboxSignalsFilterStore";
@@ -36,6 +37,7 @@ import { setPendingInboxOpenMethod } from "@features/inbox/utils/pendingInboxOpe
3637
import { DiscoveredTaskDetailPane } from "@features/setup/components/DiscoveredTaskDetailPane";
3738
import { RecommendedSetupTasks } from "@features/setup/components/RecommendedSetupTasks";
3839
import { useSetupStore } from "@features/setup/stores/setupStore";
40+
import { useAuthenticatedQuery } from "@hooks/useAuthenticatedQuery";
3941
import {
4042
useIntegrations,
4143
useRepositoryIntegration,
@@ -72,21 +74,22 @@ export function InboxSignalsTab() {
7274
const suggestedReviewerFilter = useInboxSignalsFilterStore(
7375
(s) => s.suggestedReviewerFilter,
7476
);
75-
const seedSuggestedReviewerFilterWithCurrentUser = useInboxSignalsFilterStore(
76-
(s) => s.seedSuggestedReviewerFilterWithCurrentUser,
77-
);
78-
7977
// ── Current user (seeds reviewer filter on first inbox visit) ───────────
8078
const authClient = useOptionalAuthenticatedClient();
8179
const { data: currentUser } = useCurrentUser({
8280
client: authClient,
8381
enabled: !!authClient,
8482
});
85-
86-
useEffect(() => {
87-
if (!currentUser?.uuid) return;
88-
seedSuggestedReviewerFilterWithCurrentUser(currentUser.uuid);
89-
}, [currentUser?.uuid, seedSuggestedReviewerFilterWithCurrentUser]);
83+
// Gates the seed below: backend filters reports by GitHub login, not UUID.
84+
const { data: githubLogin } = useAuthenticatedQuery(
85+
["github_login"],
86+
(client) => client.getGithubLogin(),
87+
{ staleTime: 5 * 60 * 1000 },
88+
);
89+
useSeedSuggestedReviewerFilter({
90+
currentUserUuid: currentUser?.uuid,
91+
githubLogin,
92+
});
9093

9194
// ── GitHub integration ───────────────────────────────────────────────
9295
const { hasGithubIntegration } = useRepositoryIntegration();
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { useInboxSignalsFilterStore } from "@features/inbox/stores/inboxSignalsFilterStore";
2+
import { renderHook } from "@testing-library/react";
3+
import { beforeEach, describe, expect, it } from "vitest";
4+
import { useSeedSuggestedReviewerFilter } from "./useSeedSuggestedReviewerFilter";
5+
6+
describe("useSeedSuggestedReviewerFilter", () => {
7+
beforeEach(() => {
8+
localStorage.clear();
9+
useInboxSignalsFilterStore.setState({
10+
suggestedReviewerFilter: [],
11+
hasInitializedSuggestedReviewerFilter: false,
12+
});
13+
});
14+
15+
it("skips seeding when the user has no GitHub login", () => {
16+
renderHook(() =>
17+
useSeedSuggestedReviewerFilter({
18+
currentUserUuid: "user-uuid",
19+
githubLogin: null,
20+
}),
21+
);
22+
const state = useInboxSignalsFilterStore.getState();
23+
expect(state.suggestedReviewerFilter).toEqual([]);
24+
// Init flag stays false so a later visit can retry once GitHub is connected.
25+
expect(state.hasInitializedSuggestedReviewerFilter).toBe(false);
26+
});
27+
28+
it("seeds with the current user when both UUID and GitHub login are present", () => {
29+
renderHook(() =>
30+
useSeedSuggestedReviewerFilter({
31+
currentUserUuid: "user-uuid",
32+
githubLogin: "octocat",
33+
}),
34+
);
35+
const state = useInboxSignalsFilterStore.getState();
36+
expect(state.suggestedReviewerFilter).toEqual(["user-uuid"]);
37+
expect(state.hasInitializedSuggestedReviewerFilter).toBe(true);
38+
});
39+
40+
it("seeds on a later render once the GitHub login resolves", () => {
41+
const { rerender } = renderHook(
42+
({ githubLogin }: { githubLogin: string | null }) =>
43+
useSeedSuggestedReviewerFilter({
44+
currentUserUuid: "user-uuid",
45+
githubLogin,
46+
}),
47+
{ initialProps: { githubLogin: null as string | null } },
48+
);
49+
expect(
50+
useInboxSignalsFilterStore.getState().suggestedReviewerFilter,
51+
).toEqual([]);
52+
53+
rerender({ githubLogin: "octocat" });
54+
const state = useInboxSignalsFilterStore.getState();
55+
expect(state.suggestedReviewerFilter).toEqual(["user-uuid"]);
56+
expect(state.hasInitializedSuggestedReviewerFilter).toBe(true);
57+
});
58+
});
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { useInboxSignalsFilterStore } from "@features/inbox/stores/inboxSignalsFilterStore";
2+
import { useEffect } from "react";
3+
4+
/**
5+
* Seeds the inbox suggested-reviewer filter with the current user on first
6+
* visit. Skips when no GitHub login is available — the backend resolves the
7+
* UUID through it, so the filter would return 0 reports. Skipping leaves the
8+
* init flag false so we try again once the user connects GitHub.
9+
*/
10+
export function useSeedSuggestedReviewerFilter({
11+
currentUserUuid,
12+
githubLogin,
13+
}: {
14+
currentUserUuid: string | null | undefined;
15+
githubLogin: string | null | undefined;
16+
}) {
17+
const seed = useInboxSignalsFilterStore(
18+
(s) => s.seedSuggestedReviewerFilterWithCurrentUser,
19+
);
20+
useEffect(() => {
21+
if (!currentUserUuid || !githubLogin) return;
22+
seed(currentUserUuid);
23+
}, [currentUserUuid, githubLogin, seed]);
24+
}

0 commit comments

Comments
 (0)