@fayz-ai/plugin-shop 0.8.1 → 0.8.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/{ShopPage-HCLXMN7Q.js → ShopPage-JP27MZS2.js} +232 -285
- package/dist/ShopPage-JP27MZS2.js.map +1 -0
- package/dist/{ShopPage-JF2SQBKO.cjs → ShopPage-NK6FSPJ5.cjs} +230 -283
- package/dist/ShopPage-NK6FSPJ5.cjs.map +1 -0
- package/dist/index.cjs +253 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +248 -20
- package/dist/index.js.map +1 -1
- package/dist/views/ChannelsPage.d.ts +7 -0
- package/dist/views/ChannelsPage.d.ts.map +1 -0
- package/dist/views/OrderDetailView.d.ts +1 -1
- package/dist/views/OrderDetailView.d.ts.map +1 -1
- package/dist/views/discountEntity.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/ShopPage.tsx +1 -1
- package/src/index.ts +47 -2
- package/src/views/ChannelsPage.tsx +274 -0
- package/src/views/OrderDetailView.tsx +205 -461
- package/src/views/discountEntity.tsx +7 -0
- package/dist/ShopPage-HCLXMN7Q.js.map +0 -1
- package/dist/ShopPage-JF2SQBKO.cjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/views/ProductImagesTab.tsx","../src/views/productEntity.tsx","../src/views/customerEntity.tsx","../src/views/discountEntity.tsx","../src/views/shippingZoneEntity.tsx","../src/data/shared.ts","../src/data/productDataProvider.ts","../src/data/customerDataProvider.ts","../src/data/discountDataProvider.ts","../src/data/shippingZoneDataProvider.ts","../src/components/ShopSettings.tsx","../src/index.ts"],"names":["update","jsxs","jsx","money","STATUS_TONE","React"],"mappings":"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","file":"index.js","sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\nimport type { Product, ProductImage, ShopProvider } from '@fayz-ai/shop'\n\n/**\n * The product's whole gallery, not just its cover.\n *\n * plg_shop_product_images has always been a collection — sort_order, is_primary\n * — but the admin only ever exposed the single `EntityImageConfig` slot on the\n * form, so a merchant could set one photo and no more, and the storefront had\n * nothing to build a carousel from. This is the missing half.\n *\n * Deliberately not drag-and-drop: ordering is done with arrows because a\n * keyboard and a screen reader can use them, and because reordering four\n * photos of a rib is not worth a drag library.\n */\nexport function ProductImagesTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const [images, setImages] = useState<ProductImage[]>([])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const fileRef = useRef<HTMLInputElement>(null)\n\n async function reload() {\n const fresh = await getProvider().getProduct(product.id)\n setImages(sortImages(fresh?.images ?? []))\n }\n\n useEffect(() => { void reload().catch(() => {}) }, [product.id])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(false)\n }\n }\n\n async function upload(files: FileList | null) {\n if (!files?.length) return\n // Sequential, not Promise.all: each upload reads the current max sort_order\n // to place itself last, and running them together makes them all read the\n // same value and land on the same position.\n await run(async () => {\n for (const file of Array.from(files)) {\n await getProvider().uploadProductImage(product.id, file)\n }\n if (fileRef.current) fileRef.current.value = ''\n })\n }\n\n function move(index: number, delta: number) {\n const target = index + delta\n if (target < 0 || target >= images.length) return\n const a = images[index]!\n const b = images[target]!\n // Swap the two positions rather than renumbering the list: fewer writes, and\n // a failure halfway leaves an order that is still coherent.\n void run(async () => {\n const update = getProvider().updateProductImage\n if (!update) throw new Error('Este provider não suporta reordenar imagens.')\n await update(a.id, { sortOrder: b.sortOrder ?? target })\n await update(b.id, { sortOrder: a.sortOrder ?? index })\n })\n }\n\n const update = getProvider().updateProductImage\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Fotos do produto</h3>\n <p className=\"text-xs text-muted-foreground\">\n A primeira foto é a capa — aparece no catálogo, no carrinho e no pedido.\n As demais viram o carrossel na página do produto.\n </p>\n </div>\n <label className=\"inline-flex cursor-pointer items-center rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground transition hover:opacity-90\">\n {busy ? 'Enviando…' : 'Adicionar fotos'}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n disabled={busy}\n className=\"hidden\"\n onChange={(event) => void upload(event.target.files)}\n />\n </label>\n </div>\n\n {error && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">{error}</p>\n )}\n\n {images.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-10 text-center text-sm text-muted-foreground\">\n Nenhuma foto ainda. Produtos com mais de uma foto vendem melhor — mostre a\n embalagem, o produto pronto e uma referência de tamanho.\n </p>\n ) : (\n <ul className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4\">\n {images.map((image, index) => (\n <li key={image.id} className=\"overflow-hidden rounded-lg border\">\n <div className=\"relative aspect-square bg-muted\">\n <img src={image.url} alt={image.altText ?? ''} className=\"h-full w-full object-cover\" />\n {image.isPrimary && (\n <span className=\"absolute left-2 top-2 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </div>\n <div className=\"flex items-center justify-between gap-1 px-2 py-1.5\">\n <div className=\"flex gap-1\">\n <IconButton label=\"Mover para trás\" disabled={busy || index === 0}\n onClick={() => move(index, -1)}>←</IconButton>\n <IconButton label=\"Mover para frente\" disabled={busy || index === images.length - 1}\n onClick={() => move(index, 1)}>→</IconButton>\n </div>\n <div className=\"flex gap-1\">\n {!image.isPrimary && update && (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => update(image.id, { isPrimary: true }))}\n className=\"rounded px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n Usar como capa\n </button>\n )}\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => getProvider().deleteProductImage(image.id))}\n className=\"rounded px-1.5 py-0.5 text-xs text-red-600 hover:bg-red-50 disabled:opacity-50\"\n >\n Excluir\n </button>\n </div>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </button>\n )\n}\n\n/** Cover first, then the merchant's order — the same rule the storefront uses. */\nfunction sortImages(images: ProductImage[]): ProductImage[] {\n return [...images].sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0)\n })\n}\n","import React from 'react'\nimport type { EntityDef, EntityImageConfig, FieldDef } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\nimport { ProductImagesTab } from './ProductImagesTab'\n\n// ---------------------------------------------------------------------------\n// Storefront Product — the single source of truth for the shop product CRUD.\n// Drives the list columns AND the form sections via the generic CRUD scaffolding\n// (createCrudPage → CrudListView + CrudFormPage), same pattern plugin-inventory\n// uses for its ERP product.\n//\n// This is deliberately the STOREFRONT shape (what a shopper sees: name, price,\n// compare-at, images, publication status), not the ERP shape plugin-inventory\n// models (cost, margin, min/max levels). They are different products in\n// different tables — see the shop/inventory bridge note in the roadmap.\n//\n// Not modelled here because the schema has nowhere to put them yet:\n// • variants (options/SKU/stock per variant) — needs plg_shop_variants\n// • SEO title/description — needs columns on plg_shop_products\n// • multi-category — the column is a single category_id\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: 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}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo',\n draft: 'Rascunho',\n archived: 'Arquivado',\n}\n\nfunction money(value: unknown, currency = 'BRL') {\n const n = Number(value)\n if (!Number.isFinite(n)) return '—'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(n)\n}\n\n/** `name` → `name-do-produto`, so the storefront URL is filled in for you. */\nexport function slugify(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/**\n * Wires the form's image slot to the product's own images. `uploadProductImage`\n * has existed on the provider all along with nothing calling it — the slot was a\n * decorative square, so a product with a photo still showed an empty placeholder.\n */\nfunction productImage(getProvider: () => ShopProvider): EntityImageConfig {\n return {\n get: (row) => {\n const images = (row as Partial<Product>).images\n return images?.find((i) => i.isPrimary)?.url ?? images?.[0]?.url\n },\n upload: async (file, row) => {\n if (!row.id) throw new Error('Salve o produto antes de enviar a imagem.')\n const image = await getProvider().uploadProductImage(row.id, file)\n return image.url\n },\n accept: 'image/*',\n }\n}\n\nexport function buildShopProductEntity(\n currencyCode = 'BRL',\n getProvider?: () => ShopProvider,\n): EntityDef<Product> {\n const fields: FieldDef[] = [\n // — Geral —\n {\n key: 'name', label: 'Nome do produto', type: 'text', required: true,\n group: 'general', placeholder: 'Costela Bovina Defumada 400g',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"flex items-center gap-3\">\n {row.images?.[0]?.url && (\n <img\n src={row.images[0].url}\n alt=\"\"\n className=\"h-9 w-9 rounded object-cover\"\n loading=\"lazy\"\n />\n )}\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.name}</p>\n {row.sku && <p className=\"text-xs text-muted-foreground\">{row.sku}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'slug', label: 'URL', type: 'text', group: 'general',\n placeholder: 'gerado a partir do nome',\n hint: 'Endereço do produto na loja. Deixe em branco para gerar automaticamente.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'general', span: 2,\n placeholder: 'Como é feito, como preparar, o que acompanha…',\n showInTable: false,\n },\n\n // — Preço —\n {\n key: 'price', label: 'Preço de venda', type: 'currency', required: true,\n group: 'pricing', currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n showInTable: true, sortable: true,\n renderCell: (v, row: any) => (\n <div className=\"text-right\">\n <span className=\"font-medium\">{money(v, row.currency)}</span>\n {row.compareAtPrice > row.price && (\n <span className=\"ml-2 text-xs text-muted-foreground line-through\">\n {money(row.compareAtPrice, row.currency)}\n </span>\n )}\n </div>\n ),\n },\n {\n key: 'compareAtPrice', label: 'Preço comparativo', type: 'currency', group: 'pricing',\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Preço \"de\" riscado. Deixe vazio se não estiver em promoção.',\n showInTable: false,\n },\n {\n key: 'discount', label: 'Desconto', type: 'computed', group: 'pricing', showInTable: false,\n compute: (vals) => {\n const price = Number(vals.price) || 0\n const compare = Number(vals.compareAtPrice) || 0\n if (compare <= 0 || price <= 0 || compare <= price) return null\n const pct = ((compare - price) / compare) * 100\n return { display: `-${pct.toFixed(0)}%`, tone: 'positive' }\n },\n },\n\n // — Estoque —\n {\n key: 'sku', label: 'SKU', type: 'text', group: 'inventory',\n placeholder: 'ART-001', searchable: true, showInTable: false,\n },\n {\n key: 'inventoryCount', label: 'Estoque', type: 'number', group: 'inventory', min: 0,\n placeholder: '0', hint: 'Chega a zero e o produto aparece como esgotado na loja.',\n showInTable: true, sortable: true,\n renderCell: (v) => {\n const n = Number(v) || 0\n return (\n <span className={`block text-right ${n === 0 ? 'font-medium text-destructive' : n <= 3 ? 'text-orange-600' : ''}`}>\n {n}\n </span>\n )\n },\n },\n\n // — Publicação —\n {\n key: 'status', label: 'Status', type: 'segmented', required: true,\n group: 'publishing', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Só você vê. Não aparece na loja.' },\n { label: 'Ativo', value: 'active', description: 'Publicado e à venda.' },\n { label: 'Arquivado', value: 'archived', description: 'Fora da loja, histórico preservado.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n {\n key: 'sortOrder', label: 'Ordem na vitrine', type: 'number', group: 'publishing',\n placeholder: '0', hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — Envio —\n {\n key: 'isPhysical', label: 'Produto físico', type: 'boolean', group: 'shipping',\n hint: 'Desmarque para itens digitais, que não calculam frete.', showInTable: false,\n },\n { key: 'weight', label: 'Peso', type: 'number', group: 'shipping', min: 0, placeholder: '0.4', showInTable: false },\n {\n key: 'weightUnit', label: 'Unidade', type: 'select', group: 'shipping', showInTable: false,\n options: [{ label: 'kg', value: 'kg' }, { label: 'g', value: 'g' }, { label: 'lb', value: 'lb' }],\n },\n ]\n\n return {\n name: 'Produto',\n namePlural: 'Produtos',\n icon: 'Package',\n displayField: 'name',\n fields,\n fieldGroups: [\n // imageSlot renders the scaffolding's image uploader alongside the group.\n { id: 'general', label: 'Informações', columns: 2, imageSlot: true },\n { id: 'pricing', label: 'Preço', description: 'O preço comparativo vira o \"de\" riscado na vitrine.', columns: 3 },\n { id: 'inventory', label: 'Estoque', columns: 2 },\n { id: 'publishing', label: 'Publicação', description: 'Controla se o produto aparece na loja.', columns: 2 },\n { id: 'shipping', label: 'Envio', columns: 3 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n image: getProvider ? productImage(getProvider) : undefined,\n // The form's image slot sets the COVER; this tab manages the rest of the\n // gallery. plg_shop_product_images has always held a collection, and until\n // now nothing in the admin could add a second row to it — so the storefront\n // carousel had exactly one slide for every product in the pool.\n detailTabs: getProvider\n ? [{\n id: 'images',\n label: 'Fotos',\n icon: 'Image',\n component: ProductImagesTab as never,\n props: { getProvider },\n }]\n : undefined,\n } as EntityDef<Product>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { ShopCustomer } from '@fayz-ai/shop'\nimport { ClientOrdersTab, createClientOrdersProvider, adminNavigateTo } from '@fayz-ai/saas'\nimport type { ClientDocument } from '@fayz-ai/saas'\n\n// ---------------------------------------------------------------------------\n// Shop customer — same declarative contract as the product entity, so the list\n// and the form both come from createCrudPage instead of a hand-rolled table.\n//\n// ordersCount / totalSpent are read-only: they are maintained server-side by the\n// shop_refresh_customer_stats trigger on every order insert/update/delete, so\n// putting them in the form would offer an edit the database would overwrite.\n// ---------------------------------------------------------------------------\n\nfunction money(value: unknown) {\n const n = Number(value)\n if (!Number.isFinite(n)) return 'R$ 0,00'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(n)\n}\n\nexport function buildShopCustomerEntity(): EntityDef<ShopCustomer> {\n const fields: FieldDef[] = [\n // — Contato —\n {\n key: 'firstName', label: 'Nome', type: 'text', required: true,\n group: 'contact', placeholder: 'Maria', searchable: true,\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{[row.firstName, row.lastName].filter(Boolean).join(' ')}</p>\n {row.email && <p className=\"truncate text-xs text-muted-foreground\">{row.email}</p>}\n </div>\n ),\n },\n { key: 'lastName', label: 'Sobrenome', type: 'text', group: 'contact', placeholder: 'Silva', searchable: true, showInTable: false },\n {\n key: 'email', label: 'E-mail', type: 'text', group: 'contact',\n placeholder: 'maria@exemplo.com', searchable: true,\n hint: 'É por ele que o pedido é vinculado ao cliente no checkout.',\n showInTable: false,\n },\n {\n key: 'phone', label: 'Telefone', type: 'text', group: 'contact',\n placeholder: '(21) 99999-0000', searchable: true,\n showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{(v as string) || '—'}</span>,\n },\n\n // — Histórico (somente leitura) —\n {\n key: 'ordersCount', label: 'Pedidos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right\">{Number(v) || 0}</span>,\n },\n {\n key: 'totalSpent', label: 'Total gasto', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n\n // — Interno —\n {\n key: 'notes', label: 'Observações', type: 'textarea', group: 'internal', span: 2,\n placeholder: 'Preferências, restrições, combinados de entrega…',\n hint: 'Visível só no admin. O cliente nunca vê.',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Cliente',\n namePlural: 'Clientes',\n icon: 'Users',\n displayField: 'firstName',\n // `person` layout brings the shared archetype tabs — including Endereços,\n // which reads the core addresses table and therefore works in every app.\n layout: 'person',\n // Without archetypeKind the shell shows every person tab, including the\n // staff-only Agenda (its visibleFor filter only runs when a kind is set).\n data: { table: 'plg_shop_customers', archetypeKind: 'customer' },\n fields,\n // The SAME tab and the SAME provider beauty-saas uses. Since the shop's\n // orders now live in public.orders with party_id set, the canonical provider\n // already returns them — a shop-specific adapter would be a second\n // implementation of \"list this person's orders\", which is how two apps end\n // up with two different answers to the same question.\n detailTabs: [{\n id: 'orders',\n label: 'Pedidos',\n icon: 'ShoppingBag',\n aliases: ['appointments', 'quotes'],\n component: ClientOrdersTab as never,\n props: {\n provider: createClientOrdersProvider(),\n currency: { code: 'BRL', locale: 'pt-BR' },\n // The one part that legitimately differs per app: where a document\n // leads. Beauty sends a booking to the agenda and an invoice to\n // receivables; a shop order goes to the order screen.\n navigator: {\n onNavigate: (doc: ClientDocument) => adminNavigateTo(`/shop/orders/${doc.id}`),\n },\n },\n }],\n fieldGroups: [\n { id: 'contact', label: 'Contato', columns: 2 },\n { id: 'internal', label: 'Notas internas', columns: 1 },\n ],\n } as EntityDef<ShopCustomer>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Discount } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Discount — declarative CRUD, same contract as products and customers.\n//\n// `timesUsed` is read-only: shop_place_order increments it inside the same\n// transaction that validates the coupon, so the admin must never write it.\n//\n// `buy_x_get_y` is deliberately absent from the type options: the enum value\n// exists in the database but shop_place_order records the code and applies no\n// monetary effect (0003:116), so offering it would create coupons that silently\n// do nothing.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nexport function buildShopDiscountEntity(): EntityDef<Discount> {\n const fields: FieldDef[] = [\n // — Cupom —\n {\n key: 'title', label: 'Nome interno', type: 'text', required: true,\n group: 'coupon', placeholder: 'Bem-vindo 10%',\n hint: 'Só o admin vê. Serve para você identificar a campanha.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.title}</p>\n {row.code && <p className=\"font-mono text-xs text-muted-foreground\">{row.code}</p>}\n </div>\n ),\n },\n {\n key: 'code', label: 'Código', type: 'text', group: 'coupon',\n placeholder: 'ARTORIUS10',\n hint: 'O que o cliente digita no carrinho. Maiúsculas e minúsculas não importam.',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'type', label: 'Tipo', type: 'segmented', required: true, group: 'rule', span: 2,\n options: [\n { label: 'Percentual', value: 'percentage', description: 'Desconta uma % do subtotal.' },\n { label: 'Valor fixo', value: 'fixed_amount', description: 'Desconta um valor em reais.' },\n { label: 'Frete grátis', value: 'free_shipping', description: 'Zera o frete do pedido.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const labels: Record<string, string> = {\n percentage: 'Percentual', fixed_amount: 'Valor fixo', free_shipping: 'Frete grátis', buy_x_get_y: 'Leve X pague Y',\n }\n return <span className=\"text-muted-foreground\">{labels[String(v)] ?? String(v)}</span>\n },\n },\n {\n key: 'value', label: 'Valor', type: 'number', group: 'rule', min: 0,\n placeholder: '10',\n hint: 'Percentual: 10 = 10%. Valor fixo: 10 = R$ 10,00. Frete grátis ignora este campo.',\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right font-medium\">\n {row.type === 'percentage'\n ? `${row.value}%`\n : row.type === 'free_shipping'\n ? '—'\n : new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(row.value) || 0)}\n </span>\n ),\n },\n\n // — Limites —\n {\n key: 'usageLimit', label: 'Limite de usos', type: 'number', group: 'limits', min: 0,\n placeholder: 'sem limite', hint: 'Deixe vazio para uso ilimitado.', showInTable: false,\n },\n {\n key: 'oncePerCustomer', label: 'Uma vez por cliente', type: 'boolean', group: 'limits',\n hint: 'Só vale para quem se identifica no checkout — compra como visitante não é rastreada.',\n showInTable: false,\n },\n {\n key: 'timesUsed', label: 'Usos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right text-muted-foreground\">\n {row.timesUsed}{row.usageLimit ? ` / ${row.usageLimit}` : ''}\n </span>\n ),\n },\n\n // — Vigência —\n { key: 'startsAt', label: 'Início', type: 'date', group: 'schedule', showInTable: false },\n {\n key: 'endsAt', label: 'Fim', type: 'date', group: 'schedule',\n hint: 'Vazio = sem data de expiração.', showInTable: false,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', required: true, group: 'schedule', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Não aceito no carrinho.' },\n { label: 'Ativo', value: 'active', description: 'Valendo agora.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o histórico.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {s}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Desconto',\n namePlural: 'Descontos',\n icon: 'Tag',\n displayField: 'title',\n fields,\n fieldGroups: [\n { id: 'coupon', label: 'Cupom', columns: 2 },\n { id: 'rule', label: 'Regra', description: 'O desconto é recalculado no servidor a cada pedido.', columns: 2 },\n { id: 'limits', label: 'Limites de uso', columns: 2 },\n { id: 'schedule', label: 'Vigência', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n } as EntityDef<Discount>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { ShippingZone } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Delivery zone — declarative CRUD, same contract as products and discounts.\n//\n// A zone is a range of postal codes with its own price and estimate. Ranges may\n// overlap on purpose: the cheapest match wins, which is how a merchant layers a\n// promotion over a broader zone without deleting the broader one.\n//\n// The two things worth being loud about in the UI:\n// · a store with NO zones keeps charging its flat rate — zones are opt-in;\n// · once the first zone exists, an address outside every zone can no longer\n// order (shop_place_order refuses it), so the first save changes who can buy.\n// ---------------------------------------------------------------------------\n\nconst cep = (value: string | undefined): string => {\n const digits = String(value ?? '').replace(/\\D/g, '').padStart(8, '0')\n return `${digits.slice(0, 5)}-${digits.slice(5)}`\n}\n\nexport function buildShopShippingZoneEntity(currency = 'BRL'): EntityDef<ShippingZone> {\n const money = (value: number | null | undefined) =>\n value == null\n ? '—'\n : new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(Number(value))\n\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome da zona', type: 'text', required: true, group: 'zone',\n placeholder: 'Rio de Janeiro — capital',\n hint: 'Aparece para o cliente na hora de escolher a entrega.',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'carrier', label: 'Transportadora', type: 'text', group: 'zone',\n placeholder: 'Correios, motoboy próprio…',\n hint: 'Opcional. Mostrado antes do nome da zona quando preenchido.',\n showInTable: true,\n },\n {\n key: 'postalFrom', label: 'CEP inicial', type: 'text', required: true, group: 'zone',\n placeholder: '20000-000',\n hint: 'Início da faixa. Pode digitar com ou sem traço.',\n showInTable: true,\n renderCell: (_v, row: any) => (\n <span className=\"whitespace-nowrap font-mono text-xs\">\n {cep(row.postalFrom)} → {cep(row.postalTo)}\n </span>\n ),\n },\n {\n key: 'postalTo', label: 'CEP final', type: 'text', required: true, group: 'zone',\n placeholder: '23799-999',\n hint: 'Fim da faixa, inclusive.',\n showInTable: false,\n },\n {\n key: 'rate', label: 'Valor do frete', type: 'number', required: true, group: 'pricing',\n hint: 'Cobrado nos pedidos entregues nessa faixa.',\n showInTable: true, sortable: true,\n renderCell: (value: any) => <span className=\"tabular-nums\">{money(value)}</span>,\n },\n {\n key: 'freeAbove', label: 'Frete grátis acima de', type: 'number', group: 'pricing',\n hint: 'Deixe vazio para nunca dar frete grátis nessa zona. Vale mais que a regra geral da loja.',\n showInTable: true,\n renderCell: (value: any) => <span className=\"tabular-nums\">{money(value)}</span>,\n },\n {\n key: 'etaMinDays', label: 'Prazo mínimo (dias)', type: 'number', group: 'delivery',\n hint: '0 = no mesmo dia.',\n showInTable: false,\n },\n {\n key: 'etaMaxDays', label: 'Prazo máximo (dias)', type: 'number', group: 'delivery',\n hint: 'O cliente vê a faixa \"de X a Y dias úteis\" na página do produto.',\n showInTable: true,\n renderCell: (_v, row: any) =>\n row.etaMinDays == null && row.etaMaxDays == null\n ? <span className=\"text-muted-foreground\">—</span>\n : <span>{row.etaMinDays ?? 0}–{row.etaMaxDays ?? row.etaMinDays} dias</span>,\n },\n {\n key: 'active', label: 'Ativa', type: 'boolean', group: 'delivery',\n hint: 'Desativar para de cotar essa faixa sem apagar a configuração.',\n showInTable: true,\n renderCell: (value: any) => (\n <span className={`rounded-full px-2 py-0.5 text-xs font-medium ${\n value ? 'bg-emerald-100 text-emerald-800' : 'bg-gray-100 text-gray-700'}`}>\n {value ? 'Ativa' : 'Inativa'}\n </span>\n ),\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'delivery',\n hint: 'Desempate quando duas zonas custam o mesmo. Menor aparece primeiro.',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Zona de entrega',\n namePlural: 'Entrega',\n icon: 'Truck',\n displayField: 'name',\n fields,\n fieldGroups: [\n {\n id: 'zone', label: 'Faixa de CEP', columns: 2,\n description:\n 'Faixas podem se sobrepor: quando duas cobrem o mesmo CEP, o cliente paga a mais barata.',\n },\n {\n id: 'pricing', label: 'Preço', columns: 2,\n description: 'O frete cobrado é recalculado no servidor a cada pedido, a partir daqui.',\n },\n { id: 'delivery', label: 'Prazo e status', columns: 2 },\n ],\n facets: [{ field: 'active', allLabel: 'Todas' }],\n } as EntityDef<ShippingZone>\n}\n","import type { CrudQuery, CrudResult } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop'\n\nexport type ShopProviderResolver = ShopProvider | (() => ShopProvider)\n\nexport const resolve = (p: ShopProviderResolver): ShopProvider => (typeof p === 'function' ? p() : p)\n\n/**\n * Paging, sorting and facet filtering applied client-side: the shop provider's\n * list methods take a search term but no offset, sort or filter parameters.\n * Fine at storefront catalogue sizes; revisit if a tenant grows past a few\n * thousand rows, where it should move into the query.\n */\nexport function applyQuery<T>(\n rows: T[],\n query: CrudQuery,\n facetKey?: keyof T & string,\n): CrudResult<T> {\n const prop = (row: T, key: string): unknown => (row as Record<string, unknown>)[key]\n let data = rows\n\n if (facetKey) {\n const wanted = query.filters?.[facetKey]\n if (wanted && wanted !== 'all') data = data.filter((row) => prop(row, facetKey) === wanted)\n }\n\n if (query.sortBy) {\n const dir = query.sortDir === 'desc' ? -1 : 1\n const key = query.sortBy\n data = [...data].sort((a, b) => {\n const av = prop(a, key)\n const bv = prop(b, key)\n if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * dir\n return String(av ?? '').localeCompare(String(bv ?? ''), 'pt-BR') * dir\n })\n }\n\n const total = data.length\n const page = query.page ?? 1\n const size = query.pageSize ?? total\n return { data: data.slice((page - 1) * size, page * size), total }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateProductInput, Product, UpdateProductInput } from '@fayz-ai/shop'\nimport { slugify } from '../views/productEntity'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport type { ShopProviderResolver }\n\n// ---------------------------------------------------------------------------\n// Bridges the generic CRUD scaffolding (DataProvider) to the shop provider, so\n// the product screens are the same createCrudPage machinery every other module\n// uses instead of a bespoke form.\n//\n// Which shop provider is injected decides whether writes work at all:\n// • createSupabaseShopProvider — authenticates as the merchant (their JWT),\n// full CRUD, subject to the tenant-member RLS policies.\n// • createFayzShopProvider — the storefront's anonymous REST client. Reads\n// work; every write throws FayzShopError 501 by design. The form surfaces\n// that message rather than pretending the save succeeded.\n// ---------------------------------------------------------------------------\n\nexport function createShopProductDataProvider(provider: ShopProviderResolver): DataProvider<Product> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Product>> {\n const rows = await resolve(provider).listProducts(\n query.search ? { search: query.search } : undefined,\n )\n return applyQuery(rows, query, 'status')\n },\n\n async create(data): Promise<Product> {\n const input = data as unknown as Partial<Product>\n // The storefront URL is required by the table's UNIQUE(tenant_id, slug);\n // deriving it from the name keeps the merchant from having to know that.\n const slug = input.slug?.trim() || slugify(String(input.name ?? ''))\n return resolve(provider).createProduct({\n ...(input as CreateProductInput),\n slug,\n } as CreateProductInput)\n },\n\n async update(id: string, data: Partial<Product>): Promise<Product> {\n const patch = { ...data }\n if (patch.slug !== undefined && !String(patch.slug).trim()) {\n // Cleared on purpose → regenerate rather than write an empty slug.\n patch.slug = slugify(String(patch.name ?? ''))\n }\n return resolve(provider).updateProduct(id, patch as UpdateProductInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteProduct(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateCustomerInput, ShopCustomer, UpdateCustomerInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopCustomerDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<ShopCustomer> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<ShopCustomer>> {\n const rows = await resolve(provider).listCustomers(\n query.search ? { search: query.search } : undefined,\n )\n return applyQuery(rows, query)\n },\n\n async create(data): Promise<ShopCustomer> {\n return resolve(provider).createCustomer(data as unknown as CreateCustomerInput)\n },\n\n async update(id: string, data: Partial<ShopCustomer>): Promise<ShopCustomer> {\n // ordersCount / totalSpent are trigger-maintained (shop_refresh_customer_stats);\n // never send them back or a stale form value would fight the database.\n const { ordersCount: _o, totalSpent: _t, ...patch } = data\n return resolve(provider).updateCustomer(id, patch as UpdateCustomerInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteCustomer(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateDiscountInput, Discount, UpdateDiscountInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopDiscountDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Discount> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Discount>> {\n const rows = await resolve(provider).listDiscounts()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((d) =>\n d.title.toLowerCase().includes(term) || (d.code ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<Discount> {\n const input = data as unknown as Partial<Discount>\n return resolve(provider).createDiscount({\n ...(input as CreateDiscountInput),\n // Codes are matched case-insensitively server-side; store them upper so\n // the admin list reads consistently.\n code: input.code ? String(input.code).trim().toUpperCase() : undefined,\n } as CreateDiscountInput)\n },\n\n async update(id: string, data: Partial<Discount>): Promise<Discount> {\n // timesUsed is incremented by shop_place_order inside the order transaction.\n const { timesUsed: _used, ...patch } = data\n if (patch.code !== undefined) {\n patch.code = patch.code ? String(patch.code).trim().toUpperCase() : null\n }\n return resolve(provider).updateDiscount(id, patch as UpdateDiscountInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteDiscount(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateShippingZoneInput, ShippingZone, UpdateShippingZoneInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/**\n * Delivery zones CRUD.\n *\n * The form takes CEPs however the merchant types them ('22.041-001', '22041001')\n * and the provider normalises to the 8 bare digits shipping_zones compares on —\n * asking a shop owner to strip punctuation is how a range silently stops\n * matching and a whole city stops being served.\n */\nexport function createShopShippingZoneDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<ShippingZone> {\n const shop = () => {\n const p = resolve(provider)\n if (!p.listShippingZones) {\n throw new Error('Este provider de loja não suporta zonas de entrega.')\n }\n return p\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<ShippingZone>> {\n const rows = await shop().listShippingZones!()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((z) =>\n z.name.toLowerCase().includes(term) || (z.carrier ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<ShippingZone> {\n return shop().createShippingZone!(data as unknown as CreateShippingZoneInput)\n },\n\n async update(id: string, data: Partial<ShippingZone>): Promise<ShippingZone> {\n // tenantId is set from the session on the server side; never from the form.\n const { id: _id, tenantId: _tenant, ...patch } = data\n return shop().updateShippingZone!(id, patch as UpdateShippingZoneInput)\n },\n\n async remove(id: string): Promise<void> {\n await shop().deleteShippingZone!(id)\n },\n }\n}\n","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, getShopProvider } from '@fayz-ai/shop'\nimport { useOrganizationStore, createCrudPage, registerEntityPath } from '@fayz-ai/saas'\nimport { buildShopProductEntity } from './views/productEntity'\nimport { buildShopCustomerEntity } from './views/customerEntity'\nimport { buildShopDiscountEntity } from './views/discountEntity'\nimport { buildShopShippingZoneEntity } from './views/shippingZoneEntity'\nimport { createShopProductDataProvider } from './data/productDataProvider'\nimport { createShopCustomerDataProvider } from './data/customerDataProvider'\nimport { createShopDiscountDataProvider } from './data/discountDataProvider'\nimport { createShopShippingZoneDataProvider } from './data/shippingZoneDataProvider'\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 /** Override the accordion child labels (Produtos / Pedidos / Clientes / Descontos). */\n sectionLabels?: Partial<Record<'products' | 'orders' | 'customers' | 'discounts' | 'shipping', 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 // Teach the shared person-path registry where a SHOP customer lives. The\n // built-in map ships veterinary defaults (customer → /registry/tutors), so\n // without this PersonLink would resolve a shop customer to the wrong module.\n registerEntityPath('shop_customer', '/shop/customers')\n\n type ShopSection = 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n\n // One component per section so each gets its own route. The shell nests any\n // entry whose route is a sub-path of another (same rule the courses modules\n // use), so /shop/products … /shop/discounts render as an accordion under\n // \"Loja\" instead of one link with everything hidden behind tabs.\n const pageFor = (section?: ShopSection): React.ComponentType<unknown> => {\n const Wrapped: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(\n ShopPage as React.ComponentType<{ provider?: ShopProviderResolver; section?: ShopSection }>,\n { provider: options?.provider, section },\n )\n )\n Wrapped.displayName = section ? `ShopPage:${section}` : 'ShopPageWrapper'\n return Wrapped\n }\n\n // Products, customers and discounts all get the full generic CRUD (list +\n // form + detail + delete) from their EntityDef, rather than three bespoke\n // read-only tables. Orders stay on the custom page: an order is not a CRUD\n // record — it needs fulfilment, refunds and a line-item view, which is its\n // own screen.\n const resolveProvider = () =>\n typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider()\n\n const ProductsCrudPage = createCrudPage(buildShopProductEntity(curr.code, resolveProvider), {\n dataProvider: createShopProductDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const CustomersCrudPage = createCrudPage(buildShopCustomerEntity(), {\n dataProvider: createShopCustomerDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const DiscountsCrudPage = createCrudPage(buildShopDiscountEntity(), {\n dataProvider: createShopDiscountDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const ShippingZonesCrudPage = createCrudPage(buildShopShippingZoneEntity(curr.code), {\n dataProvider: createShopShippingZoneDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const CRUD_PAGES: Partial<Record<ShopSection, React.ComponentType<unknown>>> = {\n products: ProductsCrudPage as React.ComponentType<unknown>,\n customers: CustomersCrudPage as React.ComponentType<unknown>,\n discounts: DiscountsCrudPage as React.ComponentType<unknown>,\n shipping: ShippingZonesCrudPage as React.ComponentType<unknown>,\n }\n\n const SECTIONS: Array<{ id: ShopSection; label: string; icon: string }> = [\n { id: 'products', label: options?.sectionLabels?.products ?? 'Produtos', icon: 'Package' },\n { id: 'orders', label: options?.sectionLabels?.orders ?? 'Pedidos', icon: 'ShoppingCart' },\n { id: 'customers', label: options?.sectionLabels?.customers ?? 'Clientes', icon: 'Users' },\n { id: 'discounts', label: options?.sectionLabels?.discounts ?? 'Descontos', icon: 'Tag' },\n { id: 'shipping', label: options?.sectionLabels?.shipping ?? 'Entrega', icon: 'Truck' },\n ]\n\n const navSection = options?.navSection ?? 'main'\n const navPosition = options?.navPosition ?? 6\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 // Storefront/commerce-operator-console surface — targets the ecommerce\n // Panel world, not a saas admin app.\n scaffolds: ['ecommerce'],\n defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: navSection,\n position: navPosition,\n label: options?.navLabel ?? 'Shop',\n route: '/shop',\n icon: 'ShoppingBag',\n permission: { feature: 'shop', action: 'read' as const },\n // \"Loja\" and \"Produtos\" are the same screen — don't list both.\n indexChild: false,\n },\n ...SECTIONS.map((s, i) => ({\n section: navSection,\n position: navPosition + i + 1,\n label: s.label,\n route: `/shop/${s.id}`,\n icon: s.icon,\n permission: { feature: 'shop', action: 'read' as const },\n })),\n ],\n routes: [\n {\n // Kept so existing links to /shop still resolve; renders the tabbed page.\n path: '/shop',\n component: pageFor(),\n permission: { feature: 'shop', action: 'read' as const },\n },\n ...SECTIONS.map((s) => ({\n path: `/shop/${s.id}`,\n component: CRUD_PAGES[s.id] ?? pageFor(s.id),\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
|
+
{"version":3,"sources":["../src/views/ProductImagesTab.tsx","../src/views/productEntity.tsx","../src/views/customerEntity.tsx","../src/views/discountEntity.tsx","../src/views/shippingZoneEntity.tsx","../src/data/shared.ts","../src/data/productDataProvider.ts","../src/data/customerDataProvider.ts","../src/data/discountDataProvider.ts","../src/data/shippingZoneDataProvider.ts","../src/components/ShopSettings.tsx","../src/views/ChannelsPage.tsx","../src/index.ts"],"names":["update","jsxs","jsx","money","STATUS_TONE","React","resolve","getShopProvider"],"mappings":"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","file":"index.js","sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\nimport type { Product, ProductImage, ShopProvider } from '@fayz-ai/shop'\n\n/**\n * The product's whole gallery, not just its cover.\n *\n * plg_shop_product_images has always been a collection — sort_order, is_primary\n * — but the admin only ever exposed the single `EntityImageConfig` slot on the\n * form, so a merchant could set one photo and no more, and the storefront had\n * nothing to build a carousel from. This is the missing half.\n *\n * Deliberately not drag-and-drop: ordering is done with arrows because a\n * keyboard and a screen reader can use them, and because reordering four\n * photos of a rib is not worth a drag library.\n */\nexport function ProductImagesTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const [images, setImages] = useState<ProductImage[]>([])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const fileRef = useRef<HTMLInputElement>(null)\n\n async function reload() {\n const fresh = await getProvider().getProduct(product.id)\n setImages(sortImages(fresh?.images ?? []))\n }\n\n useEffect(() => { void reload().catch(() => {}) }, [product.id])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(false)\n }\n }\n\n async function upload(files: FileList | null) {\n if (!files?.length) return\n // Sequential, not Promise.all: each upload reads the current max sort_order\n // to place itself last, and running them together makes them all read the\n // same value and land on the same position.\n await run(async () => {\n for (const file of Array.from(files)) {\n await getProvider().uploadProductImage(product.id, file)\n }\n if (fileRef.current) fileRef.current.value = ''\n })\n }\n\n function move(index: number, delta: number) {\n const target = index + delta\n if (target < 0 || target >= images.length) return\n const a = images[index]!\n const b = images[target]!\n // Swap the two positions rather than renumbering the list: fewer writes, and\n // a failure halfway leaves an order that is still coherent.\n void run(async () => {\n const update = getProvider().updateProductImage\n if (!update) throw new Error('Este provider não suporta reordenar imagens.')\n await update(a.id, { sortOrder: b.sortOrder ?? target })\n await update(b.id, { sortOrder: a.sortOrder ?? index })\n })\n }\n\n const update = getProvider().updateProductImage\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Fotos do produto</h3>\n <p className=\"text-xs text-muted-foreground\">\n A primeira foto é a capa — aparece no catálogo, no carrinho e no pedido.\n As demais viram o carrossel na página do produto.\n </p>\n </div>\n <label className=\"inline-flex cursor-pointer items-center rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground transition hover:opacity-90\">\n {busy ? 'Enviando…' : 'Adicionar fotos'}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n disabled={busy}\n className=\"hidden\"\n onChange={(event) => void upload(event.target.files)}\n />\n </label>\n </div>\n\n {error && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">{error}</p>\n )}\n\n {images.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-10 text-center text-sm text-muted-foreground\">\n Nenhuma foto ainda. Produtos com mais de uma foto vendem melhor — mostre a\n embalagem, o produto pronto e uma referência de tamanho.\n </p>\n ) : (\n <ul className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4\">\n {images.map((image, index) => (\n <li key={image.id} className=\"overflow-hidden rounded-lg border\">\n <div className=\"relative aspect-square bg-muted\">\n <img src={image.url} alt={image.altText ?? ''} className=\"h-full w-full object-cover\" />\n {image.isPrimary && (\n <span className=\"absolute left-2 top-2 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </div>\n <div className=\"flex items-center justify-between gap-1 px-2 py-1.5\">\n <div className=\"flex gap-1\">\n <IconButton label=\"Mover para trás\" disabled={busy || index === 0}\n onClick={() => move(index, -1)}>←</IconButton>\n <IconButton label=\"Mover para frente\" disabled={busy || index === images.length - 1}\n onClick={() => move(index, 1)}>→</IconButton>\n </div>\n <div className=\"flex gap-1\">\n {!image.isPrimary && update && (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => update(image.id, { isPrimary: true }))}\n className=\"rounded px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n Usar como capa\n </button>\n )}\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => getProvider().deleteProductImage(image.id))}\n className=\"rounded px-1.5 py-0.5 text-xs text-red-600 hover:bg-red-50 disabled:opacity-50\"\n >\n Excluir\n </button>\n </div>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </button>\n )\n}\n\n/** Cover first, then the merchant's order — the same rule the storefront uses. */\nfunction sortImages(images: ProductImage[]): ProductImage[] {\n return [...images].sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0)\n })\n}\n","import React from 'react'\nimport type { EntityDef, EntityImageConfig, FieldDef } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\nimport { ProductImagesTab } from './ProductImagesTab'\n\n// ---------------------------------------------------------------------------\n// Storefront Product — the single source of truth for the shop product CRUD.\n// Drives the list columns AND the form sections via the generic CRUD scaffolding\n// (createCrudPage → CrudListView + CrudFormPage), same pattern plugin-inventory\n// uses for its ERP product.\n//\n// This is deliberately the STOREFRONT shape (what a shopper sees: name, price,\n// compare-at, images, publication status), not the ERP shape plugin-inventory\n// models (cost, margin, min/max levels). They are different products in\n// different tables — see the shop/inventory bridge note in the roadmap.\n//\n// Not modelled here because the schema has nowhere to put them yet:\n// • variants (options/SKU/stock per variant) — needs plg_shop_variants\n// • SEO title/description — needs columns on plg_shop_products\n// • multi-category — the column is a single category_id\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: 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}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo',\n draft: 'Rascunho',\n archived: 'Arquivado',\n}\n\nfunction money(value: unknown, currency = 'BRL') {\n const n = Number(value)\n if (!Number.isFinite(n)) return '—'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(n)\n}\n\n/** `name` → `name-do-produto`, so the storefront URL is filled in for you. */\nexport function slugify(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/**\n * Wires the form's image slot to the product's own images. `uploadProductImage`\n * has existed on the provider all along with nothing calling it — the slot was a\n * decorative square, so a product with a photo still showed an empty placeholder.\n */\nfunction productImage(getProvider: () => ShopProvider): EntityImageConfig {\n return {\n get: (row) => {\n const images = (row as Partial<Product>).images\n return images?.find((i) => i.isPrimary)?.url ?? images?.[0]?.url\n },\n upload: async (file, row) => {\n if (!row.id) throw new Error('Salve o produto antes de enviar a imagem.')\n const image = await getProvider().uploadProductImage(row.id, file)\n return image.url\n },\n accept: 'image/*',\n }\n}\n\nexport function buildShopProductEntity(\n currencyCode = 'BRL',\n getProvider?: () => ShopProvider,\n): EntityDef<Product> {\n const fields: FieldDef[] = [\n // — Geral —\n {\n key: 'name', label: 'Nome do produto', type: 'text', required: true,\n group: 'general', placeholder: 'Costela Bovina Defumada 400g',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"flex items-center gap-3\">\n {row.images?.[0]?.url && (\n <img\n src={row.images[0].url}\n alt=\"\"\n className=\"h-9 w-9 rounded object-cover\"\n loading=\"lazy\"\n />\n )}\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.name}</p>\n {row.sku && <p className=\"text-xs text-muted-foreground\">{row.sku}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'slug', label: 'URL', type: 'text', group: 'general',\n placeholder: 'gerado a partir do nome',\n hint: 'Endereço do produto na loja. Deixe em branco para gerar automaticamente.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'general', span: 2,\n placeholder: 'Como é feito, como preparar, o que acompanha…',\n showInTable: false,\n },\n\n // — Preço —\n {\n key: 'price', label: 'Preço de venda', type: 'currency', required: true,\n group: 'pricing', currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n showInTable: true, sortable: true,\n renderCell: (v, row: any) => (\n <div className=\"text-right\">\n <span className=\"font-medium\">{money(v, row.currency)}</span>\n {row.compareAtPrice > row.price && (\n <span className=\"ml-2 text-xs text-muted-foreground line-through\">\n {money(row.compareAtPrice, row.currency)}\n </span>\n )}\n </div>\n ),\n },\n {\n key: 'compareAtPrice', label: 'Preço comparativo', type: 'currency', group: 'pricing',\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Preço \"de\" riscado. Deixe vazio se não estiver em promoção.',\n showInTable: false,\n },\n {\n key: 'discount', label: 'Desconto', type: 'computed', group: 'pricing', showInTable: false,\n compute: (vals) => {\n const price = Number(vals.price) || 0\n const compare = Number(vals.compareAtPrice) || 0\n if (compare <= 0 || price <= 0 || compare <= price) return null\n const pct = ((compare - price) / compare) * 100\n return { display: `-${pct.toFixed(0)}%`, tone: 'positive' }\n },\n },\n\n // — Estoque —\n {\n key: 'sku', label: 'SKU', type: 'text', group: 'inventory',\n placeholder: 'ART-001', searchable: true, showInTable: false,\n },\n {\n key: 'inventoryCount', label: 'Estoque', type: 'number', group: 'inventory', min: 0,\n placeholder: '0', hint: 'Chega a zero e o produto aparece como esgotado na loja.',\n showInTable: true, sortable: true,\n renderCell: (v) => {\n const n = Number(v) || 0\n return (\n <span className={`block text-right ${n === 0 ? 'font-medium text-destructive' : n <= 3 ? 'text-orange-600' : ''}`}>\n {n}\n </span>\n )\n },\n },\n\n // — Publicação —\n {\n key: 'status', label: 'Status', type: 'segmented', required: true,\n group: 'publishing', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Só você vê. Não aparece na loja.' },\n { label: 'Ativo', value: 'active', description: 'Publicado e à venda.' },\n { label: 'Arquivado', value: 'archived', description: 'Fora da loja, histórico preservado.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n {\n key: 'sortOrder', label: 'Ordem na vitrine', type: 'number', group: 'publishing',\n placeholder: '0', hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — Envio —\n {\n key: 'isPhysical', label: 'Produto físico', type: 'boolean', group: 'shipping',\n hint: 'Desmarque para itens digitais, que não calculam frete.', showInTable: false,\n },\n { key: 'weight', label: 'Peso', type: 'number', group: 'shipping', min: 0, placeholder: '0.4', showInTable: false },\n {\n key: 'weightUnit', label: 'Unidade', type: 'select', group: 'shipping', showInTable: false,\n options: [{ label: 'kg', value: 'kg' }, { label: 'g', value: 'g' }, { label: 'lb', value: 'lb' }],\n },\n ]\n\n return {\n name: 'Produto',\n namePlural: 'Produtos',\n icon: 'Package',\n displayField: 'name',\n fields,\n fieldGroups: [\n // imageSlot renders the scaffolding's image uploader alongside the group.\n { id: 'general', label: 'Informações', columns: 2, imageSlot: true },\n { id: 'pricing', label: 'Preço', description: 'O preço comparativo vira o \"de\" riscado na vitrine.', columns: 3 },\n { id: 'inventory', label: 'Estoque', columns: 2 },\n { id: 'publishing', label: 'Publicação', description: 'Controla se o produto aparece na loja.', columns: 2 },\n { id: 'shipping', label: 'Envio', columns: 3 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n image: getProvider ? productImage(getProvider) : undefined,\n // The form's image slot sets the COVER; this tab manages the rest of the\n // gallery. plg_shop_product_images has always held a collection, and until\n // now nothing in the admin could add a second row to it — so the storefront\n // carousel had exactly one slide for every product in the pool.\n detailTabs: getProvider\n ? [{\n id: 'images',\n label: 'Fotos',\n icon: 'Image',\n component: ProductImagesTab as never,\n props: { getProvider },\n }]\n : undefined,\n } as EntityDef<Product>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { ShopCustomer } from '@fayz-ai/shop'\nimport { ClientOrdersTab, createClientOrdersProvider, adminNavigateTo } from '@fayz-ai/saas'\nimport type { ClientDocument } from '@fayz-ai/saas'\n\n// ---------------------------------------------------------------------------\n// Shop customer — same declarative contract as the product entity, so the list\n// and the form both come from createCrudPage instead of a hand-rolled table.\n//\n// ordersCount / totalSpent are read-only: they are maintained server-side by the\n// shop_refresh_customer_stats trigger on every order insert/update/delete, so\n// putting them in the form would offer an edit the database would overwrite.\n// ---------------------------------------------------------------------------\n\nfunction money(value: unknown) {\n const n = Number(value)\n if (!Number.isFinite(n)) return 'R$ 0,00'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(n)\n}\n\nexport function buildShopCustomerEntity(): EntityDef<ShopCustomer> {\n const fields: FieldDef[] = [\n // — Contato —\n {\n key: 'firstName', label: 'Nome', type: 'text', required: true,\n group: 'contact', placeholder: 'Maria', searchable: true,\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{[row.firstName, row.lastName].filter(Boolean).join(' ')}</p>\n {row.email && <p className=\"truncate text-xs text-muted-foreground\">{row.email}</p>}\n </div>\n ),\n },\n { key: 'lastName', label: 'Sobrenome', type: 'text', group: 'contact', placeholder: 'Silva', searchable: true, showInTable: false },\n {\n key: 'email', label: 'E-mail', type: 'text', group: 'contact',\n placeholder: 'maria@exemplo.com', searchable: true,\n hint: 'É por ele que o pedido é vinculado ao cliente no checkout.',\n showInTable: false,\n },\n {\n key: 'phone', label: 'Telefone', type: 'text', group: 'contact',\n placeholder: '(21) 99999-0000', searchable: true,\n showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{(v as string) || '—'}</span>,\n },\n\n // — Histórico (somente leitura) —\n {\n key: 'ordersCount', label: 'Pedidos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right\">{Number(v) || 0}</span>,\n },\n {\n key: 'totalSpent', label: 'Total gasto', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n\n // — Interno —\n {\n key: 'notes', label: 'Observações', type: 'textarea', group: 'internal', span: 2,\n placeholder: 'Preferências, restrições, combinados de entrega…',\n hint: 'Visível só no admin. O cliente nunca vê.',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Cliente',\n namePlural: 'Clientes',\n icon: 'Users',\n displayField: 'firstName',\n // `person` layout brings the shared archetype tabs — including Endereços,\n // which reads the core addresses table and therefore works in every app.\n layout: 'person',\n // Without archetypeKind the shell shows every person tab, including the\n // staff-only Agenda (its visibleFor filter only runs when a kind is set).\n data: { table: 'plg_shop_customers', archetypeKind: 'customer' },\n fields,\n // The SAME tab and the SAME provider beauty-saas uses. Since the shop's\n // orders now live in public.orders with party_id set, the canonical provider\n // already returns them — a shop-specific adapter would be a second\n // implementation of \"list this person's orders\", which is how two apps end\n // up with two different answers to the same question.\n detailTabs: [{\n id: 'orders',\n label: 'Pedidos',\n icon: 'ShoppingBag',\n aliases: ['appointments', 'quotes'],\n component: ClientOrdersTab as never,\n props: {\n provider: createClientOrdersProvider(),\n currency: { code: 'BRL', locale: 'pt-BR' },\n // The one part that legitimately differs per app: where a document\n // leads. Beauty sends a booking to the agenda and an invoice to\n // receivables; a shop order goes to the order screen.\n navigator: {\n onNavigate: (doc: ClientDocument) => adminNavigateTo(`/shop/orders/${doc.id}`),\n },\n },\n }],\n fieldGroups: [\n { id: 'contact', label: 'Contato', columns: 2 },\n { id: 'internal', label: 'Notas internas', columns: 1 },\n ],\n } as EntityDef<ShopCustomer>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Discount } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Discount — declarative CRUD, same contract as products and customers.\n//\n// `timesUsed` is read-only: shop_place_order increments it inside the same\n// transaction that validates the coupon, so the admin must never write it.\n//\n// `buy_x_get_y` is deliberately absent from the type options: the enum value\n// exists in the database but shop_place_order records the code and applies no\n// monetary effect (0003:116), so offering it would create coupons that silently\n// do nothing.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nexport function buildShopDiscountEntity(): EntityDef<Discount> {\n const fields: FieldDef[] = [\n // — Cupom —\n {\n key: 'title', label: 'Nome interno', type: 'text', required: true,\n group: 'coupon', placeholder: 'Bem-vindo 10%',\n hint: 'Só o admin vê. Serve para você identificar a campanha.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.title}</p>\n {row.code && <p className=\"font-mono text-xs text-muted-foreground\">{row.code}</p>}\n </div>\n ),\n },\n {\n key: 'code', label: 'Código', type: 'text', group: 'coupon',\n placeholder: 'ARTORIUS10',\n hint: 'O que o cliente digita no carrinho. Maiúsculas e minúsculas não importam.',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'type', label: 'Tipo', type: 'segmented', required: true, group: 'rule', span: 2,\n options: [\n { label: 'Percentual', value: 'percentage', description: 'Desconta uma % do subtotal.' },\n { label: 'Valor fixo', value: 'fixed_amount', description: 'Desconta um valor em reais.' },\n { label: 'Frete grátis', value: 'free_shipping', description: 'Zera o frete do pedido.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const labels: Record<string, string> = {\n percentage: 'Percentual', fixed_amount: 'Valor fixo', free_shipping: 'Frete grátis', buy_x_get_y: 'Leve X pague Y',\n }\n return <span className=\"text-muted-foreground\">{labels[String(v)] ?? String(v)}</span>\n },\n },\n {\n key: 'value', label: 'Valor', type: 'number', group: 'rule', min: 0,\n placeholder: '10',\n hint: 'Percentual: 10 = 10%. Valor fixo: 10 = R$ 10,00. Frete grátis ignora este campo.',\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right font-medium\">\n {row.type === 'percentage'\n ? `${row.value}%`\n : row.type === 'free_shipping'\n ? '—'\n : new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(row.value) || 0)}\n </span>\n ),\n },\n\n // — Limites —\n {\n key: 'minSubtotal', label: 'Pedido mínimo', type: 'currency', group: 'limits', min: 0,\n currency: 'BRL', currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo',\n hint: 'Valor mínimo do pedido para o cupom valer. Deixe vazio para não exigir mínimo.',\n showInTable: false,\n },\n {\n key: 'usageLimit', label: 'Limite de usos', type: 'number', group: 'limits', min: 0,\n placeholder: 'sem limite', hint: 'Deixe vazio para uso ilimitado.', showInTable: false,\n },\n {\n key: 'oncePerCustomer', label: 'Uma vez por cliente', type: 'boolean', group: 'limits',\n hint: 'Só vale para quem se identifica no checkout — compra como visitante não é rastreada.',\n showInTable: false,\n },\n {\n key: 'timesUsed', label: 'Usos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right text-muted-foreground\">\n {row.timesUsed}{row.usageLimit ? ` / ${row.usageLimit}` : ''}\n </span>\n ),\n },\n\n // — Vigência —\n { key: 'startsAt', label: 'Início', type: 'date', group: 'schedule', showInTable: false },\n {\n key: 'endsAt', label: 'Fim', type: 'date', group: 'schedule',\n hint: 'Vazio = sem data de expiração.', showInTable: false,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', required: true, group: 'schedule', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Não aceito no carrinho.' },\n { label: 'Ativo', value: 'active', description: 'Valendo agora.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o histórico.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {s}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Desconto',\n namePlural: 'Descontos',\n icon: 'Tag',\n displayField: 'title',\n fields,\n fieldGroups: [\n { id: 'coupon', label: 'Cupom', columns: 2 },\n { id: 'rule', label: 'Regra', description: 'O desconto é recalculado no servidor a cada pedido.', columns: 2 },\n { id: 'limits', label: 'Limites de uso', columns: 2 },\n { id: 'schedule', label: 'Vigência', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n } as EntityDef<Discount>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { ShippingZone } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Delivery zone — declarative CRUD, same contract as products and discounts.\n//\n// A zone is a range of postal codes with its own price and estimate. Ranges may\n// overlap on purpose: the cheapest match wins, which is how a merchant layers a\n// promotion over a broader zone without deleting the broader one.\n//\n// The two things worth being loud about in the UI:\n// · a store with NO zones keeps charging its flat rate — zones are opt-in;\n// · once the first zone exists, an address outside every zone can no longer\n// order (shop_place_order refuses it), so the first save changes who can buy.\n// ---------------------------------------------------------------------------\n\nconst cep = (value: string | undefined): string => {\n const digits = String(value ?? '').replace(/\\D/g, '').padStart(8, '0')\n return `${digits.slice(0, 5)}-${digits.slice(5)}`\n}\n\nexport function buildShopShippingZoneEntity(currency = 'BRL'): EntityDef<ShippingZone> {\n const money = (value: number | null | undefined) =>\n value == null\n ? '—'\n : new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(Number(value))\n\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome da zona', type: 'text', required: true, group: 'zone',\n placeholder: 'Rio de Janeiro — capital',\n hint: 'Aparece para o cliente na hora de escolher a entrega.',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'carrier', label: 'Transportadora', type: 'text', group: 'zone',\n placeholder: 'Correios, motoboy próprio…',\n hint: 'Opcional. Mostrado antes do nome da zona quando preenchido.',\n showInTable: true,\n },\n {\n key: 'postalFrom', label: 'CEP inicial', type: 'text', required: true, group: 'zone',\n placeholder: '20000-000',\n hint: 'Início da faixa. Pode digitar com ou sem traço.',\n showInTable: true,\n renderCell: (_v, row: any) => (\n <span className=\"whitespace-nowrap font-mono text-xs\">\n {cep(row.postalFrom)} → {cep(row.postalTo)}\n </span>\n ),\n },\n {\n key: 'postalTo', label: 'CEP final', type: 'text', required: true, group: 'zone',\n placeholder: '23799-999',\n hint: 'Fim da faixa, inclusive.',\n showInTable: false,\n },\n {\n key: 'rate', label: 'Valor do frete', type: 'number', required: true, group: 'pricing',\n hint: 'Cobrado nos pedidos entregues nessa faixa.',\n showInTable: true, sortable: true,\n renderCell: (value: any) => <span className=\"tabular-nums\">{money(value)}</span>,\n },\n {\n key: 'freeAbove', label: 'Frete grátis acima de', type: 'number', group: 'pricing',\n hint: 'Deixe vazio para nunca dar frete grátis nessa zona. Vale mais que a regra geral da loja.',\n showInTable: true,\n renderCell: (value: any) => <span className=\"tabular-nums\">{money(value)}</span>,\n },\n {\n key: 'etaMinDays', label: 'Prazo mínimo (dias)', type: 'number', group: 'delivery',\n hint: '0 = no mesmo dia.',\n showInTable: false,\n },\n {\n key: 'etaMaxDays', label: 'Prazo máximo (dias)', type: 'number', group: 'delivery',\n hint: 'O cliente vê a faixa \"de X a Y dias úteis\" na página do produto.',\n showInTable: true,\n renderCell: (_v, row: any) =>\n row.etaMinDays == null && row.etaMaxDays == null\n ? <span className=\"text-muted-foreground\">—</span>\n : <span>{row.etaMinDays ?? 0}–{row.etaMaxDays ?? row.etaMinDays} dias</span>,\n },\n {\n key: 'active', label: 'Ativa', type: 'boolean', group: 'delivery',\n hint: 'Desativar para de cotar essa faixa sem apagar a configuração.',\n showInTable: true,\n renderCell: (value: any) => (\n <span className={`rounded-full px-2 py-0.5 text-xs font-medium ${\n value ? 'bg-emerald-100 text-emerald-800' : 'bg-gray-100 text-gray-700'}`}>\n {value ? 'Ativa' : 'Inativa'}\n </span>\n ),\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'delivery',\n hint: 'Desempate quando duas zonas custam o mesmo. Menor aparece primeiro.',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Zona de entrega',\n namePlural: 'Entrega',\n icon: 'Truck',\n displayField: 'name',\n fields,\n fieldGroups: [\n {\n id: 'zone', label: 'Faixa de CEP', columns: 2,\n description:\n 'Faixas podem se sobrepor: quando duas cobrem o mesmo CEP, o cliente paga a mais barata.',\n },\n {\n id: 'pricing', label: 'Preço', columns: 2,\n description: 'O frete cobrado é recalculado no servidor a cada pedido, a partir daqui.',\n },\n { id: 'delivery', label: 'Prazo e status', columns: 2 },\n ],\n facets: [{ field: 'active', allLabel: 'Todas' }],\n } as EntityDef<ShippingZone>\n}\n","import type { CrudQuery, CrudResult } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop'\n\nexport type ShopProviderResolver = ShopProvider | (() => ShopProvider)\n\nexport const resolve = (p: ShopProviderResolver): ShopProvider => (typeof p === 'function' ? p() : p)\n\n/**\n * Paging, sorting and facet filtering applied client-side: the shop provider's\n * list methods take a search term but no offset, sort or filter parameters.\n * Fine at storefront catalogue sizes; revisit if a tenant grows past a few\n * thousand rows, where it should move into the query.\n */\nexport function applyQuery<T>(\n rows: T[],\n query: CrudQuery,\n facetKey?: keyof T & string,\n): CrudResult<T> {\n const prop = (row: T, key: string): unknown => (row as Record<string, unknown>)[key]\n let data = rows\n\n if (facetKey) {\n const wanted = query.filters?.[facetKey]\n if (wanted && wanted !== 'all') data = data.filter((row) => prop(row, facetKey) === wanted)\n }\n\n if (query.sortBy) {\n const dir = query.sortDir === 'desc' ? -1 : 1\n const key = query.sortBy\n data = [...data].sort((a, b) => {\n const av = prop(a, key)\n const bv = prop(b, key)\n if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * dir\n return String(av ?? '').localeCompare(String(bv ?? ''), 'pt-BR') * dir\n })\n }\n\n const total = data.length\n const page = query.page ?? 1\n const size = query.pageSize ?? total\n return { data: data.slice((page - 1) * size, page * size), total }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateProductInput, Product, UpdateProductInput } from '@fayz-ai/shop'\nimport { slugify } from '../views/productEntity'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport type { ShopProviderResolver }\n\n// ---------------------------------------------------------------------------\n// Bridges the generic CRUD scaffolding (DataProvider) to the shop provider, so\n// the product screens are the same createCrudPage machinery every other module\n// uses instead of a bespoke form.\n//\n// Which shop provider is injected decides whether writes work at all:\n// • createSupabaseShopProvider — authenticates as the merchant (their JWT),\n// full CRUD, subject to the tenant-member RLS policies.\n// • createFayzShopProvider — the storefront's anonymous REST client. Reads\n// work; every write throws FayzShopError 501 by design. The form surfaces\n// that message rather than pretending the save succeeded.\n// ---------------------------------------------------------------------------\n\nexport function createShopProductDataProvider(provider: ShopProviderResolver): DataProvider<Product> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Product>> {\n const rows = await resolve(provider).listProducts(\n query.search ? { search: query.search } : undefined,\n )\n return applyQuery(rows, query, 'status')\n },\n\n async create(data): Promise<Product> {\n const input = data as unknown as Partial<Product>\n // The storefront URL is required by the table's UNIQUE(tenant_id, slug);\n // deriving it from the name keeps the merchant from having to know that.\n const slug = input.slug?.trim() || slugify(String(input.name ?? ''))\n return resolve(provider).createProduct({\n ...(input as CreateProductInput),\n slug,\n } as CreateProductInput)\n },\n\n async update(id: string, data: Partial<Product>): Promise<Product> {\n const patch = { ...data }\n if (patch.slug !== undefined && !String(patch.slug).trim()) {\n // Cleared on purpose → regenerate rather than write an empty slug.\n patch.slug = slugify(String(patch.name ?? ''))\n }\n return resolve(provider).updateProduct(id, patch as UpdateProductInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteProduct(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateCustomerInput, ShopCustomer, UpdateCustomerInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopCustomerDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<ShopCustomer> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<ShopCustomer>> {\n const rows = await resolve(provider).listCustomers(\n query.search ? { search: query.search } : undefined,\n )\n return applyQuery(rows, query)\n },\n\n async create(data): Promise<ShopCustomer> {\n return resolve(provider).createCustomer(data as unknown as CreateCustomerInput)\n },\n\n async update(id: string, data: Partial<ShopCustomer>): Promise<ShopCustomer> {\n // ordersCount / totalSpent are trigger-maintained (shop_refresh_customer_stats);\n // never send them back or a stale form value would fight the database.\n const { ordersCount: _o, totalSpent: _t, ...patch } = data\n return resolve(provider).updateCustomer(id, patch as UpdateCustomerInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteCustomer(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateDiscountInput, Discount, UpdateDiscountInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopDiscountDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Discount> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Discount>> {\n const rows = await resolve(provider).listDiscounts()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((d) =>\n d.title.toLowerCase().includes(term) || (d.code ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<Discount> {\n const input = data as unknown as Partial<Discount>\n return resolve(provider).createDiscount({\n ...(input as CreateDiscountInput),\n // Codes are matched case-insensitively server-side; store them upper so\n // the admin list reads consistently.\n code: input.code ? String(input.code).trim().toUpperCase() : undefined,\n } as CreateDiscountInput)\n },\n\n async update(id: string, data: Partial<Discount>): Promise<Discount> {\n // timesUsed is incremented by shop_place_order inside the order transaction.\n const { timesUsed: _used, ...patch } = data\n if (patch.code !== undefined) {\n patch.code = patch.code ? String(patch.code).trim().toUpperCase() : null\n }\n return resolve(provider).updateDiscount(id, patch as UpdateDiscountInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteDiscount(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateShippingZoneInput, ShippingZone, UpdateShippingZoneInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/**\n * Delivery zones CRUD.\n *\n * The form takes CEPs however the merchant types them ('22.041-001', '22041001')\n * and the provider normalises to the 8 bare digits shipping_zones compares on —\n * asking a shop owner to strip punctuation is how a range silently stops\n * matching and a whole city stops being served.\n */\nexport function createShopShippingZoneDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<ShippingZone> {\n const shop = () => {\n const p = resolve(provider)\n if (!p.listShippingZones) {\n throw new Error('Este provider de loja não suporta zonas de entrega.')\n }\n return p\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<ShippingZone>> {\n const rows = await shop().listShippingZones!()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((z) =>\n z.name.toLowerCase().includes(term) || (z.carrier ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<ShippingZone> {\n return shop().createShippingZone!(data as unknown as CreateShippingZoneInput)\n },\n\n async update(id: string, data: Partial<ShippingZone>): Promise<ShippingZone> {\n // tenantId is set from the session on the server side; never from the form.\n const { id: _id, tenantId: _tenant, ...patch } = data\n return shop().updateShippingZone!(id, patch as UpdateShippingZoneInput)\n },\n\n async remove(id: string): Promise<void> {\n await shop().deleteShippingZone!(id)\n },\n }\n}\n","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 { Globe, MessageCircle, Camera, Music, ShoppingBag, MapPin, Link2, Plus, ExternalLink, Trash2, Check, X } from 'lucide-react'\nimport { Button, Input } from '@fayz-ai/ui'\nimport type { ShopProvider, SalesChannel, SalesChannelKind } from '@fayz-ai/shop'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../ShopPage'\n\n// ---------------------------------------------------------------------------\n// Canais de venda — the store's points of sale, Shopify-style. The online_store\n// channel points at the merchant's fayz storefront; the rest are external links\n// the merchant maintains (WhatsApp, Instagram, TikTok Shop…). Every enabled\n// channel with a URL also surfaces as an external link in the left menu (see\n// the \"Canais de venda\" nav group), so this page is where they are configured.\n// ---------------------------------------------------------------------------\n\ninterface KindMeta {\n label: string\n icon: React.ComponentType<{ className?: string }>\n hint: string\n placeholder: string\n}\n\nconst KIND_META: Record<SalesChannelKind, KindMeta> = {\n online_store: { label: 'Loja Online', icon: Globe, hint: 'Seu storefront fayz — a vitrine pública da loja.', placeholder: 'https://minhaloja.com.br/' },\n whatsapp: { label: 'WhatsApp', icon: MessageCircle, hint: 'Link direto para o WhatsApp Business.', placeholder: 'https://wa.me/5521999999999' },\n instagram: { label: 'Instagram', icon: Camera, hint: 'Perfil ou loja no Instagram.', placeholder: 'https://instagram.com/sualoja' },\n tiktok_shop: { label: 'TikTok Shop', icon: Music, hint: 'Sua vitrine no TikTok Shop.', placeholder: 'https://shop.tiktok.com/@sualoja' },\n marketplace: { label: 'Marketplace', icon: ShoppingBag, hint: 'Mercado Livre, Amazon, Shopee…', placeholder: 'https://…' },\n physical: { label: 'Loja Física', icon: MapPin, hint: 'Endereço ou ponto de venda físico.', placeholder: 'https://maps.google.com/…' },\n custom: { label: 'Outro canal', icon: Link2, hint: 'Qualquer outro ponto de venda com um link.', placeholder: 'https://…' },\n}\n\nconst ADDABLE_KINDS: SalesChannelKind[] = ['whatsapp', 'instagram', 'tiktok_shop', 'marketplace', 'physical', 'custom']\n\nfunction resolve(resolver?: ShopProviderResolver): ShopProvider {\n return typeof resolver === 'function' ? resolver() : resolver ?? getShopProvider()\n}\n\n// Let any runtime nav contributor (e.g. the app's ChannelsNav) refresh the\n// sidebar the moment channels change here, without coupling the two.\nfunction notifyChannelsChanged() {\n if (typeof window !== 'undefined') window.dispatchEvent(new Event('fayz:channels-changed'))\n}\n\nexport interface ChannelsPageProps {\n resolveProvider?: ShopProviderResolver\n}\n\nexport function ChannelsPage({ resolveProvider }: ChannelsPageProps) {\n const provider = React.useMemo(() => resolve(resolveProvider), [resolveProvider])\n const supported = typeof provider.listSalesChannels === 'function'\n\n const [channels, setChannels] = React.useState<SalesChannel[]>([])\n const [loading, setLoading] = React.useState(true)\n const [adding, setAdding] = React.useState<SalesChannelKind | null>(null)\n\n const reload = React.useCallback(async () => {\n if (!provider.listSalesChannels) { setLoading(false); return }\n setLoading(true)\n try {\n const rows = await provider.listSalesChannels()\n // Guarantee a Loja Online row exists so the storefront link is always\n // configurable — seed one on first visit if the store has none.\n if (!rows.some((c) => c.kind === 'online_store') && provider.createSalesChannel) {\n await provider.createSalesChannel({ kind: 'online_store', label: 'Loja Online', enabled: true, position: 0 })\n setChannels(await provider.listSalesChannels())\n } else {\n setChannels(rows)\n }\n } finally {\n setLoading(false)\n }\n }, [provider])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const patch = async (id: string, input: Parameters<NonNullable<ShopProvider['updateSalesChannel']>>[1]) => {\n if (!provider.updateSalesChannel) return\n const updated = await provider.updateSalesChannel(id, input)\n setChannels((prev) => prev.map((c) => (c.id === id ? updated : c)))\n notifyChannelsChanged()\n }\n\n const remove = async (id: string) => {\n if (!provider.deleteSalesChannel) return\n await provider.deleteSalesChannel(id)\n setChannels((prev) => prev.filter((c) => c.id !== id))\n notifyChannelsChanged()\n }\n\n const add = async (kind: SalesChannelKind, label: string, url: string) => {\n if (!provider.createSalesChannel) return\n const created = await provider.createSalesChannel({ kind, label: label || KIND_META[kind].label, url: url || null, enabled: true, position: channels.length })\n setChannels((prev) => [...prev, created])\n setAdding(null)\n notifyChannelsChanged()\n }\n\n if (!supported) {\n return (\n <div className=\"mx-auto max-w-4xl p-6\">\n <h1 className=\"text-xl font-semibold text-foreground\">Canais de venda</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Este provedor de loja ainda não expõe canais de venda.\n </p>\n </div>\n )\n }\n\n const online = channels.find((c) => c.kind === 'online_store')\n const others = channels.filter((c) => c.kind !== 'online_store')\n\n return (\n <div className=\"mx-auto max-w-4xl p-6\">\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-semibold text-foreground\">Canais de venda</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Onde sua loja vende. A Loja Online é o seu storefront fayz; os demais são links que aparecem no menu lateral.\n </p>\n </div>\n\n {loading ? (\n <p className=\"text-sm text-muted-foreground\">Carregando…</p>\n ) : (\n <div className=\"space-y-6\">\n {online && <OnlineStoreCard channel={online} onSave={(url) => patch(online.id, { url })} onToggle={(enabled) => patch(online.id, { enabled })} />}\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold text-foreground\">Outros canais</h2>\n </div>\n <div className=\"space-y-2\">\n {others.map((c) => (\n <ChannelRow key={c.id} channel={c} onSave={(url) => patch(c.id, { url })} onToggle={(enabled) => patch(c.id, { enabled })} onRemove={() => remove(c.id)} />\n ))}\n {others.length === 0 && (\n <p className=\"rounded-card border border-dashed border-border p-4 text-sm text-muted-foreground\">\n Nenhum canal adicional ainda. Adicione WhatsApp, Instagram, TikTok Shop e outros pontos de venda.\n </p>\n )}\n </div>\n\n {adding ? (\n <AddChannelForm kind={adding} onCancel={() => setAdding(null)} onAdd={(label, url) => add(adding, label, url)} onKind={setAdding} />\n ) : (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {ADDABLE_KINDS.map((k) => {\n const Icon = KIND_META[k].icon\n return (\n <Button key={k} variant=\"outline\" size=\"sm\" onClick={() => setAdding(k)}>\n <Icon className=\"mr-1.5 h-3.5 w-3.5\" /> {KIND_META[k].label}\n </Button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction OnlineStoreCard({ channel, onSave, onToggle }: { channel: SalesChannel; onSave: (url: string | null) => void; onToggle: (enabled: boolean) => void }) {\n const [url, setUrl] = React.useState(channel.url ?? '')\n const dirty = (channel.url ?? '') !== url\n const meta = KIND_META.online_store\n return (\n <div className=\"rounded-card border border-border bg-card p-5\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary/10\">\n <meta.icon className=\"h-5 w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-foreground\">Loja Online</span>\n <span className={`rounded-full px-2 py-0.5 text-xs font-medium ${channel.enabled ? 'bg-emerald-100 text-emerald-800' : 'bg-muted text-muted-foreground'}`}>\n {channel.enabled ? 'Ativa' : 'Inativa'}\n </span>\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{meta.hint}</p>\n\n <div className=\"mt-3 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"flex-1\" />\n <div className=\"flex gap-2\">\n <Button size=\"sm\" disabled={!dirty} onClick={() => onSave(url.trim() || null)}>Salvar</Button>\n <Button size=\"sm\" variant=\"outline\" disabled={!channel.url} onClick={() => channel.url && window.open(channel.url, '_blank', 'noopener,noreferrer')}>\n <ExternalLink className=\"mr-1.5 h-3.5 w-3.5\" /> Ver loja\n </Button>\n </div>\n </div>\n <div className=\"mt-3\">\n <button type=\"button\" onClick={() => onToggle(!channel.enabled)} className=\"text-xs font-medium text-muted-foreground hover:text-foreground\">\n {channel.enabled ? 'Desativar canal' : 'Ativar canal'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ChannelRow({ channel, onSave, onToggle, onRemove }: { channel: SalesChannel; onSave: (url: string | null) => void; onToggle: (enabled: boolean) => void; onRemove: () => void }) {\n const [url, setUrl] = React.useState(channel.url ?? '')\n const [editing, setEditing] = React.useState(false)\n const meta = KIND_META[channel.kind] ?? KIND_META.custom\n const Icon = meta.icon\n return (\n <div className=\"rounded-card border border-border bg-card p-3\">\n <div className=\"flex items-center gap-3\">\n <div className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-full ${channel.enabled ? 'bg-primary/10' : 'bg-muted'}`}>\n <Icon className={`h-4 w-4 ${channel.enabled ? 'text-primary' : 'text-muted-foreground'}`} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{channel.label}</p>\n {editing ? (\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"mt-1 h-8\" />\n ) : (\n <p className=\"truncate text-xs text-muted-foreground\">{channel.url || 'Sem link configurado'}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {editing ? (\n <>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { onSave(url.trim() || null); setEditing(false) }}><Check className=\"h-4 w-4\" /></Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setUrl(channel.url ?? ''); setEditing(false) }}><X className=\"h-4 w-4\" /></Button>\n </>\n ) : (\n <>\n {channel.url && (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => window.open(channel.url!, '_blank', 'noopener,noreferrer')}><ExternalLink className=\"h-4 w-4\" /></Button>\n )}\n <button type=\"button\" onClick={() => onToggle(!channel.enabled)} title={channel.enabled ? 'Desativar' : 'Ativar'} className={`rounded-full px-2 py-0.5 text-xs font-medium ${channel.enabled ? 'bg-emerald-100 text-emerald-800' : 'bg-muted text-muted-foreground'}`}>\n {channel.enabled ? 'Ativo' : 'Inativo'}\n </button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setEditing(true)}>Editar</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={onRemove}><Trash2 className=\"h-4 w-4 text-red-500\" /></Button>\n </>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nfunction AddChannelForm({ kind, onKind, onCancel, onAdd }: { kind: SalesChannelKind; onKind: (k: SalesChannelKind) => void; onCancel: () => void; onAdd: (label: string, url: string) => void }) {\n const meta = KIND_META[kind]\n const [label, setLabel] = React.useState(meta.label)\n const [url, setUrl] = React.useState('')\n React.useEffect(() => { setLabel(KIND_META[kind].label) }, [kind])\n return (\n <div className=\"mt-3 rounded-card border border-border bg-card p-4\">\n <div className=\"mb-3 flex flex-wrap gap-2\">\n {ADDABLE_KINDS.map((k) => {\n const Icon = KIND_META[k].icon\n return (\n <button key={k} type=\"button\" onClick={() => onKind(k)} className={`flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium ${k === kind ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:text-foreground'}`}>\n <Icon className=\"h-3.5 w-3.5\" /> {KIND_META[k].label}\n </button>\n )\n })}\n </div>\n <p className=\"mb-2 text-xs text-muted-foreground\">{meta.hint}</p>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input value={label} placeholder=\"Nome do canal\" onChange={(e) => setLabel(e.target.value)} className=\"sm:w-48\" />\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"flex-1\" />\n </div>\n <div className=\"mt-3 flex gap-2\">\n <Button size=\"sm\" onClick={() => onAdd(label, url)}><Plus className=\"mr-1.5 h-3.5 w-3.5\" /> Adicionar</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={onCancel}>Cancelar</Button>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { setShopTenantResolver, getShopProvider } from '@fayz-ai/shop'\nimport { useOrganizationStore, createCrudPage, registerEntityPath } from '@fayz-ai/saas'\nimport { buildShopProductEntity } from './views/productEntity'\nimport { buildShopCustomerEntity } from './views/customerEntity'\nimport { buildShopDiscountEntity } from './views/discountEntity'\nimport { buildShopShippingZoneEntity } from './views/shippingZoneEntity'\nimport { createShopProductDataProvider } from './data/productDataProvider'\nimport { createShopCustomerDataProvider } from './data/customerDataProvider'\nimport { createShopDiscountDataProvider } from './data/discountDataProvider'\nimport { createShopShippingZoneDataProvider } from './data/shippingZoneDataProvider'\nimport type { ShopProviderResolver } from './ShopPage'\nimport { ShopSettings } from './components/ShopSettings'\nimport { ChannelsPage } from './views/ChannelsPage'\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 /** Override the accordion child labels (Produtos / Pedidos / Clientes / Descontos). */\n sectionLabels?: Partial<Record<'products' | 'orders' | 'customers' | 'discounts' | 'shipping', 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 // Teach the shared person-path registry where a SHOP customer lives. The\n // built-in map ships veterinary defaults (customer → /registry/tutors), so\n // without this PersonLink would resolve a shop customer to the wrong module.\n // Clientes now lives at the top level (/customers), out of the Loja accordion.\n registerEntityPath('shop_customer', '/customers')\n\n type ShopSection = 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n\n // One component per section so each gets its own route. The shell nests any\n // entry whose route is a sub-path of another (same rule the courses modules\n // use), so /shop/products … /shop/discounts render as an accordion under\n // \"Loja\" instead of one link with everything hidden behind tabs.\n const pageFor = (section?: ShopSection): React.ComponentType<unknown> => {\n const Wrapped: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(\n ShopPage as React.ComponentType<{ provider?: ShopProviderResolver; section?: ShopSection }>,\n { provider: options?.provider, section },\n )\n )\n Wrapped.displayName = section ? `ShopPage:${section}` : 'ShopPageWrapper'\n return Wrapped\n }\n\n // Products, customers and discounts all get the full generic CRUD (list +\n // form + detail + delete) from their EntityDef, rather than three bespoke\n // read-only tables. Orders stay on the custom page: an order is not a CRUD\n // record — it needs fulfilment, refunds and a line-item view, which is its\n // own screen.\n const resolveProvider = () =>\n typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider()\n\n const ProductsCrudPage = createCrudPage(buildShopProductEntity(curr.code, resolveProvider), {\n dataProvider: createShopProductDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const CustomersCrudPage = createCrudPage(buildShopCustomerEntity(), {\n dataProvider: createShopCustomerDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const DiscountsCrudPage = createCrudPage(buildShopDiscountEntity(), {\n dataProvider: createShopDiscountDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const ShippingZonesCrudPage = createCrudPage(buildShopShippingZoneEntity(curr.code), {\n dataProvider: createShopShippingZoneDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const CRUD_PAGES: Partial<Record<ShopSection, React.ComponentType<unknown>>> = {\n products: ProductsCrudPage as React.ComponentType<unknown>,\n customers: CustomersCrudPage as React.ComponentType<unknown>,\n discounts: DiscountsCrudPage as React.ComponentType<unknown>,\n shipping: ShippingZonesCrudPage as React.ComponentType<unknown>,\n }\n\n // \"Clientes\" is intentionally NOT here: it moved out of the Loja accordion to\n // a top-level nav item (/customers), registered separately below. The shell\n // nests by route prefix, so a route under /shop is what put it inside \"Loja\".\n const SECTIONS: Array<{ id: ShopSection; label: string; icon: string }> = [\n { id: 'products', label: options?.sectionLabels?.products ?? 'Produtos', icon: 'Package' },\n { id: 'orders', label: options?.sectionLabels?.orders ?? 'Pedidos', icon: 'ShoppingCart' },\n { id: 'discounts', label: options?.sectionLabels?.discounts ?? 'Descontos', icon: 'Tag' },\n { id: 'shipping', label: options?.sectionLabels?.shipping ?? 'Entrega', icon: 'Truck' },\n ]\n\n // Standalone Customers page — same CRUD component, now at /customers so it\n // reads as its own top-level destination instead of a Loja sub-tab.\n const CustomersNavLabel = options?.sectionLabels?.customers ?? 'Clientes'\n\n // Canais de venda — wraps the ChannelsPage with the app's shop provider.\n const ChannelsPageWrapped: React.ComponentType<unknown> = () =>\n React.createElement(ChannelsPage, { resolveProvider: options?.provider })\n ChannelsPageWrapped.displayName = 'ChannelsPage'\n\n const navSection = options?.navSection ?? 'main'\n const navPosition = options?.navPosition ?? 6\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 // Storefront/commerce-operator-console surface — targets the ecommerce\n // Panel world, not a saas admin app.\n scaffolds: ['ecommerce'],\n defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: navSection,\n position: navPosition,\n label: options?.navLabel ?? 'Shop',\n route: '/shop',\n icon: 'ShoppingBag',\n permission: { feature: 'shop', action: 'read' as const },\n // \"Loja\" and \"Produtos\" are the same screen — don't list both.\n indexChild: false,\n },\n ...SECTIONS.map((s, i) => ({\n section: navSection,\n position: navPosition + i + 1,\n label: s.label,\n route: `/shop/${s.id}`,\n icon: s.icon,\n permission: { feature: 'shop', action: 'read' as const },\n })),\n // Clientes — top-level (route not under /shop, so it leaves the accordion).\n // Fractional position keeps it right below \"Loja\", above other plugins.\n {\n section: navSection,\n position: navPosition + 0.5,\n label: CustomersNavLabel,\n route: '/customers',\n icon: 'Users',\n permission: { feature: 'shop', action: 'read' as const },\n },\n // Canais de venda — inside the \"Loja\" group (route under /shop nests it in\n // the accordion). The store's points of sale (Loja Online, WhatsApp, …).\n {\n section: navSection,\n position: navPosition + SECTIONS.length + 1,\n label: 'Canais de venda',\n route: '/shop/channels',\n icon: 'Radio',\n permission: { feature: 'shop', action: 'read' as const },\n },\n ],\n routes: [\n {\n // Kept so existing links to /shop still resolve; renders the tabbed page.\n path: '/shop',\n component: pageFor(),\n permission: { feature: 'shop', action: 'read' as const },\n },\n ...SECTIONS.map((s) => ({\n path: `/shop/${s.id}`,\n component: CRUD_PAGES[s.id] ?? pageFor(s.id),\n permission: { feature: 'shop', action: 'read' as const },\n })),\n // Clientes at the top level, same CRUD page as before.\n {\n path: '/customers',\n component: CustomersCrudPage as React.ComponentType<unknown>,\n permission: { feature: 'shop', action: 'read' as const },\n },\n // Canais de venda management page (under the Loja group).\n {\n path: '/shop/channels',\n component: ChannelsPageWrapped,\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"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ShopProviderResolver } from '../ShopPage';
|
|
3
|
+
export interface ChannelsPageProps {
|
|
4
|
+
resolveProvider?: ShopProviderResolver;
|
|
5
|
+
}
|
|
6
|
+
export declare function ChannelsPage({ resolveProvider }: ChannelsPageProps): React.JSX.Element;
|
|
7
|
+
//# sourceMappingURL=ChannelsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChannelsPage.d.ts","sourceRoot":"","sources":["../../src/views/ChannelsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAuCvD,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,oBAAoB,CAAA;CACvC;AAED,wBAAgB,YAAY,CAAC,EAAE,eAAe,EAAE,EAAE,iBAAiB,qBAiHlE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { ShopProvider } from '@fayz-ai/shop';
|
|
3
|
-
export declare function OrderDetailView({ orderId, provider, onBack
|
|
3
|
+
export declare function OrderDetailView({ orderId, provider, onBack }: {
|
|
4
4
|
orderId: string;
|
|
5
5
|
provider: () => ShopProvider;
|
|
6
6
|
onBack: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderDetailView.d.ts","sourceRoot":"","sources":["../../src/views/OrderDetailView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"OrderDetailView.d.ts","sourceRoot":"","sources":["../../src/views/OrderDetailView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAOlD,OAAO,KAAK,EAAS,YAAY,EAAE,MAAM,eAAe,CAAA;AAsFxD,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;IAC7D,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,YAAY,CAAA;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB,qBA0NA;AAED,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,WAAyB,CAAA;AACnE,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,SAAyC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discountEntity.d.ts","sourceRoot":"","sources":["../../src/views/discountEntity.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,eAAe,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAqB7C,wBAAgB,uBAAuB,IAAI,SAAS,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"discountEntity.d.ts","sourceRoot":"","sources":["../../src/views/discountEntity.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,eAAe,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAqB7C,wBAAgB,uBAAuB,IAAI,SAAS,CAAC,QAAQ,CAAC,CAwH7D"}
|