@fayz-ai/plugin-shop 0.24.4 → 0.24.6

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.
Files changed (61) hide show
  1. package/dist/CheckoutSettings-GQRYZF6I.js +128 -0
  2. package/dist/CheckoutSettings-GQRYZF6I.js.map +1 -0
  3. package/dist/ContentPage-2PHOZSFZ.js +510 -0
  4. package/dist/ContentPage-2PHOZSFZ.js.map +1 -0
  5. package/dist/DeliveryStoreSettings-L2RXOVB6.js +172 -0
  6. package/dist/DeliveryStoreSettings-L2RXOVB6.js.map +1 -0
  7. package/dist/FulfillmentSettings-PW233UOK.js +61 -0
  8. package/dist/FulfillmentSettings-PW233UOK.js.map +1 -0
  9. package/dist/MarketsSettings-YUEVDLIR.js +19 -0
  10. package/dist/MarketsSettings-YUEVDLIR.js.map +1 -0
  11. package/dist/PaymentsSettings-5CI74TY2.js +318 -0
  12. package/dist/PaymentsSettings-5CI74TY2.js.map +1 -0
  13. package/dist/ProductContentTab-PSNDS7JZ.js +4 -0
  14. package/dist/ProductContentTab-PSNDS7JZ.js.map +1 -0
  15. package/dist/ProductListingTab-55Y5RXU7.js +4 -0
  16. package/dist/ProductListingTab-55Y5RXU7.js.map +1 -0
  17. package/dist/ProductMarketPricesTab-QD2ZXEWL.js +4 -0
  18. package/dist/ProductMarketPricesTab-QD2ZXEWL.js.map +1 -0
  19. package/dist/ShippingSettings-UBTNRBJ4.js +9 -0
  20. package/dist/ShippingSettings-UBTNRBJ4.js.map +1 -0
  21. package/dist/{ShopPage-NUIIWBCB.js → ShopPage-NARKHXOO.js} +6 -3
  22. package/dist/ShopPage-NARKHXOO.js.map +1 -0
  23. package/dist/StoreGeneralSettings-DEZ2CMVG.js +97 -0
  24. package/dist/StoreGeneralSettings-DEZ2CMVG.js.map +1 -0
  25. package/dist/chunk-2MXOKJQO.js +23 -0
  26. package/dist/chunk-2MXOKJQO.js.map +1 -0
  27. package/dist/chunk-4JM32Z7J.js +51 -0
  28. package/dist/chunk-4JM32Z7J.js.map +1 -0
  29. package/dist/chunk-53Y6VLAW.js +132 -0
  30. package/dist/chunk-53Y6VLAW.js.map +1 -0
  31. package/dist/chunk-6V2VAUWP.js +24 -0
  32. package/dist/chunk-6V2VAUWP.js.map +1 -0
  33. package/dist/chunk-FQQMEM26.js +59 -0
  34. package/dist/chunk-FQQMEM26.js.map +1 -0
  35. package/dist/chunk-JYT6BTRE.js +298 -0
  36. package/dist/chunk-JYT6BTRE.js.map +1 -0
  37. package/dist/chunk-MFEOIJI7.js +127 -0
  38. package/dist/chunk-MFEOIJI7.js.map +1 -0
  39. package/dist/chunk-R5CUDFOI.js +61 -0
  40. package/dist/chunk-R5CUDFOI.js.map +1 -0
  41. package/dist/chunk-STHGZWBQ.js +1455 -0
  42. package/dist/chunk-STHGZWBQ.js.map +1 -0
  43. package/dist/{chunk-XV3KZRQX.js → chunk-STZYH32S.js} +9 -140
  44. package/dist/chunk-STZYH32S.js.map +1 -0
  45. package/dist/chunk-TDV3SFXT.js +75 -0
  46. package/dist/chunk-TDV3SFXT.js.map +1 -0
  47. package/dist/chunk-YUG6XQHJ.js +55 -0
  48. package/dist/chunk-YUG6XQHJ.js.map +1 -0
  49. package/dist/data/registry-routes.d.ts.map +1 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +129 -3456
  52. package/dist/index.js.map +1 -1
  53. package/dist/settings/ShippingSettings.d.ts.map +1 -1
  54. package/dist/views/EmailTemplatePage.d.ts.map +1 -1
  55. package/dist/views/EmailsPage.d.ts.map +1 -1
  56. package/dist/views/ProductContentTab.d.ts.map +1 -1
  57. package/dist/views/ProductMarketPricesTab.d.ts.map +1 -1
  58. package/dist/views/media-links.d.ts.map +1 -1
  59. package/package.json +7 -7
  60. package/dist/ShopPage-NUIIWBCB.js.map +0 -1
  61. package/dist/chunk-XV3KZRQX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/views/media-links.ts","../src/views/ContentPage.tsx"],"names":[],"mappings":"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","file":"ContentPage-2PHOZSFZ.js","sourcesContent":["import type { MediaFile } from '@fayz-ai/shop'\nimport { appHref } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Os dois endereços que a biblioteca de conteúdo precisa saber montar: para\n// onde uma foto leva, e por onde ela desce. Fora do componente porque é o que\n// realmente pode quebrar sem ninguém ver — uma rota que mudou de forma, um\n// arquivo que abre em vez de baixar.\n// ---------------------------------------------------------------------------\n\n/** A tela onde a foto é gerenciada — a aba de fotos do produto, não a lista. */\nexport function recordRoute(reference: NonNullable<MediaFile['reference']>): string {\n return appHref(`/products/${reference.id}/images`)\n}\n\n/**\n * O endereço que baixa o arquivo em vez de abri-lo.\n *\n * O storage devolve o arquivo como anexo quando pedimos; o atributo `download`\n * do link sozinho é ignorado quando o arquivo vem de outro domínio — que é o\n * caso de toda foto da loja.\n */\nexport function downloadUrlOf(file: MediaFile): string {\n if (!/^https?:/i.test(file.url)) return file.url\n const separator = file.url.includes('?') ? '&' : '?'\n return `${file.url}${separator}download=${encodeURIComponent(file.name)}`\n}\n","import React from 'react'\nimport {\n ChevronLeft, ChevronRight, Download, Film, FileText, ImageOff,\n Package, RefreshCw, Trash2, Upload,\n} from 'lucide-react'\nimport { Button, Card, ConfirmDialog, Hint, PageHeader, PageHeaderActions, PageTabs, toast } from '@fayz-ai/ui'\nimport { AskAIButton, PageActions, type PageAction } from '@fayz-ai/admin'\nimport type { MediaFile, ShopProvider } from '@fayz-ai/shop'\nimport { getShopProvider, productImageToMediaFile } from '@fayz-ai/shop'\nimport { downloadUrlOf, recordRoute } from './media-links'\nimport type { ShopProviderResolver } from './ShopPage'\n\n// ---------------------------------------------------------------------------\n// Conteúdo — a biblioteca de arquivos da loja.\n//\n// Não é um depósito: é onde o lojista olha as fotos do catálogo todas juntas e\n// vê quais estão ruins. Por isso cada arquivo mostra a que registro pertence e\n// leva até ele — uma parede de miniaturas anônimas mostra o problema e não dá\n// para onde ir —, e por isso abrir uma foto acontece AQUI, com voltar, baixar e\n// trocar à mão: quem veio revisar o catálogo revisa dezenas, e cada ida a outra\n// aba é uma volta que ele não faz.\n//\n// Uma foto de produto é uma linha em plg_shop_product_images (é o provider que\n// junta as duas fontes); o que o lojista sobe aqui não pertence a nada e fica na\n// biblioteca.\n// ---------------------------------------------------------------------------\n\ntype MediaTab = 'all' | 'image' | 'video'\n\nconst TABS: { value: MediaTab; label: string }[] = [\n { value: 'all', label: 'Todos' },\n { value: 'image', label: 'Imagens' },\n { value: 'video', label: 'Vídeos' },\n]\n\n/** Abaixo disso a foto estoura no zoom do storefront e no retina de um celular. */\nconst LOW_RESOLUTION_PX = 800\n\nfunction resolve(resolver?: ShopProviderResolver): ShopProvider {\n return typeof resolver === 'function' ? resolver() : resolver ?? getShopProvider()\n}\n\nfunction formatSize(bytes: number): string {\n if (!bytes) return ''\n const units = ['B', 'KB', 'MB', 'GB']\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1)\n return `${(bytes / 1024 ** i).toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n}\n\ninterface Dimensions { width: number; height: number }\n\nexport interface ContentPageProps {\n resolveProvider?: ShopProviderResolver\n}\n\nexport function ContentPage({ resolveProvider }: ContentPageProps) {\n const provider = React.useMemo(() => resolve(resolveProvider), [resolveProvider])\n const supported = typeof provider.listMediaFiles === 'function'\n\n const [files, setFiles] = React.useState<MediaFile[] | null>(null)\n const [tab, setTab] = React.useState<MediaTab>('all')\n const [uploading, setUploading] = React.useState(false)\n const [pendingDelete, setPendingDelete] = React.useState<MediaFile | null>(null)\n const [deleting, setDeleting] = React.useState(false)\n const [replacing, setReplacing] = React.useState(false)\n // A foto aberta é guardada por id, não por objeto: a lista recarrega a cada\n // troca e um objeto guardado ficaria mostrando o arquivo antigo.\n const [openId, setOpenId] = React.useState<string | null>(null)\n // Medidas do arquivo real, lidas do <img> depois que ele carrega: o tamanho em\n // bytes não diz se a foto está pequena, e é isso que o lojista veio ver.\n const [dimensions, setDimensions] = React.useState<Record<string, Dimensions>>({})\n // The picker lives on the page, not inside a button: the header action is\n // now declared (PageActions), and a declaration has no DOM to hang an\n // <input type=\"file\"> off. Its `onSelect` clicks this one instead.\n const uploadInputRef = React.useRef<HTMLInputElement>(null)\n\n const reload = React.useCallback(async () => {\n if (!provider.listMediaFiles) { setFiles([]); return }\n try {\n setFiles(await provider.listMediaFiles())\n } catch (err) {\n console.warn('[content] failed to list media', err)\n setFiles([])\n }\n }, [provider])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const measure = React.useCallback((id: string, d: Dimensions) => {\n setDimensions((prev) => prev[id] ? prev : { ...prev, [id]: d })\n }, [])\n\n const handleUpload = async (picked: FileList | null) => {\n if (!picked?.length || !provider.uploadMediaFile) return\n setUploading(true)\n try {\n // Sequential, not Promise.all: a merchant dropping twenty photos on a\n // café connection should not open twenty parallel uploads that all\n // time out together.\n for (const file of Array.from(picked)) {\n await provider.uploadMediaFile(file)\n }\n toast.success(picked.length === 1 ? 'Arquivo enviado' : `${picked.length} arquivos enviados`)\n await reload()\n } catch (err) {\n console.warn('[content] upload failed', err)\n toast.error('Não foi possível enviar o arquivo')\n } finally {\n setUploading(false)\n }\n }\n\n const handleReplace = async (file: MediaFile, picked: File) => {\n setReplacing(true)\n try {\n let nextId: string\n if (file.reference) {\n if (!provider.replaceProductImage) throw new Error('unsupported')\n const image = await provider.replaceProductImage(file.reference.attachmentId, picked)\n // A troca escreve um arquivo novo, então a identidade muda — reabrir a\n // foto pelo id antigo cairia numa tela em branco.\n nextId = productImageToMediaFile(image, file.reference.label).id\n } else {\n if (!provider.uploadMediaFile) throw new Error('unsupported')\n // Sobe primeiro, apaga depois: se a subida falhar, o lojista continua\n // com o arquivo que tinha.\n const uploaded = await provider.uploadMediaFile(picked)\n if (provider.deleteMediaFile) await provider.deleteMediaFile(file.id)\n nextId = uploaded.id\n }\n await reload()\n setOpenId(nextId)\n toast.success('Arquivo trocado')\n } catch (err) {\n console.warn('[content] replace failed', err)\n toast.error('Não foi possível trocar o arquivo')\n } finally {\n setReplacing(false)\n }\n }\n\n const confirmDelete = async () => {\n const file = pendingDelete\n if (!file) return\n setDeleting(true)\n try {\n // Uma foto de produto se apaga desanexando: a linha é o que a torna a foto\n // daquele produto, e é o provider que leva o arquivo junto. Um arquivo da\n // biblioteca não tem linha nenhuma — só o objeto.\n if (file.reference) {\n await provider.deleteProductImage(file.reference.attachmentId)\n } else if (provider.deleteMediaFile) {\n await provider.deleteMediaFile(file.id)\n }\n setFiles((prev) => prev?.filter((f) => f.id !== file.id) ?? null)\n setPendingDelete(null)\n if (openId === file.id) setOpenId(null)\n } catch (err) {\n console.warn('[content] delete failed', err)\n toast.error('Não foi possível excluir o arquivo')\n } finally {\n setDeleting(false)\n }\n }\n\n const visible = (files ?? []).filter((f) => tab === 'all' || f.kind === tab)\n const openIndex = visible.findIndex((f) => f.id === openId)\n const open = openIndex >= 0 ? visible[openIndex]! : null\n\n const canDelete = (file: MediaFile) => Boolean(file.reference) || typeof provider.deleteMediaFile === 'function'\n const canReplace = (file: MediaFile) => file.reference\n ? typeof provider.replaceProductImage === 'function'\n : typeof provider.uploadMediaFile === 'function'\n\n // A foto aberta ocupa a página inteira: a grade atrás dela seria só ruído, e\n // voltar é um clique (ou Esc).\n if (open) {\n return (\n <>\n <MediaDetail\n file={open}\n dimensions={dimensions[open.id]}\n onMeasured={(d) => measure(open.id, d)}\n position={{ index: openIndex, total: visible.length }}\n onNavigate={(delta) => setOpenId(visible[openIndex + delta]?.id ?? open.id)}\n onBack={() => setOpenId(null)}\n onReplace={canReplace(open) ? (picked) => void handleReplace(open, picked) : undefined}\n onDelete={canDelete(open) ? () => setPendingDelete(open) : undefined}\n replacing={replacing}\n />\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n </>\n )\n }\n\n const attached = visible.filter((f) => f.reference)\n const loose = visible.filter((f) => !f.reference)\n\n // O NÚMERO VAI NA ABA, não ao lado dela.\n //\n // A contagem saía como texto solto no lado direito da faixa — que é o lugar\n // dos filtros e dos modos de ver em toda tela do produto (ver PageTabs). Era\n // a única tela com prosa ali, e era ela que esticava a faixa. `count` é o\n // slot que a própria aba tem para isso, e ainda responde uma pergunta que a\n // legenda não respondia: quantos vídeos, quantas imagens.\n const countOf = (t: MediaTab) => {\n if (files === null) return undefined\n if (t === 'all') return files.length\n return files.filter((f) => f.kind === t).length\n }\n const tabs = TABS.map((t) => ({ ...t, count: countOf(t.value) }))\n\n // Declared, not drawn: PageActions is what every other list's header uses,\n // so \"Enviar arquivos\" gets the same button on a pointer and the same FAB in\n // the thumb's corner on a phone. Hand-drawn it was a text button squeezed\n // into the phone's top bar, which is the one place a thumb cannot reach.\n const uploadActions: PageAction[] = [{\n id: 'upload',\n label: uploading ? 'Enviando…' : 'Enviar arquivos',\n icon: Upload,\n intent: 'primary',\n // It puts a new file in the library — the FAB is a \"+\", not a \"⋮\".\n creates: true,\n disabled: uploading,\n onSelect: () => uploadInputRef.current?.click(),\n }]\n\n const renderGrid = (list: MediaFile[]) => (\n <div className=\"fz-cards gap-4\">\n {list.map((file) => (\n <MediaCard\n key={file.id}\n file={file}\n dimensions={dimensions[file.id]}\n onMeasured={(d) => measure(file.id, d)}\n onOpen={() => setOpenId(file.id)}\n onDelete={canDelete(file) ? () => setPendingDelete(file) : undefined}\n />\n ))}\n </div>\n )\n\n return (\n <>\n {/* No <h1>: the shell's top bar already names the page — and now it also\n carries the upload, like every other page's primary action. The tabs\n are the page's own band (PageTabs), the same strip every list draws,\n not a row of links floating on the content. */}\n {/* A FAIXA É O PRIMEIRO FILHO, e tem de ser.\n A shell embrulha a página em `space-y-6 pt-4` (AdminShell), e a faixa\n sobe com `-mt-4` para encostar no cabeçalho — as duas coisas só se\n cancelam no PRIMEIRO filho. O seletor de arquivo escondido vinha\n antes: `display:none` não ocupa altura, mas continua sendo um filho,\n então a faixa herdava os 24px do `space-y` E perdia o encaixe do\n `-mt-4`. Era um buraco de ~40px entre \"Conteúdo\" e as abas que\n nenhuma outra tela tinha. O input foi para o fim, onde não empurra\n nada.\n A mesma faixa do Financeiro: abas à esquerda, fio atravessando a\n página, lado direito livre para filtros. */}\n <PageTabs\n tabs={tabs}\n value={tab}\n onChange={setTab}\n aria-label=\"Arquivos\"\n />\n {supported && provider.uploadMediaFile && (\n <PageHeaderActions>\n <PageActions actions={uploadActions} />\n </PageHeaderActions>\n )}\n\n <div className=\"space-y-6\">\n {!supported ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Armazenamento não configurado</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n A biblioteca de arquivos precisa do storage da loja, que não está disponível neste modo.\n </p>\n </Card>\n ) : files === null ? (\n <div className=\"fz-cards gap-4\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Card key={i} className=\"p-3\">\n <div className=\"aspect-square animate-pulse rounded-md bg-muted\" />\n <div className=\"mt-2 h-3.5 w-2/3 animate-pulse rounded bg-muted\" />\n </Card>\n ))}\n </div>\n ) : visible.length === 0 ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Nenhum arquivo ainda</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n As fotos dos seus produtos e o que você enviar aqui aparecem nesta biblioteca.\n </p>\n </Card>\n ) : attached.length && loose.length ? (\n // Só separa quando há os dois: um título sozinho em cima de tudo é\n // barulho, e a etiqueta em cada cartão já diz de quem é a foto.\n <div className=\"space-y-8\">\n <section className=\"space-y-3\">\n <SectionTitle title=\"Fotos de produtos\" count={attached.length} />\n {renderGrid(attached)}\n </section>\n <section className=\"space-y-3\">\n <SectionTitle title=\"Biblioteca\" count={loose.length} />\n {renderGrid(loose)}\n </section>\n </div>\n ) : (\n renderGrid(visible)\n )}\n\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n {supported && provider.uploadMediaFile && (\n <input\n ref={uploadInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n void handleUpload(e.target.files).finally(() => {\n if (uploadInputRef.current) uploadInputRef.current.value = ''\n })\n }}\n />\n )}\n </div>\n </>\n )\n}\n\nfunction DeleteConfirm({ file, loading, onConfirm, onCancel }: {\n file: MediaFile | null\n loading: boolean\n onConfirm: () => void\n onCancel: () => void\n}) {\n return (\n <ConfirmDialog\n open={file !== null}\n loading={loading}\n variant=\"destructive\"\n title={file?.reference ? 'Excluir a foto do produto?' : 'Excluir arquivo?'}\n description={file?.reference\n ? `A foto sai de \"${file.reference.label}\" e da loja imediatamente.`\n : 'O arquivo sai da biblioteca. Se ele estiver em uso em algum lugar, o endereço para de funcionar.'}\n confirmLabel=\"Excluir\"\n cancelLabel=\"Cancelar\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n )\n}\n\nfunction SectionTitle({ title, count }: { title: string; count: number }) {\n return (\n <h2 className=\"text-sm font-semibold\">\n {title} <span className=\"font-normal text-muted-foreground\">({count})</span>\n </h2>\n )\n}\n\n/** O ícone que representa um arquivo que não é imagem. */\nfunction KindIcon({ kind, className }: { kind: MediaFile['kind']; className: string }) {\n const Icon = kind === 'video' ? Film : FileText\n return <Icon className={className} />\n}\n\nfunction MediaCard({ file, dimensions, onMeasured, onOpen, onDelete }: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n onOpen: () => void\n onDelete?: () => void\n}) {\n return (\n <Card className=\"group relative overflow-hidden p-3\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onOpen}\n aria-label={`Abrir ${file.name}`}\n className=\"font-normal gap-0 whitespace-normal relative flex aspect-square w-full items-center justify-center overflow-hidden rounded-md bg-muted\"\n >\n {file.kind === 'image' ? (\n <img\n src={file.url}\n alt={file.name}\n loading=\"lazy\"\n className=\"h-full w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <KindIcon kind={file.kind} className=\"h-8 w-8 text-muted-foreground\" />\n )}\n {file.reference?.isCover && (\n <span className=\"absolute left-1.5 top-1.5 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </Button>\n\n {onDelete && (\n <Hint label=\"Excluir\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Excluir\"\n onClick={onDelete}\n className=\"absolute right-4 top-4 rounded-md bg-card/90 p-1.5 text-muted-foreground opacity-0 shadow-button transition-opacity hover:text-destructive group-hover:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </Hint>\n )}\n\n <p className=\"mt-2 truncate text-[13px] font-medium\" title={file.name}>{file.name}</p>\n <p className=\"text-[11px] text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-1 text-[11px] font-medium text-warning\">Baixa resolução</p>\n )}\n\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1.5 text-[11px]\" />\n ) : (\n <p className=\"mt-1.5 text-[11px] text-muted-foreground\">Biblioteca</p>\n )}\n </Card>\n )\n}\n\n/**\n * A foto aberta, dentro de /content.\n *\n * Abrir numa aba nova mostrava o arquivo e mais nada — nem de quem é, nem como\n * trocar. Aqui a revisão inteira acontece no mesmo lugar: olhar, baixar, trocar,\n * ir para a próxima.\n */\nfunction MediaDetail({\n file, dimensions, onMeasured, position, onNavigate, onBack, onReplace, onDelete, replacing,\n}: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n position: { index: number; total: number }\n onNavigate: (delta: number) => void\n onBack: () => void\n onReplace?: (picked: File) => void\n onDelete?: () => void\n replacing: boolean\n}) {\n const replaceRef = React.useRef<HTMLInputElement>(null)\n\n // As setas andam pelo conjunto que está na tela: revisar trinta fotos é uma\n // tarefa de teclado. O Escape não está aqui — o PageHeader já o liga ao\n // mesmo \"voltar\" que desenha na barra.\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowLeft') onNavigate(-1)\n if (e.key === 'ArrowRight') onNavigate(1)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [onNavigate])\n\n return (\n // `fz-container` é o ponto de MEDIÇÃO: sem ele a container query de\n // `fz-split` nunca casa e as duas colunas ficam empilhadas para sempre,\n // por mais larga que a janela esteja.\n <div className=\"fz-container space-y-4\">\n {/* A seta mora na barra da shell, como em toda tela de detalhe do app:\n \"← Conteúdo / foto.jpg\". Desenhá-la aqui dentro seria o segundo\n cabeçalho que o PageHeader existe para não deixar acontecer. */}\n <PageHeader title={file.name} parentLabel=\"Conteúdo\" onBack={onBack} />\n\n {position.total > 1 && (\n <div className=\"flex items-center justify-end gap-3\">\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Arquivo anterior\"\n disabled={position.index === 0}\n onClick={() => onNavigate(-1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <span className=\"px-1 tabular-nums\">{position.index + 1} de {position.total}</span>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Próximo arquivo\"\n disabled={position.index === position.total - 1}\n onClick={() => onNavigate(1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n\n <div className=\"fz-split\">\n <Card className=\"flex min-h-[320px] items-center justify-center overflow-hidden bg-muted p-2\">\n {file.kind === 'image' ? (\n <img\n key={file.url}\n src={file.url}\n alt={file.name}\n className=\"max-h-[70vh] w-auto max-w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 p-12 text-muted-foreground\">\n <KindIcon kind={file.kind} className=\"h-10 w-10\" />\n <span className=\"text-sm\">Pré-visualização não disponível</span>\n </div>\n )}\n </Card>\n\n <Card className=\"space-y-4 p-4\">\n <div>\n <p className=\"break-words font-medium\" title={file.name}>{file.name}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-2 rounded-md bg-warning/10 px-2 py-1.5 text-xs font-medium text-warning\">\n Baixa resolução — no zoom da loja essa foto fica borrada. Troque por uma\n de pelo menos {LOW_RESOLUTION_PX}px no lado maior.\n </p>\n )}\n </div>\n\n <div>\n <p className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">Onde é usada</p>\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1 text-sm\" />\n ) : (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Biblioteca — este arquivo não está preso a nenhum registro.\n </p>\n )}\n {file.reference?.isCover && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n É a capa: é ela que aparece no catálogo, no carrinho e no pedido.\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n {/* Abre o assistente já sobre ESTA foto: a imagem entra anexada por\n endereço — o modelo busca o original, ninguém converte 100KB em\n base64 — e o pedido já vem escrito. Escrito, não enviado: quem\n está olhando uma foto ruim costuma ter algo a acrescentar (\"e\n deixa o fundo branco\"), e mandar por ele tiraria essa chance. */}\n {file.kind === 'image' && (\n <AskAIButton\n className=\"w-full\"\n size=\"lg\"\n label=\"Melhorar com IA\"\n media={{ url: file.url, name: file.name }}\n draft=\"Melhora essa imagem\"\n hint=\"o que você quer mudar nessa foto\"\n intro={{\n persona: 'Estúdio de imagem',\n pitch: `Vamos melhorar ${file.name}.`,\n description:\n 'Posso limpar o fundo, corrigir luz e cor, e gerar uma versão em resolução maior para o catálogo.',\n suggestions: [\n { label: 'Fundo branco', prompt: 'Remove o fundo e deixa branco' },\n { label: 'Mais nítida', prompt: 'Aumenta a resolução e a nitidez' },\n { label: 'Corrigir a luz', prompt: 'Corrige a iluminação e as cores' },\n ],\n }}\n />\n )}\n\n <Button asChild variant=\"outline\" className=\"w-full\">\n <a href={downloadUrlOf(file)} download={file.name}>\n <Download className=\"mr-2 h-4 w-4\" />\n Baixar\n </a>\n </Button>\n\n {onReplace && (\n <>\n <input\n ref={replaceRef}\n type=\"file\"\n accept={file.kind === 'image' ? 'image/*' : undefined}\n className=\"hidden\"\n onChange={(e) => {\n const picked = e.target.files?.[0]\n e.target.value = ''\n if (picked) onReplace(picked)\n }}\n />\n <Button\n variant=\"outline\"\n className=\"w-full\"\n disabled={replacing}\n onClick={() => replaceRef.current?.click()}\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${replacing ? 'animate-spin' : ''}`} />\n {replacing ? 'Trocando…' : 'Trocar arquivo'}\n </Button>\n {file.reference && (\n <p className=\"text-[11px] text-muted-foreground\">\n A troca mantém a posição da foto na galeria do produto.\n </p>\n )}\n </>\n )}\n\n {onDelete && (\n <Button variant=\"ghost\" className=\"w-full text-destructive hover:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Excluir\n </Button>\n )}\n </div>\n </Card>\n </div>\n </div>\n )\n}\n\nfunction RecordLink({ reference, className = '' }: {\n reference: NonNullable<MediaFile['reference']>\n /** Quem chama define o tamanho: o mesmo link serve o cartão e o painel. */\n className?: string\n}) {\n return (\n <a\n href={recordRoute(reference)}\n title={`Abrir ${reference.label}`}\n className={`flex items-center gap-1 truncate font-medium text-primary hover:underline ${className}`}\n >\n <Package className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{reference.label}</span>\n </a>\n )\n}\n\nfunction FileMeta({ file, dimensions }: { file: MediaFile; dimensions?: Dimensions }) {\n const parts = [\n file.extension,\n dimensions ? `${dimensions.width}×${dimensions.height}` : '',\n formatSize(file.size),\n ].filter(Boolean)\n return <>{parts.join(' · ')}</>\n}\n\nfunction isLowResolution(file: MediaFile, dimensions?: Dimensions): boolean {\n return file.kind === 'image' && !!dimensions\n && Math.max(dimensions.width, dimensions.height) < LOW_RESOLUTION_PX\n}\n"]}
