renders correctly 1`] = `
+exports[`renderer/routes/github/LoginWithPersonalAccessToken.tsx > renders correctly 1`] = `
{
expect(giteaAdapter.loginMethods).toHaveLength(1);
expect(giteaAdapter.loginMethods[0]).toMatchObject({
testId: 'login-gitea-pat',
- route: '/login-personal-access-token',
- state: { forge: 'gitea' },
+ route: '/login/gitea/personal-access-token',
+ authMethod: 'Personal Access Token',
});
});
@@ -189,4 +190,28 @@ describe('renderer/utils/forges/gitea/adapter.ts', () => {
);
});
});
+
+ describe('getDisplayHelpers', () => {
+ it('returns icon/color/url helpers via the shared subject-type handlers', () => {
+ const notification = mockPartialGitifyNotification(
+ {
+ title: 'Gitea issue',
+ type: 'Issue',
+ state: 'OPEN',
+ },
+ {
+ htmlUrl: 'https://gitea.example.com/org/repo' as Link,
+ },
+ );
+ notification.account = mockGiteaAccount;
+
+ const helpers = giteaAdapter.getDisplayHelpers(notification);
+
+ expect(helpers.iconType).toBeDefined();
+ expect(helpers.iconColor).toBeDefined();
+ // Issue handler appends /issues to the repository URL when no subject URL exists.
+ expect(helpers.defaultUrl).toBe('https://gitea.example.com/org/repo/issues');
+ expect(helpers.defaultUserType).toBe('User');
+ });
+ });
});
diff --git a/src/renderer/utils/forges/gitea/adapter.ts b/src/renderer/utils/forges/gitea/adapter.ts
index f29dfc2d2..47837f1d6 100644
--- a/src/renderer/utils/forges/gitea/adapter.ts
+++ b/src/renderer/utils/forges/gitea/adapter.ts
@@ -113,8 +113,8 @@ export const giteaAdapter: ForgeAdapter = {
testId: 'login-gitea-pat',
icon: KeyIcon,
label: 'Personal Access Token',
- route: '/login-personal-access-token',
- state: { forge: 'gitea' },
+ route: '/login/gitea/personal-access-token',
+ authMethod: 'Personal Access Token',
},
],
diff --git a/src/renderer/utils/forges/github/adapter.ts b/src/renderer/utils/forges/github/adapter.ts
index 641bc5ba7..0521c6c84 100644
--- a/src/renderer/utils/forges/github/adapter.ts
+++ b/src/renderer/utils/forges/github/adapter.ts
@@ -115,21 +115,22 @@ export const githubAdapter: ForgeAdapter = {
icon: MarkGithubIcon,
label: 'GitHub',
variant: 'primary',
- route: '/login-device-flow',
- state: { forge: 'github' },
+ route: '/login/github/device-flow',
+ authMethod: 'GitHub App',
},
{
testId: 'login-pat',
icon: KeyIcon,
label: 'Personal Access Token',
- route: '/login-personal-access-token',
+ route: '/login/github/personal-access-token',
+ authMethod: 'Personal Access Token',
},
{
testId: 'login-oauth-app',
icon: PersonIcon,
label: 'OAuth App',
- route: '/login-oauth-app',
- state: { forge: 'github' },
+ route: '/login/github/oauth-app',
+ authMethod: 'OAuth App',
},
],
diff --git a/src/renderer/utils/forges/types.ts b/src/renderer/utils/forges/types.ts
index 892ab7deb..f433bffbd 100644
--- a/src/renderer/utils/forges/types.ts
+++ b/src/renderer/utils/forges/types.ts
@@ -54,15 +54,6 @@ export interface RefreshAccountData {
scopes?: string[];
}
-/**
- * Router state forwarded from a login method descriptor into the
- * destination route. Currently used to pre-select the forge when entering
- * the personal-access-token form.
- */
-export interface LoginRouteState {
- forge?: Forge;
-}
-
/**
* Forge-agnostic display surface for a single notification. The adapter
* computes these on demand for shared code (`formatters.ts`, `url.ts`) so
@@ -83,10 +74,13 @@ export interface LoginMethodDescriptor {
icon: FC;
label: string;
variant?: 'primary' | 'default';
- /** Route to navigate to. */
+ /** Forge-specific route to navigate to (e.g. `/login/github/device-flow`). */
route: string;
- /** Optional router state to pass with navigation. */
- state?: LoginRouteState;
+ /**
+ * Auth method recorded on accounts created via this login method. Used to
+ * route re-authentication back to the matching login route.
+ */
+ authMethod: AuthMethod;
}
/**
@@ -187,7 +181,7 @@ export interface ForgeAdapter {
// Optional because not every forge supports every flow. Gitea today is
// PAT-only and omits both bundles. The orchestrator gates UI on the
// presence of these bundles (and on `loginMethods` entries pointing at
- // `/login-device-flow` or `/login-oauth-app`).
+ // the forge's device-flow or OAuth-app routes).
/**
* OAuth device-flow capability. Forges without device-flow support (e.g.