Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
useInboxReportsInfinite,
useInboxSignalProcessingState,
} from "@features/inbox/hooks/useInboxReports";
import { useSeedSuggestedReviewerFilter } from "@features/inbox/hooks/useSeedSuggestedReviewerFilter";
import { useSignalSourceConfigs } from "@features/inbox/hooks/useSignalSourceConfigs";
import { useInboxReportSelectionStore } from "@features/inbox/stores/inboxReportSelectionStore";
import { useInboxSignalsFilterStore } from "@features/inbox/stores/inboxSignalsFilterStore";
Expand All @@ -36,6 +37,7 @@ import { setPendingInboxOpenMethod } from "@features/inbox/utils/pendingInboxOpe
import { DiscoveredTaskDetailPane } from "@features/setup/components/DiscoveredTaskDetailPane";
import { RecommendedSetupTasks } from "@features/setup/components/RecommendedSetupTasks";
import { useSetupStore } from "@features/setup/stores/setupStore";
import { useAuthenticatedQuery } from "@hooks/useAuthenticatedQuery";
import {
useIntegrations,
useRepositoryIntegration,
Expand Down Expand Up @@ -72,21 +74,22 @@ export function InboxSignalsTab() {
const suggestedReviewerFilter = useInboxSignalsFilterStore(
(s) => s.suggestedReviewerFilter,
);
const seedSuggestedReviewerFilterWithCurrentUser = useInboxSignalsFilterStore(
(s) => s.seedSuggestedReviewerFilterWithCurrentUser,
);

// ── Current user (seeds reviewer filter on first inbox visit) ───────────
const authClient = useOptionalAuthenticatedClient();
const { data: currentUser } = useCurrentUser({
client: authClient,
enabled: !!authClient,
});

useEffect(() => {
if (!currentUser?.uuid) return;
seedSuggestedReviewerFilterWithCurrentUser(currentUser.uuid);
}, [currentUser?.uuid, seedSuggestedReviewerFilterWithCurrentUser]);
// Gates the seed below: backend filters reports by GitHub login, not UUID.
const { data: githubLogin } = useAuthenticatedQuery(
["github_login"],
(client) => client.getGithubLogin(),
{ staleTime: 5 * 60 * 1000 },
);
useSeedSuggestedReviewerFilter({
currentUserUuid: currentUser?.uuid,
githubLogin,
});

// ── GitHub integration ───────────────────────────────────────────────
const { hasGithubIntegration } = useRepositoryIntegration();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { useInboxSignalsFilterStore } from "@features/inbox/stores/inboxSignalsFilterStore";
import { renderHook } from "@testing-library/react";
import { beforeEach, describe, expect, it } from "vitest";
import { useSeedSuggestedReviewerFilter } from "./useSeedSuggestedReviewerFilter";

describe("useSeedSuggestedReviewerFilter", () => {
beforeEach(() => {
localStorage.clear();
useInboxSignalsFilterStore.setState({
suggestedReviewerFilter: [],
hasInitializedSuggestedReviewerFilter: false,
});
});

it("skips seeding when the user has no GitHub login", () => {
renderHook(() =>
useSeedSuggestedReviewerFilter({
currentUserUuid: "user-uuid",
githubLogin: null,
}),
);
const state = useInboxSignalsFilterStore.getState();
expect(state.suggestedReviewerFilter).toEqual([]);
// Init flag stays false so a later visit can retry once GitHub is connected.
expect(state.hasInitializedSuggestedReviewerFilter).toBe(false);
});

it("seeds with the current user when both UUID and GitHub login are present", () => {
renderHook(() =>
useSeedSuggestedReviewerFilter({
currentUserUuid: "user-uuid",
githubLogin: "octocat",
}),
);
const state = useInboxSignalsFilterStore.getState();
expect(state.suggestedReviewerFilter).toEqual(["user-uuid"]);
expect(state.hasInitializedSuggestedReviewerFilter).toBe(true);
});
Comment thread
sortafreel marked this conversation as resolved.

it("seeds on a later render once the GitHub login resolves", () => {
const { rerender } = renderHook(
({ githubLogin }: { githubLogin: string | null }) =>
useSeedSuggestedReviewerFilter({
currentUserUuid: "user-uuid",
githubLogin,
}),
{ initialProps: { githubLogin: null as string | null } },
);
expect(
useInboxSignalsFilterStore.getState().suggestedReviewerFilter,
).toEqual([]);

rerender({ githubLogin: "octocat" });
const state = useInboxSignalsFilterStore.getState();
expect(state.suggestedReviewerFilter).toEqual(["user-uuid"]);
expect(state.hasInitializedSuggestedReviewerFilter).toBe(true);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { useInboxSignalsFilterStore } from "@features/inbox/stores/inboxSignalsFilterStore";
import { useEffect } from "react";

/**
* Seeds the inbox suggested-reviewer filter with the current user on first
* visit. Skips when no GitHub login is available — the backend resolves the
* UUID through it, so the filter would return 0 reports. Skipping leaves the
* init flag false so we try again once the user connects GitHub.
*/
export function useSeedSuggestedReviewerFilter({
currentUserUuid,
githubLogin,
}: {
currentUserUuid: string | null | undefined;
githubLogin: string | null | undefined;
}) {
const seed = useInboxSignalsFilterStore(
(s) => s.seedSuggestedReviewerFilterWithCurrentUser,
);
useEffect(() => {
if (!currentUserUuid || !githubLogin) return;
seed(currentUserUuid);
}, [currentUserUuid, githubLogin, seed]);
}
Loading