@replicated/portal-components 0.0.18 → 0.0.20

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.
Files changed (250) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/dist/actions/change-team.d.mts +10 -0
  4. package/dist/actions/change-team.d.ts +10 -0
  5. package/dist/actions/change-team.js +458 -0
  6. package/dist/actions/change-team.js.map +1 -0
  7. package/dist/actions/index.d.mts +4 -1
  8. package/dist/actions/index.d.ts +4 -1
  9. package/dist/actions/index.js +1232 -430
  10. package/dist/actions/index.js.map +1 -1
  11. package/dist/actions/install-actions.d.mts +4 -0
  12. package/dist/actions/install-actions.d.ts +4 -0
  13. package/dist/actions/install-actions.js +680 -0
  14. package/dist/actions/install-actions.js.map +1 -0
  15. package/dist/actions/service-account.d.mts +4 -0
  16. package/dist/actions/service-account.d.ts +4 -0
  17. package/dist/actions/service-account.js +373 -0
  18. package/dist/actions/service-account.js.map +1 -0
  19. package/dist/actions/support-bundles.d.mts +4 -0
  20. package/dist/actions/support-bundles.d.ts +4 -0
  21. package/dist/actions/support-bundles.js +659 -0
  22. package/dist/actions/support-bundles.js.map +1 -0
  23. package/dist/actions/team-settings.d.mts +4 -0
  24. package/dist/actions/team-settings.d.ts +4 -0
  25. package/dist/actions/team-settings.js +1040 -0
  26. package/dist/actions/team-settings.js.map +1 -0
  27. package/dist/actions/trial-signup.d.mts +24 -0
  28. package/dist/actions/trial-signup.d.ts +24 -0
  29. package/dist/actions/trial-signup.js +482 -0
  30. package/dist/actions/trial-signup.js.map +1 -0
  31. package/dist/actions/user-settings.d.mts +4 -0
  32. package/dist/actions/user-settings.d.ts +4 -0
  33. package/dist/actions/user-settings.js +621 -0
  34. package/dist/actions/user-settings.js.map +1 -0
  35. package/dist/airgap-instances.d.mts +4 -1
  36. package/dist/airgap-instances.d.ts +4 -1
  37. package/dist/airgap-instances.js +177 -32
  38. package/dist/airgap-instances.js.map +1 -1
  39. package/dist/branding-BsMSywts.d.mts +36 -0
  40. package/dist/branding-BsMSywts.d.ts +36 -0
  41. package/dist/error-page.js +10 -2
  42. package/dist/error-page.js.map +1 -1
  43. package/dist/error.js +10 -2
  44. package/dist/error.js.map +1 -1
  45. package/dist/esm/actions/change-team.js +455 -0
  46. package/dist/esm/actions/change-team.js.map +1 -0
  47. package/dist/esm/actions/index.js +1200 -428
  48. package/dist/esm/actions/index.js.map +1 -1
  49. package/dist/esm/actions/install-actions.js +673 -0
  50. package/dist/esm/actions/install-actions.js.map +1 -0
  51. package/dist/esm/actions/service-account.js +371 -0
  52. package/dist/esm/actions/service-account.js.map +1 -0
  53. package/dist/esm/actions/support-bundles.js +654 -0
  54. package/dist/esm/actions/support-bundles.js.map +1 -0
  55. package/dist/esm/actions/team-settings.js +1026 -0
  56. package/dist/esm/actions/team-settings.js.map +1 -0
  57. package/dist/esm/actions/trial-signup.js +478 -0
  58. package/dist/esm/actions/trial-signup.js.map +1 -0
  59. package/dist/esm/actions/user-settings.js +615 -0
  60. package/dist/esm/actions/user-settings.js.map +1 -0
  61. package/dist/esm/airgap-instances.js +176 -32
  62. package/dist/esm/airgap-instances.js.map +1 -1
  63. package/dist/esm/error-page.js +10 -2
  64. package/dist/esm/error-page.js.map +1 -1
  65. package/dist/esm/error.js +10 -2
  66. package/dist/esm/error.js.map +1 -1
  67. package/dist/esm/helm-install-wizard.js +127 -81
  68. package/dist/esm/helm-install-wizard.js.map +1 -1
  69. package/dist/esm/index.js +706 -438
  70. package/dist/esm/index.js.map +1 -1
  71. package/dist/esm/install-actions.js +40 -5
  72. package/dist/esm/install-actions.js.map +1 -1
  73. package/dist/esm/install-card.js +9 -6
  74. package/dist/esm/install-card.js.map +1 -1
  75. package/dist/esm/install-targets.js +9 -2
  76. package/dist/esm/install-targets.js.map +1 -1
  77. package/dist/esm/instance-card.js +175 -31
  78. package/dist/esm/instance-card.js.map +1 -1
  79. package/dist/esm/join-team.js +9 -3
  80. package/dist/esm/join-team.js.map +1 -1
  81. package/dist/esm/license-card.js +24 -22
  82. package/dist/esm/license-card.js.map +1 -1
  83. package/dist/esm/license-details.js +128 -334
  84. package/dist/esm/license-details.js.map +1 -1
  85. package/dist/esm/linux-install-wizard.js +219 -133
  86. package/dist/esm/linux-install-wizard.js.map +1 -1
  87. package/dist/esm/login.js +20 -4
  88. package/dist/esm/login.js.map +1 -1
  89. package/dist/esm/middleware.js +33 -0
  90. package/dist/esm/middleware.js.map +1 -0
  91. package/dist/esm/online-instance-list.js +176 -32
  92. package/dist/esm/online-instance-list.js.map +1 -1
  93. package/dist/esm/pending-installations.js +4 -3
  94. package/dist/esm/pending-installations.js.map +1 -1
  95. package/dist/esm/release-history-panel.js +27 -14
  96. package/dist/esm/release-history-panel.js.map +1 -1
  97. package/dist/esm/saml-callback-client.js +82 -0
  98. package/dist/esm/saml-callback-client.js.map +1 -0
  99. package/dist/esm/saml-handlers.js +138 -0
  100. package/dist/esm/saml-handlers.js.map +1 -0
  101. package/dist/esm/security-card.js +53 -38
  102. package/dist/esm/security-card.js.map +1 -1
  103. package/dist/esm/service-accounts-tab.js +800 -0
  104. package/dist/esm/service-accounts-tab.js.map +1 -0
  105. package/dist/esm/support-bundle-collection-card.js +55 -25
  106. package/dist/esm/support-bundle-collection-card.js.map +1 -1
  107. package/dist/esm/support-bundles-card.js +10 -5
  108. package/dist/esm/support-bundles-card.js.map +1 -1
  109. package/dist/esm/support-card.js +37 -5
  110. package/dist/esm/support-card.js.map +1 -1
  111. package/dist/esm/team-selection.js +5 -1
  112. package/dist/esm/team-selection.js.map +1 -1
  113. package/dist/esm/team-settings-card.js +5 -2
  114. package/dist/esm/team-settings-card.js.map +1 -1
  115. package/dist/esm/team-settings.js +7 -2
  116. package/dist/esm/team-settings.js.map +1 -1
  117. package/dist/esm/top-nav-user-menu.js +5 -1
  118. package/dist/esm/top-nav-user-menu.js.map +1 -1
  119. package/dist/esm/top-nav.js +175 -62
  120. package/dist/esm/top-nav.js.map +1 -1
  121. package/dist/esm/trial-signup.js +256 -0
  122. package/dist/esm/trial-signup.js.map +1 -0
  123. package/dist/esm/update-layout.js +175 -62
  124. package/dist/esm/update-layout.js.map +1 -1
  125. package/dist/esm/updates-card.js +15 -4
  126. package/dist/esm/updates-card.js.map +1 -1
  127. package/dist/esm/upload-support-bundle-modal.js +9 -4
  128. package/dist/esm/upload-support-bundle-modal.js.map +1 -1
  129. package/dist/esm/user-settings-card.js +5 -2
  130. package/dist/esm/user-settings-card.js.map +1 -1
  131. package/dist/esm/user-settings.js +12 -6
  132. package/dist/esm/user-settings.js.map +1 -1
  133. package/dist/esm/utils/index.js +204 -13
  134. package/dist/esm/utils/index.js.map +1 -1
  135. package/dist/fetch-license-iTyF7_GY.d.mts +81 -0
  136. package/dist/fetch-license-iTyF7_GY.d.ts +81 -0
  137. package/dist/helm-install-wizard.d.mts +12 -3
  138. package/dist/helm-install-wizard.d.ts +12 -3
  139. package/dist/helm-install-wizard.js +127 -81
  140. package/dist/helm-install-wizard.js.map +1 -1
  141. package/dist/{index-DkjaogsF.d.ts → index-DyzJ0yKD.d.mts} +194 -49
  142. package/dist/{index-DkjaogsF.d.mts → index-sMbq94M7.d.ts} +194 -49
  143. package/dist/index.d.mts +9 -2
  144. package/dist/index.d.ts +9 -2
  145. package/dist/index.js +726 -438
  146. package/dist/index.js.map +1 -1
  147. package/dist/install-actions.d.mts +5 -2
  148. package/dist/install-actions.d.ts +5 -2
  149. package/dist/install-actions.js +40 -5
  150. package/dist/install-actions.js.map +1 -1
  151. package/dist/install-card.d.mts +2 -2
  152. package/dist/install-card.d.ts +2 -2
  153. package/dist/install-card.js +9 -6
  154. package/dist/install-card.js.map +1 -1
  155. package/dist/install-targets.js +9 -2
  156. package/dist/install-targets.js.map +1 -1
  157. package/dist/instance-card.d.mts +4 -1
  158. package/dist/instance-card.d.ts +4 -1
  159. package/dist/instance-card.js +176 -31
  160. package/dist/instance-card.js.map +1 -1
  161. package/dist/join-team.js +9 -3
  162. package/dist/join-team.js.map +1 -1
  163. package/dist/license-card.d.mts +2 -2
  164. package/dist/license-card.d.ts +2 -2
  165. package/dist/license-card.js +24 -22
  166. package/dist/license-card.js.map +1 -1
  167. package/dist/license-details.js +128 -334
  168. package/dist/license-details.js.map +1 -1
  169. package/dist/linux-install-wizard.d.mts +12 -6
  170. package/dist/linux-install-wizard.d.ts +12 -6
  171. package/dist/linux-install-wizard.js +219 -133
  172. package/dist/linux-install-wizard.js.map +1 -1
  173. package/dist/login.d.mts +4 -0
  174. package/dist/login.d.ts +4 -0
  175. package/dist/login.js +20 -4
  176. package/dist/login.js.map +1 -1
  177. package/dist/middleware.d.mts +13 -0
  178. package/dist/middleware.d.ts +13 -0
  179. package/dist/middleware.js +35 -0
  180. package/dist/middleware.js.map +1 -0
  181. package/dist/online-instance-list.d.mts +4 -1
  182. package/dist/online-instance-list.d.ts +4 -1
  183. package/dist/online-instance-list.js +177 -32
  184. package/dist/online-instance-list.js.map +1 -1
  185. package/dist/pending-installations.d.mts +8 -3
  186. package/dist/pending-installations.d.ts +8 -3
  187. package/dist/pending-installations.js +4 -3
  188. package/dist/pending-installations.js.map +1 -1
  189. package/dist/release-history-panel.js +27 -14
  190. package/dist/release-history-panel.js.map +1 -1
  191. package/dist/saml-callback-client.d.mts +36 -0
  192. package/dist/saml-callback-client.d.ts +36 -0
  193. package/dist/saml-callback-client.js +88 -0
  194. package/dist/saml-callback-client.js.map +1 -0
  195. package/dist/saml-handlers.d.mts +50 -0
  196. package/dist/saml-handlers.d.ts +50 -0
  197. package/dist/saml-handlers.js +141 -0
  198. package/dist/saml-handlers.js.map +1 -0
  199. package/dist/security-card.d.mts +4 -1
  200. package/dist/security-card.d.ts +4 -1
  201. package/dist/security-card.js +53 -38
  202. package/dist/security-card.js.map +1 -1
  203. package/dist/service-accounts-tab.d.mts +51 -0
  204. package/dist/service-accounts-tab.d.ts +51 -0
  205. package/dist/service-accounts-tab.js +802 -0
  206. package/dist/service-accounts-tab.js.map +1 -0
  207. package/dist/styles.css +380 -143
  208. package/dist/support-bundle-collection-card.d.mts +1 -1
  209. package/dist/support-bundle-collection-card.d.ts +1 -1
  210. package/dist/support-bundle-collection-card.js +54 -24
  211. package/dist/support-bundle-collection-card.js.map +1 -1
  212. package/dist/support-bundles-card.d.mts +5 -2
  213. package/dist/support-bundles-card.d.ts +5 -2
  214. package/dist/support-bundles-card.js +10 -5
  215. package/dist/support-bundles-card.js.map +1 -1
  216. package/dist/support-card.js +37 -5
  217. package/dist/support-card.js.map +1 -1
  218. package/dist/team-selection.js +5 -1
  219. package/dist/team-selection.js.map +1 -1
  220. package/dist/team-settings-card.js +5 -2
  221. package/dist/team-settings-card.js.map +1 -1
  222. package/dist/team-settings.js +7 -2
  223. package/dist/team-settings.js.map +1 -1
  224. package/dist/{top-nav-IRIn66wS.d.ts → top-nav-BUQAGoG1.d.mts} +14 -2
  225. package/dist/{top-nav-IRIn66wS.d.mts → top-nav-CEqw0KpO.d.ts} +14 -2
  226. package/dist/top-nav-user-menu.js +5 -1
  227. package/dist/top-nav-user-menu.js.map +1 -1
  228. package/dist/top-nav.d.mts +2 -1
  229. package/dist/top-nav.d.ts +2 -1
  230. package/dist/top-nav.js +175 -62
  231. package/dist/top-nav.js.map +1 -1
  232. package/dist/trial-signup.d.mts +31 -0
  233. package/dist/trial-signup.d.ts +31 -0
  234. package/dist/trial-signup.js +258 -0
  235. package/dist/trial-signup.js.map +1 -0
  236. package/dist/update-layout.js +175 -62
  237. package/dist/update-layout.js.map +1 -1
  238. package/dist/updates-card.js +15 -4
  239. package/dist/updates-card.js.map +1 -1
  240. package/dist/upload-support-bundle-modal.js +9 -4
  241. package/dist/upload-support-bundle-modal.js.map +1 -1
  242. package/dist/user-settings-card.js +5 -2
  243. package/dist/user-settings-card.js.map +1 -1
  244. package/dist/user-settings.js +12 -6
  245. package/dist/user-settings.js.map +1 -1
  246. package/dist/utils/index.d.mts +74 -16
  247. package/dist/utils/index.d.ts +74 -16
  248. package/dist/utils/index.js +215 -12
  249. package/dist/utils/index.js.map +1 -1
  250. package/package.json +67 -1
