mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-17 04:32:31 +03:00
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:
@@ -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,
|
||||
});
|
||||
}
|
||||
@@ -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)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user