@burdenoff/microfe-devportal 2026.914.2 → 2026.914.4

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 (54) hide show
  1. package/dist/devportal/DevportalRoutes.d.ts.map +1 -1
  2. package/dist/devportal/DevportalRoutes.js +130 -110
  3. package/dist/devportal/DevportalRoutes.js.map +1 -1
  4. package/dist/devportal/components/SectionNav.d.ts +10 -1
  5. package/dist/devportal/components/SectionNav.d.ts.map +1 -1
  6. package/dist/devportal/components/SectionNav.js +60 -42
  7. package/dist/devportal/components/SectionNav.js.map +1 -1
  8. package/dist/devportal/hooks/useIsSellerSection.d.ts +13 -0
  9. package/dist/devportal/hooks/useIsSellerSection.d.ts.map +1 -0
  10. package/dist/devportal/hooks/useIsSellerSection.js +15 -0
  11. package/dist/devportal/hooks/useIsSellerSection.js.map +1 -0
  12. package/dist/devportal/pages/CreateApplicationPage.d.ts.map +1 -1
  13. package/dist/devportal/pages/CreateApplicationPage.js +5 -1
  14. package/dist/devportal/pages/CreateApplicationPage.js.map +1 -1
  15. package/dist/devportal/pages/CreateOrganizationPage.d.ts +3 -2
  16. package/dist/devportal/pages/CreateOrganizationPage.d.ts.map +1 -1
  17. package/dist/devportal/pages/CreateOrganizationPage.js +225 -122
  18. package/dist/devportal/pages/CreateOrganizationPage.js.map +1 -1
  19. package/dist/devportal/pages/CreatePhysicalItemPage.d.ts.map +1 -1
  20. package/dist/devportal/pages/CreatePhysicalItemPage.js +371 -205
  21. package/dist/devportal/pages/CreatePhysicalItemPage.js.map +1 -1
  22. package/dist/devportal/pages/DashboardPage.d.ts.map +1 -1
  23. package/dist/devportal/pages/DashboardPage.js +1 -1
  24. package/dist/devportal/pages/DashboardPage.js.map +1 -1
  25. package/dist/devportal/pages/EditPhysicalItemPage.d.ts.map +1 -1
  26. package/dist/devportal/pages/EditPhysicalItemPage.js +427 -168
  27. package/dist/devportal/pages/EditPhysicalItemPage.js.map +1 -1
  28. package/dist/devportal/pages/OrganizationDetailPage.d.ts.map +1 -1
  29. package/dist/devportal/pages/OrganizationDetailPage.js +361 -346
  30. package/dist/devportal/pages/OrganizationDetailPage.js.map +1 -1
  31. package/dist/devportal/pages/OrganizationMembersPage.d.ts.map +1 -1
  32. package/dist/devportal/pages/OrganizationMembersPage.js +291 -290
  33. package/dist/devportal/pages/OrganizationMembersPage.js.map +1 -1
  34. package/dist/devportal/pages/OrganizationsPage.d.ts.map +1 -1
  35. package/dist/devportal/pages/OrganizationsPage.js +102 -101
  36. package/dist/devportal/pages/OrganizationsPage.js.map +1 -1
  37. package/dist/devportal/pages/RevenueDashboardPage.d.ts.map +1 -1
  38. package/dist/devportal/pages/RevenueDashboardPage.js +210 -209
  39. package/dist/devportal/pages/RevenueDashboardPage.js.map +1 -1
  40. package/dist/devportal/pages/SellerDashboardPage.d.ts.map +1 -1
  41. package/dist/devportal/pages/SellerDashboardPage.js.map +1 -1
  42. package/dist/devportal/pages/SettingsPage.d.ts.map +1 -1
  43. package/dist/devportal/pages/SettingsPage.js +1 -1
  44. package/dist/devportal/pages/SettingsPage.js.map +1 -1
  45. package/dist/devportal/types/index.d.ts +1 -0
  46. package/dist/devportal/types/index.d.ts.map +1 -1
  47. package/dist/devportal/types/index.js.map +1 -1
  48. package/dist/generated/global-operations.d.ts +103 -12
  49. package/dist/generated/global-operations.d.ts.map +1 -1
  50. package/dist/generated/global-operations.js +108 -92
  51. package/dist/generated/global-operations.js.map +1 -1
  52. package/dist/generated/global-types.d.ts +2963 -242
  53. package/dist/generated/global-types.d.ts.map +1 -1
  54. package/package.json +1 -1
