@fayz-ai/plugin-shop 0.2.1 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ShopSettings.d.ts +15 -0
- package/dist/components/ShopSettings.d.ts.map +1 -0
- package/dist/index.cjs +120 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +121 -12
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/src/components/ShopSettings.tsx +108 -0
- package/src/index.ts +2 -6
|
@@ -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
|
})(),
|
package/dist/index.cjs.map
CHANGED
|
@@ -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"]}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fayz-ai/plugin-shop",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Fayz SDK — plugin-shop plugin",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -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/core": "^0.
|
|
30
|
-
"@fayz-ai/
|
|
31
|
-
"@fayz-ai/saas": "^0.
|
|
32
|
-
"@fayz-ai/
|
|
29
|
+
"@fayz-ai/core": "^0.6.0",
|
|
30
|
+
"@fayz-ai/shop": "^0.6.0",
|
|
31
|
+
"@fayz-ai/saas": "^0.6.0",
|
|
32
|
+
"@fayz-ai/ui": "^0.6.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(
|
|
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
|
})(),
|