@@ -0,0 +1,172 @@
1
+ import { ShippingSettings } from './chunk-STHGZWBQ.js';
2
+ import './chunk-4JM32Z7J.js';
3
+ import './chunk-6V2VAUWP.js';
4
+ import './chunk-STZYH32S.js';
5
+ import { useStoreSettings } from './chunk-R5CUDFOI.js';
6
+ import './chunk-YUG6XQHJ.js';
7
+ import './chunk-2MXOKJQO.js';
8
+ import React from 'react';
9
+ import { SettingsGroup, useSettingKeys, TextRow } from '@fayz-ai/admin';
10
+ import { useActiveUnitId } from '@fayz-ai/core';
11
+ import { Input } from '@fayz-ai/ui';
12
+ import { jsxs, jsx } from 'react/jsx-runtime';
13
+
14
+ function parseNumber(raw) {
15
+ const clean = raw.replace(/[^\d,.-]/g, "").replace(",", ".");
16
+ if (!clean.trim()) return null;
17
+ const n = Number(clean);
18
+ return Number.isFinite(n) && n >= 0 ? n : NaN;
19
+ }
20
+ var text = (v) => v == null ? "" : String(v).replace(".", ",");
21
+ function NumberRow({ label, description, hint, value, onCommit, placeholder, integer }) {
22
+ const [draft, setDraft] = React.useState(() => text(value));
23
+ const [invalid, setInvalid] = React.useState(false);
24
+ React.useEffect(() => {
25
+ setDraft(text(value));
26
+ }, [value]);
27
+ return /* @__PURE__ */ jsx(
28
+ TextRow,
29
+ {
30
+ label,
31
+ description,
32
+ value: draft,
33
+ onChange: (next) => {
34
+ setDraft(next);
35
+ setInvalid(false);
36
+ },
37
+ onBlurCommit: () => {
38
+ const parsed = parseNumber(draft);
39
+ if (Number.isNaN(parsed)) {
40
+ setInvalid(true);
41
+ return;
42
+ }
43
+ setInvalid(false);
44
+ onCommit(parsed == null ? null : integer ? Math.round(parsed) : Math.round(parsed * 100) / 100);
45
+ },
46
+ invalid,
47
+ hint: invalid ? "Use um n\xFAmero, como 9,90." : hint,
48
+ placeholder
49
+ }
50
+ );
51
+ }
52
+ function EtaRow({ minutes, onCommit }) {
53
+ const [unit, setUnit] = React.useState(() => minutes != null && minutes >= 60 && minutes % 60 === 0 ? "h" : "min");
54
+ const shown = (m, u) => m == null ? "" : u === "h" ? String(+(m / 60).toFixed(2)).replace(".", ",") : String(m);
55
+ const [draft, setDraft] = React.useState(() => shown(minutes, unit));
56
+ const [invalid, setInvalid] = React.useState(false);
57
+ React.useEffect(() => {
58
+ setDraft(shown(minutes, unit));
59
+ }, [minutes, unit]);
60
+ const commit = (raw, u) => {
61
+ const parsed = parseNumber(raw);
62
+ if (Number.isNaN(parsed)) {
63
+ setInvalid(true);
64
+ return;
65
+ }
66
+ setInvalid(false);
67
+ onCommit(parsed == null || parsed === 0 ? null : Math.round(u === "h" ? parsed * 60 : parsed));
68
+ };
69
+ return /* @__PURE__ */ jsxs("div", { className: "py-3", children: [
70
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: "Tempo estimado" }),
71
+ /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: "Da confirma\xE7\xE3o at\xE9 a porta. Aparece no topo do card\xE1pio e no aviso de pedido aceito \u2014 de 24 h em diante, como \xABat\xE9 24 h\xBB." }),
72
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 flex max-w-xs items-center gap-2", children: [
73
+ /* @__PURE__ */ jsx(
74
+ Input,
75
+ {
76
+ value: draft,
77
+ placeholder: "N\xE3o informar",
78
+ "aria-invalid": invalid || void 0,
79
+ "aria-label": "Tempo estimado",
80
+ onChange: (e) => {
81
+ setDraft(e.target.value);
82
+ setInvalid(false);
83
+ },
84
+ onBlur: () => commit(draft, unit),
85
+ onKeyDown: (e) => {
86
+ if (e.key === "Enter") commit(draft, unit);
87
+ },
88
+ "data-testid": "delivery-eta-value"
89
+ }
90
+ ),
91
+ /* @__PURE__ */ jsx("div", { role: "radiogroup", "aria-label": "Unidade", className: "flex shrink-0 rounded-md border p-0.5 text-xs", children: ["min", "h"].map((u) => /* @__PURE__ */ jsx(
92
+ "button",
93
+ {
94
+ type: "button",
95
+ role: "radio",
96
+ "aria-checked": unit === u,
97
+ "data-testid": `delivery-eta-unit-${u}`,
98
+ onClick: () => {
99
+ if (u !== unit) {
100
+ setUnit(u);
101
+ setDraft(shown(minutes, u));
102
+ }
103
+ },
104
+ className: `rounded px-2.5 py-1 ${unit === u ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
105
+ children: u === "min" ? "minutos" : "horas"
106
+ },
107
+ u
108
+ )) })
109
+ ] }),
110
+ /* @__PURE__ */ jsx("p", { className: `mt-1 text-xs ${invalid ? "text-destructive" : "text-muted-foreground"}`, children: invalid ? "Use um n\xFAmero, como 45 ou 1,5." : "Vazio = n\xE3o mostrar." })
111
+ ] });
112
+ }
113
+ function DeliverySwitchStatus() {
114
+ const unitId = useActiveUnitId();
115
+ const s = useSettingKeys(["delivery.enabled"], unitId ?? null);
116
+ if (!s.supported || s.loading || s.loadError) return null;
117
+ const open = s.values["delivery.enabled"] !== false;
118
+ return /* @__PURE__ */ jsxs("p", { "data-testid": "delivery-switch-status", className: "flex items-center gap-2 py-3 text-sm", children: [
119
+ /* @__PURE__ */ jsx("span", { className: `h-2 w-2 shrink-0 rounded-full ${open ? "bg-emerald-500" : "bg-amber-500"}`, "aria-hidden": true }),
120
+ open ? /* @__PURE__ */ jsxs("span", { children: [
121
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: "Delivery aberto agora" }),
122
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: " \xB7 pause pela chave Delivery no topo" })
123
+ ] }) : /* @__PURE__ */ jsxs("span", { children: [
124
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: "Delivery pausado" }),
125
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: " \xB7 o site mostra fechado" })
126
+ ] })
127
+ ] });
128
+ }
129
+ function DeliveryStoreSettings({ provider }) {
130
+ const settings = useStoreSettings(provider);
131
+ const { value, set } = settings;
132
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-4", "data-testid": "delivery-store-settings", children: [
133
+ /* @__PURE__ */ jsx(
134
+ SettingsGroup,
135
+ {
136
+ title: "Pedidos do site",
137
+ description: "O delivery do site abre e pausa pela chave Delivery no topo do sistema.",
138
+ children: /* @__PURE__ */ jsx(DeliverySwitchStatus, {})
139
+ }
140
+ ),
141
+ /* @__PURE__ */ jsxs(
142
+ SettingsGroup,
143
+ {
144
+ title: "Pedido m\xEDnimo e tempo",
145
+ description: "O que o site exige e promete em cada pedido de delivery.",
146
+ children: [
147
+ /* @__PURE__ */ jsx(
148
+ NumberRow,
149
+ {
150
+ label: "Pedido m\xEDnimo",
151
+ description: "Valor dos itens abaixo do qual o site n\xE3o fecha o pedido.",
152
+ hint: "Vazio ou zero = sem m\xEDnimo.",
153
+ value: value.minOrderTotal,
154
+ placeholder: "Sem m\xEDnimo",
155
+ onCommit: (next) => set({ minOrderTotal: next ?? null })
156
+ }
157
+ ),
158
+ /* @__PURE__ */ jsx(EtaRow, { minutes: value.deliveryEtaMinutes, onCommit: (next) => set({ deliveryEtaMinutes: next }) })
159
+ ]
160
+ }
161
+ ),
162
+ settings.error && /* @__PURE__ */ jsxs("p", { className: "px-1 text-xs text-destructive", children: [
163
+ "N\xE3o foi poss\xEDvel salvar: ",
164
+ settings.error
165
+ ] }),
166
+ /* @__PURE__ */ jsx(ShippingSettings, { provider, variant: "delivery" })
167
+ ] });
168
+ }
169
+
170
+ export { DeliveryStoreSettings };
171
+ //# sourceMappingURL=DeliveryStoreSettings-L2RXOVB6.js.map
172
+ //# sourceMappingURL=DeliveryStoreSettings-L2RXOVB6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/DeliveryStoreSettings.tsx"],"names":[],"mappings":"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","file":"DeliveryStoreSettings-L2RXOVB6.js","sourcesContent":["import React from 'react'\nimport { SettingsGroup, TextRow, useSettingKeys } from '@fayz-ai/admin'\nimport { useActiveUnitId } from '@fayz-ai/core'\nimport { Input } from '@fayz-ai/ui'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { ShippingSettings } from './ShippingSettings'\n\n/**\n * What a delivery store sets for its SITE, inside Configurações › Delivery.\n *\n * plugin-orders owns that screen (it also lists the marketplaces), but every\n * number here is the shop's: the fee and free delivery are the same\n * plg_shop_shipping_settings the storefront quote charges from, the regions are\n * the shop's zones, and the minimum and the estimate are plg_shop_settings\n * (0130). Registered as `shop.delivery-settings` so the orders plugin can draw\n * it without importing the shop — the same seam as `orders.detail`.\n *\n * Before this the Delivery screen saved its own copies in tenants.settings,\n * badged «Em breve», and the site never read them.\n */\n\nfunction parseNumber(raw: string): number | null {\n const clean = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!clean.trim()) return null\n const n = Number(clean)\n return Number.isFinite(n) && n >= 0 ? n : NaN\n}\n\nconst text = (v: number | null | undefined) => (v == null ? '' : String(v).replace('.', ','))\n\nfunction NumberRow({ label, description, hint, value, onCommit, placeholder, integer }: {\n label: string\n description: string\n hint?: string\n value: number | null | undefined\n onCommit: (next: number | null) => void\n placeholder?: string\n integer?: boolean\n}) {\n const [draft, setDraft] = React.useState(() => text(value))\n const [invalid, setInvalid] = React.useState(false)\n React.useEffect(() => { setDraft(text(value)) }, [value])\n return (\n <TextRow\n label={label}\n description={description}\n value={draft}\n onChange={(next) => { setDraft(next); setInvalid(false) }}\n onBlurCommit={() => {\n const parsed = parseNumber(draft)\n if (Number.isNaN(parsed)) { setInvalid(true); return }\n setInvalid(false)\n onCommit(parsed == null ? null : integer ? Math.round(parsed) : Math.round(parsed * 100) / 100)\n }}\n invalid={invalid}\n hint={invalid ? 'Use um número, como 9,90.' : hint}\n placeholder={placeholder}\n />\n )\n}\n\n/**\n * The estimate in the unit the store thinks in. A delivery promised for the\n * next day is typed as 24 h, not 1440 min; it is always STORED in minutes.\n */\nfunction EtaRow({ minutes, onCommit }: { minutes: number | null | undefined; onCommit: (next: number | null) => void }) {\n const [unit, setUnit] = React.useState<'min' | 'h'>(() => (minutes != null && minutes >= 60 && minutes % 60 === 0 ? 'h' : 'min'))\n const shown = (m: number | null | undefined, u: 'min' | 'h') => (m == null ? '' : u === 'h' ? String(+(m / 60).toFixed(2)).replace('.', ',') : String(m))\n const [draft, setDraft] = React.useState(() => shown(minutes, unit))\n const [invalid, setInvalid] = React.useState(false)\n React.useEffect(() => { setDraft(shown(minutes, unit)) }, [minutes, unit])\n\n const commit = (raw: string, u: 'min' | 'h') => {\n const parsed = parseNumber(raw)\n if (Number.isNaN(parsed)) { setInvalid(true); return }\n setInvalid(false)\n onCommit(parsed == null || parsed === 0 ? null : Math.round(u === 'h' ? parsed * 60 : parsed))\n }\n\n return (\n <div className=\"py-3\">\n <p className=\"text-sm font-medium\">Tempo estimado</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n Da confirmação até a porta. Aparece no topo do cardápio e no aviso de pedido aceito — de 24 h em diante, como «até 24 h».\n </p>\n <div className=\"mt-2 flex max-w-xs items-center gap-2\">\n <Input\n value={draft}\n placeholder=\"Não informar\"\n aria-invalid={invalid || undefined}\n aria-label=\"Tempo estimado\"\n onChange={(e) => { setDraft(e.target.value); setInvalid(false) }}\n onBlur={() => commit(draft, unit)}\n onKeyDown={(e) => { if (e.key === 'Enter') commit(draft, unit) }}\n data-testid=\"delivery-eta-value\"\n />\n <div role=\"radiogroup\" aria-label=\"Unidade\" className=\"flex shrink-0 rounded-md border p-0.5 text-xs\">\n {(['min', 'h'] as const).map((u) => (\n <button\n key={u}\n type=\"button\"\n role=\"radio\"\n aria-checked={unit === u}\n data-testid={`delivery-eta-unit-${u}`}\n onClick={() => { if (u !== unit) { setUnit(u); setDraft(shown(minutes, u)) } }}\n className={`rounded px-2.5 py-1 ${unit === u ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {u === 'min' ? 'minutos' : 'horas'}\n </button>\n ))}\n </div>\n </div>\n <p className={`mt-1 text-xs ${invalid ? 'text-destructive' : 'text-muted-foreground'}`}>\n {invalid ? 'Use um número, como 45 ou 1,5.' : 'Vazio = não mostrar.'}\n </p>\n </div>\n )\n}\n\n/**\n * Where the top bar's «Delivery» chip (control-app resto-toggles) stands:\n * `delivery.enabled` at the active unit (or the house), unset reading as open.\n * Read-only on purpose — the chip is the one switch. useSettingKeys keeps every\n * reader of the key in step, so this line moves when the chip is flipped. Off,\n * the site shows delivery closed and refuses orders (shop 0131).\n */\nfunction DeliverySwitchStatus() {\n const unitId = useActiveUnitId()\n const s = useSettingKeys(['delivery.enabled'], unitId ?? null)\n if (!s.supported || s.loading || s.loadError) return null\n const open = s.values['delivery.enabled'] !== false\n return (\n <p data-testid=\"delivery-switch-status\" className=\"flex items-center gap-2 py-3 text-sm\">\n <span className={`h-2 w-2 shrink-0 rounded-full ${open ? 'bg-emerald-500' : 'bg-amber-500'}`} aria-hidden />\n {open\n ? <span><span className=\"font-medium\">Delivery aberto agora</span><span className=\"text-muted-foreground\"> · pause pela chave Delivery no topo</span></span>\n : <span><span className=\"font-medium\">Delivery pausado</span><span className=\"text-muted-foreground\"> · o site mostra fechado</span></span>}\n </p>\n )\n}\n\nexport function DeliveryStoreSettings({ provider }: { provider?: ShopProviderResolver }) {\n const settings = useStoreSettings(provider)\n const { value, set } = settings\n\n return (\n <div className=\"space-y-4\" data-testid=\"delivery-store-settings\">\n <SettingsGroup\n title=\"Pedidos do site\"\n description=\"O delivery do site abre e pausa pela chave Delivery no topo do sistema.\"\n >\n <DeliverySwitchStatus />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Pedido mínimo e tempo\"\n description=\"O que o site exige e promete em cada pedido de delivery.\"\n >\n <NumberRow\n label=\"Pedido mínimo\"\n description=\"Valor dos itens abaixo do qual o site não fecha o pedido.\"\n hint=\"Vazio ou zero = sem mínimo.\"\n value={value.minOrderTotal}\n placeholder=\"Sem mínimo\"\n onCommit={(next) => set({ minOrderTotal: next ?? null })}\n />\n <EtaRow minutes={value.deliveryEtaMinutes} onCommit={(next) => set({ deliveryEtaMinutes: next })} />\n </SettingsGroup>\n {settings.error && <p className=\"px-1 text-xs text-destructive\">Não foi possível salvar: {settings.error}</p>}\n\n {/* The fee, free delivery and the regions: the same component the\n e-commerce «Entrega» screen draws, in its delivery cut. */}\n <ShippingSettings provider={provider} variant=\"delivery\" />\n </div>\n )\n}\n"]}
@@ -0,0 +1,61 @@
1
+ import { ChoiceCards } from './chunk-4JM32Z7J.js';
2
+ import { SettingsState } from './chunk-FQQMEM26.js';
3
+ import { useStoreSettings } from './chunk-R5CUDFOI.js';
4
+ import './chunk-YUG6XQHJ.js';
5
+ import './chunk-2MXOKJQO.js';
6
+ import { SettingsGroup } from '@fayz-ai/admin';
7
+ import { Info } from 'lucide-react';
8
+ import { jsxs, jsx } from 'react/jsx-runtime';
9
+
10
+ var POLICIES = [
11
+ {
12
+ value: "on_payment",
13
+ label: "Dar baixa quando o pagamento for confirmado",
14
+ description: "A remessa \xE9 criada assim que o pedido \xE9 pago \u2014 pelo gateway ou por voc\xEA aqui no admin. \xC9 a op\xE7\xE3o segura: nada sai antes de o dinheiro entrar."
15
+ },
16
+ {
17
+ value: "always",
18
+ label: "Dar baixa em todo pedido, automaticamente",
19
+ description: "A remessa nasce junto com o pedido, pago ou n\xE3o. Para quem cobra na entrega ou separa antes de receber."
20
+ },
21
+ {
22
+ value: "never",
23
+ label: "N\xE3o dar baixa autom\xE1tica",
24
+ description: "Cada remessa \xE9 criada \xE0 m\xE3o, na tela do pedido. \xC9 o padr\xE3o."
25
+ }
26
+ ];
27
+ function FulfillmentSettings({ provider }) {
28
+ const settings = useStoreSettings(provider, { autoFulfill: "never" });
29
+ const { value, set } = settings;
30
+ const current = value.autoFulfill ?? "never";
31
+ return /* @__PURE__ */ jsxs(SettingsState, { ...settings, children: [
32
+ /* @__PURE__ */ jsx(
33
+ SettingsGroup,
34
+ {
35
+ title: "Baixa autom\xE1tica",
36
+ description: "Quando um registro de remessa \xE9 criado para um pedido novo.",
37
+ children: /* @__PURE__ */ jsx(
38
+ ChoiceCards,
39
+ {
40
+ label: "Baixa autom\xE1tica",
41
+ choices: POLICIES,
42
+ value: current,
43
+ onChange: (autoFulfill) => set({ autoFulfill })
44
+ }
45
+ )
46
+ }
47
+ ),
48
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 rounded-lg border bg-muted/30 p-3 text-xs text-muted-foreground", children: [
49
+ /* @__PURE__ */ jsx(Info, { className: "mt-0.5 h-3.5 w-3.5 shrink-0" }),
50
+ /* @__PURE__ */ jsxs("span", { children: [
51
+ "A remessa criada aqui nasce ",
52
+ /* @__PURE__ */ jsx("strong", { className: "font-medium", children: "pendente" }),
53
+ ", com os itens do pedido e sem transportadora nem c\xF3digo de rastreio \u2014 quem despacha preenche isso na tela do pedido. Pedidos que j\xE1 foram feitos n\xE3o s\xE3o afetados."
54
+ ] })
55
+ ] })
56
+ ] });
57
+ }
58
+
59
+ export { FulfillmentSettings };
60
+ //# sourceMappingURL=FulfillmentSettings-PW233UOK.js.map
61
+ //# sourceMappingURL=FulfillmentSettings-PW233UOK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/FulfillmentSettings.tsx"],"names":[],"mappings":";;;;;;;;;AAqBA,IAAM,QAAA,GAAiF;AAAA,EACrF;AAAA,IACE,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,6CAAA;AAAA,IACP,WAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,2CAAA;AAAA,IACP,WAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO,gCAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB,CAAA;AAkBO,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAS,EAA6B;AAC1E,EAAA,MAAM,WAAW,gBAAA,CAAiB,QAAA,EAAU,EAAE,WAAA,EAAa,SAAS,CAAA;AACpE,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AACvB,EAAA,MAAM,OAAA,GAAkB,MAAM,WAAA,IAAe,OAAA;AAE7C,EAAA,uBACE,IAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,qBAAA;AAAA,QACN,WAAA,EAAY,gEAAA;AAAA,QAEZ,QAAA,kBAAA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,qBAAA;AAAA,YACN,OAAA,EAAS,QAAA;AAAA,YACT,KAAA,EAAO,OAAA;AAAA,YACP,UAAU,CAAC,WAAA,KAAgB,GAAA,CAAI,EAAE,aAAa;AAAA;AAAA;AAChD;AAAA,KACF;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,6BAAA,EAA8B,CAAA;AAAA,2BAC7C,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,8BAAA;AAAA,wBACwB,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,QAAS;AAAA,OAAA,EAG/E;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"FulfillmentSettings-PW233UOK.js","sourcesContent":["import React from 'react'\nimport { SettingsGroup } from '@fayz-ai/admin'\nimport { Info } from 'lucide-react'\nimport type { StoreSettings } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { ChoiceCards } from './ChoiceCards'\n\nexport interface FulfillmentSettingsProps {\n provider?: ShopProviderResolver\n}\n\ntype Policy = NonNullable<StoreSettings['autoFulfill']>\n\n/**\n * Three mutually exclusive policies with a paragraph each — a radio, not a\n * dropdown. The difference between them is a sentence long, and a dropdown shows\n * one option at a time: choosing between \"quando o pagamento cair\" and \"sempre\"\n * requires reading both, which means both have to be on screen.\n */\nconst POLICIES: ReadonlyArray<{ value: Policy; label: string; description: string }> = [\n {\n value: 'on_payment',\n label: 'Dar baixa quando o pagamento for confirmado',\n description:\n 'A remessa é criada assim que o pedido é pago — pelo gateway ou por você aqui no admin. É a opção segura: nada sai antes de o dinheiro entrar.',\n },\n {\n value: 'always',\n label: 'Dar baixa em todo pedido, automaticamente',\n description:\n 'A remessa nasce junto com o pedido, pago ou não. Para quem cobra na entrega ou separa antes de receber.',\n },\n {\n value: 'never',\n label: 'Não dar baixa automática',\n description: 'Cada remessa é criada à mão, na tela do pedido. É o padrão.',\n },\n]\n\n/**\n * Fulfillment — se a remessa nasce sozinha.\n *\n * Uma decisão só, e ela é sobre QUANDO um registro de remessa passa a existir —\n * não sobre quem entrega. `public.fulfillments` e `fulfillment_items` já existem\n * desde a 0018, com o `fulfillment_status` do pedido DERIVADO deles por trigger;\n * a política escolhida aqui é lida por um trigger da 0045 que insere a remessa\n * com os itens do pedido, exatamente como a tela do pedido faria à mão. Nada\n * aqui escreve `fulfillment_status`: ele continua derivado, que é o que o impede\n * de divergir da realidade.\n *\n * Pedidos que já existem não são afetados. A política vale para o que vem\n * depois, e isso é dito na tela: um lojista que liga a baixa automática\n * esperando ver os pedidos de ontem despacharem tem uma surpresa pior do que a\n * frase.\n */\nexport function FulfillmentSettings({ provider }: FulfillmentSettingsProps) {\n const settings = useStoreSettings(provider, { autoFulfill: 'never' })\n const { value, set } = settings\n const current: Policy = value.autoFulfill ?? 'never'\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Baixa automática\"\n description=\"Quando um registro de remessa é criado para um pedido novo.\"\n >\n <ChoiceCards\n label=\"Baixa automática\"\n choices={POLICIES}\n value={current}\n onChange={(autoFulfill) => set({ autoFulfill })}\n />\n </SettingsGroup>\n\n <div className=\"flex items-start gap-2 rounded-lg border bg-muted/30 p-3 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span>\n A remessa criada aqui nasce <strong className=\"font-medium\">pendente</strong>, com os itens\n do pedido e sem transportadora nem código de rastreio — quem despacha preenche isso na tela\n do pedido. Pedidos que já foram feitos não são afetados.\n </span>\n </div>\n </SettingsState>\n )\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { marketsRegistry } from './chunk-STZYH32S.js';
2
+ import './chunk-YUG6XQHJ.js';
3
+ import './chunk-2MXOKJQO.js';
4
+ import { RegistryCrudView } from '@fayz-ai/admin';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ function MarketsSettings({ basePath = "/settings/shop-markets" }) {
8
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
9
+ /* @__PURE__ */ jsxs("div", { className: "px-1 pt-4", children: [
10
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: "Mercados" }),
11
+ /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: marketsRegistry.description })
12
+ ] }),
13
+ /* @__PURE__ */ jsx(RegistryCrudView, { registry: marketsRegistry, basePath, embedded: true })
14
+ ] });
15
+ }
16
+
17
+ export { MarketsSettings };
18
+ //# sourceMappingURL=MarketsSettings-YUEVDLIR.js.map
19
+ //# sourceMappingURL=MarketsSettings-YUEVDLIR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/MarketsSettings.tsx"],"names":[],"mappings":";;;;;;AAWO,SAAS,eAAA,CAAgB,EAAE,QAAA,GAAW,wBAAA,EAAyB,EAA0B;AAC9F,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBAC9C,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EAAwC,0BAAgB,WAAA,EAAY;AAAA,KAAA,EACnF,CAAA;AAAA,wBACC,gBAAA,EAAA,EAAiB,QAAA,EAAU,eAAA,EAAiB,QAAA,EAAoB,UAAQ,IAAA,EAAC;AAAA,GAAA,EAC5E,CAAA;AAEJ","file":"MarketsSettings-YUEVDLIR.js","sourcesContent":["import React from 'react'\nimport { RegistryCrudView } from '@fayz-ai/admin'\nimport { marketsRegistry } from '../data/registries'\n\n/**\n * Mercados — onde a loja vende (0116).\n *\n * Um mercado por moeda e região: o Brasil em real, a Europa em euro. O país do\n * comprador escolhe o mercado na vitrine, e o checkout cobra na moeda dele.\n * O cadastro é o par de sempre, `PluginRegistryDef` + `RegistryCrudView`.\n */\nexport function MarketsSettings({ basePath = '/settings/shop-markets' }: { basePath?: string }) {\n return (\n <div className=\"space-y-3\">\n <div className=\"px-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Mercados</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{marketsRegistry.description}</p>\n </div>\n <RegistryCrudView registry={marketsRegistry} basePath={basePath} embedded />\n </div>\n )\n}\n"]}