@fayz-ai/plugin-shop 0.2.2 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @fayz-ai/plugin-shop
2
2
 
3
+ > **Status: experimental (incubating).** Not capability-complete — missing some or all of the capability bar (data-provider contract w/ supabase+mock pair, entity registries, settings, migrations; see `docs/PLUGIN-PATTERNS.md`). Fine to explore in dogfoods; NOT ready for fresh installs or generated apps, and its API may change without notice.
4
+
3
5
  > Drop a real storefront admin into any Fayz app — products, orders, customers, discounts.
4
6
 
5
7
  [![npm](https://img.shields.io/npm/v/@fayz-ai/plugin-shop.svg)](https://www.npmjs.com/package/@fayz-ai/plugin-shop)
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export interface ShopSettingsProps {
3
+ currency?: {
4
+ code?: string;
5
+ locale?: string;
6
+ symbol?: string;
7
+ };
8
+ }
9
+ /**
10
+ * Shop plugin settings — store, catalog, checkout and notification config.
11
+ * Seeded from the plugin's currency option; interactive (local state). Wire to
12
+ * persisted plugin prefs when the shop settings store lands.
13
+ */
14
+ export declare function ShopSettings({ currency }: ShopSettingsProps): React.JSX.Element;
15
+ //# sourceMappingURL=ShopSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShopSettings.d.ts","sourceRoot":"","sources":["../../src/components/ShopSettings.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/D;AAeD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAkF3D"}
package/dist/index.cjs CHANGED
@@ -3,15 +3,133 @@
3
3
  var React = require('react');
4
4
  var shop = require('@fayz-ai/shop');
5
5
  var saas = require('@fayz-ai/saas');
6
+ var jsxRuntime = require('react/jsx-runtime');
6
7
 
7
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
9
 
9
10
  var React__default = /*#__PURE__*/_interopDefault(React);
10
11
 
12
+ // src/index.ts
13
+ var CURRENCIES = [
14
+ { value: "BRL", label: "Real (R$)" },
15
+ { value: "USD", label: "US Dollar ($)" },
16
+ { value: "EUR", label: "Euro (\u20AC)" },
17
+ { value: "GBP", label: "British Pound (\xA3)" }
18
+ ];
19
+ var LOCALES = [
20
+ { value: "pt-BR", label: "Portugu\xEAs (Brasil)" },
21
+ { value: "en-US", label: "English (US)" },
22
+ { value: "es-ES", label: "Espa\xF1ol" }
23
+ ];
24
+ function ShopSettings({ currency }) {
25
+ const [code, setCode] = React__default.default.useState(currency?.code ?? "BRL");
26
+ const [locale, setLocale] = React__default.default.useState(currency?.locale ?? "pt-BR");
27
+ const [showOutOfStock, setShowOutOfStock] = React__default.default.useState(true);
28
+ const [trackInventory, setTrackInventory] = React__default.default.useState(true);
29
+ const [requireSku, setRequireSku] = React__default.default.useState(false);
30
+ const [guestCheckout, setGuestCheckout] = React__default.default.useState(true);
31
+ const [enableDiscounts, setEnableDiscounts] = React__default.default.useState(true);
32
+ const [orderEmails, setOrderEmails] = React__default.default.useState(true);
33
+ const [lowStockAlerts, setLowStockAlerts] = React__default.default.useState(false);
34
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
35
+ /* @__PURE__ */ jsxRuntime.jsxs(saas.SettingsGroup, { title: "Loja", description: "Moeda e formata\xE7\xE3o da vitrine.", children: [
36
+ /* @__PURE__ */ jsxRuntime.jsx(
37
+ saas.SelectRow,
38
+ {
39
+ label: "Moeda",
40
+ description: "Moeda padr\xE3o para pre\xE7os e checkout.",
41
+ value: code,
42
+ options: CURRENCIES,
43
+ onChange: setCode
44
+ }
45
+ ),
46
+ /* @__PURE__ */ jsxRuntime.jsx(
47
+ saas.SelectRow,
48
+ {
49
+ label: "Idioma / formato",
50
+ description: "Formata\xE7\xE3o de n\xFAmeros, pre\xE7os e datas.",
51
+ value: locale,
52
+ options: LOCALES,
53
+ onChange: setLocale
54
+ }
55
+ )
56
+ ] }),
57
+ /* @__PURE__ */ jsxRuntime.jsxs(saas.SettingsGroup, { title: "Cat\xE1logo", description: "Como os produtos aparecem e s\xE3o gerenciados.", children: [
58
+ /* @__PURE__ */ jsxRuntime.jsx(
59
+ saas.ToggleRow,
60
+ {
61
+ label: "Mostrar produtos esgotados",
62
+ description: "Exibir itens sem estoque na vitrine.",
63
+ checked: showOutOfStock,
64
+ onChange: setShowOutOfStock
65
+ }
66
+ ),
67
+ /* @__PURE__ */ jsxRuntime.jsx(
68
+ saas.ToggleRow,
69
+ {
70
+ label: "Controlar estoque",
71
+ description: "Acompanhar quantidade e dar baixa no checkout.",
72
+ checked: trackInventory,
73
+ onChange: setTrackInventory
74
+ }
75
+ ),
76
+ /* @__PURE__ */ jsxRuntime.jsx(
77
+ saas.ToggleRow,
78
+ {
79
+ label: "Exigir SKU",
80
+ description: "Tornar o SKU obrigat\xF3rio ao criar produtos.",
81
+ checked: requireSku,
82
+ onChange: setRequireSku
83
+ }
84
+ )
85
+ ] }),
86
+ /* @__PURE__ */ jsxRuntime.jsxs(saas.SettingsGroup, { title: "Checkout", description: "Op\xE7\xF5es de compra e pagamento.", children: [
87
+ /* @__PURE__ */ jsxRuntime.jsx(
88
+ saas.ToggleRow,
89
+ {
90
+ label: "Checkout sem cadastro",
91
+ description: "Permitir compra como convidado.",
92
+ checked: guestCheckout,
93
+ onChange: setGuestCheckout
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsxRuntime.jsx(
97
+ saas.ToggleRow,
98
+ {
99
+ label: "Cupons de desconto",
100
+ description: "Habilitar c\xF3digos de desconto no carrinho.",
101
+ checked: enableDiscounts,
102
+ onChange: setEnableDiscounts
103
+ }
104
+ )
105
+ ] }),
106
+ /* @__PURE__ */ jsxRuntime.jsxs(saas.SettingsGroup, { title: "Notifica\xE7\xF5es", description: "Avisos por e-mail da loja.", children: [
107
+ /* @__PURE__ */ jsxRuntime.jsx(
108
+ saas.ToggleRow,
109
+ {
110
+ label: "E-mail de novo pedido",
111
+ description: "Notificar a equipe a cada novo pedido.",
112
+ checked: orderEmails,
113
+ onChange: setOrderEmails
114
+ }
115
+ ),
116
+ /* @__PURE__ */ jsxRuntime.jsx(
117
+ saas.ToggleRow,
118
+ {
119
+ label: "Alerta de estoque baixo",
120
+ description: "Avisar quando produtos atingirem o m\xEDnimo.",
121
+ checked: lowStockAlerts,
122
+ onChange: setLowStockAlerts
123
+ }
124
+ )
125
+ ] })
126
+ ] });
127
+ }
128
+
11
129
  // src/index.ts
12
130
  var ShopPage = React__default.default.lazy(() => import('./ShopPage-PG5GKOZU.cjs').then((m) => ({ default: m.ShopPage })));
13
131
  function createShopPlugin(options) {
14
- const curr = { code: "BRL", symbol: "R$", ...options?.currency };
132
+ const curr = { code: "BRL", locale: "pt-BR", symbol: "R$", ...options?.currency };
15
133
  shop.setShopTenantResolver(() => saas.useOrganizationStore.getState().currentOrg?.id);
16
134
  const PageComponent = () => React__default.default.createElement(
17
135
  React__default.default.Suspense,
@@ -94,16 +212,7 @@ function createShopPlugin(options) {
94
212
  label: "Shop",
95
213
  icon: "ShoppingBag",
96
214
  component: (() => {
97
- const ShopSettingsTab = () => React__default.default.createElement(
98
- "div",
99
- { className: "p-4 space-y-2" },
100
- React__default.default.createElement("h2", { className: "text-lg font-semibold" }, "Configura\xE7\xF5es da Loja"),
101
- React__default.default.createElement(
102
- "p",
103
- { className: "text-sm text-muted-foreground" },
104
- `Moeda: ${curr.symbol} (${curr.code})`
105
- )
106
- );
215
+ const ShopSettingsTab = () => React__default.default.createElement(ShopSettings, { currency: curr });
107
216
  ShopSettingsTab.displayName = "ShopSettingsTab";
108
217
  return ShopSettingsTab;
109
218
  })(),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["React","setShopTenantResolver","useOrganizationStore"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { setShopTenantResolver } from '@fayz-ai/shop'\nimport { useOrganizationStore } from '@fayz-ai/saas'\nimport type { ShopProviderResolver } from './ShopPage'\n\nconst ShopPage = React.lazy(() => import('./ShopPage').then((m) => ({ default: m.ShopPage })))\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShopPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n scope?: PluginScope\n verticalId?: VerticalId\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createShopPlugin(options?: ShopPluginOptions): PluginManifest {\n const curr = { code: 'BRL', locale: 'pt-BR', symbol: 'R$', ...options?.currency }\n\n // Scope fallback shop queries to the active organization. Apps can inject a\n // provider when they want SDK-owned data access instead of the global runtime.\n setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n const PageComponent: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(ShopPage as React.ComponentType<{ provider?: ShopProviderResolver }>, {\n provider: options?.provider,\n })\n )\n PageComponent.displayName = 'ShopPageWrapper'\n\n return {\n id: 'shop',\n name: options?.navLabel ?? 'Shop',\n icon: 'ShoppingBag',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 6,\n label: options?.navLabel ?? 'Shop',\n route: '/shop',\n icon: 'ShoppingBag',\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/shop',\n component: PageComponent,\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'shop.list-products',\n name: 'listProducts',\n description: 'Lists products in the shop catalog.',\n icon: 'Package',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Filter by name' },\n status: { type: 'string' as const, enum: ['draft', 'active', 'archived'] },\n },\n },\n suggestions: [\n { label: 'What products are available?' },\n { label: 'Which products are out of stock?' },\n ],\n },\n {\n id: 'shop.list-orders',\n name: 'listOrders',\n description: 'Lists recent shop orders.',\n icon: 'ShoppingCart',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n financialStatus: { type: 'string' as const, enum: ['pending', 'paid', 'refunded', 'voided'] },\n fulfillmentStatus: { type: 'string' as const, enum: ['unfulfilled', 'partially_fulfilled', 'fulfilled'] },\n },\n },\n suggestions: [\n { label: 'Show me pending orders' },\n { label: 'How many orders were paid today?' },\n ],\n },\n ],\n settings: [\n {\n id: 'shop',\n label: 'Shop',\n icon: 'ShoppingBag',\n component: (() => {\n const ShopSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement('div', { className: 'p-4 space-y-2' },\n React.createElement('h2', { className: 'text-lg font-semibold' }, 'Configurações da Loja'),\n React.createElement('p', { className: 'text-sm text-muted-foreground' },\n `Moeda: ${curr.symbol} (${curr.code})`\n )\n )\n ShopSettingsTab.displayName = 'ShopSettingsTab'\n return ShopSettingsTab\n })(),\n order: 30,\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n }\n}\n\n// Re-export shop types so consumer apps only need @fayz-ai/plugin-shop\nexport type {\n Product, Order, ShopCustomer, Discount, Category,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions,\n} from '@fayz-ai/shop'\n"]}
1
+ {"version":3,"sources":["../src/components/ShopSettings.tsx","../src/index.ts"],"names":["React","jsxs","SettingsGroup","jsx","SelectRow","ToggleRow","setShopTenantResolver","useOrganizationStore"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react'\nimport { SettingsGroup, ToggleRow, SelectRow } from '@fayz-ai/saas'\n\nexport interface ShopSettingsProps {\n currency?: { code?: string; locale?: string; symbol?: string }\n}\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'Real (R$)' },\n { value: 'USD', label: 'US Dollar ($)' },\n { value: 'EUR', label: 'Euro (€)' },\n { value: 'GBP', label: 'British Pound (£)' },\n]\n\nconst LOCALES = [\n { value: 'pt-BR', label: 'Português (Brasil)' },\n { value: 'en-US', label: 'English (US)' },\n { value: 'es-ES', label: 'Español' },\n]\n\n/**\n * Shop plugin settings — store, catalog, checkout and notification config.\n * Seeded from the plugin's currency option; interactive (local state). Wire to\n * persisted plugin prefs when the shop settings store lands.\n */\nexport function ShopSettings({ currency }: ShopSettingsProps) {\n const [code, setCode] = React.useState(currency?.code ?? 'BRL')\n const [locale, setLocale] = React.useState(currency?.locale ?? 'pt-BR')\n const [showOutOfStock, setShowOutOfStock] = React.useState(true)\n const [trackInventory, setTrackInventory] = React.useState(true)\n const [requireSku, setRequireSku] = React.useState(false)\n const [guestCheckout, setGuestCheckout] = React.useState(true)\n const [enableDiscounts, setEnableDiscounts] = React.useState(true)\n const [orderEmails, setOrderEmails] = React.useState(true)\n const [lowStockAlerts, setLowStockAlerts] = React.useState(false)\n\n return (\n <div className=\"space-y-4\">\n <SettingsGroup title=\"Loja\" description=\"Moeda e formatação da vitrine.\">\n <SelectRow\n label=\"Moeda\"\n description=\"Moeda padrão para preços e checkout.\"\n value={code}\n options={CURRENCIES}\n onChange={setCode}\n />\n <SelectRow\n label=\"Idioma / formato\"\n description=\"Formatação de números, preços e datas.\"\n value={locale}\n options={LOCALES}\n onChange={setLocale}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Catálogo\" description=\"Como os produtos aparecem e são gerenciados.\">\n <ToggleRow\n label=\"Mostrar produtos esgotados\"\n description=\"Exibir itens sem estoque na vitrine.\"\n checked={showOutOfStock}\n onChange={setShowOutOfStock}\n />\n <ToggleRow\n label=\"Controlar estoque\"\n description=\"Acompanhar quantidade e dar baixa no checkout.\"\n checked={trackInventory}\n onChange={setTrackInventory}\n />\n <ToggleRow\n label=\"Exigir SKU\"\n description=\"Tornar o SKU obrigatório ao criar produtos.\"\n checked={requireSku}\n onChange={setRequireSku}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Checkout\" description=\"Opções de compra e pagamento.\">\n <ToggleRow\n label=\"Checkout sem cadastro\"\n description=\"Permitir compra como convidado.\"\n checked={guestCheckout}\n onChange={setGuestCheckout}\n />\n <ToggleRow\n label=\"Cupons de desconto\"\n description=\"Habilitar códigos de desconto no carrinho.\"\n checked={enableDiscounts}\n onChange={setEnableDiscounts}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Notificações\" description=\"Avisos por e-mail da loja.\">\n <ToggleRow\n label=\"E-mail de novo pedido\"\n description=\"Notificar a equipe a cada novo pedido.\"\n checked={orderEmails}\n onChange={setOrderEmails}\n />\n <ToggleRow\n label=\"Alerta de estoque baixo\"\n description=\"Avisar quando produtos atingirem o mínimo.\"\n checked={lowStockAlerts}\n onChange={setLowStockAlerts}\n />\n </SettingsGroup>\n </div>\n )\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { setShopTenantResolver } from '@fayz-ai/shop'\nimport { useOrganizationStore } from '@fayz-ai/saas'\nimport type { ShopProviderResolver } from './ShopPage'\nimport { ShopSettings } from './components/ShopSettings'\n\nconst ShopPage = React.lazy(() => import('./ShopPage').then((m) => ({ default: m.ShopPage })))\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShopPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n scope?: PluginScope\n verticalId?: VerticalId\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createShopPlugin(options?: ShopPluginOptions): PluginManifest {\n const curr = { code: 'BRL', locale: 'pt-BR', symbol: 'R$', ...options?.currency }\n\n // Scope fallback shop queries to the active organization. Apps can inject a\n // provider when they want SDK-owned data access instead of the global runtime.\n setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n const PageComponent: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(ShopPage as React.ComponentType<{ provider?: ShopProviderResolver }>, {\n provider: options?.provider,\n })\n )\n PageComponent.displayName = 'ShopPageWrapper'\n\n return {\n id: 'shop',\n name: options?.navLabel ?? 'Shop',\n icon: 'ShoppingBag',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 6,\n label: options?.navLabel ?? 'Shop',\n route: '/shop',\n icon: 'ShoppingBag',\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/shop',\n component: PageComponent,\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'shop.list-products',\n name: 'listProducts',\n description: 'Lists products in the shop catalog.',\n icon: 'Package',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Filter by name' },\n status: { type: 'string' as const, enum: ['draft', 'active', 'archived'] },\n },\n },\n suggestions: [\n { label: 'What products are available?' },\n { label: 'Which products are out of stock?' },\n ],\n },\n {\n id: 'shop.list-orders',\n name: 'listOrders',\n description: 'Lists recent shop orders.',\n icon: 'ShoppingCart',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n financialStatus: { type: 'string' as const, enum: ['pending', 'paid', 'refunded', 'voided'] },\n fulfillmentStatus: { type: 'string' as const, enum: ['unfulfilled', 'partially_fulfilled', 'fulfilled'] },\n },\n },\n suggestions: [\n { label: 'Show me pending orders' },\n { label: 'How many orders were paid today?' },\n ],\n },\n ],\n settings: [\n {\n id: 'shop',\n label: 'Shop',\n icon: 'ShoppingBag',\n component: (() => {\n const ShopSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(ShopSettings, { currency: curr })\n ShopSettingsTab.displayName = 'ShopSettingsTab'\n return ShopSettingsTab\n })(),\n order: 30,\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n }\n}\n\n// Re-export shop types so consumer apps only need @fayz-ai/plugin-shop\nexport type {\n Product, Order, ShopCustomer, Discount, Category,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions,\n} from '@fayz-ai/shop'\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAQtD,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC;AAMD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAuG5E;AAGD,YAAY,EACV,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAChD,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAC3D,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,GACtD,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAStD,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC;AAMD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAkG5E;AAGD,YAAY,EACV,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAChD,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAC3D,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,GACtD,MAAM,eAAe,CAAA"}
package/dist/index.js CHANGED
@@ -1,11 +1,129 @@
1
1
  import React from 'react';
2
2
  import { setShopTenantResolver } from '@fayz-ai/shop';
3
- import { useOrganizationStore } from '@fayz-ai/saas';
3
+ import { useOrganizationStore, SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/saas';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ // src/index.ts
7
+ var CURRENCIES = [
8
+ { value: "BRL", label: "Real (R$)" },
9
+ { value: "USD", label: "US Dollar ($)" },
10
+ { value: "EUR", label: "Euro (\u20AC)" },
11
+ { value: "GBP", label: "British Pound (\xA3)" }
12
+ ];
13
+ var LOCALES = [
14
+ { value: "pt-BR", label: "Portugu\xEAs (Brasil)" },
15
+ { value: "en-US", label: "English (US)" },
16
+ { value: "es-ES", label: "Espa\xF1ol" }
17
+ ];
18
+ function ShopSettings({ currency }) {
19
+ const [code, setCode] = React.useState(currency?.code ?? "BRL");
20
+ const [locale, setLocale] = React.useState(currency?.locale ?? "pt-BR");
21
+ const [showOutOfStock, setShowOutOfStock] = React.useState(true);
22
+ const [trackInventory, setTrackInventory] = React.useState(true);
23
+ const [requireSku, setRequireSku] = React.useState(false);
24
+ const [guestCheckout, setGuestCheckout] = React.useState(true);
25
+ const [enableDiscounts, setEnableDiscounts] = React.useState(true);
26
+ const [orderEmails, setOrderEmails] = React.useState(true);
27
+ const [lowStockAlerts, setLowStockAlerts] = React.useState(false);
28
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
29
+ /* @__PURE__ */ jsxs(SettingsGroup, { title: "Loja", description: "Moeda e formata\xE7\xE3o da vitrine.", children: [
30
+ /* @__PURE__ */ jsx(
31
+ SelectRow,
32
+ {
33
+ label: "Moeda",
34
+ description: "Moeda padr\xE3o para pre\xE7os e checkout.",
35
+ value: code,
36
+ options: CURRENCIES,
37
+ onChange: setCode
38
+ }
39
+ ),
40
+ /* @__PURE__ */ jsx(
41
+ SelectRow,
42
+ {
43
+ label: "Idioma / formato",
44
+ description: "Formata\xE7\xE3o de n\xFAmeros, pre\xE7os e datas.",
45
+ value: locale,
46
+ options: LOCALES,
47
+ onChange: setLocale
48
+ }
49
+ )
50
+ ] }),
51
+ /* @__PURE__ */ jsxs(SettingsGroup, { title: "Cat\xE1logo", description: "Como os produtos aparecem e s\xE3o gerenciados.", children: [
52
+ /* @__PURE__ */ jsx(
53
+ ToggleRow,
54
+ {
55
+ label: "Mostrar produtos esgotados",
56
+ description: "Exibir itens sem estoque na vitrine.",
57
+ checked: showOutOfStock,
58
+ onChange: setShowOutOfStock
59
+ }
60
+ ),
61
+ /* @__PURE__ */ jsx(
62
+ ToggleRow,
63
+ {
64
+ label: "Controlar estoque",
65
+ description: "Acompanhar quantidade e dar baixa no checkout.",
66
+ checked: trackInventory,
67
+ onChange: setTrackInventory
68
+ }
69
+ ),
70
+ /* @__PURE__ */ jsx(
71
+ ToggleRow,
72
+ {
73
+ label: "Exigir SKU",
74
+ description: "Tornar o SKU obrigat\xF3rio ao criar produtos.",
75
+ checked: requireSku,
76
+ onChange: setRequireSku
77
+ }
78
+ )
79
+ ] }),
80
+ /* @__PURE__ */ jsxs(SettingsGroup, { title: "Checkout", description: "Op\xE7\xF5es de compra e pagamento.", children: [
81
+ /* @__PURE__ */ jsx(
82
+ ToggleRow,
83
+ {
84
+ label: "Checkout sem cadastro",
85
+ description: "Permitir compra como convidado.",
86
+ checked: guestCheckout,
87
+ onChange: setGuestCheckout
88
+ }
89
+ ),
90
+ /* @__PURE__ */ jsx(
91
+ ToggleRow,
92
+ {
93
+ label: "Cupons de desconto",
94
+ description: "Habilitar c\xF3digos de desconto no carrinho.",
95
+ checked: enableDiscounts,
96
+ onChange: setEnableDiscounts
97
+ }
98
+ )
99
+ ] }),
100
+ /* @__PURE__ */ jsxs(SettingsGroup, { title: "Notifica\xE7\xF5es", description: "Avisos por e-mail da loja.", children: [
101
+ /* @__PURE__ */ jsx(
102
+ ToggleRow,
103
+ {
104
+ label: "E-mail de novo pedido",
105
+ description: "Notificar a equipe a cada novo pedido.",
106
+ checked: orderEmails,
107
+ onChange: setOrderEmails
108
+ }
109
+ ),
110
+ /* @__PURE__ */ jsx(
111
+ ToggleRow,
112
+ {
113
+ label: "Alerta de estoque baixo",
114
+ description: "Avisar quando produtos atingirem o m\xEDnimo.",
115
+ checked: lowStockAlerts,
116
+ onChange: setLowStockAlerts
117
+ }
118
+ )
119
+ ] })
120
+ ] });
121
+ }
4
122
 
5
123
  // src/index.ts
6
124
  var ShopPage = React.lazy(() => import('./ShopPage-65PPVKBD.js').then((m) => ({ default: m.ShopPage })));
7
125
  function createShopPlugin(options) {
8
- const curr = { code: "BRL", symbol: "R$", ...options?.currency };
126
+ const curr = { code: "BRL", locale: "pt-BR", symbol: "R$", ...options?.currency };
9
127
  setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id);
10
128
  const PageComponent = () => React.createElement(
11
129
  React.Suspense,
@@ -88,16 +206,7 @@ function createShopPlugin(options) {
88
206
  label: "Shop",
89
207
  icon: "ShoppingBag",
90
208
  component: (() => {
91
- const ShopSettingsTab = () => React.createElement(
92
- "div",
93
- { className: "p-4 space-y-2" },
94
- React.createElement("h2", { className: "text-lg font-semibold" }, "Configura\xE7\xF5es da Loja"),
95
- React.createElement(
96
- "p",
97
- { className: "text-sm text-muted-foreground" },
98
- `Moeda: ${curr.symbol} (${curr.code})`
99
- )
100
- );
209
+ const ShopSettingsTab = () => React.createElement(ShopSettings, { currency: curr });
101
210
  ShopSettingsTab.displayName = "ShopSettingsTab";
102
211
  return ShopSettingsTab;
103
212
  })(),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { setShopTenantResolver } from '@fayz-ai/shop'\nimport { useOrganizationStore } from '@fayz-ai/saas'\nimport type { ShopProviderResolver } from './ShopPage'\n\nconst ShopPage = React.lazy(() => import('./ShopPage').then((m) => ({ default: m.ShopPage })))\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShopPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n scope?: PluginScope\n verticalId?: VerticalId\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createShopPlugin(options?: ShopPluginOptions): PluginManifest {\n const curr = { code: 'BRL', locale: 'pt-BR', symbol: 'R$', ...options?.currency }\n\n // Scope fallback shop queries to the active organization. Apps can inject a\n // provider when they want SDK-owned data access instead of the global runtime.\n setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n const PageComponent: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(ShopPage as React.ComponentType<{ provider?: ShopProviderResolver }>, {\n provider: options?.provider,\n })\n )\n PageComponent.displayName = 'ShopPageWrapper'\n\n return {\n id: 'shop',\n name: options?.navLabel ?? 'Shop',\n icon: 'ShoppingBag',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 6,\n label: options?.navLabel ?? 'Shop',\n route: '/shop',\n icon: 'ShoppingBag',\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/shop',\n component: PageComponent,\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'shop.list-products',\n name: 'listProducts',\n description: 'Lists products in the shop catalog.',\n icon: 'Package',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Filter by name' },\n status: { type: 'string' as const, enum: ['draft', 'active', 'archived'] },\n },\n },\n suggestions: [\n { label: 'What products are available?' },\n { label: 'Which products are out of stock?' },\n ],\n },\n {\n id: 'shop.list-orders',\n name: 'listOrders',\n description: 'Lists recent shop orders.',\n icon: 'ShoppingCart',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n financialStatus: { type: 'string' as const, enum: ['pending', 'paid', 'refunded', 'voided'] },\n fulfillmentStatus: { type: 'string' as const, enum: ['unfulfilled', 'partially_fulfilled', 'fulfilled'] },\n },\n },\n suggestions: [\n { label: 'Show me pending orders' },\n { label: 'How many orders were paid today?' },\n ],\n },\n ],\n settings: [\n {\n id: 'shop',\n label: 'Shop',\n icon: 'ShoppingBag',\n component: (() => {\n const ShopSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement('div', { className: 'p-4 space-y-2' },\n React.createElement('h2', { className: 'text-lg font-semibold' }, 'Configurações da Loja'),\n React.createElement('p', { className: 'text-sm text-muted-foreground' },\n `Moeda: ${curr.symbol} (${curr.code})`\n )\n )\n ShopSettingsTab.displayName = 'ShopSettingsTab'\n return ShopSettingsTab\n })(),\n order: 30,\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n }\n}\n\n// Re-export shop types so consumer apps only need @fayz-ai/plugin-shop\nexport type {\n Product, Order, ShopCustomer, Discount, Category,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions,\n} from '@fayz-ai/shop'\n"]}
1
+ {"version":3,"sources":["../src/components/ShopSettings.tsx","../src/index.ts"],"names":["React"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react'\nimport { SettingsGroup, ToggleRow, SelectRow } from '@fayz-ai/saas'\n\nexport interface ShopSettingsProps {\n currency?: { code?: string; locale?: string; symbol?: string }\n}\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'Real (R$)' },\n { value: 'USD', label: 'US Dollar ($)' },\n { value: 'EUR', label: 'Euro (€)' },\n { value: 'GBP', label: 'British Pound (£)' },\n]\n\nconst LOCALES = [\n { value: 'pt-BR', label: 'Português (Brasil)' },\n { value: 'en-US', label: 'English (US)' },\n { value: 'es-ES', label: 'Español' },\n]\n\n/**\n * Shop plugin settings — store, catalog, checkout and notification config.\n * Seeded from the plugin's currency option; interactive (local state). Wire to\n * persisted plugin prefs when the shop settings store lands.\n */\nexport function ShopSettings({ currency }: ShopSettingsProps) {\n const [code, setCode] = React.useState(currency?.code ?? 'BRL')\n const [locale, setLocale] = React.useState(currency?.locale ?? 'pt-BR')\n const [showOutOfStock, setShowOutOfStock] = React.useState(true)\n const [trackInventory, setTrackInventory] = React.useState(true)\n const [requireSku, setRequireSku] = React.useState(false)\n const [guestCheckout, setGuestCheckout] = React.useState(true)\n const [enableDiscounts, setEnableDiscounts] = React.useState(true)\n const [orderEmails, setOrderEmails] = React.useState(true)\n const [lowStockAlerts, setLowStockAlerts] = React.useState(false)\n\n return (\n <div className=\"space-y-4\">\n <SettingsGroup title=\"Loja\" description=\"Moeda e formatação da vitrine.\">\n <SelectRow\n label=\"Moeda\"\n description=\"Moeda padrão para preços e checkout.\"\n value={code}\n options={CURRENCIES}\n onChange={setCode}\n />\n <SelectRow\n label=\"Idioma / formato\"\n description=\"Formatação de números, preços e datas.\"\n value={locale}\n options={LOCALES}\n onChange={setLocale}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Catálogo\" description=\"Como os produtos aparecem e são gerenciados.\">\n <ToggleRow\n label=\"Mostrar produtos esgotados\"\n description=\"Exibir itens sem estoque na vitrine.\"\n checked={showOutOfStock}\n onChange={setShowOutOfStock}\n />\n <ToggleRow\n label=\"Controlar estoque\"\n description=\"Acompanhar quantidade e dar baixa no checkout.\"\n checked={trackInventory}\n onChange={setTrackInventory}\n />\n <ToggleRow\n label=\"Exigir SKU\"\n description=\"Tornar o SKU obrigatório ao criar produtos.\"\n checked={requireSku}\n onChange={setRequireSku}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Checkout\" description=\"Opções de compra e pagamento.\">\n <ToggleRow\n label=\"Checkout sem cadastro\"\n description=\"Permitir compra como convidado.\"\n checked={guestCheckout}\n onChange={setGuestCheckout}\n />\n <ToggleRow\n label=\"Cupons de desconto\"\n description=\"Habilitar códigos de desconto no carrinho.\"\n checked={enableDiscounts}\n onChange={setEnableDiscounts}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Notificações\" description=\"Avisos por e-mail da loja.\">\n <ToggleRow\n label=\"E-mail de novo pedido\"\n description=\"Notificar a equipe a cada novo pedido.\"\n checked={orderEmails}\n onChange={setOrderEmails}\n />\n <ToggleRow\n label=\"Alerta de estoque baixo\"\n description=\"Avisar quando produtos atingirem o mínimo.\"\n checked={lowStockAlerts}\n onChange={setLowStockAlerts}\n />\n </SettingsGroup>\n </div>\n )\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { setShopTenantResolver } from '@fayz-ai/shop'\nimport { useOrganizationStore } from '@fayz-ai/saas'\nimport type { ShopProviderResolver } from './ShopPage'\nimport { ShopSettings } from './components/ShopSettings'\n\nconst ShopPage = React.lazy(() => import('./ShopPage').then((m) => ({ default: m.ShopPage })))\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShopPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n scope?: PluginScope\n verticalId?: VerticalId\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createShopPlugin(options?: ShopPluginOptions): PluginManifest {\n const curr = { code: 'BRL', locale: 'pt-BR', symbol: 'R$', ...options?.currency }\n\n // Scope fallback shop queries to the active organization. Apps can inject a\n // provider when they want SDK-owned data access instead of the global runtime.\n setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n const PageComponent: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(ShopPage as React.ComponentType<{ provider?: ShopProviderResolver }>, {\n provider: options?.provider,\n })\n )\n PageComponent.displayName = 'ShopPageWrapper'\n\n return {\n id: 'shop',\n name: options?.navLabel ?? 'Shop',\n icon: 'ShoppingBag',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 6,\n label: options?.navLabel ?? 'Shop',\n route: '/shop',\n icon: 'ShoppingBag',\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/shop',\n component: PageComponent,\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'shop.list-products',\n name: 'listProducts',\n description: 'Lists products in the shop catalog.',\n icon: 'Package',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Filter by name' },\n status: { type: 'string' as const, enum: ['draft', 'active', 'archived'] },\n },\n },\n suggestions: [\n { label: 'What products are available?' },\n { label: 'Which products are out of stock?' },\n ],\n },\n {\n id: 'shop.list-orders',\n name: 'listOrders',\n description: 'Lists recent shop orders.',\n icon: 'ShoppingCart',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n financialStatus: { type: 'string' as const, enum: ['pending', 'paid', 'refunded', 'voided'] },\n fulfillmentStatus: { type: 'string' as const, enum: ['unfulfilled', 'partially_fulfilled', 'fulfilled'] },\n },\n },\n suggestions: [\n { label: 'Show me pending orders' },\n { label: 'How many orders were paid today?' },\n ],\n },\n ],\n settings: [\n {\n id: 'shop',\n label: 'Shop',\n icon: 'ShoppingBag',\n component: (() => {\n const ShopSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(ShopSettings, { currency: curr })\n ShopSettingsTab.displayName = 'ShopSettingsTab'\n return ShopSettingsTab\n })(),\n order: 30,\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n }\n}\n\n// Re-export shop types so consumer apps only need @fayz-ai/plugin-shop\nexport type {\n Product, Order, ShopCustomer, Discount, Category,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions,\n} from '@fayz-ai/shop'\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fayz-ai/plugin-shop",
3
- "version": "0.2.2",
4
- "description": "Fayz SDK — plugin-shop plugin",
3
+ "version": "0.2.5",
4
+ "description": "[experimental] Fayz SDK — plugin-shop plugin",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.js",
@@ -26,10 +26,10 @@
26
26
  "@tanstack/react-table": "^8.20.0",
27
27
  "lucide-react": "^0.400.0",
28
28
  "zustand": "^4.5.0",
29
- "@fayz-ai/shop": "^0.5.0",
30
- "@fayz-ai/core": "^0.5.0",
31
- "@fayz-ai/saas": "^0.5.0",
32
- "@fayz-ai/ui": "^0.5.0"
29
+ "@fayz-ai/core": "^0.7.0",
30
+ "@fayz-ai/saas": "^0.7.0",
31
+ "@fayz-ai/shop": "^0.7.0",
32
+ "@fayz-ai/ui": "^0.7.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/react": "^18.3.0",
@@ -0,0 +1,108 @@
1
+ import React from 'react'
2
+ import { SettingsGroup, ToggleRow, SelectRow } from '@fayz-ai/saas'
3
+
4
+ export interface ShopSettingsProps {
5
+ currency?: { code?: string; locale?: string; symbol?: string }
6
+ }
7
+
8
+ const CURRENCIES = [
9
+ { value: 'BRL', label: 'Real (R$)' },
10
+ { value: 'USD', label: 'US Dollar ($)' },
11
+ { value: 'EUR', label: 'Euro (€)' },
12
+ { value: 'GBP', label: 'British Pound (£)' },
13
+ ]
14
+
15
+ const LOCALES = [
16
+ { value: 'pt-BR', label: 'Português (Brasil)' },
17
+ { value: 'en-US', label: 'English (US)' },
18
+ { value: 'es-ES', label: 'Español' },
19
+ ]
20
+
21
+ /**
22
+ * Shop plugin settings — store, catalog, checkout and notification config.
23
+ * Seeded from the plugin's currency option; interactive (local state). Wire to
24
+ * persisted plugin prefs when the shop settings store lands.
25
+ */
26
+ export function ShopSettings({ currency }: ShopSettingsProps) {
27
+ const [code, setCode] = React.useState(currency?.code ?? 'BRL')
28
+ const [locale, setLocale] = React.useState(currency?.locale ?? 'pt-BR')
29
+ const [showOutOfStock, setShowOutOfStock] = React.useState(true)
30
+ const [trackInventory, setTrackInventory] = React.useState(true)
31
+ const [requireSku, setRequireSku] = React.useState(false)
32
+ const [guestCheckout, setGuestCheckout] = React.useState(true)
33
+ const [enableDiscounts, setEnableDiscounts] = React.useState(true)
34
+ const [orderEmails, setOrderEmails] = React.useState(true)
35
+ const [lowStockAlerts, setLowStockAlerts] = React.useState(false)
36
+
37
+ return (
38
+ <div className="space-y-4">
39
+ <SettingsGroup title="Loja" description="Moeda e formatação da vitrine.">
40
+ <SelectRow
41
+ label="Moeda"
42
+ description="Moeda padrão para preços e checkout."
43
+ value={code}
44
+ options={CURRENCIES}
45
+ onChange={setCode}
46
+ />
47
+ <SelectRow
48
+ label="Idioma / formato"
49
+ description="Formatação de números, preços e datas."
50
+ value={locale}
51
+ options={LOCALES}
52
+ onChange={setLocale}
53
+ />
54
+ </SettingsGroup>
55
+
56
+ <SettingsGroup title="Catálogo" description="Como os produtos aparecem e são gerenciados.">
57
+ <ToggleRow
58
+ label="Mostrar produtos esgotados"
59
+ description="Exibir itens sem estoque na vitrine."
60
+ checked={showOutOfStock}
61
+ onChange={setShowOutOfStock}
62
+ />
63
+ <ToggleRow
64
+ label="Controlar estoque"
65
+ description="Acompanhar quantidade e dar baixa no checkout."
66
+ checked={trackInventory}
67
+ onChange={setTrackInventory}
68
+ />
69
+ <ToggleRow
70
+ label="Exigir SKU"
71
+ description="Tornar o SKU obrigatório ao criar produtos."
72
+ checked={requireSku}
73
+ onChange={setRequireSku}
74
+ />
75
+ </SettingsGroup>
76
+
77
+ <SettingsGroup title="Checkout" description="Opções de compra e pagamento.">
78
+ <ToggleRow
79
+ label="Checkout sem cadastro"
80
+ description="Permitir compra como convidado."
81
+ checked={guestCheckout}
82
+ onChange={setGuestCheckout}
83
+ />
84
+ <ToggleRow
85
+ label="Cupons de desconto"
86
+ description="Habilitar códigos de desconto no carrinho."
87
+ checked={enableDiscounts}
88
+ onChange={setEnableDiscounts}
89
+ />
90
+ </SettingsGroup>
91
+
92
+ <SettingsGroup title="Notificações" description="Avisos por e-mail da loja.">
93
+ <ToggleRow
94
+ label="E-mail de novo pedido"
95
+ description="Notificar a equipe a cada novo pedido."
96
+ checked={orderEmails}
97
+ onChange={setOrderEmails}
98
+ />
99
+ <ToggleRow
100
+ label="Alerta de estoque baixo"
101
+ description="Avisar quando produtos atingirem o mínimo."
102
+ checked={lowStockAlerts}
103
+ onChange={setLowStockAlerts}
104
+ />
105
+ </SettingsGroup>
106
+ </div>
107
+ )
108
+ }
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ import type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'
3
3
  import { setShopTenantResolver } from '@fayz-ai/shop'
4
4
  import { useOrganizationStore } from '@fayz-ai/saas'
5
5
  import type { ShopProviderResolver } from './ShopPage'
6
+ import { ShopSettings } from './components/ShopSettings'
6
7
 
7
8
  const ShopPage = React.lazy(() => import('./ShopPage').then((m) => ({ default: m.ShopPage })))
8
9
 
@@ -113,12 +114,7 @@ export function createShopPlugin(options?: ShopPluginOptions): PluginManifest {
113
114
  icon: 'ShoppingBag',
114
115
  component: (() => {
115
116
  const ShopSettingsTab: React.ComponentType<unknown> = () =>
116
- React.createElement('div', { className: 'p-4 space-y-2' },
117
- React.createElement('h2', { className: 'text-lg font-semibold' }, 'Configurações da Loja'),
118
- React.createElement('p', { className: 'text-sm text-muted-foreground' },
119
- `Moeda: ${curr.symbol} (${curr.code})`
120
- )
121
- )
117
+ React.createElement(ShopSettings, { currency: curr })
122
118
  ShopSettingsTab.displayName = 'ShopSettingsTab'
123
119
  return ShopSettingsTab
124
120
  })(),