@burdenoff/microfe-devportal 2026.915.3 → 2026.915.5

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.
@@ -2,24 +2,24 @@ import { useDevportal as e } from "../providers/DevportalProvider.js";
2
2
  import { useTr as t } from "../utils/i18n.js";
3
3
  import { cn as n } from "../utils/cn.js";
4
4
  import { useDevportalEventBus as r } from "../events/index.js";
5
- import { orgSectionPath as i, useIsSellerSection as a } from "../hooks/useIsSellerSection.js";
6
- import { useCreateBillingAccountMutation as ee, useCreateOrganizationMutation as te, useCreateSellerOrganizationMutation as o, useGetBillingAccountsByOrgQuery as s, useLinkDevOrgBillingAccountMutation as c } from "../../generated/global-operations.js";
5
+ import { orgSectionPath as i, useIsSellerSection as ee } from "../hooks/useIsSellerSection.js";
6
+ import { useCreateBillingAccountMutation as te, useCreateOrganizationMutation as a, useCreateSellerOrganizationMutation as o, useGetBillingAccountsByOrgQuery as s, useLinkDevOrgBillingAccountMutation as c } from "../../generated/global-operations.js";
7
7
  import { PageLayout as l, PageSection as u } from "../components/PageLayout.js";
8
- import { InputField as d, SelectField as f, TextareaField as p } from "../components/FormField.js";
9
- import { PermissionGuard as m } from "../components/PermissionGuard.js";
8
+ import { InputField as d, TextareaField as f } from "../components/FormField.js";
9
+ import { PermissionGuard as p } from "../components/PermissionGuard.js";
10
10
  import "../components/index.js";
11
- import { capitalizeCarrierName as h, useCarrierPickupLocations as g } from "../hooks/useCarrierPickupLocations.js";
11
+ import { capitalizeCarrierName as m, useCarrierPickupLocations as h } from "../hooks/useCarrierPickupLocations.js";
12
12
  import "../hooks/index.js";
13
- import { useEffect as _, useMemo as v, useState as y } from "react";
14
- import { Building2 as ne, Check as b, Link2 as re, Loader2 as x, X as S } from "lucide-react";
15
- import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
13
+ import { useEffect as g, useMemo as _, useState as v } from "react";
14
+ import { Building2 as y, Check as b, Link2 as x, Loader2 as S, X as C } from "lucide-react";
15
+ import { Fragment as w, jsx as T, jsxs as E } from "react/jsx-runtime";
16
16
  //#region src/devportal/pages/CreateOrganizationPage.tsx
