@burdenoff/microfe-store 2026.510.113
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.
- package/README.md +217 -0
- package/dist/StoreAdminRoot.d.ts +22 -0
- package/dist/StoreAdminRoot.js +23 -0
- package/dist/StoreAdminRoot.js.map +1 -0
- package/dist/StoreAdminRoutes.d.ts +9 -0
- package/dist/StoreAdminRoutes.js +69 -0
- package/dist/StoreAdminRoutes.js.map +1 -0
- package/dist/StoreRoot.d.ts +31 -0
- package/dist/StoreRoot.js +139 -0
- package/dist/StoreRoot.js.map +1 -0
- package/dist/StoreRoutes.d.ts +12 -0
- package/dist/StoreRoutes.js +285 -0
- package/dist/StoreRoutes.js.map +1 -0
- package/dist/components/InstallAppModal.d.ts +26 -0
- package/dist/components/InstallAppModal.js +287 -0
- package/dist/components/InstallAppModal.js.map +1 -0
- package/dist/components/RouteGuards.d.ts +17 -0
- package/dist/components/RouteGuards.js +26 -0
- package/dist/components/RouteGuards.js.map +1 -0
- package/dist/components/cart/CartDrawer.d.ts +35 -0
- package/dist/components/cart/CartDrawer.js +162 -0
- package/dist/components/cart/CartDrawer.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.js +3 -0
- package/dist/components/marketplace/ProductCard.d.ts +18 -0
- package/dist/components/marketplace/ProductCard.js +2 -0
- package/dist/dev/main.d.ts +1 -0
- package/dist/generated/global-operations.d.ts +2012 -0
- package/dist/generated/global-operations.js +1444 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20856 -0
- package/dist/generated/global-types.js +14 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +1 -0
- package/dist/generated/wspace-types.d.ts +53362 -0
- package/dist/hooks/index.d.ts +12 -0
- package/dist/hooks/useBackendCart.d.ts +73 -0
- package/dist/hooks/useBackendCart.js +171 -0
- package/dist/hooks/useBackendCart.js.map +1 -0
- package/dist/hooks/useCart.d.ts +62 -0
- package/dist/hooks/useCart.js +90 -0
- package/dist/hooks/useCart.js.map +1 -0
- package/dist/hooks/useInstallations.d.ts +43 -0
- package/dist/hooks/useInstallations.js +140 -0
- package/dist/hooks/useInstallations.js.map +1 -0
- package/dist/hooks/useOrders.d.ts +40 -0
- package/dist/hooks/useOrders.js +73 -0
- package/dist/hooks/useOrders.js.map +1 -0
- package/dist/hooks/useProductSearch.d.ts +22 -0
- package/dist/hooks/useProductSearch.js +59 -0
- package/dist/hooks/useProductSearch.js.map +1 -0
- package/dist/hooks/useStoreGraphQL.d.ts +475 -0
- package/dist/hooks/useStoreGraphQL.js +751 -0
- package/dist/hooks/useStoreGraphQL.js.map +1 -0
- package/dist/hooks/useStoreGraphQLWithContext.d.ts +48 -0
- package/dist/hooks/useStoreGraphQLWithContext.js +39 -0
- package/dist/hooks/useStoreGraphQLWithContext.js.map +1 -0
- package/dist/hooks/useStorePermissions.d.ts +63 -0
- package/dist/hooks/useStorePermissions.js +88 -0
- package/dist/hooks/useStorePermissions.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.js +13 -0
- package/dist/pages/AdminDashboardPage.d.ts +3 -0
- package/dist/pages/AdminDashboardPage.js +491 -0
- package/dist/pages/AdminDashboardPage.js.map +1 -0
- package/dist/pages/AdminReviewModerationPage.d.ts +3 -0
- package/dist/pages/AdminReviewModerationPage.js +247 -0
- package/dist/pages/AdminReviewModerationPage.js.map +1 -0
- package/dist/pages/AdminStoresPage.d.ts +3 -0
- package/dist/pages/AdminStoresPage.js +442 -0
- package/dist/pages/AdminStoresPage.js.map +1 -0
- package/dist/pages/AdminSubmissionsQueuePage.d.ts +3 -0
- package/dist/pages/AdminSubmissionsQueuePage.js +387 -0
- package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -0
- package/dist/pages/AppDetailPage.d.ts +3 -0
- package/dist/pages/AppDetailPage.js +166 -0
- package/dist/pages/AppDetailPage.js.map +1 -0
- package/dist/pages/AppSettingsPage.d.ts +3 -0
- package/dist/pages/AppSettingsPage.js +100 -0
- package/dist/pages/AppSettingsPage.js.map +1 -0
- package/dist/pages/CartPage.d.ts +8 -0
- package/dist/pages/CartPage.js +259 -0
- package/dist/pages/CartPage.js.map +1 -0
- package/dist/pages/InstalledAppsPage.d.ts +8 -0
- package/dist/pages/InstalledAppsPage.js +290 -0
- package/dist/pages/InstalledAppsPage.js.map +1 -0
- package/dist/pages/MarketplaceHomePage.d.ts +3 -0
- package/dist/pages/MarketplaceHomePage.js +1118 -0
- package/dist/pages/MarketplaceHomePage.js.map +1 -0
- package/dist/pages/MyLicensesPage.d.ts +3 -0
- package/dist/pages/MyLicensesPage.js +146 -0
- package/dist/pages/MyLicensesPage.js.map +1 -0
- package/dist/pages/OrderConfirmationPage.d.ts +3 -0
- package/dist/pages/OrderConfirmationPage.js +178 -0
- package/dist/pages/OrderConfirmationPage.js.map +1 -0
- package/dist/pages/OrdersPage.d.ts +8 -0
- package/dist/pages/OrdersPage.js +358 -0
- package/dist/pages/OrdersPage.js.map +1 -0
- package/dist/pages/ProductCategoryPage.d.ts +3 -0
- package/dist/pages/ProductCategoryPage.js +83 -0
- package/dist/pages/ProductCategoryPage.js.map +1 -0
- package/dist/pages/ProductDetailPage.d.ts +8 -0
- package/dist/pages/ProductDetailPage.js +1205 -0
- package/dist/pages/ProductDetailPage.js.map +1 -0
- package/dist/pages/ProductReviewsPage.d.ts +3 -0
- package/dist/pages/ProductReviewsPage.js +86 -0
- package/dist/pages/ProductReviewsPage.js.map +1 -0
- package/dist/pages/PublisherDashboardPage.d.ts +3 -0
- package/dist/pages/PublisherDashboardPage.js +154 -0
- package/dist/pages/PublisherDashboardPage.js.map +1 -0
- package/dist/pages/PublisherRevenuePage.d.ts +3 -0
- package/dist/pages/PublisherRevenuePage.js +138 -0
- package/dist/pages/PublisherRevenuePage.js.map +1 -0
- package/dist/pages/PublisherSubmissionsPage.d.ts +3 -0
- package/dist/pages/PublisherSubmissionsPage.js +174 -0
- package/dist/pages/PublisherSubmissionsPage.js.map +1 -0
- package/dist/pages/PublisherSubmitPage.d.ts +3 -0
- package/dist/pages/PublisherSubmitPage.js +224 -0
- package/dist/pages/PublisherSubmitPage.js.map +1 -0
- package/dist/pages/SearchResultsPage.d.ts +3 -0
- package/dist/pages/SearchResultsPage.js +125 -0
- package/dist/pages/SearchResultsPage.js.map +1 -0
- package/dist/pages/StoresPage.d.ts +3 -0
- package/dist/pages/StoresPage.js +154 -0
- package/dist/pages/StoresPage.js.map +1 -0
- package/dist/providers/StoreProvider.d.ts +38 -0
- package/dist/providers/StoreProvider.js +51 -0
- package/dist/providers/StoreProvider.js.map +1 -0
- package/dist/store/storeStore.d.ts +69 -0
- package/dist/store/storeStore.js +68 -0
- package/dist/store/storeStore.js.map +1 -0
- package/dist/translations/en.d.ts +518 -0
- package/dist/translations/en.js +514 -0
- package/dist/translations/en.js.map +1 -0
- package/dist/types/index.d.ts +575 -0
- package/dist/utils/index.d.ts +67 -0
- package/dist/utils/index.js +114 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/nativeBridge.d.ts +2 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +105 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { useDeveloperEarnings as e } from "../hooks/useStoreGraphQL.js";
|
|
2
|
+
import { useMemo as t } from "react";
|
|
3
|
+
import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
4
|
+
import { ArrowLeft as r, Clock3 as i, TrendingUp as a, Wallet as o } from "lucide-react";
|
|
5
|
+
import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
+
import { useNavigate as u } from "react-router-dom";
|
|
7
|
+
//#region src/pages/PublisherRevenuePage.tsx
|
|
8
|
+
var d = () => {
|
|
9
|
+
let d = u(), { earnings: f, loading: p, error: m, refetch: h } = e(), { t: g } = n(), _ = f ?? null, v = _?.currency || "USD", y = t(() => new Intl.NumberFormat(void 0, {
|
|
10
|
+
style: "currency",
|
|
11
|
+
currency: v,
|
|
12
|
+
maximumFractionDigits: 2
|
|
13
|
+
}), [v]);
|
|
14
|
+
return /* @__PURE__ */ l("div", {
|
|
15
|
+
className: "flex h-full flex-col",
|
|
16
|
+
children: [/* @__PURE__ */ c("header", {
|
|
17
|
+
className: "border-b border-border-default bg-bg-surface px-6 py-4",
|
|
18
|
+
children: /* @__PURE__ */ l("div", {
|
|
19
|
+
className: "mx-auto flex max-w-6xl items-center gap-3",
|
|
20
|
+
children: [/* @__PURE__ */ c("button", {
|
|
21
|
+
onClick: () => d(-1),
|
|
22
|
+
"aria-label": "Go back",
|
|
23
|
+
className: "cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary",
|
|
24
|
+
children: /* @__PURE__ */ c(r, { className: "h-5 w-5" })
|
|
25
|
+
}), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
|
|
26
|
+
className: "text-2xl font-bold text-text-primary",
|
|
27
|
+
children: g("pages.publisherRevenue.title", { defaultValue: "Revenue" })
|
|
28
|
+
}), /* @__PURE__ */ c("p", {
|
|
29
|
+
className: "text-sm text-text-muted",
|
|
30
|
+
children: g("pages.publisherRevenue.subtitle", { defaultValue: "Track publisher earnings and payouts" })
|
|
31
|
+
})] })]
|
|
32
|
+
})
|
|
33
|
+
}), /* @__PURE__ */ c("main", {
|
|
34
|
+
className: "flex-1 overflow-y-auto p-6",
|
|
35
|
+
children: /* @__PURE__ */ c("div", {
|
|
36
|
+
className: "mx-auto max-w-6xl space-y-6",
|
|
37
|
+
children: p ? /* @__PURE__ */ c("p", {
|
|
38
|
+
role: "status",
|
|
39
|
+
className: "text-sm text-text-muted",
|
|
40
|
+
children: "Loading earnings..."
|
|
41
|
+
}) : m ? /* @__PURE__ */ l("div", {
|
|
42
|
+
role: "alert",
|
|
43
|
+
className: "space-y-2 rounded-xl border border-status-error-border bg-status-error-bg-subtle p-6",
|
|
44
|
+
children: [/* @__PURE__ */ c("p", {
|
|
45
|
+
className: "text-sm text-status-error-text",
|
|
46
|
+
children: g("pages.publisherRevenue.failedToLoad", { defaultValue: "Failed to load earnings data." })
|
|
47
|
+
}), /* @__PURE__ */ c("button", {
|
|
48
|
+
onClick: () => h(),
|
|
49
|
+
className: "cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text",
|
|
50
|
+
children: "Retry"
|
|
51
|
+
})]
|
|
52
|
+
}) : _ ? /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ l("div", {
|
|
53
|
+
className: "grid gap-4 sm:grid-cols-3",
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ l("div", {
|
|
56
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-4",
|
|
57
|
+
children: [/* @__PURE__ */ l("div", {
|
|
58
|
+
className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
|
|
59
|
+
children: [
|
|
60
|
+
/* @__PURE__ */ c(o, { className: "h-4 w-4" }),
|
|
61
|
+
" ",
|
|
62
|
+
g("pages.publisherRevenue.totalEarnings", { defaultValue: "Total earnings" })
|
|
63
|
+
]
|
|
64
|
+
}), /* @__PURE__ */ c("p", {
|
|
65
|
+
className: "mt-2 text-2xl font-bold text-text-primary",
|
|
66
|
+
children: y.format(_.totalEarnings)
|
|
67
|
+
})]
|
|
68
|
+
}),
|
|
69
|
+
/* @__PURE__ */ l("div", {
|
|
70
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-4",
|
|
71
|
+
children: [/* @__PURE__ */ l("div", {
|
|
72
|
+
className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ c(i, { className: "h-4 w-4" }),
|
|
75
|
+
" ",
|
|
76
|
+
g("pages.publisherRevenue.monthlyEarnings", { defaultValue: "Monthly earnings" })
|
|
77
|
+
]
|
|
78
|
+
}), /* @__PURE__ */ c("p", {
|
|
79
|
+
className: "mt-2 text-2xl font-bold text-text-primary",
|
|
80
|
+
children: y.format(_.monthlyEarnings)
|
|
81
|
+
})]
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ l("div", {
|
|
84
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-4",
|
|
85
|
+
children: [/* @__PURE__ */ l("div", {
|
|
86
|
+
className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ c(a, { className: "h-4 w-4" }),
|
|
89
|
+
" ",
|
|
90
|
+
g("pages.publisherRevenue.monthlyOrders", { defaultValue: "Monthly orders" })
|
|
91
|
+
]
|
|
92
|
+
}), /* @__PURE__ */ c("p", {
|
|
93
|
+
className: "mt-2 text-2xl font-bold text-text-primary",
|
|
94
|
+
children: _.monthlyOrders
|
|
95
|
+
})]
|
|
96
|
+
})
|
|
97
|
+
]
|
|
98
|
+
}), /* @__PURE__ */ l("div", {
|
|
99
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-5",
|
|
100
|
+
children: [/* @__PURE__ */ c("h2", {
|
|
101
|
+
className: "mb-3 text-lg font-semibold text-text-primary",
|
|
102
|
+
children: g("pages.publisherRevenue.topSelling", { defaultValue: "Top Selling Items" })
|
|
103
|
+
}), !_.topSellingItems || _.topSellingItems.length === 0 ? /* @__PURE__ */ c("p", {
|
|
104
|
+
className: "text-sm text-text-muted",
|
|
105
|
+
children: g("pages.publisherRevenue.noSales", { defaultValue: "No product sales found for this period." })
|
|
106
|
+
}) : /* @__PURE__ */ c("ul", {
|
|
107
|
+
className: "space-y-2",
|
|
108
|
+
children: _.topSellingItems.map((e) => /* @__PURE__ */ l("li", {
|
|
109
|
+
className: "flex items-center justify-between rounded-lg border border-border-default p-3",
|
|
110
|
+
children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
111
|
+
className: "text-sm font-medium text-text-primary",
|
|
112
|
+
children: e.storeProduct.name
|
|
113
|
+
}), /* @__PURE__ */ l("p", {
|
|
114
|
+
className: "text-xs text-text-muted",
|
|
115
|
+
children: [
|
|
116
|
+
e.totalSales,
|
|
117
|
+
" total sales • ",
|
|
118
|
+
e.monthlySales,
|
|
119
|
+
" this period"
|
|
120
|
+
]
|
|
121
|
+
})] }), /* @__PURE__ */ c("p", {
|
|
122
|
+
className: "text-sm font-semibold text-text-primary",
|
|
123
|
+
children: y.format(e.totalEarnings)
|
|
124
|
+
})]
|
|
125
|
+
}, e.storeProduct.id))
|
|
126
|
+
})]
|
|
127
|
+
})] }) : /* @__PURE__ */ c("div", {
|
|
128
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-8 text-center text-sm text-text-muted",
|
|
129
|
+
children: g("pages.publisherRevenue.noRevenue", { defaultValue: "No revenue data available yet." })
|
|
130
|
+
})
|
|
131
|
+
})
|
|
132
|
+
})]
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
//#endregion
|
|
136
|
+
export { d as PublisherRevenuePage };
|
|
137
|
+
|
|
138
|
+
//# sourceMappingURL=PublisherRevenuePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublisherRevenuePage.js","names":[],"sources":["../../src/pages/PublisherRevenuePage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { ArrowLeft, Wallet, Clock3, TrendingUp } from 'lucide-react';\nimport { useDeveloperEarnings } from '../hooks/useStoreGraphQL';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\ninterface EarningsPayload {\n totalEarnings: number;\n monthlyEarnings: number;\n totalOrders: number;\n monthlyOrders: number;\n currency: string;\n earnings?: Array<{\n month: string;\n year: number;\n earnings: number;\n orders: number;\n currency: string;\n }>;\n topSellingItems?: Array<{\n storeProduct: { id: string; name: string };\n totalSales: number;\n totalEarnings: number;\n monthlySales: number;\n monthlyEarnings: number;\n currency: string;\n }>;\n}\n\nexport const PublisherRevenuePage: FC = () => {\n const navigate = useNavigate();\n const { earnings, loading, error, refetch } = useDeveloperEarnings();\n const { t } = useI18n();\n\n const data = (earnings as EarningsPayload | null) ?? null;\n const currency = data?.currency || 'USD';\n\n const fmt = useMemo(\n () =>\n new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 2,\n }),\n [currency]\n );\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-default bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-6xl items-center gap-3\">\n <button\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.publisherRevenue.title', { defaultValue: 'Revenue' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.publisherRevenue.subtitle', {\n defaultValue: 'Track publisher earnings and payouts',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-6xl space-y-6\">\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading earnings...\n </p>\n ) : error ? (\n <div\n role=\"alert\"\n className=\"space-y-2 rounded-xl border border-status-error-border bg-status-error-bg-subtle p-6\"\n >\n <p className=\"text-sm text-status-error-text\">\n {t('pages.publisherRevenue.failedToLoad', {\n defaultValue: 'Failed to load earnings data.',\n })}\n </p>\n <button\n onClick={() => refetch()}\n className=\"cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n ) : !data ? (\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-8 text-center text-sm text-text-muted\">\n {t('pages.publisherRevenue.noRevenue', {\n defaultValue: 'No revenue data available yet.',\n })}\n </div>\n ) : (\n <>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <div className=\"inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted\">\n <Wallet className=\"h-4 w-4\" />{' '}\n {t('pages.publisherRevenue.totalEarnings', { defaultValue: 'Total earnings' })}\n </div>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">\n {fmt.format(data.totalEarnings)}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <div className=\"inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted\">\n <Clock3 className=\"h-4 w-4\" />{' '}\n {t('pages.publisherRevenue.monthlyEarnings', {\n defaultValue: 'Monthly earnings',\n })}\n </div>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">\n {fmt.format(data.monthlyEarnings)}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <div className=\"inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted\">\n <TrendingUp className=\"h-4 w-4\" />{' '}\n {t('pages.publisherRevenue.monthlyOrders', { defaultValue: 'Monthly orders' })}\n </div>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">{data.monthlyOrders}</p>\n </div>\n </div>\n\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-5\">\n <h2 className=\"mb-3 text-lg font-semibold text-text-primary\">\n {t('pages.publisherRevenue.topSelling', { defaultValue: 'Top Selling Items' })}\n </h2>\n {!data.topSellingItems || data.topSellingItems.length === 0 ? (\n <p className=\"text-sm text-text-muted\">\n {t('pages.publisherRevenue.noSales', {\n defaultValue: 'No product sales found for this period.',\n })}\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {data.topSellingItems.map((item) => (\n <li\n key={item.storeProduct.id}\n className=\"flex items-center justify-between rounded-lg border border-border-default p-3\"\n >\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {item.storeProduct.name}\n </p>\n <p className=\"text-xs text-text-muted\">\n {item.totalSales} total sales • {item.monthlySales} this period\n </p>\n </div>\n <p className=\"text-sm font-semibold text-text-primary\">\n {fmt.format(item.totalEarnings)}\n </p>\n </li>\n ))}\n </ul>\n )}\n </div>\n </>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
|
+
import { useSubmissionStatusUpdatedSubscription as t } from "../generated/global-operations.js";
|
|
3
|
+
import { useMyPublishedProducts as n } from "../hooks/useStoreGraphQL.js";
|
|
4
|
+
import { useMemo as r } from "react";
|
|
5
|
+
import { useI18n as i } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { ArrowLeft as a, CheckCircle2 as o, Clock3 as s, FileCheck2 as c, MessageSquare as l, XCircle as u } from "lucide-react";
|
|
7
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
8
|
+
import { useNavigate as p } from "react-router-dom";
|
|
9
|
+
//#region src/pages/PublisherSubmissionsPage.tsx
|
|
10
|
+
var m = (e) => e === "PUBLISHED" || e === "APPROVED" ? "bg-status-success-bg-subtle text-status-success-text" : e === "REJECTED" || e === "UNLISTED" ? "bg-status-error-bg-subtle text-status-error-text" : e === "PENDING" || e === "SUBMITTED" || e === "UNDER_REVIEW" ? "bg-status-warning-bg-subtle text-status-warning-text" : "bg-bg-sunken text-text-muted", h = () => {
|
|
11
|
+
let h = p(), { basePath: g, currentUser: _ } = e(), { products: v, hasMore: y, loading: b, error: x, refetch: S, loadMore: C } = n(), { t: w } = i(), T = _?.id;
|
|
12
|
+
t({
|
|
13
|
+
variables: { publisherId: T ?? "" },
|
|
14
|
+
skip: !T,
|
|
15
|
+
onData: () => {
|
|
16
|
+
S();
|
|
17
|
+
},
|
|
18
|
+
onError: (e) => {
|
|
19
|
+
console.warn("SubmissionStatusUpdated subscription error:", e.message);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
let E = r(() => {
|
|
23
|
+
let e = v.filter((e) => e.status === "PUBLISHED" || e.status === "APPROVED").length, t = v.filter((e) => e.status === "REJECTED" || e.status === "UNLISTED").length;
|
|
24
|
+
return {
|
|
25
|
+
approved: e,
|
|
26
|
+
rejected: t,
|
|
27
|
+
pending: v.length - e - t
|
|
28
|
+
};
|
|
29
|
+
}, [v]);
|
|
30
|
+
return /* @__PURE__ */ f("div", {
|
|
31
|
+
className: "flex h-full flex-col",
|
|
32
|
+
children: [/* @__PURE__ */ d("header", {
|
|
33
|
+
className: "border-b border-border-default bg-bg-surface px-6 py-4",
|
|
34
|
+
children: /* @__PURE__ */ f("div", {
|
|
35
|
+
className: "mx-auto flex max-w-6xl items-center gap-3",
|
|
36
|
+
children: [/* @__PURE__ */ d("button", {
|
|
37
|
+
onClick: () => h(-1),
|
|
38
|
+
"aria-label": "Go back",
|
|
39
|
+
className: "cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary",
|
|
40
|
+
children: /* @__PURE__ */ d(a, { className: "h-5 w-5" })
|
|
41
|
+
}), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
|
|
42
|
+
className: "text-2xl font-bold text-text-primary",
|
|
43
|
+
children: w("pages.publisherSubmissions.title", { defaultValue: "Submissions" })
|
|
44
|
+
}), /* @__PURE__ */ d("p", {
|
|
45
|
+
className: "text-sm text-text-muted",
|
|
46
|
+
children: w("pages.publisherSubmissions.subtitle", { defaultValue: "Track approval status for your store products" })
|
|
47
|
+
})] })]
|
|
48
|
+
})
|
|
49
|
+
}), /* @__PURE__ */ d("main", {
|
|
50
|
+
className: "flex-1 overflow-y-auto p-6",
|
|
51
|
+
children: /* @__PURE__ */ f("div", {
|
|
52
|
+
className: "mx-auto max-w-6xl space-y-6",
|
|
53
|
+
children: [/* @__PURE__ */ f("div", {
|
|
54
|
+
className: "grid gap-4 sm:grid-cols-3",
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ f("div", {
|
|
57
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-4",
|
|
58
|
+
children: [/* @__PURE__ */ f("div", {
|
|
59
|
+
className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ d(s, { className: "h-4 w-4" }),
|
|
62
|
+
" ",
|
|
63
|
+
w("store.status.pending", { defaultValue: "Pending" })
|
|
64
|
+
]
|
|
65
|
+
}), /* @__PURE__ */ d("p", {
|
|
66
|
+
className: "mt-2 text-2xl font-bold text-text-primary",
|
|
67
|
+
children: E.pending
|
|
68
|
+
})]
|
|
69
|
+
}),
|
|
70
|
+
/* @__PURE__ */ f("div", {
|
|
71
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-4",
|
|
72
|
+
children: [/* @__PURE__ */ f("div", {
|
|
73
|
+
className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
|
|
74
|
+
children: [
|
|
75
|
+
/* @__PURE__ */ d(o, { className: "h-4 w-4" }),
|
|
76
|
+
" ",
|
|
77
|
+
w("store.status.approved", { defaultValue: "Approved" })
|
|
78
|
+
]
|
|
79
|
+
}), /* @__PURE__ */ d("p", {
|
|
80
|
+
className: "mt-2 text-2xl font-bold text-text-primary",
|
|
81
|
+
children: E.approved
|
|
82
|
+
})]
|
|
83
|
+
}),
|
|
84
|
+
/* @__PURE__ */ f("div", {
|
|
85
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-4",
|
|
86
|
+
children: [/* @__PURE__ */ f("div", {
|
|
87
|
+
className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ d(u, { className: "h-4 w-4" }),
|
|
90
|
+
" ",
|
|
91
|
+
w("store.status.rejected", { defaultValue: "Rejected" })
|
|
92
|
+
]
|
|
93
|
+
}), /* @__PURE__ */ d("p", {
|
|
94
|
+
className: "mt-2 text-2xl font-bold text-text-primary",
|
|
95
|
+
children: E.rejected
|
|
96
|
+
})]
|
|
97
|
+
})
|
|
98
|
+
]
|
|
99
|
+
}), /* @__PURE__ */ f("div", {
|
|
100
|
+
className: "rounded-xl border border-border-default bg-bg-surface p-5",
|
|
101
|
+
children: [/* @__PURE__ */ f("div", {
|
|
102
|
+
className: "mb-4 flex items-center justify-between",
|
|
103
|
+
children: [/* @__PURE__ */ d("h2", {
|
|
104
|
+
className: "text-lg font-semibold text-text-primary",
|
|
105
|
+
children: w("pages.publisherSubmissions.timeline", { defaultValue: "Submission Timeline" })
|
|
106
|
+
}), /* @__PURE__ */ d("button", {
|
|
107
|
+
onClick: () => h(`${g}/publisher/submit`),
|
|
108
|
+
className: "cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-sm font-semibold text-action-primary-text",
|
|
109
|
+
children: w("pages.publisherSubmissions.newSubmission", { defaultValue: "New Submission" })
|
|
110
|
+
})]
|
|
111
|
+
}), b ? /* @__PURE__ */ d("p", {
|
|
112
|
+
role: "status",
|
|
113
|
+
className: "text-sm text-text-muted",
|
|
114
|
+
children: "Loading submissions..."
|
|
115
|
+
}) : x ? /* @__PURE__ */ f("div", {
|
|
116
|
+
role: "alert",
|
|
117
|
+
className: "space-y-2",
|
|
118
|
+
children: [/* @__PURE__ */ d("p", {
|
|
119
|
+
className: "text-sm text-status-error-text",
|
|
120
|
+
children: w("pages.publisherSubmissions.failedToLoad", { defaultValue: "Failed to load submissions." })
|
|
121
|
+
}), /* @__PURE__ */ d("button", {
|
|
122
|
+
onClick: () => S(),
|
|
123
|
+
className: "cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text",
|
|
124
|
+
children: "Retry"
|
|
125
|
+
})]
|
|
126
|
+
}) : v.length === 0 ? /* @__PURE__ */ f("div", {
|
|
127
|
+
className: "rounded-lg border border-border-default bg-bg-sunken p-8 text-center",
|
|
128
|
+
children: [/* @__PURE__ */ d(c, { className: "mx-auto mb-2 h-10 w-10 text-text-muted" }), /* @__PURE__ */ d("p", {
|
|
129
|
+
className: "text-sm text-text-muted",
|
|
130
|
+
children: w("pages.publisherSubmissions.emptyTitle", { defaultValue: "No submissions found yet." })
|
|
131
|
+
})]
|
|
132
|
+
}) : /* @__PURE__ */ f("ul", {
|
|
133
|
+
className: "space-y-3",
|
|
134
|
+
children: [v.map((e) => /* @__PURE__ */ f("li", {
|
|
135
|
+
className: "flex items-center justify-between rounded-lg border border-border-default p-3 transition-colors hover:bg-bg-sunken",
|
|
136
|
+
children: [/* @__PURE__ */ f("button", {
|
|
137
|
+
onClick: () => h(`${g}/marketplace/product/${e.id}`),
|
|
138
|
+
className: "flex flex-1 cursor-pointer items-center justify-between text-left",
|
|
139
|
+
children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
|
|
140
|
+
className: "font-medium text-text-primary",
|
|
141
|
+
children: e.name
|
|
142
|
+
}), /* @__PURE__ */ f("p", {
|
|
143
|
+
className: "text-xs text-text-muted",
|
|
144
|
+
children: ["Reviews: ", e.reviewCount]
|
|
145
|
+
})] }), /* @__PURE__ */ d("span", {
|
|
146
|
+
className: `rounded-full px-2.5 py-1 text-xs font-semibold ${m(e.status)}`,
|
|
147
|
+
children: e.status
|
|
148
|
+
})]
|
|
149
|
+
}), /* @__PURE__ */ f("button", {
|
|
150
|
+
onClick: () => h(`${g}/publisher/product/${e.id}/reviews`),
|
|
151
|
+
className: "ml-3 inline-flex cursor-pointer items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-text-link hover:bg-bg-sunken hover:underline",
|
|
152
|
+
title: "View reviews",
|
|
153
|
+
children: [/* @__PURE__ */ d(l, { className: "h-3.5 w-3.5" }), "Reviews"]
|
|
154
|
+
})]
|
|
155
|
+
}, e.id)), y && /* @__PURE__ */ d("li", {
|
|
156
|
+
className: "flex justify-center pt-4 list-none",
|
|
157
|
+
children: /* @__PURE__ */ d("button", {
|
|
158
|
+
type: "button",
|
|
159
|
+
onClick: C,
|
|
160
|
+
disabled: b,
|
|
161
|
+
className: "rounded-lg border border-border-default px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-bg-subtle disabled:opacity-50",
|
|
162
|
+
children: b ? "Loading…" : "Load more"
|
|
163
|
+
})
|
|
164
|
+
})]
|
|
165
|
+
})]
|
|
166
|
+
})]
|
|
167
|
+
})
|
|
168
|
+
})]
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
//#endregion
|
|
172
|
+
export { h as PublisherSubmissionsPage };
|
|
173
|
+
|
|
174
|
+
//# sourceMappingURL=PublisherSubmissionsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublisherSubmissionsPage.js","names":[],"sources":["../../src/pages/PublisherSubmissionsPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { ArrowLeft, FileCheck2, Clock3, CheckCircle2, XCircle, MessageSquare } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useMyPublishedProducts } from '../hooks/useStoreGraphQL';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useSubmissionStatusUpdatedSubscription } from '../generated/global-operations';\n\nconst statusClass = (status: string): string => {\n if (status === 'PUBLISHED' || status === 'APPROVED') {\n return 'bg-status-success-bg-subtle text-status-success-text';\n }\n if (status === 'REJECTED' || status === 'UNLISTED') {\n return 'bg-status-error-bg-subtle text-status-error-text';\n }\n if (status === 'PENDING' || status === 'SUBMITTED' || status === 'UNDER_REVIEW') {\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n }\n return 'bg-bg-sunken text-text-muted';\n};\n\nexport const PublisherSubmissionsPage: FC = () => {\n const navigate = useNavigate();\n const { basePath, currentUser } = useStore();\n const { products, hasMore, loading, error, refetch, loadMore } = useMyPublishedProducts();\n const { t } = useI18n();\n\n const publisherId = currentUser?.id;\n useSubmissionStatusUpdatedSubscription({\n variables: { publisherId: publisherId ?? '' },\n skip: !publisherId,\n onData: () => {\n void refetch();\n },\n onError: (err) => {\n console.warn('SubmissionStatusUpdated subscription error:', err.message);\n },\n });\n\n const grouped = useMemo(() => {\n const approved = products.filter(\n (p) => p.status === 'PUBLISHED' || p.status === 'APPROVED'\n ).length;\n const rejected = products.filter(\n (p) => p.status === 'REJECTED' || p.status === 'UNLISTED'\n ).length;\n const pending = products.length - approved - rejected;\n return { approved, rejected, pending };\n }, [products]);\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-default bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-6xl items-center gap-3\">\n <button\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.publisherSubmissions.title', { defaultValue: 'Submissions' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.publisherSubmissions.subtitle', {\n defaultValue: 'Track approval status for your store products',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-6xl space-y-6\">\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <div className=\"inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted\">\n <Clock3 className=\"h-4 w-4\" />{' '}\n {t('store.status.pending', { defaultValue: 'Pending' })}\n </div>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">{grouped.pending}</p>\n </div>\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <div className=\"inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted\">\n <CheckCircle2 className=\"h-4 w-4\" />{' '}\n {t('store.status.approved', { defaultValue: 'Approved' })}\n </div>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">{grouped.approved}</p>\n </div>\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <div className=\"inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted\">\n <XCircle className=\"h-4 w-4\" />{' '}\n {t('store.status.rejected', { defaultValue: 'Rejected' })}\n </div>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">{grouped.rejected}</p>\n </div>\n </div>\n\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-5\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('pages.publisherSubmissions.timeline', { defaultValue: 'Submission Timeline' })}\n </h2>\n <button\n onClick={() => navigate(`${basePath}/publisher/submit`)}\n className=\"cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-sm font-semibold text-action-primary-text\"\n >\n {t('pages.publisherSubmissions.newSubmission', { defaultValue: 'New Submission' })}\n </button>\n </div>\n\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading submissions...\n </p>\n ) : error ? (\n <div role=\"alert\" className=\"space-y-2\">\n <p className=\"text-sm text-status-error-text\">\n {t('pages.publisherSubmissions.failedToLoad', {\n defaultValue: 'Failed to load submissions.',\n })}\n </p>\n <button\n onClick={() => refetch()}\n className=\"cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n ) : products.length === 0 ? (\n <div className=\"rounded-lg border border-border-default bg-bg-sunken p-8 text-center\">\n <FileCheck2 className=\"mx-auto mb-2 h-10 w-10 text-text-muted\" />\n <p className=\"text-sm text-text-muted\">\n {t('pages.publisherSubmissions.emptyTitle', {\n defaultValue: 'No submissions found yet.',\n })}\n </p>\n </div>\n ) : (\n <ul className=\"space-y-3\">\n {products.map((product) => (\n <li\n key={product.id}\n className=\"flex items-center justify-between rounded-lg border border-border-default p-3 transition-colors hover:bg-bg-sunken\"\n >\n <button\n onClick={() => navigate(`${basePath}/marketplace/product/${product.id}`)}\n className=\"flex flex-1 cursor-pointer items-center justify-between text-left\"\n >\n <div>\n <p className=\"font-medium text-text-primary\">{product.name}</p>\n <p className=\"text-xs text-text-muted\">Reviews: {product.reviewCount}</p>\n </div>\n <span\n className={`rounded-full px-2.5 py-1 text-xs font-semibold ${statusClass(product.status)}`}\n >\n {product.status}\n </span>\n </button>\n <button\n onClick={() =>\n navigate(`${basePath}/publisher/product/${product.id}/reviews`)\n }\n className=\"ml-3 inline-flex cursor-pointer items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-text-link hover:bg-bg-sunken hover:underline\"\n title=\"View reviews\"\n >\n <MessageSquare className=\"h-3.5 w-3.5\" />\n Reviews\n </button>\n </li>\n ))}\n {hasMore && (\n <li className=\"flex justify-center pt-4 list-none\">\n <button\n type=\"button\"\n onClick={loadMore}\n disabled={loading}\n className=\"rounded-lg border border-border-default px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-bg-subtle disabled:opacity-50\"\n >\n {loading ? 'Loading\\u2026' : 'Load more'}\n </button>\n </li>\n )}\n </ul>\n )}\n </div>\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { CreateProductForPublisherDocument as e } from "../generated/global-operations.js";
|
|
2
|
+
import { useMemo as t, useState as n } from "react";
|
|
3
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
+
import { useApolloClient as a } from "@apollo/client/react";
|
|
5
|
+
//#region src/pages/PublisherSubmitPage.tsx
|
|
6
|
+
var o = JSON.stringify({
|
|
7
|
+
schemaVersion: "1.0.0",
|
|
8
|
+
itemType: "app",
|
|
9
|
+
author: { name: "Publisher Team" },
|
|
10
|
+
compatibility: {
|
|
11
|
+
minVersion: "2026.1.0",
|
|
12
|
+
products: ["workspaces"]
|
|
13
|
+
},
|
|
14
|
+
permissions: ["workspace:read"],
|
|
15
|
+
dependencies: { integrations: [] }
|
|
16
|
+
}, null, 2), s = () => {
|
|
17
|
+
let s = a(), [c, l] = n(""), [u, d] = n(""), [f, p] = n(""), [m, h] = n("APP"), [g, _] = n("0"), [v, y] = n(o), [b, x] = n(!1), [S, C] = n(null), [w, T] = n(null), E = t(() => {
|
|
18
|
+
try {
|
|
19
|
+
return {
|
|
20
|
+
value: JSON.parse(v),
|
|
21
|
+
error: null
|
|
22
|
+
};
|
|
23
|
+
} catch {
|
|
24
|
+
return {
|
|
25
|
+
value: null,
|
|
26
|
+
error: "Manifest JSON is invalid."
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}, [v]);
|
|
30
|
+
return /* @__PURE__ */ i("main", {
|
|
31
|
+
className: "mx-auto max-w-4xl p-6",
|
|
32
|
+
children: [/* @__PURE__ */ i("header", {
|
|
33
|
+
className: "mb-6",
|
|
34
|
+
children: [/* @__PURE__ */ r("h1", {
|
|
35
|
+
className: "text-2xl font-semibold text-text-primary",
|
|
36
|
+
children: "Submit Product"
|
|
37
|
+
}), /* @__PURE__ */ r("p", {
|
|
38
|
+
className: "mt-1 text-sm text-text-muted",
|
|
39
|
+
children: "Create a store product with manifest JSON (raw mode)."
|
|
40
|
+
})]
|
|
41
|
+
}), /* @__PURE__ */ i("form", {
|
|
42
|
+
onSubmit: async (t) => {
|
|
43
|
+
if (t.preventDefault(), C(null), T(null), !c.trim()) {
|
|
44
|
+
C("Product name is required.");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!u.trim()) {
|
|
48
|
+
C("Product slug is required.");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (E.error || !E.value) {
|
|
52
|
+
C(E.error || "Manifest JSON is required.");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
let n = Number(g);
|
|
56
|
+
if (!Number.isFinite(n) || n < 0) {
|
|
57
|
+
C("Price must be a valid non-negative number.");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
x(!0);
|
|
61
|
+
try {
|
|
62
|
+
let t = (await s.mutate({
|
|
63
|
+
mutation: e,
|
|
64
|
+
variables: { input: {
|
|
65
|
+
name: c.trim(),
|
|
66
|
+
slug: u.trim(),
|
|
67
|
+
type: m,
|
|
68
|
+
price: n,
|
|
69
|
+
pricingModel: n === 0 ? "FREE" : "PAID_ONETIME",
|
|
70
|
+
description: f.trim() || void 0,
|
|
71
|
+
manifest: E.value
|
|
72
|
+
} }
|
|
73
|
+
})).data?.createProduct;
|
|
74
|
+
if (!t) {
|
|
75
|
+
C("Product creation failed: no product returned by API.");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
T(`Created ${t.slug} (${t.status})`), l(""), d(""), p("");
|
|
79
|
+
} catch (e) {
|
|
80
|
+
C(e instanceof Error ? e.message : "Unknown error");
|
|
81
|
+
} finally {
|
|
82
|
+
x(!1);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
className: "space-y-4",
|
|
86
|
+
"aria-label": "Submit Product",
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ i("div", {
|
|
89
|
+
className: "grid gap-4 md:grid-cols-2",
|
|
90
|
+
children: [
|
|
91
|
+
/* @__PURE__ */ i("label", {
|
|
92
|
+
className: "space-y-1",
|
|
93
|
+
children: [/* @__PURE__ */ r("span", {
|
|
94
|
+
className: "text-sm text-text-secondary",
|
|
95
|
+
children: "Product Name"
|
|
96
|
+
}), /* @__PURE__ */ r("input", {
|
|
97
|
+
value: c,
|
|
98
|
+
onChange: (e) => l(e.target.value),
|
|
99
|
+
required: !0,
|
|
100
|
+
"aria-required": "true",
|
|
101
|
+
className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
|
|
102
|
+
placeholder: "Acme Automation"
|
|
103
|
+
})]
|
|
104
|
+
}),
|
|
105
|
+
/* @__PURE__ */ i("label", {
|
|
106
|
+
className: "space-y-1",
|
|
107
|
+
children: [/* @__PURE__ */ r("span", {
|
|
108
|
+
className: "text-sm text-text-secondary",
|
|
109
|
+
children: "Slug"
|
|
110
|
+
}), /* @__PURE__ */ r("input", {
|
|
111
|
+
value: u,
|
|
112
|
+
onChange: (e) => d(e.target.value),
|
|
113
|
+
required: !0,
|
|
114
|
+
"aria-required": "true",
|
|
115
|
+
className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
|
|
116
|
+
placeholder: "acme-automation"
|
|
117
|
+
})]
|
|
118
|
+
}),
|
|
119
|
+
/* @__PURE__ */ i("label", {
|
|
120
|
+
className: "space-y-1",
|
|
121
|
+
children: [/* @__PURE__ */ r("span", {
|
|
122
|
+
className: "text-sm text-text-secondary",
|
|
123
|
+
children: "Type"
|
|
124
|
+
}), /* @__PURE__ */ i("select", {
|
|
125
|
+
value: m,
|
|
126
|
+
onChange: (e) => h(e.target.value),
|
|
127
|
+
className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
|
|
128
|
+
children: [
|
|
129
|
+
/* @__PURE__ */ r("option", {
|
|
130
|
+
value: "APP",
|
|
131
|
+
children: "APP"
|
|
132
|
+
}),
|
|
133
|
+
/* @__PURE__ */ r("option", {
|
|
134
|
+
value: "AGENT",
|
|
135
|
+
children: "AGENT"
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ r("option", {
|
|
138
|
+
value: "NODE",
|
|
139
|
+
children: "NODE"
|
|
140
|
+
}),
|
|
141
|
+
/* @__PURE__ */ r("option", {
|
|
142
|
+
value: "WIDGET",
|
|
143
|
+
children: "WIDGET"
|
|
144
|
+
}),
|
|
145
|
+
/* @__PURE__ */ r("option", {
|
|
146
|
+
value: "WORKFLOW",
|
|
147
|
+
children: "WORKFLOW"
|
|
148
|
+
})
|
|
149
|
+
]
|
|
150
|
+
})]
|
|
151
|
+
}),
|
|
152
|
+
/* @__PURE__ */ i("label", {
|
|
153
|
+
className: "space-y-1",
|
|
154
|
+
children: [/* @__PURE__ */ r("span", {
|
|
155
|
+
className: "text-sm text-text-secondary",
|
|
156
|
+
children: "Price"
|
|
157
|
+
}), /* @__PURE__ */ r("input", {
|
|
158
|
+
type: "number",
|
|
159
|
+
min: "0",
|
|
160
|
+
step: "0.01",
|
|
161
|
+
value: g,
|
|
162
|
+
onChange: (e) => _(e.target.value),
|
|
163
|
+
className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary"
|
|
164
|
+
})]
|
|
165
|
+
})
|
|
166
|
+
]
|
|
167
|
+
}),
|
|
168
|
+
/* @__PURE__ */ i("label", {
|
|
169
|
+
className: "block space-y-1",
|
|
170
|
+
children: [/* @__PURE__ */ r("span", {
|
|
171
|
+
className: "text-sm text-text-secondary",
|
|
172
|
+
children: "Description"
|
|
173
|
+
}), /* @__PURE__ */ r("textarea", {
|
|
174
|
+
value: f,
|
|
175
|
+
onChange: (e) => p(e.target.value),
|
|
176
|
+
rows: 3,
|
|
177
|
+
className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary"
|
|
178
|
+
})]
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ i("label", {
|
|
181
|
+
className: "block space-y-1",
|
|
182
|
+
children: [
|
|
183
|
+
/* @__PURE__ */ r("span", {
|
|
184
|
+
className: "text-sm text-text-secondary",
|
|
185
|
+
children: "Manifest (JSON)"
|
|
186
|
+
}),
|
|
187
|
+
/* @__PURE__ */ r("textarea", {
|
|
188
|
+
value: v,
|
|
189
|
+
onChange: (e) => y(e.target.value),
|
|
190
|
+
rows: 16,
|
|
191
|
+
required: !0,
|
|
192
|
+
"aria-required": "true",
|
|
193
|
+
className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 font-mono text-xs text-text-primary"
|
|
194
|
+
}),
|
|
195
|
+
E.error && /* @__PURE__ */ r("p", {
|
|
196
|
+
className: "text-xs text-status-error-text",
|
|
197
|
+
children: E.error
|
|
198
|
+
})
|
|
199
|
+
]
|
|
200
|
+
}),
|
|
201
|
+
S && /* @__PURE__ */ r("p", {
|
|
202
|
+
role: "alert",
|
|
203
|
+
className: "rounded-md bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text",
|
|
204
|
+
children: S
|
|
205
|
+
}),
|
|
206
|
+
w && /* @__PURE__ */ r("p", {
|
|
207
|
+
role: "status",
|
|
208
|
+
className: "rounded-md bg-status-success-bg-subtle px-3 py-2 text-sm text-status-success-text",
|
|
209
|
+
children: w
|
|
210
|
+
}),
|
|
211
|
+
/* @__PURE__ */ r("button", {
|
|
212
|
+
type: "submit",
|
|
213
|
+
disabled: b,
|
|
214
|
+
className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text disabled:cursor-not-allowed disabled:opacity-60",
|
|
215
|
+
children: b ? "Submitting..." : "Submit Product"
|
|
216
|
+
})
|
|
217
|
+
]
|
|
218
|
+
})]
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
//#endregion
|
|
222
|
+
export { s as PublisherSubmitPage };
|
|
223
|
+
|
|
224
|
+
//# sourceMappingURL=PublisherSubmitPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublisherSubmitPage.js","names":[],"sources":["../../src/pages/PublisherSubmitPage.tsx"],"sourcesContent":["import { useApolloClient } from '@apollo/client/react';\nimport { useMemo, useState, type FC, type FormEvent } from 'react';\n\nimport { CreateProductForPublisherDocument } from '../generated/global-operations';\n\nconst DEFAULT_MANIFEST = JSON.stringify(\n {\n schemaVersion: '1.0.0',\n itemType: 'app',\n author: { name: 'Publisher Team' },\n compatibility: {\n minVersion: '2026.1.0',\n products: ['workspaces'],\n },\n permissions: ['workspace:read'],\n dependencies: {\n integrations: [],\n },\n },\n null,\n 2\n);\n\nexport const PublisherSubmitPage: FC = () => {\n const client = useApolloClient();\n\n const [name, setName] = useState('');\n const [slug, setSlug] = useState('');\n const [description, setDescription] = useState('');\n const [type, setType] = useState('APP');\n const [price, setPrice] = useState('0');\n const [manifestText, setManifestText] = useState(DEFAULT_MANIFEST);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n const parsedManifest = useMemo(() => {\n try {\n return { value: JSON.parse(manifestText), error: null as string | null };\n } catch {\n return { value: null, error: 'Manifest JSON is invalid.' };\n }\n }, [manifestText]);\n\n const submitProduct = async (event: FormEvent) => {\n event.preventDefault();\n setError(null);\n setSuccess(null);\n\n if (!name.trim()) {\n setError('Product name is required.');\n return;\n }\n if (!slug.trim()) {\n setError('Product slug is required.');\n return;\n }\n if (parsedManifest.error || !parsedManifest.value) {\n setError(parsedManifest.error || 'Manifest JSON is required.');\n return;\n }\n\n const numericPrice = Number(price);\n if (!Number.isFinite(numericPrice) || numericPrice < 0) {\n setError('Price must be a valid non-negative number.');\n return;\n }\n\n setSubmitting(true);\n try {\n const result = await client.mutate<{\n createProduct?: { id: string; slug: string; status: string };\n }>({\n mutation: CreateProductForPublisherDocument,\n variables: {\n input: {\n name: name.trim(),\n slug: slug.trim(),\n type,\n price: numericPrice,\n pricingModel: numericPrice === 0 ? 'FREE' : 'PAID_ONETIME',\n description: description.trim() || undefined,\n manifest: parsedManifest.value,\n },\n },\n });\n\n const created = result.data?.createProduct;\n if (!created) {\n setError('Product creation failed: no product returned by API.');\n return;\n }\n\n setSuccess(`Created ${created.slug} (${created.status})`);\n setName('');\n setSlug('');\n setDescription('');\n } catch (mutationError) {\n const message = mutationError instanceof Error ? mutationError.message : 'Unknown error';\n setError(message);\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <main className=\"mx-auto max-w-4xl p-6\">\n <header className=\"mb-6\">\n <h1 className=\"text-2xl font-semibold text-text-primary\">Submit Product</h1>\n <p className=\"mt-1 text-sm text-text-muted\">\n Create a store product with manifest JSON (raw mode).\n </p>\n </header>\n\n <form onSubmit={submitProduct} className=\"space-y-4\" aria-label=\"Submit Product\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"space-y-1\">\n <span className=\"text-sm text-text-secondary\">Product Name</span>\n <input\n value={name}\n onChange={(event) => setName(event.target.value)}\n required\n aria-required=\"true\"\n className=\"w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n placeholder=\"Acme Automation\"\n />\n </label>\n\n <label className=\"space-y-1\">\n <span className=\"text-sm text-text-secondary\">Slug</span>\n <input\n value={slug}\n onChange={(event) => setSlug(event.target.value)}\n required\n aria-required=\"true\"\n className=\"w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n placeholder=\"acme-automation\"\n />\n </label>\n\n <label className=\"space-y-1\">\n <span className=\"text-sm text-text-secondary\">Type</span>\n <select\n value={type}\n onChange={(event) => setType(event.target.value)}\n className=\"w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"APP\">APP</option>\n <option value=\"AGENT\">AGENT</option>\n <option value=\"NODE\">NODE</option>\n <option value=\"WIDGET\">WIDGET</option>\n <option value=\"WORKFLOW\">WORKFLOW</option>\n </select>\n </label>\n\n <label className=\"space-y-1\">\n <span className=\"text-sm text-text-secondary\">Price</span>\n <input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={price}\n onChange={(event) => setPrice(event.target.value)}\n className=\"w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </label>\n </div>\n\n <label className=\"block space-y-1\">\n <span className=\"text-sm text-text-secondary\">Description</span>\n <textarea\n value={description}\n onChange={(event) => setDescription(event.target.value)}\n rows={3}\n className=\"w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </label>\n\n <label className=\"block space-y-1\">\n <span className=\"text-sm text-text-secondary\">Manifest (JSON)</span>\n <textarea\n value={manifestText}\n onChange={(event) => setManifestText(event.target.value)}\n rows={16}\n required\n aria-required=\"true\"\n className=\"w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 font-mono text-xs text-text-primary\"\n />\n {parsedManifest.error && (\n <p className=\"text-xs text-status-error-text\">{parsedManifest.error}</p>\n )}\n </label>\n\n {error && (\n <p\n role=\"alert\"\n className=\"rounded-md bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\"\n >\n {error}\n </p>\n )}\n {success && (\n <p\n role=\"status\"\n className=\"rounded-md bg-status-success-bg-subtle px-3 py-2 text-sm text-status-success-text\"\n >\n {success}\n </p>\n )}\n\n <button\n type=\"submit\"\n disabled={submitting}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text disabled:cursor-not-allowed disabled:opacity-60\"\n >\n {submitting ? 'Submitting...' : 'Submit Product'}\n </button>\n </form>\n </main>\n );\n};\n"],"mappings":"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"}
|