@fayz-ai/plugin-shop 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ShopPage-HCLXMN7Q.js +743 -0
- package/dist/ShopPage-HCLXMN7Q.js.map +1 -0
- package/dist/ShopPage-JF2SQBKO.cjs +745 -0
- package/dist/ShopPage-JF2SQBKO.cjs.map +1 -0
- package/dist/ShopPage.d.ts +23 -1
- package/dist/ShopPage.d.ts.map +1 -1
- package/dist/data/customerDataProvider.d.ts +5 -0
- package/dist/data/customerDataProvider.d.ts.map +1 -0
- package/dist/data/discountDataProvider.d.ts +5 -0
- package/dist/data/discountDataProvider.d.ts.map +1 -0
- package/dist/data/productDataProvider.d.ts +6 -0
- package/dist/data/productDataProvider.d.ts.map +1 -0
- package/dist/data/shared.d.ts +12 -0
- package/dist/data/shared.d.ts.map +1 -0
- package/dist/data/shippingZoneDataProvider.d.ts +13 -0
- package/dist/data/shippingZoneDataProvider.d.ts.map +1 -0
- package/dist/index.cjs +983 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +984 -27
- package/dist/index.js.map +1 -1
- package/dist/views/OrderDetailView.d.ts +10 -0
- package/dist/views/OrderDetailView.d.ts.map +1 -0
- package/dist/views/ProductImagesTab.d.ts +19 -0
- package/dist/views/ProductImagesTab.d.ts.map +1 -0
- package/dist/views/customerEntity.d.ts +4 -0
- package/dist/views/customerEntity.d.ts.map +1 -0
- package/dist/views/customerLookup.d.ts +22 -0
- package/dist/views/customerLookup.d.ts.map +1 -0
- package/dist/views/discountEntity.d.ts +4 -0
- package/dist/views/discountEntity.d.ts.map +1 -0
- package/dist/views/productEntity.d.ts +6 -0
- package/dist/views/productEntity.d.ts.map +1 -0
- package/dist/views/shippingZoneEntity.d.ts +4 -0
- package/dist/views/shippingZoneEntity.d.ts.map +1 -0
- package/package.json +5 -5
- package/src/ShopPage.tsx +156 -54
- package/src/data/customerDataProvider.ts +31 -0
- package/src/data/discountDataProvider.ts +42 -0
- package/src/data/productDataProvider.ts +54 -0
- package/src/data/shared.ts +42 -0
- package/src/data/shippingZoneDataProvider.ts +49 -0
- package/src/index.ts +101 -12
- package/src/views/OrderDetailView.tsx +575 -0
- package/src/views/ProductImagesTab.tsx +183 -0
- package/src/views/customerEntity.tsx +110 -0
- package/src/views/customerLookup.ts +31 -0
- package/src/views/discountEntity.tsx +137 -0
- package/src/views/productEntity.tsx +229 -0
- package/src/views/shippingZoneEntity.tsx +123 -0
- package/dist/ShopPage-65PPVKBD.js +0 -271
- package/dist/ShopPage-65PPVKBD.js.map +0 -1
- package/dist/ShopPage-PG5GKOZU.cjs +0 -273
- package/dist/ShopPage-PG5GKOZU.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ShopPage.tsx"],"names":[],"mappings":"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","file":"ShopPage-65PPVKBD.js","sourcesContent":["import React, { useEffect, useState, useCallback, useMemo } from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@fayz-ai/ui'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { Product, Order, ShopCustomer, Discount, ListProductsOptions, ShopProvider } from '@fayz-ai/shop'\n\nexport type ShopProviderResolver = ShopProvider | (() => ShopProvider)\n\nexport interface ShopPageProps {\n provider?: ShopProviderResolver\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction currency(value: number, code = 'BRL', locale = 'pt-BR') {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(value)\n}\n\nfunction badge(label: string, color: string) {\n return (\n <span className={`inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium ${color}`}>\n {label}\n </span>\n )\n}\n\nconst statusColors: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n archived: 'bg-orange-100 text-orange-700',\n open: 'bg-blue-100 text-blue-800',\n cancelled: 'bg-red-100 text-red-700',\n paid: 'bg-emerald-100 text-emerald-800',\n pending: 'bg-yellow-100 text-yellow-800',\n fulfilled: 'bg-emerald-100 text-emerald-800',\n unfulfilled: 'bg-gray-100 text-gray-700',\n 'partially_fulfilled': 'bg-blue-100 text-blue-800',\n}\n\nfunction resolveShopProvider(provider?: ShopProviderResolver): ShopProvider {\n return typeof provider === 'function' ? provider() : provider ?? getShopProvider()\n}\n\n// ---------------------------------------------------------------------------\n// Products tab\n// ---------------------------------------------------------------------------\n\nfunction ProductsTab({ provider }: ShopPageProps) {\n const [products, setProducts] = useState<Product[]>([])\n const [loading, setLoading] = useState(true)\n const [search, setSearch] = useState('')\n\n const load = useCallback(async (opts?: ListProductsOptions) => {\n setLoading(true)\n try {\n const data = await resolveShopProvider(provider).listProducts(opts)\n setProducts(data)\n } finally {\n setLoading(false)\n }\n }, [provider])\n\n useEffect(() => { load() }, [load])\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const q = e.target.value\n setSearch(q)\n load(q ? { search: q } : undefined)\n }\n\n const columns = useMemo<ColumnDef<Product, any>[]>(() => [\n { accessorKey: 'name', header: 'Produto', cell: ({ getValue }) => <span className=\"font-medium\">{getValue() as string}</span> },\n { accessorKey: 'sku', header: 'SKU', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n {\n accessorKey: 'price', header: () => <span className=\"block text-right\">Preço</span>,\n cell: ({ getValue, row }) => <div className=\"text-right\">{currency(getValue() as number, row.original.currency)}</div>,\n },\n {\n accessorKey: 'inventoryCount', header: () => <span className=\"block text-right\">Estoque</span>,\n cell: ({ getValue }) => {\n const count = getValue() as number\n return <div className=\"text-right\"><span className={count === 0 ? 'text-red-600 font-medium' : ''}>{count}</span></div>\n },\n },\n {\n accessorKey: 'status', header: 'Status',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n ], [])\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-4\">\n <input\n type=\"search\" value={search} onChange={handleSearch}\n placeholder=\"Buscar produtos...\"\n className=\"border rounded-lg px-3 py-2 text-sm w-64 focus:outline-none focus:ring-2 focus:ring-primary/50\"\n />\n <span className=\"text-sm text-muted-foreground\">{products.length} produtos</span>\n </div>\n\n {loading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">Carregando...</div>\n ) : (\n <DataTable\n columns={columns}\n data={products}\n variant=\"card\"\n emptyMessage=\"Nenhum produto encontrado.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Orders tab\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({ provider }: ShopPageProps) {\n const [orders, setOrders] = useState<Order[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n resolveShopProvider(provider).listOrders({ limit: 50 }).then(setOrders).finally(() => setLoading(false))\n }, [provider])\n\n const columns = useMemo<ColumnDef<Order, any>[]>(() => [\n { accessorKey: 'orderNumber', header: 'Pedido', cell: ({ getValue }) => <span className=\"font-medium\">#{getValue() as string}</span> },\n {\n id: 'customer', accessorFn: (o) => o.customerName ?? o.customerEmail ?? '—', header: 'Cliente',\n cell: ({ getValue }) => <span>{getValue() as string}</span>,\n },\n {\n accessorKey: 'total', header: () => <span className=\"block text-right\">Total</span>,\n cell: ({ getValue, row }) => <div className=\"text-right font-medium\">{currency(getValue() as number, row.original.currency)}</div>,\n },\n {\n accessorKey: 'financialStatus', header: 'Pagamento',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n {\n accessorKey: 'fulfillmentStatus', header: 'Entrega',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n {\n accessorKey: 'createdAt', header: 'Data',\n cell: ({ getValue }) => <span className=\"text-muted-foreground\">{new Date(getValue() as string).toLocaleDateString('pt-BR')}</span>,\n },\n ], [])\n\n return (\n <div>\n {loading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">Carregando...</div>\n ) : (\n <DataTable\n columns={columns}\n data={orders}\n variant=\"card\"\n emptyMessage=\"Nenhum pedido ainda.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Customers tab\n// ---------------------------------------------------------------------------\n\nfunction CustomersTab({ provider }: ShopPageProps) {\n const [customers, setCustomers] = useState<ShopCustomer[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n resolveShopProvider(provider).listCustomers({ limit: 50 }).then(setCustomers).finally(() => setLoading(false))\n }, [provider])\n\n const columns = useMemo<ColumnDef<ShopCustomer, any>[]>(() => [\n {\n id: 'name', accessorFn: (c) => `${c.firstName} ${c.lastName}`, header: 'Nome',\n cell: ({ row }) => <span className=\"font-medium\">{row.original.firstName} {row.original.lastName}</span>,\n },\n { accessorKey: 'email', header: 'Email', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n { accessorKey: 'phone', header: 'Telefone', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n {\n accessorKey: 'ordersCount', header: () => <span className=\"block text-right\">Pedidos</span>,\n cell: ({ getValue }) => <div className=\"text-right\">{getValue() as number}</div>,\n },\n {\n accessorKey: 'totalSpent', header: () => <span className=\"block text-right\">Total Gasto</span>,\n cell: ({ getValue }) => <div className=\"text-right\">{currency(getValue() as number)}</div>,\n },\n ], [])\n\n return (\n <div>\n {loading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">Carregando...</div>\n ) : (\n <DataTable\n columns={columns}\n data={customers}\n variant=\"card\"\n emptyMessage=\"Nenhum cliente ainda.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Discounts tab\n// ---------------------------------------------------------------------------\n\nfunction DiscountsTab({ provider }: ShopPageProps) {\n const [discounts, setDiscounts] = useState<Discount[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n resolveShopProvider(provider).listDiscounts({ limit: 50 }).then(setDiscounts).finally(() => setLoading(false))\n }, [provider])\n\n const columns = useMemo<ColumnDef<Discount, any>[]>(() => [\n { accessorKey: 'title', header: 'Título', cell: ({ getValue }) => <span className=\"font-medium\">{getValue() as string}</span> },\n { accessorKey: 'code', header: 'Código', cell: ({ getValue }) => <span className=\"font-mono text-sm\">{(getValue() as string | undefined) ?? '—'}</span> },\n { accessorKey: 'type', header: 'Tipo', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{getValue() as string}</span> },\n {\n accessorKey: 'value', header: () => <span className=\"block text-right\">Valor</span>,\n cell: ({ row }) => <div className=\"text-right\">{row.original.type === 'percentage' ? `${row.original.value}%` : currency(row.original.value)}</div>,\n },\n {\n id: 'usos', accessorKey: 'timesUsed', header: () => <span className=\"block text-right\">Usos</span>,\n cell: ({ row }) => <div className=\"text-right\">{row.original.timesUsed}{row.original.usageLimit ? ` / ${row.original.usageLimit}` : ''}</div>,\n },\n {\n accessorKey: 'status', header: 'Status',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n ], [])\n\n return (\n <div>\n {loading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">Carregando...</div>\n ) : (\n <DataTable\n columns={columns}\n data={discounts}\n variant=\"card\"\n emptyMessage=\"Nenhum desconto cadastrado.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main page\n// ---------------------------------------------------------------------------\n\nconst TABS = [\n { id: 'products', label: 'Produtos' },\n { id: 'orders', label: 'Pedidos' },\n { id: 'customers', label: 'Clientes' },\n { id: 'discounts', label: 'Descontos' },\n] as const\n\ntype TabId = typeof TABS[number]['id']\n\nexport const ShopPage: React.FC<ShopPageProps> = ({ provider }) => {\n const [tab, setTab] = useState<TabId>('products')\n\n return (\n <div className=\"p-6 max-w-7xl mx-auto\">\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-semibold\">Loja</h1>\n <p className=\"text-muted-foreground mt-1\">Gerencie produtos, pedidos, clientes e descontos.</p>\n </div>\n\n {/* Tabs */}\n <div className=\"border-b mb-6\">\n <nav className=\"flex gap-1\">\n {TABS.map(t => (\n <button\n key={t.id}\n onClick={() => setTab(t.id)}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n tab === t.id\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {t.label}\n </button>\n ))}\n </nav>\n </div>\n\n {tab === 'products' && <ProductsTab provider={provider} />}\n {tab === 'orders' && <OrdersTab provider={provider} />}\n {tab === 'customers' && <CustomersTab provider={provider} />}\n {tab === 'discounts' && <DiscountsTab provider={provider} />}\n </div>\n )\n}\n\nShopPage.displayName = 'ShopPage'\n"]}
|
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var react = require('react');
|
|
4
|
-
var ui = require('@fayz-ai/ui');
|
|
5
|
-
var shop = require('@fayz-ai/shop');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
-
|
|
8
|
-
// src/ShopPage.tsx
|
|
9
|
-
function currency(value, code = "BRL", locale = "pt-BR") {
|
|
10
|
-
return new Intl.NumberFormat(locale, { style: "currency", currency: code }).format(value);
|
|
11
|
-
}
|
|
12
|
-
function badge(label, color) {
|
|
13
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: `inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium ${color}`, children: label });
|
|
14
|
-
}
|
|
15
|
-
var statusColors = {
|
|
16
|
-
active: "bg-emerald-100 text-emerald-800",
|
|
17
|
-
draft: "bg-gray-100 text-gray-700",
|
|
18
|
-
archived: "bg-orange-100 text-orange-700",
|
|
19
|
-
open: "bg-blue-100 text-blue-800",
|
|
20
|
-
cancelled: "bg-red-100 text-red-700",
|
|
21
|
-
paid: "bg-emerald-100 text-emerald-800",
|
|
22
|
-
pending: "bg-yellow-100 text-yellow-800",
|
|
23
|
-
fulfilled: "bg-emerald-100 text-emerald-800",
|
|
24
|
-
unfulfilled: "bg-gray-100 text-gray-700",
|
|
25
|
-
"partially_fulfilled": "bg-blue-100 text-blue-800"
|
|
26
|
-
};
|
|
27
|
-
function resolveShopProvider(provider) {
|
|
28
|
-
return typeof provider === "function" ? provider() : provider ?? shop.getShopProvider();
|
|
29
|
-
}
|
|
30
|
-
function ProductsTab({ provider }) {
|
|
31
|
-
const [products, setProducts] = react.useState([]);
|
|
32
|
-
const [loading, setLoading] = react.useState(true);
|
|
33
|
-
const [search, setSearch] = react.useState("");
|
|
34
|
-
const load = react.useCallback(async (opts) => {
|
|
35
|
-
setLoading(true);
|
|
36
|
-
try {
|
|
37
|
-
const data = await resolveShopProvider(provider).listProducts(opts);
|
|
38
|
-
setProducts(data);
|
|
39
|
-
} finally {
|
|
40
|
-
setLoading(false);
|
|
41
|
-
}
|
|
42
|
-
}, [provider]);
|
|
43
|
-
react.useEffect(() => {
|
|
44
|
-
load();
|
|
45
|
-
}, [load]);
|
|
46
|
-
const handleSearch = (e) => {
|
|
47
|
-
const q = e.target.value;
|
|
48
|
-
setSearch(q);
|
|
49
|
-
load(q ? { search: q } : void 0);
|
|
50
|
-
};
|
|
51
|
-
const columns = react.useMemo(() => [
|
|
52
|
-
{ accessorKey: "name", header: "Produto", cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: getValue() }) },
|
|
53
|
-
{ accessorKey: "sku", header: "SKU", cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: getValue() ?? "\u2014" }) },
|
|
54
|
-
{
|
|
55
|
-
accessorKey: "price",
|
|
56
|
-
header: () => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-right", children: "Pre\xE7o" }),
|
|
57
|
-
cell: ({ getValue, row }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: currency(getValue(), row.original.currency) })
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
accessorKey: "inventoryCount",
|
|
61
|
-
header: () => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-right", children: "Estoque" }),
|
|
62
|
-
cell: ({ getValue }) => {
|
|
63
|
-
const count = getValue();
|
|
64
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: count === 0 ? "text-red-600 font-medium" : "", children: count }) });
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
accessorKey: "status",
|
|
69
|
-
header: "Status",
|
|
70
|
-
cell: ({ getValue }) => {
|
|
71
|
-
const status = getValue();
|
|
72
|
-
return badge(status, statusColors[status] ?? "bg-gray-100 text-gray-700");
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
], []);
|
|
76
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
77
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-4", children: [
|
|
78
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
79
|
-
"input",
|
|
80
|
-
{
|
|
81
|
-
type: "search",
|
|
82
|
-
value: search,
|
|
83
|
-
onChange: handleSearch,
|
|
84
|
-
placeholder: "Buscar produtos...",
|
|
85
|
-
className: "border rounded-lg px-3 py-2 text-sm w-64 focus:outline-none focus:ring-2 focus:ring-primary/50"
|
|
86
|
-
}
|
|
87
|
-
),
|
|
88
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-muted-foreground", children: [
|
|
89
|
-
products.length,
|
|
90
|
-
" produtos"
|
|
91
|
-
] })
|
|
92
|
-
] }),
|
|
93
|
-
loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-12 text-center text-sm text-muted-foreground", children: "Carregando..." }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
94
|
-
ui.DataTable,
|
|
95
|
-
{
|
|
96
|
-
columns,
|
|
97
|
-
data: products,
|
|
98
|
-
variant: "card",
|
|
99
|
-
emptyMessage: "Nenhum produto encontrado."
|
|
100
|
-
}
|
|
101
|
-
)
|
|
102
|
-
] });
|
|
103
|
-
}
|
|
104
|
-
function OrdersTab({ provider }) {
|
|
105
|
-
const [orders, setOrders] = react.useState([]);
|
|
106
|
-
const [loading, setLoading] = react.useState(true);
|
|
107
|
-
react.useEffect(() => {
|
|
108
|
-
resolveShopProvider(provider).listOrders({ limit: 50 }).then(setOrders).finally(() => setLoading(false));
|
|
109
|
-
}, [provider]);
|
|
110
|
-
const columns = react.useMemo(() => [
|
|
111
|
-
{ accessorKey: "orderNumber", header: "Pedido", cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium", children: [
|
|
112
|
-
"#",
|
|
113
|
-
getValue()
|
|
114
|
-
] }) },
|
|
115
|
-
{
|
|
116
|
-
id: "customer",
|
|
117
|
-
accessorFn: (o) => o.customerName ?? o.customerEmail ?? "\u2014",
|
|
118
|
-
header: "Cliente",
|
|
119
|
-
cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { children: getValue() })
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
accessorKey: "total",
|
|
123
|
-
header: () => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-right", children: "Total" }),
|
|
124
|
-
cell: ({ getValue, row }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right font-medium", children: currency(getValue(), row.original.currency) })
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
accessorKey: "financialStatus",
|
|
128
|
-
header: "Pagamento",
|
|
129
|
-
cell: ({ getValue }) => {
|
|
130
|
-
const status = getValue();
|
|
131
|
-
return badge(status, statusColors[status] ?? "bg-gray-100 text-gray-700");
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
accessorKey: "fulfillmentStatus",
|
|
136
|
-
header: "Entrega",
|
|
137
|
-
cell: ({ getValue }) => {
|
|
138
|
-
const status = getValue();
|
|
139
|
-
return badge(status, statusColors[status] ?? "bg-gray-100 text-gray-700");
|
|
140
|
-
}
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
accessorKey: "createdAt",
|
|
144
|
-
header: "Data",
|
|
145
|
-
cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: new Date(getValue()).toLocaleDateString("pt-BR") })
|
|
146
|
-
}
|
|
147
|
-
], []);
|
|
148
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { children: loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-12 text-center text-sm text-muted-foreground", children: "Carregando..." }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
149
|
-
ui.DataTable,
|
|
150
|
-
{
|
|
151
|
-
columns,
|
|
152
|
-
data: orders,
|
|
153
|
-
variant: "card",
|
|
154
|
-
emptyMessage: "Nenhum pedido ainda."
|
|
155
|
-
}
|
|
156
|
-
) });
|
|
157
|
-
}
|
|
158
|
-
function CustomersTab({ provider }) {
|
|
159
|
-
const [customers, setCustomers] = react.useState([]);
|
|
160
|
-
const [loading, setLoading] = react.useState(true);
|
|
161
|
-
react.useEffect(() => {
|
|
162
|
-
resolveShopProvider(provider).listCustomers({ limit: 50 }).then(setCustomers).finally(() => setLoading(false));
|
|
163
|
-
}, [provider]);
|
|
164
|
-
const columns = react.useMemo(() => [
|
|
165
|
-
{
|
|
166
|
-
id: "name",
|
|
167
|
-
accessorFn: (c) => `${c.firstName} ${c.lastName}`,
|
|
168
|
-
header: "Nome",
|
|
169
|
-
cell: ({ row }) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium", children: [
|
|
170
|
-
row.original.firstName,
|
|
171
|
-
" ",
|
|
172
|
-
row.original.lastName
|
|
173
|
-
] })
|
|
174
|
-
},
|
|
175
|
-
{ accessorKey: "email", header: "Email", cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: getValue() ?? "\u2014" }) },
|
|
176
|
-
{ accessorKey: "phone", header: "Telefone", cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: getValue() ?? "\u2014" }) },
|
|
177
|
-
{
|
|
178
|
-
accessorKey: "ordersCount",
|
|
179
|
-
header: () => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-right", children: "Pedidos" }),
|
|
180
|
-
cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: getValue() })
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
accessorKey: "totalSpent",
|
|
184
|
-
header: () => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-right", children: "Total Gasto" }),
|
|
185
|
-
cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: currency(getValue()) })
|
|
186
|
-
}
|
|
187
|
-
], []);
|
|
188
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { children: loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-12 text-center text-sm text-muted-foreground", children: "Carregando..." }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
189
|
-
ui.DataTable,
|
|
190
|
-
{
|
|
191
|
-
columns,
|
|
192
|
-
data: customers,
|
|
193
|
-
variant: "card",
|
|
194
|
-
emptyMessage: "Nenhum cliente ainda."
|
|
195
|
-
}
|
|
196
|
-
) });
|
|
197
|
-
}
|
|
198
|
-
function DiscountsTab({ provider }) {
|
|
199
|
-
const [discounts, setDiscounts] = react.useState([]);
|
|
200
|
-
const [loading, setLoading] = react.useState(true);
|
|
201
|
-
react.useEffect(() => {
|
|
202
|
-
resolveShopProvider(provider).listDiscounts({ limit: 50 }).then(setDiscounts).finally(() => setLoading(false));
|
|
203
|
-
}, [provider]);
|
|
204
|
-
const columns = react.useMemo(() => [
|
|
205
|
-
{ accessorKey: "title", header: "T\xEDtulo", cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: getValue() }) },
|
|
206
|
-
{ accessorKey: "code", header: "C\xF3digo", cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono text-sm", children: getValue() ?? "\u2014" }) },
|
|
207
|
-
{ accessorKey: "type", header: "Tipo", cell: ({ getValue }) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: getValue() }) },
|
|
208
|
-
{
|
|
209
|
-
accessorKey: "value",
|
|
210
|
-
header: () => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-right", children: "Valor" }),
|
|
211
|
-
cell: ({ row }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: row.original.type === "percentage" ? `${row.original.value}%` : currency(row.original.value) })
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
id: "usos",
|
|
215
|
-
accessorKey: "timesUsed",
|
|
216
|
-
header: () => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-right", children: "Usos" }),
|
|
217
|
-
cell: ({ row }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-right", children: [
|
|
218
|
-
row.original.timesUsed,
|
|
219
|
-
row.original.usageLimit ? ` / ${row.original.usageLimit}` : ""
|
|
220
|
-
] })
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
accessorKey: "status",
|
|
224
|
-
header: "Status",
|
|
225
|
-
cell: ({ getValue }) => {
|
|
226
|
-
const status = getValue();
|
|
227
|
-
return badge(status, statusColors[status] ?? "bg-gray-100 text-gray-700");
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
], []);
|
|
231
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { children: loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-12 text-center text-sm text-muted-foreground", children: "Carregando..." }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
232
|
-
ui.DataTable,
|
|
233
|
-
{
|
|
234
|
-
columns,
|
|
235
|
-
data: discounts,
|
|
236
|
-
variant: "card",
|
|
237
|
-
emptyMessage: "Nenhum desconto cadastrado."
|
|
238
|
-
}
|
|
239
|
-
) });
|
|
240
|
-
}
|
|
241
|
-
var TABS = [
|
|
242
|
-
{ id: "products", label: "Produtos" },
|
|
243
|
-
{ id: "orders", label: "Pedidos" },
|
|
244
|
-
{ id: "customers", label: "Clientes" },
|
|
245
|
-
{ id: "discounts", label: "Descontos" }
|
|
246
|
-
];
|
|
247
|
-
var ShopPage = ({ provider }) => {
|
|
248
|
-
const [tab, setTab] = react.useState("products");
|
|
249
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 max-w-7xl mx-auto", children: [
|
|
250
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6", children: [
|
|
251
|
-
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-semibold", children: "Loja" }),
|
|
252
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mt-1", children: "Gerencie produtos, pedidos, clientes e descontos." })
|
|
253
|
-
] }),
|
|
254
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b mb-6", children: /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "flex gap-1", children: TABS.map((t) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
255
|
-
"button",
|
|
256
|
-
{
|
|
257
|
-
onClick: () => setTab(t.id),
|
|
258
|
-
className: `px-4 py-2 text-sm font-medium border-b-2 transition-colors ${tab === t.id ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"}`,
|
|
259
|
-
children: t.label
|
|
260
|
-
},
|
|
261
|
-
t.id
|
|
262
|
-
)) }) }),
|
|
263
|
-
tab === "products" && /* @__PURE__ */ jsxRuntime.jsx(ProductsTab, { provider }),
|
|
264
|
-
tab === "orders" && /* @__PURE__ */ jsxRuntime.jsx(OrdersTab, { provider }),
|
|
265
|
-
tab === "customers" && /* @__PURE__ */ jsxRuntime.jsx(CustomersTab, { provider }),
|
|
266
|
-
tab === "discounts" && /* @__PURE__ */ jsxRuntime.jsx(DiscountsTab, { provider })
|
|
267
|
-
] });
|
|
268
|
-
};
|
|
269
|
-
ShopPage.displayName = "ShopPage";
|
|
270
|
-
|
|
271
|
-
exports.ShopPage = ShopPage;
|
|
272
|
-
//# sourceMappingURL=ShopPage-PG5GKOZU.cjs.map
|
|
273
|
-
//# sourceMappingURL=ShopPage-PG5GKOZU.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ShopPage.tsx"],"names":["getShopProvider","useState","useCallback","useEffect","useMemo","jsx","jsxs","DataTable"],"mappings":"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","file":"ShopPage-PG5GKOZU.cjs","sourcesContent":["import React, { useEffect, useState, useCallback, useMemo } from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@fayz-ai/ui'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { Product, Order, ShopCustomer, Discount, ListProductsOptions, ShopProvider } from '@fayz-ai/shop'\n\nexport type ShopProviderResolver = ShopProvider | (() => ShopProvider)\n\nexport interface ShopPageProps {\n provider?: ShopProviderResolver\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction currency(value: number, code = 'BRL', locale = 'pt-BR') {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(value)\n}\n\nfunction badge(label: string, color: string) {\n return (\n <span className={`inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium ${color}`}>\n {label}\n </span>\n )\n}\n\nconst statusColors: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n archived: 'bg-orange-100 text-orange-700',\n open: 'bg-blue-100 text-blue-800',\n cancelled: 'bg-red-100 text-red-700',\n paid: 'bg-emerald-100 text-emerald-800',\n pending: 'bg-yellow-100 text-yellow-800',\n fulfilled: 'bg-emerald-100 text-emerald-800',\n unfulfilled: 'bg-gray-100 text-gray-700',\n 'partially_fulfilled': 'bg-blue-100 text-blue-800',\n}\n\nfunction resolveShopProvider(provider?: ShopProviderResolver): ShopProvider {\n return typeof provider === 'function' ? provider() : provider ?? getShopProvider()\n}\n\n// ---------------------------------------------------------------------------\n// Products tab\n// ---------------------------------------------------------------------------\n\nfunction ProductsTab({ provider }: ShopPageProps) {\n const [products, setProducts] = useState<Product[]>([])\n const [loading, setLoading] = useState(true)\n const [search, setSearch] = useState('')\n\n const load = useCallback(async (opts?: ListProductsOptions) => {\n setLoading(true)\n try {\n const data = await resolveShopProvider(provider).listProducts(opts)\n setProducts(data)\n } finally {\n setLoading(false)\n }\n }, [provider])\n\n useEffect(() => { load() }, [load])\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const q = e.target.value\n setSearch(q)\n load(q ? { search: q } : undefined)\n }\n\n const columns = useMemo<ColumnDef<Product, any>[]>(() => [\n { accessorKey: 'name', header: 'Produto', cell: ({ getValue }) => <span className=\"font-medium\">{getValue() as string}</span> },\n { accessorKey: 'sku', header: 'SKU', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n {\n accessorKey: 'price', header: () => <span className=\"block text-right\">Preço</span>,\n cell: ({ getValue, row }) => <div className=\"text-right\">{currency(getValue() as number, row.original.currency)}</div>,\n },\n {\n accessorKey: 'inventoryCount', header: () => <span className=\"block text-right\">Estoque</span>,\n cell: ({ getValue }) => {\n const count = getValue() as number\n return <div className=\"text-right\"><span className={count === 0 ? 'text-red-600 font-medium' : ''}>{count}</span></div>\n },\n },\n {\n accessorKey: 'status', header: 'Status',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n ], [])\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-4\">\n <input\n type=\"search\" value={search} onChange={handleSearch}\n placeholder=\"Buscar produtos...\"\n className=\"border rounded-lg px-3 py-2 text-sm w-64 focus:outline-none focus:ring-2 focus:ring-primary/50\"\n />\n <span className=\"text-sm text-muted-foreground\">{products.length} produtos</span>\n </div>\n\n {loading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">Carregando...</div>\n ) : (\n <DataTable\n columns={columns}\n data={products}\n variant=\"card\"\n emptyMessage=\"Nenhum produto encontrado.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Orders tab\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({ provider }: ShopPageProps) {\n const [orders, setOrders] = useState<Order[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n resolveShopProvider(provider).listOrders({ limit: 50 }).then(setOrders).finally(() => setLoading(false))\n }, [provider])\n\n const columns = useMemo<ColumnDef<Order, any>[]>(() => [\n { accessorKey: 'orderNumber', header: 'Pedido', cell: ({ getValue }) => <span className=\"font-medium\">#{getValue() as string}</span> },\n {\n id: 'customer', accessorFn: (o) => o.customerName ?? o.customerEmail ?? '—', header: 'Cliente',\n cell: ({ getValue }) => <span>{getValue() as string}</span>,\n },\n {\n accessorKey: 'total', header: () => <span className=\"block text-right\">Total</span>,\n cell: ({ getValue, row }) => <div className=\"text-right font-medium\">{currency(getValue() as number, row.original.currency)}</div>,\n },\n {\n accessorKey: 'financialStatus', header: 'Pagamento',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n {\n accessorKey: 'fulfillmentStatus', header: 'Entrega',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n {\n accessorKey: 'createdAt', header: 'Data',\n cell: ({ getValue }) => <span className=\"text-muted-foreground\">{new Date(getValue() as string).toLocaleDateString('pt-BR')}</span>,\n },\n ], [])\n\n return (\n <div>\n {loading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">Carregando...</div>\n ) : (\n <DataTable\n columns={columns}\n data={orders}\n variant=\"card\"\n emptyMessage=\"Nenhum pedido ainda.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Customers tab\n// ---------------------------------------------------------------------------\n\nfunction CustomersTab({ provider }: ShopPageProps) {\n const [customers, setCustomers] = useState<ShopCustomer[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n resolveShopProvider(provider).listCustomers({ limit: 50 }).then(setCustomers).finally(() => setLoading(false))\n }, [provider])\n\n const columns = useMemo<ColumnDef<ShopCustomer, any>[]>(() => [\n {\n id: 'name', accessorFn: (c) => `${c.firstName} ${c.lastName}`, header: 'Nome',\n cell: ({ row }) => <span className=\"font-medium\">{row.original.firstName} {row.original.lastName}</span>,\n },\n { accessorKey: 'email', header: 'Email', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n { accessorKey: 'phone', header: 'Telefone', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n {\n accessorKey: 'ordersCount', header: () => <span className=\"block text-right\">Pedidos</span>,\n cell: ({ getValue }) => <div className=\"text-right\">{getValue() as number}</div>,\n },\n {\n accessorKey: 'totalSpent', header: () => <span className=\"block text-right\">Total Gasto</span>,\n cell: ({ getValue }) => <div className=\"text-right\">{currency(getValue() as number)}</div>,\n },\n ], [])\n\n return (\n <div>\n {loading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">Carregando...</div>\n ) : (\n <DataTable\n columns={columns}\n data={customers}\n variant=\"card\"\n emptyMessage=\"Nenhum cliente ainda.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Discounts tab\n// ---------------------------------------------------------------------------\n\nfunction DiscountsTab({ provider }: ShopPageProps) {\n const [discounts, setDiscounts] = useState<Discount[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n resolveShopProvider(provider).listDiscounts({ limit: 50 }).then(setDiscounts).finally(() => setLoading(false))\n }, [provider])\n\n const columns = useMemo<ColumnDef<Discount, any>[]>(() => [\n { accessorKey: 'title', header: 'Título', cell: ({ getValue }) => <span className=\"font-medium\">{getValue() as string}</span> },\n { accessorKey: 'code', header: 'Código', cell: ({ getValue }) => <span className=\"font-mono text-sm\">{(getValue() as string | undefined) ?? '—'}</span> },\n { accessorKey: 'type', header: 'Tipo', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{getValue() as string}</span> },\n {\n accessorKey: 'value', header: () => <span className=\"block text-right\">Valor</span>,\n cell: ({ row }) => <div className=\"text-right\">{row.original.type === 'percentage' ? `${row.original.value}%` : currency(row.original.value)}</div>,\n },\n {\n id: 'usos', accessorKey: 'timesUsed', header: () => <span className=\"block text-right\">Usos</span>,\n cell: ({ row }) => <div className=\"text-right\">{row.original.timesUsed}{row.original.usageLimit ? ` / ${row.original.usageLimit}` : ''}</div>,\n },\n {\n accessorKey: 'status', header: 'Status',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n ], [])\n\n return (\n <div>\n {loading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">Carregando...</div>\n ) : (\n <DataTable\n columns={columns}\n data={discounts}\n variant=\"card\"\n emptyMessage=\"Nenhum desconto cadastrado.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main page\n// ---------------------------------------------------------------------------\n\nconst TABS = [\n { id: 'products', label: 'Produtos' },\n { id: 'orders', label: 'Pedidos' },\n { id: 'customers', label: 'Clientes' },\n { id: 'discounts', label: 'Descontos' },\n] as const\n\ntype TabId = typeof TABS[number]['id']\n\nexport const ShopPage: React.FC<ShopPageProps> = ({ provider }) => {\n const [tab, setTab] = useState<TabId>('products')\n\n return (\n <div className=\"p-6 max-w-7xl mx-auto\">\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-semibold\">Loja</h1>\n <p className=\"text-muted-foreground mt-1\">Gerencie produtos, pedidos, clientes e descontos.</p>\n </div>\n\n {/* Tabs */}\n <div className=\"border-b mb-6\">\n <nav className=\"flex gap-1\">\n {TABS.map(t => (\n <button\n key={t.id}\n onClick={() => setTab(t.id)}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n tab === t.id\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {t.label}\n </button>\n ))}\n </nav>\n </div>\n\n {tab === 'products' && <ProductsTab provider={provider} />}\n {tab === 'orders' && <OrdersTab provider={provider} />}\n {tab === 'customers' && <CustomersTab provider={provider} />}\n {tab === 'discounts' && <DiscountsTab provider={provider} />}\n </div>\n )\n}\n\nShopPage.displayName = 'ShopPage'\n"]}
|