@@ -1,183 +1,286 @@
1
1
  import { useDevportal as e } from "../providers/DevportalProvider.js";
2
- import { useDevportalEventBus as t } from "../events/index.js";
3
- import { useCreateBillingAccountMutation as n, useCreateOrganizationMutation as r, useLinkDevOrgBillingAccountMutation as i } from "../../generated/global-operations.js";
4
- import { PageLayout as a, PageSection as o } from "../components/PageLayout.js";
5
- import { InputField as s, TextareaField as c } from "../components/FormField.js";
6
- import { PermissionGuard as l } from "../components/PermissionGuard.js";
2
+ import { useTr as t } from "../utils/i18n.js";
3
+ import { cn as n } from "../utils/cn.js";
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 o, useCreateOrganizationMutation as s, useCreateSellerOrganizationMutation as c, useGetBillingAccountsByOrgQuery as l, useLinkDevOrgBillingAccountMutation as u } from "../../generated/global-operations.js";
7
+ import { PageLayout as d, PageSection as f } from "../components/PageLayout.js";
8
+ import { InputField as p, TextareaField as m } from "../components/FormField.js";
9
+ import { PermissionGuard as h } from "../components/PermissionGuard.js";
7
10
  import "../components/index.js";
8
11
  import "../hooks/index.js";
9
- import { useState as u } from "react";
10
- import { Building2 as d, Info as f, X as p } from "lucide-react";
11
- import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
12
- import { useI18n as _ } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
+ import { useEffect as g, useMemo as _, useState as v } from "react";
13
+ import { Building2 as y, Check as b, Link2 as x, Loader2 as S, X as ee } from "lucide-react";
14
+ import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
13
15
  //#region src/devportal/pages/CreateOrganizationPage.tsx