@@ -0,0 +1,615 @@
1
+ "use server";
2
+ import { cookies } from 'next/headers';
3
+ import { revalidatePath } from 'next/cache';
4
+ import { Buffer } from 'buffer';
5
+ import { cache } from 'react';
6
+
7
+ /**
8
+ * Enterprise Portal Components
9
+ * This file is generated by tsup. Do not edit manually.
10
+ */
11
+ var __defProp = Object.defineProperty;
12
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
+ var __getOwnPropNames = Object.getOwnPropertyNames;
14
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
15
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
16
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
17
+ }) : x)(function(x) {
18
+ if (typeof require !== "undefined") return require.apply(this, arguments);
19
+ throw Error('Dynamic require of "' + x + '" is not supported');
20
+ });
21
+ var __esm = (fn, res) => function __init() {
22
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
23
+ };
24
+ var __export = (target, all) => {
25
+ for (var name in all)
26
+ __defProp(target, name, { get: all[name], enumerable: true });
27
+ };
28
+ var __copyProps = (to, from, except, desc) => {
29
+ if (from && typeof from === "object" || typeof from === "function") {
30
+ for (let key of __getOwnPropNames(from))
31
+ if (!__hasOwnProp.call(to, key) && key !== except)
32
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
33
+ }
34
+ return to;
35
+ };
36
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
+
38
+ // datadog/tracer.ts
39
+ var tracer_exports = {};
40
+ __export(tracer_exports, {
41
+ default: () => tracer_default
42
+ });
43
+ var rawFlag, isEnabled, tracer, getRoutePattern, tracer_default;
44
+ var init_tracer = __esm({
45
+ "datadog/tracer.ts"() {
46
+ rawFlag = String(process.env.USE_DATADOG_APM || "").toLowerCase();
47
+ isEnabled = rawFlag === "true";
48
+ process.env.DD_TRACE_ENABLED = isEnabled ? "1" : "0";
49
+ tracer = null;
50
+ if (isEnabled) {
51
+ const serviceName = process.env.DD_SERVICE || "enterprise-portal";
52
+ const environment = process.env.DD_ENV || process.env.NODE_ENV || "development";
53
+ const version = process.env.DD_VERSION || process.env.NEXT_PUBLIC_VERSION || "0.0.0-dev";
54
+ const agentHost = process.env.DD_AGENT_HOST || process.env.DATADOG_AGENT_HOST || "127.0.0.1";
55
+ const agentPort = process.env.DD_TRACE_AGENT_PORT || "8126";
56
+ process.env.DD_SERVICE = serviceName;
57
+ process.env.DD_ENV = environment;
58
+ {
59
+ process.env.DD_VERSION = version;
60
+ }
61
+ process.env.DD_AGENT_HOST = agentHost;
62
+ process.env.DD_TRACE_AGENT_PORT = agentPort;
63
+ const dbmPropagationMode = process.env.DD_DBM_PROPAGATION_MODE || "full";
64
+ process.env.DD_DBM_PROPAGATION_MODE = dbmPropagationMode;
65
+ try {
66
+ const ddTrace = __require("dd-trace");
67
+ tracer = ddTrace.init({
68
+ service: serviceName,
69
+ env: environment,
70
+ version,
71
+ logInjection: true,
72
+ runtimeMetrics: true,
73
+ appsec: false,
74
+ profiling: false,
75
+ startupLogs: true
76
+ // Enable for debugging
77
+ });
78
+ console.log(`[datadog] Tracer initialized: service=${serviceName}, env=${environment}, version=${version}, agent=${agentHost}:${agentPort}`);
79
+ tracer.use("dns", false);
80
+ tracer.use("net", false);
81
+ tracer.use("http", {
82
+ server: {
83
+ hooks: {
84
+ request: (span, req) => {
85
+ if (!span) return;
86
+ const url = req?.url || "";
87
+ const method = req?.method || "GET";
88
+ const path = url.split("?")[0];
89
+ if (path.startsWith("/_next/")) {
90
+ span.context()._trace.isRecording = false;
91
+ return;
92
+ }
93
+ const routePattern = getRoutePattern(path);
94
+ span.setTag("resource.name", `${method} ${routePattern}`);
95
+ span.setTag("http.route", routePattern);
96
+ }
97
+ }
98
+ }
99
+ });
100
+ } catch (err) {
101
+ console.error("[datadog] failed to initialize tracing", err);
102
+ tracer = null;
103
+ }
104
+ }
105
+ getRoutePattern = (path) => {
106
+ const routePatterns = [
107
+ // Update instance routes - normalize dynamic segments (capture suffix to preserve sub-routes)
108
+ { pattern: /^\/update\/instance\/[^/]+(.*)$/, replacement: "/update/instance/[instanceId]$1" }
109
+ ];
110
+ for (const { pattern, replacement } of routePatterns) {
111
+ if (pattern.test(path)) {
112
+ return path.replace(pattern, replacement);
113
+ }
114
+ }
115
+ return path;
116
+ };
117
+ tracer_default = tracer;
118
+ }
119
+ });
120
+
121
+ // src/utils/observability/tracing.ts
122
+ var tracerCache = void 0;
123
+ function getTracer() {
124
+ if (tracerCache !== void 0) {
125
+ return tracerCache;
126
+ }
127
+ const rawFlag2 = String(process.env.USE_DATADOG_APM || "").toLowerCase();
128
+ const isEnabled2 = rawFlag2 === "true";
129
+ if (!isEnabled2) {
130
+ tracerCache = null;
131
+ return null;
132
+ }
133
+ try {
134
+ const tracerModule = (init_tracer(), __toCommonJS(tracer_exports));
135
+ const tracer2 = tracerModule.default || tracerModule;
136
+ if (tracer2 && typeof tracer2.trace === "function") {
137
+ tracerCache = tracer2;
138
+ return tracerCache;
139
+ }
140
+ } catch (err) {
141
+ console.warn("Failed to load tracer:", err);
142
+ }
143
+ tracerCache = null;
144
+ return null;
145
+ }
146
+ async function withTrace(name, fn) {
147
+ const activeTracer = getTracer();
148
+ if (!activeTracer) {
149
+ return fn(void 0);
150
+ }
151
+ return activeTracer.trace(name, async (span) => {
152
+ if (span) {
153
+ span.setTag("component", "application");
154
+ }
155
+ try {
156
+ const result = await fn(span);
157
+ return result;
158
+ } catch (error) {
159
+ if (span) {
160
+ span.setTag("error", error);
161
+ }
162
+ throw error;
163
+ }
164
+ });
165
+ }
166
+ function traceServerAction(name, fn) {
167
+ const spanName = name.startsWith("server.action.") ? name : `server.action.${name}`;
168
+ const traced = async (...args) => {
169
+ return withTrace(spanName, async (span) => {
170
+ if (span) {
171
+ span.setTag("component", "server-action");
172
+ }
173
+ const result = await fn(...args);
174
+ return result;
175
+ });
176
+ };
177
+ return traced;
178
+ }
179
+
180
+ // src/utils/api-client.ts
181
+ async function authenticatedFetch(url, options = {}) {
182
+ const { token, ...fetchOptions } = options;
183
+ const headers = new Headers(fetchOptions.headers);
184
+ if (token) {
185
+ headers.set("authorization", `Bearer ${token}`);
186
+ }
187
+ const response = await fetch(url, {
188
+ ...fetchOptions,
189
+ headers
190
+ });
191
+ if (response.status === 401) {
192
+ await handle401();
193
+ }
194
+ if (response.status === 502 || response.status === 503 || response.status === 504) {
195
+ await handleServerError(response.status);
196
+ }
197
+ return response;
198
+ }
199
+ async function handle401() {
200
+ const { redirect } = await import('next/navigation');
201
+ return redirect("/?expired=1");
202
+ }
203
+ function isErrorPage(url) {
204
+ try {
205
+ const urlObj = new URL(url);
206
+ return urlObj.pathname === "/error";
207
+ } catch {
208
+ return url === "/error" || url.startsWith("/error?");
209
+ }
210
+ }
211
+ async function handleServerError(statusCode) {
212
+ const { redirect } = await import('next/navigation');
213
+ const { cookies: cookies2 } = await import('next/headers');
214
+ let sourceUrl;
215
+ try {
216
+ const { headers } = await import('next/headers');
217
+ const headersList = await headers();
218
+ const referer = headersList.get("referer");
219
+ const host = headersList.get("host");
220
+ const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
221
+ if (referer && !isErrorPage(referer)) {
222
+ sourceUrl = referer;
223
+ } else if (host && pathname) {
224
+ const protocol = headersList.get("x-forwarded-proto") || "https";
225
+ sourceUrl = `${protocol}://${host}${pathname}`;
226
+ }
227
+ if (!sourceUrl || isErrorPage(sourceUrl)) {
228
+ const cookieStore = await cookies2();
229
+ const preservedSource = cookieStore.get("portal_error_source");
230
+ if (preservedSource?.value) {
231
+ sourceUrl = decodeURIComponent(preservedSource.value);
232
+ cookieStore.delete("portal_error_source");
233
+ }
234
+ }
235
+ } catch (error) {
236
+ console.debug("[portal-components] Could not determine source URL", error);
237
+ }
238
+ const params = new URLSearchParams({ code: String(statusCode) });
239
+ if (sourceUrl) {
240
+ params.set("source", sourceUrl);
241
+ }
242
+ return redirect(`/error?${params.toString()}`);
243
+ }
244
+
245
+ // src/actions/index.ts
246
+ var getApiOrigin = () => {
247
+ return (process.env.REPLICATED_APP_ORIGIN || "https://replicated.app").replace(/\/+$/, "");
248
+ };
249
+ var defineServerAction = (definition) => definition;
250
+ var fetchCustomBrandingImpl = async () => {
251
+ const appSlug = process.env.PORTAL_APP_SLUG;
252
+ if (!appSlug) {
253
+ throw new Error("PORTAL_APP_SLUG is not configured");
254
+ }
255
+ const url = `${getApiOrigin()}/enterprise-portal/public/branding?app_slug=${encodeURIComponent(
256
+ appSlug
257
+ )}`;
258
+ if (process.env.NODE_ENV !== "production") {
259
+ console.debug(
260
+ "[portal-components] fetching custom branding via %s (Enterprise Portal API)",
261
+ url
262
+ );
263
+ }
264
+ const response = await fetch(url, {
265
+ headers: {
266
+ accept: "application/json"
267
+ }
268
+ });
269
+ if (!response.ok) {
270
+ throw new Error(
271
+ `Custom branding request failed (${response.status} ${response.statusText})`
272
+ );
273
+ }
274
+ const payload = await response.json();
275
+ const brandingObject = {
276
+ logo: payload.logoUrl,
277
+ title: payload.title,
278
+ primaryColor: payload.primaryColor,
279
+ secondaryColor: payload.secondaryColor,
280
+ favicon: payload.faviconUrl,
281
+ supportPortalLink: payload.supportPortalLink || "",
282
+ background: payload.background,
283
+ backgroundImage: payload.backgroundImage,
284
+ customColor1: payload.customColor1,
285
+ customColor2: payload.customColor2
286
+ };
287
+ const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
288
+ return {
289
+ brandingData,
290
+ documentation: null
291
+ // Documentation not included in new API's public endpoint
292
+ };
293
+ };
294
+ cache(fetchCustomBrandingImpl);
295
+ var decodeJwtPayload = (token) => {
296
+ const parts = token.split(".");
297
+ if (parts.length !== 3) {
298
+ throw new Error("Invalid JWT received");
299
+ }
300
+ const payloadSegment = parts[1];
301
+ if (!payloadSegment) {
302
+ throw new Error("JWT payload segment missing");
303
+ }
304
+ const padded = payloadSegment.padEnd(
305
+ payloadSegment.length + (4 - payloadSegment.length % 4) % 4,
306
+ "="
307
+ );
308
+ const decoded = Buffer.from(padded, "base64").toString("utf-8");
309
+ return JSON.parse(decoded);
310
+ };
311
+ var getCustomerIdFromToken = (token) => {
312
+ const payload = decodeJwtPayload(token);
313
+ const customerId = payload?.customer_id || payload?.customerId;
314
+ if (typeof customerId !== "string" || !customerId.trim()) {
315
+ throw new Error("Unable to determine customer_id from session token");
316
+ }
317
+ return customerId.trim();
318
+ };
319
+ async function listReleasesImpl() {
320
+ const { cookies: cookies2 } = await import('next/headers');
321
+ const sessionStore = await cookies2();
322
+ const session = sessionStore.get("portal_session");
323
+ const token = session?.value;
324
+ if (!token) {
325
+ throw new Error("List releases requires a session token");
326
+ }
327
+ const endpoint = `${getApiOrigin()}/enterprise-portal/releases`;
328
+ if (process.env.NODE_ENV !== "production") {
329
+ console.debug("[portal-components] fetching releases via %s (Enterprise Portal API)", endpoint);
330
+ }
331
+ const response = await authenticatedFetch(endpoint, {
332
+ method: "GET",
333
+ token,
334
+ headers: {
335
+ accept: "application/json"
336
+ }
337
+ });
338
+ if (!response.ok) {
339
+ throw new Error(
340
+ `List releases request failed (${response.status} ${response.statusText})`
341
+ );
342
+ }
343
+ const envelope = await response.json();
344
+ const data = envelope.data;
345
+ return {
346
+ releases: Array.isArray(data?.releases) ? data.releases : [],
347
+ totalCount: data?.totalCount || 0
348
+ };
349
+ }
350
+ traceServerAction("listReleases", listReleasesImpl);
351
+ var fetchCustomers = defineServerAction({
352
+ id: "auth/fetch-customers",
353
+ description: "Fetches the list of customers/teams for the authenticated user.",
354
+ visibility: "customer",
355
+ tags: ["auth", "customers"],
356
+ async run({ token }, context) {
357
+ if (typeof token !== "string" || token.trim().length === 0) {
358
+ throw new Error("fetchCustomers requires a non-empty token");
359
+ }
360
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user`;
361
+ if (process.env.NODE_ENV !== "production") {
362
+ console.debug("[portal-components] fetching customers via %s (Enterprise Portal API)", endpoint);
363
+ }
364
+ const response = await authenticatedFetch(endpoint, {
365
+ method: "GET",
366
+ token,
367
+ headers: {
368
+ accept: "application/json"
369
+ },
370
+ signal: context?.signal
371
+ });
372
+ if (!response.ok) {
373
+ throw new Error(
374
+ `Fetch customers request failed (${response.status} ${response.statusText})`
375
+ );
376
+ }
377
+ const envelope = await response.json();
378
+ const userData = envelope.data;
379
+ return {
380
+ customers: userData?.customers || []
381
+ };
382
+ }
383
+ });
384
+ var fetchCurrentUser = defineServerAction({
385
+ id: "user/fetch-current",
386
+ description: "Fetches the current user's profile information",
387
+ visibility: "customer",
388
+ tags: ["user", "profile"],
389
+ async run({ token }, context) {
390
+ if (!token || typeof token !== "string") {
391
+ throw new Error("Fetch current user requires a session token");
392
+ }
393
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/profile`;
394
+ if (process.env.NODE_ENV !== "production") {
395
+ console.debug("[portal-components] fetching current user via %s", endpoint);
396
+ }
397
+ const response = await authenticatedFetch(endpoint, {
398
+ method: "GET",
399
+ token,
400
+ headers: { accept: "application/json" },
401
+ signal: context?.signal
402
+ });
403
+ if (!response.ok) {
404
+ throw new Error(
405
+ `Fetch current user request failed (${response.status} ${response.statusText})`
406
+ );
407
+ }
408
+ const data = await response.json();
409
+ return {
410
+ user: {
411
+ emailAddress: data.emailAddress || "",
412
+ firstName: data.firstName || "",
413
+ lastName: data.lastName || ""
414
+ }
415
+ };
416
+ }
417
+ });
418
+ var updateUser = defineServerAction({
419
+ id: "user/update",
420
+ description: "Updates the current user's first and/or last name",
421
+ visibility: "customer",
422
+ tags: ["user", "profile"],
423
+ async run({ token, firstName, lastName }, context) {
424
+ if (!token || typeof token !== "string") {
425
+ throw new Error("Update user requires a session token");
426
+ }
427
+ if (!firstName && !lastName) {
428
+ throw new Error("At least one of firstName or lastName must be provided");
429
+ }
430
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/profile`;
431
+ if (process.env.NODE_ENV !== "production") {
432
+ console.debug("[portal-components] updating user via %s", endpoint);
433
+ }
434
+ const body = {};
435
+ if (firstName !== void 0) body.firstName = firstName;
436
+ if (lastName !== void 0) body.lastName = lastName;
437
+ const response = await authenticatedFetch(endpoint, {
438
+ method: "PUT",
439
+ token,
440
+ headers: {
441
+ "content-type": "application/json",
442
+ accept: "application/json"
443
+ },
444
+ body: JSON.stringify(body),
445
+ signal: context?.signal
446
+ });
447
+ if (!response.ok) {
448
+ const errorText = await response.text().catch(() => "");
449
+ throw new Error(
450
+ `Update user request failed (${response.status} ${response.statusText}): ${errorText}`
451
+ );
452
+ }
453
+ return { success: true };
454
+ }
455
+ });
456
+ var fetchNotifications = defineServerAction({
457
+ id: "notifications/fetch",
458
+ description: "Fetches notification preferences for a specific team",
459
+ visibility: "customer",
460
+ tags: ["notifications", "user"],
461
+ async run({ token, customerId }, context) {
462
+ if (!token || typeof token !== "string") {
463
+ throw new Error("Fetch notifications requires a session token");
464
+ }
465
+ if (!customerId || typeof customerId !== "string") {
466
+ throw new Error("Fetch notifications requires a valid customerId");
467
+ }
468
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/notifications?customer_id=${encodeURIComponent(customerId)}`;
469
+ if (process.env.NODE_ENV !== "production") {
470
+ console.debug("[portal-components] fetching notifications via %s", endpoint);
471
+ }
472
+ const response = await authenticatedFetch(endpoint, {
473
+ method: "GET",
474
+ token,
475
+ headers: { accept: "application/json" },
476
+ signal: context?.signal
477
+ });
478
+ if (!response.ok) {
479
+ throw new Error(
480
+ `Fetch notifications request failed (${response.status} ${response.statusText})`
481
+ );
482
+ }
483
+ const data = await response.json();
484
+ return {
485
+ notifications: data.notifications || []
486
+ };
487
+ }
488
+ });
489
+ var updateNotifications = defineServerAction({
490
+ id: "notifications/update",
491
+ description: "Updates notification preferences for a specific team",
492
+ visibility: "customer",
493
+ tags: ["notifications", "user"],
494
+ async run({ token, customerId, notifications }, context) {
495
+ if (!token || typeof token !== "string") {
496
+ throw new Error("Update notifications requires a session token");
497
+ }
498
+ if (!customerId || typeof customerId !== "string") {
499
+ throw new Error("Update notifications requires a valid customerId");
500
+ }
501
+ if (!Array.isArray(notifications)) {
502
+ throw new Error("Update notifications requires a notifications array");
503
+ }
504
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/notifications?customer_id=${encodeURIComponent(customerId)}`;
505
+ if (process.env.NODE_ENV !== "production") {
506
+ console.debug("[portal-components] updating notifications via %s", endpoint);
507
+ }
508
+ const response = await authenticatedFetch(endpoint, {
509
+ method: "PUT",
510
+ token,
511
+ headers: {
512
+ "content-type": "application/json",
513
+ accept: "application/json"
514
+ },
515
+ body: JSON.stringify({ notifications }),
516
+ signal: context?.signal
517
+ });
518
+ if (!response.ok) {
519
+ const errorText = await response.text().catch(() => "");
520
+ throw new Error(
521
+ `Update notifications request failed (${response.status} ${response.statusText}): ${errorText}`
522
+ );
523
+ }
524
+ const data = await response.json();
525
+ return {
526
+ notifications: data.notifications || []
527
+ };
528
+ }
529
+ });
530
+
531
+ // src/actions/user-settings.ts
532
+ async function fetchCurrentUserActionImpl() {
533
+ const sessionStore = await cookies();
534
+ const session = sessionStore.get("portal_session");
535
+ if (!session?.value) {
536
+ throw new Error("No session found");
537
+ }
538
+ const result = await fetchCurrentUser.run({ token: session.value });
539
+ return result.user;
540
+ }
541
+ var fetchCurrentUserAction = traceServerAction("fetchCurrentUserAction", fetchCurrentUserActionImpl);
542
+ async function updateUserActionImpl(data) {
543
+ const sessionStore = await cookies();
544
+ const session = sessionStore.get("portal_session");
545
+ if (!session?.value) {
546
+ throw new Error("No session found");
547
+ }
548
+ await updateUser.run({
549
+ token: session.value,
550
+ firstName: data.firstName,
551
+ lastName: data.lastName
552
+ });
553
+ revalidatePath("/user-settings");
554
+ return { success: true };
555
+ }
556
+ var updateUserAction = traceServerAction("updateUserAction", updateUserActionImpl);
557
+ async function fetchNotificationsActionImpl(customerId) {
558
+ const sessionStore = await cookies();
559
+ const session = sessionStore.get("portal_session");
560
+ if (!session?.value) {
561
+ throw new Error("No session found");
562
+ }
563
+ const result = await fetchNotifications.run({
564
+ token: session.value,
565
+ customerId
566
+ });
567
+ return result.notifications;
568
+ }
569
+ var fetchNotificationsAction = traceServerAction("fetchNotificationsAction", fetchNotificationsActionImpl);
570
+ async function updateNotificationsActionImpl(customerId, notifications) {
571
+ const sessionStore = await cookies();
572
+ const session = sessionStore.get("portal_session");
573
+ if (!session?.value) {
574
+ throw new Error("No session found");
575
+ }
576
+ const result = await updateNotifications.run({
577
+ token: session.value,
578
+ customerId,
579
+ notifications
580
+ });
581
+ return result.notifications;
582
+ }
583
+ var updateNotificationsAction = traceServerAction("updateNotificationsAction", updateNotificationsActionImpl);
584
+ async function fetchTeamsForUserSettingsImpl() {
585
+ const sessionStore = await cookies();
586
+ const session = sessionStore.get("portal_session");
587
+ if (!session?.value) {
588
+ return { teams: [], currentCustomerId: void 0 };
589
+ }
590
+ const token = session.value;
591
+ const currentCustomerId = getCustomerIdFromToken(token);
592
+ try {
593
+ const result = await fetchCustomers.run({ token });
594
+ const payload = decodeJwtPayload(token);
595
+ const appId = payload?.app_id || "";
596
+ const appSlug = payload?.app_slug || process.env.PORTAL_APP_SLUG || "";
597
+ const appName = appSlug;
598
+ const teams = result.customers.map((c) => ({
599
+ id: c.id,
600
+ name: c.name,
601
+ appId,
602
+ appName,
603
+ appSlug
604
+ }));
605
+ return { teams, currentCustomerId };
606
+ } catch (error) {
607
+ console.error("[fetch-teams-for-user-settings] Failed to fetch teams:", error);
608
+ return { teams: [], currentCustomerId };
609
+ }
610
+ }
611
+ var fetchTeamsForUserSettings = traceServerAction("fetchTeamsForUserSettings", fetchTeamsForUserSettingsImpl);
612
+
613
+ export { fetchCurrentUserAction, fetchNotificationsAction, fetchTeamsForUserSettings, updateNotificationsAction, updateUserAction };
614
+ //# sourceMappingURL=user-settings.js.map
615
+ //# sourceMappingURL=user-settings.js.map