17
- var E = () => {
18
- let { navigate: E, basePath: D, currentUser: O, tenantId: ie, setActiveOrgId: ae, setActivePhysicalOrgId: k } = e(), A = a(), j = t(), [M, N] = y({}), [P] = te(), [F] = o(), [I] = ee(), [L] = c(), R = r(), [z, B] = y("idle"), V = z !== "idle", [H, U] = y("auto"), [W, G] = y(null), { data: K, loading: q } = s({
17
+ var D = () => {
18
+ let { navigate: D, basePath: O, currentUser: ne, tenantId: re, setActiveOrgId: ie, setActivePhysicalOrgId: k } = e(), A = ee(), j = t(), [M, N] = v({}), [P] = a(), [F] = o(), [I] = te(), [L] = c(), R = r(), [z, B] = v("idle"), V = z !== "idle", [H, U] = v("auto"), [W, G] = v(null), { data: K, loading: q } = s({
19
19
  fetchPolicy: "cache-and-network",
20
- context: { headers: { "x-org-id": ie ?? "" } }
21
- }), J = v(() => K?.getBillingAccountsByOrg ?? [], [K]);
22
- _(() => {
20
+ context: { headers: { "x-org-id": re ?? "" } }
21
+ }), J = _(() => K?.getBillingAccountsByOrg ?? [], [K]);
22
+ g(() => {
23
23
  if (!(H !== "existing" || q)) {
24
24
  if (J.length === 0) {
25
25
  U("auto");
@@ -33,7 +33,7 @@ var E = () => {
33
33
  J,
34
34
  W
35
35
  ]);
36
- let [Y, X] = y({
36
+ let [Y, X] = v({
37
37
  name: "",
38
38
  slug: "",
39
39
  description: "",
@@ -41,14 +41,14 @@ var E = () => {
41
41
  contactEmail: "",
42
42
  supportEmail: "",
43
43
  pickupPostalCode: ""
44
- }), { locations: Z } = g(), Q = (e) => {
45
- E?.(`${D}${e}`);
46
- }, oe = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""), se = (e) => {
44
+ }), { locations: Z } = h(), Q = (e) => {
45
+ D?.(`${O}${e}`);
46
+ }, ae = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""), oe = (e) => {
47
47
  let t = e.target.value;
48
48
  X((e) => ({
49
49
  ...e,
50
50
  name: t,
51
- slug: e.slug || oe(t)
51
+ slug: e.slug || ae(t)
52
52
  })), M.name && N((e) => ({
53
53
  ...e,
54
54
  name: void 0
@@ -61,21 +61,21 @@ var E = () => {
61
61
  ...t,
62
62
  [e]: void 0
63
63
  }));
64
- }, ce = () => {
64
+ }, se = () => {
65
65
  let e = {};
66
66
  return Y.name.trim() ? Y.name.length < 2 ? e.name = j("devportal.orgNameTooShort", "Name must be at least 2 characters") : Y.name.length > 100 && (e.name = j("devportal.nameTooLong", "Name must be less than 100 characters")) : e.name = j("devportal.orgNameRequired", "Organization name is required"), Y.slug.trim() ? /^[a-z0-9-]+$/.test(Y.slug) || (e.slug = j("devportal.slugInvalid", "Slug can only contain lowercase letters, numbers, and hyphens")) : e.slug = j("devportal.slugRequired", "Slug is required"), Y.contactEmail && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(Y.contactEmail) && (e.contactEmail = j("devportal.invalidEmailAddress", "Invalid email address")), Y.supportEmail && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(Y.supportEmail) && (e.supportEmail = j("devportal.invalidEmailAddress", "Invalid email address")), N(e), Object.keys(e).length === 0;
67
67
  };
68
- return /* @__PURE__ */ w(m, {
68
+ return /* @__PURE__ */ T(p, {
69
69
  authOnly: !0,
70
- children: /* @__PURE__ */ w(l, {
70
+ children: /* @__PURE__ */ T(l, {
71
71
  title: j("devportal.createOrganization", "Create Organization"),
72
72
  description: A ? j("devportal.createSellerOrganizationDescription", "Set up a seller organization to start selling physical products") : j("devportal.createOrganizationDescription", "Set up a developer organization to collaborate with your team"),
73
73
  purpose: A ? j("devportal.createSellerOrganizationPurpose", "A seller organization is the shared owner of your physical listings, orders, and revenue. Create one here — you can invite members and complete legal/tax details afterwards.") : j("devportal.createOrganizationPurpose", "An organization is the shared owner of your apps, members, and revenue. Create one here so your team works under a single identity — pick a name and tier now; you can invite members and verify it afterwards."),
74
- backLink: `${D}${i(A)}`,
74
+ backLink: `${O}${i(A)}`,
75
75
  backLabel: j("devportal.backToOrganizations", "Back to Organizations"),
76
- children: /* @__PURE__ */ T("form", {
76
+ children: /* @__PURE__ */ E("form", {
77
77
  onSubmit: async (e) => {
78
- if (e.preventDefault(), ce()) {
78
+ if (e.preventDefault(), se()) {
79
79
  B("creating-org");
80
80
  try {
81
81
  let e = {
@@ -94,7 +94,7 @@ var E = () => {
94
94
  if (R.emit("devportal.org.created", {
95
95
  organizationId: t,
96
96
  name: Y.name
97
- }), A ? k(t) : ae(t), H === "existing" && W) {
97
+ }), A ? k(t) : ie(t), H === "existing" && W) {
98
98
  B("linking-billing");
99
99
  try {
100
100
  await L({ variables: {
@@ -107,7 +107,7 @@ var E = () => {
107
107
  try {
108
108
  let e = (await I({ variables: { input: {
109
109
  name: Y.name,
110
- email: O?.email ?? ""
110
+ email: ne?.email ?? ""
111
111
  } } })).data?.createBillingAccount?.id;
112
112
  e && await L({ variables: {
113
113
  organizationId: t,
@@ -123,22 +123,22 @@ var E = () => {
123
123
  },
124
124
  className: "space-y-8 max-w-3xl",
125
125
  children: [
126
- /* @__PURE__ */ w(u, {
126
+ /* @__PURE__ */ T(u, {
127
127
  title: j("devportal.organizationDetails", "Organization Details"),
128
128
  description: j("devportal.organizationDetailsDescription", "Basic information about your organization"),
129
- children: /* @__PURE__ */ T("div", {
129
+ children: /* @__PURE__ */ E("div", {
130
130
  className: "space-y-4",
131
131
  children: [
132
- /* @__PURE__ */ w(d, {
132
+ /* @__PURE__ */ T(d, {
133
133
  label: j("devportal.organizationName", "Organization Name"),
134
134
  value: Y.name,
135
- onChange: se,
135
+ onChange: oe,
136
136
  placeholder: j("devportal.organizationNamePlaceholder", "Acme Development"),
137
137
  required: !0,
138
138
  error: M.name,
139
139
  hint: j("devportal.organizationNameHint", "Your organization's display name")
140
140
  }),
141
- /* @__PURE__ */ w(d, {
141
+ /* @__PURE__ */ T(d, {
142
142
  label: j("devportal.slug", "Slug"),
143
143
  value: Y.slug,
144
144
  onChange: (e) => $("slug", e.target.value.toLowerCase()),
@@ -147,48 +147,41 @@ var E = () => {
147
147
  error: M.slug,
148
148
  hint: j("devportal.slugHint", "URL-friendly identifier (auto-generated from name)")
149
149
  }),
150
- /* @__PURE__ */ w(p, {
150
+ /* @__PURE__ */ T(f, {
151
151
  label: j("devportal.description", "Description"),
152
152
  value: Y.description,
153
153
  onChange: (e) => $("description", e.target.value),
154
154
  placeholder: j("devportal.orgDescriptionPlaceholder", "Tell us about your organization..."),
155
155
  rows: 3
156
156
  }),
157
- /* @__PURE__ */ w(d, {
157
+ /* @__PURE__ */ T(d, {
158
158
  label: j("devportal.websiteUrl", "Website URL"),
159
159
  type: "url",
160
160
  value: Y.websiteUrl,
161
161
  onChange: (e) => $("websiteUrl", e.target.value),
162
162
  placeholder: "https://example.com"
163
163
  }),
164
- A && Z.length > 0 && /* @__PURE__ */ w(f, {
165
- label: j("devportal.pickupPostalCode", "Pickup Pincode (optional)"),
166
- value: Y.pickupPostalCode,
167
- onChange: (e) => $("pickupPostalCode", e.target.value),
168
- placeholder: j("devportal.pickupPostalCodeUseBilling", "Use billing account address"),
169
- options: Z.map((e) => ({
170
- value: e.postalCode,
171
- label: `${e.label} — ${e.postalCode} · ${h(e.carrier)}`
172
- })),
173
- hint: j("devportal.pickupPostalCodeHint", "The postal code your physical orders actually ship from — used to quote real carrier shipping rates. You can skip this now and set it later from organization settings.")
174
- }),
175
- A && Z.length === 0 && /* @__PURE__ */ w(d, {
176
- label: j("devportal.pickupPostalCode", "Pickup Pincode (optional)"),
177
- value: Y.pickupPostalCode,
178
- onChange: (e) => $("pickupPostalCode", e.target.value),
179
- placeholder: "560001",
180
- hint: j("devportal.pickupPostalCodeHintFallback", "The postal code your physical orders actually ship from — used to quote real carrier shipping rates. You can skip this now and set it later from organization settings. (Live pickup-location list unavailable — enter your pincode manually.)")
181
- }),
182
- /* @__PURE__ */ T("div", {
164
+ A && (() => {
165
+ let e = Y.pickupPostalCode.trim(), t = Z.find((t) => t.postalCode === e), n = e.length === 0 || Z.length === 0 ? void 0 : t ? j("devportal.pickupPostalCodeRegistered", "Registered with {{carrier}} — ready for automated shipping.", { carrier: m(t.carrier) }) : j("devportal.pickupPostalCodeNotRegistered", "This pincode isn't registered with our shipping carrier yet — physical orders can't auto-ship until it's added. You can still save it now and set it up later.");
166
+ return /* @__PURE__ */ T(d, {
167
+ label: j("devportal.pickupPostalCode", "Pickup Pincode (optional)"),
168
+ value: Y.pickupPostalCode,
169
+ onChange: (e) => $("pickupPostalCode", e.target.value),
170
+ placeholder: "560001",
171
+ error: t ? void 0 : n,
172
+ hint: t ? n : j("devportal.pickupPostalCodeHint", "The postal code your physical orders actually ship from — used to quote real carrier shipping rates. You can skip this now and set it later from organization settings.")
173
+ });
174
+ })(),
175
+ /* @__PURE__ */ E("div", {
183
176
  className: "grid gap-4 sm:grid-cols-2",
184
- children: [/* @__PURE__ */ w(d, {
177
+ children: [/* @__PURE__ */ T(d, {
185
178
  label: j("devportal.contactEmail", "Contact Email"),
186
179
  type: "email",
187
180
  value: Y.contactEmail,
188
181
  onChange: (e) => $("contactEmail", e.target.value),
189
182
  placeholder: "contact@example.com",
190
183
  error: M.contactEmail
191
- }), /* @__PURE__ */ w(d, {
184
+ }), /* @__PURE__ */ T(d, {
192
185
  label: j("devportal.supportEmail", "Support Email"),
193
186
  type: "email",
194
187
  value: Y.supportEmail,
@@ -200,66 +193,66 @@ var E = () => {
200
193
  ]
201
194
  })
202
195
  }),
203
- /* @__PURE__ */ w(u, {
196
+ /* @__PURE__ */ T(u, {
204
197
  title: j("devportal.billingAccount", "Billing Account"),
205
198
  description: j("devportal.billingAccountSectionDescription", "Revenue from sales will be credited here. You can change this anytime from the Revenue page."),
206
- children: /* @__PURE__ */ T("div", {
199
+ children: /* @__PURE__ */ E("div", {
207
200
  className: "space-y-3",
208
201
  children: [
209
- /* @__PURE__ */ T("button", {
202
+ /* @__PURE__ */ E("button", {
210
203
  type: "button",
211
204
  onClick: () => U("auto"),
212
205
  disabled: V,
213
206
  className: n("flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50", H === "auto" ? "border-primary bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken"),
214
- children: [/* @__PURE__ */ w(b, {
207
+ children: [/* @__PURE__ */ T(b, {
215
208
  size: 16,
216
209
  className: n("mt-0.5 flex-shrink-0", H === "auto" ? "opacity-100 text-primary" : "opacity-0")
217
- }), /* @__PURE__ */ T("div", {
210
+ }), /* @__PURE__ */ E("div", {
218
211
  className: "flex-1 min-w-0",
219
- children: [/* @__PURE__ */ w("p", {
212
+ children: [/* @__PURE__ */ T("p", {
220
213
  className: "text-sm font-medium",
221
214
  children: j("devportal.billingAutoCreate", "Create a new billing account automatically")
222
- }), /* @__PURE__ */ w("p", {
215
+ }), /* @__PURE__ */ T("p", {
223
216
  className: "mt-0.5 text-xs text-text-secondary",
224
217
  children: j("devportal.billingAutoCreateHint", "We'll set one up using your organization name and account email. You can complete legal and tax details for payouts later in Organization Settings.")
225
218
  })]
226
219
  })]
227
220
  }),
228
- /* @__PURE__ */ T("button", {
221
+ /* @__PURE__ */ E("button", {
229
222
  type: "button",
230
223
  onClick: () => U("existing"),
231
224
  disabled: V || !q && J.length === 0,
232
225
  className: n("flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50", H === "existing" ? "border-primary bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken"),
233
- children: [/* @__PURE__ */ w(b, {
226
+ children: [/* @__PURE__ */ T(b, {
234
227
  size: 16,
235
228
  className: n("mt-0.5 flex-shrink-0", H === "existing" ? "opacity-100 text-primary" : "opacity-0")
236
- }), /* @__PURE__ */ T("div", {
229
+ }), /* @__PURE__ */ E("div", {
237
230
  className: "flex-1 min-w-0",
238
- children: [/* @__PURE__ */ T("p", {
231
+ children: [/* @__PURE__ */ E("p", {
239
232
  className: "flex items-center gap-1.5 text-sm font-medium",
240
- children: [/* @__PURE__ */ w(re, { size: 14 }), j("devportal.billingLinkExisting", "Link an existing billing account")]
241
- }), /* @__PURE__ */ w("p", {
233
+ children: [/* @__PURE__ */ T(x, { size: 14 }), j("devportal.billingLinkExisting", "Link an existing billing account")]
234
+ }), /* @__PURE__ */ T("p", {
242
235
  className: "mt-0.5 text-xs text-text-secondary",
243
236
  children: q ? j("devportal.billingAccountsLoading", "Loading your billing accounts...") : J.length === 0 ? j("devportal.noBillingAccountsYet", "You don't have any billing accounts yet — create one from account billing settings first.") : j("devportal.billingAccountsAvailable", "{{count}} billing account(s) available to link", { count: J.length })
244
237
  })]
245
238
  })]
246
239
  }),
247
- H === "existing" && J.length > 0 && /* @__PURE__ */ w("div", {
240
+ H === "existing" && J.length > 0 && /* @__PURE__ */ T("div", {
248
241
  className: "ml-8 space-y-2",
249
- children: J.map((e) => /* @__PURE__ */ T("button", {
242
+ children: J.map((e) => /* @__PURE__ */ E("button", {
250
243
  type: "button",
251
244
  disabled: V,
252
245
  onClick: () => G(e.id ?? null),
253
246
  className: n("flex w-full items-center gap-3 rounded-md border px-3 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", W === e.id ? "border-primary bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken"),
254
- children: [/* @__PURE__ */ w(b, {
247
+ children: [/* @__PURE__ */ T(b, {
255
248
  size: 14,
256
249
  className: n("flex-shrink-0", W === e.id ? "opacity-100 text-primary" : "opacity-0")
257
- }), /* @__PURE__ */ T("div", {
250
+ }), /* @__PURE__ */ E("div", {
258
251
  className: "min-w-0 flex-1",
259
- children: [/* @__PURE__ */ w("p", {
252
+ children: [/* @__PURE__ */ T("p", {
260
253
  className: "truncate font-medium",
261
254
  children: e.name
262
- }), e.isDefault && /* @__PURE__ */ w("p", {
255
+ }), e.isDefault && /* @__PURE__ */ T("p", {
263
256
  className: "text-xs text-text-secondary",
264
257
  children: j("devportal.revenue.defaultAccount", "Default")
265
258
  })]
@@ -269,10 +262,10 @@ var E = () => {
269
262
  ]
270
263
  })
271
264
  }),
272
- V && /* @__PURE__ */ T("div", {
265
+ V && /* @__PURE__ */ E("div", {
273
266
  className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-sunken px-4 py-3 text-sm text-text-secondary",
274
267
  children: [
275
- /* @__PURE__ */ w(x, {
268
+ /* @__PURE__ */ T(S, {
276
269
  size: 16,
277
270
  className: "flex-shrink-0 animate-spin text-primary"
278
271
  }),
@@ -282,26 +275,26 @@ var E = () => {
282
275
  z === "redirecting" && j("devportal.redirectingStatus", "All set — redirecting...")
283
276
  ]
284
277
  }),
285
- /* @__PURE__ */ T("div", {
278
+ /* @__PURE__ */ E("div", {
286
279
  className: "flex items-center justify-end gap-3 border-t pt-6",
287
- children: [/* @__PURE__ */ T("button", {
280
+ children: [/* @__PURE__ */ E("button", {
288
281
  type: "button",
289
282
  onClick: () => {
290
283
  Q(i(A));
291
284
  },
292
285
  disabled: V,
293
286
  className: "inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50",
294
- children: [/* @__PURE__ */ w(S, { size: 16 }), j("devportal.cancel", "Cancel")]
295
- }), /* @__PURE__ */ w("button", {
287
+ children: [/* @__PURE__ */ T(C, { size: 16 }), j("devportal.cancel", "Cancel")]
288
+ }), /* @__PURE__ */ T("button", {
296
289
  type: "submit",
297
290
  disabled: V,
298
291
  className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors disabled:opacity-50",
299
- children: V ? /* @__PURE__ */ T(C, { children: [
300
- /* @__PURE__ */ w("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent" }),
292
+ children: V ? /* @__PURE__ */ E(w, { children: [
293
+ /* @__PURE__ */ T("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent" }),
301
294
  z === "setting-up-billing" && j("devportal.settingUpBilling", "Setting up billing..."),
302
295
  z === "linking-billing" && j("devportal.linkingBilling", "Linking billing..."),
303
296
  (z === "creating-org" || z === "redirecting") && j("devportal.creating", "Creating...")
304
- ] }) : /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w(ne, { size: 16 }), j("devportal.createOrganization", "Create Organization")] })
297
+ ] }) : /* @__PURE__ */ E(w, { children: [/* @__PURE__ */ T(y, { size: 16 }), j("devportal.createOrganization", "Create Organization")] })
305
298
  })]
306
299
  })
307
300
  ]
@@ -310,6 +303,6 @@ var E = () => {
310
303
  });
311
304
  };
312
305
  //#endregion
313
- export { E as CreateOrganizationPage };
306
+ export { D as CreateOrganizationPage };
314
307
 
315
308
  //# sourceMappingURL=CreateOrganizationPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateOrganizationPage.js","names":[],"sources":["../../../src/devportal/pages/CreateOrganizationPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { X, Building2, Check, Link2, Loader2 } from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport {\n InputField,\n TextareaField,\n SelectField,\n} from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport {\n useIsSellerSection,\n orgSectionPath,\n} from \"../hooks/useIsSellerSection\";\nimport {\n useCarrierPickupLocations,\n capitalizeCarrierName,\n} from \"../hooks/useCarrierPickupLocations\";\nimport {\n useCreateOrganizationMutation,\n useCreateSellerOrganizationMutation,\n useGetBillingAccountsByOrgQuery,\n useLinkDevOrgBillingAccountMutation,\n} from \"../../generated/global-operations\";\nimport { useCreateBillingAccountMutation } from \"../hooks\";\nimport { useDevportalEventBus } from \"../events\";\nimport { cn } from \"../utils/cn\";\nimport { useTr } from \"../utils/i18n\";\n\ninterface CreateOrganizationFormData {\n name: string;\n slug: string;\n description: string;\n websiteUrl: string;\n contactEmail: string;\n supportEmail: string;\n /** PHYSICAL (seller) orgs only — optional, can be set/changed later too. */\n pickupPostalCode: string;\n}\n\ninterface FormErrors {\n name?: string;\n slug?: string;\n contactEmail?: string;\n supportEmail?: string;\n}\n\ntype SubmitPhase =\n | \"idle\"\n | \"creating-org\"\n | \"setting-up-billing\"\n | \"linking-billing\"\n | \"redirecting\";\n\n/**\n * Create new organization page — single step.\n * The user can either have a billing account auto-created and linked, or\n * link one of their existing billing accounts up front. Legal/tax details\n * are completed later from organization settings.\n */\nexport const CreateOrganizationPage: FC = () => {\n const {\n navigate,\n basePath,\n currentUser,\n tenantId,\n setActiveOrgId,\n setActivePhysicalOrgId,\n } = useDevportal();\n const isSeller = useIsSellerSection();\n const tr = useTr();\n const [errors, setErrors] = useState<FormErrors>({});\n // Shared page for both kinds — which mutation runs is the trust boundary\n // for DeveloperOrgKind (BOFF-7285): createSellerOrganization always makes\n // a PHYSICAL org, createDeveloperOrganization always makes DIGITAL. Both\n // hooks are called unconditionally (rules of hooks); only one is invoked.\n const [createOrganization] = useCreateOrganizationMutation();\n const [createSellerOrganization] = useCreateSellerOrganizationMutation();\n const [createBillingAccountMutation] = useCreateBillingAccountMutation();\n const [linkBillingAccount] = useLinkDevOrgBillingAccountMutation();\n const bus = useDevportalEventBus();\n\n // Multi-step status so the button/banner reflect the whole create flow —\n // not just the org-creation mutation's own loading flag, which flips back\n // to false before the (awaited) billing setup/link steps finish.\n const [phase, setPhase] = useState<SubmitPhase>(\"idle\");\n const isSubmitting = phase !== \"idle\";\n\n const [billingChoice, setBillingChoice] = useState<\"auto\" | \"existing\">(\n \"auto\",\n );\n const [selectedBillingAccountId, setSelectedBillingAccountId] = useState<\n string | null\n >(null);\n const { data: billingAccountsData, loading: billingAccountsLoading } =\n useGetBillingAccountsByOrgQuery({\n fetchPolicy: \"cache-and-network\",\n context: { headers: { \"x-org-id\": tenantId ?? \"\" } },\n });\n type BillingAccount = NonNullable<\n typeof billingAccountsData\n >[\"getBillingAccountsByOrg\"][number];\n const existingBillingAccounts: BillingAccount[] = useMemo(\n () => billingAccountsData?.getBillingAccountsByOrg ?? [],\n [billingAccountsData],\n );\n\n // Keep the \"existing account\" choice valid as the list loads: fall back to\n // auto-create if it turns out empty, and default-select once it arrives.\n useEffect(() => {\n if (billingChoice !== \"existing\" || billingAccountsLoading) return;\n if (existingBillingAccounts.length === 0) {\n setBillingChoice(\"auto\");\n return;\n }\n if (!selectedBillingAccountId) {\n setSelectedBillingAccountId(\n existingBillingAccounts.find((a) => a.isDefault)?.id ??\n existingBillingAccounts[0]?.id ??\n null,\n );\n }\n }, [\n billingChoice,\n billingAccountsLoading,\n existingBillingAccounts,\n selectedBillingAccountId,\n ]);\n\n const [formData, setFormData] = useState<CreateOrganizationFormData>({\n name: \"\",\n slug: \"\",\n description: \"\",\n websiteUrl: \"\",\n contactEmail: \"\",\n supportEmail: \"\",\n pickupPostalCode: \"\",\n });\n const { locations: pickupLocations } = useCarrierPickupLocations();\n\n const handleNavigate = (path: string) => {\n navigate?.(`${basePath}${path}`);\n };\n\n const generateSlug = (name: string): string => {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n };\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const name = e.target.value;\n setFormData((prev) => ({\n ...prev,\n name,\n slug: prev.slug || generateSlug(name),\n }));\n if (errors.name) {\n setErrors((prev) => ({ ...prev, name: undefined }));\n }\n };\n\n const handleChange = (\n field: keyof CreateOrganizationFormData,\n value: string,\n ) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n if (errors[field as keyof FormErrors]) {\n setErrors((prev) => ({ ...prev, [field]: undefined }));\n }\n };\n\n const validate = (): boolean => {\n const newErrors: FormErrors = {};\n\n if (!formData.name.trim()) {\n newErrors.name = tr(\n \"devportal.orgNameRequired\",\n \"Organization name is required\",\n );\n } else if (formData.name.length < 2) {\n newErrors.name = tr(\n \"devportal.orgNameTooShort\",\n \"Name must be at least 2 characters\",\n );\n } else if (formData.name.length > 100) {\n newErrors.name = tr(\n \"devportal.nameTooLong\",\n \"Name must be less than 100 characters\",\n );\n }\n\n if (!formData.slug.trim()) {\n newErrors.slug = tr(\"devportal.slugRequired\", \"Slug is required\");\n } else if (!/^[a-z0-9-]+$/.test(formData.slug)) {\n newErrors.slug = tr(\n \"devportal.slugInvalid\",\n \"Slug can only contain lowercase letters, numbers, and hyphens\",\n );\n }\n\n if (\n formData.contactEmail &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.contactEmail)\n ) {\n newErrors.contactEmail = tr(\n \"devportal.invalidEmailAddress\",\n \"Invalid email address\",\n );\n }\n\n if (\n formData.supportEmail &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.supportEmail)\n ) {\n newErrors.supportEmail = tr(\n \"devportal.invalidEmailAddress\",\n \"Invalid email address\",\n );\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!validate()) return;\n\n setPhase(\"creating-org\");\n try {\n const input = {\n name: formData.name,\n slug: formData.slug || undefined,\n description: formData.description || undefined,\n websiteUrl: formData.websiteUrl || undefined,\n contactEmail: formData.contactEmail || undefined,\n supportEmail: formData.supportEmail || undefined,\n // Only meaningful for PHYSICAL (seller) orgs — harmless to send\n // for DIGITAL orgs too since it's just left unset there.\n pickupPostalCode:\n (isSeller && formData.pickupPostalCode.trim()) || undefined,\n };\n\n const orgId = isSeller\n ? (await createSellerOrganization({ variables: { input } })).data\n ?.createSellerOrganization?.id\n : (await createOrganization({ variables: { input } })).data\n ?.createDeveloperOrganization?.id;\n\n if (!orgId) {\n setPhase(\"idle\");\n return;\n }\n\n bus.emit(\"devportal.org.created\", {\n organizationId: orgId,\n name: formData.name,\n });\n if (isSeller) {\n setActivePhysicalOrgId(orgId);\n } else {\n setActiveOrgId(orgId);\n }\n\n if (billingChoice === \"existing\" && selectedBillingAccountId) {\n setPhase(\"linking-billing\");\n try {\n await linkBillingAccount({\n variables: {\n organizationId: orgId,\n billingAccountId: selectedBillingAccountId,\n },\n });\n } catch {\n // non-blocking — can be linked later from the Revenue tab\n }\n } else {\n setPhase(\"setting-up-billing\");\n try {\n const billingResult = await createBillingAccountMutation({\n variables: {\n input: {\n name: formData.name,\n email: currentUser?.email ?? \"\",\n },\n },\n });\n const billingAccountId = billingResult.data?.createBillingAccount?.id;\n if (billingAccountId) {\n await linkBillingAccount({\n variables: { organizationId: orgId, billingAccountId },\n });\n }\n } catch {\n // non-blocking — can be linked later from the Revenue tab\n }\n }\n\n setPhase(\"redirecting\");\n handleNavigate(orgSectionPath(isSeller, orgId));\n } catch (error) {\n console.error(\"Failed to create organization:\", error);\n setPhase(\"idle\");\n }\n };\n\n const handleCancel = () => {\n handleNavigate(orgSectionPath(isSeller));\n };\n\n return (\n <PermissionGuard authOnly>\n <PageLayout\n title={tr(\"devportal.createOrganization\", \"Create Organization\")}\n description={\n isSeller\n ? tr(\n \"devportal.createSellerOrganizationDescription\",\n \"Set up a seller organization to start selling physical products\",\n )\n : tr(\n \"devportal.createOrganizationDescription\",\n \"Set up a developer organization to collaborate with your team\",\n )\n }\n purpose={\n isSeller\n ? tr(\n \"devportal.createSellerOrganizationPurpose\",\n \"A seller organization is the shared owner of your physical listings, orders, and revenue. Create one here — you can invite members and complete legal/tax details afterwards.\",\n )\n : tr(\n \"devportal.createOrganizationPurpose\",\n \"An organization is the shared owner of your apps, members, and revenue. Create one here so your team works under a single identity — pick a name and tier now; you can invite members and verify it afterwards.\",\n )\n }\n backLink={`${basePath}${orgSectionPath(isSeller)}`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n >\n <form onSubmit={handleSubmit} className=\"space-y-8 max-w-3xl\">\n {/* Organization Details */}\n <PageSection\n title={tr(\"devportal.organizationDetails\", \"Organization Details\")}\n description={tr(\n \"devportal.organizationDetailsDescription\",\n \"Basic information about your organization\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.organizationName\", \"Organization Name\")}\n value={formData.name}\n onChange={handleNameChange}\n placeholder={tr(\n \"devportal.organizationNamePlaceholder\",\n \"Acme Development\",\n )}\n required\n error={errors.name}\n hint={tr(\n \"devportal.organizationNameHint\",\n \"Your organization's display name\",\n )}\n />\n\n <InputField\n label={tr(\"devportal.slug\", \"Slug\")}\n value={formData.slug}\n onChange={(e) =>\n handleChange(\"slug\", e.target.value.toLowerCase())\n }\n placeholder={tr(\"devportal.orgSlugPlaceholder\", \"acme-dev\")}\n required\n error={errors.slug}\n hint={tr(\n \"devportal.slugHint\",\n \"URL-friendly identifier (auto-generated from name)\",\n )}\n />\n\n <TextareaField\n label={tr(\"devportal.description\", \"Description\")}\n value={formData.description}\n onChange={(e) => handleChange(\"description\", e.target.value)}\n placeholder={tr(\n \"devportal.orgDescriptionPlaceholder\",\n \"Tell us about your organization...\",\n )}\n rows={3}\n />\n\n <InputField\n label={tr(\"devportal.websiteUrl\", \"Website URL\")}\n type=\"url\"\n value={formData.websiteUrl}\n onChange={(e) => handleChange(\"websiteUrl\", e.target.value)}\n placeholder=\"https://example.com\"\n />\n\n {isSeller && pickupLocations.length > 0 && (\n <SelectField\n label={tr(\n \"devportal.pickupPostalCode\",\n \"Pickup Pincode (optional)\",\n )}\n value={formData.pickupPostalCode}\n onChange={(e) =>\n handleChange(\"pickupPostalCode\", e.target.value)\n }\n placeholder={tr(\n \"devportal.pickupPostalCodeUseBilling\",\n \"Use billing account address\",\n )}\n options={pickupLocations.map((location) => ({\n value: location.postalCode,\n label: `${location.label} — ${location.postalCode} · ${capitalizeCarrierName(location.carrier)}`,\n }))}\n hint={tr(\n \"devportal.pickupPostalCodeHint\",\n \"The postal code your physical orders actually ship from — used to quote real carrier shipping rates. You can skip this now and set it later from organization settings.\",\n )}\n />\n )}\n {isSeller && pickupLocations.length === 0 && (\n <InputField\n label={tr(\n \"devportal.pickupPostalCode\",\n \"Pickup Pincode (optional)\",\n )}\n value={formData.pickupPostalCode}\n onChange={(e) =>\n handleChange(\"pickupPostalCode\", e.target.value)\n }\n placeholder=\"560001\"\n hint={tr(\n \"devportal.pickupPostalCodeHintFallback\",\n \"The postal code your physical orders actually ship from — used to quote real carrier shipping rates. You can skip this now and set it later from organization settings. (Live pickup-location list unavailable — enter your pincode manually.)\",\n )}\n />\n )}\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.contactEmail\", \"Contact Email\")}\n type=\"email\"\n value={formData.contactEmail}\n onChange={(e) => handleChange(\"contactEmail\", e.target.value)}\n placeholder=\"contact@example.com\"\n error={errors.contactEmail}\n />\n\n <InputField\n label={tr(\"devportal.supportEmail\", \"Support Email\")}\n type=\"email\"\n value={formData.supportEmail}\n onChange={(e) => handleChange(\"supportEmail\", e.target.value)}\n placeholder=\"support@example.com\"\n error={errors.supportEmail}\n />\n </div>\n </div>\n </PageSection>\n\n {/* Billing Account */}\n <PageSection\n title={tr(\"devportal.billingAccount\", \"Billing Account\")}\n description={tr(\n \"devportal.billingAccountSectionDescription\",\n \"Revenue from sales will be credited here. You can change this anytime from the Revenue page.\",\n )}\n >\n <div className=\"space-y-3\">\n <button\n type=\"button\"\n onClick={() => setBillingChoice(\"auto\")}\n disabled={isSubmitting}\n className={cn(\n \"flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50\",\n billingChoice === \"auto\"\n ? \"border-primary bg-action-primary-bg/5\"\n : \"border-border-subtle hover:bg-bg-sunken\",\n )}\n >\n <Check\n size={16}\n className={cn(\n \"mt-0.5 flex-shrink-0\",\n billingChoice === \"auto\"\n ? \"opacity-100 text-primary\"\n : \"opacity-0\",\n )}\n />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium\">\n {tr(\n \"devportal.billingAutoCreate\",\n \"Create a new billing account automatically\",\n )}\n </p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {tr(\n \"devportal.billingAutoCreateHint\",\n \"We'll set one up using your organization name and account email. You can complete legal and tax details for payouts later in Organization Settings.\",\n )}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => setBillingChoice(\"existing\")}\n disabled={\n isSubmitting ||\n (!billingAccountsLoading &&\n existingBillingAccounts.length === 0)\n }\n className={cn(\n \"flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50\",\n billingChoice === \"existing\"\n ? \"border-primary bg-action-primary-bg/5\"\n : \"border-border-subtle hover:bg-bg-sunken\",\n )}\n >\n <Check\n size={16}\n className={cn(\n \"mt-0.5 flex-shrink-0\",\n billingChoice === \"existing\"\n ? \"opacity-100 text-primary\"\n : \"opacity-0\",\n )}\n />\n <div className=\"flex-1 min-w-0\">\n <p className=\"flex items-center gap-1.5 text-sm font-medium\">\n <Link2 size={14} />\n {tr(\n \"devportal.billingLinkExisting\",\n \"Link an existing billing account\",\n )}\n </p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {billingAccountsLoading\n ? tr(\n \"devportal.billingAccountsLoading\",\n \"Loading your billing accounts...\",\n )\n : existingBillingAccounts.length === 0\n ? tr(\n \"devportal.noBillingAccountsYet\",\n \"You don't have any billing accounts yet — create one from account billing settings first.\",\n )\n : tr(\n \"devportal.billingAccountsAvailable\",\n \"{{count}} billing account(s) available to link\",\n { count: existingBillingAccounts.length },\n )}\n </p>\n </div>\n </button>\n\n {billingChoice === \"existing\" &&\n existingBillingAccounts.length > 0 && (\n <div className=\"ml-8 space-y-2\">\n {existingBillingAccounts.map((account) => (\n <button\n key={account.id}\n type=\"button\"\n disabled={isSubmitting}\n onClick={() =>\n setSelectedBillingAccountId(account.id ?? null)\n }\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-3 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50\",\n selectedBillingAccountId === account.id\n ? \"border-primary bg-action-primary-bg/5\"\n : \"border-border-subtle hover:bg-bg-sunken\",\n )}\n >\n <Check\n size={14}\n className={cn(\n \"flex-shrink-0\",\n selectedBillingAccountId === account.id\n ? \"opacity-100 text-primary\"\n : \"opacity-0\",\n )}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium\">{account.name}</p>\n {account.isDefault && (\n <p className=\"text-xs text-text-secondary\">\n {tr(\n \"devportal.revenue.defaultAccount\",\n \"Default\",\n )}\n </p>\n )}\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n </PageSection>\n\n {/* Status while creating org + setting up billing */}\n {isSubmitting && (\n <div className=\"flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-sunken px-4 py-3 text-sm text-text-secondary\">\n <Loader2\n size={16}\n className=\"flex-shrink-0 animate-spin text-primary\"\n />\n {phase === \"creating-org\" &&\n tr(\n \"devportal.creatingOrgStatus\",\n \"Creating your organization...\",\n )}\n {phase === \"setting-up-billing\" &&\n tr(\n \"devportal.settingUpBillingStatus\",\n \"Setting up your billing account...\",\n )}\n {phase === \"linking-billing\" &&\n tr(\n \"devportal.linkingBillingStatus\",\n \"Linking your billing account...\",\n )}\n {phase === \"redirecting\" &&\n tr(\"devportal.redirectingStatus\", \"All set — redirecting...\")}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3 border-t pt-6\">\n <button\n type=\"button\"\n onClick={handleCancel}\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n <X size={16} />\n {tr(\"devportal.cancel\", \"Cancel\")}\n </button>\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <>\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {phase === \"setting-up-billing\" &&\n tr(\"devportal.settingUpBilling\", \"Setting up billing...\")}\n {phase === \"linking-billing\" &&\n tr(\"devportal.linkingBilling\", \"Linking billing...\")}\n {(phase === \"creating-org\" || phase === \"redirecting\") &&\n tr(\"devportal.creating\", \"Creating...\")}\n </>\n ) : (\n <>\n <Building2 size={16} />\n {tr(\"devportal.createOrganization\", \"Create Organization\")}\n </>\n )}\n </button>\n </div>\n </form>\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"CreateOrganizationPage.js","names":[],"sources":["../../../src/devportal/pages/CreateOrganizationPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { X, Building2, Check, Link2, Loader2 } from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { InputField, TextareaField } from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport {\n useIsSellerSection,\n orgSectionPath,\n} from \"../hooks/useIsSellerSection\";\nimport {\n useCarrierPickupLocations,\n capitalizeCarrierName,\n} from \"../hooks/useCarrierPickupLocations\";\nimport {\n useCreateOrganizationMutation,\n useCreateSellerOrganizationMutation,\n useGetBillingAccountsByOrgQuery,\n useLinkDevOrgBillingAccountMutation,\n} from \"../../generated/global-operations\";\nimport { useCreateBillingAccountMutation } from \"../hooks\";\nimport { useDevportalEventBus } from \"../events\";\nimport { cn } from \"../utils/cn\";\nimport { useTr } from \"../utils/i18n\";\n\ninterface CreateOrganizationFormData {\n name: string;\n slug: string;\n description: string;\n websiteUrl: string;\n contactEmail: string;\n supportEmail: string;\n /** PHYSICAL (seller) orgs only — optional, can be set/changed later too. */\n pickupPostalCode: string;\n}\n\ninterface FormErrors {\n name?: string;\n slug?: string;\n contactEmail?: string;\n supportEmail?: string;\n}\n\ntype SubmitPhase =\n | \"idle\"\n | \"creating-org\"\n | \"setting-up-billing\"\n | \"linking-billing\"\n | \"redirecting\";\n\n/**\n * Create new organization page — single step.\n * The user can either have a billing account auto-created and linked, or\n * link one of their existing billing accounts up front. Legal/tax details\n * are completed later from organization settings.\n */\nexport const CreateOrganizationPage: FC = () => {\n const {\n navigate,\n basePath,\n currentUser,\n tenantId,\n setActiveOrgId,\n setActivePhysicalOrgId,\n } = useDevportal();\n const isSeller = useIsSellerSection();\n const tr = useTr();\n const [errors, setErrors] = useState<FormErrors>({});\n // Shared page for both kinds — which mutation runs is the trust boundary\n // for DeveloperOrgKind (BOFF-7285): createSellerOrganization always makes\n // a PHYSICAL org, createDeveloperOrganization always makes DIGITAL. Both\n // hooks are called unconditionally (rules of hooks); only one is invoked.\n const [createOrganization] = useCreateOrganizationMutation();\n const [createSellerOrganization] = useCreateSellerOrganizationMutation();\n const [createBillingAccountMutation] = useCreateBillingAccountMutation();\n const [linkBillingAccount] = useLinkDevOrgBillingAccountMutation();\n const bus = useDevportalEventBus();\n\n // Multi-step status so the button/banner reflect the whole create flow —\n // not just the org-creation mutation's own loading flag, which flips back\n // to false before the (awaited) billing setup/link steps finish.\n const [phase, setPhase] = useState<SubmitPhase>(\"idle\");\n const isSubmitting = phase !== \"idle\";\n\n const [billingChoice, setBillingChoice] = useState<\"auto\" | \"existing\">(\n \"auto\",\n );\n const [selectedBillingAccountId, setSelectedBillingAccountId] = useState<\n string | null\n >(null);\n const { data: billingAccountsData, loading: billingAccountsLoading } =\n useGetBillingAccountsByOrgQuery({\n fetchPolicy: \"cache-and-network\",\n context: { headers: { \"x-org-id\": tenantId ?? \"\" } },\n });\n type BillingAccount = NonNullable<\n typeof billingAccountsData\n >[\"getBillingAccountsByOrg\"][number];\n const existingBillingAccounts: BillingAccount[] = useMemo(\n () => billingAccountsData?.getBillingAccountsByOrg ?? [],\n [billingAccountsData],\n );\n\n // Keep the \"existing account\" choice valid as the list loads: fall back to\n // auto-create if it turns out empty, and default-select once it arrives.\n useEffect(() => {\n if (billingChoice !== \"existing\" || billingAccountsLoading) return;\n if (existingBillingAccounts.length === 0) {\n setBillingChoice(\"auto\");\n return;\n }\n if (!selectedBillingAccountId) {\n setSelectedBillingAccountId(\n existingBillingAccounts.find((a) => a.isDefault)?.id ??\n existingBillingAccounts[0]?.id ??\n null,\n );\n }\n }, [\n billingChoice,\n billingAccountsLoading,\n existingBillingAccounts,\n selectedBillingAccountId,\n ]);\n\n const [formData, setFormData] = useState<CreateOrganizationFormData>({\n name: \"\",\n slug: \"\",\n description: \"\",\n websiteUrl: \"\",\n contactEmail: \"\",\n supportEmail: \"\",\n pickupPostalCode: \"\",\n });\n const { locations: pickupLocations } = useCarrierPickupLocations();\n\n const handleNavigate = (path: string) => {\n navigate?.(`${basePath}${path}`);\n };\n\n const generateSlug = (name: string): string => {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n };\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const name = e.target.value;\n setFormData((prev) => ({\n ...prev,\n name,\n slug: prev.slug || generateSlug(name),\n }));\n if (errors.name) {\n setErrors((prev) => ({ ...prev, name: undefined }));\n }\n };\n\n const handleChange = (\n field: keyof CreateOrganizationFormData,\n value: string,\n ) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n if (errors[field as keyof FormErrors]) {\n setErrors((prev) => ({ ...prev, [field]: undefined }));\n }\n };\n\n const validate = (): boolean => {\n const newErrors: FormErrors = {};\n\n if (!formData.name.trim()) {\n newErrors.name = tr(\n \"devportal.orgNameRequired\",\n \"Organization name is required\",\n );\n } else if (formData.name.length < 2) {\n newErrors.name = tr(\n \"devportal.orgNameTooShort\",\n \"Name must be at least 2 characters\",\n );\n } else if (formData.name.length > 100) {\n newErrors.name = tr(\n \"devportal.nameTooLong\",\n \"Name must be less than 100 characters\",\n );\n }\n\n if (!formData.slug.trim()) {\n newErrors.slug = tr(\"devportal.slugRequired\", \"Slug is required\");\n } else if (!/^[a-z0-9-]+$/.test(formData.slug)) {\n newErrors.slug = tr(\n \"devportal.slugInvalid\",\n \"Slug can only contain lowercase letters, numbers, and hyphens\",\n );\n }\n\n if (\n formData.contactEmail &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.contactEmail)\n ) {\n newErrors.contactEmail = tr(\n \"devportal.invalidEmailAddress\",\n \"Invalid email address\",\n );\n }\n\n if (\n formData.supportEmail &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.supportEmail)\n ) {\n newErrors.supportEmail = tr(\n \"devportal.invalidEmailAddress\",\n \"Invalid email address\",\n );\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!validate()) return;\n\n setPhase(\"creating-org\");\n try {\n const input = {\n name: formData.name,\n slug: formData.slug || undefined,\n description: formData.description || undefined,\n websiteUrl: formData.websiteUrl || undefined,\n contactEmail: formData.contactEmail || undefined,\n supportEmail: formData.supportEmail || undefined,\n // Only meaningful for PHYSICAL (seller) orgs — harmless to send\n // for DIGITAL orgs too since it's just left unset there.\n pickupPostalCode:\n (isSeller && formData.pickupPostalCode.trim()) || undefined,\n };\n\n const orgId = isSeller\n ? (await createSellerOrganization({ variables: { input } })).data\n ?.createSellerOrganization?.id\n : (await createOrganization({ variables: { input } })).data\n ?.createDeveloperOrganization?.id;\n\n if (!orgId) {\n setPhase(\"idle\");\n return;\n }\n\n bus.emit(\"devportal.org.created\", {\n organizationId: orgId,\n name: formData.name,\n });\n if (isSeller) {\n setActivePhysicalOrgId(orgId);\n } else {\n setActiveOrgId(orgId);\n }\n\n if (billingChoice === \"existing\" && selectedBillingAccountId) {\n setPhase(\"linking-billing\");\n try {\n await linkBillingAccount({\n variables: {\n organizationId: orgId,\n billingAccountId: selectedBillingAccountId,\n },\n });\n } catch {\n // non-blocking — can be linked later from the Revenue tab\n }\n } else {\n setPhase(\"setting-up-billing\");\n try {\n const billingResult = await createBillingAccountMutation({\n variables: {\n input: {\n name: formData.name,\n email: currentUser?.email ?? \"\",\n },\n },\n });\n const billingAccountId = billingResult.data?.createBillingAccount?.id;\n if (billingAccountId) {\n await linkBillingAccount({\n variables: { organizationId: orgId, billingAccountId },\n });\n }\n } catch {\n // non-blocking — can be linked later from the Revenue tab\n }\n }\n\n setPhase(\"redirecting\");\n handleNavigate(orgSectionPath(isSeller, orgId));\n } catch (error) {\n console.error(\"Failed to create organization:\", error);\n setPhase(\"idle\");\n }\n };\n\n const handleCancel = () => {\n handleNavigate(orgSectionPath(isSeller));\n };\n\n return (\n <PermissionGuard authOnly>\n <PageLayout\n title={tr(\"devportal.createOrganization\", \"Create Organization\")}\n description={\n isSeller\n ? tr(\n \"devportal.createSellerOrganizationDescription\",\n \"Set up a seller organization to start selling physical products\",\n )\n : tr(\n \"devportal.createOrganizationDescription\",\n \"Set up a developer organization to collaborate with your team\",\n )\n }\n purpose={\n isSeller\n ? tr(\n \"devportal.createSellerOrganizationPurpose\",\n \"A seller organization is the shared owner of your physical listings, orders, and revenue. Create one here — you can invite members and complete legal/tax details afterwards.\",\n )\n : tr(\n \"devportal.createOrganizationPurpose\",\n \"An organization is the shared owner of your apps, members, and revenue. Create one here so your team works under a single identity — pick a name and tier now; you can invite members and verify it afterwards.\",\n )\n }\n backLink={`${basePath}${orgSectionPath(isSeller)}`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n >\n <form onSubmit={handleSubmit} className=\"space-y-8 max-w-3xl\">\n {/* Organization Details */}\n <PageSection\n title={tr(\"devportal.organizationDetails\", \"Organization Details\")}\n description={tr(\n \"devportal.organizationDetailsDescription\",\n \"Basic information about your organization\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.organizationName\", \"Organization Name\")}\n value={formData.name}\n onChange={handleNameChange}\n placeholder={tr(\n \"devportal.organizationNamePlaceholder\",\n \"Acme Development\",\n )}\n required\n error={errors.name}\n hint={tr(\n \"devportal.organizationNameHint\",\n \"Your organization's display name\",\n )}\n />\n\n <InputField\n label={tr(\"devportal.slug\", \"Slug\")}\n value={formData.slug}\n onChange={(e) =>\n handleChange(\"slug\", e.target.value.toLowerCase())\n }\n placeholder={tr(\"devportal.orgSlugPlaceholder\", \"acme-dev\")}\n required\n error={errors.slug}\n hint={tr(\n \"devportal.slugHint\",\n \"URL-friendly identifier (auto-generated from name)\",\n )}\n />\n\n <TextareaField\n label={tr(\"devportal.description\", \"Description\")}\n value={formData.description}\n onChange={(e) => handleChange(\"description\", e.target.value)}\n placeholder={tr(\n \"devportal.orgDescriptionPlaceholder\",\n \"Tell us about your organization...\",\n )}\n rows={3}\n />\n\n <InputField\n label={tr(\"devportal.websiteUrl\", \"Website URL\")}\n type=\"url\"\n value={formData.websiteUrl}\n onChange={(e) => handleChange(\"websiteUrl\", e.target.value)}\n placeholder=\"https://example.com\"\n />\n\n {isSeller &&\n (() => {\n const trimmedPickup = formData.pickupPostalCode.trim();\n const registeredMatch = pickupLocations.find(\n (location) => location.postalCode === trimmedPickup,\n );\n const registrationHint =\n trimmedPickup.length === 0 || pickupLocations.length === 0\n ? undefined\n : registeredMatch\n ? tr(\n \"devportal.pickupPostalCodeRegistered\",\n \"Registered with {{carrier}} — ready for automated shipping.\",\n {\n carrier: capitalizeCarrierName(\n registeredMatch.carrier,\n ),\n },\n )\n : tr(\n \"devportal.pickupPostalCodeNotRegistered\",\n \"This pincode isn't registered with our shipping carrier yet — physical orders can't auto-ship until it's added. You can still save it now and set it up later.\",\n );\n return (\n <InputField\n label={tr(\n \"devportal.pickupPostalCode\",\n \"Pickup Pincode (optional)\",\n )}\n value={formData.pickupPostalCode}\n onChange={(e) =>\n handleChange(\"pickupPostalCode\", e.target.value)\n }\n placeholder=\"560001\"\n error={registeredMatch ? undefined : registrationHint}\n hint={\n registeredMatch\n ? registrationHint\n : tr(\n \"devportal.pickupPostalCodeHint\",\n \"The postal code your physical orders actually ship from — used to quote real carrier shipping rates. You can skip this now and set it later from organization settings.\",\n )\n }\n />\n );\n })()}\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.contactEmail\", \"Contact Email\")}\n type=\"email\"\n value={formData.contactEmail}\n onChange={(e) => handleChange(\"contactEmail\", e.target.value)}\n placeholder=\"contact@example.com\"\n error={errors.contactEmail}\n />\n\n <InputField\n label={tr(\"devportal.supportEmail\", \"Support Email\")}\n type=\"email\"\n value={formData.supportEmail}\n onChange={(e) => handleChange(\"supportEmail\", e.target.value)}\n placeholder=\"support@example.com\"\n error={errors.supportEmail}\n />\n </div>\n </div>\n </PageSection>\n\n {/* Billing Account */}\n <PageSection\n title={tr(\"devportal.billingAccount\", \"Billing Account\")}\n description={tr(\n \"devportal.billingAccountSectionDescription\",\n \"Revenue from sales will be credited here. You can change this anytime from the Revenue page.\",\n )}\n >\n <div className=\"space-y-3\">\n <button\n type=\"button\"\n onClick={() => setBillingChoice(\"auto\")}\n disabled={isSubmitting}\n className={cn(\n \"flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50\",\n billingChoice === \"auto\"\n ? \"border-primary bg-action-primary-bg/5\"\n : \"border-border-subtle hover:bg-bg-sunken\",\n )}\n >\n <Check\n size={16}\n className={cn(\n \"mt-0.5 flex-shrink-0\",\n billingChoice === \"auto\"\n ? \"opacity-100 text-primary\"\n : \"opacity-0\",\n )}\n />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium\">\n {tr(\n \"devportal.billingAutoCreate\",\n \"Create a new billing account automatically\",\n )}\n </p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {tr(\n \"devportal.billingAutoCreateHint\",\n \"We'll set one up using your organization name and account email. You can complete legal and tax details for payouts later in Organization Settings.\",\n )}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => setBillingChoice(\"existing\")}\n disabled={\n isSubmitting ||\n (!billingAccountsLoading &&\n existingBillingAccounts.length === 0)\n }\n className={cn(\n \"flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50\",\n billingChoice === \"existing\"\n ? \"border-primary bg-action-primary-bg/5\"\n : \"border-border-subtle hover:bg-bg-sunken\",\n )}\n >\n <Check\n size={16}\n className={cn(\n \"mt-0.5 flex-shrink-0\",\n billingChoice === \"existing\"\n ? \"opacity-100 text-primary\"\n : \"opacity-0\",\n )}\n />\n <div className=\"flex-1 min-w-0\">\n <p className=\"flex items-center gap-1.5 text-sm font-medium\">\n <Link2 size={14} />\n {tr(\n \"devportal.billingLinkExisting\",\n \"Link an existing billing account\",\n )}\n </p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {billingAccountsLoading\n ? tr(\n \"devportal.billingAccountsLoading\",\n \"Loading your billing accounts...\",\n )\n : existingBillingAccounts.length === 0\n ? tr(\n \"devportal.noBillingAccountsYet\",\n \"You don't have any billing accounts yet — create one from account billing settings first.\",\n )\n : tr(\n \"devportal.billingAccountsAvailable\",\n \"{{count}} billing account(s) available to link\",\n { count: existingBillingAccounts.length },\n )}\n </p>\n </div>\n </button>\n\n {billingChoice === \"existing\" &&\n existingBillingAccounts.length > 0 && (\n <div className=\"ml-8 space-y-2\">\n {existingBillingAccounts.map((account) => (\n <button\n key={account.id}\n type=\"button\"\n disabled={isSubmitting}\n onClick={() =>\n setSelectedBillingAccountId(account.id ?? null)\n }\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-3 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50\",\n selectedBillingAccountId === account.id\n ? \"border-primary bg-action-primary-bg/5\"\n : \"border-border-subtle hover:bg-bg-sunken\",\n )}\n >\n <Check\n size={14}\n className={cn(\n \"flex-shrink-0\",\n selectedBillingAccountId === account.id\n ? \"opacity-100 text-primary\"\n : \"opacity-0\",\n )}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium\">{account.name}</p>\n {account.isDefault && (\n <p className=\"text-xs text-text-secondary\">\n {tr(\n \"devportal.revenue.defaultAccount\",\n \"Default\",\n )}\n </p>\n )}\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n </PageSection>\n\n {/* Status while creating org + setting up billing */}\n {isSubmitting && (\n <div className=\"flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-sunken px-4 py-3 text-sm text-text-secondary\">\n <Loader2\n size={16}\n className=\"flex-shrink-0 animate-spin text-primary\"\n />\n {phase === \"creating-org\" &&\n tr(\n \"devportal.creatingOrgStatus\",\n \"Creating your organization...\",\n )}\n {phase === \"setting-up-billing\" &&\n tr(\n \"devportal.settingUpBillingStatus\",\n \"Setting up your billing account...\",\n )}\n {phase === \"linking-billing\" &&\n tr(\n \"devportal.linkingBillingStatus\",\n \"Linking your billing account...\",\n )}\n {phase === \"redirecting\" &&\n tr(\"devportal.redirectingStatus\", \"All set — redirecting...\")}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3 border-t pt-6\">\n <button\n type=\"button\"\n onClick={handleCancel}\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n <X size={16} />\n {tr(\"devportal.cancel\", \"Cancel\")}\n </button>\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <>\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {phase === \"setting-up-billing\" &&\n tr(\"devportal.settingUpBilling\", \"Setting up billing...\")}\n {phase === \"linking-billing\" &&\n tr(\"devportal.linkingBilling\", \"Linking billing...\")}\n {(phase === \"creating-org\" || phase === \"redirecting\") &&\n tr(\"devportal.creating\", \"Creating...\")}\n </>\n ) : (\n <>\n <Building2 size={16} />\n {tr(\"devportal.createOrganization\", \"Create Organization\")}\n </>\n )}\n </button>\n </div>\n </form>\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OrganizationDetailPage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/OrganizationDetailPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AA2QhC;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,EAqVpC,CAAC"}
1
+ {"version":3,"file":"OrganizationDetailPage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/OrganizationDetailPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAwQhC;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,EAqVpC,CAAC"}