@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,125 @@
|
|
|
1
|
+
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
|
+
import { useBrowseStoreWithContext as t } from "../hooks/useStoreGraphQL.js";
|
|
3
|
+
import { useId as n, useMemo as r, useState as i } from "react";
|
|
4
|
+
import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
5
|
+
import { ArrowLeft as o, Search as s } from "lucide-react";
|
|
6
|
+
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
7
|
+
import { useNavigate as d, useSearchParams as f } from "react-router-dom";
|
|
8
|
+
//#region src/pages/SearchResultsPage.tsx
|
|
9
|
+
var p = ({ product: e, onOpen: t, noDesc: n }) => /* @__PURE__ */ u("button", {
|
|
10
|
+
onClick: () => t(e.id),
|
|
11
|
+
className: "cursor-pointer rounded-xl border border-border-default bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken",
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ l("h3", {
|
|
14
|
+
className: "font-semibold text-text-primary",
|
|
15
|
+
children: e.name
|
|
16
|
+
}),
|
|
17
|
+
/* @__PURE__ */ l("p", {
|
|
18
|
+
className: "mt-1 text-xs text-text-muted",
|
|
19
|
+
children: e.type
|
|
20
|
+
}),
|
|
21
|
+
/* @__PURE__ */ l("p", {
|
|
22
|
+
className: "mt-2 text-sm text-text-muted line-clamp-2",
|
|
23
|
+
children: e.description || n
|
|
24
|
+
})
|
|
25
|
+
]
|
|
26
|
+
}), m = () => {
|
|
27
|
+
let m = d(), { basePath: h } = e(), g = n(), [_, v] = f(), [y, b] = i(_.get("q") ?? ""), { t: x } = a(), S = r(() => y.trim(), [y]), { products: C, totalCount: w, hasMore: T, loading: E, error: D, loadMore: O } = t({
|
|
28
|
+
filter: S ? { search: S } : void 0,
|
|
29
|
+
pagination: { limit: 30 }
|
|
30
|
+
}), k = () => {
|
|
31
|
+
let e = y.trim();
|
|
32
|
+
v(e ? { q: e } : {});
|
|
33
|
+
};
|
|
34
|
+
return /* @__PURE__ */ u("div", {
|
|
35
|
+
className: "flex h-full flex-col",
|
|
36
|
+
children: [/* @__PURE__ */ l("header", {
|
|
37
|
+
className: "border-b border-border-default bg-bg-surface px-6 py-4",
|
|
38
|
+
children: /* @__PURE__ */ u("div", {
|
|
39
|
+
className: "mx-auto max-w-6xl",
|
|
40
|
+
children: [/* @__PURE__ */ u("div", {
|
|
41
|
+
className: "mb-3 flex items-center gap-3",
|
|
42
|
+
children: [/* @__PURE__ */ l("button", {
|
|
43
|
+
onClick: () => m(-1),
|
|
44
|
+
"aria-label": "Go back",
|
|
45
|
+
className: "cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary",
|
|
46
|
+
children: /* @__PURE__ */ l(o, { className: "h-5 w-5" })
|
|
47
|
+
}), /* @__PURE__ */ l("h1", {
|
|
48
|
+
className: "text-2xl font-bold text-text-primary",
|
|
49
|
+
children: x("pages.search.title", { defaultValue: "Search Results" })
|
|
50
|
+
})]
|
|
51
|
+
}), /* @__PURE__ */ u("div", {
|
|
52
|
+
className: "flex gap-2",
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ l("label", {
|
|
55
|
+
htmlFor: g,
|
|
56
|
+
className: "sr-only",
|
|
57
|
+
children: x("pages.search.searchLabel", { defaultValue: "Search store products" })
|
|
58
|
+
}),
|
|
59
|
+
/* @__PURE__ */ l("input", {
|
|
60
|
+
id: g,
|
|
61
|
+
"aria-label": x("pages.search.searchLabel", { defaultValue: "Search store products" }),
|
|
62
|
+
value: y,
|
|
63
|
+
onChange: (e) => b(e.target.value),
|
|
64
|
+
onKeyDown: (e) => {
|
|
65
|
+
e.key === "Enter" && k();
|
|
66
|
+
},
|
|
67
|
+
placeholder: "Search apps, workflows, integrations...",
|
|
68
|
+
className: "w-full rounded-lg border border-border-default bg-bg-sunken px-3 py-2 text-sm text-text-primary outline-none focus:border-action-primary-bg"
|
|
69
|
+
}),
|
|
70
|
+
/* @__PURE__ */ u("button", {
|
|
71
|
+
onClick: k,
|
|
72
|
+
className: "inline-flex cursor-pointer items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text",
|
|
73
|
+
children: [/* @__PURE__ */ l(s, { className: "h-4 w-4" }), " Search"]
|
|
74
|
+
})
|
|
75
|
+
]
|
|
76
|
+
})]
|
|
77
|
+
})
|
|
78
|
+
}), /* @__PURE__ */ l("main", {
|
|
79
|
+
className: "flex-1 overflow-y-auto p-6",
|
|
80
|
+
children: /* @__PURE__ */ u("div", {
|
|
81
|
+
className: "mx-auto max-w-6xl",
|
|
82
|
+
children: [/* @__PURE__ */ l("p", {
|
|
83
|
+
"aria-live": "polite",
|
|
84
|
+
className: "mb-4 text-sm text-text-muted",
|
|
85
|
+
children: S ? x("pages.search.resultsFor", {
|
|
86
|
+
defaultValue: `${w} results for "${S}"`,
|
|
87
|
+
query: S,
|
|
88
|
+
count: w
|
|
89
|
+
}) : x("pages.search.enterQuery", { defaultValue: "Enter a query to search" })
|
|
90
|
+
}), E && C.length === 0 ? /* @__PURE__ */ l("p", {
|
|
91
|
+
role: "status",
|
|
92
|
+
className: "text-sm text-text-muted",
|
|
93
|
+
children: "Searching..."
|
|
94
|
+
}) : D ? /* @__PURE__ */ l("p", {
|
|
95
|
+
role: "alert",
|
|
96
|
+
className: "text-sm text-status-error-text",
|
|
97
|
+
children: D.message
|
|
98
|
+
}) : C.length === 0 ? /* @__PURE__ */ l("p", {
|
|
99
|
+
className: "text-sm text-text-muted",
|
|
100
|
+
children: "No matching products found."
|
|
101
|
+
}) : /* @__PURE__ */ u(c, { children: [/* @__PURE__ */ l("ul", {
|
|
102
|
+
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
103
|
+
children: C.map((e) => /* @__PURE__ */ l("li", { children: /* @__PURE__ */ l(p, {
|
|
104
|
+
product: e,
|
|
105
|
+
noDesc: x("common.noResults", { defaultValue: "No description available." }),
|
|
106
|
+
onOpen: (e) => m(`${h}/marketplace/product/${e}`)
|
|
107
|
+
}) }, e.id))
|
|
108
|
+
}), T && /* @__PURE__ */ l("div", {
|
|
109
|
+
className: "flex justify-center pt-4",
|
|
110
|
+
children: /* @__PURE__ */ l("button", {
|
|
111
|
+
type: "button",
|
|
112
|
+
onClick: O,
|
|
113
|
+
disabled: E,
|
|
114
|
+
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",
|
|
115
|
+
children: E ? "Loading…" : "Load more"
|
|
116
|
+
})
|
|
117
|
+
})] })]
|
|
118
|
+
})
|
|
119
|
+
})]
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
//#endregion
|
|
123
|
+
export { m as SearchResultsPage };
|
|
124
|
+
|
|
125
|
+
//# sourceMappingURL=SearchResultsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchResultsPage.js","names":[],"sources":["../../src/pages/SearchResultsPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useMemo, useState, useId } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { ArrowLeft, Search } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useBrowseStoreWithContext, type StoreProduct } from '../hooks/useStoreGraphQL';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nconst SearchResultCard: FC<{\n product: StoreProduct;\n onOpen: (id: string) => void;\n noDesc: string;\n}> = ({ product, onOpen, noDesc }) => (\n <button\n onClick={() => onOpen(product.id)}\n className=\"cursor-pointer rounded-xl border border-border-default bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken\"\n >\n <h3 className=\"font-semibold text-text-primary\">{product.name}</h3>\n <p className=\"mt-1 text-xs text-text-muted\">{product.type}</p>\n <p className=\"mt-2 text-sm text-text-muted line-clamp-2\">{product.description || noDesc}</p>\n </button>\n);\n\nexport const SearchResultsPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const searchInputId = useId();\n const [searchParams, setSearchParams] = useSearchParams();\n const initialQuery = searchParams.get('q') ?? '';\n const [query, setQuery] = useState(initialQuery);\n const { t } = useI18n();\n\n const trimmedQuery = useMemo(() => query.trim(), [query]);\n const { products, totalCount, hasMore, loading, error, loadMore } = useBrowseStoreWithContext({\n filter: trimmedQuery ? { search: trimmedQuery } : undefined,\n pagination: { limit: 30 },\n });\n\n const handleSearch = () => {\n const next = query.trim();\n if (next) {\n setSearchParams({ q: next });\n } else {\n setSearchParams({});\n }\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 max-w-6xl\">\n <div className=\"mb-3 flex 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 <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.search.title', { defaultValue: 'Search Results' })}\n </h1>\n </div>\n <div className=\"flex gap-2\">\n <label htmlFor={searchInputId} className=\"sr-only\">\n {t('pages.search.searchLabel', { defaultValue: 'Search store products' })}\n </label>\n <input\n id={searchInputId}\n aria-label={t('pages.search.searchLabel', { defaultValue: 'Search store products' })}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSearch();\n }}\n placeholder=\"Search apps, workflows, integrations...\"\n className=\"w-full rounded-lg border border-border-default bg-bg-sunken px-3 py-2 text-sm text-text-primary outline-none focus:border-action-primary-bg\"\n />\n <button\n onClick={handleSearch}\n className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text\"\n >\n <Search className=\"h-4 w-4\" /> Search\n </button>\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\">\n <p aria-live=\"polite\" className=\"mb-4 text-sm text-text-muted\">\n {trimmedQuery\n ? t('pages.search.resultsFor', {\n defaultValue: `${totalCount} results for \"${trimmedQuery}\"`,\n query: trimmedQuery,\n count: totalCount,\n })\n : t('pages.search.enterQuery', { defaultValue: 'Enter a query to search' })}\n </p>\n {loading && products.length === 0 ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Searching...\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-status-error-text\">\n {error.message}\n </p>\n ) : products.length === 0 ? (\n <p className=\"text-sm text-text-muted\">No matching products found.</p>\n ) : (\n <>\n <ul className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {products.map((product) => (\n <li key={product.id}>\n <SearchResultCard\n product={product}\n noDesc={t('common.noResults', { defaultValue: 'No description available.' })}\n onOpen={(id) => navigate(`${basePath}/marketplace/product/${id}`)}\n />\n </li>\n ))}\n </ul>\n {hasMore && (\n <div className=\"flex justify-center pt-4\">\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 </div>\n )}\n </>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":";;;;;;;;AAQA,IAAM,KAIA,EAAE,YAAS,WAAQ,gBACvB,kBAAC,UAAD;CACE,eAAe,EAAO,EAAQ,GAAG;CACjC,WAAU;WAFZ;EAIE,kBAAC,MAAD;GAAI,WAAU;aAAmC,EAAQ;GAAU,CAAA;EACnE,kBAAC,KAAD;GAAG,WAAU;aAAgC,EAAQ;GAAS,CAAA;EAC9D,kBAAC,KAAD;GAAG,WAAU;aAA6C,EAAQ,eAAe;GAAW,CAAA;EACrF;IAGE,UAA8B;CACzC,IAAM,IAAW,GAAa,EACxB,EAAE,gBAAa,GAAU,EACzB,IAAgB,GAAO,EACvB,CAAC,GAAc,KAAmB,GAAiB,EAEnD,CAAC,GAAO,KAAY,EADL,EAAa,IAAI,IAAI,IAAI,GACE,EAC1C,EAAE,SAAM,GAAS,EAEjB,IAAe,QAAc,EAAM,MAAM,EAAE,CAAC,EAAM,CAAC,EACnD,EAAE,aAAU,eAAY,YAAS,YAAS,UAAO,gBAAa,EAA0B;EAC5F,QAAQ,IAAe,EAAE,QAAQ,GAAc,GAAG,KAAA;EAClD,YAAY,EAAE,OAAO,IAAI;EAC1B,CAAC,EAEI,UAAqB;EACzB,IAAM,IAAO,EAAM,MAAM;AACzB,EACE,EADE,IACc,EAAE,GAAG,GAAM,GAEX,EAAE,CAAC;;AAIvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,UAAD;GAAQ,WAAU;aAChB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,eAAe,EAAS,GAAG;MAC3B,cAAW;MACX,WAAU;gBAEV,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MAC1B,CAAA,EACT,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAE,sBAAsB,EAAE,cAAc,kBAAkB,CAAC;MACzD,CAAA,CACD;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,SAAD;OAAO,SAAS;OAAe,WAAU;iBACtC,EAAE,4BAA4B,EAAE,cAAc,yBAAyB,CAAC;OACnE,CAAA;MACR,kBAAC,SAAD;OACE,IAAI;OACJ,cAAY,EAAE,4BAA4B,EAAE,cAAc,yBAAyB,CAAC;OACpF,OAAO;OACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;OACzC,YAAY,MAAM;AAChB,QAAI,EAAE,QAAQ,WAAS,GAAc;;OAEvC,aAAY;OACZ,WAAU;OACV,CAAA;MACF,kBAAC,UAAD;OACE,SAAS;OACT,WAAU;iBAFZ,CAIE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,UACvB;;MACL;OACF;;GACC,CAAA,EAET,kBAAC,QAAD;GAAM,WAAU;aACd,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,aAAU;KAAS,WAAU;eAC7B,IACG,EAAE,2BAA2B;MAC3B,cAAc,GAAG,EAAW,gBAAgB,EAAa;MACzD,OAAO;MACP,OAAO;MACR,CAAC,GACF,EAAE,2BAA2B,EAAE,cAAc,2BAA2B,CAAC;KAC3E,CAAA,EACH,KAAW,EAAS,WAAW,IAC9B,kBAAC,KAAD;KAAG,MAAK;KAAS,WAAU;eAA0B;KAEjD,CAAA,GACF,IACF,kBAAC,KAAD;KAAG,MAAK;KAAQ,WAAU;eACvB,EAAM;KACL,CAAA,GACF,EAAS,WAAW,IACtB,kBAAC,KAAD;KAAG,WAAU;eAA0B;KAA+B,CAAA,GAEtE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAS,KAAK,MACb,kBAAC,MAAD,EAAA,UACE,kBAAC,GAAD;MACW;MACT,QAAQ,EAAE,oBAAoB,EAAE,cAAc,6BAA6B,CAAC;MAC5E,SAAS,MAAO,EAAS,GAAG,EAAS,uBAAuB,IAAK;MACjE,CAAA,EACC,EANI,EAAQ,GAMZ,CACL;KACC,CAAA,EACJ,KACC,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAU;gBAET,IAAU,aAAkB;MACtB,CAAA;KACL,CAAA,CAEP,EAAA,CAAA,CAED;;GACD,CAAA,CACH"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
|
+
import { useEffect as t, useState as n } from "react";
|
|
3
|
+
import { Check as r, Plus as i, RefreshCw as a, Store as o } from "lucide-react";
|
|
4
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
+
import { graphqlFetch as l } from "@burdenoff/fe-libs/shared/graphql";
|
|
6
|
+
//#region src/pages/StoresPage.tsx
|
|
7
|
+
var u = "\n query BrowseableStores {\n stores {\n id\n slug\n name\n type\n isPublic\n requiresApproval\n currency\n logoUrl\n description\n }\n mySubscribedStores {\n id\n }\n }\n", d = "\n mutation Subscribe($storeId: ID!) {\n subscribeToStore(storeId: $storeId) {\n id\n storeId\n }\n }\n", f = "\n mutation Unsubscribe($storeId: ID!) {\n unsubscribeFromStore(storeId: $storeId)\n }\n", p = () => {
|
|
8
|
+
let { authToken: p } = e(), [m, h] = n([]), [g, _] = n(/* @__PURE__ */ new Set()), [v, y] = n(!1), [b, x] = n(null), [S, C] = n(null), w = async () => {
|
|
9
|
+
y(!0), C(null);
|
|
10
|
+
try {
|
|
11
|
+
let e = await l({
|
|
12
|
+
gateway: "global",
|
|
13
|
+
query: u,
|
|
14
|
+
authToken: p || void 0
|
|
15
|
+
});
|
|
16
|
+
if (e.errors?.length) throw Error(e.errors[0]?.message ?? "Failed to load stores");
|
|
17
|
+
h(e.data?.stores ?? []), _(new Set((e.data?.mySubscribedStores ?? []).map((e) => e.id)));
|
|
18
|
+
} catch (e) {
|
|
19
|
+
C(e instanceof Error ? e.message : "Failed to load stores");
|
|
20
|
+
} finally {
|
|
21
|
+
y(!1);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
t(() => {
|
|
25
|
+
w();
|
|
26
|
+
}, []);
|
|
27
|
+
let T = async (e) => {
|
|
28
|
+
x(e), C(null);
|
|
29
|
+
try {
|
|
30
|
+
let t = g.has(e);
|
|
31
|
+
await l({
|
|
32
|
+
gateway: "global",
|
|
33
|
+
query: t ? f : d,
|
|
34
|
+
variables: { storeId: e },
|
|
35
|
+
authToken: p || void 0
|
|
36
|
+
}), _((n) => {
|
|
37
|
+
let r = new Set(n);
|
|
38
|
+
return t ? r.delete(e) : r.add(e), r;
|
|
39
|
+
});
|
|
40
|
+
} catch (e) {
|
|
41
|
+
C(e instanceof Error ? e.message : "Action failed");
|
|
42
|
+
} finally {
|
|
43
|
+
x(null);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
return /* @__PURE__ */ c("div", {
|
|
47
|
+
className: "min-h-screen bg-surface-default",
|
|
48
|
+
children: [/* @__PURE__ */ s("header", {
|
|
49
|
+
className: "border-b border-border-default bg-surface-raised",
|
|
50
|
+
children: /* @__PURE__ */ c("div", {
|
|
51
|
+
className: "mx-auto max-w-5xl px-6 py-4",
|
|
52
|
+
children: [/* @__PURE__ */ c("div", {
|
|
53
|
+
className: "flex items-center justify-between",
|
|
54
|
+
children: [/* @__PURE__ */ c("div", {
|
|
55
|
+
className: "flex items-center gap-2",
|
|
56
|
+
children: [/* @__PURE__ */ s(o, { className: "h-5 w-5 text-text-primary" }), /* @__PURE__ */ s("h1", {
|
|
57
|
+
className: "text-xl font-semibold text-text-primary",
|
|
58
|
+
children: "Stores"
|
|
59
|
+
})]
|
|
60
|
+
}), /* @__PURE__ */ c("button", {
|
|
61
|
+
type: "button",
|
|
62
|
+
onClick: () => void w(),
|
|
63
|
+
disabled: v,
|
|
64
|
+
className: "inline-flex items-center gap-2 rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary hover:bg-surface-hover",
|
|
65
|
+
children: [/* @__PURE__ */ s(a, { className: `h-4 w-4 ${v ? "animate-spin" : ""}` }), "Refresh"]
|
|
66
|
+
})]
|
|
67
|
+
}), /* @__PURE__ */ s("p", {
|
|
68
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
69
|
+
children: "Subscribe to additional stores to discover more products. Public stores are auto-subscribed."
|
|
70
|
+
})]
|
|
71
|
+
})
|
|
72
|
+
}), /* @__PURE__ */ c("main", {
|
|
73
|
+
className: "mx-auto max-w-5xl px-6 py-6",
|
|
74
|
+
children: [S && /* @__PURE__ */ s("div", {
|
|
75
|
+
role: "alert",
|
|
76
|
+
className: "mb-4 rounded-md border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger",
|
|
77
|
+
children: S
|
|
78
|
+
}), v && m.length === 0 ? /* @__PURE__ */ s("div", {
|
|
79
|
+
role: "status",
|
|
80
|
+
className: "py-16 text-center text-text-secondary",
|
|
81
|
+
children: "Loading stores…"
|
|
82
|
+
}) : m.length === 0 ? /* @__PURE__ */ s("div", {
|
|
83
|
+
className: "py-16 text-center text-text-secondary",
|
|
84
|
+
children: "No stores available."
|
|
85
|
+
}) : /* @__PURE__ */ s("ul", {
|
|
86
|
+
className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
|
|
87
|
+
children: m.map((e) => {
|
|
88
|
+
let t = g.has(e.id);
|
|
89
|
+
return /* @__PURE__ */ c("li", {
|
|
90
|
+
className: "rounded-lg border border-border-default bg-surface-raised p-4",
|
|
91
|
+
children: [/* @__PURE__ */ c("div", {
|
|
92
|
+
className: "flex items-start gap-3",
|
|
93
|
+
children: [e.logoUrl ? /* @__PURE__ */ s("img", {
|
|
94
|
+
src: e.logoUrl,
|
|
95
|
+
alt: "",
|
|
96
|
+
className: "h-12 w-12 flex-shrink-0 rounded-md object-cover"
|
|
97
|
+
}) : /* @__PURE__ */ s("div", {
|
|
98
|
+
className: "flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-md bg-surface-muted text-xs text-text-secondary",
|
|
99
|
+
children: /* @__PURE__ */ s(o, { className: "h-5 w-5" })
|
|
100
|
+
}), /* @__PURE__ */ c("div", {
|
|
101
|
+
className: "min-w-0 flex-1",
|
|
102
|
+
children: [
|
|
103
|
+
/* @__PURE__ */ c("div", {
|
|
104
|
+
className: "flex items-center gap-2",
|
|
105
|
+
children: [/* @__PURE__ */ s("h3", {
|
|
106
|
+
className: "truncate text-base font-semibold text-text-primary",
|
|
107
|
+
children: e.name
|
|
108
|
+
}), /* @__PURE__ */ s("span", {
|
|
109
|
+
className: "rounded-full bg-surface-accent-muted px-2 py-0.5 text-xs font-medium text-text-accent",
|
|
110
|
+
children: e.type
|
|
111
|
+
})]
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ s("p", {
|
|
114
|
+
className: "mt-0.5 font-mono text-xs text-text-tertiary",
|
|
115
|
+
children: e.slug
|
|
116
|
+
}),
|
|
117
|
+
e.description && /* @__PURE__ */ s("p", {
|
|
118
|
+
className: "mt-2 line-clamp-2 text-sm text-text-secondary",
|
|
119
|
+
children: e.description
|
|
120
|
+
})
|
|
121
|
+
]
|
|
122
|
+
})]
|
|
123
|
+
}), /* @__PURE__ */ c("div", {
|
|
124
|
+
className: "mt-3 flex items-center justify-between",
|
|
125
|
+
children: [/* @__PURE__ */ s("span", {
|
|
126
|
+
className: "text-xs text-text-tertiary",
|
|
127
|
+
children: e.currency
|
|
128
|
+
}), e.slug === "public" ? /* @__PURE__ */ c("span", {
|
|
129
|
+
className: "inline-flex items-center gap-1 rounded-md bg-surface-accent-muted px-2 py-1 text-xs text-text-accent",
|
|
130
|
+
children: [/* @__PURE__ */ s(r, { className: "h-3 w-3" }), "Default"]
|
|
131
|
+
}) : t ? /* @__PURE__ */ c("button", {
|
|
132
|
+
type: "button",
|
|
133
|
+
onClick: () => void T(e.id),
|
|
134
|
+
disabled: b === e.id,
|
|
135
|
+
className: "inline-flex items-center gap-1 rounded-md border border-border-default bg-surface-default px-3 py-1 text-xs text-text-primary hover:bg-surface-hover disabled:opacity-60",
|
|
136
|
+
children: [/* @__PURE__ */ s(r, { className: "h-3 w-3" }), "Subscribed"]
|
|
137
|
+
}) : /* @__PURE__ */ c("button", {
|
|
138
|
+
type: "button",
|
|
139
|
+
onClick: () => void T(e.id),
|
|
140
|
+
disabled: b === e.id,
|
|
141
|
+
className: "inline-flex items-center gap-1 rounded-md bg-action-primary-bg px-3 py-1 text-xs font-medium text-action-primary-text hover:opacity-90 disabled:opacity-60",
|
|
142
|
+
children: [/* @__PURE__ */ s(i, { className: "h-3 w-3" }), "Subscribe"]
|
|
143
|
+
})]
|
|
144
|
+
})]
|
|
145
|
+
}, e.id);
|
|
146
|
+
})
|
|
147
|
+
})]
|
|
148
|
+
})]
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
//#endregion
|
|
152
|
+
export { p as StoresPage };
|
|
153
|
+
|
|
154
|
+
//# sourceMappingURL=StoresPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoresPage.js","names":[],"sources":["../../src/pages/StoresPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect, useState } from 'react';\nimport { Store as StoreIcon, Check, Plus, RefreshCw } from 'lucide-react';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { useStore } from '../providers/StoreProvider';\n\ntype StoreRecord = {\n id: string;\n slug: string;\n name: string;\n type: 'PUBLIC' | 'PRIVATE' | 'ENTERPRISE';\n isPublic: boolean;\n requiresApproval: boolean;\n currency: string;\n logoUrl?: string | null;\n description?: string | null;\n};\n\nconst STORES_QUERY = /* GraphQL */ `\n query BrowseableStores {\n stores {\n id\n slug\n name\n type\n isPublic\n requiresApproval\n currency\n logoUrl\n description\n }\n mySubscribedStores {\n id\n }\n }\n`;\n\nconst SUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation Subscribe($storeId: ID!) {\n subscribeToStore(storeId: $storeId) {\n id\n storeId\n }\n }\n`;\n\nconst UNSUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation Unsubscribe($storeId: ID!) {\n unsubscribeFromStore(storeId: $storeId)\n }\n`;\n\nexport const StoresPage: FC = () => {\n const { authToken } = useStore();\n const [stores, setStores] = useState<StoreRecord[]>([]);\n const [subscribed, setSubscribed] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(false);\n const [actingId, setActingId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const load = async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await graphqlFetch<{\n stores: StoreRecord[];\n mySubscribedStores: Array<{ id: string }>;\n }>({\n gateway: 'global',\n query: STORES_QUERY,\n authToken: authToken || undefined,\n });\n if (result.errors?.length) {\n throw new Error(result.errors[0]?.message ?? 'Failed to load stores');\n }\n setStores(result.data?.stores ?? []);\n setSubscribed(new Set((result.data?.mySubscribedStores ?? []).map((s) => s.id)));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load stores');\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n void load();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const toggle = async (storeId: string) => {\n setActingId(storeId);\n setError(null);\n try {\n const isSubbed = subscribed.has(storeId);\n await graphqlFetch({\n gateway: 'global',\n query: isSubbed ? UNSUBSCRIBE_MUTATION : SUBSCRIBE_MUTATION,\n variables: { storeId },\n authToken: authToken || undefined,\n });\n setSubscribed((prev) => {\n const next = new Set(prev);\n if (isSubbed) next.delete(storeId);\n else next.add(storeId);\n return next;\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Action failed');\n } finally {\n setActingId(null);\n }\n };\n\n return (\n <div className=\"min-h-screen bg-surface-default\">\n <header className=\"border-b border-border-default bg-surface-raised\">\n <div className=\"mx-auto max-w-5xl px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <StoreIcon className=\"h-5 w-5 text-text-primary\" />\n <h1 className=\"text-xl font-semibold text-text-primary\">Stores</h1>\n </div>\n <button\n type=\"button\"\n onClick={() => void load()}\n disabled={loading}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary hover:bg-surface-hover\"\n >\n <RefreshCw className={`h-4 w-4 ${loading ? 'animate-spin' : ''}`} />\n Refresh\n </button>\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Subscribe to additional stores to discover more products. Public stores are\n auto-subscribed.\n </p>\n </div>\n </header>\n\n <main className=\"mx-auto max-w-5xl px-6 py-6\">\n {error && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-md border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger\"\n >\n {error}\n </div>\n )}\n\n {loading && stores.length === 0 ? (\n <div role=\"status\" className=\"py-16 text-center text-text-secondary\">\n Loading stores…\n </div>\n ) : stores.length === 0 ? (\n <div className=\"py-16 text-center text-text-secondary\">No stores available.</div>\n ) : (\n <ul className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {stores.map((s) => {\n const isSubbed = subscribed.has(s.id);\n return (\n <li\n key={s.id}\n className=\"rounded-lg border border-border-default bg-surface-raised p-4\"\n >\n <div className=\"flex items-start gap-3\">\n {s.logoUrl ? (\n <img\n src={s.logoUrl}\n alt=\"\"\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n ) : (\n <div className=\"flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-md bg-surface-muted text-xs text-text-secondary\">\n <StoreIcon className=\"h-5 w-5\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">\n {s.name}\n </h3>\n <span className=\"rounded-full bg-surface-accent-muted px-2 py-0.5 text-xs font-medium text-text-accent\">\n {s.type}\n </span>\n </div>\n <p className=\"mt-0.5 font-mono text-xs text-text-tertiary\">{s.slug}</p>\n {s.description && (\n <p className=\"mt-2 line-clamp-2 text-sm text-text-secondary\">\n {s.description}\n </p>\n )}\n </div>\n </div>\n <div className=\"mt-3 flex items-center justify-between\">\n <span className=\"text-xs text-text-tertiary\">{s.currency}</span>\n {s.slug === 'public' ? (\n <span className=\"inline-flex items-center gap-1 rounded-md bg-surface-accent-muted px-2 py-1 text-xs text-text-accent\">\n <Check className=\"h-3 w-3\" />\n Default\n </span>\n ) : isSubbed ? (\n <button\n type=\"button\"\n onClick={() => void toggle(s.id)}\n disabled={actingId === s.id}\n className=\"inline-flex items-center gap-1 rounded-md border border-border-default bg-surface-default px-3 py-1 text-xs text-text-primary hover:bg-surface-hover disabled:opacity-60\"\n >\n <Check className=\"h-3 w-3\" />\n Subscribed\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => void toggle(s.id)}\n disabled={actingId === s.id}\n className=\"inline-flex items-center gap-1 rounded-md bg-action-primary-bg px-3 py-1 text-xs font-medium text-action-primary-text hover:opacity-90 disabled:opacity-60\"\n >\n <Plus className=\"h-3 w-3\" />\n Subscribe\n </button>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
|
+
import { StoreRootProps, User } from '../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Store context value
|
|
6
|
+
*/
|
|
7
|
+
interface StoreContextValue extends Omit<StoreRootProps, 'children'> {
|
|
8
|
+
basePath: string;
|
|
9
|
+
apiGatewayUrl: string;
|
|
10
|
+
authToken?: string;
|
|
11
|
+
user?: User;
|
|
12
|
+
productId?: string;
|
|
13
|
+
productName?: string;
|
|
14
|
+
defaultCompatibleWith?: string;
|
|
15
|
+
features: {
|
|
16
|
+
enablePhysicalProducts: boolean;
|
|
17
|
+
enablePublisherPortal: boolean;
|
|
18
|
+
enableReviews: boolean;
|
|
19
|
+
enableSubscriptions: boolean;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Props for StoreProvider
|
|
24
|
+
*/
|
|
25
|
+
interface StoreProviderProps extends StoreRootProps {
|
|
26
|
+
children: ReactNode;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* StoreProvider component
|
|
30
|
+
*
|
|
31
|
+
* Provides store context to all child components.
|
|
32
|
+
*/
|
|
33
|
+
export declare const StoreProvider: FC<StoreProviderProps>;
|
|
34
|
+
/**
|
|
35
|
+
* Hook to use store context
|
|
36
|
+
*/
|
|
37
|
+
export declare function useStore(): StoreContextValue;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createContext as e, useContext as t, useMemo as n } from "react";
|
|
2
|
+
import { PermissionProvider as r } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
3
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
4
|
+
//#region src/providers/StoreProvider.tsx
|
|
5
|
+
var a = e(null), o = ({ children: e, basePath: t = "/", apiGatewayUrl: o, authToken: s, features: c = {}, user: l, currentUser: u, productId: d, productName: f, defaultCompatibleWith: p, ...m }) => {
|
|
6
|
+
let h = n(() => ({
|
|
7
|
+
...m,
|
|
8
|
+
basePath: t,
|
|
9
|
+
apiGatewayUrl: o || "",
|
|
10
|
+
authToken: s,
|
|
11
|
+
user: l || u,
|
|
12
|
+
currentUser: u || l,
|
|
13
|
+
productId: d,
|
|
14
|
+
productName: f,
|
|
15
|
+
defaultCompatibleWith: p,
|
|
16
|
+
features: {
|
|
17
|
+
enablePhysicalProducts: c.enablePhysicalProducts ?? !0,
|
|
18
|
+
enablePublisherPortal: c.enablePublisherPortal ?? !0,
|
|
19
|
+
enableReviews: c.enableReviews ?? !0,
|
|
20
|
+
enableSubscriptions: c.enableSubscriptions ?? !0
|
|
21
|
+
}
|
|
22
|
+
}), [
|
|
23
|
+
m,
|
|
24
|
+
t,
|
|
25
|
+
o,
|
|
26
|
+
s,
|
|
27
|
+
l,
|
|
28
|
+
u,
|
|
29
|
+
d,
|
|
30
|
+
f,
|
|
31
|
+
p,
|
|
32
|
+
c
|
|
33
|
+
]);
|
|
34
|
+
return /* @__PURE__ */ i(a.Provider, {
|
|
35
|
+
value: h,
|
|
36
|
+
children: /* @__PURE__ */ i(r, {
|
|
37
|
+
scopeId: h.organizationId ?? null,
|
|
38
|
+
gateway: "global",
|
|
39
|
+
children: e
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
function s() {
|
|
44
|
+
let e = t(a);
|
|
45
|
+
if (!e) throw Error("useStore must be used within StoreProvider");
|
|
46
|
+
return e;
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { o as StoreProvider, s as useStore };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=StoreProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreProvider.js","names":[],"sources":["../../src/providers/StoreProvider.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { createContext, useContext, useMemo } from 'react';\nimport { PermissionProvider } from '@burdenoff/fe-libs/shared/providers/shell';\nimport type { StoreRootProps, User } from '../types';\n\n/**\n * Store context value\n */\ninterface StoreContextValue extends Omit<StoreRootProps, 'children'> {\n basePath: string;\n apiGatewayUrl: string;\n authToken?: string;\n user?: User;\n productId?: string;\n productName?: string;\n defaultCompatibleWith?: string;\n features: {\n enablePhysicalProducts: boolean;\n enablePublisherPortal: boolean;\n enableReviews: boolean;\n enableSubscriptions: boolean;\n };\n}\n\n/**\n * Store context\n */\nconst StoreContext = createContext<StoreContextValue | null>(null);\n\n/**\n * Props for StoreProvider\n */\ninterface StoreProviderProps extends StoreRootProps {\n children: ReactNode;\n}\n\n/**\n * StoreProvider component\n *\n * Provides store context to all child components.\n */\nexport const StoreProvider: FC<StoreProviderProps> = ({\n children,\n basePath = '/',\n apiGatewayUrl,\n authToken,\n features = {},\n user,\n currentUser,\n productId,\n productName,\n defaultCompatibleWith,\n ...props\n}) => {\n const value = useMemo<StoreContextValue>(\n () => ({\n ...props,\n basePath,\n apiGatewayUrl: apiGatewayUrl || '',\n authToken,\n user: user || currentUser,\n currentUser: currentUser || user,\n productId,\n productName,\n defaultCompatibleWith,\n features: {\n enablePhysicalProducts: features.enablePhysicalProducts ?? true,\n enablePublisherPortal: features.enablePublisherPortal ?? true,\n enableReviews: features.enableReviews ?? true,\n enableSubscriptions: features.enableSubscriptions ?? true,\n },\n }),\n [\n props,\n basePath,\n apiGatewayUrl,\n authToken,\n user,\n currentUser,\n productId,\n productName,\n defaultCompatibleWith,\n features,\n ]\n );\n\n return (\n <StoreContext.Provider value={value}>\n <PermissionProvider scopeId={value.organizationId ?? null} gateway=\"global\">\n {children}\n </PermissionProvider>\n </StoreContext.Provider>\n );\n};\n\n/**\n * Hook to use store context\n */\nexport function useStore(): StoreContextValue {\n const context = useContext(StoreContext);\n\n if (!context) {\n throw new Error('useStore must be used within StoreProvider');\n }\n\n return context;\n}\n"],"mappings":";;;;AA2BA,IAAM,IAAe,EAAwC,KAAK,EAcrD,KAAyC,EACpD,aACA,cAAW,KACX,kBACA,cACA,cAAW,EAAE,EACb,SACA,gBACA,cACA,gBACA,0BACA,GAAG,QACC;CACJ,IAAM,IAAQ,SACL;EACL,GAAG;EACH;EACA,eAAe,KAAiB;EAChC;EACA,MAAM,KAAQ;EACd,aAAa,KAAe;EAC5B;EACA;EACA;EACA,UAAU;GACR,wBAAwB,EAAS,0BAA0B;GAC3D,uBAAuB,EAAS,yBAAyB;GACzD,eAAe,EAAS,iBAAiB;GACzC,qBAAqB,EAAS,uBAAuB;GACtD;EACF,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,kBAAC,EAAa,UAAd;EAA8B;YAC5B,kBAAC,GAAD;GAAoB,SAAS,EAAM,kBAAkB;GAAM,SAAQ;GAChE;GACkB,CAAA;EACC,CAAA;;AAO5B,SAAgB,IAA8B;CAC5C,IAAM,IAAU,EAAW,EAAa;AAExC,KAAI,CAAC,EACH,OAAU,MAAM,6CAA6C;AAG/D,QAAO"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ProductFilter, ViewMode, SortBy, InstallationStatus } from '../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Active installation state
|
|
5
|
+
*/
|
|
6
|
+
interface ActiveInstallation {
|
|
7
|
+
productId: string;
|
|
8
|
+
productName: string;
|
|
9
|
+
status: InstallationStatus;
|
|
10
|
+
progress: number;
|
|
11
|
+
message?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Store state
|
|
15
|
+
*
|
|
16
|
+
* NOTE: Cart and Order data are now managed by backend via GraphQL.
|
|
17
|
+
* Only UI state is kept in Zustand.
|
|
18
|
+
*/
|
|
19
|
+
interface StoreState {
|
|
20
|
+
cartOpen: boolean;
|
|
21
|
+
searchQuery: string;
|
|
22
|
+
activeFilters: ProductFilter;
|
|
23
|
+
viewMode: ViewMode;
|
|
24
|
+
sortBy: SortBy;
|
|
25
|
+
activeInstallation: ActiveInstallation | null;
|
|
26
|
+
selectedCategoryId: string | null;
|
|
27
|
+
selectedPublisherId: string | null;
|
|
28
|
+
showFiltersPanel: boolean;
|
|
29
|
+
showCartDrawer: boolean;
|
|
30
|
+
showInstallationModal: boolean;
|
|
31
|
+
showLicenseActivationModal: boolean;
|
|
32
|
+
showSubmissionDrawer: boolean;
|
|
33
|
+
toggleCart: () => void;
|
|
34
|
+
setCartOpen: (open: boolean) => void;
|
|
35
|
+
setSearchQuery: (query: string) => void;
|
|
36
|
+
updateFilters: (filters: Partial<ProductFilter>) => void;
|
|
37
|
+
clearFilters: () => void;
|
|
38
|
+
resetFilters: () => void;
|
|
39
|
+
setViewMode: (mode: ViewMode) => void;
|
|
40
|
+
setSortBy: (sort: SortBy) => void;
|
|
41
|
+
setActiveInstallation: (installation: ActiveInstallation | null) => void;
|
|
42
|
+
updateInstallationProgress: (progress: number, message?: string) => void;
|
|
43
|
+
setSelectedCategoryId: (categoryId: string | null) => void;
|
|
44
|
+
setSelectedPublisherId: (publisherId: string | null) => void;
|
|
45
|
+
toggleFiltersPanel: () => void;
|
|
46
|
+
setShowFiltersPanel: (show: boolean) => void;
|
|
47
|
+
setShowCartDrawer: (show: boolean) => void;
|
|
48
|
+
setShowInstallationModal: (show: boolean) => void;
|
|
49
|
+
setShowLicenseActivationModal: (show: boolean) => void;
|
|
50
|
+
setShowSubmissionDrawer: (show: boolean) => void;
|
|
51
|
+
resetState: () => void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Store using Zustand with persistence
|
|
55
|
+
*/
|
|
56
|
+
export declare const useStoreStore: import('zustand').UseBoundStore<Omit<import('zustand').StoreApi<StoreState>, "setState" | "persist"> & {
|
|
57
|
+
setState(partial: StoreState | Partial<StoreState> | ((state: StoreState) => StoreState | Partial<StoreState>), replace?: false | undefined): unknown;
|
|
58
|
+
setState(state: StoreState | ((state: StoreState) => StoreState), replace: true): unknown;
|
|
59
|
+
persist: {
|
|
60
|
+
setOptions: (options: Partial<import('zustand/middleware').PersistOptions<StoreState, unknown, unknown>>) => void;
|
|
61
|
+
clearStorage: () => void;
|
|
62
|
+
rehydrate: () => Promise<void> | void;
|
|
63
|
+
hasHydrated: () => boolean;
|
|
64
|
+
onHydrate: (fn: (state: StoreState) => void) => () => void;
|
|
65
|
+
onFinishHydration: (fn: (state: StoreState) => void) => () => void;
|
|
66
|
+
getOptions: () => Partial<import('zustand/middleware').PersistOptions<StoreState, unknown, unknown>>;
|
|
67
|
+
};
|
|
68
|
+
}>;
|
|
69
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { create as e } from "zustand";
|
|
2
|
+
import { persist as t } from "zustand/middleware";
|
|
3
|
+
import { createProfileScopedStorage as n } from "@burdenoff/fe-libs/shared/utils";
|
|
4
|
+
//#region src/store/storeStore.ts
|
|
5
|
+
var r = {
|
|
6
|
+
cartOpen: !1,
|
|
7
|
+
searchQuery: "",
|
|
8
|
+
activeFilters: {},
|
|
9
|
+
viewMode: "grid",
|
|
10
|
+
sortBy: "relevance",
|
|
11
|
+
activeInstallation: null,
|
|
12
|
+
selectedCategoryId: null,
|
|
13
|
+
selectedPublisherId: null,
|
|
14
|
+
showFiltersPanel: !1,
|
|
15
|
+
showCartDrawer: !1,
|
|
16
|
+
showInstallationModal: !1,
|
|
17
|
+
showLicenseActivationModal: !1,
|
|
18
|
+
showSubmissionDrawer: !1
|
|
19
|
+
}, i = e()(t((e, t) => ({
|
|
20
|
+
...r,
|
|
21
|
+
toggleCart: () => e((e) => ({ cartOpen: !e.cartOpen })),
|
|
22
|
+
setCartOpen: (t) => e({ cartOpen: t }),
|
|
23
|
+
setSearchQuery: (t) => e({ searchQuery: t }),
|
|
24
|
+
updateFilters: (t) => e((e) => ({ activeFilters: {
|
|
25
|
+
...e.activeFilters,
|
|
26
|
+
...t
|
|
27
|
+
} })),
|
|
28
|
+
clearFilters: () => e({
|
|
29
|
+
activeFilters: {},
|
|
30
|
+
searchQuery: ""
|
|
31
|
+
}),
|
|
32
|
+
resetFilters: () => e({ activeFilters: {} }),
|
|
33
|
+
setViewMode: (t) => e({ viewMode: t }),
|
|
34
|
+
setSortBy: (t) => e({ sortBy: t }),
|
|
35
|
+
setActiveInstallation: (t) => e({
|
|
36
|
+
activeInstallation: t,
|
|
37
|
+
showInstallationModal: t !== null
|
|
38
|
+
}),
|
|
39
|
+
updateInstallationProgress: (t, n) => e((e) => e.activeInstallation ? { activeInstallation: {
|
|
40
|
+
...e.activeInstallation,
|
|
41
|
+
progress: t,
|
|
42
|
+
message: n
|
|
43
|
+
} } : e),
|
|
44
|
+
setSelectedCategoryId: (t) => e({ selectedCategoryId: t }),
|
|
45
|
+
setSelectedPublisherId: (t) => e({ selectedPublisherId: t }),
|
|
46
|
+
toggleFiltersPanel: () => e((e) => ({ showFiltersPanel: !e.showFiltersPanel })),
|
|
47
|
+
setShowFiltersPanel: (t) => e({ showFiltersPanel: t }),
|
|
48
|
+
setShowCartDrawer: (t) => e({
|
|
49
|
+
showCartDrawer: t,
|
|
50
|
+
cartOpen: t
|
|
51
|
+
}),
|
|
52
|
+
setShowInstallationModal: (t) => e({ showInstallationModal: t }),
|
|
53
|
+
setShowLicenseActivationModal: (t) => e({ showLicenseActivationModal: t }),
|
|
54
|
+
setShowSubmissionDrawer: (t) => e({ showSubmissionDrawer: t }),
|
|
55
|
+
resetState: () => e({ ...r })
|
|
56
|
+
}), {
|
|
57
|
+
name: "burdenoff-store-storage",
|
|
58
|
+
storage: n(),
|
|
59
|
+
partialize: (e) => ({
|
|
60
|
+
viewMode: e.viewMode,
|
|
61
|
+
sortBy: e.sortBy,
|
|
62
|
+
activeFilters: e.activeFilters
|
|
63
|
+
})
|
|
64
|
+
}));
|
|
65
|
+
//#endregion
|
|
66
|
+
export { i as useStoreStore };
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=storeStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeStore.js","names":[],"sources":["../../src/store/storeStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\nimport type { ProductFilter, ViewMode, SortBy, InstallationStatus } from '../types';\n\n/**\n * Active installation state\n */\ninterface ActiveInstallation {\n productId: string;\n productName: string;\n status: InstallationStatus;\n progress: number;\n message?: string;\n}\n\n/**\n * Store state\n *\n * NOTE: Cart and Order data are now managed by backend via GraphQL.\n * Only UI state is kept in Zustand.\n */\ninterface StoreState {\n // Cart UI state (NOT cart data - that's in backend)\n cartOpen: boolean;\n\n // Search and filter state\n searchQuery: string;\n activeFilters: ProductFilter;\n\n // View state\n viewMode: ViewMode;\n sortBy: SortBy;\n\n // Installation state\n activeInstallation: ActiveInstallation | null;\n\n // Selected items\n selectedCategoryId: string | null;\n selectedPublisherId: string | null;\n\n // UI state\n showFiltersPanel: boolean;\n showCartDrawer: boolean;\n showInstallationModal: boolean;\n showLicenseActivationModal: boolean;\n showSubmissionDrawer: boolean;\n\n // Actions - Cart UI only (cart data managed by backend)\n toggleCart: () => void;\n setCartOpen: (open: boolean) => void;\n\n // Actions - Search and Filters\n setSearchQuery: (query: string) => void;\n updateFilters: (filters: Partial<ProductFilter>) => void;\n clearFilters: () => void;\n resetFilters: () => void;\n\n // Actions - View\n setViewMode: (mode: ViewMode) => void;\n setSortBy: (sort: SortBy) => void;\n\n // Actions - Installation\n setActiveInstallation: (installation: ActiveInstallation | null) => void;\n updateInstallationProgress: (progress: number, message?: string) => void;\n\n // Actions - Selection\n setSelectedCategoryId: (categoryId: string | null) => void;\n setSelectedPublisherId: (publisherId: string | null) => void;\n\n // Actions - UI\n toggleFiltersPanel: () => void;\n setShowFiltersPanel: (show: boolean) => void;\n setShowCartDrawer: (show: boolean) => void;\n setShowInstallationModal: (show: boolean) => void;\n setShowLicenseActivationModal: (show: boolean) => void;\n setShowSubmissionDrawer: (show: boolean) => void;\n\n // Actions - Reset\n resetState: () => void;\n}\n\n/**\n * Initial state\n *\n * NOTE: Cart and Order data are now managed by backend, not stored here.\n */\nconst initialState = {\n cartOpen: false,\n searchQuery: '',\n activeFilters: {},\n viewMode: 'grid' as ViewMode,\n sortBy: 'relevance' as SortBy,\n activeInstallation: null,\n selectedCategoryId: null,\n selectedPublisherId: null,\n showFiltersPanel: false,\n showCartDrawer: false,\n showInstallationModal: false,\n showLicenseActivationModal: false,\n showSubmissionDrawer: false,\n};\n\n/**\n * Store using Zustand with persistence\n */\nexport const useStoreStore = create<StoreState>()(\n persist(\n (set, _get) => ({\n ...initialState,\n\n // Cart UI actions (cart data now managed by backend)\n toggleCart: () =>\n set((state) => ({\n cartOpen: !state.cartOpen,\n })),\n\n setCartOpen: (open) =>\n set({\n cartOpen: open,\n }),\n\n // Search and filter actions\n setSearchQuery: (query) =>\n set({\n searchQuery: query,\n }),\n\n updateFilters: (filters) =>\n set((state) => ({\n activeFilters: { ...state.activeFilters, ...filters },\n })),\n\n clearFilters: () =>\n set({\n activeFilters: {},\n searchQuery: '',\n }),\n\n resetFilters: () =>\n set({\n activeFilters: {},\n }),\n\n // View actions\n setViewMode: (mode) =>\n set({\n viewMode: mode,\n }),\n\n setSortBy: (sort) =>\n set({\n sortBy: sort,\n }),\n\n // Installation actions\n setActiveInstallation: (installation) =>\n set({\n activeInstallation: installation,\n showInstallationModal: installation !== null,\n }),\n\n updateInstallationProgress: (progress, message) =>\n set((state) => {\n if (!state.activeInstallation) return state;\n\n return {\n activeInstallation: {\n ...state.activeInstallation,\n progress,\n message,\n },\n };\n }),\n\n // Selection actions\n setSelectedCategoryId: (categoryId) =>\n set({\n selectedCategoryId: categoryId,\n }),\n\n setSelectedPublisherId: (publisherId) =>\n set({\n selectedPublisherId: publisherId,\n }),\n\n // UI actions\n toggleFiltersPanel: () =>\n set((state) => ({\n showFiltersPanel: !state.showFiltersPanel,\n })),\n\n setShowFiltersPanel: (show) =>\n set({\n showFiltersPanel: show,\n }),\n\n setShowCartDrawer: (show) =>\n set({\n showCartDrawer: show,\n cartOpen: show,\n }),\n\n setShowInstallationModal: (show) =>\n set({\n showInstallationModal: show,\n }),\n\n setShowLicenseActivationModal: (show) =>\n set({\n showLicenseActivationModal: show,\n }),\n\n setShowSubmissionDrawer: (show) =>\n set({\n showSubmissionDrawer: show,\n }),\n\n // Reset action\n resetState: () =>\n set({\n ...initialState,\n }),\n }),\n {\n name: 'burdenoff-store-storage',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n // NOTE: Cart and Order data are NOT persisted - they're managed by backend\n viewMode: state.viewMode,\n sortBy: state.sortBy,\n activeFilters: state.activeFilters,\n }),\n }\n )\n);\n"],"mappings":";;;;AAuFA,IAAM,IAAe;CACnB,UAAU;CACV,aAAa;CACb,eAAe,EAAE;CACjB,UAAU;CACV,QAAQ;CACR,oBAAoB;CACpB,oBAAoB;CACpB,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,uBAAuB;CACvB,4BAA4B;CAC5B,sBAAsB;CACvB,EAKY,IAAgB,GAAoB,CAC/C,GACG,GAAK,OAAU;CACd,GAAG;CAGH,kBACE,GAAK,OAAW,EACd,UAAU,CAAC,EAAM,UAClB,EAAE;CAEL,cAAc,MACZ,EAAI,EACF,UAAU,GACX,CAAC;CAGJ,iBAAiB,MACf,EAAI,EACF,aAAa,GACd,CAAC;CAEJ,gBAAgB,MACd,GAAK,OAAW,EACd,eAAe;EAAE,GAAG,EAAM;EAAe,GAAG;EAAS,EACtD,EAAE;CAEL,oBACE,EAAI;EACF,eAAe,EAAE;EACjB,aAAa;EACd,CAAC;CAEJ,oBACE,EAAI,EACF,eAAe,EAAE,EAClB,CAAC;CAGJ,cAAc,MACZ,EAAI,EACF,UAAU,GACX,CAAC;CAEJ,YAAY,MACV,EAAI,EACF,QAAQ,GACT,CAAC;CAGJ,wBAAwB,MACtB,EAAI;EACF,oBAAoB;EACpB,uBAAuB,MAAiB;EACzC,CAAC;CAEJ,6BAA6B,GAAU,MACrC,GAAK,MACE,EAAM,qBAEJ,EACL,oBAAoB;EAClB,GAAG,EAAM;EACT;EACA;EACD,EACF,GARqC,EAStC;CAGJ,wBAAwB,MACtB,EAAI,EACF,oBAAoB,GACrB,CAAC;CAEJ,yBAAyB,MACvB,EAAI,EACF,qBAAqB,GACtB,CAAC;CAGJ,0BACE,GAAK,OAAW,EACd,kBAAkB,CAAC,EAAM,kBAC1B,EAAE;CAEL,sBAAsB,MACpB,EAAI,EACF,kBAAkB,GACnB,CAAC;CAEJ,oBAAoB,MAClB,EAAI;EACF,gBAAgB;EAChB,UAAU;EACX,CAAC;CAEJ,2BAA2B,MACzB,EAAI,EACF,uBAAuB,GACxB,CAAC;CAEJ,gCAAgC,MAC9B,EAAI,EACF,4BAA4B,GAC7B,CAAC;CAEJ,0BAA0B,MACxB,EAAI,EACF,sBAAsB,GACvB,CAAC;CAGJ,kBACE,EAAI,EACF,GAAG,GACJ,CAAC;CACL,GACD;CACE,MAAM;CACN,SAAS,GAA4B;CACrC,aAAa,OAAW;EAEtB,UAAU,EAAM;EAChB,QAAQ,EAAM;EACd,eAAe,EAAM;EACtB;CACF,CACF,CACF"}
|