@replicated/portal-components 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/metadata/registry.json +2 -2
- package/components/metadata/registry.md +2 -2
- package/dist/actions/change-team.js +66 -7
- package/dist/actions/change-team.js.map +1 -1
- package/dist/actions/index.d.mts +3 -1
- package/dist/actions/index.d.ts +3 -1
- package/dist/actions/index.js +182 -465
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/install-actions.d.mts +3 -1
- package/dist/actions/install-actions.d.ts +3 -1
- package/dist/actions/install-actions.js +58 -5
- package/dist/actions/install-actions.js.map +1 -1
- package/dist/actions/service-account.d.mts +3 -1
- package/dist/actions/service-account.d.ts +3 -1
- package/dist/actions/service-account.js +58 -5
- package/dist/actions/service-account.js.map +1 -1
- package/dist/actions/support-bundles.d.mts +3 -1
- package/dist/actions/support-bundles.d.ts +3 -1
- package/dist/actions/support-bundles.js +58 -5
- package/dist/actions/support-bundles.js.map +1 -1
- package/dist/actions/team-settings.d.mts +3 -1
- package/dist/actions/team-settings.d.ts +3 -1
- package/dist/actions/team-settings.js +91 -27
- package/dist/actions/team-settings.js.map +1 -1
- package/dist/actions/trial-signup.d.mts +24 -0
- package/dist/actions/trial-signup.d.ts +24 -0
- package/dist/actions/trial-signup.js +482 -0
- package/dist/actions/trial-signup.js.map +1 -0
- package/dist/actions/user-settings.d.mts +3 -1
- package/dist/actions/user-settings.d.ts +3 -1
- package/dist/actions/user-settings.js +58 -5
- package/dist/actions/user-settings.js.map +1 -1
- package/dist/airgap-instances.d.mts +3 -1
- package/dist/airgap-instances.d.ts +3 -1
- package/dist/airgap-instances.js +41 -112
- package/dist/airgap-instances.js.map +1 -1
- package/dist/branding-BsMSywts.d.mts +36 -0
- package/dist/branding-BsMSywts.d.ts +36 -0
- package/dist/error-page.js +10 -2
- package/dist/error-page.js.map +1 -1
- package/dist/error.js +10 -2
- package/dist/error.js.map +1 -1
- package/dist/esm/actions/change-team.js +66 -7
- package/dist/esm/actions/change-team.js.map +1 -1
- package/dist/esm/actions/index.js +181 -462
- package/dist/esm/actions/index.js.map +1 -1
- package/dist/esm/actions/install-actions.js +58 -5
- package/dist/esm/actions/install-actions.js.map +1 -1
- package/dist/esm/actions/service-account.js +58 -5
- package/dist/esm/actions/service-account.js.map +1 -1
- package/dist/esm/actions/support-bundles.js +58 -5
- package/dist/esm/actions/support-bundles.js.map +1 -1
- package/dist/esm/actions/team-settings.js +91 -27
- package/dist/esm/actions/team-settings.js.map +1 -1
- package/dist/esm/actions/trial-signup.js +478 -0
- package/dist/esm/actions/trial-signup.js.map +1 -0
- package/dist/esm/actions/user-settings.js +58 -5
- package/dist/esm/actions/user-settings.js.map +1 -1
- package/dist/esm/airgap-instances.js +40 -112
- package/dist/esm/airgap-instances.js.map +1 -1
- package/dist/esm/error-page.js +10 -2
- package/dist/esm/error-page.js.map +1 -1
- package/dist/esm/error.js +10 -2
- package/dist/esm/error.js.map +1 -1
- package/dist/esm/helm-install-wizard.js +118 -79
- package/dist/esm/helm-install-wizard.js.map +1 -1
- package/dist/esm/index.js +706 -438
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/install-actions.js +40 -5
- package/dist/esm/install-actions.js.map +1 -1
- package/dist/esm/install-card.js +9 -6
- package/dist/esm/install-card.js.map +1 -1
- package/dist/esm/install-targets.js +9 -2
- package/dist/esm/install-targets.js.map +1 -1
- package/dist/esm/instance-card.js +39 -111
- package/dist/esm/instance-card.js.map +1 -1
- package/dist/esm/join-team.js +9 -3
- package/dist/esm/join-team.js.map +1 -1
- package/dist/esm/license-card.js +24 -22
- package/dist/esm/license-card.js.map +1 -1
- package/dist/esm/license-details.js +128 -334
- package/dist/esm/license-details.js.map +1 -1
- package/dist/esm/linux-install-wizard.js +95 -41
- package/dist/esm/linux-install-wizard.js.map +1 -1
- package/dist/esm/login.js +20 -4
- package/dist/esm/login.js.map +1 -1
- package/dist/esm/middleware.js +33 -0
- package/dist/esm/middleware.js.map +1 -0
- package/dist/esm/online-instance-list.js +40 -112
- package/dist/esm/online-instance-list.js.map +1 -1
- package/dist/esm/release-history-panel.js +27 -14
- package/dist/esm/release-history-panel.js.map +1 -1
- package/dist/esm/saml-callback-client.js +82 -0
- package/dist/esm/saml-callback-client.js.map +1 -0
- package/dist/esm/saml-handlers.js +138 -0
- package/dist/esm/saml-handlers.js.map +1 -0
- package/dist/esm/security-card.js +53 -38
- package/dist/esm/security-card.js.map +1 -1
- package/dist/esm/service-accounts-tab.js +800 -0
- package/dist/esm/service-accounts-tab.js.map +1 -0
- package/dist/esm/support-bundle-collection-card.js +48 -24
- package/dist/esm/support-bundle-collection-card.js.map +1 -1
- package/dist/esm/support-bundles-card.js +10 -5
- package/dist/esm/support-bundles-card.js.map +1 -1
- package/dist/esm/support-card.js +37 -5
- package/dist/esm/support-card.js.map +1 -1
- package/dist/esm/team-selection.js +5 -1
- package/dist/esm/team-selection.js.map +1 -1
- package/dist/esm/team-settings-card.js +5 -2
- package/dist/esm/team-settings-card.js.map +1 -1
- package/dist/esm/team-settings.js +7 -2
- package/dist/esm/team-settings.js.map +1 -1
- package/dist/esm/top-nav-user-menu.js +5 -1
- package/dist/esm/top-nav-user-menu.js.map +1 -1
- package/dist/esm/top-nav.js +175 -62
- package/dist/esm/top-nav.js.map +1 -1
- package/dist/esm/trial-signup.js +256 -0
- package/dist/esm/trial-signup.js.map +1 -0
- package/dist/esm/update-layout.js +175 -62
- package/dist/esm/update-layout.js.map +1 -1
- package/dist/esm/updates-card.js +15 -4
- package/dist/esm/updates-card.js.map +1 -1
- package/dist/esm/upload-support-bundle-modal.js +9 -4
- package/dist/esm/upload-support-bundle-modal.js.map +1 -1
- package/dist/esm/user-settings-card.js +5 -2
- package/dist/esm/user-settings-card.js.map +1 -1
- package/dist/esm/user-settings.js +12 -6
- package/dist/esm/user-settings.js.map +1 -1
- package/dist/esm/utils/index.js +204 -13
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/fetch-license-iTyF7_GY.d.mts +81 -0
- package/dist/fetch-license-iTyF7_GY.d.ts +81 -0
- package/dist/helm-install-wizard.d.mts +11 -3
- package/dist/helm-install-wizard.d.ts +11 -3
- package/dist/helm-install-wizard.js +118 -79
- package/dist/helm-install-wizard.js.map +1 -1
- package/dist/{index-BAiVrSSR.d.mts → index-DyzJ0yKD.d.mts} +48 -50
- package/dist/{index-DWt-N5od.d.ts → index-sMbq94M7.d.ts} +48 -50
- package/dist/index.d.mts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +726 -438
- package/dist/index.js.map +1 -1
- package/dist/install-actions.d.mts +4 -2
- package/dist/install-actions.d.ts +4 -2
- package/dist/install-actions.js +40 -5
- package/dist/install-actions.js.map +1 -1
- package/dist/install-card.d.mts +2 -3
- package/dist/install-card.d.ts +2 -3
- package/dist/install-card.js +9 -6
- package/dist/install-card.js.map +1 -1
- package/dist/install-targets.js +9 -2
- package/dist/install-targets.js.map +1 -1
- package/dist/instance-card.d.mts +3 -1
- package/dist/instance-card.d.ts +3 -1
- package/dist/instance-card.js +40 -111
- package/dist/instance-card.js.map +1 -1
- package/dist/join-team.js +9 -3
- package/dist/join-team.js.map +1 -1
- package/dist/license-card.d.mts +2 -3
- package/dist/license-card.d.ts +2 -3
- package/dist/license-card.js +24 -22
- package/dist/license-card.js.map +1 -1
- package/dist/license-details.js +128 -334
- package/dist/license-details.js.map +1 -1
- package/dist/linux-install-wizard.d.mts +9 -3
- package/dist/linux-install-wizard.d.ts +9 -3
- package/dist/linux-install-wizard.js +95 -41
- package/dist/linux-install-wizard.js.map +1 -1
- package/dist/login.d.mts +4 -0
- package/dist/login.d.ts +4 -0
- package/dist/login.js +20 -4
- package/dist/login.js.map +1 -1
- package/dist/middleware.d.mts +13 -0
- package/dist/middleware.d.ts +13 -0
- package/dist/middleware.js +35 -0
- package/dist/middleware.js.map +1 -0
- package/dist/online-instance-list.d.mts +3 -1
- package/dist/online-instance-list.d.ts +3 -1
- package/dist/online-instance-list.js +41 -112
- package/dist/online-instance-list.js.map +1 -1
- package/dist/pending-installations.d.mts +3 -1
- package/dist/pending-installations.d.ts +3 -1
- package/dist/release-history-panel.js +27 -14
- package/dist/release-history-panel.js.map +1 -1
- package/dist/saml-callback-client.d.mts +36 -0
- package/dist/saml-callback-client.d.ts +36 -0
- package/dist/saml-callback-client.js +88 -0
- package/dist/saml-callback-client.js.map +1 -0
- package/dist/saml-handlers.d.mts +50 -0
- package/dist/saml-handlers.d.ts +50 -0
- package/dist/saml-handlers.js +141 -0
- package/dist/saml-handlers.js.map +1 -0
- package/dist/security-card.d.mts +3 -1
- package/dist/security-card.d.ts +3 -1
- package/dist/security-card.js +53 -38
- package/dist/security-card.js.map +1 -1
- package/dist/service-accounts-tab.d.mts +51 -0
- package/dist/service-accounts-tab.d.ts +51 -0
- package/dist/service-accounts-tab.js +802 -0
- package/dist/service-accounts-tab.js.map +1 -0
- package/dist/styles.css +375 -127
- package/dist/support-bundle-collection-card.d.mts +1 -1
- package/dist/support-bundle-collection-card.d.ts +1 -1
- package/dist/support-bundle-collection-card.js +47 -23
- package/dist/support-bundle-collection-card.js.map +1 -1
- package/dist/support-bundles-card.d.mts +4 -2
- package/dist/support-bundles-card.d.ts +4 -2
- package/dist/support-bundles-card.js +10 -5
- package/dist/support-bundles-card.js.map +1 -1
- package/dist/support-card.js +37 -5
- package/dist/support-card.js.map +1 -1
- package/dist/team-selection.js +5 -1
- package/dist/team-selection.js.map +1 -1
- package/dist/team-settings-card.js +5 -2
- package/dist/team-settings-card.js.map +1 -1
- package/dist/team-settings.js +7 -2
- package/dist/team-settings.js.map +1 -1
- package/dist/{top-nav-IRIn66wS.d.ts → top-nav-BUQAGoG1.d.mts} +14 -2
- package/dist/{top-nav-IRIn66wS.d.mts → top-nav-CEqw0KpO.d.ts} +14 -2
- package/dist/top-nav-user-menu.js +5 -1
- package/dist/top-nav-user-menu.js.map +1 -1
- package/dist/top-nav.d.mts +2 -1
- package/dist/top-nav.d.ts +2 -1
- package/dist/top-nav.js +175 -62
- package/dist/top-nav.js.map +1 -1
- package/dist/trial-signup.d.mts +31 -0
- package/dist/trial-signup.d.ts +31 -0
- package/dist/trial-signup.js +258 -0
- package/dist/trial-signup.js.map +1 -0
- package/dist/update-layout.js +175 -62
- package/dist/update-layout.js.map +1 -1
- package/dist/updates-card.js +15 -4
- package/dist/updates-card.js.map +1 -1
- package/dist/upload-support-bundle-modal.js +9 -4
- package/dist/upload-support-bundle-modal.js.map +1 -1
- package/dist/user-settings-card.js +5 -2
- package/dist/user-settings-card.js.map +1 -1
- package/dist/user-settings.js +12 -6
- package/dist/user-settings.js.map +1 -1
- package/dist/utils/index.d.mts +74 -16
- package/dist/utils/index.d.ts +74 -16
- package/dist/utils/index.js +215 -12
- package/dist/utils/index.js.map +1 -1
- package/package.json +37 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
interface RawBranding {
|
|
2
|
+
brandingData?: string;
|
|
3
|
+
}
|
|
4
|
+
type BackgroundType = "minimal" | "custom" | "image";
|
|
5
|
+
interface BrandingResult {
|
|
6
|
+
logo?: string;
|
|
7
|
+
title?: string;
|
|
8
|
+
favicon?: string;
|
|
9
|
+
primaryColor: string;
|
|
10
|
+
secondaryColor: string;
|
|
11
|
+
supportPortalLink?: string;
|
|
12
|
+
background?: BackgroundType;
|
|
13
|
+
backgroundImage?: string;
|
|
14
|
+
backgroundGradientStart?: string;
|
|
15
|
+
backgroundGradientEnd?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Normalizes and validates CSS color values to prevent CSS injection attacks.
|
|
19
|
+
* Only supports hex color format (#rgb or #rrggbb) as that's what the API sends.
|
|
20
|
+
*
|
|
21
|
+
* @param color - The color value to normalize
|
|
22
|
+
* @returns The normalized hex color or undefined if invalid
|
|
23
|
+
*/
|
|
24
|
+
declare const normalizeColor: (color?: string) => string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Validates and sanitizes a URL for safe use in CSS url() functions.
|
|
27
|
+
* This prevents CSS injection attacks by validating the URL format and
|
|
28
|
+
* escaping characters that could break out of the url() context.
|
|
29
|
+
*
|
|
30
|
+
* @param url - The URL to validate and sanitize
|
|
31
|
+
* @returns The sanitized URL or undefined if invalid
|
|
32
|
+
*/
|
|
33
|
+
declare const sanitizeUrlForCss: (url?: string) => string | undefined;
|
|
34
|
+
declare const decodeBranding: ({ brandingData }: RawBranding) => BrandingResult;
|
|
35
|
+
|
|
36
|
+
export { type BackgroundType as B, decodeBranding as d, normalizeColor as n, sanitizeUrlForCss as s };
|
package/dist/error-page.js
CHANGED
|
@@ -13,6 +13,9 @@ var Link__default = /*#__PURE__*/_interopDefault(Link);
|
|
|
13
13
|
* This file is generated by tsup. Do not edit manually.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
|
|
17
|
+
// src/utils/constants.ts
|
|
18
|
+
var DEFAULT_SECONDARY_COLOR = "#6366f1";
|
|
16
19
|
var AlertTriangleIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17
20
|
"svg",
|
|
18
21
|
{
|
|
@@ -107,6 +110,10 @@ var Error = ({
|
|
|
107
110
|
if (onRetry) {
|
|
108
111
|
onRetry();
|
|
109
112
|
} else if (sourceUrl) {
|
|
113
|
+
try {
|
|
114
|
+
document.cookie = `portal_error_source=${encodeURIComponent(sourceUrl)}; path=/; max-age=300; samesite=lax`;
|
|
115
|
+
} catch (e) {
|
|
116
|
+
}
|
|
110
117
|
window.location.href = sourceUrl;
|
|
111
118
|
} else {
|
|
112
119
|
window.location.reload();
|
|
@@ -125,11 +132,12 @@ var Error = ({
|
|
|
125
132
|
Link__default.default,
|
|
126
133
|
{
|
|
127
134
|
href: homeUrl,
|
|
128
|
-
className: "inline-flex items-center justify-center rounded-lg
|
|
135
|
+
className: "inline-flex items-center justify-center rounded-lg px-6 py-3 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2",
|
|
136
|
+
style: { backgroundColor: `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` },
|
|
129
137
|
children: "Go to Home"
|
|
130
138
|
}
|
|
131
139
|
),
|
|
132
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
140
|
+
(sourceUrl || onRetry) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
133
141
|
"button",
|
|
134
142
|
{
|
|
135
143
|
type: "button",
|
package/dist/error-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/error.tsx","../src/components/error-page.tsx"],"names":["jsxs","jsx","Link"],"mappings":"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","file":"error-page.js","sourcesContent":["\"use client\";\n\nimport type { SVGProps } from \"react\";\nimport Link from \"next/link\";\n\nconst AlertTriangleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst ServerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n);\n\nexport interface ErrorProps {\n code?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n onRetry?: () => void;\n}\n\nconst getErrorContent = (code?: number) => {\n switch (code) {\n case 502:\n return {\n title: \"Service Unavailable\",\n description: \"The service is temporarily unavailable. Please try again in a few moments.\",\n icon: ServerIcon,\n };\n case 503:\n return {\n title: \"Service Unavailable\",\n description: \"The service is currently undergoing maintenance. Please try again later.\",\n icon: ServerIcon,\n };\n case 504:\n return {\n title: \"Gateway Timeout\",\n description: \"The request took too long to process. Please try again.\",\n icon: ServerIcon,\n };\n case 500:\n return {\n title: \"Internal Server Error\",\n description: \"Something went wrong on our end. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n case 404:\n return {\n title: \"Page Not Found\",\n description: \"The page you're looking for doesn't exist or has been moved.\",\n icon: AlertTriangleIcon,\n };\n case 403:\n return {\n title: \"Access Denied\",\n description: \"You don't have permission to access this resource.\",\n icon: AlertTriangleIcon,\n };\n default:\n return {\n title: \"Something Went Wrong\",\n description: \"An unexpected error occurred. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n }\n};\n\nexport const Error = ({ \n code, \n message,\n homeUrl = \"/\",\n sourceUrl,\n onRetry\n}: ErrorProps) => {\n const errorContent = getErrorContent(code);\n const Icon = errorContent.icon;\n\n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (sourceUrl) {\n window.location.href = sourceUrl;\n } else {\n window.location.reload();\n }\n };\n\n return (\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-3xl border border-gray-200 bg-white p-8 shadow-[0_12px_30px_rgba(17,24,39,0.12)] text-center\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100\">\n <Icon className=\"h-8 w-8 text-red-600\" />\n </div>\n \n {code && (\n <div className=\"mt-6 text-sm font-semibold text-gray-500\">\n Error {code}\n </div>\n )}\n \n <h1 className=\"mt-2 text-2xl font-bold text-gray-900\">\n {errorContent.title}\n </h1>\n \n <p className=\"mt-4 text-sm text-gray-600\">\n {message || errorContent.description}\n </p>\n \n <div className=\"mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center\">\n <Link\n href={homeUrl}\n className=\"inline-flex items-center justify-center rounded-lg bg-indigo-600 px-6 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600\"\n >\n Go to Home\n </Link>\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-6 py-3 text-sm font-semibold text-gray-700 shadow-sm transition hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600\"\n >\n Try Again\n </button>\n </div>\n \n {code && code >= 500 && (\n <p className=\"mt-6 text-xs text-gray-500\">\n If this problem persists, please contact support.\n </p>\n )}\n </div>\n </div>\n );\n};\n\nError.displayName = \"Error\";\n","\"use client\";\n\nimport { Error } from \"./error\";\n\ninterface ErrorPageProps {\n statusCode?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n}\n\nexport const ErrorPage = ({ \n statusCode, \n message,\n homeUrl = \"/\",\n sourceUrl\n}: ErrorPageProps) => {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-gray-50 px-4 py-12\">\n <Error code={statusCode} message={message} homeUrl={homeUrl} sourceUrl={sourceUrl} />\n </div>\n );\n};\n\nErrorPage.displayName = \"ErrorPage\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/constants.ts","../src/components/error.tsx","../src/components/error-page.tsx"],"names":["jsxs","jsx","Link"],"mappings":"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","file":"error-page.js","sourcesContent":["/**\n * Default globe favicon matching the CiGlobe icon (Circum Icons)\n * Used as fallback when custom branding doesn't provide a favicon\n */\nexport const DEFAULT_FAVICON = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='1.5'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cellipse cx='12' cy='12' rx='4' ry='10'/%3E%3Cpath d='M2 12h20'/%3E%3C/svg%3E\";\n\n/**\n * Default primary brand color\n */\nexport const DEFAULT_PRIMARY_COLOR = \"#4f46e5\";\n\n/**\n * Default secondary brand color\n */\nexport const DEFAULT_SECONDARY_COLOR = \"#6366f1\";\n\n/**\n * Check if the API origin is HTTP (used for repldev environments)\n * This determines cookie security settings for cross-origin iframes\n * @returns true if the API origin starts with http:// (not https://)\n */\nexport const isHttpApiOrigin = (): boolean => {\n return process.env.REPLICATED_APP_ORIGIN?.startsWith('http://') || false;\n};\n","\"use client\";\n\nimport type { SVGProps } from \"react\";\nimport Link from \"next/link\";\nimport { DEFAULT_SECONDARY_COLOR } from \"../utils/constants\";\n\nconst AlertTriangleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst ServerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n);\n\nexport interface ErrorProps {\n code?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n onRetry?: () => void;\n}\n\nconst getErrorContent = (code?: number) => {\n switch (code) {\n case 502:\n return {\n title: \"Service Unavailable\",\n description: \"The service is temporarily unavailable. Please try again in a few moments.\",\n icon: ServerIcon,\n };\n case 503:\n return {\n title: \"Service Unavailable\",\n description: \"The service is currently undergoing maintenance. Please try again later.\",\n icon: ServerIcon,\n };\n case 504:\n return {\n title: \"Gateway Timeout\",\n description: \"The request took too long to process. Please try again.\",\n icon: ServerIcon,\n };\n case 500:\n return {\n title: \"Internal Server Error\",\n description: \"Something went wrong on our end. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n case 404:\n return {\n title: \"Page Not Found\",\n description: \"The page you're looking for doesn't exist or has been moved.\",\n icon: AlertTriangleIcon,\n };\n case 403:\n return {\n title: \"Access Denied\",\n description: \"You don't have permission to access this resource.\",\n icon: AlertTriangleIcon,\n };\n default:\n return {\n title: \"Something Went Wrong\",\n description: \"An unexpected error occurred. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n }\n};\n\nexport const Error = ({ \n code, \n message,\n homeUrl = \"/\",\n sourceUrl,\n onRetry\n}: ErrorProps) => {\n const errorContent = getErrorContent(code);\n const Icon = errorContent.icon;\n\n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (sourceUrl) {\n // Preserve source URL in a cookie so server-side can read it on retry\n // Cookie expires in 5 minutes (enough time for retry)\n try {\n document.cookie = `portal_error_source=${encodeURIComponent(sourceUrl)}; path=/; max-age=300; samesite=lax`;\n } catch (e) {\n // Ignore cookie errors\n }\n window.location.href = sourceUrl;\n } else {\n window.location.reload();\n }\n };\n\n return (\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-3xl border border-gray-200 bg-white p-8 shadow-[0_12px_30px_rgba(17,24,39,0.12)] text-center\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100\">\n <Icon className=\"h-8 w-8 text-red-600\" />\n </div>\n \n {code && (\n <div className=\"mt-6 text-sm font-semibold text-gray-500\">\n Error {code}\n </div>\n )}\n \n <h1 className=\"mt-2 text-2xl font-bold text-gray-900\">\n {errorContent.title}\n </h1>\n \n <p className=\"mt-4 text-sm text-gray-600\">\n {message || errorContent.description}\n </p>\n \n <div className=\"mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center\">\n <Link\n href={homeUrl}\n className=\"inline-flex items-center justify-center rounded-lg px-6 py-3 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n style={{ backgroundColor: `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` }}\n >\n Go to Home\n </Link>\n {(sourceUrl || onRetry) && (\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-6 py-3 text-sm font-semibold text-gray-700 shadow-sm transition hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600\"\n >\n Try Again\n </button>\n )}\n </div>\n \n {code && code >= 500 && (\n <p className=\"mt-6 text-xs text-gray-500\">\n If this problem persists, please contact support.\n </p>\n )}\n </div>\n </div>\n );\n};\n\nError.displayName = \"Error\";\n","\"use client\";\n\nimport { Error } from \"./error\";\n\ninterface ErrorPageProps {\n statusCode?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n}\n\nexport const ErrorPage = ({ \n statusCode, \n message,\n homeUrl = \"/\",\n sourceUrl\n}: ErrorPageProps) => {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-gray-50 px-4 py-12\">\n <Error code={statusCode} message={message} homeUrl={homeUrl} sourceUrl={sourceUrl} />\n </div>\n );\n};\n\nErrorPage.displayName = \"ErrorPage\";\n"]}
|
package/dist/error.js
CHANGED
|
@@ -13,6 +13,9 @@ var Link__default = /*#__PURE__*/_interopDefault(Link);
|
|
|
13
13
|
* This file is generated by tsup. Do not edit manually.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
|
|
17
|
+
// src/utils/constants.ts
|
|
18
|
+
var DEFAULT_SECONDARY_COLOR = "#6366f1";
|
|
16
19
|
var AlertTriangleIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17
20
|
"svg",
|
|
18
21
|
{
|
|
@@ -107,6 +110,10 @@ var Error = ({
|
|
|
107
110
|
if (onRetry) {
|
|
108
111
|
onRetry();
|
|
109
112
|
} else if (sourceUrl) {
|
|
113
|
+
try {
|
|
114
|
+
document.cookie = `portal_error_source=${encodeURIComponent(sourceUrl)}; path=/; max-age=300; samesite=lax`;
|
|
115
|
+
} catch (e) {
|
|
116
|
+
}
|
|
110
117
|
window.location.href = sourceUrl;
|
|
111
118
|
} else {
|
|
112
119
|
window.location.reload();
|
|
@@ -125,11 +132,12 @@ var Error = ({
|
|
|
125
132
|
Link__default.default,
|
|
126
133
|
{
|
|
127
134
|
href: homeUrl,
|
|
128
|
-
className: "inline-flex items-center justify-center rounded-lg
|
|
135
|
+
className: "inline-flex items-center justify-center rounded-lg px-6 py-3 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2",
|
|
136
|
+
style: { backgroundColor: `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` },
|
|
129
137
|
children: "Go to Home"
|
|
130
138
|
}
|
|
131
139
|
),
|
|
132
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
140
|
+
(sourceUrl || onRetry) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
133
141
|
"button",
|
|
134
142
|
{
|
|
135
143
|
type: "button",
|
package/dist/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/error.tsx"],"names":["jsxs","jsx","Link"],"mappings":"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","file":"error.js","sourcesContent":["\"use client\";\n\nimport type { SVGProps } from \"react\";\nimport Link from \"next/link\";\n\nconst AlertTriangleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst ServerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n);\n\nexport interface ErrorProps {\n code?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n onRetry?: () => void;\n}\n\nconst getErrorContent = (code?: number) => {\n switch (code) {\n case 502:\n return {\n title: \"Service Unavailable\",\n description: \"The service is temporarily unavailable. Please try again in a few moments.\",\n icon: ServerIcon,\n };\n case 503:\n return {\n title: \"Service Unavailable\",\n description: \"The service is currently undergoing maintenance. Please try again later.\",\n icon: ServerIcon,\n };\n case 504:\n return {\n title: \"Gateway Timeout\",\n description: \"The request took too long to process. Please try again.\",\n icon: ServerIcon,\n };\n case 500:\n return {\n title: \"Internal Server Error\",\n description: \"Something went wrong on our end. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n case 404:\n return {\n title: \"Page Not Found\",\n description: \"The page you're looking for doesn't exist or has been moved.\",\n icon: AlertTriangleIcon,\n };\n case 403:\n return {\n title: \"Access Denied\",\n description: \"You don't have permission to access this resource.\",\n icon: AlertTriangleIcon,\n };\n default:\n return {\n title: \"Something Went Wrong\",\n description: \"An unexpected error occurred. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n }\n};\n\nexport const Error = ({ \n code, \n message,\n homeUrl = \"/\",\n sourceUrl,\n onRetry\n}: ErrorProps) => {\n const errorContent = getErrorContent(code);\n const Icon = errorContent.icon;\n\n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (sourceUrl) {\n window.location.href = sourceUrl;\n } else {\n window.location.reload();\n }\n };\n\n return (\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-3xl border border-gray-200 bg-white p-8 shadow-[0_12px_30px_rgba(17,24,39,0.12)] text-center\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100\">\n <Icon className=\"h-8 w-8 text-red-600\" />\n </div>\n \n {code && (\n <div className=\"mt-6 text-sm font-semibold text-gray-500\">\n Error {code}\n </div>\n )}\n \n <h1 className=\"mt-2 text-2xl font-bold text-gray-900\">\n {errorContent.title}\n </h1>\n \n <p className=\"mt-4 text-sm text-gray-600\">\n {message || errorContent.description}\n </p>\n \n <div className=\"mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center\">\n <Link\n href={homeUrl}\n className=\"inline-flex items-center justify-center rounded-lg bg-indigo-600 px-6 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600\"\n >\n Go to Home\n </Link>\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-6 py-3 text-sm font-semibold text-gray-700 shadow-sm transition hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600\"\n >\n Try Again\n </button>\n </div>\n \n {code && code >= 500 && (\n <p className=\"mt-6 text-xs text-gray-500\">\n If this problem persists, please contact support.\n </p>\n )}\n </div>\n </div>\n );\n};\n\nError.displayName = \"Error\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/constants.ts","../src/components/error.tsx"],"names":["jsxs","jsx","Link"],"mappings":"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","file":"error.js","sourcesContent":["/**\n * Default globe favicon matching the CiGlobe icon (Circum Icons)\n * Used as fallback when custom branding doesn't provide a favicon\n */\nexport const DEFAULT_FAVICON = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='1.5'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cellipse cx='12' cy='12' rx='4' ry='10'/%3E%3Cpath d='M2 12h20'/%3E%3C/svg%3E\";\n\n/**\n * Default primary brand color\n */\nexport const DEFAULT_PRIMARY_COLOR = \"#4f46e5\";\n\n/**\n * Default secondary brand color\n */\nexport const DEFAULT_SECONDARY_COLOR = \"#6366f1\";\n\n/**\n * Check if the API origin is HTTP (used for repldev environments)\n * This determines cookie security settings for cross-origin iframes\n * @returns true if the API origin starts with http:// (not https://)\n */\nexport const isHttpApiOrigin = (): boolean => {\n return process.env.REPLICATED_APP_ORIGIN?.startsWith('http://') || false;\n};\n","\"use client\";\n\nimport type { SVGProps } from \"react\";\nimport Link from \"next/link\";\nimport { DEFAULT_SECONDARY_COLOR } from \"../utils/constants\";\n\nconst AlertTriangleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst ServerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n);\n\nexport interface ErrorProps {\n code?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n onRetry?: () => void;\n}\n\nconst getErrorContent = (code?: number) => {\n switch (code) {\n case 502:\n return {\n title: \"Service Unavailable\",\n description: \"The service is temporarily unavailable. Please try again in a few moments.\",\n icon: ServerIcon,\n };\n case 503:\n return {\n title: \"Service Unavailable\",\n description: \"The service is currently undergoing maintenance. Please try again later.\",\n icon: ServerIcon,\n };\n case 504:\n return {\n title: \"Gateway Timeout\",\n description: \"The request took too long to process. Please try again.\",\n icon: ServerIcon,\n };\n case 500:\n return {\n title: \"Internal Server Error\",\n description: \"Something went wrong on our end. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n case 404:\n return {\n title: \"Page Not Found\",\n description: \"The page you're looking for doesn't exist or has been moved.\",\n icon: AlertTriangleIcon,\n };\n case 403:\n return {\n title: \"Access Denied\",\n description: \"You don't have permission to access this resource.\",\n icon: AlertTriangleIcon,\n };\n default:\n return {\n title: \"Something Went Wrong\",\n description: \"An unexpected error occurred. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n }\n};\n\nexport const Error = ({ \n code, \n message,\n homeUrl = \"/\",\n sourceUrl,\n onRetry\n}: ErrorProps) => {\n const errorContent = getErrorContent(code);\n const Icon = errorContent.icon;\n\n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (sourceUrl) {\n // Preserve source URL in a cookie so server-side can read it on retry\n // Cookie expires in 5 minutes (enough time for retry)\n try {\n document.cookie = `portal_error_source=${encodeURIComponent(sourceUrl)}; path=/; max-age=300; samesite=lax`;\n } catch (e) {\n // Ignore cookie errors\n }\n window.location.href = sourceUrl;\n } else {\n window.location.reload();\n }\n };\n\n return (\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-3xl border border-gray-200 bg-white p-8 shadow-[0_12px_30px_rgba(17,24,39,0.12)] text-center\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100\">\n <Icon className=\"h-8 w-8 text-red-600\" />\n </div>\n \n {code && (\n <div className=\"mt-6 text-sm font-semibold text-gray-500\">\n Error {code}\n </div>\n )}\n \n <h1 className=\"mt-2 text-2xl font-bold text-gray-900\">\n {errorContent.title}\n </h1>\n \n <p className=\"mt-4 text-sm text-gray-600\">\n {message || errorContent.description}\n </p>\n \n <div className=\"mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center\">\n <Link\n href={homeUrl}\n className=\"inline-flex items-center justify-center rounded-lg px-6 py-3 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n style={{ backgroundColor: `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` }}\n >\n Go to Home\n </Link>\n {(sourceUrl || onRetry) && (\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-6 py-3 text-sm font-semibold text-gray-700 shadow-sm transition hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600\"\n >\n Try Again\n </button>\n )}\n </div>\n \n {code && code >= 500 && (\n <p className=\"mt-6 text-xs text-gray-500\">\n If this problem persists, please contact support.\n </p>\n )}\n </div>\n </div>\n );\n};\n\nError.displayName = \"Error\";\n"]}
|
|
@@ -119,6 +119,9 @@ var init_tracer = __esm({
|
|
|
119
119
|
});
|
|
120
120
|
|
|
121
121
|
// src/utils/api-client.ts
|
|
122
|
+
function isRedirectError(error) {
|
|
123
|
+
return typeof error === "object" && error !== null && "digest" in error && typeof error.digest === "string" && error.digest.startsWith("NEXT_REDIRECT");
|
|
124
|
+
}
|
|
122
125
|
async function authenticatedFetch(url, options = {}) {
|
|
123
126
|
const { token, ...fetchOptions } = options;
|
|
124
127
|
const headers = new Headers(fetchOptions.headers);
|
|
@@ -141,8 +144,17 @@ async function handle401() {
|
|
|
141
144
|
const { redirect } = await import('next/navigation');
|
|
142
145
|
return redirect("/?expired=1");
|
|
143
146
|
}
|
|
147
|
+
function isErrorPage(url) {
|
|
148
|
+
try {
|
|
149
|
+
const urlObj = new URL(url);
|
|
150
|
+
return urlObj.pathname === "/error";
|
|
151
|
+
} catch {
|
|
152
|
+
return url === "/error" || url.startsWith("/error?");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
144
155
|
async function handleServerError(statusCode) {
|
|
145
156
|
const { redirect } = await import('next/navigation');
|
|
157
|
+
const { cookies: cookies2 } = await import('next/headers');
|
|
146
158
|
let sourceUrl;
|
|
147
159
|
try {
|
|
148
160
|
const { headers } = await import('next/headers');
|
|
@@ -150,12 +162,20 @@ async function handleServerError(statusCode) {
|
|
|
150
162
|
const referer = headersList.get("referer");
|
|
151
163
|
const host = headersList.get("host");
|
|
152
164
|
const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
|
|
153
|
-
if (referer) {
|
|
165
|
+
if (referer && !isErrorPage(referer)) {
|
|
154
166
|
sourceUrl = referer;
|
|
155
167
|
} else if (host && pathname) {
|
|
156
168
|
const protocol = headersList.get("x-forwarded-proto") || "https";
|
|
157
169
|
sourceUrl = `${protocol}://${host}${pathname}`;
|
|
158
170
|
}
|
|
171
|
+
if (!sourceUrl || isErrorPage(sourceUrl)) {
|
|
172
|
+
const cookieStore = await cookies2();
|
|
173
|
+
const preservedSource = cookieStore.get("portal_error_source");
|
|
174
|
+
if (preservedSource?.value) {
|
|
175
|
+
sourceUrl = decodeURIComponent(preservedSource.value);
|
|
176
|
+
cookieStore.delete("portal_error_source");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
159
179
|
} catch (error) {
|
|
160
180
|
console.debug("[portal-components] Could not determine source URL", error);
|
|
161
181
|
}
|
|
@@ -257,11 +277,15 @@ var fetchCustomBrandingImpl = async () => {
|
|
|
257
277
|
const payload = await response.json();
|
|
258
278
|
const brandingObject = {
|
|
259
279
|
logo: payload.logoUrl,
|
|
260
|
-
title: payload.
|
|
261
|
-
|
|
262
|
-
|
|
280
|
+
title: payload.title,
|
|
281
|
+
primaryColor: payload.primaryColor,
|
|
282
|
+
secondaryColor: payload.secondaryColor,
|
|
263
283
|
favicon: payload.faviconUrl,
|
|
264
|
-
supportPortalLink: payload.supportPortalLink || ""
|
|
284
|
+
supportPortalLink: payload.supportPortalLink || "",
|
|
285
|
+
background: payload.background,
|
|
286
|
+
backgroundImage: payload.backgroundImage,
|
|
287
|
+
customColor1: payload.customColor1,
|
|
288
|
+
customColor2: payload.customColor2
|
|
265
289
|
};
|
|
266
290
|
const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
|
|
267
291
|
return {
|
|
@@ -295,6 +319,38 @@ var getCustomerIdFromToken = (token) => {
|
|
|
295
319
|
}
|
|
296
320
|
return customerId.trim();
|
|
297
321
|
};
|
|
322
|
+
async function listReleasesImpl() {
|
|
323
|
+
const { cookies: cookies2 } = await import('next/headers');
|
|
324
|
+
const sessionStore = await cookies2();
|
|
325
|
+
const session = sessionStore.get("portal_session");
|
|
326
|
+
const token = session?.value;
|
|
327
|
+
if (!token) {
|
|
328
|
+
throw new Error("List releases requires a session token");
|
|
329
|
+
}
|
|
330
|
+
const endpoint = `${getApiOrigin()}/enterprise-portal/releases`;
|
|
331
|
+
if (process.env.NODE_ENV !== "production") {
|
|
332
|
+
console.debug("[portal-components] fetching releases via %s (Enterprise Portal API)", endpoint);
|
|
333
|
+
}
|
|
334
|
+
const response = await authenticatedFetch(endpoint, {
|
|
335
|
+
method: "GET",
|
|
336
|
+
token,
|
|
337
|
+
headers: {
|
|
338
|
+
accept: "application/json"
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
if (!response.ok) {
|
|
342
|
+
throw new Error(
|
|
343
|
+
`List releases request failed (${response.status} ${response.statusText})`
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
const envelope = await response.json();
|
|
347
|
+
const data = envelope.data;
|
|
348
|
+
return {
|
|
349
|
+
releases: Array.isArray(data?.releases) ? data.releases : [],
|
|
350
|
+
totalCount: data?.totalCount || 0
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
traceServerAction("listReleases", listReleasesImpl);
|
|
298
354
|
var switchCustomer = defineServerAction({
|
|
299
355
|
id: "auth/switch-customer",
|
|
300
356
|
description: "Switches the JWT to a different customer/team.",
|
|
@@ -363,10 +419,10 @@ async function fetchCustomersForMenuImpl() {
|
|
|
363
419
|
const token = session.value;
|
|
364
420
|
const currentCustomerId = getCustomerIdFromToken(token);
|
|
365
421
|
const endpoint = `${getApiOrigin()}/enterprise-portal/user`;
|
|
366
|
-
const response = await
|
|
422
|
+
const response = await authenticatedFetch(endpoint, {
|
|
367
423
|
method: "GET",
|
|
424
|
+
token,
|
|
368
425
|
headers: {
|
|
369
|
-
Authorization: `Bearer ${token}`,
|
|
370
426
|
Accept: "application/json"
|
|
371
427
|
}
|
|
372
428
|
});
|
|
@@ -385,6 +441,9 @@ async function fetchCustomersForMenuImpl() {
|
|
|
385
441
|
currentCustomerId
|
|
386
442
|
};
|
|
387
443
|
} catch (error) {
|
|
444
|
+
if (isRedirectError(error)) {
|
|
445
|
+
throw error;
|
|
446
|
+
}
|
|
388
447
|
console.error("[fetch-customers-for-menu] Failed to fetch customers:", error);
|
|
389
448
|
return { customers: [] };
|
|
390
449
|
}
|