@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
@@ -6,7 +6,40 @@ import { Buffer } from 'buffer';
6
6
  * Enterprise Portal Components
7
7
  * This file is generated by tsup. Do not edit manually.
8
8
  */
9
+ var __defProp = Object.defineProperty;
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+
15
+ // datadog/tracer.ts
16
+ var tracer_exports = {};
17
+ __export(tracer_exports, {
18
+ default: () => tracer_default
19
+ });
20
+ var tracer_default;
9
21
 
22
+ // src/utils/constants.ts
23
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
24
+ function useCopyToClipboard(resetDelay = 2e3) {
25
+ const [copied, setCopied] = useState(false);
26
+ const copy = useCallback(async (text) => {
27
+ if (!navigator.clipboard) {
28
+ console.warn("[useCopyToClipboard] Clipboard API not available");
29
+ return false;
30
+ }
31
+ try {
32
+ await navigator.clipboard.writeText(text);
33
+ setCopied(true);
34
+ setTimeout(() => setCopied(false), resetDelay);
35
+ return true;
36
+ } catch (error) {
37
+ console.error("[useCopyToClipboard] Failed to copy:", error);
38
+ return false;
39
+ }
40
+ }, [resetDelay]);
41
+ return { copy, copied };
42
+ }
10
43
  var LINUX_INSTALL_SERVICE_ACCOUNT_KEY = "linux_install_service_account";
11
44
  var LINUX_INSTALL_OPTIONS_KEY = "linux_install_options";
12
45
  var navigateTo = (href) => {
@@ -19,19 +52,12 @@ var navigateTo = (href) => {
19
52
  console.error("[linux-install-wizard] navigation failed", error);
20
53
  }
21
54
  };
22
- var copyToClipboard = async (text) => {
23
- try {
24
- await navigator.clipboard.writeText(text);
25
- return true;
26
- } catch {
27
- return false;
28
- }
29
- };
30
- var StepIndicator = ({ step }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-3", children: [
55
+ var StepIndicator = ({ step, primaryColor = DEFAULT_SECONDARY_COLOR }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-3", children: [
31
56
  /* @__PURE__ */ jsx(
32
57
  "div",
33
58
  {
34
- className: `flex h-10 w-10 items-center justify-center rounded-full border-2 ${step > 1 ? "border-gray-900 bg-gray-900 text-white" : "border-indigo-500"}`,
59
+ className: `flex h-10 w-10 items-center justify-center rounded-full border-2 ${step > 1 ? "border-gray-900 bg-gray-900 text-white" : ""}`,
60
+ style: step === 1 ? { borderColor: primaryColor } : void 0,
35
61
  children: step > 1 ? /* @__PURE__ */ jsx(
36
62
  "svg",
37
63
  {
@@ -43,7 +69,7 @@ var StepIndicator = ({ step }) => /* @__PURE__ */ jsxs("div", { className: "flex
43
69
  strokeWidth: "2",
44
70
  children: /* @__PURE__ */ jsx("path", { d: "m3.5 8 3 3 6-6" })
45
71
  }
46
- ) : /* @__PURE__ */ jsx("span", { className: "h-2.5 w-2.5 rounded-full bg-indigo-500" })
72
+ ) : /* @__PURE__ */ jsx("span", { className: "h-2.5 w-2.5 rounded-full", style: { backgroundColor: primaryColor } })
47
73
  }
48
74
  ),
49
75
  /* @__PURE__ */ jsx("div", { className: `h-0.5 w-12 ${step > 1 ? "bg-gray-900" : "bg-gray-200"}` }),
@@ -59,13 +85,11 @@ var CodeBlock = ({
59
85
  command,
60
86
  onCopy
61
87
  }) => {
62
- const [copied, setCopied] = useState(false);
88
+ const { copy, copied } = useCopyToClipboard();
63
89
  const handleCopy = async () => {
64
- const success = await copyToClipboard(command);
90
+ const success = await copy(command);
65
91
  if (success) {
66
- setCopied(true);
67
92
  onCopy?.();
68
- setTimeout(() => setCopied(false), 2e3);
69
93
  }
70
94
  };
71
95
  return /* @__PURE__ */ jsxs("div", { className: "group relative ml-8 mt-2 min-w-0", children: [
@@ -87,11 +111,12 @@ var VersionDropdown = ({
87
111
  selectedRelease,
88
112
  onSelect,
89
113
  isLoading,
90
- error
114
+ error,
115
+ primaryColor = DEFAULT_SECONDARY_COLOR
91
116
  }) => {
92
117
  if (isLoading) {
93
118
  return /* @__PURE__ */ jsxs("div", { className: "ml-8 flex items-center gap-2 text-sm text-gray-500", children: [
94
- /* @__PURE__ */ jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" }),
119
+ /* @__PURE__ */ jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } }),
95
120
  "Loading versions..."
96
121
  ] });
97
122
  }
@@ -131,13 +156,14 @@ var InstallationInstructions = ({
131
156
  instructions,
132
157
  isLoading,
133
158
  completedSteps = {},
134
- isProxy = false
159
+ isProxy = false,
160
+ primaryColor = DEFAULT_SECONDARY_COLOR
135
161
  }) => {
136
162
  if (isLoading && !instructions?.steps?.length) {
137
163
  return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
138
164
  /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-gray-900", children: "Installation Instructions" }),
139
165
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-gray-500", children: [
140
- /* @__PURE__ */ jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" }),
166
+ /* @__PURE__ */ jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } }),
141
167
  "Loading instructions..."
142
168
  ] })
143
169
  ] });
