refactor(dashboard): extract providerCredentialText from providerPageHelpers to respect the file-size gate

providerPageHelpers.ts is a frozen god-file (cap 1053, split(\n).length metric)
and this PR's own +3 lines (the #1904 supportsVision field) pushed it to 1054,
failing check:file-size. Extract the cohesive providerText utility + the 4
web-session-credential label/hint/title helpers into a new leaf module
(providerCredentialText.ts), re-exported from providerPageHelpers.ts for
backward compatibility so all existing import sites keep working unchanged.
File now sits at 946 lines, well under the frozen cap.
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-07-14 21:45:46 -03:00
parent 6741291fd7
commit b259db245c
2 changed files with 154 additions and 130 deletions

View File

@@ -0,0 +1,132 @@
// Pure, shared helpers for provider credential copy (labels/hints/titles for
// the API-key and web-session-credential modals). Extracted out of
// providerPageHelpers.ts (Issue #3501 strangler-fig decomposition) — that leaf
// is frozen at its file-size cap, so this cohesive slice (message-translation
// utility + the 4 web-session-credential text builders) lives here instead and
// is re-exported from providerPageHelpers.ts for backward compatibility. Leaf
// module — imports only from @/shared, @/lib and colocated sibling modules.
import { type WebSessionCredentialRequirement } from "./webSessionCredentials";
export type ProviderMessageTranslator = ((
key: string,
values?: Record<string, unknown>
) => string) & {
has?: (key: string) => boolean;
};
export function providerText(
t: ProviderMessageTranslator,
key: string,
fallback: string,
values?: Record<string, unknown>
): string {
if (typeof t.has === "function" && t.has(key)) {
return t(key, values);
}
if (values) {
return Object.entries(values).reduce(
(acc, [name, value]) => acc.replaceAll(`{${name}}`, String(value)),
fallback
);
}
return fallback;
}
export function getWebSessionCredentialLabel(
t: ProviderMessageTranslator,
requirement: WebSessionCredentialRequirement,
optional: boolean
): string {
if (requirement.kind === "none") {
return providerText(t, "webNoAuthCredentialLabel", "No credential required");
}
const baseLabel =
requirement.kind === "token"
? providerText(t, "webTokenCredentialLabel", "Web session token")
: t("sessionCookieLabel");
return optional ? `${baseLabel} (${t("optional").toLowerCase()})` : baseLabel;
}
export function getWebSessionCredentialHint(
t: ProviderMessageTranslator,
requirement: WebSessionCredentialRequirement,
providerName: string,
editing: boolean
): string | undefined {
if (requirement.kind === "none") return undefined;
const values = { provider: providerName, credential: requirement.credentialName };
if (editing) {
return requirement.kind === "token"
? providerText(
t,
"webTokenEditHint",
"Leave blank to keep the current web session token. Credential: {credential}.",
values
)
: providerText(
t,
"webCookieEditHint",
"Leave blank to keep the current session cookie. Required cookie: {credential}.",
values
);
}
// #5465 — a provider-specific hint (e.g. t3.chat's step-by-step DevTools copy)
// replaces the generic one-line cookie/token template when that template is
// unclear for the provider (t3.chat needs a localStorage value AND the Cookie
// header, so "Required cookie: convex-session-id + Cookie header…" reads
// circular). The override key ships translated in every locale.
if (requirement.hintKey) {
return providerText(
t,
requirement.hintKey,
requirement.hintFallback ??
"Open the provider's web session in DevTools, copy the required credential(s), and paste them in the fields below.",
values
);
}
return requirement.kind === "token"
? providerText(
t,
"webTokenCredentialHint",
"Credential: {credential}. Paste the token value from your own signed-in {provider} web session, or a DevTools HAR export if the provider supports it.",
values
)
: providerText(
t,
"webCookieCredentialHint",
"Required cookie: {credential}. Paste the Cookie header value from your own signed-in {provider} web session. Do not include the Cookie: prefix.",
values
);
}
export function getWebSessionCredentialCheckLabel(
t: ProviderMessageTranslator,
requirement: WebSessionCredentialRequirement
): string {
if (requirement.kind === "token") return providerText(t, "checkWebToken", "Check token");
return providerText(t, "checkCookie", "Check cookie");
}
export function getAddCredentialModalTitle(
t: ProviderMessageTranslator,
providerName: string,
requirement: WebSessionCredentialRequirement | null
): string {
if (!requirement) return t("addProviderApiKeyTitle", { provider: providerName });
if (requirement.kind === "none") {
return providerText(t, "addProviderConnectionTitle", "Add {provider} connection", {
provider: providerName,
});
}
if (requirement.kind === "token") {
return providerText(t, "addProviderWebTokenTitle", "Add {provider} web token", {
provider: providerName,
});
}
return providerText(t, "addProviderSessionCookieTitle", "Add {provider} session cookie", {
provider: providerName,
});
}

View File

