feat(FN-5098): complete Step 5 — add settings link to secrets view

Fusion-Task-Id: FN-5098
Fusion-Task-Lineage: 67ff982f-f0fa-453a-9b73-32ddc3ae5b3a
This commit is contained in:
Fusion (runfusion.ai)
2026-05-19 01:47:29 -07:00
committed by gsxdsm
parent 71619bf5e6
commit da2d3632ab
4 changed files with 30 additions and 0 deletions

View File

@@ -1942,6 +1942,10 @@ function AppInner() {
onSettingsClose={handleSettingsClose}
onReopenOnboarding={reopenOnboardingWithNav}
onOpenApprovals={(_approvalId) => handleTaskViewChange("mailbox")}
onNavigateToSecrets={() => {
modalManager.closeSettings();
handleChangeTaskView("secrets");
}}
/>
<AuthTokenRecoveryDialog open={authTokenRecoveryOpen} />
{shellApi && (

View File

@@ -79,6 +79,8 @@ interface AppModalsProps {
onReopenOnboarding?: () => void;
/** Optional callback to open mailbox approvals from Settings. */
onOpenApprovals?: (approvalId?: string) => void;
/** Optional callback to navigate from Settings to Secrets view. */
onNavigateToSecrets?: () => void;
}
export function AppModals({
@@ -98,6 +100,7 @@ export function AppModals({
onSettingsClose,
onReopenOnboarding,
onOpenApprovals,
onNavigateToSecrets,
}: AppModalsProps) {
const [firstCreatedTask, setFirstCreatedTask] = useState<Task | null>(null);
const detailTask = modalManager.detailTask
@@ -200,6 +203,7 @@ export function AppModals({
onDashboardFontScaleChange={settings.setDashboardFontScalePct}
onReopenOnboarding={onReopenOnboarding}
onOpenApprovals={onOpenApprovals}
onNavigateToSecrets={onNavigateToSecrets}
/>
</Suspense>
</ModalErrorBoundary>

View File

@@ -393,6 +393,8 @@ interface SettingsModalProps {
onReopenOnboarding?: () => void;
/** Optional callback to open approvals/mailbox view. */
onOpenApprovals?: (approvalId?: string) => void;
/** Optional callback to navigate from settings to Secrets view. */
onNavigateToSecrets?: () => void;
}
export function SettingsModal({
@@ -408,6 +410,7 @@ export function SettingsModal({
onDashboardFontScaleChange,
onReopenOnboarding,
onOpenApprovals,
onNavigateToSecrets,
}: SettingsModalProps) {
const { confirm } = useConfirm();
const worktrunkInstall = useWorktrunkInstallStatus(projectId);
@@ -7219,6 +7222,16 @@ export function SettingsModal({
)}
<div className="modal-actions">
<div className="modal-actions-left">
<a
href="?view=secrets"
className="settings-inline-link"
onClick={(event) => {
event.preventDefault();
onNavigateToSecrets?.();
}}
>
Manage secrets
</a>
<button
type="button"
className="btn btn-sm"

View File

@@ -347,6 +347,15 @@ describe("SettingsModal", () => {
expect(await screen.findByTestId("pi-extensions-manager")).toBeInTheDocument();
});
it("fires onNavigateToSecrets when Manage secrets is clicked", async () => {
const onNavigateToSecrets = vi.fn();
renderModal({ onNavigateToSecrets });
await waitForSettingsModalReady();
await userEvent.click(screen.getByRole("link", { name: "Manage secrets" }));
expect(onNavigateToSecrets).toHaveBeenCalledTimes(1);
});
it("shows direct merge commit routing only for direct merges", async () => {
renderModal();
await waitForSettingsModalReady();