@burdenoff/microfe-devportal 2026.609.4 → 2026.611.1

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 (58) hide show
  1. package/dist/devportal/DevportalRoot.js +6 -1
  2. package/dist/devportal/DevportalRoot.js.map +1 -1
  3. package/dist/devportal/DevportalRoutes.js +169 -158
  4. package/dist/devportal/DevportalRoutes.js.map +1 -1
  5. package/dist/devportal/hooks/usePackageUpload.js +120 -0
  6. package/dist/devportal/hooks/usePackageUpload.js.map +1 -0
  7. package/dist/devportal/pages/AnalyticsDashboardPage.js +73 -62
  8. package/dist/devportal/pages/AnalyticsDashboardPage.js.map +1 -1
  9. package/dist/devportal/pages/AppLogsPage.js +89 -82
  10. package/dist/devportal/pages/AppLogsPage.js.map +1 -1
  11. package/dist/devportal/pages/ApplicationDetailPage.js +948 -367
  12. package/dist/devportal/pages/ApplicationDetailPage.js.map +1 -1
  13. package/dist/devportal/pages/ApplicationVersionsPage.js +56 -45
  14. package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
  15. package/dist/devportal/pages/CreateApiKeyPage.js +30 -32
  16. package/dist/devportal/pages/CreateApiKeyPage.js.map +1 -1
  17. package/dist/devportal/pages/CreateApplicationPage.js +8 -3
  18. package/dist/devportal/pages/CreateApplicationPage.js.map +1 -1
  19. package/dist/devportal/pages/CreateOAuthClientPage.js +4 -4
  20. package/dist/devportal/pages/CreateOAuthClientPage.js.map +1 -1
  21. package/dist/devportal/pages/CreateOrganizationPage.js +233 -228
  22. package/dist/devportal/pages/CreateOrganizationPage.js.map +1 -1
  23. package/dist/devportal/pages/CreateWebhookPage.js +159 -148
  24. package/dist/devportal/pages/CreateWebhookPage.js.map +1 -1
  25. package/dist/devportal/pages/DelegationsPage.js +1 -1
  26. package/dist/devportal/pages/DelegationsPage.js.map +1 -1
  27. package/dist/devportal/pages/EditApplicationPage.js +25 -17
  28. package/dist/devportal/pages/EditApplicationPage.js.map +1 -1
  29. package/dist/devportal/pages/ListingPreviewPage.js +159 -153
  30. package/dist/devportal/pages/ListingPreviewPage.js.map +1 -1
  31. package/dist/devportal/pages/OAuthClientDetailPage.js.map +1 -1
  32. package/dist/devportal/pages/OAuthClientsPage.js +2 -2
  33. package/dist/devportal/pages/OAuthClientsPage.js.map +1 -1
  34. package/dist/devportal/pages/OrganizationDetailPage.js +158 -153
  35. package/dist/devportal/pages/OrganizationDetailPage.js.map +1 -1
  36. package/dist/devportal/pages/OrganizationMembersPage.js +223 -212
  37. package/dist/devportal/pages/OrganizationMembersPage.js.map +1 -1
  38. package/dist/devportal/pages/PublishPage.js +172 -165
  39. package/dist/devportal/pages/PublishPage.js.map +1 -1
  40. package/dist/devportal/pages/ResourcesPage.js.map +1 -1
  41. package/dist/devportal/pages/RevenueDashboardPage.js +405 -0
  42. package/dist/devportal/pages/RevenueDashboardPage.js.map +1 -0
  43. package/dist/devportal/pages/SetupPage.js +186 -181
  44. package/dist/devportal/pages/SetupPage.js.map +1 -1
  45. package/dist/devportal/pages/StoreSubmissionPage.js +76 -97
  46. package/dist/devportal/pages/StoreSubmissionPage.js.map +1 -1
  47. package/dist/devportal/pages/WebhookDetailPage.js +172 -154
  48. package/dist/devportal/pages/WebhookDetailPage.js.map +1 -1
  49. package/dist/devportal/pages/WebhooksPage.js +218 -200
  50. package/dist/devportal/pages/WebhooksPage.js.map +1 -1
  51. package/dist/devportal/providers/DevportalProvider.js +16 -13
  52. package/dist/devportal/providers/DevportalProvider.js.map +1 -1
  53. package/dist/devportal/types/index.js.map +1 -1
  54. package/dist/generated/global-operations.js +310 -225
  55. package/dist/generated/global-operations.js.map +1 -1
  56. package/package.json +1 -1
  57. package/dist/devportal/pages/RevenueRedirectPage.js +0 -14
  58. package/dist/devportal/pages/RevenueRedirectPage.js.map +0 -1