@@ -16,20 +16,32 @@ import {
type CodexServiceTier,
} from "@/lib/providers/requestDefaults";
import { type CodexGlobalServiceMode } from "@/lib/providers/codexFastTier";
import { type WebSessionCredentialRequirement } from "./webSessionCredentials";
import { CC_COMPATIBLE_DEFAULT_CHAT_PATH } from "./providerDetailConstants";
import {
type ProviderMessageTranslator,
providerText,
getWebSessionCredentialLabel,
getWebSessionCredentialHint,
getWebSessionCredentialCheckLabel,
getAddCredentialModalTitle,
} from "./providerCredentialText";
// Re-exported for backward compatibility — these used to be defined here
// (Issue #3501 strangler-fig home), but were extracted to providerCredentialText.ts
// once this leaf hit its frozen file-size cap (#1904 own growth).
export {
type ProviderMessageTranslator,
providerText,
getWebSessionCredentialLabel,
getWebSessionCredentialHint,
getWebSessionCredentialCheckLabel,
getAddCredentialModalTitle,
};
// ---------------------------------------------------------------------------
// Types shared between page + modals
// ---------------------------------------------------------------------------
export type ProviderMessageTranslator = ((
key: string,
values?: Record<string, unknown>
) => string) & {
has?: (key: string) => boolean;
};
export type LocalProviderMetadata = {
name?: string;
localDefault?: string;
@@ -101,28 +113,6 @@ export function targetFormatBadgeI18nKey(value: string): string | null {
return TARGET_FORMAT_BADGE_I18N_KEYS[value] ?? null;
}
// ---------------------------------------------------------------------------
// Utility — message translation with fallback
// ---------------------------------------------------------------------------
export function providerText(
t: ProviderMessageTranslator,
key: string,
fallback: string,
values?: Record<string, unknown>
): string {
if (typeof t.has === "function" && t.has(key)) {
return t(key, values);
}
if (values) {
return Object.entries(values).reduce(
(acc, [name, value]) => acc.replaceAll(`{${name}}`, String(value)),
fallback
);
}
return fallback;
}
/** #5442 — badge for add-credential validation; unsupported → neutral N/A (not red Invalid). */
export function validationBadgeProps(result: string): {
variant: "success" | "error" | "info";
@@ -388,108 +378,10 @@ export function formatExcludedModelsInput(value: unknown): string {
}
// ---------------------------------------------------------------------------
// Web-session credential label / hint helpers (Phase 2b)
// Web-session credential label / hint helpers (Phase 2b) — moved to
// providerCredentialText.ts (#1904 own growth); re-exported above.
// ---------------------------------------------------------------------------
export function getWebSessionCredentialLabel(
t: ProviderMessageTranslator,
requirement: WebSessionCredentialRequirement,
optional: boolean
): string {
if (requirement.kind === "none") {
return providerText(t, "webNoAuthCredentialLabel", "No credential required");
}
const baseLabel =
requirement.kind === "token"
? providerText(t, "webTokenCredentialLabel", "Web session token")
: t("sessionCookieLabel");
return optional ? `${baseLabel} (${t("optional").toLowerCase()})` : baseLabel;
}
export function getWebSessionCredentialHint(
t: ProviderMessageTranslator,
requirement: WebSessionCredentialRequirement,
providerName: string,
editing: boolean
): string | undefined {
if (requirement.kind === "none") return undefined;
const values = { provider: providerName, credential: requirement.credentialName };
if (editing) {
return requirement.kind === "token"
? providerText(
t,
"webTokenEditHint",
"Leave blank to keep the current web session token. Credential: {credential}.",
values
)
: providerText(
t,
"webCookieEditHint",
"Leave blank to keep the current session cookie. Required cookie: {credential}.",
values
);
}
// #5465 — a provider-specific hint (e.g. t3.chat's step-by-step DevTools copy)
// replaces the generic one-line cookie/token template when that template is
// unclear for the provider (t3.chat needs a localStorage value AND the Cookie
// header, so "Required cookie: convex-session-id + Cookie header…" reads
// circular). The override key ships translated in every locale.
if (requirement.hintKey) {
return providerText(
t,
requirement.hintKey,
requirement.hintFallback ??
"Open the provider's web session in DevTools, copy the required credential(s), and paste them in the fields below.",
values
);
}
return requirement.kind === "token"
? providerText(
t,
"webTokenCredentialHint",
"Credential: {credential}. Paste the token value from your own signed-in {provider} web session, or a DevTools HAR export if the provider supports it.",
values
)
: providerText(
t,
"webCookieCredentialHint",
"Required cookie: {credential}. Paste the Cookie header value from your own signed-in {provider} web session. Do not include the Cookie: prefix.",
values
);
}
export function getWebSessionCredentialCheckLabel(
t: ProviderMessageTranslator,
requirement: WebSessionCredentialRequirement
): string {
if (requirement.kind === "token") return providerText(t, "checkWebToken", "Check token");
return providerText(t, "checkCookie", "Check cookie");
}
export function getAddCredentialModalTitle(
t: ProviderMessageTranslator,
providerName: string,
requirement: WebSessionCredentialRequirement | null
): string {
if (!requirement) return t("addProviderApiKeyTitle", { provider: providerName });
if (requirement.kind === "none") {
return providerText(t, "addProviderConnectionTitle", "Add {provider} connection", {
provider: providerName,
});
}
if (requirement.kind === "token") {
return providerText(t, "addProviderWebTokenTitle", "Add {provider} web token", {
provider: providerName,
});
}
return providerText(t, "addProviderSessionCookieTitle", "Add {provider} session cookie", {
provider: providerName,
});
}
// ---------------------------------------------------------------------------
// Upstream-headers helpers (Phase 2b)
// ---------------------------------------------------------------------------