14
- var v = () => {
15
- let { navigate: v, basePath: y, currentUser: b } = e(), { t: x } = _(), S = (e, t) => {
16
- let n = x(e);
17
- return n === e ? t : n;
18
- }, [C, w] = u({}), [T, { loading: E }] = r(), [D] = n(), [O] = i(), k = t(), [A, j] = u({
16
+ var E = () => {
17
+ let { navigate: E, basePath: D, currentUser: O, tenantId: k, setActiveOrgId: A, setActivePhysicalOrgId: te } = e(), j = a(), M = t(), [N, P] = v({}), [F] = s(), [I] = c(), [L] = o(), [R] = u(), z = r(), [B, V] = v("idle"), H = B !== "idle", [U, W] = v("auto"), [G, K] = v(null), { data: q, loading: J } = l({
18
+ fetchPolicy: "cache-and-network",
19
+ context: { headers: { "x-org-id": k ?? "" } }
20
+ }), Y = _(() => q?.getBillingAccountsByOrg ?? [], [q]);
21
+ g(() => {
22
+ if (!(U !== "existing" || J)) {
23
+ if (Y.length === 0) {
24
+ W("auto");
25
+ return;
26
+ }
27
+ G || K(Y.find((e) => e.isDefault)?.id ?? Y[0]?.id ?? null);
28
+ }
29
+ }, [
30
+ U,
31
+ J,
32
+ Y,
33
+ G
34
+ ]);
35
+ let [X, Z] = v({
19
36
  name: "",
20
37
  slug: "",
21
38
  description: "",
22
39
  websiteUrl: "",
23
40
  contactEmail: "",
24
41
  supportEmail: ""
25
- }), M = (e) => {
26
- v?.(`${y}${e}`);
27
- }, N = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""), P = (e) => {
42
+ }), Q = (e) => {
43
+ E?.(`${D}${e}`);
44
+ }, ne = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""), re = (e) => {
28
45
  let t = e.target.value;
29
- j((e) => ({
46
+ Z((e) => ({
30
47
  ...e,
31
48
  name: t,
32
- slug: e.slug || N(t)
33
- })), C.name && w((e) => ({
49
+ slug: e.slug || ne(t)
50
+ })), N.name && P((e) => ({
34
51
  ...e,
35
52
  name: void 0
36
53
  }));
37
- }, F = (e, t) => {
38
- j((n) => ({
54
+ }, $ = (e, t) => {
55
+ Z((n) => ({
39
56
  ...n,
40
57
  [e]: t
41
- })), C[e] && w((t) => ({
58
+ })), N[e] && P((t) => ({
42
59
  ...t,
43
60
  [e]: void 0
44
61
  }));
45
- }, I = () => {
62
+ }, ie = () => {
46
63
  let e = {};
47
- return A.name.trim() ? A.name.length < 2 ? e.name = S("devportal.orgNameTooShort", "Name must be at least 2 characters") : A.name.length > 100 && (e.name = S("devportal.nameTooLong", "Name must be less than 100 characters")) : e.name = S("devportal.orgNameRequired", "Organization name is required"), A.slug.trim() ? /^[a-z0-9-]+$/.test(A.slug) || (e.slug = S("devportal.slugInvalid", "Slug can only contain lowercase letters, numbers, and hyphens")) : e.slug = S("devportal.slugRequired", "Slug is required"), A.contactEmail && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(A.contactEmail) && (e.contactEmail = S("devportal.invalidEmailAddress", "Invalid email address")), A.supportEmail && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(A.supportEmail) && (e.supportEmail = S("devportal.invalidEmailAddress", "Invalid email address")), w(e), Object.keys(e).length === 0;
64
+ return X.name.trim() ? X.name.length < 2 ? e.name = M("devportal.orgNameTooShort", "Name must be at least 2 characters") : X.name.length > 100 && (e.name = M("devportal.nameTooLong", "Name must be less than 100 characters")) : e.name = M("devportal.orgNameRequired", "Organization name is required"), X.slug.trim() ? /^[a-z0-9-]+$/.test(X.slug) || (e.slug = M("devportal.slugInvalid", "Slug can only contain lowercase letters, numbers, and hyphens")) : e.slug = M("devportal.slugRequired", "Slug is required"), X.contactEmail && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(X.contactEmail) && (e.contactEmail = M("devportal.invalidEmailAddress", "Invalid email address")), X.supportEmail && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(X.supportEmail) && (e.supportEmail = M("devportal.invalidEmailAddress", "Invalid email address")), P(e), Object.keys(e).length === 0;
48
65
  };
49
- return /* @__PURE__ */ h(l, {
66
+ return /* @__PURE__ */ w(h, {
50
67
  authOnly: !0,
51
- children: /* @__PURE__ */ h(a, {
52
- title: S("devportal.createOrganization", "Create Organization"),
53
- description: S("devportal.createOrganizationDescription", "Set up a developer organization to collaborate with your team"),
54
- purpose: S("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."),
55
- backLink: `${y}/organizations`,
56
- backLabel: S("devportal.backToOrganizations", "Back to Organizations"),
57
- children: /* @__PURE__ */ g("form", {
68
+ children: /* @__PURE__ */ w(d, {
69
+ title: M("devportal.createOrganization", "Create Organization"),
70
+ description: j ? M("devportal.createSellerOrganizationDescription", "Set up a seller organization to start selling physical products") : M("devportal.createOrganizationDescription", "Set up a developer organization to collaborate with your team"),
71
+ purpose: j ? M("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.") : M("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."),
72
+ backLink: `${D}${i(j)}`,
73
+ backLabel: M("devportal.backToOrganizations", "Back to Organizations"),
74
+ children: /* @__PURE__ */ T("form", {
58
75
  onSubmit: async (e) => {
59
- if (e.preventDefault(), I()) try {
60
- let e = (await T({ variables: { input: {
61
- name: A.name,
62
- slug: A.slug || void 0,
63
- description: A.description || void 0,
64
- websiteUrl: A.websiteUrl || void 0,
65
- contactEmail: A.contactEmail || void 0,
66
- supportEmail: A.supportEmail || void 0
67
- } } })).data?.createDeveloperOrganization?.id;
68
- if (e) {
69
- k.emit("devportal.org.created", {
70
- organizationId: e,
71
- name: A.name
72
- });
73
- try {
74
- let t = (await D({ variables: { input: {
75
- name: A.name,
76
- email: b?.email ?? ""
77
- } } })).data?.createBillingAccount?.id;
78
- t && await O({ variables: {
79
- organizationId: e,
80
- billingAccountId: t
81
- } });
82
- } catch {}
83
- M(`/organizations/${e}`);
76
+ if (e.preventDefault(), ie()) {
77
+ V("creating-org");
78
+ try {
79
+ let e = {
80
+ name: X.name,
81
+ slug: X.slug || void 0,
82
+ description: X.description || void 0,
83
+ websiteUrl: X.websiteUrl || void 0,
84
+ contactEmail: X.contactEmail || void 0,
85
+ supportEmail: X.supportEmail || void 0
86
+ }, t = j ? (await I({ variables: { input: e } })).data?.createSellerOrganization?.id : (await F({ variables: { input: e } })).data?.createDeveloperOrganization?.id;
87
+ if (!t) {
88
+ V("idle");
89
+ return;
90
+ }
91
+ if (z.emit("devportal.org.created", {
92
+ organizationId: t,
93
+ name: X.name
94
+ }), j ? te(t) : A(t), U === "existing" && G) {
95
+ V("linking-billing");
96
+ try {
97
+ await R({ variables: {
98
+ organizationId: t,
99
+ billingAccountId: G
100
+ } });
101
+ } catch {}
102
+ } else {
103
+ V("setting-up-billing");
104
+ try {
105
+ let e = (await L({ variables: { input: {
106
+ name: X.name,
107
+ email: O?.email ?? ""
108
+ } } })).data?.createBillingAccount?.id;
109
+ e && await R({ variables: {
110
+ organizationId: t,
111
+ billingAccountId: e
112
+ } });
113
+ } catch {}
114
+ }
115
+ V("redirecting"), Q(i(j, t));
116
+ } catch (e) {
117
+ console.error("Failed to create organization:", e), V("idle");
84
118
  }
85
- } catch (e) {
86
- console.error("Failed to create organization:", e);
87
119
  }
88
120
  },
89
121
  className: "space-y-8 max-w-3xl",
90
122
  children: [
91
- /* @__PURE__ */ h(o, {
92
- title: S("devportal.organizationDetails", "Organization Details"),
93
- description: S("devportal.organizationDetailsDescription", "Basic information about your organization"),
94
- children: /* @__PURE__ */ g("div", {
123
+ /* @__PURE__ */ w(f, {
124
+ title: M("devportal.organizationDetails", "Organization Details"),
125
+ description: M("devportal.organizationDetailsDescription", "Basic information about your organization"),
126
+ children: /* @__PURE__ */ T("div", {
95
127
  className: "space-y-4",
96
128
  children: [
97
- /* @__PURE__ */ h(s, {
98
- label: S("devportal.organizationName", "Organization Name"),
99
- value: A.name,
100
- onChange: P,
101
- placeholder: S("devportal.organizationNamePlaceholder", "Acme Development"),
129
+ /* @__PURE__ */ w(p, {
130
+ label: M("devportal.organizationName", "Organization Name"),
131
+ value: X.name,
132
+ onChange: re,
133
+ placeholder: M("devportal.organizationNamePlaceholder", "Acme Development"),
102
134
  required: !0,
103
- error: C.name,
104
- hint: S("devportal.organizationNameHint", "Your organization's display name")
135
+ error: N.name,
136
+ hint: M("devportal.organizationNameHint", "Your organization's display name")
105
137
  }),
106
- /* @__PURE__ */ h(s, {
107
- label: S("devportal.slug", "Slug"),
108
- value: A.slug,
109
- onChange: (e) => F("slug", e.target.value.toLowerCase()),
110
- placeholder: S("devportal.orgSlugPlaceholder", "acme-dev"),
138
+ /* @__PURE__ */ w(p, {
139
+ label: M("devportal.slug", "Slug"),
140
+ value: X.slug,
141
+ onChange: (e) => $("slug", e.target.value.toLowerCase()),
142
+ placeholder: M("devportal.orgSlugPlaceholder", "acme-dev"),
111
143
  required: !0,
112
- error: C.slug,
113
- hint: S("devportal.slugHint", "URL-friendly identifier (auto-generated from name)")
144
+ error: N.slug,
145
+ hint: M("devportal.slugHint", "URL-friendly identifier (auto-generated from name)")
114
146
  }),
115
- /* @__PURE__ */ h(c, {
116
- label: S("devportal.description", "Description"),
117
- value: A.description,
118
- onChange: (e) => F("description", e.target.value),
119
- placeholder: S("devportal.orgDescriptionPlaceholder", "Tell us about your organization..."),
147
+ /* @__PURE__ */ w(m, {
148
+ label: M("devportal.description", "Description"),
149
+ value: X.description,
150
+ onChange: (e) => $("description", e.target.value),
151
+ placeholder: M("devportal.orgDescriptionPlaceholder", "Tell us about your organization..."),
120
152
  rows: 3
121
153
  }),
122
- /* @__PURE__ */ h(s, {
123
- label: S("devportal.websiteUrl", "Website URL"),
154
+ /* @__PURE__ */ w(p, {
155
+ label: M("devportal.websiteUrl", "Website URL"),
124
156
  type: "url",
125
- value: A.websiteUrl,
126
- onChange: (e) => F("websiteUrl", e.target.value),
157
+ value: X.websiteUrl,
158
+ onChange: (e) => $("websiteUrl", e.target.value),
127
159
  placeholder: "https://example.com"
128
160
  }),
129
- /* @__PURE__ */ g("div", {
161
+ /* @__PURE__ */ T("div", {
130
162
  className: "grid gap-4 sm:grid-cols-2",
131
- children: [/* @__PURE__ */ h(s, {
132
- label: S("devportal.contactEmail", "Contact Email"),
163
+ children: [/* @__PURE__ */ w(p, {
164
+ label: M("devportal.contactEmail", "Contact Email"),
133
165
  type: "email",
134
- value: A.contactEmail,
135
- onChange: (e) => F("contactEmail", e.target.value),
166
+ value: X.contactEmail,
167
+ onChange: (e) => $("contactEmail", e.target.value),
136
168
  placeholder: "contact@example.com",
137
- error: C.contactEmail
138
- }), /* @__PURE__ */ h(s, {
139
- label: S("devportal.supportEmail", "Support Email"),
169
+ error: N.contactEmail
170
+ }), /* @__PURE__ */ w(p, {
171
+ label: M("devportal.supportEmail", "Support Email"),
140
172
  type: "email",
141
- value: A.supportEmail,
142
- onChange: (e) => F("supportEmail", e.target.value),
173
+ value: X.supportEmail,
174
+ onChange: (e) => $("supportEmail", e.target.value),
143
175
  placeholder: "support@example.com",
144
- error: C.supportEmail
176
+ error: N.supportEmail
145
177
  })]
146
178
  })
147
179
  ]
148
180
  })
149
181
  }),
150
- /* @__PURE__ */ g("div", {
151
- className: "rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 flex gap-3",
152
- children: [/* @__PURE__ */ h(f, {
153
- size: 20,
154
- className: "text-accent-blue flex-shrink-0 mt-0.5"
155
- }), /* @__PURE__ */ g("div", {
156
- className: "text-sm text-status-info-text",
157
- children: [/* @__PURE__ */ h("p", {
158
- className: "font-medium",
159
- children: S("devportal.billingAutoSetup", "A billing account will be automatically set up")
160
- }), /* @__PURE__ */ h("p", {
161
- className: "mt-1",
162
- children: S("devportal.billingAutoSetupNote", "Revenue from app sales will be credited to it. You can complete legal and tax details for payouts later in Organization Settings.")
163
- })]
164
- })]
182
+ /* @__PURE__ */ w(f, {
183
+ title: M("devportal.billingAccount", "Billing Account"),
184
+ description: M("devportal.billingAccountSectionDescription", "Revenue from sales will be credited here. You can change this anytime from the Revenue page."),
185
+ children: /* @__PURE__ */ T("div", {
186
+ className: "space-y-3",
187
+ children: [
188
+ /* @__PURE__ */ T("button", {
189
+ type: "button",
190
+ onClick: () => W("auto"),
191
+ disabled: H,
192
+ 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", U === "auto" ? "border-primary bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken"),
193
+ children: [/* @__PURE__ */ w(b, {
194
+ size: 16,
195
+ className: n("mt-0.5 flex-shrink-0", U === "auto" ? "opacity-100 text-primary" : "opacity-0")
196
+ }), /* @__PURE__ */ T("div", {
197
+ className: "flex-1 min-w-0",
198
+ children: [/* @__PURE__ */ w("p", {
199
+ className: "text-sm font-medium",
200
+ children: M("devportal.billingAutoCreate", "Create a new billing account automatically")
201
+ }), /* @__PURE__ */ w("p", {
202
+ className: "mt-0.5 text-xs text-text-secondary",
203
+ children: M("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.")
204
+ })]
205
+ })]
206
+ }),
207
+ /* @__PURE__ */ T("button", {
208
+ type: "button",
209
+ onClick: () => W("existing"),
210
+ disabled: H || !J && Y.length === 0,
211
+ 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", U === "existing" ? "border-primary bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken"),
212
+ children: [/* @__PURE__ */ w(b, {
213
+ size: 16,
214
+ className: n("mt-0.5 flex-shrink-0", U === "existing" ? "opacity-100 text-primary" : "opacity-0")
215
+ }), /* @__PURE__ */ T("div", {
216
+ className: "flex-1 min-w-0",
217
+ children: [/* @__PURE__ */ T("p", {
218
+ className: "flex items-center gap-1.5 text-sm font-medium",
219
+ children: [/* @__PURE__ */ w(x, { size: 14 }), M("devportal.billingLinkExisting", "Link an existing billing account")]
220
+ }), /* @__PURE__ */ w("p", {
221
+ className: "mt-0.5 text-xs text-text-secondary",
222
+ children: J ? M("devportal.billingAccountsLoading", "Loading your billing accounts...") : Y.length === 0 ? M("devportal.noBillingAccountsYet", "You don't have any billing accounts yet — create one from account billing settings first.") : M("devportal.billingAccountsAvailable", "{{count}} billing account(s) available to link", { count: Y.length })
223
+ })]
224
+ })]
225
+ }),
226
+ U === "existing" && Y.length > 0 && /* @__PURE__ */ w("div", {
227
+ className: "ml-8 space-y-2",
228
+ children: Y.map((e) => /* @__PURE__ */ T("button", {
229
+ type: "button",
230
+ disabled: H,
231
+ onClick: () => K(e.id ?? null),
232
+ 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", G === e.id ? "border-primary bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken"),
233
+ children: [/* @__PURE__ */ w(b, {
234
+ size: 14,
235
+ className: n("flex-shrink-0", G === e.id ? "opacity-100 text-primary" : "opacity-0")
236
+ }), /* @__PURE__ */ T("div", {
237
+ className: "min-w-0 flex-1",
238
+ children: [/* @__PURE__ */ w("p", {
239
+ className: "truncate font-medium",
240
+ children: e.name
241
+ }), e.isDefault && /* @__PURE__ */ w("p", {
242
+ className: "text-xs text-text-secondary",
243
+ children: M("devportal.revenue.defaultAccount", "Default")
244
+ })]
245
+ })]
246
+ }, e.id))
247
+ })
248
+ ]
249
+ })
250
+ }),
251
+ H && /* @__PURE__ */ T("div", {
252
+ className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-sunken px-4 py-3 text-sm text-text-secondary",
253
+ children: [
254
+ /* @__PURE__ */ w(S, {
255
+ size: 16,
256
+ className: "flex-shrink-0 animate-spin text-primary"
257
+ }),
258
+ B === "creating-org" && M("devportal.creatingOrgStatus", "Creating your organization..."),
259
+ B === "setting-up-billing" && M("devportal.settingUpBillingStatus", "Setting up your billing account..."),
260
+ B === "linking-billing" && M("devportal.linkingBillingStatus", "Linking your billing account..."),
261
+ B === "redirecting" && M("devportal.redirectingStatus", "All set — redirecting...")
262
+ ]
165
263
  }),
166
- /* @__PURE__ */ g("div", {
264
+ /* @__PURE__ */ T("div", {
167
265
  className: "flex items-center justify-end gap-3 border-t pt-6",
168
- children: [/* @__PURE__ */ g("button", {
266
+ children: [/* @__PURE__ */ T("button", {
169
267
  type: "button",
170
268
  onClick: () => {
171
- M("/organizations");
269
+ Q(i(j));
172
270
  },
173
- disabled: E,
271
+ disabled: H,
174
272
  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",
175
- children: [/* @__PURE__ */ h(p, { size: 16 }), S("devportal.cancel", "Cancel")]
176
- }), /* @__PURE__ */ h("button", {
273
+ children: [/* @__PURE__ */ w(ee, { size: 16 }), M("devportal.cancel", "Cancel")]
274
+ }), /* @__PURE__ */ w("button", {
177
275
  type: "submit",
178
- disabled: E,
276
+ disabled: H,
179
277
  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",
180
- children: E ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent" }), S("devportal.creating", "Creating...")] }) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(d, { size: 16 }), S("devportal.createOrganization", "Create Organization")] })
278
+ children: H ? /* @__PURE__ */ T(C, { children: [
279
+ /* @__PURE__ */ w("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent" }),
280
+ B === "setting-up-billing" && M("devportal.settingUpBilling", "Setting up billing..."),
281
+ B === "linking-billing" && M("devportal.linkingBilling", "Linking billing..."),
282
+ (B === "creating-org" || B === "redirecting") && M("devportal.creating", "Creating...")
283
+ ] }) : /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w(y, { size: 16 }), M("devportal.createOrganization", "Create Organization")] })
181
284
  })]
182
285
  })
183
286
  ]
@@ -186,6 +289,6 @@ var v = () => {
186
289
  });
187
290
  };
188
291
  //#endregion
189
- export { v as CreateOrganizationPage };
292
+ export { E as CreateOrganizationPage };
190
293
 
191
294
  //# 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 { useState } from \"react\";\nimport { X, Info, Building2 } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { InputField, TextareaField } from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport {\n useCreateOrganizationMutation,\n useLinkDevOrgBillingAccountMutation,\n} from \"../../generated/global-operations\";\nimport { useCreateBillingAccountMutation } from \"../hooks\";\nimport { useDevportalEventBus } from \"../events\";\n\ninterface CreateOrganizationFormData {\n name: string;\n slug: string;\n description: string;\n websiteUrl: string;\n contactEmail: string;\n supportEmail: string;\n}\n\ninterface FormErrors {\n name?: string;\n slug?: string;\n contactEmail?: string;\n supportEmail?: string;\n}\n\n/**\n * Create new organization page — single step.\n * Billing account is auto-created and linked after org creation.\n * Legal/tax details are completed later from organization settings.\n */\nexport const CreateOrganizationPage: FC = () => {\n const { navigate, basePath, currentUser } = useDevportal();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [errors, setErrors] = useState<FormErrors>({});\n const [createOrganization, { loading: isSubmitting }] =\n useCreateOrganizationMutation();\n const [createBillingAccountMutation] = useCreateBillingAccountMutation();\n const [linkBillingAccount] = useLinkDevOrgBillingAccountMutation();\n const bus = useDevportalEventBus();\n\n const [formData, setFormData] = useState<CreateOrganizationFormData>({\n name: \"\",\n slug: \"\",\n description: \"\",\n websiteUrl: \"\",\n contactEmail: \"\",\n supportEmail: \"\",\n });\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 try {\n const result = await createOrganization({\n variables: {\n 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 },\n },\n });\n\n const orgId = result.data?.createDeveloperOrganization?.id;\n if (orgId) {\n bus.emit(\"devportal.org.created\", {\n organizationId: orgId,\n name: formData.name,\n });\n\n // Auto-create and link a billing account for revenue tracking\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 handleNavigate(`/organizations/${orgId}`);\n }\n } catch (error) {\n console.error(\"Failed to create organization:\", error);\n }\n };\n\n const handleCancel = () => {\n handleNavigate(\"/organizations\");\n };\n\n return (\n <PermissionGuard authOnly>\n <PageLayout\n title={tr(\"devportal.createOrganization\", \"Create Organization\")}\n description={tr(\n \"devportal.createOrganizationDescription\",\n \"Set up a developer organization to collaborate with your team\",\n )}\n purpose={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 backLink={`${basePath}/organizations`}\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 <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 info note */}\n <div className=\"rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 flex gap-3\">\n <Info size={20} className=\"text-accent-blue flex-shrink-0 mt-0.5\" />\n <div className=\"text-sm text-status-info-text\">\n <p className=\"font-medium\">\n {tr(\n \"devportal.billingAutoSetup\",\n \"A billing account will be automatically set up\",\n )}\n </p>\n <p className=\"mt-1\">\n {tr(\n \"devportal.billingAutoSetupNote\",\n \"Revenue from app sales will be credited to it. You can complete legal and tax details for payouts later in Organization Settings.\",\n )}\n </p>\n </div>\n </div>\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 {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 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}\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 });\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 };\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 <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":"CreatePhysicalItemPage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/CreatePhysicalItemPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAA0B,MAAM,OAAO,CAAC;AAiJxD,eAAO,MAAM,sBAAsB,EAAE,EAukBpC,CAAC"}
1
+ {"version":3,"file":"CreatePhysicalItemPage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/CreatePhysicalItemPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAA0B,MAAM,OAAO,CAAC;AAkLxD,eAAO,MAAM,sBAAsB,EAAE,EAmyBpC,CAAC"}