@@ -0,0 +1,405 @@
1
+ import { EmptyState as e } from "../components/EmptyState.js";
2
+ import { PageLayout as t, PageSection as n } from "../components/PageLayout.js";
3
+ import { StatCard as r, StatCardGrid as i } from "../components/StatCard.js";
4
+ import { StatusBadge as a } from "../components/StatusBadge.js";
5
+ import { DataTable as o } from "../components/DataTable.js";
6
+ import { useGetMyOrganizationsQuery as s, useGetRevenueDashboardDataQuery as c } from "../../generated/global-operations.js";
7
+ import { getErrorMessage as l } from "../hooks/useGraphQL.js";
8
+ import "../hooks/index.js";
9
+ import { Tooltip as u } from "../../node_modules/recharts/es6/component/Tooltip.js";
10
+ import { ResponsiveContainer as d } from "../../node_modules/recharts/es6/component/ResponsiveContainer.js";
11
+ import { Bar as f } from "../../node_modules/recharts/es6/cartesian/Bar.js";
12
+ import { CartesianGrid as p } from "../../node_modules/recharts/es6/cartesian/CartesianGrid.js";
13
+ import { Line as m } from "../../node_modules/recharts/es6/cartesian/Line.js";
14
+ import { XAxis as h } from "../../node_modules/recharts/es6/cartesian/XAxis.js";
15
+ import { YAxis as g } from "../../node_modules/recharts/es6/cartesian/YAxis.js";
16
+ import { LineChart as _ } from "../../node_modules/recharts/es6/chart/LineChart.js";
17
+ import { BarChart as v } from "../../node_modules/recharts/es6/chart/BarChart.js";
18
+ import { useTr as y } from "../utils/i18n.js";
19
+ import { useEffect as b, useMemo as x, useState as S } from "react";
20
+ import { AlertCircle as C, ArrowDownToLine as w, Building2 as T, CreditCard as E, DollarSign as D, Loader2 as O, Wallet as ee } from "lucide-react";
21
+ import { useSearchParams as k } from "react-router-dom";
22
+ import { Fragment as A, jsx as j, jsxs as M } from "react/jsx-runtime";
23
+ //#region src/devportal/pages/RevenueDashboardPage.tsx
24
+ var N = {
25
+ primary: "var(--color-chart-1)",
26
+ secondary: "var(--color-chart-2)",
27
+ tertiary: "var(--color-chart-4)"
28
+ }, P = {
29
+ "30d": 30,
30
+ "90d": 90,
31
+ "12m": 365
32
+ }, F = () => {
33
+ let F = y(), [I, L] = S("90d"), [R, z] = S(""), [B] = k(), V = x(() => /* @__PURE__ */ new Date(), []), H = B.get("org"), U = x(() => {
34
+ let e = new Date(V);
35
+ return e.setDate(e.getDate() - P[I]), e.toISOString();
36
+ }, [V, I]), { data: W, loading: G, error: K } = s({ fetchPolicy: "cache-and-network" }), { data: q, loading: J, error: Y } = c({
37
+ variables: {
38
+ organizationId: R,
39
+ period: "monthly",
40
+ startDate: U,
41
+ endDate: V.toISOString(),
42
+ salesLimit: 10,
43
+ salesOffset: 0,
44
+ payoutsLimit: 10,
45
+ payoutsOffset: 0
46
+ },
47
+ skip: !R,
48
+ fetchPolicy: "cache-and-network"
49
+ }), X = x(() => W?.myDeveloperOrganizations?.map((e) => e) ?? [], [W?.myDeveloperOrganizations]);
50
+ b(() => {
51
+ if (!R) {
52
+ if (H && X.some((e) => e.id === H)) {
53
+ z(H);
54
+ return;
55
+ }
56
+ X.length === 1 && z(X[0]?.id ?? "");
57
+ }
58
+ }, [
59
+ X,
60
+ H,
61
+ R
62
+ ]);
63
+ let Z = X.find((e) => e.id === R), Q = q?.developerOrgRevenueSummary, te = [...q?.developerOrgRevenueAnalytics ?? []].sort((e, t) => new Date(e.date).getTime() - new Date(t.date).getTime()), ne = q?.developerOrgSales?.edges?.map((e) => e.node) ?? [], re = q?.developerOrgPayouts?.edges?.map((e) => e.node) ?? [], $ = te.map((e) => ({
64
+ date: new Date(e.date).toLocaleDateString(void 0, {
65
+ month: "short",
66
+ day: "numeric"
67
+ }),
68
+ grossRevenue: e.grossRevenue,
69
+ netRevenue: e.netRevenue,
70
+ platformFees: e.platformFees,
71
+ refunds: e.refunds,
72
+ salesCount: e.salesCount
73
+ }));
74
+ return G && !W ? /* @__PURE__ */ j(t, {
75
+ title: F("devportal.revenue.title", "Revenue"),
76
+ description: F("devportal.revenue.description", "Track real revenue, sales, and payout activity for your developer organizations"),
77
+ children: /* @__PURE__ */ j("div", {
78
+ className: "flex items-center justify-center py-16 text-muted-foreground",
79
+ children: /* @__PURE__ */ j(O, { className: "h-8 w-8 animate-spin" })
80
+ })
81
+ }) : K ? /* @__PURE__ */ j(t, {
82
+ title: F("devportal.revenue.title", "Revenue"),
83
+ description: F("devportal.revenue.description", "Track real revenue, sales, and payout activity for your developer organizations"),
84
+ children: /* @__PURE__ */ j(e, {
85
+ icon: /* @__PURE__ */ j(C, {
86
+ size: 32,
87
+ className: "text-status-error-text"
88
+ }),
89
+ title: F("devportal.revenue.errorLoadOrgs", "Unable to load organizations"),
90
+ description: l(K)
91
+ })
92
+ }) : R ? Y ? /* @__PURE__ */ j(t, {
93
+ title: F("devportal.revenue.title", "Revenue"),
94
+ description: F("devportal.revenue.description", "Track real revenue, sales, and payout activity for your developer organizations"),
95
+ children: /* @__PURE__ */ j(e, {
96
+ icon: /* @__PURE__ */ j(C, {
97
+ size: 32,
98
+ className: "text-status-error-text"
99
+ }),
100
+ title: F("devportal.revenue.errorLoadData", "Unable to load revenue data"),
101
+ description: l(Y)
102
+ })
103
+ }) : /* @__PURE__ */ j(t, {
104
+ title: F("devportal.revenue.title", "Revenue"),
105
+ description: Z ? `${F("devportal.revenue.financialPerformanceFor", "Financial performance for")} ${Z.name}` : F("devportal.revenue.shortDescription", "Track revenue, sales, and payouts"),
106
+ actions: /* @__PURE__ */ M("div", {
107
+ className: "flex flex-wrap gap-2",
108
+ children: [/* @__PURE__ */ j("select", {
109
+ value: R,
110
+ onChange: (e) => z(e.target.value),
111
+ "aria-label": F("devportal.revenue.selectOrgAria", "Select organization"),
112
+ className: "rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary",
113
+ children: X.map((e) => /* @__PURE__ */ j("option", {
114
+ value: e.id,
115
+ children: e.name
116
+ }, e.id))
117
+ }), /* @__PURE__ */ M("select", {
118
+ value: I,
119
+ onChange: (e) => L(e.target.value),
120
+ "aria-label": F("devportal.revenue.selectRangeAria", "Select time range"),
121
+ className: "rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary",
122
+ children: [
123
+ /* @__PURE__ */ j("option", {
124
+ value: "30d",
125
+ children: F("devportal.revenue.range.30d", "Last 30 days")
126
+ }),
127
+ /* @__PURE__ */ j("option", {
128
+ value: "90d",
129
+ children: F("devportal.revenue.range.90d", "Last 90 days")
130
+ }),
131
+ /* @__PURE__ */ j("option", {
132
+ value: "12m",
133
+ children: F("devportal.revenue.range.12m", "Last 12 months")
134
+ })
135
+ ]
136
+ })]
137
+ }),
138
+ children: J && !Q ? /* @__PURE__ */ j("div", {
139
+ className: "flex items-center justify-center py-16 text-muted-foreground",
140
+ children: /* @__PURE__ */ j(O, { className: "h-8 w-8 animate-spin" })
141
+ }) : Q ? /* @__PURE__ */ M(A, { children: [
142
+ /* @__PURE__ */ M(i, {
143
+ columns: 4,
144
+ children: [
145
+ /* @__PURE__ */ j(r, {
146
+ title: F("devportal.revenue.grossRevenue", "Gross Revenue"),
147
+ value: `$${Q.totalGrossRevenue.toLocaleString()}`,
148
+ icon: /* @__PURE__ */ j(D, { size: 20 })
149
+ }),
150
+ /* @__PURE__ */ j(r, {
151
+ title: F("devportal.revenue.netRevenue", "Net Revenue"),
152
+ value: `$${Q.totalNetRevenue.toLocaleString()}`,
153
+ icon: /* @__PURE__ */ j(ee, { size: 20 })
154
+ }),
155
+ /* @__PURE__ */ j(r, {
156
+ title: F("devportal.revenue.pendingBalance", "Pending Balance"),
157
+ value: `$${Q.pendingBalance.toLocaleString()}`,
158
+ icon: /* @__PURE__ */ j(E, { size: 20 }),
159
+ description: Q.nextPayoutDate ? `${F("devportal.revenue.nextPayout", "Next payout")} ${new Date(Q.nextPayoutDate).toLocaleDateString()}` : F("devportal.revenue.noPayoutScheduled", "No payout scheduled")
160
+ }),
161
+ /* @__PURE__ */ j(r, {
162
+ title: F("devportal.revenue.platformFees", "Platform Fees"),
163
+ value: `$${Q.totalPlatformFees.toLocaleString()}`,
164
+ icon: /* @__PURE__ */ j(w, { size: 20 }),
165
+ description: `${Q.totalRefundsCount} ${F("devportal.revenue.refunds", "refunds")}`
166
+ })
167
+ ]
168
+ }),
169
+ /* @__PURE__ */ M("div", {
170
+ className: "grid gap-6 xl:grid-cols-2",
171
+ children: [/* @__PURE__ */ j(n, {
172
+ title: F("devportal.revenue.revenueTrend", "Revenue trend"),
173
+ children: /* @__PURE__ */ j("div", {
174
+ className: "rounded-lg border bg-card p-4",
175
+ children: /* @__PURE__ */ j(d, {
176
+ width: "100%",
177
+ height: 300,
178
+ children: /* @__PURE__ */ M(_, {
179
+ data: $,
180
+ children: [
181
+ /* @__PURE__ */ j(p, {
182
+ strokeDasharray: "3 3",
183
+ stroke: "var(--color-chart-grid)"
184
+ }),
185
+ /* @__PURE__ */ j(h, {
186
+ dataKey: "date",
187
+ stroke: "var(--color-chart-axis)",
188
+ fontSize: 12
189
+ }),
190
+ /* @__PURE__ */ j(g, {
191
+ stroke: "var(--color-chart-axis)",
192
+ fontSize: 12
193
+ }),
194
+ /* @__PURE__ */ j(u, { contentStyle: {
195
+ backgroundColor: "var(--color-card)",
196
+ border: "1px solid var(--color-border-default)",
197
+ borderRadius: 12
198
+ } }),
199
+ /* @__PURE__ */ j(m, {
200
+ type: "monotone",
201
+ dataKey: "grossRevenue",
202
+ stroke: N.primary,
203
+ strokeWidth: 2,
204
+ dot: !1
205
+ }),
206
+ /* @__PURE__ */ j(m, {
207
+ type: "monotone",
208
+ dataKey: "netRevenue",
209
+ stroke: N.secondary,
210
+ strokeWidth: 2,
211
+ dot: !1
212
+ })
213
+ ]
214
+ })
215
+ })
216
+ })
217
+ }), /* @__PURE__ */ j(n, {
218
+ title: F("devportal.revenue.topApps", "Top applications by revenue"),
219
+ children: Q.topApps.length > 0 ? /* @__PURE__ */ j("div", {
220
+ className: "space-y-2",
221
+ children: Q.topApps.map((e) => /* @__PURE__ */ j("div", {
222
+ className: "rounded-lg border bg-card p-4",
223
+ children: /* @__PURE__ */ M("div", {
224
+ className: "flex items-start justify-between gap-3",
225
+ children: [/* @__PURE__ */ M("div", { children: [/* @__PURE__ */ j("p", {
226
+ className: "font-medium",
227
+ children: e.applicationName
228
+ }), /* @__PURE__ */ M("p", {
229
+ className: "text-sm text-muted-foreground",
230
+ children: [
231
+ e.salesCount,
232
+ " ",
233
+ F("devportal.revenue.sales", "sales")
234
+ ]
235
+ })] }), /* @__PURE__ */ M("div", {
236
+ className: "text-right",
237
+ children: [/* @__PURE__ */ M("p", {
238
+ className: "font-semibold",
239
+ children: ["$", e.grossRevenue.toLocaleString()]
240
+ }), /* @__PURE__ */ M("p", {
241
+ className: "text-sm text-muted-foreground",
242
+ children: [
243
+ F("devportal.revenue.net", "Net"),
244
+ " $",
245
+ e.netRevenue.toLocaleString()
246
+ ]
247
+ })]
248
+ })]
249
+ })
250
+ }, e.applicationId))
251
+ }) : /* @__PURE__ */ j(e, {
252
+ icon: /* @__PURE__ */ j(T, { size: 24 }),
253
+ title: F("devportal.revenue.noLeadersTitle", "No revenue leaders yet"),
254
+ description: F("devportal.revenue.noLeadersDescription", "Top-performing applications will appear here once revenue is recorded.")
255
+ })
256
+ })]
257
+ }),
258
+ /* @__PURE__ */ j(n, {
259
+ title: F("devportal.revenue.salesVolume", "Sales volume"),
260
+ children: /* @__PURE__ */ j("div", {
261
+ className: "rounded-lg border bg-card p-4",
262
+ children: /* @__PURE__ */ j(d, {
263
+ width: "100%",
264
+ height: 280,
265
+ children: /* @__PURE__ */ M(v, {
266
+ data: $,
267
+ children: [
268
+ /* @__PURE__ */ j(p, {
269
+ strokeDasharray: "3 3",
270
+ stroke: "var(--color-chart-grid)"
271
+ }),
272
+ /* @__PURE__ */ j(h, {
273
+ dataKey: "date",
274
+ stroke: "var(--color-chart-axis)",
275
+ fontSize: 12
276
+ }),
277
+ /* @__PURE__ */ j(g, {
278
+ stroke: "var(--color-chart-axis)",
279
+ fontSize: 12
280
+ }),
281
+ /* @__PURE__ */ j(u, { contentStyle: {
282
+ backgroundColor: "var(--color-card)",
283
+ border: "1px solid var(--color-border-default)",
284
+ borderRadius: 12
285
+ } }),
286
+ /* @__PURE__ */ j(f, {
287
+ dataKey: "salesCount",
288
+ fill: N.tertiary,
289
+ radius: [
290
+ 6,
291
+ 6,
292
+ 0,
293
+ 0
294
+ ]
295
+ })
296
+ ]
297
+ })
298
+ })
299
+ })
300
+ }),
301
+ /* @__PURE__ */ M("div", {
302
+ className: "grid gap-6 xl:grid-cols-2",
303
+ children: [/* @__PURE__ */ j(n, {
304
+ title: F("devportal.revenue.recentSales", "Recent sales"),
305
+ children: /* @__PURE__ */ j(o, {
306
+ data: ne,
307
+ keyField: "id",
308
+ columns: [
309
+ {
310
+ key: "application",
311
+ header: F("devportal.revenue.application", "Application"),
312
+ render: (e) => e.application?.name || e.planName || F("devportal.common.unknown", "Unknown")
313
+ },
314
+ {
315
+ key: "grossAmount",
316
+ header: F("devportal.revenue.gross", "Gross"),
317
+ render: (e) => `$${e.grossAmount.toLocaleString()}`
318
+ },
319
+ {
320
+ key: "netAmount",
321
+ header: F("devportal.revenue.net", "Net"),
322
+ render: (e) => `$${e.netAmount.toLocaleString()}`
323
+ },
324
+ {
325
+ key: "status",
326
+ header: F("devportal.revenue.status", "Status"),
327
+ render: (e) => /* @__PURE__ */ j(a, {
328
+ status: e.status,
329
+ type: "app"
330
+ })
331
+ }
332
+ ]
333
+ })
334
+ }), /* @__PURE__ */ j(n, {
335
+ title: F("devportal.revenue.payoutHistory", "Payout history"),
336
+ children: /* @__PURE__ */ j(o, {
337
+ data: re,
338
+ keyField: "id",
339
+ columns: [
340
+ {
341
+ key: "periodLabel",
342
+ header: F("devportal.revenue.period", "Period"),
343
+ render: (e) => e.periodLabel
344
+ },
345
+ {
346
+ key: "netAmount",
347
+ header: F("devportal.revenue.netPayout", "Net payout"),
348
+ render: (e) => `$${e.netAmount.toLocaleString()}`
349
+ },
350
+ {
351
+ key: "status",
352
+ header: F("devportal.revenue.status", "Status"),
353
+ render: (e) => /* @__PURE__ */ j(a, {
354
+ status: e.status,
355
+ type: "app"
356
+ })
357
+ }
358
+ ]
359
+ })
360
+ })]
361
+ })
362
+ ] }) : /* @__PURE__ */ j(e, {
363
+ icon: /* @__PURE__ */ j(D, { size: 32 }),
364
+ title: F("devportal.revenue.noDataTitle", "No revenue data yet"),
365
+ description: F("devportal.revenue.noDataDescription", "Revenue metrics will appear after this organization starts recording marketplace sales.")
366
+ })
367
+ }) : /* @__PURE__ */ j(t, {
368
+ title: F("devportal.revenue.title", "Revenue"),
369
+ description: F("devportal.revenue.selectOrgDescription", "Select an organization to review real sales and payout data through the public gateway"),
370
+ children: X.length > 0 ? /* @__PURE__ */ j("div", {
371
+ className: "space-y-2",
372
+ children: X.map((e) => /* @__PURE__ */ j("button", {
373
+ type: "button",
374
+ onClick: () => z(e.id),
375
+ className: "flex w-full items-start justify-between rounded-lg border bg-card p-4 text-left transition-colors hover:bg-accent",
376
+ children: /* @__PURE__ */ M("div", { children: [/* @__PURE__ */ M("div", {
377
+ className: "flex items-center gap-2",
378
+ children: [/* @__PURE__ */ j(T, { className: "h-4 w-4 text-primary" }), /* @__PURE__ */ j("span", {
379
+ className: "font-medium",
380
+ children: e.name
381
+ })]
382
+ }), /* @__PURE__ */ M("p", {
383
+ className: "mt-1 text-sm text-muted-foreground",
384
+ children: [
385
+ e.totalApps ?? 0,
386
+ " ",
387
+ F("devportal.revenue.apps", "apps"),
388
+ " · $",
389
+ e.totalRevenue?.toLocaleString() ?? 0,
390
+ " ",
391
+ F("devportal.revenue.revenue", "revenue")
392
+ ]
393
+ })] })
394
+ }, e.id))
395
+ }) : /* @__PURE__ */ j(e, {
396
+ icon: /* @__PURE__ */ j(D, { size: 32 }),
397
+ title: F("devportal.revenue.noOrgsTitle", "No organizations available"),
398
+ description: F("devportal.revenue.noOrgsDescription", "Create a developer organization before reviewing revenue data.")
399
+ })
400
+ });
401
+ };
402
+ //#endregion
403
+ export { F as RevenueDashboardPage };
404
+
405
+ //# sourceMappingURL=RevenueDashboardPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RevenueDashboardPage.js","names":[],"sources":["../../../src/devportal/pages/RevenueDashboardPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n AlertCircle,\n ArrowDownToLine,\n Building2,\n CreditCard,\n DollarSign,\n Loader2,\n Wallet,\n} from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { DataTable } from \"../components/DataTable\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { StatCard, StatCardGrid } from \"../components/StatCard\";\nimport { StatusBadge } from \"../components/StatusBadge\";\nimport type { DeveloperOrganization } from \"../types\";\nimport {\n type GetMyOrganizationsQuery,\n type GetRevenueDashboardDataQuery,\n getErrorMessage,\n useGetMyOrganizationsQuery,\n useGetRevenueDashboardDataQuery,\n} from \"../hooks\";\nimport { useTr } from \"../utils/i18n\";\n\ntype TimeRange = \"30d\" | \"90d\" | \"12m\";\n\nconst chartColors = {\n primary: \"var(--color-chart-1)\",\n secondary: \"var(--color-chart-2)\",\n tertiary: \"var(--color-chart-4)\",\n};\n\ntype RevenueSale =\n GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number][\"node\"];\ntype RevenuePayout =\n GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number][\"node\"];\n\nconst daysByRange: Record<TimeRange, number> = {\n \"30d\": 30,\n \"90d\": 90,\n \"12m\": 365,\n};\n\nexport const RevenueDashboardPage: FC = () => {\n const tr = useTr();\n const [timeRange, setTimeRange] = useState<TimeRange>(\"90d\");\n const [selectedOrganizationId, setSelectedOrganizationId] = useState(\"\");\n const [searchParams] = useSearchParams();\n const now = useMemo(() => new Date(), []);\n const requestedOrganizationId = searchParams.get(\"org\");\n const startDate = useMemo(() => {\n const nextDate = new Date(now);\n nextDate.setDate(nextDate.getDate() - daysByRange[timeRange]);\n return nextDate.toISOString();\n }, [now, timeRange]);\n\n const {\n data: organizationsData,\n loading: organizationsLoading,\n error: organizationsError,\n } = useGetMyOrganizationsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n const { data, loading, error } = useGetRevenueDashboardDataQuery({\n variables: {\n organizationId: selectedOrganizationId,\n period: \"monthly\",\n startDate,\n endDate: now.toISOString(),\n salesLimit: 10,\n salesOffset: 0,\n payoutsLimit: 10,\n payoutsOffset: 0,\n },\n skip: !selectedOrganizationId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const organizations: DeveloperOrganization[] = useMemo(\n () =>\n organizationsData?.myDeveloperOrganizations?.map(\n (\n organization: GetMyOrganizationsQuery[\"myDeveloperOrganizations\"][number],\n ) => organization as unknown as DeveloperOrganization,\n ) ?? [],\n [organizationsData?.myDeveloperOrganizations],\n );\n\n useEffect(() => {\n if (selectedOrganizationId) {\n return;\n }\n\n if (\n requestedOrganizationId &&\n organizations.some(\n (organization) => organization.id === requestedOrganizationId,\n )\n ) {\n setSelectedOrganizationId(requestedOrganizationId);\n return;\n }\n\n if (organizations.length === 1) {\n setSelectedOrganizationId(organizations[0]?.id ?? \"\");\n }\n }, [organizations, requestedOrganizationId, selectedOrganizationId]);\n\n const selectedOrganization = organizations.find(\n (organization) => organization.id === selectedOrganizationId,\n );\n const summary = data?.developerOrgRevenueSummary;\n const analytics = [...(data?.developerOrgRevenueAnalytics ?? [])].sort(\n (left, right) =>\n new Date(left.date).getTime() - new Date(right.date).getTime(),\n );\n const sales: RevenueSale[] =\n data?.developerOrgSales?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n const payouts: RevenuePayout[] =\n data?.developerOrgPayouts?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n\n const chartData = analytics.map((entry) => ({\n date: new Date(entry.date).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n }),\n grossRevenue: entry.grossRevenue,\n netRevenue: entry.netRevenue,\n platformFees: entry.platformFees,\n refunds: entry.refunds,\n salesCount: entry.salesCount,\n }));\n\n if (organizationsLoading && !organizationsData) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n </PageLayout>\n );\n }\n\n if (organizationsError) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadOrgs\",\n \"Unable to load organizations\",\n )}\n description={getErrorMessage(organizationsError)}\n />\n </PageLayout>\n );\n }\n\n if (!selectedOrganizationId) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.selectOrgDescription\",\n \"Select an organization to review real sales and payout data through the public gateway\",\n )}\n >\n {organizations.length > 0 ? (\n <div className=\"space-y-2\">\n {organizations.map((organization) => (\n <button\n key={organization.id}\n type=\"button\"\n onClick={() => setSelectedOrganizationId(organization.id)}\n className=\"flex w-full items-start justify-between rounded-lg border bg-card p-4 text-left transition-colors hover:bg-accent\"\n >\n <div>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"h-4 w-4 text-primary\" />\n <span className=\"font-medium\">{organization.name}</span>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {organization.totalApps ?? 0}{\" \"}\n {tr(\"devportal.revenue.apps\", \"apps\")} · $\n {organization.totalRevenue?.toLocaleString() ?? 0}{\" \"}\n {tr(\"devportal.revenue.revenue\", \"revenue\")}\n </p>\n </div>\n </button>\n ))}\n </div>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\n \"devportal.revenue.noOrgsTitle\",\n \"No organizations available\",\n )}\n description={tr(\n \"devportal.revenue.noOrgsDescription\",\n \"Create a developer organization before reviewing revenue data.\",\n )}\n />\n )}\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadData\",\n \"Unable to load revenue data\",\n )}\n description={getErrorMessage(error)}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={\n selectedOrganization\n ? `${tr(\"devportal.revenue.financialPerformanceFor\", \"Financial performance for\")} ${selectedOrganization.name}`\n : tr(\n \"devportal.revenue.shortDescription\",\n \"Track revenue, sales, and payouts\",\n )\n }\n actions={\n <div className=\"flex flex-wrap gap-2\">\n <select\n value={selectedOrganizationId}\n onChange={(event) => setSelectedOrganizationId(event.target.value)}\n aria-label={tr(\n \"devportal.revenue.selectOrgAria\",\n \"Select organization\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n {organizations.map((organization) => (\n <option key={organization.id} value={organization.id}>\n {organization.name}\n </option>\n ))}\n </select>\n <select\n value={timeRange}\n onChange={(event) => setTimeRange(event.target.value as TimeRange)}\n aria-label={tr(\n \"devportal.revenue.selectRangeAria\",\n \"Select time range\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n <option value=\"30d\">\n {tr(\"devportal.revenue.range.30d\", \"Last 30 days\")}\n </option>\n <option value=\"90d\">\n {tr(\"devportal.revenue.range.90d\", \"Last 90 days\")}\n </option>\n <option value=\"12m\">\n {tr(\"devportal.revenue.range.12m\", \"Last 12 months\")}\n </option>\n </select>\n </div>\n }\n >\n {loading && !summary ? (\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n ) : summary ? (\n <>\n <StatCardGrid columns={4}>\n <StatCard\n title={tr(\"devportal.revenue.grossRevenue\", \"Gross Revenue\")}\n value={`$${summary.totalGrossRevenue.toLocaleString()}`}\n icon={<DollarSign size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.netRevenue\", \"Net Revenue\")}\n value={`$${summary.totalNetRevenue.toLocaleString()}`}\n icon={<Wallet size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.pendingBalance\", \"Pending Balance\")}\n value={`$${summary.pendingBalance.toLocaleString()}`}\n icon={<CreditCard size={20} />}\n description={\n summary.nextPayoutDate\n ? `${tr(\"devportal.revenue.nextPayout\", \"Next payout\")} ${new Date(summary.nextPayoutDate).toLocaleDateString()}`\n : tr(\n \"devportal.revenue.noPayoutScheduled\",\n \"No payout scheduled\",\n )\n }\n />\n <StatCard\n title={tr(\"devportal.revenue.platformFees\", \"Platform Fees\")}\n value={`$${summary.totalPlatformFees.toLocaleString()}`}\n icon={<ArrowDownToLine size={20} />}\n description={`${summary.totalRefundsCount} ${tr(\"devportal.revenue.refunds\", \"refunds\")}`}\n />\n </StatCardGrid>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.revenueTrend\", \"Revenue trend\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"grossRevenue\"\n stroke={chartColors.primary}\n strokeWidth={2}\n dot={false}\n />\n <Line\n type=\"monotone\"\n dataKey=\"netRevenue\"\n stroke={chartColors.secondary}\n strokeWidth={2}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\n \"devportal.revenue.topApps\",\n \"Top applications by revenue\",\n )}\n >\n {summary.topApps.length > 0 ? (\n <div className=\"space-y-2\">\n {summary.topApps.map(\n (\n application: GetRevenueDashboardDataQuery[\"developerOrgRevenueSummary\"][\"topApps\"][number],\n ) => (\n <div\n key={application.applicationId}\n className=\"rounded-lg border bg-card p-4\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium\">\n {application.applicationName}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {application.salesCount}{\" \"}\n {tr(\"devportal.revenue.sales\", \"sales\")}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-semibold\">\n ${application.grossRevenue.toLocaleString()}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\"devportal.revenue.net\", \"Net\")} $\n {application.netRevenue.toLocaleString()}\n </p>\n </div>\n </div>\n </div>\n ),\n )}\n </div>\n ) : (\n <EmptyState\n icon={<Building2 size={24} />}\n title={tr(\n \"devportal.revenue.noLeadersTitle\",\n \"No revenue leaders yet\",\n )}\n description={tr(\n \"devportal.revenue.noLeadersDescription\",\n \"Top-performing applications will appear here once revenue is recorded.\",\n )}\n />\n )}\n </PageSection>\n </div>\n\n <PageSection\n title={tr(\"devportal.revenue.salesVolume\", \"Sales volume\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={280}>\n <BarChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Bar\n dataKey=\"salesCount\"\n fill={chartColors.tertiary}\n radius={[6, 6, 0, 0]}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.recentSales\", \"Recent sales\")}\n >\n <DataTable\n data={sales}\n keyField=\"id\"\n columns={[\n {\n key: \"application\",\n header: tr(\"devportal.revenue.application\", \"Application\"),\n render: (sale) =>\n sale.application?.name ||\n sale.planName ||\n tr(\"devportal.common.unknown\", \"Unknown\"),\n },\n {\n key: \"grossAmount\",\n header: tr(\"devportal.revenue.gross\", \"Gross\"),\n render: (sale) => `$${sale.grossAmount.toLocaleString()}`,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.net\", \"Net\"),\n render: (sale) => `$${sale.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (sale) => (\n <StatusBadge status={sale.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.revenue.payoutHistory\", \"Payout history\")}\n >\n <DataTable\n data={payouts}\n keyField=\"id\"\n columns={[\n {\n key: \"periodLabel\",\n header: tr(\"devportal.revenue.period\", \"Period\"),\n render: (payout) => payout.periodLabel,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.netPayout\", \"Net payout\"),\n render: (payout) => `$${payout.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (payout) => (\n <StatusBadge status={payout.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n </div>\n </>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\"devportal.revenue.noDataTitle\", \"No revenue data yet\")}\n description={tr(\n \"devportal.revenue.noDataDescription\",\n \"Revenue metrics will appear after this organization starts recording marketplace sales.\",\n )}\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}