@@ -147,10 +173,10 @@ var InstallationInstructions = ({
147
173
  }
148
174
  const stepOffset = isProxy ? 3 : 2;
149
175
  console.debug("[InstallationInstructions] Rendering with stepOffset", { isProxy, stepOffset, stepsCount: instructions?.steps?.length });
150
- return /* @__PURE__ */ jsxs("div", { className: `min-w-0 space-y-4 transition-opacity duration-150 ${isLoading ? "opacity-60" : ""}`, children: [
176
+ return /* @__PURE__ */ jsxs("div", { className: `min-w-0 space-y-4 transition-opacity duration-200 ${isLoading ? "opacity-60" : ""}`, children: [
151
177
  /* @__PURE__ */ jsxs("h3", { className: "text-lg font-semibold text-gray-900", children: [
152
178
  "Installation Instructions",
153
- isLoading && /* @__PURE__ */ jsx("span", { className: "ml-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" })
179
+ isLoading && /* @__PURE__ */ jsx("span", { className: "ml-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } })
154
180
  ] }),
155
181
  /* @__PURE__ */ jsx("ol", { className: "min-w-0 space-y-6 text-sm text-gray-700", children: instructions.steps.map((step, index) => {
156
182
  const completableStepNames = ["download_assets", "install"];
@@ -158,7 +184,7 @@ var InstallationInstructions = ({
158
184
  const isCompleted = canComplete && completedSteps[step.step_name];
159
185
  return /* @__PURE__ */ jsxs("li", { className: "space-y-2", children: [
160
186
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
161
- /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold text-indigo-500", children: index + stepOffset }),
187
+ /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20`, color: primaryColor }, children: index + stepOffset }),
162
188
  /* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900", children: step.title }),
163
189
  canComplete && /* @__PURE__ */ jsx(
164
190
  "span",
@@ -177,13 +203,14 @@ var InstallationInstructions = ({
177
203
  };
178
204
  var LinuxInstallWizard = ({
179
205
  token,
206
+ primaryColor = DEFAULT_SECONDARY_COLOR,
207
+ secondaryColor = DEFAULT_SECONDARY_COLOR,
180
208
  createServiceAccountAction,
181
209
  fetchChannelReleasesAction,
182
210
  createInstallOptionsAction,
183
211
  getInstallOptionsAction,
184
212
  updateInstallOptionsAction,
185
213
  onStepChange,
186
- onNetworkChange,
187
214
  onInstallOptionsIdChange,
188
215
  initialStep,
189
216
  initialNetwork,
@@ -233,20 +260,39 @@ var LinuxInstallWizard = ({
233
260
  }
234
261
  prevInitialStepRef.current = initialStep;
235
262
  }, [initialStep]);
263
+ const hasHydratedNetworkRef = useRef(false);
236
264
  useEffect(() => {
237
- if (initialNetwork !== void 0 && initialNetwork !== networkAvailability) {
265
+ if (!hasHydratedNetworkRef.current && initialNetwork !== void 0) {
238
266
  setNetworkAvailability(initialNetwork);
267
+ hasHydratedNetworkRef.current = true;
239
268
  }
240
- }, [initialNetwork, networkAvailability]);
269
+ }, [initialNetwork]);
270
+ const hasMountedRef = useRef(false);
271
+ const prevStepRef = useRef(step);
272
+ const prevInstallOptionsIdRef = useRef(installOptionsId);
241
273
  useEffect(() => {
242
- onStepChange?.(step);
243
- }, [step, onStepChange]);
274
+ hasMountedRef.current = true;
275
+ }, []);
244
276
  useEffect(() => {
245
- onNetworkChange?.(networkAvailability);
246
- }, [networkAvailability, onNetworkChange]);
277
+ if (!hasMountedRef.current) {
278
+ prevStepRef.current = step;
279
+ return;
280
+ }
281
+ if (step !== prevStepRef.current) {
282
+ onStepChange?.(step);
283
+ prevStepRef.current = step;
284
+ }
285
+ }, [step, onStepChange]);
247
286
  useEffect(() => {
248
- onInstallOptionsIdChange?.(installOptionsId, networkAvailability, "linux");
249
- }, [installOptionsId, networkAvailability, onInstallOptionsIdChange]);
287
+ if (!hasMountedRef.current) {
288
+ prevInstallOptionsIdRef.current = installOptionsId;
289
+ return;
290
+ }
291
+ if (installOptionsId !== prevInstallOptionsIdRef.current) {
292
+ onInstallOptionsIdChange?.(installOptionsId, "linux");
293
+ prevInstallOptionsIdRef.current = installOptionsId;
294
+ }
295
+ }, [installOptionsId, onInstallOptionsIdChange]);
250
296
  useEffect(() => {
251
297
  selectedReleaseRef.current = selectedRelease;
252
298
  }, [selectedRelease]);
@@ -292,6 +338,9 @@ var LinuxInstallWizard = ({
292
338
  if (!selectedRelease || !installOptionsId || !updateInstallOptionsAction) {
293
339
  return;
294
340
  }
341
+ if (!hasResumedInstallation.current) {
342
+ return;
343
+ }
295
344
  const channelId = selectedRelease.channelId;
296
345
  const sequence = selectedRelease.channelSequence;
297
346
  if (lastUpdateRef.current.channelId === channelId && lastUpdateRef.current.sequence === sequence) {
@@ -341,6 +390,9 @@ var LinuxInstallWizard = ({
341
390
  });
342
391
  return;
343
392
  }
393
+ if (!hasResumedInstallation.current) {
394
+ return;
395
+ }
344
396
  console.debug("[linux-install-wizard] Proxy URL changed, will regenerate instructions after 500ms", { proxyUrl });
345
397
  const timeoutId = setTimeout(async () => {
346
398
  const currentRelease = selectedReleaseRef.current;
@@ -393,6 +445,7 @@ var LinuxInstallWizard = ({
393
445
  });
394
446
  if (result.instance_name) {
395
447
  setInstanceName(result.instance_name);
448
+ setOriginalInstanceName(result.instance_name);
396
449
  }
397
450
  if (result.service_account_id) {
398
451
  setServiceAccountId(result.service_account_id);
@@ -474,6 +527,13 @@ var LinuxInstallWizard = ({
474
527
  setIsCreatingServiceAccount(true);
475
528
  try {
476
529
  const trimmedInstanceName = instanceName.trim();
530
+ console.debug("[linux-install-wizard] handleContinue - checking conditions", {
531
+ serviceAccountId: !!serviceAccountId,
532
+ originalInstanceName,
533
+ trimmedInstanceName,
534
+ networkAvailability,
535
+ installOptionsId: !!installOptionsId
536
+ });
477
537
  if (serviceAccountId && originalInstanceName === trimmedInstanceName && installOptionsId && updateInstallOptionsAction) {
478
538
  console.debug("[linux-install-wizard] Reusing existing service account, updating install options...");
479
539
  const firstRelease = embeddedClusterReleases[0];
@@ -482,6 +542,8 @@ var LinuxInstallWizard = ({
482
542
  installOptionsId,
483
543
  channelId: firstRelease?.channelId,
484
544
  channelReleaseSequence: firstRelease?.channelSequence,
545
+ networkAvailability,
546
+ // Pass current network availability
485
547
  includeInstructions: true
486
548
  });
487
549
  if (firstRelease) {
@@ -494,7 +556,7 @@ var LinuxInstallWizard = ({
494
556
  if (result.instructions) {
495
557
  setInstructions(result.instructions);
496
558
  }
497
- console.debug("[linux-install-wizard] Transitioning to step 2 (reused service account)");
559
+ console.debug("[linux-install-wizard] Transitioning to step 2 (updated install options)");
498
560
  setStep(2);
499
561
  onStepChange?.(2);
500
562
  return;
@@ -541,11 +603,9 @@ var LinuxInstallWizard = ({
541
603
  if (installOptionsResult.instructions) {
542
604
  setInstructions(installOptionsResult.instructions);
543
605
  }
544
- onInstallOptionsIdChange?.(optionsId, networkAvailability, "linux");
545
606
  }
546
607
  console.debug("[linux-install-wizard] Transitioning to step 2");
547
608
  setStep(2);
548
- onStepChange?.(2);
549
609
  } catch (error) {
550
610
  console.error("[linux-install-wizard] Failed to continue", error);
551
611
  const errorMessage = error instanceof Error ? error.message : "Failed to continue";
@@ -576,7 +636,7 @@ var LinuxInstallWizard = ({
576
636
  console.error("[linux-install-wizard] Failed to save admin console URL", error);
577
637
  }
578
638
  }
579
- navigateTo("/update");
639
+ navigateTo("/updates/checking");
580
640
  }, [installOptionsId, updateInstallOptionsAction, adminConsoleUrl, token]);
581
641
  const handleReleaseSelect = useCallback((release) => {
582
642
  setSelectedRelease(release);
@@ -584,14 +644,14 @@ var LinuxInstallWizard = ({
584
644
  const isProxy = networkAvailability === "proxy";
585
645
  if (step === 2) {
586
646
  return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
587
- /* @__PURE__ */ jsx(StepIndicator, { step: 2 }),
647
+ /* @__PURE__ */ jsx(StepIndicator, { step: 2, primaryColor }),
588
648
  /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-2xl border border-gray-100 bg-gray-50 p-6", children: /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-6", children: [
589
649
  /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
590
650
  /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold text-gray-900", children: isProxy ? "Linux Single Node Proxy Install" : "Linux Single Node Online Install" }),
591
651
  /* @__PURE__ */ jsxs("div", { className: "mt-6 space-y-6", children: [
592
652
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
593
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-indigo-500", children: [
594
- /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold", children: "1" }),
653
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", style: { color: primaryColor }, children: [
654
+ /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20` }, children: "1" }),
595
655
  /* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900", children: "Select a version" })
596
656
  ] }),
597
657
  /* @__PURE__ */ jsx(
@@ -601,13 +661,14 @@ var LinuxInstallWizard = ({
601
661
  selectedRelease,
602
662
  onSelect: handleReleaseSelect,
603
663
  isLoading: isLoadingReleases,
604
- error: releasesError
664
+ error: releasesError,
665
+ primaryColor
605
666
  }
606
667
  )
607
668
  ] }),
608
669
  isProxy && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
609
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-indigo-500", children: [
610
- /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold", children: "2" }),
670
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", style: { color: primaryColor }, children: [
671
+ /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20` }, children: "2" }),
611
672
  /* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900", children: "Configure proxy URL" })
612
673
  ] }),
613
674
  /* @__PURE__ */ jsx(
@@ -626,12 +687,13 @@ var LinuxInstallWizard = ({
626
687
  instructions,
627
688
  isLoading: isLoadingInstructions,
628
689
  completedSteps,
629
- isProxy
690
+ isProxy,
691
+ primaryColor
630
692
  }
631
693
  ),
632
694
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
633
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-indigo-500", children: [
634
- /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold", children: (instructions?.steps?.length ?? 0) + (isProxy ? 3 : 2) }),
695
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", style: { color: primaryColor }, children: [
696
+ /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20` }, children: (instructions?.steps?.length ?? 0) + (isProxy ? 3 : 2) }),
635
697
  /* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900", children: "(Optional) Add the Admin Console URL" })
636
698
  ] }),
637
699
  /* @__PURE__ */ jsx(
@@ -663,7 +725,8 @@ var LinuxInstallWizard = ({
663
725
  {
664
726
  type: "button",
665
727
  onClick: handleFinish,
666
- className: "rounded-xl bg-indigo-500 px-4 py-2 font-medium text-white transition hover:bg-indigo-600",
728
+ className: "rounded-xl px-4 py-2 font-medium text-white transition hover:brightness-90",
729
+ style: { backgroundColor: primaryColor },
667
730
  children: "Finish"
668
731
  }
669
732
  )
@@ -674,7 +737,8 @@ var LinuxInstallWizard = ({
674
737
  /* @__PURE__ */ jsx(
675
738
  "a",
676
739
  {
677
- className: "text-indigo-500 hover:text-indigo-600",
740
+ className: "hover:opacity-80",
741
+ style: { color: secondaryColor },
678
742
  href: supportPortalLink,
679
743
  target: "_blank",
680
744
  rel: "noopener noreferrer",
@@ -686,7 +750,7 @@ var LinuxInstallWizard = ({
686
750
  ] });
687
751
  }
688
752
  return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
689
- /* @__PURE__ */ jsx(StepIndicator, { step: 1 }),
753
+ /* @__PURE__ */ jsx(StepIndicator, { step: 1, primaryColor }),
690
754
  /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-gray-100 bg-gray-50 p-6", children: [
691
755
  /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
692
756
  /* @__PURE__ */ jsxs("label", { className: "block text-sm font-medium text-gray-700", children: [
@@ -755,7 +819,8 @@ var LinuxInstallWizard = ({
755
819
  type: "button",
756
820
  onClick: handleContinue,
757
821
  disabled: isCreatingServiceAccount,
758
- className: "rounded-xl bg-indigo-500 px-4 py-2 font-medium text-white transition hover:bg-indigo-600 disabled:cursor-not-allowed disabled:opacity-50",
822
+ className: "rounded-xl px-4 py-2 font-medium text-white transition-opacity duration-200 hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",
823
+ style: { backgroundColor: primaryColor },
759
824
  children: isCreatingServiceAccount ? "Creating..." : "Continue"
760
825
  }
761
826
  )
@@ -788,8 +853,17 @@ async function handle401() {
788
853
  const { redirect } = await import('next/navigation');
789
854
  return redirect("/?expired=1");
790
855
  }
856
+ function isErrorPage(url) {
857
+ try {
858
+ const urlObj = new URL(url);
859
+ return urlObj.pathname === "/error";
860
+ } catch {
861
+ return url === "/error" || url.startsWith("/error?");
862
+ }
863
+ }
791
864
  async function handleServerError(statusCode) {
792
865
  const { redirect } = await import('next/navigation');
866
+ const { cookies } = await import('next/headers');
793
867
  let sourceUrl;
794
868
  try {
795
869
  const { headers } = await import('next/headers');
@@ -797,12 +871,20 @@ async function handleServerError(statusCode) {
797
871
  const referer = headersList.get("referer");
798
872
  const host = headersList.get("host");
799
873
  const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
800
- if (referer) {
874
+ if (referer && !isErrorPage(referer)) {
801
875
  sourceUrl = referer;
802
876
  } else if (host && pathname) {
803
877
  const protocol = headersList.get("x-forwarded-proto") || "https";
804
878
  sourceUrl = `${protocol}://${host}${pathname}`;
805
879
  }
880
+ if (!sourceUrl || isErrorPage(sourceUrl)) {
881
+ const cookieStore = await cookies();
882
+ const preservedSource = cookieStore.get("portal_error_source");
883
+ if (preservedSource?.value) {
884
+ sourceUrl = decodeURIComponent(preservedSource.value);
885
+ cookieStore.delete("portal_error_source");
886
+ }
887
+ }
806
888
  } catch (error) {
807
889
  console.debug("[portal-components] Could not determine source URL", error);
808
890
  }
@@ -813,90 +895,6 @@ async function handleServerError(statusCode) {
813
895
  return redirect(`/error?${params.toString()}`);
814
896
  }
815
897
 
816
- // src/actions/index.ts
817
- var getApiOrigin = () => {
818
- return (process.env.REPLICATED_APP_ORIGIN || "https://replicated.app").replace(/\/+$/, "");
819
- };
820
- var defineServerAction = (definition) => definition;
821
- var createServiceAccount = defineServerAction({
822
- id: "service-account/create",
823
- description: "Creates a service account for installing applications",
824
- visibility: "customer",
825
- tags: ["service-account", "install"],
826
- async run({ token, name }) {
827
- if (!token || typeof token !== "string") {
828
- throw new Error("Service account creation requires a session token");
829
- }
830
- if (!name || typeof name !== "string" || !name.trim()) {
831
- throw new Error("Service account name is required");
832
- }
833
- const endpoint = `${getApiOrigin()}/enterprise-portal/team/service-accounts`;
834
- if (process.env.NODE_ENV !== "production") {
835
- console.debug(
836
- "[portal-components] creating service account via %s (Enterprise Portal API)",
837
- endpoint
838
- );
839
- }
840
- const response = await authenticatedFetch(endpoint, {
841
- method: "POST",
842
- token,
843
- headers: {
844
- "content-type": "application/json"
845
- },
846
- body: JSON.stringify({ account_name: name.trim() })
847
- });
848
- if (!response.ok) {
849
- const errorText = await response.text();
850
- throw new Error(
851
- `Service account creation failed (${response.status} ${response.statusText}): ${errorText}`
852
- );
853
- }
854
- const data = await response.json();
855
- return data;
856
- }
857
- });
858
- var fetchCustomBrandingImpl = async () => {
859
- const appSlug = process.env.PORTAL_APP_SLUG;
860
- if (!appSlug) {
861
- throw new Error("PORTAL_APP_SLUG is not configured");
862
- }
863
- const url = `${getApiOrigin()}/enterprise-portal/public/branding?app_slug=${encodeURIComponent(
864
- appSlug
865
- )}`;
866
- if (process.env.NODE_ENV !== "production") {
867
- console.debug(
868
- "[portal-components] fetching custom branding via %s (Enterprise Portal API)",
869
- url
870
- );
871
- }
872
- const response = await fetch(url, {
873
- headers: {
874
- accept: "application/json"
875
- }
876
- });
877
- if (!response.ok) {
878
- throw new Error(
879
- `Custom branding request failed (${response.status} ${response.statusText})`
880
- );
881
- }
882
- const payload = await response.json();
883
- const brandingObject = {
884
- logo: payload.logoUrl,
885
- title: payload.appName,
886
- customColor1: payload.primaryColor,
887
- customColor2: payload.secondaryColor,
888
- favicon: payload.faviconUrl,
889
- supportPortalLink: payload.supportPortalLink || ""
890
- };
891
- const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
892
- return {
893
- brandingData,
894
- documentation: null
895
- // Documentation not included in new API's public endpoint
896
- };
897
- };
898
- cache(fetchCustomBrandingImpl);
899
-
900
898
  // src/actions/install.ts
901
899
  async function fetchChannelReleases(input, context) {
902
900
  const { token, channelId } = input;
@@ -1133,6 +1131,94 @@ function filterEmbeddedClusterReleases(releases) {
1133
1131
  );
1134
1132
  }
1135
1133
 
1134
+ // src/actions/index.ts
1135
+ var getApiOrigin = () => {
1136
+ return (process.env.REPLICATED_APP_ORIGIN || "https://replicated.app").replace(/\/+$/, "");
1137
+ };
1138
+ var defineServerAction = (definition) => definition;
1139
+ var createServiceAccount = defineServerAction({
1140
+ id: "service-account/create",
1141
+ description: "Creates a service account for installing applications",
1142
+ visibility: "customer",
1143
+ tags: ["service-account", "install"],
1144
+ async run({ token, name }) {
1145
+ if (!token || typeof token !== "string") {
1146
+ throw new Error("Service account creation requires a session token");
1147
+ }
1148
+ if (!name || typeof name !== "string" || !name.trim()) {
1149
+ throw new Error("Service account name is required");
1150
+ }
1151
+ const endpoint = `${getApiOrigin()}/enterprise-portal/team/service-accounts`;
1152
+ if (process.env.NODE_ENV !== "production") {
1153
+ console.debug(
1154
+ "[portal-components] creating service account via %s (Enterprise Portal API)",
1155
+ endpoint
1156
+ );
1157
+ }
1158
+ const response = await authenticatedFetch(endpoint, {
1159
+ method: "POST",
1160
+ token,
1161
+ headers: {
1162
+ "content-type": "application/json"
1163
+ },
1164
+ body: JSON.stringify({ account_name: name.trim() })
1165
+ });
1166
+ if (!response.ok) {
1167
+ const errorText = await response.text();
1168
+ throw new Error(
1169
+ `Service account creation failed (${response.status} ${response.statusText}): ${errorText}`
1170
+ );
1171
+ }
1172
+ const data = await response.json();
1173
+ return data;
1174
+ }
1175
+ });
1176
+ var fetchCustomBrandingImpl = async () => {
1177
+ const appSlug = process.env.PORTAL_APP_SLUG;
1178
+ if (!appSlug) {
1179
+ throw new Error("PORTAL_APP_SLUG is not configured");
1180
+ }
1181
+ const url = `${getApiOrigin()}/enterprise-portal/public/branding?app_slug=${encodeURIComponent(
1182
+ appSlug
1183
+ )}`;
1184
+ if (process.env.NODE_ENV !== "production") {
1185
+ console.debug(
1186
+ "[portal-components] fetching custom branding via %s (Enterprise Portal API)",
1187
+ url
1188
+ );
1189
+ }
1190
+ const response = await fetch(url, {
1191
+ headers: {
1192
+ accept: "application/json"
1193
+ }
1194
+ });
1195
+ if (!response.ok) {
1196
+ throw new Error(
1197
+ `Custom branding request failed (${response.status} ${response.statusText})`
1198
+ );
1199
+ }
1200
+ const payload = await response.json();
1201
+ const brandingObject = {
1202
+ logo: payload.logoUrl,
1203
+ title: payload.title,
1204
+ primaryColor: payload.primaryColor,
1205
+ secondaryColor: payload.secondaryColor,
1206
+ favicon: payload.faviconUrl,
1207
+ supportPortalLink: payload.supportPortalLink || "",
1208
+ background: payload.background,
1209
+ backgroundImage: payload.backgroundImage,
1210
+ customColor1: payload.customColor1,
1211
+ customColor2: payload.customColor2
1212
+ };
1213
+ const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
1214
+ return {
1215
+ brandingData,
1216
+ documentation: null
1217
+ // Documentation not included in new API's public endpoint
1218
+ };
1219
+ };
1220
+ cache(fetchCustomBrandingImpl);
1221
+
1136
1222
  export { LINUX_INSTALL_OPTIONS_KEY, LINUX_INSTALL_SERVICE_ACCOUNT_KEY, LinuxInstallWizard, createInstallOptions, createServiceAccount, fetchChannelReleases, filterEmbeddedClusterReleases, getInstallOptions, updateInstallOptions };
1137
1223
  //# sourceMappingURL=linux-install-wizard.js.map
1138
1224
  //# sourceMappingURL=linux-install-wizard.js.map