@fayz-ai/plugin-orders 0.22.7 → 0.23.0-canary.20261027164140

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/integrations/shared.ts","../src/integrations/ifood/storePanel.ts","../src/integrations/ifood/catalogPanel.ts","../src/integrations/ifood/IfoodMenuPanel.tsx","../src/integrations/ifood/IfoodStorePanel.tsx","../src/integrations/ifood/connectorDef.tsx","../src/integrations/99food/connectorDef.tsx","../src/integrations/keeta/connectorDef.tsx","../src/integrations/ubereats/connectorDef.tsx","../src/integrations/rappi/connectorDef.tsx","../src/integrations/aiqfome/connectorDef.tsx","../src/settings/v1-settings.ts","../src/index.ts"],"names":["getSupabaseClientOptional","getActiveTenantId","now","React","ImageIcon","useTranslation","jsx","jsxs","Button","RefreshCw","Fragment","store","Play","Input","Pause","Loader2","Trash2","Plus","storeId","createConnectionStore","connectionStatus","settingsStatus","connectionSettings","connectionRuns","SERVICE_MODE_LABELS","fayzConnectorOAuth","tl"],"mappings":"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","file":"index.js","sourcesContent":["import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst orderSourceEntity: EntityDef = {\n name: 'Order Source',\n namePlural: 'Order Sources',\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'order_sources', tenantScoped: true },\n}\n\nexport const ordersRegistries: PluginRegistryDef[] = [\n {\n id: 'order-sources',\n entity: orderSourceEntity,\n icon: 'Globe',\n description: 'Order sources and delivery platforms',\n display: 'table',\n seedData: [\n { id: 'os-dine', name: 'Dine-in', icon: '🍽️', isActive: true },\n { id: 'os-takeout', name: 'Takeout', icon: '🥡', isActive: true },\n { id: 'os-ifood', name: 'iFood', icon: '🔴', isActive: true },\n { id: 'os-99food', name: '99Food', icon: '🟡', isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'orders.title': 'Orders',\n 'orders.detail.addItem': 'Add item',\n 'orders.detail.searchMenu': 'Search the menu…',\n 'orders.detail.cancel': 'Cancel order',\n 'orders.detail.cancelConfirm': 'Cancel {reference}? This cannot be undone.',\n 'orders.nav.kanban': 'Orders',\n 'orders.nav.list': 'History',\n 'orders.nav.new': 'New Order',\n 'orders.nav.dashboard': 'Dashboard',\n 'orders.list.column.order': 'Order',\n 'orders.list.column.customer': 'Customer',\n 'orders.list.column.total': 'Total',\n 'orders.list.column.status': 'Status',\n 'orders.list.searchPlaceholder': 'Search by number, customer or table…',\n 'orders.kanban.title': 'Orders',\n 'orders.kanban.subtitle': 'Active orders',\n 'orders.kanban.noOrders': 'No active orders',\n 'orders.kanban.noOrdersDesc': 'Orders will appear here as they come in',\n 'orders.kanban.newOrder': 'New Order',\n 'orders.kanban.advance': 'Advance',\n // O verbo de cada passo, chaveado pelo estado ALVO. E o que o botao do\n // cartao diz: quem esta no salao nao \"avanca\" um pedido, ele confirma,\n // prepara, serve ou despacha.\n 'orders.advance.draft': 'Save draft',\n 'orders.advance.new': 'Send',\n 'orders.advance.confirmed': 'Confirm',\n 'orders.advance.preparing': 'Start prep',\n 'orders.advance.ready': 'Mark ready',\n 'orders.advance.served': 'Serve',\n 'orders.advance.picked_up': 'Hand over',\n 'orders.advance.dispatched': 'Dispatch',\n 'orders.advance.delivered': 'Confirm delivery',\n 'orders.advance.completed': 'Complete',\n 'orders.advance.cancelled': 'Cancel',\n 'orders.kanban.cancel': 'Cancel Order',\n 'orders.kanban.column.new': 'New',\n 'orders.kanban.column.confirmed': 'Confirmed',\n 'orders.kanban.column.open': 'Open',\n 'orders.kanban.column.preparing': 'Preparing',\n 'orders.kanban.column.ready': 'Ready',\n 'orders.kanban.column.out': 'Out',\n 'orders.kanban.column.served': 'Served',\n 'orders.kanban.column.completed': 'Completed',\n 'orders.kanban.column.cancelled': 'Cancelled',\n 'orders.detail.title': 'Order Details',\n 'orders.detail.items': 'Items',\n 'orders.detail.table': 'Table',\n 'orders.detail.customer': 'Customer',\n 'orders.detail.waiter': 'Waiter',\n 'orders.detail.source': 'Source',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Discount',\n 'orders.detail.tax': 'Tax',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Notes',\n 'orders.newOrder.title': 'New Order',\n 'orders.newOrder.selectKind': 'Order type',\n 'orders.newOrder.dineIn': 'Dine-in',\n 'orders.newOrder.takeout': 'Takeout',\n 'orders.delivery.settings': 'Delivery settings',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Select table',\n 'orders.newOrder.addItems': 'Add items',\n 'orders.newOrder.searchItems': 'Search menu...',\n 'orders.newOrder.noItems': 'No items added yet',\n 'orders.newOrder.confirm': 'Place Order',\n 'orders.newOrder.cancel': 'Cancel',\n 'orders.list.title': 'Order History',\n 'orders.list.subtitle': 'All orders',\n 'orders.list.search': 'Search orders...',\n 'orders.list.noOrders': 'No orders found',\n 'orders.source.dine_in': 'Dine-in',\n 'orders.source.takeout': 'Takeout',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Orders Settings',\n // iFood store panel (integrations > iFood > Store)\n 'orders.ifoodStore.tab': 'Store',\n 'orders.ifoodStore.loading': 'Checking the store on iFood…',\n 'orders.ifoodStore.retry': 'Try again',\n 'orders.ifoodStore.store': 'Store',\n 'orders.ifoodStore.checkedAt': 'Checked at {{time}}',\n 'orders.ifoodStore.view.store': \"Store\",\n 'orders.ifoodStore.view.menu': \"iFood menu\",\n 'orders.ifoodMenu.newCategory': \"New category\",\n 'orders.ifoodMenu.createCategory': \"Create category\",\n 'orders.ifoodMenu.categoryCreated': \"Category created on iFood.\",\n 'orders.ifoodMenu.refresh': \"Refresh menu\",\n 'orders.ifoodMenu.refreshed': \"Menu read from iFood.\",\n 'orders.ifoodMenu.empty': \"This store’s iFood menu is empty.\",\n 'orders.ifoodMenu.productCountOne': \"1 product\",\n 'orders.ifoodMenu.productCount': \"{{n}} products\",\n 'orders.ifoodMenu.newItem': \"New product\",\n 'orders.ifoodMenu.editItem': \"Edit {{name}}\",\n 'orders.ifoodMenu.edit': \"Edit\",\n 'orders.ifoodMenu.pause': \"Pause\",\n 'orders.ifoodMenu.resume': \"Resume\",\n 'orders.ifoodMenu.available': \"Available\",\n 'orders.ifoodMenu.paused': \"Paused\",\n 'orders.ifoodMenu.pauseSelected': \"Pause {{n}} selected\",\n 'orders.ifoodMenu.resumeSelected': \"Resume {{n}} selected\",\n 'orders.ifoodMenu.select': \"Select {{name}}\",\n 'orders.ifoodMenu.saved': \"Sent to iFood.\",\n 'orders.ifoodMenu.bulkFailed': \"iFood refused {{n}} change(s): {{codes}}\",\n 'orders.ifoodMenu.minMax': \"min {{min}}, max {{max}}\",\n 'orders.ifoodMenu.pdvCode': \"PDV code\",\n 'orders.ifoodMenu.link': \"Link\",\n 'orders.ifoodMenu.unlink': \"Unlink\",\n 'orders.ifoodMenu.linked': \"Linked to {{name}}.\",\n 'orders.ifoodMenu.unlinked': \"Link removed.\",\n 'orders.ifoodMenu.linkTitle': \"Link to one of your products\",\n 'orders.ifoodMenu.searchProduct': \"Search product\",\n 'orders.ifoodMenu.noProducts': \"No product found.\",\n 'orders.ifoodMenu.name': \"Name\",\n 'orders.ifoodMenu.price': \"Price (R$)\",\n 'orders.ifoodMenu.status': \"Status\",\n 'orders.ifoodMenu.description': \"Description\",\n 'orders.ifoodMenu.groupName': \"Complement group\",\n 'orders.ifoodMenu.min': \"Min\",\n 'orders.ifoodMenu.max': \"Max\",\n 'orders.ifoodMenu.optionName': \"Complement\",\n 'orders.ifoodMenu.addOption': \"Add complement\",\n 'orders.ifoodMenu.addGroup': \"Add complement group\",\n 'orders.ifoodMenu.removeGroup': \"Remove group\",\n 'orders.ifoodMenu.removeOption': \"Remove complement\",\n 'orders.ifoodMenu.photoAdd': \"Add photo\",\n 'orders.ifoodMenu.photoChange': \"Change photo\",\n 'orders.ifoodMenu.photoSending': \"Sending photo…\",\n 'orders.ifoodMenu.photoSaved': \"Photo updated at iFood.\",\n 'orders.ifoodMenu.photoFailed': \"The photo was not accepted (PNG or JPEG, up to 3.9 MB).\",\n 'orders.ifoodMenu.save': \"Save on iFood\",\n 'orders.ifoodMenu.deleteCategory': \"Delete category\",\n 'orders.ifoodMenu.deleteItem': \"Remove from menu\",\n 'orders.ifoodMenu.confirmCategory': \"Delete the category \\\"{{name}}\\\" and its {{n}} product(s) at iFood?\",\n 'orders.ifoodMenu.confirmGroup': \"Remove the group \\\"{{name}}\\\" and its {{n}} complement(s)? It goes to iFood when you save.\",\n 'orders.ifoodMenu.confirmOption': \"Remove the complement \\\"{{name}}\\\"? It goes to iFood when you save.\",\n 'orders.ifoodMenu.confirmItem': \"Remove \\\"{{name}}\\\" from this iFood menu?\",\n 'orders.ifoodMenu.confirmDelete': \"Delete\",\n 'orders.ifoodMenu.deleting': \"deleting at iFood…\",\n 'orders.ifoodMenu.deleted': \"Deleted at iFood.\",\n 'orders.ifoodMenu.sent': \"Sent to iFood. Waiting for iFood to confirm…\",\n 'orders.ifoodMenu.confirmed': \"Confirmed by iFood.\",\n 'orders.ifoodMenu.confirming': \"waiting for iFood…\",\n 'orders.ifoodMenu.creating': \"creating at iFood…\",\n 'orders.ifoodMenu.notConfirmed': \"iFood accepted it but does not show the change yet. Refresh the menu in a few minutes.\",\n 'orders.ifoodMenu.selectedCount': \"{{n}} selected\",\n 'orders.ifoodMenu.cancel': \"Cancel\",\n 'orders.ifoodStore.linked.title': 'Linked stores',\n 'orders.ifoodStore.linked.none': 'No iFood store is linked to this account.',\n 'orders.ifoodStore.linked.authorized': 'authorized',\n 'orders.ifoodStore.linked.revoked': 'not authorized at iFood',\n 'orders.ifoodStore.linked.open': 'Open',\n 'orders.ifoodStore.validation.is.connected.config': 'Connection to iFood',\n 'orders.ifoodStore.validation.is.not.connected.config': 'Connection to iFood',\n 'orders.ifoodStore.validation.during.opening-hours.config': 'Within opening hours',\n 'orders.ifoodStore.validation.has.unavailabilities.active': 'Active pauses',\n 'orders.ifoodStore.validation.state.OK': 'ok',\n 'orders.ifoodStore.validation.state.WARNING': 'warning',\n 'orders.ifoodStore.validation.state.ERROR': 'blocks orders',\n 'orders.ifoodStore.refresh': 'Refresh store',\n 'orders.ifoodStore.refreshed': 'Store refreshed.',\n 'orders.ifoodStore.status.title': 'Status on iFood',\n 'orders.ifoodStore.status.receiving': 'Receiving orders',\n 'orders.ifoodStore.status.notReceiving': 'Not receiving orders',\n 'orders.ifoodStore.state.OK': 'Open',\n 'orders.ifoodStore.state.WARNING': 'Open with restrictions',\n 'orders.ifoodStore.state.CLOSED': 'Closed',\n 'orders.ifoodStore.state.ERROR': 'Closed (check)',\n 'orders.ifoodStore.state.UNKNOWN': 'No status',\n 'orders.ifoodStore.pause.title': 'Pauses',\n 'orders.ifoodStore.pause.defaultReason': 'Operational pause',\n 'orders.ifoodStore.pause.reason': 'Reason',\n 'orders.ifoodStore.pause.minutes': 'Minutes',\n 'orders.ifoodStore.pause.action': 'Pause store',\n 'orders.ifoodStore.pause.done': 'Pause created on iFood.',\n 'orders.ifoodStore.pause.remove': 'Remove pause',\n 'orders.ifoodStore.pause.removed': 'Pause removed at iFood.',\n 'orders.ifoodStore.pause.removing': 'removing at iFood…',\n 'orders.ifoodStore.pause.waiting': 'waiting for iFood to list it',\n 'orders.ifoodStore.pause.none': 'No active or scheduled pause.',\n 'orders.ifoodStore.reopen.action': 'Reopen store',\n 'orders.ifoodStore.reopen.done': 'Store reopened: every pause was removed.',\n 'orders.ifoodStore.hours.title': 'Opening hours',\n 'orders.ifoodStore.hours.replaces': 'Saving replaces the whole week on iFood: days without a shift are closed.',\n 'orders.ifoodStore.hours.until': 'to',\n 'orders.ifoodStore.hours.removeShift': 'Remove shift',\n 'orders.ifoodStore.hours.addShift': 'Shift',\n 'orders.ifoodStore.hours.save': 'Save hours',\n 'orders.ifoodStore.hours.waiting': 'Saved at iFood. Waiting for iFood\\'s list to update…',\n 'orders.ifoodStore.hours.saved': 'Hours saved on iFood.',\n 'orders.ifoodStore.hours.discard': 'Discard',\n 'orders.ifoodStore.day.MONDAY': 'Monday',\n 'orders.ifoodStore.day.TUESDAY': 'Tuesday',\n 'orders.ifoodStore.day.WEDNESDAY': 'Wednesday',\n 'orders.ifoodStore.day.THURSDAY': 'Thursday',\n 'orders.ifoodStore.day.FRIDAY': 'Friday',\n 'orders.ifoodStore.day.SATURDAY': 'Saturday',\n 'orders.ifoodStore.day.SUNDAY': 'Sunday',\n 'orders.ifoodStore.log.title': 'Integration log',\n 'orders.ifoodStore.log.desc': 'Calls made to iFood for this store, newest first.',\n 'orders.ifoodStore.log.time': 'Time',\n 'orders.ifoodStore.log.method': 'Method',\n 'orders.ifoodStore.log.endpoint': 'Endpoint',\n 'orders.ifoodStore.log.response': 'Response',\n 'orders.ifoodStore.log.see': 'see ({{ms}} ms)',\n 'orders.ifoodStore.log.empty': 'No call recorded yet.',\n 'orders.ifoodStore.error.overlap': 'A pause already covers this time. Remove it or pick another period.',\n 'orders.ifoodStore.error.pauseRange': 'A pause lasts from 1 minute to 7 days.',\n 'orders.ifoodStore.error.pauseReason': 'Give a reason for the pause.',\n 'orders.ifoodStore.error.hoursOverlap': 'Two shifts on the same day overlap. Adjust them and save again.',\n 'orders.ifoodStore.error.hoursMidnight': 'A shift ends after 23:59. Split it across two days.',\n 'orders.ifoodStore.error.hoursEmpty': 'Add at least one shift. To close the store for a while, pause it.',\n 'orders.ifoodStore.error.hoursTime': 'Invalid time. Use HH:MM.',\n 'orders.ifoodStore.error.hoursDuration': 'A shift must end after it starts.',\n 'orders.ifoodStore.error.noStore': 'This account has no iFood store linked yet.',\n 'orders.ifoodStore.error.notAllowed': 'You may not manage the integrations of this account.',\n 'orders.ifoodStore.error.signIn': 'Your session expired. Sign in again.',\n 'orders.ifoodStore.error.credentials': 'iFood refused the app credentials (401). Contact support.',\n 'orders.ifoodStore.error.unavailable': 'iFood is unavailable right now (5xx). Try again shortly.',\n 'orders.ifoodStore.error.serviceDown': 'The integration service is unavailable. Try again shortly.',\n 'orders.ifoodStore.error.invalid': 'iFood refused the data sent (400). Check the fields and try again.',\n 'orders.ifoodStore.error.forbidden': 'iFood denied access to this store (403): the app has no permission for it.',\n 'orders.ifoodStore.error.notFound': 'iFood did not find it (404).',\n 'orders.ifoodStore.error.rateLimit': 'Too many requests to iFood (429). Wait 30 seconds and try again.',\n 'orders.ifoodStore.error.nameRequired': \"Enter a name.\",\n 'orders.ifoodStore.error.nameTooLong': \"The name is longer than 100 characters.\",\n 'orders.ifoodStore.error.descriptionTooLong': \"The description is longer than 500 characters.\",\n 'orders.ifoodStore.error.badPrice': \"Invalid price: a product must cost more than zero and a complement can't be negative.\",\n 'orders.ifoodStore.error.groupLimits': \"Check the complement group's minimum and maximum: the maximum must be at least 1 and not below the minimum.\",\n 'orders.ifoodStore.error.groupEmpty': \"Every complement group needs at least one complement.\",\n 'orders.ifoodStore.error.categoryRequired': \"Choose the product's category.\",\n 'orders.ifoodStore.error.badImage': \"iFood takes PNG or JPEG photos. Send the photo in one of those formats.\",\n 'orders.ifoodStore.error.imageTooBig': \"The photo is larger than 3.9 MB, iFood's limit. Send a smaller photo.\",\n 'orders.ifoodStore.error.generic': 'The action could not be completed.',\n}\n","export const ptBR: Record<string, string> = {\n 'orders.title': 'Pedidos',\n 'orders.detail.addItem': 'Lançar item',\n 'orders.detail.searchMenu': 'Buscar no cardápio…',\n 'orders.detail.cancel': 'Cancelar pedido',\n 'orders.detail.cancelConfirm': 'Cancelar {reference}? Não dá para desfazer.',\n 'orders.nav.kanban': 'Pedidos',\n 'orders.nav.list': 'Histórico',\n 'orders.nav.new': 'Novo Pedido',\n 'orders.nav.dashboard': 'Painel',\n 'orders.list.column.order': 'Pedido',\n 'orders.list.column.customer': 'Cliente',\n 'orders.list.column.total': 'Total',\n 'orders.list.column.status': 'Estado',\n 'orders.list.searchPlaceholder': 'Buscar por número, cliente ou mesa…',\n 'orders.kanban.title': 'Pedidos',\n 'orders.kanban.subtitle': 'Pedidos ativos',\n 'orders.kanban.noOrders': 'Nenhum pedido ativo',\n 'orders.kanban.noOrdersDesc': 'Os pedidos aparecerão aqui conforme chegarem',\n 'orders.kanban.newOrder': 'Novo Pedido',\n 'orders.kanban.advance': 'Avançar',\n // O verbo de cada passo, chaveado pelo estado ALVO. E o que o botao do\n // cartao diz: quem esta no salao nao \"avanca\" um pedido, ele confirma,\n // prepara, serve ou despacha.\n 'orders.advance.draft': 'Salvar rascunho',\n 'orders.advance.new': 'Enviar',\n 'orders.advance.confirmed': 'Confirmar',\n 'orders.advance.preparing': 'Preparar',\n 'orders.advance.ready': 'Marcar pronto',\n 'orders.advance.served': 'Servir',\n 'orders.advance.picked_up': 'Entregar',\n 'orders.advance.dispatched': 'Despachar',\n 'orders.advance.delivered': 'Confirmar entrega',\n 'orders.advance.completed': 'Concluir',\n 'orders.advance.cancelled': 'Cancelar',\n 'orders.kanban.cancel': 'Cancelar Pedido',\n 'orders.kanban.column.new': 'Novo',\n 'orders.kanban.column.confirmed': 'Confirmado',\n 'orders.kanban.column.open': 'Aberta',\n 'orders.kanban.column.preparing': 'Preparando',\n 'orders.kanban.column.ready': 'Pronto',\n 'orders.kanban.column.out': 'Saiu',\n 'orders.kanban.column.served': 'Servido',\n 'orders.kanban.column.completed': 'Concluído',\n 'orders.kanban.column.cancelled': 'Cancelado',\n 'orders.detail.title': 'Detalhes do Pedido',\n 'orders.detail.items': 'Itens',\n 'orders.detail.table': 'Mesa',\n 'orders.detail.customer': 'Cliente',\n 'orders.detail.waiter': 'Garçom',\n 'orders.detail.source': 'Origem',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Desconto',\n 'orders.detail.tax': 'Imposto',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Observações',\n 'orders.newOrder.title': 'Novo Pedido',\n 'orders.newOrder.selectKind': 'Tipo de pedido',\n 'orders.newOrder.dineIn': 'Mesa',\n 'orders.newOrder.takeout': 'Para Viagem',\n 'orders.delivery.settings': 'Configurar entrega',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Selecionar mesa',\n 'orders.newOrder.addItems': 'Adicionar itens',\n 'orders.newOrder.searchItems': 'Buscar no cardápio...',\n 'orders.newOrder.noItems': 'Nenhum item adicionado',\n 'orders.newOrder.confirm': 'Fazer Pedido',\n 'orders.newOrder.cancel': 'Cancelar',\n 'orders.list.title': 'Histórico de Pedidos',\n 'orders.list.subtitle': 'Todos os pedidos',\n 'orders.list.search': 'Buscar pedidos...',\n 'orders.list.noOrders': 'Nenhum pedido encontrado',\n 'orders.source.dine_in': 'Mesa',\n 'orders.source.takeout': 'Para Viagem',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Configurações de Pedidos',\n // iFood store panel (integrations > iFood > Loja)\n 'orders.ifoodStore.tab': 'Loja',\n 'orders.ifoodStore.loading': 'Consultando a loja no iFood…',\n 'orders.ifoodStore.retry': 'Tentar novamente',\n 'orders.ifoodStore.store': 'Loja',\n 'orders.ifoodStore.checkedAt': 'Consultado às {{time}}',\n 'orders.ifoodStore.view.store': \"Loja\",\n 'orders.ifoodStore.view.menu': \"Cardápio iFood\",\n 'orders.ifoodMenu.newCategory': \"Nova categoria\",\n 'orders.ifoodMenu.createCategory': \"Criar categoria\",\n 'orders.ifoodMenu.categoryCreated': \"Categoria criada no iFood.\",\n 'orders.ifoodMenu.refresh': \"Atualizar cardápio\",\n 'orders.ifoodMenu.refreshed': \"Cardápio lido do iFood.\",\n 'orders.ifoodMenu.empty': \"O cardápio do iFood desta loja está vazio.\",\n 'orders.ifoodMenu.productCountOne': \"1 produto\",\n 'orders.ifoodMenu.productCount': \"{{n}} produtos\",\n 'orders.ifoodMenu.newItem': \"Novo produto\",\n 'orders.ifoodMenu.editItem': \"Editar {{name}}\",\n 'orders.ifoodMenu.edit': \"Editar\",\n 'orders.ifoodMenu.pause': \"Pausar\",\n 'orders.ifoodMenu.resume': \"Ativar\",\n 'orders.ifoodMenu.available': \"Disponível\",\n 'orders.ifoodMenu.paused': \"Pausado\",\n 'orders.ifoodMenu.pauseSelected': \"Pausar {{n}} selecionados\",\n 'orders.ifoodMenu.resumeSelected': \"Ativar {{n}} selecionados\",\n 'orders.ifoodMenu.select': \"Selecionar {{name}}\",\n 'orders.ifoodMenu.saved': \"Enviado ao iFood.\",\n 'orders.ifoodMenu.bulkFailed': \"O iFood recusou {{n}} alteração(ões): {{codes}}\",\n 'orders.ifoodMenu.minMax': \"mín. {{min}}, máx. {{max}}\",\n 'orders.ifoodMenu.pdvCode': \"Código PDV\",\n 'orders.ifoodMenu.link': \"Vincular\",\n 'orders.ifoodMenu.unlink': \"Desvincular\",\n 'orders.ifoodMenu.linked': \"Vinculado a {{name}}.\",\n 'orders.ifoodMenu.unlinked': \"Vínculo removido.\",\n 'orders.ifoodMenu.linkTitle': \"Vincular a um produto da casa\",\n 'orders.ifoodMenu.searchProduct': \"Buscar produto\",\n 'orders.ifoodMenu.noProducts': \"Nenhum produto encontrado.\",\n 'orders.ifoodMenu.name': \"Nome\",\n 'orders.ifoodMenu.price': \"Preço (R$)\",\n 'orders.ifoodMenu.status': \"Situação\",\n 'orders.ifoodMenu.description': \"Descrição\",\n 'orders.ifoodMenu.groupName': \"Grupo de complementos\",\n 'orders.ifoodMenu.min': \"Mín.\",\n 'orders.ifoodMenu.max': \"Máx.\",\n 'orders.ifoodMenu.optionName': \"Complemento\",\n 'orders.ifoodMenu.addOption': \"Adicionar complemento\",\n 'orders.ifoodMenu.addGroup': \"Adicionar grupo de complementos\",\n 'orders.ifoodMenu.removeGroup': \"Remover grupo\",\n 'orders.ifoodMenu.removeOption': \"Remover complemento\",\n 'orders.ifoodMenu.photoAdd': \"Adicionar foto\",\n 'orders.ifoodMenu.photoChange': \"Trocar foto\",\n 'orders.ifoodMenu.photoSending': \"Enviando foto…\",\n 'orders.ifoodMenu.photoSaved': \"Foto atualizada no iFood.\",\n 'orders.ifoodMenu.photoFailed': \"A foto não foi aceita (PNG ou JPEG, até 3,9 MB).\",\n 'orders.ifoodMenu.save': \"Salvar no iFood\",\n 'orders.ifoodMenu.deleteCategory': \"Excluir categoria\",\n 'orders.ifoodMenu.deleteItem': \"Tirar do cardápio\",\n 'orders.ifoodMenu.confirmCategory': \"Excluir a categoria \\\"{{name}}\\\" e os {{n}} produto(s) dela no iFood?\",\n 'orders.ifoodMenu.confirmGroup': \"Remover o grupo \\\"{{name}}\\\" e os {{n}} complemento(s) dele? Vai pro iFood quando você salvar.\",\n 'orders.ifoodMenu.confirmOption': \"Remover o complemento \\\"{{name}}\\\"? Vai pro iFood quando você salvar.\",\n 'orders.ifoodMenu.confirmItem': \"Tirar \\\"{{name}}\\\" deste cardápio do iFood?\",\n 'orders.ifoodMenu.confirmDelete': \"Excluir\",\n 'orders.ifoodMenu.deleting': \"excluindo no iFood…\",\n 'orders.ifoodMenu.deleted': \"Excluído no iFood.\",\n 'orders.ifoodMenu.sent': \"Enviado ao iFood. Aguardando o iFood confirmar…\",\n 'orders.ifoodMenu.confirmed': \"Confirmado pelo iFood.\",\n 'orders.ifoodMenu.confirming': \"aguardando o iFood…\",\n 'orders.ifoodMenu.creating': \"criando no iFood…\",\n 'orders.ifoodMenu.notConfirmed': \"O iFood aceitou, mas ainda não mostra a alteração. Atualize o cardápio em alguns minutos.\",\n 'orders.ifoodMenu.selectedCount': \"{{n}} selecionado(s)\",\n 'orders.ifoodMenu.cancel': \"Cancelar\",\n 'orders.ifoodStore.linked.title': 'Lojas vinculadas',\n 'orders.ifoodStore.linked.none': 'Nenhuma loja do iFood vinculada a esta conta.',\n 'orders.ifoodStore.linked.authorized': 'autorizada',\n 'orders.ifoodStore.linked.revoked': 'sem autorização no iFood',\n 'orders.ifoodStore.linked.open': 'Abrir',\n 'orders.ifoodStore.validation.is.connected.config': 'Conexão com o iFood',\n 'orders.ifoodStore.validation.is.not.connected.config': 'Conexão com o iFood',\n 'orders.ifoodStore.validation.during.opening-hours.config': 'Dentro do horário de funcionamento',\n 'orders.ifoodStore.validation.has.unavailabilities.active': 'Pausas ativas',\n 'orders.ifoodStore.validation.state.OK': 'ok',\n 'orders.ifoodStore.validation.state.WARNING': 'atenção',\n 'orders.ifoodStore.validation.state.ERROR': 'impede pedidos',\n 'orders.ifoodStore.refresh': 'Atualizar loja',\n 'orders.ifoodStore.refreshed': 'Loja atualizada.',\n 'orders.ifoodStore.status.title': 'Status no iFood',\n 'orders.ifoodStore.status.receiving': 'Recebendo pedidos',\n 'orders.ifoodStore.status.notReceiving': 'Sem receber pedidos',\n 'orders.ifoodStore.state.OK': 'Aberta',\n 'orders.ifoodStore.state.WARNING': 'Aberta com restrições',\n 'orders.ifoodStore.state.CLOSED': 'Fechada',\n 'orders.ifoodStore.state.ERROR': 'Fechada (verificar)',\n 'orders.ifoodStore.state.UNKNOWN': 'Sem status',\n 'orders.ifoodStore.pause.title': 'Pausas',\n 'orders.ifoodStore.pause.defaultReason': 'Pausa operacional',\n 'orders.ifoodStore.pause.reason': 'Motivo',\n 'orders.ifoodStore.pause.minutes': 'Minutos',\n 'orders.ifoodStore.pause.action': 'Pausar loja',\n 'orders.ifoodStore.pause.done': 'Pausa criada no iFood.',\n 'orders.ifoodStore.pause.remove': 'Remover pausa',\n 'orders.ifoodStore.pause.removed': 'Pausa removida no iFood.',\n 'orders.ifoodStore.pause.removing': 'removendo no iFood…',\n 'orders.ifoodStore.pause.waiting': 'aguardando o iFood listar',\n 'orders.ifoodStore.pause.none': 'Nenhuma pausa ativa ou agendada.',\n 'orders.ifoodStore.reopen.action': 'Reabrir loja',\n 'orders.ifoodStore.reopen.done': 'Loja reaberta: todas as pausas foram removidas.',\n 'orders.ifoodStore.hours.title': 'Horário de funcionamento',\n 'orders.ifoodStore.hours.replaces': 'Salvar substitui a semana inteira no iFood: dias sem turno ficam fechados.',\n 'orders.ifoodStore.hours.until': 'até',\n 'orders.ifoodStore.hours.removeShift': 'Remover turno',\n 'orders.ifoodStore.hours.addShift': 'Turno',\n 'orders.ifoodStore.hours.save': 'Salvar horários',\n 'orders.ifoodStore.hours.waiting': 'Salvo no iFood. Aguardando a lista do iFood atualizar…',\n 'orders.ifoodStore.hours.saved': 'Horários salvos no iFood.',\n 'orders.ifoodStore.hours.discard': 'Descartar',\n 'orders.ifoodStore.day.MONDAY': 'Segunda',\n 'orders.ifoodStore.day.TUESDAY': 'Terça',\n 'orders.ifoodStore.day.WEDNESDAY': 'Quarta',\n 'orders.ifoodStore.day.THURSDAY': 'Quinta',\n 'orders.ifoodStore.day.FRIDAY': 'Sexta',\n 'orders.ifoodStore.day.SATURDAY': 'Sábado',\n 'orders.ifoodStore.day.SUNDAY': 'Domingo',\n 'orders.ifoodStore.log.title': 'Log de integração',\n 'orders.ifoodStore.log.desc': 'Chamadas feitas ao iFood por esta loja, mais recentes primeiro.',\n 'orders.ifoodStore.log.time': 'Hora',\n 'orders.ifoodStore.log.method': 'Método',\n 'orders.ifoodStore.log.endpoint': 'Endpoint',\n 'orders.ifoodStore.log.response': 'Resposta',\n 'orders.ifoodStore.log.see': 'ver ({{ms}} ms)',\n 'orders.ifoodStore.log.empty': 'Nenhuma chamada registrada ainda.',\n 'orders.ifoodStore.error.overlap': 'Já existe uma pausa nesse horário. Remova a pausa atual ou escolha outro período.',\n 'orders.ifoodStore.error.pauseRange': 'Uma pausa dura de 1 minuto a 7 dias.',\n 'orders.ifoodStore.error.pauseReason': 'Informe o motivo da pausa.',\n 'orders.ifoodStore.error.hoursOverlap': 'Dois turnos do mesmo dia se sobrepõem. Ajuste os horários e salve de novo.',\n 'orders.ifoodStore.error.hoursMidnight': 'Um turno termina depois das 23:59. Divida-o em dois dias.',\n 'orders.ifoodStore.error.hoursEmpty': 'Informe ao menos um turno. Para fechar a loja por um período, use a pausa.',\n 'orders.ifoodStore.error.hoursTime': 'Horário inválido. Use o formato HH:MM.',\n 'orders.ifoodStore.error.hoursDuration': 'O fim do turno precisa ser depois do início.',\n 'orders.ifoodStore.error.noStore': 'Esta conta ainda não tem uma loja iFood ligada.',\n 'orders.ifoodStore.error.notAllowed': 'Você não tem permissão para gerenciar as integrações desta conta.',\n 'orders.ifoodStore.error.signIn': 'Sua sessão expirou. Entre novamente.',\n 'orders.ifoodStore.error.credentials': 'O iFood recusou as credenciais do aplicativo (401). Fale com o suporte.',\n 'orders.ifoodStore.error.unavailable': 'O iFood está indisponível no momento (erro 5xx). Tente novamente em instantes.',\n 'orders.ifoodStore.error.serviceDown': 'O serviço de integração está indisponível. Tente novamente em instantes.',\n 'orders.ifoodStore.error.invalid': 'O iFood recusou os dados enviados (400). Confira os campos e tente novamente.',\n 'orders.ifoodStore.error.forbidden': 'O iFood negou acesso a esta loja (403): o aplicativo não tem permissão para ela.',\n 'orders.ifoodStore.error.notFound': 'O iFood não encontrou o recurso (404).',\n 'orders.ifoodStore.error.rateLimit': 'Muitas requisições ao iFood (429). Aguarde 30 segundos e tente novamente.',\n 'orders.ifoodStore.error.nameRequired': \"Informe o nome.\",\n 'orders.ifoodStore.error.nameTooLong': \"O nome passa de 100 caracteres.\",\n 'orders.ifoodStore.error.descriptionTooLong': \"A descrição passa de 500 caracteres.\",\n 'orders.ifoodStore.error.badPrice': \"Preço inválido: o produto precisa custar mais que zero e o complemento não pode ser negativo.\",\n 'orders.ifoodStore.error.groupLimits': \"Confira o mínimo e o máximo do grupo de complementos: o máximo precisa ser pelo menos 1 e não menor que o mínimo.\",\n 'orders.ifoodStore.error.groupEmpty': \"Todo grupo de complementos precisa de ao menos um complemento.\",\n 'orders.ifoodStore.error.categoryRequired': \"Escolha a categoria do produto.\",\n 'orders.ifoodStore.error.badImage': \"O iFood aceita fotos PNG ou JPEG. Envie a foto em um desses formatos.\",\n 'orders.ifoodStore.error.imageTooBig': \"A foto passa de 3,9 MB, o limite do iFood. Envie uma foto menor.\",\n 'orders.ifoodStore.error.generic': 'Não foi possível concluir a ação.',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const ordersLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import type { ConnectorPermission, ConnectorSetting } from '@fayz-ai/core'\n\n// The provider name is a parameter because the sentence a tenant judges names it.\nexport function marketplacePermissions(provider: string): ConnectorPermission[] {\n return [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read', 'write'],\n reason:\n `Trazer para cá cada pedido feito no ${provider} — itens, observações, forma de pagamento e o total — ` +\n `e ler o pedido de volta para avisar o ${provider} quando ele for confirmado, sair para entrega ou for cancelado.`,\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'menu_item',\n actions: ['read'],\n reason: `Descobrir qual item do seu cardápio corresponde ao que foi vendido no ${provider}. Nenhum item é alterado.`,\n },\n {\n kind: 'data',\n resource: 'customer',\n actions: ['write'],\n reason: `Registrar quem pediu, com o nome, o telefone e o endereço que o ${provider} envia junto do pedido.`,\n sensitive: true,\n },\n ]\n}\n\nexport const AUTO_ACCEPT_SETTING: ConnectorSetting = {\n key: 'autoAccept',\n label: 'Confirmar o pedido automaticamente',\n description: 'Ligado, o pedido já entra confirmado. Desligado, ele espera alguém aceitar na tela de Pedidos.',\n type: 'toggle',\n defaultValue: false,\n}\n\nexport const PREP_TIME_SETTING: ConnectorSetting = {\n key: 'prepTimeMinutes',\n label: 'Tempo de preparo',\n description: 'Quantos minutos são informados ao aplicativo quando o pedido é confirmado.',\n type: 'text',\n // 5–120: outside that the providers refuse, and the first order is a bad place to find out.\n pattern: '[5-9]|[1-9]\\\\d|1[01]\\\\d|120',\n patternHint: 'De 5 a 120 minutos.',\n placeholder: '30',\n defaultValue: '30',\n}\n\n/** One-line summary for the connection row. Tolerates a hand-edited jsonb string. */\nexport function serviceModesDetail(labels: Record<string, string>, value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const named = list.map((v) => labels[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return named.length > 0 ? named.join(', ') : undefined\n}\n","// The iFood store, as the integration service runs it (control-sdk-backend,\n// the store resources of ADR 0006: /v1/delivery/stores/{storeId}/…). The\n// service verifies who is asking and asks the database whether they may\n// manage this account's settings; nothing here decides that, and no iFood\n// credential ever reaches the browser. Without a service URL (`VITE_CONTROL_API_URL`)\n// every call is refused with 503 `no_client`.\nimport { getActiveTenantId, getActiveUnitId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport { serviceBaseUrl } from '@fayz-ai/admin'\n\nexport interface StoreValidation { code: string; state: string; title: string | null; subtitle: string | null }\nexport interface StoreStatus {\n operation: string\n salesChannel: string\n state: string\n available: boolean\n title: string | null\n subtitle: string | null\n validations: StoreValidation[]\n reopenableInterruptionId: string | null\n}\nexport interface StoreDetails {\n bindingId: string\n merchantId: string\n name: string | null\n corporateName: string | null\n address: Record<string, unknown> | null\n status: StoreStatus | null\n}\nexport interface LinkedStore { bindingId: string; merchantId: string; name: string | null; corporateName: string | null; authorized: boolean }\nexport interface StorePause { id: string; description: string | null; start: string | null; end: string | null }\nexport interface StoreShift { dayOfWeek: string; start: string; duration: number }\nexport interface StoreCall {\n id: number\n at: string\n method: string\n path: string\n status: number | null\n durationMs: number\n errorCode: string | null\n request: unknown\n response: unknown\n}\n\n/** A refusal from the service: the code picks the sentence, the status says what kind. */\nexport class StoreError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) {\n super(message)\n this.name = 'StoreError'\n }\n}\n\n/**\n * `?ifood-simulate=429` or `=500` in the address makes every action answer that\n * refusal without calling anyone. iFood's homologation asks to see what the\n * screen says for errors that cannot be caused on demand; nothing else reads it.\n */\nfunction simulated(): StoreError | null {\n if (typeof window === 'undefined') return null\n const kind = new URLSearchParams(window.location.search).get('ifood-simulate')\n if (kind === '429') return new StoreError(429, 'rate_limited', 'simulated')\n if (kind === '500') return new StoreError(502, 'provider_unavailable', 'simulated')\n return null\n}\n\n/** One call to a store resource as the signed-in member, the refusal parsed the same way. */\nexport async function serviceRequest<T>(method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', path: string, body?: unknown): Promise<T> {\n const fake = simulated()\n if (fake) throw fake\n const base = serviceBaseUrl()\n const supabase = getSupabaseClientOptional() as any\n if (!base || !supabase) throw new StoreError(503, 'no_client', 'the integration service is not configured')\n const { data } = await supabase.auth.getSession()\n const token: string | undefined = data?.session?.access_token\n if (!token) throw new StoreError(401, 'unauthorized', 'sign in again')\n const tenant = getActiveTenantId()\n const unit = getActiveUnitId()\n let response: Response\n try {\n response = await fetch(`${base}${path}`, {\n method,\n headers: {\n authorization: `Bearer ${token}`,\n ...(tenant ? { 'x-fayz-tenant': tenant } : {}),\n ...(unit ? { 'x-fayz-unit': unit } : {}),\n ...(body === undefined ? {} : { 'content-type': 'application/json' }),\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n })\n } catch (error) {\n throw new StoreError(503, 'unavailable', error instanceof Error ? error.message : String(error))\n }\n const text = await response.text()\n let payload: any = null\n try {\n payload = text ? JSON.parse(text) : null\n } catch {\n // not JSON: the status alone decides the sentence\n }\n if (response.ok) return payload as T\n throw new StoreError(response.status, payload?.error ?? 'unavailable', payload?.message ?? text.slice(0, 200))\n}\n\n/** The store a call is about: the one named, or the account's first iFood store. */\nasync function storeId(bindingId?: string): Promise<string> {\n if (bindingId) return bindingId\n const [first] = await serviceRequest<Array<{ storeId: string }>>('GET', '/v1/delivery/stores?provider=ifood')\n if (!first) throw new StoreError(404, 'unknown_store', 'this account has no iFood store linked')\n return first.storeId\n}\n\nexport const store = (id: string, rest = '') => `/v1/delivery/stores/${encodeURIComponent(id)}${rest}`\n\nexport const storePanel = {\n stores: async () => {\n const rows = await serviceRequest<Array<{ storeId: string; merchantRef: string; name: string | null; corporateName: string | null; authorized: boolean | null; active: boolean }>>('GET', '/v1/delivery/stores?provider=ifood')\n return {\n stores: rows.filter((r) => r.active).map((r) => ({ bindingId: r.storeId, merchantId: r.merchantRef, name: r.name, corporateName: r.corporateName, authorized: r.authorized !== false })),\n }\n },\n details: async (bindingId?: string) => serviceRequest<StoreDetails>('GET', store(await storeId(bindingId))),\n pauses: async (bindingId?: string) => serviceRequest<StorePause[]>('GET', store(await storeId(bindingId), '/pauses')),\n pause: async (bindingId: string | undefined, description: string, minutes: number) =>\n serviceRequest<StorePause>('POST', store(await storeId(bindingId), '/pauses'), { description, minutes }),\n removePause: async (bindingId: string | undefined, pauseId: string) => {\n await serviceRequest('DELETE', store(await storeId(bindingId), `/pauses/${encodeURIComponent(pauseId)}`))\n return { removed: pauseId }\n },\n /** Opening the store lifts every pause. */\n reopen: async (bindingId?: string) => serviceRequest<unknown>('PUT', store(await storeId(bindingId), '/status'), { open: true }),\n hours: async (bindingId?: string) => serviceRequest<{ shifts: StoreShift[] }>('GET', store(await storeId(bindingId), '/hours')),\n saveHours: async (bindingId: string | undefined, shifts: StoreShift[]) =>\n serviceRequest<{ shifts: StoreShift[] }>('PUT', store(await storeId(bindingId), '/hours'), { shifts }),\n calls: async (bindingId?: string) => ({ calls: await serviceRequest<StoreCall[]>('GET', store(await storeId(bindingId), '/calls?limit=50')) }),\n /** Every marketplace's store, for screens that run more than iFood's. */\n storeId,\n}\n\n/** The translation key for a refusal; the screen falls back to the status when a code is not listed. */\nexport function storeErrorKey(error: unknown): string {\n if (!(error instanceof StoreError)) return 'orders.ifoodStore.error.generic'\n const byCode: Record<string, string> = {\n InterruptionOverlap: 'overlap',\n pause_out_of_range: 'pauseRange',\n pause_needs_reason: 'pauseReason',\n hours_overlap: 'hoursOverlap',\n hours_past_midnight: 'hoursMidnight',\n hours_empty: 'hoursEmpty',\n hours_bad_time: 'hoursTime',\n hours_bad_duration: 'hoursDuration',\n unknown_store: 'noStore',\n not_allowed: 'notAllowed',\n unauthorized: 'signIn',\n provider_auth_failed: 'credentials',\n provider_unavailable: 'unavailable',\n name_required: 'nameRequired',\n name_too_long: 'nameTooLong',\n description_too_long: 'descriptionTooLong',\n bad_price: 'badPrice',\n bad_group_limits: 'groupLimits',\n group_empty: 'groupEmpty',\n category_required: 'categoryRequired',\n bad_image: 'badImage',\n image_too_big: 'imageTooBig',\n }\n const byStatus: Record<number, string> = { 400: 'invalid', 401: 'signIn', 403: 'forbidden', 404: 'notFound', 413: 'imageTooBig', 429: 'rateLimit', 502: 'unavailable', 503: 'serviceDown' }\n const key = byCode[error.code] ?? byStatus[error.status] ?? (error.status >= 500 ? 'unavailable' : 'generic')\n return `orders.ifoodStore.error.${key}`\n}\n","// The iFood menu, as the integration service edits it (control-sdk-backend,\n// /v1/delivery/stores/{storeId}/catalog), and the\n// links from its items to the house's products, which live in this account's\n// database (plugin-orders migration 005) and are written here under RLS.\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport { serviceRequest, storePanel, store } from './storePanel'\n\nexport const PROVIDER = 'ifood'\n\nexport type CatalogStatus = 'AVAILABLE' | 'UNAVAILABLE'\nexport interface MenuOption { id: string; productId: string | null; name: string; externalCode: string | null; status: string; price: number | null; imageUrl: string | null }\nexport interface MenuGroup { id: string; name: string; externalCode: string | null; min: number; max: number; status: string; options: MenuOption[] }\nexport interface MenuItem {\n id: string; productId: string | null; name: string; description: string | null; externalCode: string | null\n status: string; price: number | null; imagePath: string | null; imageUrl: string | null; optionGroups: MenuGroup[]\n}\nexport interface MenuCategory { id: string; name: string; status: string; externalCode: string | null; index: number; items: MenuItem[] }\nexport interface Menu { catalogId: string | null; categories: MenuCategory[] }\n\nexport interface OptionDraft { id?: string; productId?: string; name: string; price: number; status: CatalogStatus; externalCode?: string; imagePath?: string }\nexport interface GroupDraft { id?: string; name: string; min: number; max: number; status?: CatalogStatus; externalCode?: string; options: OptionDraft[] }\nexport interface ItemDraft {\n id?: string; productId?: string; categoryId: string; name: string; description?: string; price: number\n status: CatalogStatus; externalCode?: string; imagePath?: string; optionGroups: GroupDraft[]\n}\n\nexport interface BulkResult { id: string; ok: boolean; error?: string }\n\nconst catalog = async (bindingId: string | undefined, rest = '') => store(await storePanel.storeId(bindingId), `/catalog${rest}`)\n\n/** The store's iFood menu, as resources at the service. */\nexport const catalogPanel = {\n menu: async (bindingId?: string) => serviceRequest<Menu>('GET', await catalog(bindingId)),\n saveCategory: async (bindingId: string | undefined, category: { id?: string; name: string; status?: CatalogStatus }) =>\n serviceRequest<{ id: string }>('POST', await catalog(bindingId, '/categories'), { category }),\n saveItem: async (bindingId: string | undefined, item: ItemDraft) =>\n serviceRequest<{ id: string }>('PUT', await catalog(bindingId, '/items'), { item }),\n uploadImage: async (bindingId: string | undefined, image: string) =>\n serviceRequest<{ imagePath: string }>('POST', await catalog(bindingId, '/images'), { image }),\n /** The category and every product in it. */\n deleteCategory: async (bindingId: string | undefined, categoryId: string) =>\n serviceRequest<{ id: string }>('DELETE', await catalog(bindingId, `/categories/${encodeURIComponent(categoryId)}`)),\n /** Takes the product out of this category's menu; the product itself stays at iFood. */\n deleteItem: async (bindingId: string | undefined, categoryId: string, productId: string) =>\n serviceRequest<{ id: string }>('DELETE', await catalog(bindingId, `/categories/${encodeURIComponent(categoryId)}/products/${encodeURIComponent(productId)}`)),\n /** One row per item or option; iFood takes them one per call, and the answer says which failed. */\n bulk: async (\n bindingId: string | undefined,\n kind: 'items' | 'options',\n field: 'price' | 'status' | 'externalCode',\n changes: Array<{ id: string; price?: number; status?: CatalogStatus; externalCode?: string }>,\n ) => serviceRequest<{ results: BulkResult[] }>('PATCH', await catalog(bindingId, `/${kind}`), { field, changes }),\n}\n\n/** A picked file as the data URL the image upload takes. */\nexport function readImage(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error ?? new Error('could not read the image'))\n reader.readAsDataURL(file)\n })\n}\n\n// ── links to the house's products ───────────────────────────────────────────\n\nexport interface ProductLink { kind: 'item' | 'option'; externalId: string; productId: string; productName: string | null }\nexport interface ProductHit { id: string; name: string; price: number | null; imageUrl: string | null }\n\nfunction db(): any {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nexport async function loadLinks(): Promise<ProductLink[]> {\n const { data, error } = await db().from('plg_orders_marketplace_links')\n .select('kind, external_id, product_id, products ( name )')\n .eq('tenant_id', getActiveTenantId()).eq('provider', PROVIDER)\n if (error) throw new Error(error.message)\n return ((data ?? []) as Array<{ kind: 'item' | 'option'; external_id: string; product_id: string; products?: { name?: string } | null }>)\n .map((r) => ({ kind: r.kind, externalId: r.external_id, productId: r.product_id, productName: r.products?.name ?? null }))\n}\n\nexport async function linkProduct(kind: 'item' | 'option', externalId: string, productId: string): Promise<void> {\n const { error } = await db().from('plg_orders_marketplace_links').upsert({\n tenant_id: getActiveTenantId(), provider: PROVIDER, kind, external_id: externalId, product_id: productId, updated_at: new Date().toISOString(),\n }, { onConflict: 'tenant_id,provider,kind,external_id' })\n if (error) throw new Error(error.message)\n}\n\nexport async function unlinkProduct(kind: 'item' | 'option', externalId: string): Promise<void> {\n const { error } = await db().from('plg_orders_marketplace_links').delete()\n .eq('tenant_id', getActiveTenantId()).eq('provider', PROVIDER).eq('kind', kind).eq('external_id', externalId)\n if (error) throw new Error(error.message)\n}\n\nexport async function searchProducts(term: string): Promise<ProductHit[]> {\n let q = db().from('products').select('id, name, price, image_url')\n .eq('tenant_id', getActiveTenantId()).eq('is_active', true).order('name').limit(20)\n if (term.trim()) q = q.ilike('name', `%${term.trim()}%`)\n const { data, error } = await q\n if (error) throw new Error(error.message)\n return ((data ?? []) as Array<{ id: string; name: string; price: number | string | null; image_url: string | null }>)\n .map((p) => ({ id: p.id, name: p.name, price: p.price === null ? null : Number(p.price), imageUrl: p.image_url }))\n}\n\n/** The edit form, starting from what iFood has. */\nconst IMAGE_BASE = 'https://static-images.ifood.com.br/image/upload/t_medium/pratos/'\n/** The URL a stored photo is shown at. */\nexport const imageUrlOf = (path: string) => `${IMAGE_BASE}${path}`\nconst pathOf = (url: string | null) => (url && url.startsWith(IMAGE_BASE) ? url.slice(IMAGE_BASE.length) : undefined)\n\nexport function draftOf(item: MenuItem, categoryId: string): ItemDraft {\n return {\n id: item.id,\n productId: item.productId ?? undefined,\n categoryId,\n name: item.name,\n description: item.description ?? undefined,\n price: item.price ?? 0,\n status: item.status === 'UNAVAILABLE' ? 'UNAVAILABLE' : 'AVAILABLE',\n externalCode: item.externalCode ?? undefined,\n imagePath: item.imagePath ?? undefined,\n optionGroups: item.optionGroups.map((g) => ({\n id: g.id, name: g.name, min: g.min, max: g.max, externalCode: g.externalCode ?? undefined,\n status: g.status === 'UNAVAILABLE' ? 'UNAVAILABLE' : 'AVAILABLE',\n options: g.options.map((o) => ({\n id: o.id, productId: o.productId ?? undefined, name: o.name, price: o.price ?? 0,\n status: o.status === 'UNAVAILABLE' ? 'UNAVAILABLE' : 'AVAILABLE', externalCode: o.externalCode ?? undefined,\n // Saving an item rewrites its complements: their photos must travel too.\n imagePath: pathOf(o.imageUrl),\n })),\n })),\n }\n}\n\n/**\n * What saving an edited item sends. The homologation asks for prices and\n * pauses to go by PATCH, so those leave the full PUT: the PUT carries the\n * name, description, photo and structure with the OLD price and status, and\n * the changes to price and status go after it as PATCH calls.\n */\nexport function editPlan(before: ItemDraft, after: ItemDraft): {\n put: ItemDraft | null\n itemPrice: number | null\n itemStatus: CatalogStatus | null\n optionPrices: Array<{ id: string; price: number }>\n optionStatuses: Array<{ id: string; status: CatalogStatus }>\n} {\n const optionsBefore = new Map(before.optionGroups.flatMap((g) => g.options).filter((o) => o.id).map((o) => [o.id!, o]))\n const keepOld = (o: OptionDraft) => {\n const old = o.id ? optionsBefore.get(o.id) : undefined\n return old ? { ...o, price: old.price, status: old.status } : o\n }\n const put: ItemDraft = {\n ...after,\n price: before.price,\n status: before.status,\n optionGroups: after.optionGroups.map((g) => ({ ...g, options: g.options.map(keepOld) })),\n }\n const strip = (d: ItemDraft) => JSON.stringify({ ...d, price: 0, status: 'AVAILABLE', optionGroups: d.optionGroups.map((g) => ({ ...g, options: g.options.map((o) => ({ ...o, price: 0, status: 'AVAILABLE' })) })) })\n const after_ = after.optionGroups.flatMap((g) => g.options)\n return {\n put: strip(put) === strip(before) ? null : put,\n itemPrice: after.price !== before.price ? after.price : null,\n itemStatus: after.status !== before.status ? after.status : null,\n optionPrices: after_.filter((o) => o.id && optionsBefore.has(o.id) && optionsBefore.get(o.id)!.price !== o.price).map((o) => ({ id: o.id!, price: o.price })),\n optionStatuses: after_.filter((o) => o.id && optionsBefore.has(o.id) && optionsBefore.get(o.id)!.status !== o.status).map((o) => ({ id: o.id!, status: o.status })),\n }\n}\n","// The iFood menu of the store, edited here and published to iFood, with each\n// product and complement linked to one of the house's products. It is iFood's\n// own menu (as Takeat's «Cardápio iFood» is): names and prices may differ from\n// the house's; the link is what ties the two.\nimport React from 'react'\nimport { Image as ImageIcon, Link2, Loader2, Pause, Pencil, Play, Plus, RefreshCw, Trash2, Unlink, X } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Input } from '@fayz-ai/ui'\nimport {\n catalogPanel, draftOf, editPlan, imageUrlOf, linkProduct, loadLinks, readImage, searchProducts, unlinkProduct,\n type CatalogStatus, type ItemDraft, type Menu, type MenuItem, type ProductHit, type ProductLink,\n} from './catalogPanel'\nimport { storeErrorKey } from './storePanel'\n\nconst money = (v: number | null) => (v === null ? '—' : v.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }))\n\n/**\n * A change iFood accepted but its menu does not show yet. iFood's menu lags\n * its writes by seconds to minutes, so every write waits here until the menu\n * shows it, and only then is it announced as done.\n */\ninterface Pending {\n key: string\n kind: 'create' | 'change' | 'delete'\n at: number\n /** What a not-yet-listed new category or product shows meanwhile. */\n placeholder?: { categoryId?: string; name: string; price?: number }\n done: (menu: Menu) => boolean\n}\nconst PENDING_GIVE_UP_MS = 5 * 60_000\n\nconst itemIn = (menu: Menu, id: string) => menu.categories.flatMap((c) => c.items).find((i) => i.id === id)\nconst optionIn = (menu: Menu, id: string) => menu.categories.flatMap((c) => c.items).flatMap((i) => i.optionGroups).flatMap((g) => g.options).find((o) => o.id === id)\n// iFood capitalizes the first letter of every name it stores (\"dsadasd\" comes back \"Dsadasd\").\nconst nameOf = (s: string) => s.trim().toLocaleLowerCase('pt-BR')\nconst samePrice = (a: number | null | undefined, b: number | null | undefined) => Math.round((a ?? 0) * 100) === Math.round((b ?? 0) * 100)\n\n/** Whether iFood's menu shows the item as the draft wants it. */\nfunction shows(menu: Menu, draft: ItemDraft): boolean {\n const item = draft.id ? itemIn(menu, draft.id) : undefined\n if (!item) return false\n if (nameOf(item.name) !== nameOf(draft.name) || !samePrice(item.price, draft.price) || item.status !== draft.status) return false\n if (draft.imagePath && item.imagePath !== draft.imagePath) return false\n // Complements added in this edit have no id until iFood answers with one,\n // so those are matched by name; the rest by id. Removed ones must be gone.\n const wanted = draft.optionGroups.flatMap((g) => g.options)\n const kept = new Set(wanted.map((o) => o.id).filter(Boolean))\n const added = wanted.filter((o) => !o.id).map((o) => nameOf(o.name))\n const now = item.optionGroups.flatMap((g) => g.options)\n if (item.optionGroups.length !== draft.optionGroups.length || now.length !== wanted.length) return false\n if (now.some((o) => !kept.has(o.id) && !added.includes(nameOf(o.name)))) return false\n return draft.optionGroups.flatMap((g) => g.options).filter((o) => o.id).every((o) => {\n const now = optionIn(menu, o.id!)\n return !!now && nameOf(now.name) === nameOf(o.name) && samePrice(now.price, o.price) && now.status === o.status\n && (!o.imagePath || !!now.imageUrl?.endsWith(o.imagePath))\n })\n}\n\nexport function IfoodMenuPanel({ bindingId, onChanged }: { bindingId?: string; onChanged?: () => void }) {\n const t = useTranslation()\n const [menu, setMenu] = React.useState<Menu | null>(null)\n const [links, setLinks] = React.useState<ProductLink[]>([])\n const [error, setError] = React.useState<string | null>(null)\n const [message, setMessage] = React.useState<{ tone: 'ok' | 'error' | 'wait'; text: string } | null>(null)\n const [busy, setBusy] = React.useState<string | null>(null)\n const [newCategory, setNewCategory] = React.useState('')\n const [editing, setEditing] = React.useState<{ before: ItemDraft | null; draft: ItemDraft } | null>(null)\n const [linking, setLinking] = React.useState<{ kind: 'item' | 'option'; id: string } | null>(null)\n const [selected, setSelected] = React.useState<Set<string>>(new Set())\n // Delete asks once, inline (no modal on top of the drawer).\n const [confirming, setConfirming] = React.useState<string | null>(null)\n const [pending, setPending] = React.useState<Pending[]>([])\n const pendingRef = React.useRef<Pending[]>([])\n const expect = (p: Omit<Pending, 'at'>) => {\n pendingRef.current = [...pendingRef.current.filter((x) => x.key !== p.key), { ...p, at: Date.now() }]\n setPending(pendingRef.current)\n }\n\n const load = React.useCallback(async () => {\n setError(null)\n try {\n const [m, l] = await Promise.all([catalogPanel.menu(bindingId), loadLinks().catch(() => [] as ProductLink[])])\n const settled = pendingRef.current.filter((p) => p.done(m))\n const stale = pendingRef.current.filter((p) => !settled.includes(p) && Date.now() - p.at > PENDING_GIVE_UP_MS)\n if (settled.length || stale.length) {\n pendingRef.current = pendingRef.current.filter((p) => !settled.includes(p) && !stale.includes(p))\n setPending(pendingRef.current)\n if (stale.length) setMessage({ tone: 'error', text: t('orders.ifoodMenu.notConfirmed') })\n else setMessage({ tone: 'ok', text: t(settled.some((p) => p.kind === 'delete') ? 'orders.ifoodMenu.deleted' : 'orders.ifoodMenu.confirmed') })\n }\n setMenu(m)\n setLinks(l)\n } catch (e) {\n setError(t(storeErrorKey(e)))\n }\n }, [bindingId, t])\n\n React.useEffect(() => { void load() }, [load])\n React.useEffect(() => {\n if (!pending.length) return\n const timer = setInterval(() => { if (!document.hidden) void load() }, 5_000)\n return () => clearInterval(timer)\n }, [pending.length, load])\n\n /** A write to iFood: on success it waits for iFood's menu (see Pending); a refusal shows at once. */\n async function act(key: string, work: () => Promise<unknown>, after?: 'wait' | string) {\n if (busy) return\n setBusy(key)\n setMessage(null)\n try {\n await work()\n if (after === 'wait') setMessage({ tone: 'wait', text: t('orders.ifoodMenu.sent') })\n else if (after) setMessage({ tone: 'ok', text: after })\n await load()\n } catch (e) {\n const code = storeErrorKey(e)\n const known = code !== 'orders.ifoodStore.error.generic' && code !== 'orders.ifoodStore.error.invalid'\n setMessage({ tone: 'error', text: t(code) + (!known && e instanceof Error && e.message ? ` (${e.message})` : '') })\n } finally {\n setBusy(null)\n onChanged?.()\n }\n }\n\n /** A bulk answer with refusals is an error worth naming. */\n const bulk = async (...args: Parameters<typeof catalogPanel.bulk>) => {\n const { results } = await catalogPanel.bulk(...args)\n const failed = results.filter((r) => !r.ok)\n if (failed.length) throw new Error(t('orders.ifoodMenu.bulkFailed', { n: failed.length, codes: failed.map((f) => f.error).join(', ') }))\n }\n\n const linkOf = (kind: 'item' | 'option', id: string) => links.find((l) => l.kind === kind && l.externalId === id)\n const flip = (s: string): CatalogStatus => (s === 'AVAILABLE' ? 'UNAVAILABLE' : 'AVAILABLE')\n const pendingOf = (key: string) => pending.find((p) => p.key === key)\n\n if (error && !menu) {\n return (\n <div className=\"space-y-2 text-sm\">\n <p role=\"alert\" className=\"text-destructive\">{error}</p>\n <Button size=\"sm\" variant=\"outline\" onClick={() => void load()}>{t('orders.ifoodStore.retry')}</Button>\n </div>\n )\n }\n if (!menu) return <p className=\"text-sm text-muted-foreground\">{t('orders.ifoodStore.loading')}</p>\n\n const setStatus = (kind: 'items' | 'options', id: string, status: CatalogStatus) =>\n void act(`${kind}-${id}`, async () => {\n await bulk(bindingId, kind, 'status', [{ id, status }])\n expect({ key: `${kind === 'items' ? 'item' : 'opt'}-${id}`, kind: 'change',\n done: (m) => (kind === 'items' ? itemIn(m, id)?.status : optionIn(m, id)?.status) === status })\n }, 'wait')\n\n // A photo changed from the list: upload, then the item goes back to iFood\n // whole with the new path (iFood has no photo-only call).\n const changePhoto = (item: MenuItem, categoryId: string, file: File, optionId?: string) =>\n void act(`photo-${optionId ?? item.id}`, async () => {\n const { imagePath } = await catalogPanel.uploadImage(bindingId, await readImage(file))\n const d = draftOf(item, categoryId)\n await catalogPanel.saveItem(bindingId, optionId\n ? { ...d, optionGroups: d.optionGroups.map((g) => ({ ...g, options: g.options.map((o) => (o.id === optionId ? { ...o, imagePath } : o)) })) }\n : { ...d, imagePath })\n expect({ key: optionId ? `opt-${optionId}` : `item-${item.id}`, kind: 'change',\n done: (m) => (optionId ? !!optionIn(m, optionId)?.imageUrl?.endsWith(imagePath) : itemIn(m, item.id)?.imagePath === imagePath) })\n }, 'wait')\n\n const save = (draft: ItemDraft, before: ItemDraft | null) =>\n void act('item', async () => {\n if (!before) {\n const { id } = await catalogPanel.saveItem(bindingId, draft)\n expect({ key: `item-${id}`, kind: 'create', placeholder: { categoryId: draft.categoryId, name: draft.name, price: draft.price },\n done: (m) => !!m.categories.find((c) => c.id === draft.categoryId)?.items.some((i) => i.id === id) })\n } else {\n const plan = editPlan(before, draft)\n if (plan.put) await catalogPanel.saveItem(bindingId, plan.put)\n if (plan.itemPrice !== null) await bulk(bindingId, 'items', 'price', [{ id: draft.id!, price: plan.itemPrice }])\n if (plan.itemStatus) await bulk(bindingId, 'items', 'status', [{ id: draft.id!, status: plan.itemStatus }])\n if (plan.optionPrices.length) await bulk(bindingId, 'options', 'price', plan.optionPrices)\n if (plan.optionStatuses.length) await bulk(bindingId, 'options', 'status', plan.optionStatuses)\n expect({ key: `item-${draft.id}`, kind: 'change', done: (m) => shows(m, draft) })\n }\n setEditing(null)\n }, 'wait')\n\n const editorFor = (e: { before: ItemDraft | null; draft: ItemDraft }) => (\n <ItemEditor key={e.before?.id ?? `new-${e.draft.categoryId}`} value={e.draft} isNew={!e.before} busy={!!busy}\n bindingId={bindingId} onCancel={() => setEditing(null)} onSave={(draft) => save(draft, e.before)} />\n )\n\n const linkerFor = (kind: 'item' | 'option', id: string) => linking?.kind === kind && linking.id === id && (\n <LinkPicker onCancel={() => setLinking(null)}\n onPick={(p) => void act('link', async () => {\n await linkProduct(kind, id, p.id)\n setLinking(null)\n }, t('orders.ifoodMenu.linked', { name: p.name }))} />\n )\n\n const newCategories = pending.filter((p) => p.kind === 'create' && p.placeholder && !p.placeholder.categoryId)\n\n return (\n <div className=\"space-y-4\">\n {message && (\n <p role={message.tone === 'error' ? 'alert' : 'status'}\n className={`flex items-center gap-2 rounded-md px-3 py-2 text-sm ${message.tone === 'error' ? 'bg-destructive/10 text-destructive' : message.tone === 'wait' ? 'bg-muted text-foreground' : 'bg-success/10 text-success'}`}>\n {message.tone === 'wait' && pending.length > 0 && <Loader2 className=\"h-4 w-4 shrink-0 animate-spin\" />}\n {message.tone === 'wait' && pending.length === 0 ? t('orders.ifoodMenu.confirmed') : message.text}\n </p>\n )}\n\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto_auto] items-end gap-2\">\n <label className=\"space-y-1 text-xs\">\n <span>{t('orders.ifoodMenu.newCategory')}</span>\n <Input value={newCategory} onChange={(e) => setNewCategory(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') (e.currentTarget.closest('div')?.querySelector('button') as HTMLButtonElement | null)?.click() }} />\n </label>\n <Button size=\"lg\" disabled={!!busy}\n onClick={() => void act('category', async () => {\n const name = newCategory.trim()\n const { id } = await catalogPanel.saveCategory(bindingId, { name, status: 'AVAILABLE' })\n setNewCategory('')\n expect({ key: `cat-${id}`, kind: 'create', placeholder: { name }, done: (m) => m.categories.some((c) => c.id === id) })\n }, 'wait')}>\n {busy === 'category' ? <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" /> : <Plus className=\"mr-1 h-4 w-4\" />} {t('orders.ifoodMenu.createCategory')}\n </Button>\n <Button size=\"lg\" variant=\"outline\" disabled={!!busy} aria-label={t('orders.ifoodMenu.refresh')} title={t('orders.ifoodMenu.refresh')}\n onClick={() => void act('refresh', async () => {}, t('orders.ifoodMenu.refreshed'))}>\n <RefreshCw className={`h-4 w-4 ${busy === 'refresh' ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n {selected.size > 0 && (\n <div className=\"flex flex-wrap items-center gap-2 rounded-md bg-muted/60 px-3 py-2 text-sm\">\n <span className=\"flex-1\">{t('orders.ifoodMenu.selectedCount', { n: selected.size })}</span>\n {(['UNAVAILABLE', 'AVAILABLE'] as const).map((status) => (\n <Button key={status} size=\"sm\" variant=\"outline\" disabled={!!busy}\n onClick={() => void act('bulk', async () => {\n const ids = [...selected]\n await bulk(bindingId, 'items', 'status', ids.map((id) => ({ id, status })))\n setSelected(new Set())\n for (const id of ids) expect({ key: `item-${id}`, kind: 'change', done: (m) => itemIn(m, id)?.status === status })\n }, 'wait')}>\n {status === 'UNAVAILABLE' ? <Pause className=\"mr-1 h-4 w-4\" /> : <Play className=\"mr-1 h-4 w-4\" />}\n {status === 'UNAVAILABLE' ? t('orders.ifoodMenu.pauseSelected', { n: selected.size }) : t('orders.ifoodMenu.resumeSelected', { n: selected.size })}\n </Button>\n ))}\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setSelected(new Set())}>{t('orders.ifoodMenu.cancel')}</Button>\n </div>\n )}\n\n {newCategories.map((p) => (\n <section key={p.key} aria-busy className=\"rounded-md border border-dashed border-border opacity-70\">\n <header className=\"flex items-center gap-2 bg-muted/50 px-3 py-2 text-sm\">\n <span className=\"min-w-0 flex-1 truncate font-semibold\">{p.placeholder!.name}</span>\n <WaitTag label={t('orders.ifoodMenu.creating')} />\n </header>\n </section>\n ))}\n\n {menu.categories.length === 0 && newCategories.length === 0 && <p className=\"text-sm text-muted-foreground\">{t('orders.ifoodMenu.empty')}</p>}\n\n {menu.categories.map((category) => {\n const catPending = pendingOf(`cat-${category.id}`)\n const creating = pending.filter((p) => p.kind === 'create' && p.placeholder?.categoryId === category.id)\n return (\n <section key={category.id} aria-busy={!!catPending}\n className={`rounded-md border border-border ${catPending?.kind === 'delete' ? 'pointer-events-none opacity-50' : ''}`}>\n <header className=\"flex items-center gap-2 bg-muted/50 px-3 py-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <h3 className=\"truncate text-sm font-semibold\" title={category.name}>{category.name}</h3>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {t(category.items.length === 1 ? 'orders.ifoodMenu.productCountOne' : 'orders.ifoodMenu.productCount', { n: category.items.length })}\n </span>\n <StatusBadge status={category.status} />\n </div>\n {catPending?.kind === 'delete' ? (\n <WaitTag label={t('orders.ifoodMenu.deleting')} />\n ) : (\n <>\n <Button size=\"sm\" variant=\"outline\" className=\"shrink-0\" disabled={!!busy || !!editing}\n onClick={() => { setLinking(null); setEditing({ before: null, draft: { categoryId: category.id, name: '', price: 0, status: 'AVAILABLE', optionGroups: [] } }) }}>\n <Plus className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodMenu.newItem')}\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"shrink-0\" disabled={!!busy}\n aria-label={t('orders.ifoodMenu.deleteCategory')} title={t('orders.ifoodMenu.deleteCategory')}\n onClick={() => setConfirming(`cat-${category.id}`)}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </>\n )}\n </header>\n {confirming === `cat-${category.id}` && (\n <ConfirmRow text={t('orders.ifoodMenu.confirmCategory', { name: category.name, n: category.items.length })}\n onCancel={() => setConfirming(null)}\n onConfirm={() => { setConfirming(null); void act(`del-cat-${category.id}`, async () => {\n await catalogPanel.deleteCategory(bindingId, category.id)\n expect({ key: `cat-${category.id}`, kind: 'delete', done: (m) => !m.categories.some((c) => c.id === category.id) })\n }, 'wait') }} />\n )}\n {editing && !editing.before && editing.draft.categoryId === category.id && (\n <div className=\"border-t border-border p-3\">{editorFor(editing)}</div>\n )}\n\n <ul className=\"divide-y divide-border\">\n {creating.map((p) => (\n <li key={p.key} aria-busy className=\"flex items-center gap-3 px-3 py-2 opacity-70\">\n <span className=\"flex h-14 w-14 shrink-0 items-center justify-center rounded-md border border-dashed border-border\"><ImageIcon className=\"h-4 w-4 text-muted-foreground\" /></span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{p.placeholder!.name}</p>\n <span className=\"text-xs font-semibold\">{money(p.placeholder!.price ?? null)}</span>\n </div>\n <WaitTag label={t('orders.ifoodMenu.creating')} />\n </li>\n ))}\n {category.items.map((item) => {\n const itemPending = pendingOf(`item-${item.id}`)\n if (editing?.before?.id === item.id) {\n // The editor takes the product's place: no second copy of it, nor its buttons.\n return <li key={item.id} className=\"p-3\">{editorFor(editing)}</li>\n }\n return (\n <li key={item.id} aria-busy={!!itemPending}\n className={`space-y-2 px-3 py-2 ${itemPending?.kind === 'delete' ? 'pointer-events-none opacity-50' : ''}`}>\n <ItemRow\n item={item}\n pending={itemPending ? t(itemPending.kind === 'delete' ? 'orders.ifoodMenu.deleting' : 'orders.ifoodMenu.confirming') : null}\n selected={selected.has(item.id)}\n onSelect={(on) => setSelected((s) => { const n = new Set(s); if (on) n.add(item.id); else n.delete(item.id); return n })}\n link={linkOf('item', item.id)}\n busy={!!busy || !!itemPending}\n photoBusy={busy === `photo-${item.id}`}\n onPhoto={(file) => changePhoto(item, category.id, file)}\n onDelete={item.productId ? () => setConfirming(`item-${item.id}`) : undefined}\n onEdit={() => { setLinking(null); setConfirming(null); const d = draftOf(item, category.id); setEditing({ before: d, draft: structuredClone(d) }) }}\n onToggle={() => setStatus('items', item.id, flip(item.status))}\n onLink={() => { setEditing(null); setLinking({ kind: 'item', id: item.id }) }}\n onUnlink={() => void act(`u-${item.id}`, () => unlinkProduct('item', item.id), t('orders.ifoodMenu.unlinked'))}\n />\n {confirming === `item-${item.id}` && (\n <ConfirmRow text={t('orders.ifoodMenu.confirmItem', { name: item.name })}\n onCancel={() => setConfirming(null)}\n onConfirm={() => { setConfirming(null); void act(`del-item-${item.id}`, async () => {\n await catalogPanel.deleteItem(bindingId, category.id, item.productId!)\n expect({ key: `item-${item.id}`, kind: 'delete',\n done: (m) => !m.categories.find((c) => c.id === category.id)?.items.some((i) => i.id === item.id) })\n }, 'wait') }} />\n )}\n {linkerFor('item', item.id)}\n {item.optionGroups.map((g) => (\n <div key={g.id} className=\"ml-14 space-y-1 border-l border-border pl-3 text-sm\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n {g.name} · {t('orders.ifoodMenu.minMax', { min: g.min, max: g.max })}\n </p>\n {g.options.map((o) => {\n const optPending = pendingOf(`opt-${o.id}`)\n return (\n <div key={o.id} className=\"space-y-1\">\n <div className=\"flex items-center gap-2\">\n <EditablePhoto url={o.imageUrl} small busy={busy === `photo-${o.id}`} disabled={!!busy || !!optPending}\n label={o.imageUrl ? t('orders.ifoodMenu.photoChange') : t('orders.ifoodMenu.photoAdd')}\n onPick={(file) => changePhoto(item, category.id, file, o.id)} />\n <span className=\"min-w-0 flex-1 truncate\" title={o.name}>{o.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{money(o.price)}</span>\n <StatusBadge status={o.status} />\n {optPending ? (\n <WaitTag label={t('orders.ifoodMenu.confirming')} />\n ) : (\n <>\n <LinkChip compact link={linkOf('option', o.id)} onLink={() => { setEditing(null); setLinking({ kind: 'option', id: o.id }) }}\n onUnlink={() => void act(`u-${o.id}`, () => unlinkProduct('option', o.id), t('orders.ifoodMenu.unlinked'))} />\n <Button size=\"icon\" variant=\"ghost\" disabled={!!busy}\n aria-label={o.status === 'AVAILABLE' ? t('orders.ifoodMenu.pause') : t('orders.ifoodMenu.resume')}\n title={o.status === 'AVAILABLE' ? t('orders.ifoodMenu.pause') : t('orders.ifoodMenu.resume')}\n onClick={() => setStatus('options', o.id, flip(o.status))}>\n {o.status === 'AVAILABLE' ? <Pause className=\"h-4 w-4\" /> : <Play className=\"h-4 w-4\" />}\n </Button>\n </>\n )}\n </div>\n {linkerFor('option', o.id)}\n </div>\n )\n })}\n </div>\n ))}\n </li>\n )\n })}\n </ul>\n </section>\n )\n })}\n </div>\n )\n}\n\n/** \"waiting for iFood\", with a spinner: something sent and not yet shown by iFood. */\nfunction WaitTag({ label }: { label: string }) {\n return (\n <span className=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" /> {label}\n </span>\n )\n}\n\n/** Money typed as the store reads it: \"19,90\" in Brazil. Keeps the number; shows the text. */\nfunction MoneyInput({ value, onChange, wrapperClassName }: { value: number; onChange: (v: number) => void; wrapperClassName?: string }) {\n const format = (v: number) => (v ? v.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '')\n const [text, setText] = React.useState(format(value))\n return (\n <Input inputMode=\"decimal\" value={text} wrapperClassName={wrapperClassName} placeholder=\"0,00\"\n onChange={(e) => {\n const raw = e.target.value.replace(/[^\\d.,]/g, '')\n setText(raw)\n // Brazilian money: the comma is the decimal mark, dots group thousands.\n const normal = raw.includes(',') ? raw.replace(/\\./g, '').replace(',', '.') : raw\n const n = Number(normal)\n onChange(Number.isFinite(n) ? n : 0)\n }}\n onBlur={() => setText(format(value))} />\n )\n}\n\n\nfunction StatusBadge({ status }: { status: string }) {\n const t = useTranslation()\n const on = status === 'AVAILABLE'\n return (\n <span className={`rounded-full px-2 py-0.5 text-xs ${on ? 'bg-success/10 text-success' : 'bg-muted text-muted-foreground'}`}>\n {on ? t('orders.ifoodMenu.available') : t('orders.ifoodMenu.paused')}\n </span>\n )\n}\n\nfunction ConfirmRow({ text, onConfirm, onCancel }: { text: string; onConfirm: () => void; onCancel: () => void }) {\n const t = useTranslation()\n return (\n <div role=\"alertdialog\" className=\"flex flex-wrap items-center gap-2 border-t border-border bg-destructive/5 px-3 py-2 text-sm\">\n <span className=\"min-w-0 flex-1\">{text}</span>\n <Button size=\"sm\" variant=\"destructive\" onClick={onConfirm}>{t('orders.ifoodMenu.confirmDelete')}</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={onCancel}>{t('orders.ifoodMenu.cancel')}</Button>\n </div>\n )\n}\n\n/** A photo you can click to replace: a pencil shows on hover, a spinner while it uploads. */\nfunction EditablePhoto({ url, small, large, busy, disabled, label, onPick }: {\n url: string | null; small?: boolean; large?: boolean; busy?: boolean; disabled?: boolean; label: string; onPick: (file: File) => void\n}) {\n const input = React.useRef<HTMLInputElement>(null)\n const size = large ? 'h-24 w-24' : small ? 'h-9 w-9' : 'h-14 w-14'\n return (\n <button type=\"button\" aria-label={label} title={label} disabled={disabled}\n onClick={() => input.current?.click()}\n className={`group relative ${size} shrink-0 overflow-hidden rounded-md border border-border bg-muted text-muted-foreground disabled:cursor-not-allowed`}>\n {url ? <img src={url} alt=\"\" className=\"h-full w-full object-cover\" /> : <ImageIcon className=\"m-auto h-4 w-4\" />}\n <span className={`absolute inset-0 flex items-center justify-center bg-black/50 text-white transition-opacity ${busy ? 'opacity-100' : 'opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100'}`}>\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Pencil className=\"h-4 w-4\" />}\n </span>\n <input ref={input} type=\"file\" accept=\"image/png,image/jpeg\" className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (file) onPick(file)\n }} />\n </button>\n )\n}\n\nfunction Thumb({ url, small }: { url: string | null; small?: boolean }) {\n const size = small ? 'h-6 w-6' : 'h-12 w-12'\n return url\n ? <img src={url} alt=\"\" className={`${size} rounded object-cover`} />\n : <span className={`${size} flex items-center justify-center rounded bg-muted text-muted-foreground`}><ImageIcon className=\"h-4 w-4\" /></span>\n}\n\nfunction LinkChip({ link, onLink, onUnlink, compact }: { link?: ProductLink; onLink: () => void; onUnlink: () => void; compact?: boolean }) {\n const t = useTranslation()\n if (!link) {\n return compact ? (\n <Button size=\"icon\" variant=\"ghost\" onClick={onLink} aria-label={t('orders.ifoodMenu.link')} title={t('orders.ifoodMenu.linkTitle')}>\n <Link2 className=\"h-4 w-4\" />\n </Button>\n ) : (\n <Button size=\"sm\" variant=\"outline\" onClick={onLink}>\n <Link2 className=\"mr-1 h-3 w-3\" /> {t('orders.ifoodMenu.link')}\n </Button>\n )\n }\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full border border-border px-2 py-0.5 text-xs\">\n <Link2 className=\"h-3 w-3\" /> {link.productName ?? link.productId}\n <button type=\"button\" aria-label={t('orders.ifoodMenu.unlink')} onClick={onUnlink}><Unlink className=\"h-3 w-3\" /></button>\n </span>\n )\n}\n\nfunction ItemRow({ item, pending, selected, onSelect, link, busy, photoBusy, onPhoto, onDelete, onEdit, onToggle, onLink, onUnlink }: {\n item: MenuItem; pending: string | null; selected: boolean; onSelect: (on: boolean) => void; link?: ProductLink; busy: boolean\n photoBusy: boolean; onPhoto: (file: File) => void; onDelete?: () => void\n onEdit: () => void; onToggle: () => void; onLink: () => void; onUnlink: () => void\n}) {\n const t = useTranslation()\n return (\n <div className=\"flex items-center gap-3\">\n <input type=\"checkbox\" checked={selected} onChange={(e) => onSelect(e.target.checked)} aria-label={t('orders.ifoodMenu.select', { name: item.name })} />\n <EditablePhoto url={item.imageUrl} busy={photoBusy} disabled={busy}\n label={item.imageUrl ? t('orders.ifoodMenu.photoChange') : t('orders.ifoodMenu.photoAdd')} onPick={onPhoto} />\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n <p className=\"truncate text-sm font-medium\" title={item.name}>{item.name}</p>\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"font-semibold\">{money(item.price)}</span>\n <StatusBadge status={item.status} />\n </div>\n {item.externalCode && (\n <p className=\"truncate text-[11px] text-muted-foreground\" title={item.externalCode}>\n {t('orders.ifoodMenu.pdvCode')}: <code>{item.externalCode}</code>\n </p>\n )}\n </div>\n {pending ? <WaitTag label={pending} /> : (\n <div className=\"flex shrink-0 items-center gap-1\">\n <LinkChip compact link={link} onLink={onLink} onUnlink={onUnlink} />\n <Button size=\"icon\" variant=\"ghost\" disabled={busy} onClick={onToggle}\n aria-label={item.status === 'AVAILABLE' ? t('orders.ifoodMenu.pause') : t('orders.ifoodMenu.resume')}\n title={item.status === 'AVAILABLE' ? t('orders.ifoodMenu.pause') : t('orders.ifoodMenu.resume')}>\n {item.status === 'AVAILABLE' ? <Pause className=\"h-4 w-4\" /> : <Play className=\"h-4 w-4\" />}\n </Button>\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={onEdit}>\n <Pencil className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodMenu.edit')}\n </Button>\n {onDelete && (\n <Button size=\"icon\" variant=\"ghost\" disabled={busy} onClick={onDelete}\n aria-label={t('orders.ifoodMenu.deleteItem')} title={t('orders.ifoodMenu.deleteItem')}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n )}\n </div>\n )\n}\n\n/** The editor's photo: click it to pick a file; it uploads at once and keeps the path iFood answers. */\nfunction PhotoField({ bindingId, path, small, large, onPath }: { bindingId?: string; path?: string; small?: boolean; large?: boolean; onPath: (p: string | undefined) => void }) {\n const t = useTranslation()\n const [state, setState] = React.useState<'idle' | 'sending' | 'failed'>('idle')\n const [failure, setFailure] = React.useState('')\n return (\n <span className={`inline-flex gap-1 text-xs ${large ? 'flex-col items-center text-center' : 'items-center'}`}>\n <EditablePhoto url={path ? imageUrlOf(path) : null} small={small} large={large} busy={state === 'sending'} disabled={state === 'sending'}\n label={path ? t('orders.ifoodMenu.photoChange') : t('orders.ifoodMenu.photoAdd')}\n onPick={async (file) => {\n setState('sending')\n try {\n const { imagePath } = await catalogPanel.uploadImage(bindingId, await readImage(file))\n onPath(imagePath)\n setState('idle')\n } catch (error) {\n // The service's refusal says why (size, format); the generic line is the fallback.\n const key = storeErrorKey(error)\n setFailure(key.endsWith('.generic') ? t('orders.ifoodMenu.photoFailed') : t(key))\n setState('failed')\n }\n }} />\n {large && state !== 'failed' && (\n <span className=\"text-muted-foreground\">{path ? t('orders.ifoodMenu.photoChange') : t('orders.ifoodMenu.photoAdd')}</span>\n )}\n {state === 'failed' && <span role=\"alert\" className={`text-destructive ${large ? 'w-24' : ''}`}>{failure}</span>}\n </span>\n )\n}\n\n/** Available / paused as two buttons side by side, the height of the fields beside it. */\nfunction StatusToggle({ value, onChange, compact }: { value: CatalogStatus; onChange: (v: CatalogStatus) => void; compact?: boolean }) {\n const t = useTranslation()\n const options: Array<[CatalogStatus, string]> = [['AVAILABLE', t('orders.ifoodMenu.available')], ['UNAVAILABLE', t('orders.ifoodMenu.paused')]]\n return (\n <div role=\"radiogroup\" className=\"inline-flex h-9 overflow-hidden rounded-md border border-input bg-background text-xs\">\n {options.map(([v, label]) => (\n <button key={v} type=\"button\" role=\"radio\" aria-checked={value === v} onClick={() => onChange(v)}\n className={`${compact ? 'px-2' : 'px-3'} font-medium transition-colors ${value === v\n ? (v === 'AVAILABLE' ? 'bg-success/15 text-success' : 'bg-muted text-foreground')\n : 'text-muted-foreground hover:bg-muted/50'}`}>\n {label}\n </button>\n ))}\n </div>\n )\n}\n\nfunction ItemEditor({ value, isNew, busy, bindingId, onCancel, onSave }: {\n value: ItemDraft; isNew: boolean; busy: boolean; bindingId?: string; onCancel: () => void; onSave: (d: ItemDraft) => void\n}) {\n const t = useTranslation()\n const [d, setD] = React.useState<ItemDraft>(value)\n const set = (patch: Partial<ItemDraft>) => setD((x) => ({ ...x, ...patch }))\n const setGroup = (gi: number, patch: Partial<ItemDraft['optionGroups'][number]>) =>\n set({ optionGroups: d.optionGroups.map((g, i) => (i === gi ? { ...g, ...patch } : g)) })\n const setOption = (gi: number, oi: number, patch: Partial<ItemDraft['optionGroups'][number]['options'][number]>) =>\n setGroup(gi, { options: d.optionGroups[gi]!.options.map((o, i) => (i === oi ? { ...o, ...patch } : o)) })\n // Removing a group or complement that holds anything asks once, inline, like the other deletes.\n const [confirming, setConfirming] = React.useState<string | null>(null)\n const removeGroup = (gi: number) => { setConfirming(null); set({ optionGroups: d.optionGroups.filter((_, i) => i !== gi) }) }\n const removeOption = (gi: number, oi: number) => { setConfirming(null); setGroup(gi, { options: d.optionGroups[gi]!.options.filter((_, i) => i !== oi) }) }\n\n return (\n <section className=\"space-y-3 rounded-md border border-primary bg-background p-3\" aria-label={isNew ? t('orders.ifoodMenu.newItem') : t('orders.ifoodMenu.edit')}>\n <header className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{isNew ? t('orders.ifoodMenu.newItem') : t('orders.ifoodMenu.editItem', { name: value.name })}</h3>\n <Button size=\"sm\" variant=\"ghost\" aria-label={t('orders.ifoodMenu.cancel')} onClick={onCancel}><X className=\"h-4 w-4\" /></Button>\n </header>\n {/* Laid out like the product's card: photo on the left, its facts beside it. */}\n <div className=\"flex items-start gap-4 text-xs\">\n <PhotoField large bindingId={bindingId} path={d.imagePath} onPath={(imagePath) => set({ imagePath })} />\n <div className=\"min-w-0 flex-1 space-y-3\">\n <label className=\"block space-y-1\"><span>{t('orders.ifoodMenu.name')}</span>\n <Input value={d.name} onChange={(e) => set({ name: e.target.value })} /></label>\n <div className=\"flex flex-wrap items-end gap-3\">\n <label className=\"space-y-1\"><span>{t('orders.ifoodMenu.price')}</span>\n <MoneyInput value={d.price} wrapperClassName=\"w-28\" onChange={(price) => set({ price })} /></label>\n <div className=\"space-y-1\"><span className=\"block\">{t('orders.ifoodMenu.status')}</span>\n <StatusToggle value={d.status} onChange={(status) => set({ status })} /></div>\n </div>\n </div>\n </div>\n <label className=\"block space-y-1 text-xs\"><span>{t('orders.ifoodMenu.description')}</span>\n <textarea className=\"w-full rounded-md border border-input bg-background p-2 text-sm\" rows={2}\n value={d.description ?? ''} onChange={(e) => set({ description: e.target.value })} /></label>\n\n <div className=\"space-y-2\">\n {d.optionGroups.map((g, gi) => (\n <div key={g.id ?? `new-${gi}`} className=\"overflow-hidden rounded-md border border-border\">\n <div className=\"flex flex-wrap items-end gap-2 bg-muted/40 px-3 py-2 text-xs\">\n <label className=\"min-w-40 flex-1 space-y-1\"><span>{t('orders.ifoodMenu.groupName')}</span>\n <Input value={g.name} onChange={(e) => setGroup(gi, { name: e.target.value })} /></label>\n <label className=\"space-y-1\"><span>{t('orders.ifoodMenu.min')}</span>\n <Input type=\"number\" min={0} value={String(g.min)} wrapperClassName=\"w-16\" onChange={(e) => setGroup(gi, { min: Number(e.target.value) })} /></label>\n <label className=\"space-y-1\"><span>{t('orders.ifoodMenu.max')}</span>\n <Input type=\"number\" min={1} value={String(g.max)} wrapperClassName=\"w-16\" onChange={(e) => setGroup(gi, { max: Number(e.target.value) })} /></label>\n <Button size=\"icon\" variant=\"ghost\" aria-label={t('orders.ifoodMenu.removeGroup')} title={t('orders.ifoodMenu.removeGroup')}\n onClick={() => (g.id || g.name.trim() || g.options.some((o) => o.id || o.name.trim()) ? setConfirming(`g-${gi}`) : removeGroup(gi))}>\n <Trash2 className=\"h-4 w-4\" /></Button>\n </div>\n {confirming === `g-${gi}` && (\n <ConfirmRow text={t('orders.ifoodMenu.confirmGroup', { name: g.name.trim() || t('orders.ifoodMenu.groupName'), n: g.options.length })}\n onConfirm={() => removeGroup(gi)} onCancel={() => setConfirming(null)} />\n )}\n <ul className=\"divide-y divide-border\">\n {g.options.map((o, oi) => (\n <li key={o.id ?? `new-${oi}`} className=\"flex flex-wrap items-center gap-2 px-3 py-2 text-xs\">\n <PhotoField small bindingId={bindingId} path={o.imagePath} onPath={(imagePath) => setOption(gi, oi, { imagePath })} />\n <Input value={o.name} placeholder={t('orders.ifoodMenu.optionName')} aria-label={t('orders.ifoodMenu.optionName')}\n wrapperClassName=\"min-w-36 flex-1\" onChange={(e) => setOption(gi, oi, { name: e.target.value })} />\n <MoneyInput value={o.price} wrapperClassName=\"w-24\" onChange={(price) => setOption(gi, oi, { price })} />\n <StatusToggle compact value={o.status} onChange={(status) => setOption(gi, oi, { status })} />\n <Button size=\"icon\" variant=\"ghost\" aria-label={t('orders.ifoodMenu.removeOption')} title={t('orders.ifoodMenu.removeOption')}\n onClick={() => (o.id || o.name.trim() ? setConfirming(`o-${gi}-${oi}`) : removeOption(gi, oi))}><Trash2 className=\"h-4 w-4\" /></Button>\n {confirming === `o-${gi}-${oi}` && (\n <div className=\"-mx-3 -mb-2 basis-full\">\n <ConfirmRow text={t('orders.ifoodMenu.confirmOption', { name: o.name.trim() })}\n onConfirm={() => removeOption(gi, oi)} onCancel={() => setConfirming(null)} />\n </div>\n )}\n </li>\n ))}\n </ul>\n <div className=\"border-t border-border px-3 py-2\">\n <Button size=\"sm\" variant=\"ghost\"\n onClick={() => setGroup(gi, { options: [...g.options, { name: '', price: 0, status: 'AVAILABLE' }] })}>\n <Plus className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodMenu.addOption')}\n </Button>\n </div>\n </div>\n ))}\n <Button size=\"sm\" variant=\"outline\"\n onClick={() => set({ optionGroups: [...d.optionGroups, { name: '', min: 0, max: 1, status: 'AVAILABLE', options: [{ name: '', price: 0, status: 'AVAILABLE' }] }] })}>\n <Plus className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodMenu.addGroup')}\n </Button>\n </div>\n\n <div className=\"flex justify-end gap-2 border-t border-border pt-3\">\n <Button size=\"sm\" variant=\"ghost\" onClick={onCancel}>{t('orders.ifoodMenu.cancel')}</Button>\n <Button size=\"sm\" disabled={busy} onClick={() => onSave(d)}>\n {busy && <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />} {t('orders.ifoodMenu.save')}\n </Button>\n </div>\n </section>\n )\n}\n\nfunction LinkPicker({ onPick, onCancel }: { onPick: (p: ProductHit) => void; onCancel: () => void }) {\n const t = useTranslation()\n const [term, setTerm] = React.useState('')\n const [hits, setHits] = React.useState<ProductHit[]>([])\n React.useEffect(() => {\n let alive = true\n const id = setTimeout(() => { searchProducts(term).then((h) => { if (alive) setHits(h) }).catch(() => { if (alive) setHits([]) }) }, 250)\n return () => { alive = false; clearTimeout(id) }\n }, [term])\n return (\n <section className=\"space-y-2 rounded-md border border-primary bg-background p-3\" aria-label={t('orders.ifoodMenu.linkTitle')}>\n <header className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodMenu.linkTitle')}</h3>\n <Button size=\"sm\" variant=\"ghost\" aria-label={t('orders.ifoodMenu.cancel')} onClick={onCancel}><X className=\"h-4 w-4\" /></Button>\n </header>\n <Input autoFocus value={term} placeholder={t('orders.ifoodMenu.searchProduct')} onChange={(e) => setTerm(e.target.value)} />\n <ul className=\"max-h-64 space-y-1 overflow-auto\">\n {hits.map((p) => (\n <li key={p.id}>\n <button type=\"button\" className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-muted\" onClick={() => onPick(p)}>\n <Thumb url={p.imageUrl} small />\n <span className=\"flex-1\">{p.name}</span>\n <span className=\"text-xs text-muted-foreground\">{money(p.price)}</span>\n </button>\n </li>\n ))}\n {hits.length === 0 && <li className=\"px-2 text-xs text-muted-foreground\">{t('orders.ifoodMenu.noProducts')}</li>}\n </ul>\n </section>\n )\n}\n","// Operação: the iFood store this account is linked to — its live status, pauses,\n// the week of opening hours, and the log of what iFood answered to each action.\n// Every action shows up in the log below it, which is what iFood's Merchant\n// homologation records next to the action.\nimport React from 'react'\nimport { Loader2, Pause, Play, Plus, RefreshCw, Save, Trash2 } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Input } from '@fayz-ai/ui'\nimport { IfoodMenuPanel } from './IfoodMenuPanel'\nimport {\n storeErrorKey,\n storePanel,\n type LinkedStore,\n type StoreCall,\n type StoreDetails,\n type StorePause,\n type StoreShift,\n} from './storePanel'\n\nconst DAYS = ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'] as const\nconst STATE_TONE: Record<string, string> = {\n OK: 'bg-success/15 text-success',\n WARNING: 'bg-warning/15 text-warning',\n CLOSED: 'bg-muted text-muted-foreground',\n ERROR: 'bg-destructive/15 text-destructive',\n}\n\ninterface Row { dayOfWeek: string; start: string; end: string }\n\nconst minutesOf = (hhmm: string) => {\n const [h, m] = hhmm.split(':').map(Number)\n return (h ?? 0) * 60 + (m ?? 0)\n}\nconst clock = (minutes: number) => `${String(Math.floor(minutes / 60)).padStart(2, '0')}:${String(minutes % 60).padStart(2, '0')}`\nconst toRow = (s: StoreShift): Row => ({ dayOfWeek: s.dayOfWeek, start: s.start.slice(0, 5), end: clock(minutesOf(s.start) + s.duration) })\nconst weekKey = (rows: Row[]) => rows.map((r) => `${r.dayOfWeek} ${r.start} ${r.end}`).sort().join('|')\nconst sameWeek = (a: Row[], b: Row[]) => weekKey(a) === weekKey(b)\nconst wallClock = (v: string | null) => (v ? v.replace('T', ' ').slice(0, 16) : '—')\n\nexport function IfoodStorePanel() {\n const t = useTranslation()\n const [details, setDetails] = React.useState<StoreDetails | null>(null)\n const [linked, setLinked] = React.useState<LinkedStore[]>([])\n // The store and its menu share one tab and one log: every video shows the\n // action and, under it, what iFood answered.\n const [view, setView] = React.useState<'store' | 'menu'>('store')\n const [chosen, setChosen] = React.useState<string | undefined>(undefined)\n const [pauses, setPauses] = React.useState<StorePause[]>([])\n // iFood lists a new pause only a minute or more after accepting it; until\n // then the pause it answered with is shown, marked as waiting for the list.\n const [pending, setPending] = React.useState<StorePause[]>([])\n // The same lag the other way: a removed pause stays in iFood's list for a\n // while after the 204. It stays greyed out until the list drops it, which\n // is when the removal is announced.\n const [removing, setRemoving] = React.useState<string[]>([])\n const removingRef = React.useRef<string[]>([])\n const markRemoving = (ids: string[]) => {\n removingRef.current = [...new Set([...removingRef.current, ...ids])]\n setRemoving(removingRef.current)\n }\n // What iFood's list says now, against what we already know it will say.\n const settle = React.useCallback((listed: StorePause[]) => {\n const isListed = (id: string) => listed.some((l) => l.id === id)\n const gone = removingRef.current.filter((id) => !isListed(id))\n setPauses(listed)\n setPending((current) => current.filter((x) => !isListed(x.id) && !gone.includes(x.id)))\n if (gone.length) {\n removingRef.current = removingRef.current.filter((id) => !gone.includes(id))\n setRemoving(removingRef.current)\n setMessage({ tone: 'ok', text: t('orders.ifoodStore.pause.removed') })\n }\n }, [t])\n const [rows, setRows] = React.useState<Row[] | null>(null)\n // iFood's hours list can also lag a saved week by minutes (its status\n // already obeys the new hours). The week iFood accepted is shown until the\n // list agrees, for up to 10 min.\n const acceptedRef = React.useRef<{ rows: Row[]; at: number } | null>(null)\n const [hoursWaiting, setHoursWaiting] = React.useState(false)\n const applyHours = React.useCallback((listed: Row[]) => {\n const accepted = acceptedRef.current\n if (accepted && sameWeek(listed, accepted.rows)) acceptedRef.current = null\n if (accepted && Date.now() - accepted.at > 10 * 60_000) acceptedRef.current = null\n setRows(acceptedRef.current ? acceptedRef.current.rows : listed)\n setHoursWaiting(!!acceptedRef.current)\n }, [])\n const [draft, setDraft] = React.useState<Row[] | null>(null)\n const [calls, setCalls] = React.useState<StoreCall[]>([])\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState<string | null>(null)\n const [message, setMessage] = React.useState<{ tone: 'error' | 'ok'; text: string } | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [checkedAt, setCheckedAt] = React.useState<Date | null>(null)\n // iFood names its checks with codes it may add to; a code with no sentence\n // here still shows, as the code.\n const known = (key: string, fallback: string) => {\n const text = t(key)\n return text === key ? fallback : text\n }\n const [reason, setReason] = React.useState(t('orders.ifoodStore.pause.defaultReason'))\n const [minutes, setMinutes] = React.useState('30')\n\n const bindingId = details?.bindingId\n\n const loadCalls = React.useCallback(async () => {\n try {\n setCalls((await storePanel.calls(bindingId)).calls)\n } catch {\n // the log is a view; its failure never hides the store\n }\n }, [bindingId])\n\n const load = React.useCallback(async () => {\n setLoadError(null)\n try {\n // The account's stores first, as iFood lists them; the rest is about one.\n const { stores } = await storePanel.stores()\n setLinked(stores)\n const pick = stores.find((s) => s.bindingId === chosen)?.bindingId ?? stores[0]?.bindingId\n // With a store in hand its three reads go together: one wait, not two.\n const first = pick ? null : await storePanel.details()\n const id = pick ?? first!.bindingId\n const [d, p, h] = await Promise.all([first ?? storePanel.details(id), storePanel.pauses(id), storePanel.hours(id)])\n setDetails(d)\n settle(p)\n applyHours(h.shifts.map(toRow))\n setCheckedAt(new Date())\n } catch (error) {\n setLoadError(t(storeErrorKey(error)))\n } finally {\n setLoading(false)\n }\n }, [t, chosen, settle, applyHours])\n\n React.useEffect(() => {\n void load()\n }, [load])\n\n React.useEffect(() => {\n void loadCalls()\n // Every 5 s while someone is looking: a tab left open in the background\n // has no one to show the log to.\n const timer = setInterval(() => { if (!document.hidden) void loadCalls() }, 5000)\n return () => clearInterval(timer)\n }, [loadCalls])\n\n React.useEffect(() => {\n if (!hoursWaiting || !bindingId) return\n const timer = setInterval(() => {\n if (document.hidden) return\n storePanel.hours(bindingId).then((h) => applyHours(h.shifts.map(toRow))).catch(() => {})\n }, 15_000)\n return () => clearInterval(timer)\n }, [hoursWaiting, bindingId, applyHours])\n\n React.useEffect(() => {\n if ((!pending.length && !removing.length) || !bindingId) return\n const timer = setInterval(() => {\n if (document.hidden) return\n storePanel.pauses(bindingId).then(settle).catch(() => {})\n }, 15_000)\n return () => clearInterval(timer)\n }, [pending.length, removing.length, bindingId, settle])\n\n async function act(key: string, ok: string | null, work: () => Promise<unknown>) {\n if (busy) return\n setBusy(key)\n setMessage(null)\n try {\n await work()\n if (ok) setMessage({ tone: 'ok', text: ok })\n } catch (error) {\n setMessage({ tone: 'error', text: t(storeErrorKey(error)) })\n } finally {\n setBusy(null)\n await Promise.all([load(), loadCalls()])\n }\n }\n\n const editing = draft ?? rows ?? []\n const change = (index: number, patch: Partial<Row>) => setDraft(editing.map((r, i) => (i === index ? { ...r, ...patch } : r)))\n\n if (loading) return <p className=\"text-sm text-muted-foreground\">{t('orders.ifoodStore.loading')}</p>\n if (loadError && !details) {\n return (\n <div className=\"space-y-2 text-sm\">\n <p role=\"alert\" className=\"text-destructive\">{loadError}</p>\n <Button size=\"sm\" variant=\"outline\" onClick={() => void load()}>{t('orders.ifoodStore.retry')}</Button>\n </div>\n )\n }\n\n const status = details?.status ?? null\n const shownPauses = [...pauses, ...pending.filter((x) => !pauses.some((p) => p.id === x.id))]\n const waiting = (p: StorePause) => !pauses.some((listed) => listed.id === p.id)\n // Reopen only means something while a pause keeps the store closed.\n const pausedNow = !!status && !status.available && ((!!status.reopenableInterruptionId && !removing.includes(status.reopenableInterruptionId)) || shownPauses.some((p) => !removing.includes(p.id)))\n const address = details?.address\n ? ['street', 'number', 'district', 'city', 'state', 'postalCode'].map((k) => details.address![k]).filter(Boolean).join(', ')\n : null\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"space-y-0.5 text-sm\">\n <p className=\"font-medium\">{details?.name ?? t('orders.ifoodStore.store')}</p>\n {details?.corporateName && <p className=\"text-xs text-muted-foreground\">{details.corporateName}</p>}\n {address && <p className=\"text-xs text-muted-foreground\">{address}</p>}\n </div>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n {checkedAt && t('orders.ifoodStore.checkedAt', { time: checkedAt.toLocaleTimeString() })}\n <Button size=\"sm\" variant=\"ghost\" aria-label={t('orders.ifoodStore.refresh')} onClick={() => void act('refresh', t('orders.ifoodStore.refreshed'), async () => {})}>\n <RefreshCw className={`h-4 w-4 ${busy === 'refresh' ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n </div>\n\n <div role=\"tablist\" className=\"inline-flex rounded-md bg-muted p-1 text-sm\">\n {(['store', 'menu'] as const).map((v) => (\n <button key={v} type=\"button\" role=\"tab\" aria-selected={view === v}\n className={`rounded px-3 py-1 ${view === v ? 'bg-background font-medium shadow-sm' : 'text-muted-foreground'}`}\n onClick={() => setView(v)}>\n {t(`orders.ifoodStore.view.${v}`)}\n </button>\n ))}\n </div>\n\n {view === 'menu' ? (\n <IfoodMenuPanel bindingId={bindingId} onChanged={() => void loadCalls()} />\n ) : (\n <>\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.linked.title')}</h3>\n {linked.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.linked.none')}</p>\n ) : (\n <ul className=\"space-y-1\">\n {linked.map((store) => (\n <li key={store.bindingId}\n className={`flex flex-wrap items-center gap-2 rounded-md border px-2 py-1 text-sm ${store.bindingId === details?.bindingId ? 'border-primary' : 'border-border'}`}>\n <span className=\"font-medium\">{store.name ?? store.merchantId}</span>\n {store.corporateName && <span className=\"text-xs text-muted-foreground\">{store.corporateName}</span>}\n <code className=\"text-xs text-muted-foreground\">{store.merchantId}</code>\n <span className={`rounded-full px-2 py-0.5 text-xs ${store.authorized ? 'bg-success/10 text-success' : 'bg-destructive/10 text-destructive'}`}>\n {store.authorized ? t('orders.ifoodStore.linked.authorized') : t('orders.ifoodStore.linked.revoked')}\n </span>\n {linked.length > 1 && store.bindingId !== details?.bindingId && (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setChosen(store.bindingId)}>{t('orders.ifoodStore.linked.open')}</Button>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n\n {message && (\n <p role={message.tone === 'error' ? 'alert' : 'status'}\n className={`rounded-md px-3 py-2 text-sm ${message.tone === 'error' ? 'bg-destructive/10 text-destructive' : 'bg-success/10 text-success'}`}>\n {message.text}\n </p>\n )}\n\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.status.title')}</h3>\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className={`rounded-full px-3 py-1 text-sm font-semibold ${STATE_TONE[status?.state ?? ''] ?? 'bg-muted'}`}>\n {t(`orders.ifoodStore.state.${status?.state ?? 'UNKNOWN'}`)}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {status?.available ? t('orders.ifoodStore.status.receiving') : t('orders.ifoodStore.status.notReceiving')}\n </span>\n {pausedNow && (\n <Button size=\"sm\" variant=\"outline\" className=\"ml-auto\" disabled={!!busy}\n onClick={() => void act('reopen', t('orders.ifoodStore.reopen.done'), async () => {\n await storePanel.reopen(bindingId)\n markRemoving(shownPauses.map((p) => p.id))\n })}>\n <Play className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodStore.reopen.action')}\n </Button>\n )}\n </div>\n {(status?.title || status?.subtitle) && (\n <p className=\"text-sm\">{[status.title, status.subtitle].filter(Boolean).join(' — ')}</p>\n )}\n {!!status?.validations?.length && (\n <ul className=\"grid gap-1 text-xs sm:grid-cols-2\">\n {status.validations.map((v) => (\n <li key={v.code} className=\"flex items-center gap-2\">\n <span className={`h-2 w-2 rounded-full ${v.state === 'OK' ? 'bg-success' : v.state === 'WARNING' ? 'bg-warning' : 'bg-destructive'}`} />\n <span>{v.title ?? known(`orders.ifoodStore.validation.${v.code}`, v.code)}</span>\n <span className=\"text-muted-foreground\">{known(`orders.ifoodStore.validation.state.${v.state}`, v.state)}</span>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.pause.title')}</h3>\n <div className=\"grid grid-cols-[minmax(0,1fr)_5.5rem] items-end gap-2 sm:grid-cols-[minmax(0,1fr)_5.5rem_auto]\">\n <label className=\"space-y-1 text-xs\">\n <span>{t('orders.ifoodStore.pause.reason')}</span>\n <Input value={reason} maxLength={255} onChange={(e) => setReason(e.target.value)} />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span>{t('orders.ifoodStore.pause.minutes')}</span>\n <Input type=\"number\" min={1} max={10080} value={minutes} onChange={(e) => setMinutes(e.target.value)} />\n </label>\n <Button size=\"lg\" className=\"col-span-2 sm:col-span-1\" disabled={!!busy}\n onClick={() => void act('pause', t('orders.ifoodStore.pause.done'), async () => {\n const created = await storePanel.pause(bindingId, reason, Number(minutes))\n if (created?.id) setPending((current) => [...current.filter((x) => x.id !== created.id), created])\n })}>\n <Pause className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodStore.pause.action')}\n </Button>\n </div>\n {shownPauses.length ? (\n <ul className=\"space-y-1 text-sm\">\n {shownPauses.map((p) => (\n <li key={p.id} aria-busy={removing.includes(p.id)}\n className={`flex items-center gap-2 rounded-md border border-border px-3 py-2 ${removing.includes(p.id) ? 'opacity-50' : ''}`}>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium\">{p.description ?? t('orders.ifoodStore.pause.title')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {wallClock(p.start)} → {wallClock(p.end)}\n {!removing.includes(p.id) && waiting(p) && <span className=\"ml-2 rounded bg-muted px-1.5 py-0.5\">{t('orders.ifoodStore.pause.waiting')}</span>}\n </p>\n </div>\n {removing.includes(p.id) ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" /> {t('orders.ifoodStore.pause.removing')}\n </span>\n ) : (\n <Button size=\"sm\" variant=\"ghost\" disabled={!!busy} aria-label={t('orders.ifoodStore.pause.remove')}\n onClick={() => void act(`rm:${p.id}`, null, async () => {\n await storePanel.removePause(bindingId, p.id)\n markRemoving([p.id])\n })}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n )}\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.pause.none')}</p>\n )}\n </section>\n\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.hours.title')}</h3>\n <p className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.hours.replaces')}</p>\n {hoursWaiting && !draft && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> {t('orders.ifoodStore.hours.waiting')}\n </p>\n )}\n <div className=\"space-y-1\">\n {editing.map((row, index) => (\n <div key={index} className=\"flex flex-wrap items-center gap-2 text-sm\">\n <select className=\"h-9 rounded-md border border-input bg-background px-2\" value={row.dayOfWeek}\n onChange={(e) => change(index, { dayOfWeek: e.target.value })}>\n {DAYS.map((d) => <option key={d} value={d}>{t(`orders.ifoodStore.day.${d}`)}</option>)}\n </select>\n <Input type=\"time\" value={row.start} wrapperClassName=\"w-28\" onChange={(e) => change(index, { start: e.target.value })} />\n <span className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.hours.until')}</span>\n <Input type=\"time\" value={row.end} wrapperClassName=\"w-28\" onChange={(e) => change(index, { end: e.target.value })} />\n <Button size=\"sm\" variant=\"ghost\" aria-label={t('orders.ifoodStore.hours.removeShift')}\n onClick={() => setDraft(editing.filter((_, i) => i !== index))}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={() => setDraft([...editing, { dayOfWeek: 'MONDAY', start: '09:00', end: '18:00' }])}>\n <Plus className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodStore.hours.addShift')}\n </Button>\n <Button size=\"sm\" disabled={!!busy || !draft}\n onClick={() => void act('hours', t('orders.ifoodStore.hours.saved'), async () => {\n const saved = await storePanel.saveHours(bindingId, editing.map((r) => ({\n dayOfWeek: r.dayOfWeek,\n start: `${r.start}:00`,\n duration: minutesOf(r.end) - minutesOf(r.start),\n })))\n acceptedRef.current = { rows: (saved?.shifts?.length ? saved.shifts.map(toRow) : editing), at: Date.now() }\n setDraft(null)\n })}>\n <Save className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodStore.hours.save')}\n </Button>\n {draft && <Button size=\"sm\" variant=\"ghost\" onClick={() => setDraft(null)}>{t('orders.ifoodStore.hours.discard')}</Button>}\n </div>\n </section>\n </>\n )}\n\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.log.title')}</h3>\n <p className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.log.desc')}</p>\n <div className=\"max-h-80 overflow-auto rounded-md border border-border\">\n <table className=\"w-full text-xs\">\n <thead className=\"sticky top-0 bg-muted text-left\">\n <tr>\n <th className=\"p-2\">{t('orders.ifoodStore.log.time')}</th>\n <th className=\"p-2\">{t('orders.ifoodStore.log.method')}</th>\n <th className=\"p-2\">{t('orders.ifoodStore.log.endpoint')}</th>\n <th className=\"p-2\">HTTP</th>\n <th className=\"p-2\">{t('orders.ifoodStore.log.response')}</th>\n </tr>\n </thead>\n <tbody>\n {calls.map((c) => (\n <tr key={c.id} className=\"border-t border-border align-top\">\n <td className=\"whitespace-nowrap p-2\">{new Date(c.at).toLocaleTimeString()}</td>\n <td className=\"p-2 font-mono\">{c.method}</td>\n <td className=\"break-all p-2 font-mono\">{c.path}</td>\n <td className={`p-2 font-mono font-semibold ${c.status === null || c.status >= 400 ? 'text-destructive' : 'text-success'}`}>\n {c.status ?? '—'}{c.errorCode ? ` ${c.errorCode}` : ''}\n </td>\n <td className=\"p-2\">\n {c.response !== null && c.response !== undefined ? (\n <details>\n <summary className=\"cursor-pointer\">{t('orders.ifoodStore.log.see', { ms: c.durationMs })}</summary>\n <pre className=\"max-w-md whitespace-pre-wrap break-all\">{JSON.stringify(c.response, null, 2)}</pre>\n </details>\n ) : (\n <span className=\"text-muted-foreground\">{c.durationMs} ms</span>\n )}\n </td>\n </tr>\n ))}\n {calls.length === 0 && (\n <tr><td colSpan={5} className=\"p-3 text-center text-muted-foreground\">{t('orders.ifoodStore.log.empty')}</td></tr>\n )}\n </tbody>\n </table>\n </div>\n </section>\n </div>\n )\n}\n","// The store's Merchant ID, checked by the integration service. Our iFood apps\n// are CENTRALIZED (one client_credentials token for every store that\n// authorized them): there is no consent screen to send the merchant to and no\n// redirect to come back from, so the platform's OAuth start answered 404 and\n// no new store could connect. Now the store authorizes our app at iFood (we\n// send the request; the owner approves it in the Portal do Parceiro), then\n// types its Merchant ID here. The service checks that the store authorized\n// us and that no other account holds it, and starts reading its orders\n// (control-sdk-backend `POST /v1/delivery/connections/ifood/stores`).\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n tl,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\nimport { IfoodStorePanel } from './IfoodStorePanel'\nimport { serviceRequest, StoreError } from './storePanel'\n\nexport const IFOOD_CONNECTOR_ID = 'ifood'\n\nconst ORDER_TYPE_LABELS: Record<string, string> = {\n DELIVERY: 'Entrega',\n TAKEOUT: 'Retirada',\n INDOOR: 'Consumo no local',\n}\n\nexport const IFOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'orderTypes',\n label: 'Quais pedidos trazer',\n description: 'iFood entrega, deixa retirar e atende no salão; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: ORDER_TYPE_LABELS.DELIVERY },\n { value: 'TAKEOUT', label: ORDER_TYPE_LABELS.TAKEOUT },\n { value: 'INDOOR', label: ORDER_TYPE_LABELS.INDOOR },\n ],\n // Required to OPERATE, not to connect: nothing selected reads as \"conectado, falta configurar\".\n requiredToOperate: true,\n defaultValue: ['DELIVERY', 'TAKEOUT'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `merchantId` is what the store typed; `storeId` is the service's id for the\n// link (the binding), which Desconectar lets go of.\nconst store = createConnectionStore(IFOOD_CONNECTOR_ID, {\n settings: IFOOD_SETTINGS,\n settingsKeys: ['merchantId', 'storeId'],\n})\n\n/** The sentence for each refusal of the link, in the store's words. */\nexport function ifoodLinkRefusal(error: unknown): string {\n const code = error instanceof StoreError ? error.code : ''\n switch (code) {\n case 'merchant_id_invalid':\n return tl(\n \"That is not an iFood Merchant ID. Copy it from the Portal do Parceiro (it looks like 491b9546-ab27-…).\",\n 'Isso não é um ID de loja do iFood. Copie o ID da loja no Portal do Parceiro (ele tem o formato 491b9546-ab27-…).',\n )\n case 'ifood_not_authorized':\n return tl(\n 'This store has not authorized us on iFood yet. Ask our support to send the request, approve it in the Portal do Parceiro, and connect again.',\n 'Esta loja ainda não autorizou o nosso aplicativo no iFood. Peça ao suporte para enviar a solicitação, aprove-a no Portal do Parceiro e conecte de novo.',\n )\n case 'store_taken':\n return tl('This iFood store is already connected to another account.', 'Esta loja do iFood já está conectada a outra conta.')\n case 'not_allowed':\n return tl('Your user cannot change the connections of this account.', 'Seu usuário não pode alterar as conexões desta conta.')\n case 'unauthorized':\n return tl('Your session expired. Sign in again.', 'Sua sessão expirou. Entre de novo.')\n default:\n return tl(\"We could not reach iFood now. Try again in a moment.\", 'Não foi possível falar com o iFood agora. Tente de novo em instantes.')\n }\n}\n\nexport const ifoodConnectorDef: ConnectorDefinition = {\n id: IFOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'iFood',\n description: 'Traga para a cozinha cada pedido feito no iFood, e avise o iFood quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // A typed id the service verifies, not a consent redirect: see the header.\n authKind: 'api-key',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.ifood.com.br/pt-BR/docs/guides/modules/order/workflow/',\n // A ceiling for the scheduler, not the cadence: iFood asks for one poll every 30s.\n rateLimit: { perSecond: 1 },\n permissions: marketplacePermissions('iFood'),\n // Not a secret: the store's own id at iFood. Our client pair never leaves\n // the integration service, and the restaurant never sees a credential.\n fields: [\n {\n key: 'merchantId',\n label: tl('iFood Merchant ID (Portal do Parceiro)', 'ID da loja no iFood (Portal do Parceiro)'),\n type: 'text',\n placeholder: '00000000-0000-0000-0000-000000000000',\n },\n ],\n settings: IFOOD_SETTINGS,\n howItSyncs: [\n 'A ligação com o iFood é lida de tempos em tempos e cada pedido novo entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no iFood.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o iFood — o cliente acompanha pelo aplicativo dele.',\n ],\n ...connectionStatus(\n IFOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(ORDER_TYPE_LABELS, connection?.settings?.orderTypes),\n plane: 'sync',\n ...settingsStatus(IFOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n // The service decides: the store authorized us at iFood, and it is no other\n // account's. Only then is the connection recorded here.\n saveConnection: async (values) => {\n const merchantId = (values.merchantId ?? '').trim()\n let linked: { storeId: string; merchantRef: string; name?: string | null }\n try {\n linked = await serviceRequest('POST', '/v1/delivery/connections/ifood/stores', { merchantId })\n } catch (error) {\n throw new Error(ifoodLinkRefusal(error))\n }\n await store.save({\n active: true,\n settings: { merchantId: linked.merchantRef, storeId: linked.storeId },\n ...(linked.name ? { displayName: `iFood · ${linked.name}` } : {}),\n })\n },\n // The store itself (status, pauses, hours) and what iFood answered, run by\n // the integration service: what iFood's Merchant homologation records.\n OperatePanel: IfoodStorePanel,\n operateLabel: 'Loja',\n // The service stops reading the store's orders first; then the connection\n // here. A store the service already let go of is not an error.\n disconnect: async () => {\n const current = await store.get().catch(() => null)\n const merchantId = typeof current?.settings?.merchantId === 'string' ? current.settings.merchantId : null\n let storeId = typeof current?.settings?.storeId === 'string' ? current.settings.storeId : null\n // A connection made by hand before this (no storeId): the account's link\n // to that iFood store, as the service lists it.\n if (!storeId && merchantId) {\n const linked = await serviceRequest<Array<{ storeId: string; merchantRef: string }>>('GET', '/v1/delivery/stores?provider=ifood').catch(() => [])\n storeId = linked.find((s) => s.merchantRef === merchantId)?.storeId ?? null\n }\n if (storeId) {\n try {\n await serviceRequest('DELETE', `/v1/delivery/connections/ifood/stores/${encodeURIComponent(storeId)}`)\n } catch (error) {\n if (!(error instanceof StoreError && error.status === 404)) throw new Error(ifoodLinkRefusal(error))\n }\n }\n await store.disconnect()\n },\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, like Keeta — but 99Food's reference is behind partner access, so\n// that its open platform brokers merchant authorization the same way is an\n// assumption, not a reading. See ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const NINETY_NINE_FOOD_CONNECTOR_ID = '99food'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const NINETY_NINE_FOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: '99Food entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\nconst store = createConnectionStore(NINETY_NINE_FOOD_CONNECTOR_ID, {\n settings: NINETY_NINE_FOOD_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const nineNineFoodConnectorDef: ConnectorDefinition = {\n id: NINETY_NINE_FOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: '99Food',\n description: 'Traga para a cozinha cada pedido feito no 99Food, e avise o 99Food quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Declared as the same open-platform shape Keeta turned out to be — see the\n // header for what that assumption rests on.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer-food.99app.com/',\n // No rateLimit: whether we poll at all is part of what is unverified.\n permissions: marketplacePermissions('99Food'),\n fields: [],\n settings: NINETY_NINE_FOOD_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no 99Food entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no 99Food.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o 99Food.',\n ],\n ...connectionStatus(\n NINETY_NINE_FOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(NINETY_NINE_FOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(NINETY_NINE_FOOD_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button: appId/appSecret are the platform's and the merchant self-authorizes\n// on Keeta's page. Keeta pushes orders, and there is no connector webhook ingress\n// yet — see ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const KEETA_CONNECTOR_ID = 'keeta'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const KEETA_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'Keeta entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `shopId` comes back with the grant — it is what an inbound push matches a\n// tenant on, and it is discovered, never typed.\nconst store = createConnectionStore(KEETA_CONNECTOR_ID, {\n settings: KEETA_SETTINGS,\n settingsKeys: ['shopId'],\n})\n\nexport const keetaConnectorDef: ConnectorDefinition = {\n id: KEETA_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Keeta',\n description: 'Traga para a cozinha cada pedido feito no Keeta, e avise o Keeta quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Keeta's own words: the credentials are software-level and the merchant\n // self-authorizes, which is the redirect flow this declares.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Keeta dials us, iFood does not.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://api-docs.mykeeta.com/apis/standard/docs/intro',\n // No rateLimit: a budget describes what we spend, and nothing here polls Keeta.\n permissions: marketplacePermissions('Keeta'),\n fields: [],\n settings: KEETA_SETTINGS,\n howItSyncs: [\n 'O Keeta avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Se o aviso não chegar de primeira, o Keeta tenta de novo — e um pedido já trazido não entra duas vezes.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Keeta.',\n ],\n ...connectionStatus(\n KEETA_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(KEETA_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(KEETA_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, and this one is Uber's own documented flow rather than an\n// assumption: the merchant is sent to Uber's login, authorizes the scope\n// `eats.pos_provisioning`, and comes back with an authorization code. The pair\n// behind it is ours — the restaurant never sees it. See\n// ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const UBER_EATS_CONNECTOR_ID = 'ubereats'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const UBER_EATS_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O Uber Eats entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` is Uber's own store id, read from `GET /stores` with the grant and\n// then provisioned with `POST /pos_data`. Discovered, never typed — Uber's docs\n// say in so many words that the external id \"can be arbitrary and should not be\n// used as a sole matchpoint\".\nconst store = createConnectionStore(UBER_EATS_CONNECTOR_ID, {\n settings: UBER_EATS_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const uberEatsConnectorDef: ConnectorDefinition = {\n id: UBER_EATS_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Uber Eats',\n description:\n 'Traga para a cozinha cada pedido feito no Uber Eats, e avise o Uber Eats quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Two grants, one merchant-facing: `client_credentials` for the day-to-day\n // calls and `authorization_code` for the store activation. It is the second\n // that this button opens.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Uber Eats pushes, like Keeta.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.uber.com/docs/eats/introduction',\n // No rateLimit: a budget describes what we spend, and nothing here polls Uber.\n permissions: marketplacePermissions('Uber Eats'),\n fields: [],\n settings: UBER_EATS_SETTINGS,\n howItSyncs: [\n 'O Uber Eats avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no Uber Eats.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Uber Eats.',\n ],\n ...connectionStatus(\n UBER_EATS_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(UBER_EATS_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(UBER_EATS_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// The one on this shelf with no consent screen to open, and it is Rappi's\n// protocol that decides it: the `client_id`/`client_secret` pair is issued in\n// Rappi's onboarding to WHOEVER INTEGRATES — one pair for the whole fleet, not\n// one per restaurant — and exchanged at `token/login/integrations` for a bearer\n// token. Nothing is redirected, so there is nothing to broker.\n//\n// That makes it the PlugBank shape, not the Cielo one: `api-key` with no\n// `fields`, because the credential is ours and lives in the platform. The\n// restaurant fills in nothing — asking it to paste our pair would be the defect\n// the house rule exists to prevent, and asking it to paste a pair of its own\n// would send every restaurant to register an application Rappi issues to\n// integrators anyway.\n//\n// Declaring `oauth` would be the other lie: a Conectar that opens a screen Rappi\n// does not have. ../DELIVERY-MARKETPLACES.md keeps the evidence.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const RAPPI_CONNECTOR_ID = 'rappi'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const RAPPI_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O Rappi entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` is read from Rappi with our token, never typed: the pair is issued\n// per integration and one integration carries every store Rappi linked to it.\nconst store = createConnectionStore(RAPPI_CONNECTOR_ID, {\n settings: RAPPI_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const rappiConnectorDef: ConnectorDefinition = {\n id: RAPPI_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Rappi',\n description: 'Traga para a cozinha cada pedido feito no Rappi, e avise o Rappi quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n authKind: 'api-key',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://dev-portal.rappi.com/pt/',\n // No `providerInstall`: there is no panel where the restaurant fetches a key,\n // because there is no key for the restaurant to fetch.\n //\n // No rateLimit: Rappi's own standard is a request every 45 seconds, and that\n // budget belongs with the job that spends it — which is not written yet.\n permissions: marketplacePermissions('Rappi'),\n // Nothing to fill in: the pair is registered in Fayz, and the connect step\n // says exactly that instead of drawing an empty grid.\n fields: [],\n settings: RAPPI_SETTINGS,\n howItSyncs: [\n 'De tempos em tempos, os pedidos novos do Rappi entram na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no Rappi.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Rappi.',\n ],\n ...connectionStatus(\n RAPPI_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(RAPPI_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n // No `testConnection`, for PlugBank's reason: the credential is not in this\n // app, so there is nothing this side can validate — and ConnectorDetail\n // renders the button only when the verb exists.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, through Magalu ID — the aiqfome V2 standard. The lojista\n// authorizes the application STORE BY STORE, which is the same grant shape the\n// other marketplaces use and not a second kind of thing: one authorization, one\n// connection, one store. The pair behind it is ours. See\n// ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const AIQFOME_CONNECTOR_ID = 'aiqfome'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const AIQFOME_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O aiqfome entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` comes back with the grant: the authorization is per store, so the\n// grant already names which one. Discovered, never typed.\nconst store = createConnectionStore(AIQFOME_CONNECTOR_ID, {\n settings: AIQFOME_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const aiqfomeConnectorDef: ConnectorDefinition = {\n id: AIQFOME_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'aiqfome',\n description: 'Traga para a cozinha cada pedido feito no aiqfome, e avise o aiqfome quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Magalu ID: authorization code, `access_token` + `refresh_token`, and the\n // consent lives on the seller's own panel.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.aiqfome.com/docs/api/versions',\n // No rateLimit: how often the orders are read is part of what is unverified.\n permissions: marketplacePermissions('aiqfome'),\n fields: [],\n settings: AIQFOME_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no aiqfome entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no aiqfome.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o aiqfome.',\n ],\n ...connectionStatus(\n AIQFOME_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(AIQFOME_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(AIQFOME_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","import { defineSettingsTab } from '@fayz-ai/admin'\nimport { tl } from '@fayz-ai/core'\n\nexport const ordersV1SettingsTabs = [\n defineSettingsTab({\n id: 'orders-scale',\n label: tl('Scale & sale by weight', 'Balança e venda por peso'),\n icon: 'Scale',\n section: 'operations',\n requiresFacet: 'scale',\n pending: true,\n defaults: { 'scale.auto_launch': false, 'scale.min_weight_g': 10, 'scale.label_enabled': false, 'scale.label_prefix': '2', 'scale.label_code_length': 4, 'scale.label_value_kind': 'price' },\n sections: [\n { title: tl('Weighing', 'Pesagem'), fields: [\n { key: 'scale.auto_launch', type: 'boolean', scope: 'unit', label: tl('Launch on its own once the weight settles', 'Lançar sozinho quando o peso estabilizar') },\n { key: 'scale.min_weight_g', type: 'number', scope: 'unit', min: 1, max: 5000, label: tl('Minimum weight (g)', 'Peso mínimo (g)') },\n ] },\n { title: tl('Scale labels', 'Etiqueta da balança'), fields: [\n { key: 'scale.label_enabled', type: 'boolean', scope: 'unit', label: tl('Read scale labels at the POS', 'Ler etiqueta de balança no PDV') },\n { key: 'scale.label_prefix', type: 'string', scope: 'unit', label: tl('Barcode prefix', 'Prefixo do código') },\n { key: 'scale.label_code_length', type: 'number', scope: 'unit', min: 4, max: 6, label: tl('Product code digits', 'Dígitos do código do produto') },\n { key: 'scale.label_value_kind', type: 'select', scope: 'unit', label: tl('The label carries', 'A etiqueta traz'), options: [\n { value: 'price', label: tl('Price', 'Preço') }, { value: 'weight', label: tl('Weight', 'Peso') },\n ] },\n ] },\n ],\n }),\n]\n","import React from 'react'\nimport { lazyComponent, tl } from '@fayz-ai/core'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from '@fayz-ai/orders/data/provider'\nimport type { RestaurantOrder } from '@fayz-ai/orders/domain/order'\nimport { createSupabaseOrdersProvider } from '@fayz-ai/orders/data/supabase'\nimport { createOrdersStore } from '@fayz-ai/orders/store'\nimport { ordersRegistries } from './data/registries'\nimport { MIGRATIONS } from './migrations'\nimport { ordersLocales } from './locales'\nimport { ifoodConnectorDef } from './integrations/ifood/connectorDef'\nimport { nineNineFoodConnectorDef } from './integrations/99food/connectorDef'\nimport { keetaConnectorDef } from './integrations/keeta/connectorDef'\nimport { uberEatsConnectorDef } from './integrations/ubereats/connectorDef'\nimport { rappiConnectorDef } from './integrations/rappi/connectorDef'\nimport { aiqfomeConnectorDef } from './integrations/aiqfome/connectorDef'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport type { OrderSourceOption, OrdersPluginLabels, ResolvedOrdersConfig } from './context'\nimport { ordersV1SettingsTabs } from './settings/v1-settings'\n\n// Code loads when it is first drawn, not with the app. Pages use React.lazy\n// (the shell's route boundary shows the page skeleton); anything that may\n// render elsewhere uses lazyComponent, which carries its own boundary.\nconst DeliverySettings = lazyComponent(() => import('./settings/DeliverySettings').then((m) => m.DeliverySettings))\n\nconst OrdersPage = React.lazy(() => import('./views/OrdersPage').then((m) => ({ default: m.OrdersPage })))\nconst OrderDetailRoute = React.lazy(() => import('./views/OrderDetailRoute').then((m) => ({ default: m.OrderDetailRoute })))\n\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n moduleName: tl('Orders & POS', 'Pedidos e PDV'),\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\n]\n\nexport interface OrdersPluginOptions {\n modules?: {\n delivery?: boolean\n takeout?: boolean\n }\n labels?: Partial<OrdersPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: OrdersDataProvider\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n onOrderCancelled?: (order: RestaurantOrder) => Promise<void>\n orderSources?: OrderSourceOption[]\n /** @deprecated One screen serves every account now; the value is ignored. */\n variant?: 'restaurant' | 'commercial'\n /**\n * Where \"create order\" goes, and whether the list offers it at all.\n *\n * This plugin shipped a board and no way to put anything on it — its own\n * `declaredLimits` note says order creation \"flows only through the\n * store/AI-tool with no dedicated UI create handler\". The restaurant app\n * worked around that with a rail entry called \"Nova comanda\", which put the\n * act of opening an order in the navigation instead of on the screen that\n * lists them, two clicks from the board it belongs to.\n *\n * The screen still belongs to the host — a comanda asks for a table and a\n * service mode, an e-commerce order asks for a customer and an address, and\n * neither belongs in this plugin. What belongs here is the BUTTON, in the\n * place every other list in the product keeps it.\n *\n * Unset means no button, which stays right for a variant whose orders arrive\n * from a storefront rather than from someone standing at a counter.\n */\n createRoute?: string\n /** The full order page for an id. Unset = the rail offers no \"Ver pedido completo\". */\n orderRoute?: (orderId: string) => string\n /** The edit screen for an id. Unset hides \"Editar pedido\". */\n editRoute?: (orderId: string) => string\n /** Whether this order may still be edited. Defaults to the archetype's `orderIsEditable` (open and new). */\n canEditOrder?: (order: { status?: string }) => boolean\n}\n\nfunction resolveConfig(options?: OrdersPluginOptions): ResolvedOrdersConfig {\n return {\n modules: {\n delivery: options?.modules?.delivery !== false,\n takeout: options?.modules?.takeout !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n orderSources: options?.orderSources ?? DEFAULT_ORDER_SOURCES,\n menuItemLookup: options?.menuItemLookup,\n staffLookup: options?.staffLookup,\n onOrderCompleted: options?.onOrderCompleted,\n onOrderCancelled: options?.onOrderCancelled,\n createRoute: options?.createRoute,\n editRoute: options?.editRoute,\n canEditOrder: options?.canEditOrder,\n orderRoute: options?.orderRoute,\n }\n}\n\nexport function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // Reads the account's real orders unless the app brings its own provider.\n // Read-only by default: status changes go through `@fayz-ai/core/orders`.\n const provider = options?.dataProvider ?? createSupabaseOrdersProvider()\n const store = createOrdersStore(provider, {\n onOrderCompleted: config.onOrderCompleted,\n onOrderCancelled: config.onOrderCancelled,\n })\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrdersPage, { config, provider, store, registries: ordersRegistries }))\n\n // `:id` arrives as a prop — AdminShell spreads the matched route params.\n const DetailComponent: React.FC<any> = ({ id }: { id?: string }) =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrderDetailRoute, {\n id,\n options: { editRoute: options?.editRoute, canEditOrder: options?.canEditOrder },\n }))\n\n return {\n id: 'orders',\n // The tenant's config arrives after load; the merge is shallow, per block, like the app's own call.\n rebuild: (tenantConfig) =>\n createOrdersPlugin({ ...options, ...(tenantConfig as OrdersPluginOptions) }),\n defaultAgentRole: 'operations',\n name: config.labels.moduleName,\n icon: 'Coins',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n // No `menu`: a sale is not a restaurant's, and a dependency lights up by\n // drag — every account with Orders would grow a Cardápio line.\n dependencies: [],\n // What installing this provisions, byte-for-byte the files under\n // src/migrations (embed barrel). The spine holds the orders tables; this\n // list holds the doors the plugin adds on top of them.\n migrations: MIGRATIONS.map((m) => ({\n id: `orders-${m.id}`,\n version: '1.0.0',\n sql: m.sql,\n description: m.id,\n })),\n events: [\n {\n name: 'orders.order_completed',\n title: 'Order completed',\n trigger: 'When an order reaches the completed status.',\n payloadSchema: {\n type: 'object',\n properties: {\n order_id: { type: 'string' },\n reference_number: { type: 'string' },\n total: { type: 'number' },\n item_count: { type: 'number' },\n source: { type: 'string' },\n },\n required: ['order_id', 'reference_number', 'total', 'item_count', 'source'],\n },\n },\n {\n name: 'orders.order_cancelled',\n title: 'Order cancelled',\n trigger: 'When an order reaches the cancelled status.',\n payloadSchema: {\n type: 'object',\n properties: {\n order_id: { type: 'string' },\n reference_number: { type: 'string' },\n total: { type: 'number' },\n item_count: { type: 'number' },\n source: { type: 'string' },\n },\n required: ['order_id', 'reference_number', 'total', 'item_count', 'source'],\n },\n },\n ],\n // No client-side guard yet: creation goes through the AI tool; the declaration keeps the cap countable.\n declaredLimits: [\n { key: 'orders_month', label: 'Orders / month', table: 'orders', kindFilter: 'order', period: 'month' },\n ],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/orders',\n icon: 'Coins',\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/orders',\n component: PageComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n {\n path: '/orders/:id',\n component: DetailComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'orders.today-summary',\n name: 'getOrdersSummary',\n description: 'Returns order count, revenue, and average ticket for today or a given period.',\n icon: 'ClipboardList',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n period: { type: 'string' as const, description: 'today, week, month' },\n },\n },\n suggestions: [\n { label: 'Quantos pedidos hoje?' },\n { label: \"Qual o ticket médio hoje?\" },\n { label: \"Qual o item mais pedido?\" },\n ],\n },\n {\n id: 'orders.active-orders',\n name: 'getActiveOrders',\n description: 'Lists currently active (non-completed) orders.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n status: { type: 'string' as const, description: 'Filter by status' },\n },\n },\n suggestions: [\n { label: 'Quais pedidos estão em preparo agora?' },\n { label: 'Tem pedido de delivery esperando?' },\n ],\n },\n {\n id: 'orders.create-order',\n name: 'createOrder',\n description: 'Creates a new restaurant order with items.',\n icon: 'PlusCircle',\n mode: 'persist' as const,\n limitKey: 'orders_month',\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n tableNumber: { type: 'number' as const, description: 'Table number (for dine-in)' },\n items: { type: 'array' as const, description: 'Item names and quantities' },\n },\n required: ['kind', 'items'],\n },\n permission: { feature: 'orders', action: 'create' as const },\n },\n ],\n registries: ordersRegistries,\n facets: [\n { id: 'scale', label: 'Balança', description: 'Venda por peso com balança e etiqueta.' },\n { id: 'delivery', label: 'Delivery e iFood', description: 'Entrega própria e pedidos do iFood e outros marketplaces.', defaultEnabled: true },\n ],\n settings: [\n ...ordersV1SettingsTabs,\n {\n id: 'orders',\n label: config.labels.pageTitle,\n icon: 'ClipboardList',\n component: (() => {\n const OrdersSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Orders Settings',\n registries: ordersRegistries,\n routeBase: '/settings/orders',\n })\n OrdersSettingsTab.displayName = 'OrdersSettingsTab'\n return OrdersSettingsTab\n })(),\n order: 22,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ...(config.modules.delivery\n ? [{\n id: 'orders-delivery',\n label: 'Delivery',\n icon: 'Bike',\n // Delivery is sold apart: its settings appear once the account turns it on.\n requiresFacet: 'delivery',\n component: (() => {\n const DeliverySettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(DeliverySettings))\n DeliverySettingsTab.displayName = 'DeliverySettingsTab'\n return DeliverySettingsTab\n })(),\n order: 23,\n // The delivery fee is the owner's decision, like the service charge in plugin-tables.\n permission: { feature: 'orders', action: 'edit' as const },\n }]\n : []),\n ],\n locales: ordersLocales,\n // Offered regardless of `modules.delivery`: a takeout-only house still takes iFood pickup orders.\n connectors: [\n ifoodConnectorDef,\n nineNineFoodConnectorDef,\n keetaConnectorDef,\n uberEatsConnectorDef,\n rappiConnectorDef,\n aiqfomeConnectorDef,\n ],\n }\n}\n\nexport type { OrderSourceOption, OrdersPluginLabels, ResolvedOrdersConfig } from './context'\n\nexport { ifoodConnectorDef, IFOOD_CONNECTOR_ID, IFOOD_SETTINGS } from './integrations/ifood/connectorDef'\nexport {\n nineNineFoodConnectorDef, NINETY_NINE_FOOD_CONNECTOR_ID, NINETY_NINE_FOOD_SETTINGS,\n} from './integrations/99food/connectorDef'\nexport { keetaConnectorDef, KEETA_CONNECTOR_ID, KEETA_SETTINGS } from './integrations/keeta/connectorDef'\nexport { uberEatsConnectorDef, UBER_EATS_CONNECTOR_ID, UBER_EATS_SETTINGS } from './integrations/ubereats/connectorDef'\nexport { rappiConnectorDef, RAPPI_CONNECTOR_ID, RAPPI_SETTINGS } from './integrations/rappi/connectorDef'\nexport { aiqfomeConnectorDef, AIQFOME_CONNECTOR_ID, AIQFOME_SETTINGS } from './integrations/aiqfome/connectorDef'\nexport { marketplacePermissions, AUTO_ACCEPT_SETTING, PREP_TIME_SETTING } from './integrations/shared'\n\n// Published names apps already import from this package; the definitions live in @fayz-ai/orders.\nexport {\n ADVANCE_VERB, DEFAULT_STATUS_CONFIGS, KANBAN_COLUMNS, STATUS_FLOW,\n getNextStatus, getPreviousStatus, mapToKanbanColumn,\n} from '@fayz-ai/orders/domain/order'\nexport type {\n CreateOrderInput, CreateOrderItemInput, DeliveryStatus, DineInStatus, KanbanColumn, OrderKind, OrderQuery,\n OrderStatus, OrderStatusConfig, OrdersSummary, PaginatedResult, RestaurantOrder, RestaurantOrderItem,\n TakeoutStatus, UpdateOrderStatusInput,\n} from '@fayz-ai/orders/domain/order'\nexport type { OrdersDataProvider } from '@fayz-ai/orders/data/provider'\nexport { createFayzOrdersProvider, type FayzOrdersProviderOptions } from '@fayz-ai/orders/data/platform'\n// The pool-direct provider: reads v_orders under RLS instead of proxying\n// through the platform's data API. `writes` makes it the flow's owner.\nexport {\n createSupabaseOrdersProvider as createCoreOrdersProvider,\n type SupabaseOrdersProviderOptions as CoreOrdersProviderOptions,\n type SupabaseOrdersWriteOptions as CoreOrdersWriteOptions,\n} from '@fayz-ai/orders/data/supabase'\nexport { createMockOrdersProvider } from '@fayz-ai/orders/data/mock'\nexport { ORDER_DETAIL_COMPONENT_ID } from './lib/detail-slot'\nexport type { OrderDetailSlotProps } from './lib/detail-slot'\n"]}
1
+ {"version":3,"sources":["../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/integrations/shared.ts","../src/integrations/ifood/storePanel.ts","../src/integrations/ifood/catalogPanel.ts","../src/integrations/ifood/IfoodMenuPanel.tsx","../src/integrations/ifood/IfoodStorePanel.tsx","../src/integrations/ifood/connectorDef.tsx","../src/integrations/99food/connectorDef.tsx","../src/integrations/keeta/connectorDef.tsx","../src/integrations/ubereats/connectorDef.tsx","../src/integrations/rappi/connectorDef.tsx","../src/integrations/aiqfome/connectorDef.tsx","../src/settings/v1-settings.ts","../src/lib/onboarding.ts","../src/index.ts"],"names":["getSupabaseClientOptional","getActiveTenantId","now","React","ImageIcon","useTranslation","jsx","jsxs","Button","RefreshCw","Fragment","store","Play","Input","Pause","Loader2","Trash2","Plus","storeId","createConnectionStore","connectionStatus","settingsStatus","connectionSettings","connectionRuns","SERVICE_MODE_LABELS","fayzConnectorOAuth","tl","db"],"mappings":"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","file":"index.js","sourcesContent":["import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst orderSourceEntity: EntityDef = {\n name: 'Order Source',\n namePlural: 'Order Sources',\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'order_sources', tenantScoped: true },\n}\n\nexport const ordersRegistries: PluginRegistryDef[] = [\n {\n id: 'order-sources',\n entity: orderSourceEntity,\n icon: 'Globe',\n description: 'Order sources and delivery platforms',\n display: 'table',\n seedData: [\n { id: 'os-dine', name: 'Dine-in', icon: '🍽️', isActive: true },\n { id: 'os-takeout', name: 'Takeout', icon: '🥡', isActive: true },\n { id: 'os-ifood', name: 'iFood', icon: '🔴', isActive: true },\n { id: 'os-99food', name: '99Food', icon: '🟡', isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'orders.title': 'Orders',\n 'orders.detail.addItem': 'Add item',\n 'orders.detail.searchMenu': 'Search the menu…',\n 'orders.detail.cancel': 'Cancel order',\n 'orders.detail.cancelConfirm': 'Cancel {reference}? This cannot be undone.',\n 'orders.nav.kanban': 'Orders',\n 'orders.nav.list': 'History',\n 'orders.nav.new': 'New Order',\n 'orders.nav.dashboard': 'Dashboard',\n 'orders.list.column.order': 'Order',\n 'orders.list.column.customer': 'Customer',\n 'orders.list.column.total': 'Total',\n 'orders.list.column.status': 'Status',\n 'orders.list.searchPlaceholder': 'Search by number, customer or table…',\n 'orders.kanban.title': 'Orders',\n 'orders.kanban.subtitle': 'Active orders',\n 'orders.kanban.noOrders': 'No active orders',\n 'orders.kanban.noOrdersDesc': 'Orders will appear here as they come in',\n 'orders.kanban.newOrder': 'New Order',\n 'orders.kanban.advance': 'Advance',\n // O verbo de cada passo, chaveado pelo estado ALVO. E o que o botao do\n // cartao diz: quem esta no salao nao \"avanca\" um pedido, ele confirma,\n // prepara, serve ou despacha.\n 'orders.advance.draft': 'Save draft',\n 'orders.advance.new': 'Send',\n 'orders.advance.confirmed': 'Confirm',\n 'orders.advance.preparing': 'Start prep',\n 'orders.advance.ready': 'Mark ready',\n 'orders.advance.served': 'Serve',\n 'orders.advance.picked_up': 'Hand over',\n 'orders.advance.dispatched': 'Dispatch',\n 'orders.advance.delivered': 'Confirm delivery',\n 'orders.advance.completed': 'Complete',\n 'orders.advance.cancelled': 'Cancel',\n 'orders.kanban.cancel': 'Cancel Order',\n 'orders.kanban.column.new': 'New',\n 'orders.kanban.column.confirmed': 'Confirmed',\n 'orders.kanban.column.open': 'Open',\n 'orders.kanban.column.preparing': 'Preparing',\n 'orders.kanban.column.ready': 'Ready',\n 'orders.kanban.column.out': 'Out',\n 'orders.kanban.column.served': 'Served',\n 'orders.kanban.column.completed': 'Completed',\n 'orders.kanban.column.cancelled': 'Cancelled',\n 'orders.detail.title': 'Order Details',\n 'orders.detail.items': 'Items',\n 'orders.detail.table': 'Table',\n 'orders.detail.customer': 'Customer',\n 'orders.detail.waiter': 'Waiter',\n 'orders.detail.source': 'Source',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Discount',\n 'orders.detail.tax': 'Tax',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Notes',\n 'orders.newOrder.title': 'New Order',\n 'orders.newOrder.selectKind': 'Order type',\n 'orders.newOrder.dineIn': 'Dine-in',\n 'orders.newOrder.takeout': 'Takeout',\n 'orders.delivery.settings': 'Delivery settings',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Select table',\n 'orders.newOrder.addItems': 'Add items',\n 'orders.newOrder.searchItems': 'Search menu...',\n 'orders.newOrder.noItems': 'No items added yet',\n 'orders.newOrder.confirm': 'Place Order',\n 'orders.newOrder.cancel': 'Cancel',\n 'orders.list.title': 'Order History',\n 'orders.list.subtitle': 'All orders',\n 'orders.list.search': 'Search orders...',\n 'orders.list.noOrders': 'No orders found',\n 'orders.source.dine_in': 'Dine-in',\n 'orders.source.takeout': 'Takeout',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Orders Settings',\n // iFood store panel (integrations > iFood > Store)\n 'orders.ifoodStore.tab': 'Store',\n 'orders.ifoodStore.loading': 'Checking the store on iFood…',\n 'orders.ifoodStore.retry': 'Try again',\n 'orders.ifoodStore.store': 'Store',\n 'orders.ifoodStore.checkedAt': 'Checked at {{time}}',\n 'orders.ifoodStore.view.store': \"Store\",\n 'orders.ifoodStore.view.menu': \"iFood menu\",\n 'orders.ifoodMenu.newCategory': \"New category\",\n 'orders.ifoodMenu.createCategory': \"Create category\",\n 'orders.ifoodMenu.categoryCreated': \"Category created on iFood.\",\n 'orders.ifoodMenu.refresh': \"Refresh menu\",\n 'orders.ifoodMenu.refreshed': \"Menu read from iFood.\",\n 'orders.ifoodMenu.empty': \"This store’s iFood menu is empty.\",\n 'orders.ifoodMenu.productCountOne': \"1 product\",\n 'orders.ifoodMenu.productCount': \"{{n}} products\",\n 'orders.ifoodMenu.newItem': \"New product\",\n 'orders.ifoodMenu.editItem': \"Edit {{name}}\",\n 'orders.ifoodMenu.edit': \"Edit\",\n 'orders.ifoodMenu.pause': \"Pause\",\n 'orders.ifoodMenu.resume': \"Resume\",\n 'orders.ifoodMenu.available': \"Available\",\n 'orders.ifoodMenu.paused': \"Paused\",\n 'orders.ifoodMenu.pauseSelected': \"Pause {{n}} selected\",\n 'orders.ifoodMenu.resumeSelected': \"Resume {{n}} selected\",\n 'orders.ifoodMenu.select': \"Select {{name}}\",\n 'orders.ifoodMenu.saved': \"Sent to iFood.\",\n 'orders.ifoodMenu.bulkFailed': \"iFood refused {{n}} change(s): {{codes}}\",\n 'orders.ifoodMenu.minMax': \"min {{min}}, max {{max}}\",\n 'orders.ifoodMenu.pdvCode': \"PDV code\",\n 'orders.ifoodMenu.link': \"Link\",\n 'orders.ifoodMenu.unlink': \"Unlink\",\n 'orders.ifoodMenu.linked': \"Linked to {{name}}.\",\n 'orders.ifoodMenu.unlinked': \"Link removed.\",\n 'orders.ifoodMenu.linkTitle': \"Link to one of your products\",\n 'orders.ifoodMenu.searchProduct': \"Search product\",\n 'orders.ifoodMenu.noProducts': \"No product found.\",\n 'orders.ifoodMenu.name': \"Name\",\n 'orders.ifoodMenu.price': \"Price (R$)\",\n 'orders.ifoodMenu.status': \"Status\",\n 'orders.ifoodMenu.description': \"Description\",\n 'orders.ifoodMenu.groupName': \"Complement group\",\n 'orders.ifoodMenu.min': \"Min\",\n 'orders.ifoodMenu.max': \"Max\",\n 'orders.ifoodMenu.optionName': \"Complement\",\n 'orders.ifoodMenu.addOption': \"Add complement\",\n 'orders.ifoodMenu.addGroup': \"Add complement group\",\n 'orders.ifoodMenu.removeGroup': \"Remove group\",\n 'orders.ifoodMenu.removeOption': \"Remove complement\",\n 'orders.ifoodMenu.photoAdd': \"Add photo\",\n 'orders.ifoodMenu.photoChange': \"Change photo\",\n 'orders.ifoodMenu.photoSending': \"Sending photo…\",\n 'orders.ifoodMenu.photoSaved': \"Photo updated at iFood.\",\n 'orders.ifoodMenu.photoFailed': \"The photo was not accepted (PNG or JPEG, up to 3.9 MB).\",\n 'orders.ifoodMenu.save': \"Save on iFood\",\n 'orders.ifoodMenu.deleteCategory': \"Delete category\",\n 'orders.ifoodMenu.deleteItem': \"Remove from menu\",\n 'orders.ifoodMenu.confirmCategory': \"Delete the category \\\"{{name}}\\\" and its {{n}} product(s) at iFood?\",\n 'orders.ifoodMenu.confirmGroup': \"Remove the group \\\"{{name}}\\\" and its {{n}} complement(s)? It goes to iFood when you save.\",\n 'orders.ifoodMenu.confirmOption': \"Remove the complement \\\"{{name}}\\\"? It goes to iFood when you save.\",\n 'orders.ifoodMenu.confirmItem': \"Remove \\\"{{name}}\\\" from this iFood menu?\",\n 'orders.ifoodMenu.confirmDelete': \"Delete\",\n 'orders.ifoodMenu.deleting': \"deleting at iFood…\",\n 'orders.ifoodMenu.deleted': \"Deleted at iFood.\",\n 'orders.ifoodMenu.sent': \"Sent to iFood. Waiting for iFood to confirm…\",\n 'orders.ifoodMenu.confirmed': \"Confirmed by iFood.\",\n 'orders.ifoodMenu.confirming': \"waiting for iFood…\",\n 'orders.ifoodMenu.creating': \"creating at iFood…\",\n 'orders.ifoodMenu.notConfirmed': \"iFood accepted it but does not show the change yet. Refresh the menu in a few minutes.\",\n 'orders.ifoodMenu.selectedCount': \"{{n}} selected\",\n 'orders.ifoodMenu.cancel': \"Cancel\",\n 'orders.ifoodStore.linked.title': 'Linked stores',\n 'orders.ifoodStore.linked.none': 'No iFood store is linked to this account.',\n 'orders.ifoodStore.linked.authorized': 'authorized',\n 'orders.ifoodStore.linked.revoked': 'not authorized at iFood',\n 'orders.ifoodStore.linked.open': 'Open',\n 'orders.ifoodStore.validation.is.connected.config': 'Connection to iFood',\n 'orders.ifoodStore.validation.is.not.connected.config': 'Connection to iFood',\n 'orders.ifoodStore.validation.during.opening-hours.config': 'Within opening hours',\n 'orders.ifoodStore.validation.has.unavailabilities.active': 'Active pauses',\n 'orders.ifoodStore.validation.state.OK': 'ok',\n 'orders.ifoodStore.validation.state.WARNING': 'warning',\n 'orders.ifoodStore.validation.state.ERROR': 'blocks orders',\n 'orders.ifoodStore.refresh': 'Refresh store',\n 'orders.ifoodStore.refreshed': 'Store refreshed.',\n 'orders.ifoodStore.status.title': 'Status on iFood',\n 'orders.ifoodStore.status.receiving': 'Receiving orders',\n 'orders.ifoodStore.status.notReceiving': 'Not receiving orders',\n 'orders.ifoodStore.state.OK': 'Open',\n 'orders.ifoodStore.state.WARNING': 'Open with restrictions',\n 'orders.ifoodStore.state.CLOSED': 'Closed',\n 'orders.ifoodStore.state.ERROR': 'Closed (check)',\n 'orders.ifoodStore.state.UNKNOWN': 'No status',\n 'orders.ifoodStore.pause.title': 'Pauses',\n 'orders.ifoodStore.pause.defaultReason': 'Operational pause',\n 'orders.ifoodStore.pause.reason': 'Reason',\n 'orders.ifoodStore.pause.minutes': 'Minutes',\n 'orders.ifoodStore.pause.action': 'Pause store',\n 'orders.ifoodStore.pause.done': 'Pause created on iFood.',\n 'orders.ifoodStore.pause.remove': 'Remove pause',\n 'orders.ifoodStore.pause.removed': 'Pause removed at iFood.',\n 'orders.ifoodStore.pause.removing': 'removing at iFood…',\n 'orders.ifoodStore.pause.waiting': 'waiting for iFood to list it',\n 'orders.ifoodStore.pause.none': 'No active or scheduled pause.',\n 'orders.ifoodStore.reopen.action': 'Reopen store',\n 'orders.ifoodStore.reopen.done': 'Store reopened: every pause was removed.',\n 'orders.ifoodStore.hours.title': 'Opening hours',\n 'orders.ifoodStore.hours.replaces': 'Saving replaces the whole week on iFood: days without a shift are closed.',\n 'orders.ifoodStore.hours.until': 'to',\n 'orders.ifoodStore.hours.removeShift': 'Remove shift',\n 'orders.ifoodStore.hours.addShift': 'Shift',\n 'orders.ifoodStore.hours.save': 'Save hours',\n 'orders.ifoodStore.hours.waiting': 'Saved at iFood. Waiting for iFood\\'s list to update…',\n 'orders.ifoodStore.hours.saved': 'Hours saved on iFood.',\n 'orders.ifoodStore.hours.discard': 'Discard',\n 'orders.ifoodStore.day.MONDAY': 'Monday',\n 'orders.ifoodStore.day.TUESDAY': 'Tuesday',\n 'orders.ifoodStore.day.WEDNESDAY': 'Wednesday',\n 'orders.ifoodStore.day.THURSDAY': 'Thursday',\n 'orders.ifoodStore.day.FRIDAY': 'Friday',\n 'orders.ifoodStore.day.SATURDAY': 'Saturday',\n 'orders.ifoodStore.day.SUNDAY': 'Sunday',\n 'orders.ifoodStore.log.title': 'Integration log',\n 'orders.ifoodStore.log.desc': 'Calls made to iFood for this store, newest first.',\n 'orders.ifoodStore.log.time': 'Time',\n 'orders.ifoodStore.log.method': 'Method',\n 'orders.ifoodStore.log.endpoint': 'Endpoint',\n 'orders.ifoodStore.log.response': 'Response',\n 'orders.ifoodStore.log.see': 'see ({{ms}} ms)',\n 'orders.ifoodStore.log.empty': 'No call recorded yet.',\n 'orders.ifoodStore.error.overlap': 'A pause already covers this time. Remove it or pick another period.',\n 'orders.ifoodStore.error.pauseRange': 'A pause lasts from 1 minute to 7 days.',\n 'orders.ifoodStore.error.pauseReason': 'Give a reason for the pause.',\n 'orders.ifoodStore.error.hoursOverlap': 'Two shifts on the same day overlap. Adjust them and save again.',\n 'orders.ifoodStore.error.hoursMidnight': 'A shift ends after 23:59. Split it across two days.',\n 'orders.ifoodStore.error.hoursEmpty': 'Add at least one shift. To close the store for a while, pause it.',\n 'orders.ifoodStore.error.hoursTime': 'Invalid time. Use HH:MM.',\n 'orders.ifoodStore.error.hoursDuration': 'A shift must end after it starts.',\n 'orders.ifoodStore.error.noStore': 'This account has no iFood store linked yet.',\n 'orders.ifoodStore.error.notAllowed': 'You may not manage the integrations of this account.',\n 'orders.ifoodStore.error.signIn': 'Your session expired. Sign in again.',\n 'orders.ifoodStore.error.credentials': 'iFood refused the app credentials (401). Contact support.',\n 'orders.ifoodStore.error.unavailable': 'iFood is unavailable right now (5xx). Try again shortly.',\n 'orders.ifoodStore.error.serviceDown': 'The integration service is unavailable. Try again shortly.',\n 'orders.ifoodStore.error.invalid': 'iFood refused the data sent (400). Check the fields and try again.',\n 'orders.ifoodStore.error.forbidden': 'iFood denied access to this store (403): the app has no permission for it.',\n 'orders.ifoodStore.error.notFound': 'iFood did not find it (404).',\n 'orders.ifoodStore.error.rateLimit': 'Too many requests to iFood (429). Wait 30 seconds and try again.',\n 'orders.ifoodStore.error.nameRequired': \"Enter a name.\",\n 'orders.ifoodStore.error.nameTooLong': \"The name is longer than 100 characters.\",\n 'orders.ifoodStore.error.descriptionTooLong': \"The description is longer than 500 characters.\",\n 'orders.ifoodStore.error.badPrice': \"Invalid price: a product must cost more than zero and a complement can't be negative.\",\n 'orders.ifoodStore.error.groupLimits': \"Check the complement group's minimum and maximum: the maximum must be at least 1 and not below the minimum.\",\n 'orders.ifoodStore.error.groupEmpty': \"Every complement group needs at least one complement.\",\n 'orders.ifoodStore.error.categoryRequired': \"Choose the product's category.\",\n 'orders.ifoodStore.error.badImage': \"iFood takes PNG or JPEG photos. Send the photo in one of those formats.\",\n 'orders.ifoodStore.error.imageTooBig': \"The photo is larger than 3.9 MB, iFood's limit. Send a smaller photo.\",\n 'orders.ifoodStore.error.generic': 'The action could not be completed.',\n // Delivery bands by distance (Settings › Delivery)\n 'orders.zones.title': 'Bands by distance',\n 'orders.zones.description': 'Fee and time per kilometre from the house. Empty = the single fee above applies to everyone.',\n 'orders.zones.empty': 'No bands. The delivery fee above applies at any distance.',\n 'orders.zones.upTo': 'up to',\n 'orders.zones.km': 'km',\n 'orders.zones.fee': 'Fee',\n 'orders.zones.eta': 'min',\n 'orders.zones.add': 'Add band',\n 'orders.zones.remove': 'Remove band up to {{km}} km',\n 'orders.zones.invalid': 'Use numbers, like 3 and 5.90.',\n 'orders.zones.radius': 'Delivery radius: {{km}} km (the largest band).',\n // Delivery by conversation: the confirmation card and the screen's warning\n 'orders.delivery.saveFailed': 'Could not save delivery',\n 'chat.tool.proposeDeliveryZones': 'Propose delivery bands',\n 'chat.tool.saveDeliveryZones': 'Save delivery bands',\n 'chat.field.saveDeliveryZones.zones': 'Bands',\n 'chat.field.saveDeliveryZones.summary': 'Summary',\n}\n","export const ptBR: Record<string, string> = {\n 'orders.title': 'Pedidos',\n 'orders.detail.addItem': 'Lançar item',\n 'orders.detail.searchMenu': 'Buscar no cardápio…',\n 'orders.detail.cancel': 'Cancelar pedido',\n 'orders.detail.cancelConfirm': 'Cancelar {reference}? Não dá para desfazer.',\n 'orders.nav.kanban': 'Pedidos',\n 'orders.nav.list': 'Histórico',\n 'orders.nav.new': 'Novo Pedido',\n 'orders.nav.dashboard': 'Painel',\n 'orders.list.column.order': 'Pedido',\n 'orders.list.column.customer': 'Cliente',\n 'orders.list.column.total': 'Total',\n 'orders.list.column.status': 'Estado',\n 'orders.list.searchPlaceholder': 'Buscar por número, cliente ou mesa…',\n 'orders.kanban.title': 'Pedidos',\n 'orders.kanban.subtitle': 'Pedidos ativos',\n 'orders.kanban.noOrders': 'Nenhum pedido ativo',\n 'orders.kanban.noOrdersDesc': 'Os pedidos aparecerão aqui conforme chegarem',\n 'orders.kanban.newOrder': 'Novo Pedido',\n 'orders.kanban.advance': 'Avançar',\n // O verbo de cada passo, chaveado pelo estado ALVO. E o que o botao do\n // cartao diz: quem esta no salao nao \"avanca\" um pedido, ele confirma,\n // prepara, serve ou despacha.\n 'orders.advance.draft': 'Salvar rascunho',\n 'orders.advance.new': 'Enviar',\n 'orders.advance.confirmed': 'Confirmar',\n 'orders.advance.preparing': 'Preparar',\n 'orders.advance.ready': 'Marcar pronto',\n 'orders.advance.served': 'Servir',\n 'orders.advance.picked_up': 'Entregar',\n 'orders.advance.dispatched': 'Despachar',\n 'orders.advance.delivered': 'Confirmar entrega',\n 'orders.advance.completed': 'Concluir',\n 'orders.advance.cancelled': 'Cancelar',\n 'orders.kanban.cancel': 'Cancelar Pedido',\n 'orders.kanban.column.new': 'Novo',\n 'orders.kanban.column.confirmed': 'Confirmado',\n 'orders.kanban.column.open': 'Aberta',\n 'orders.kanban.column.preparing': 'Preparando',\n 'orders.kanban.column.ready': 'Pronto',\n 'orders.kanban.column.out': 'Saiu',\n 'orders.kanban.column.served': 'Servido',\n 'orders.kanban.column.completed': 'Concluído',\n 'orders.kanban.column.cancelled': 'Cancelado',\n 'orders.detail.title': 'Detalhes do Pedido',\n 'orders.detail.items': 'Itens',\n 'orders.detail.table': 'Mesa',\n 'orders.detail.customer': 'Cliente',\n 'orders.detail.waiter': 'Garçom',\n 'orders.detail.source': 'Origem',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Desconto',\n 'orders.detail.tax': 'Imposto',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Observações',\n 'orders.newOrder.title': 'Novo Pedido',\n 'orders.newOrder.selectKind': 'Tipo de pedido',\n 'orders.newOrder.dineIn': 'Mesa',\n 'orders.newOrder.takeout': 'Para Viagem',\n 'orders.delivery.settings': 'Configurar entrega',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Selecionar mesa',\n 'orders.newOrder.addItems': 'Adicionar itens',\n 'orders.newOrder.searchItems': 'Buscar no cardápio...',\n 'orders.newOrder.noItems': 'Nenhum item adicionado',\n 'orders.newOrder.confirm': 'Fazer Pedido',\n 'orders.newOrder.cancel': 'Cancelar',\n 'orders.list.title': 'Histórico de Pedidos',\n 'orders.list.subtitle': 'Todos os pedidos',\n 'orders.list.search': 'Buscar pedidos...',\n 'orders.list.noOrders': 'Nenhum pedido encontrado',\n 'orders.source.dine_in': 'Mesa',\n 'orders.source.takeout': 'Para Viagem',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Configurações de Pedidos',\n // iFood store panel (integrations > iFood > Loja)\n 'orders.ifoodStore.tab': 'Loja',\n 'orders.ifoodStore.loading': 'Consultando a loja no iFood…',\n 'orders.ifoodStore.retry': 'Tentar novamente',\n 'orders.ifoodStore.store': 'Loja',\n 'orders.ifoodStore.checkedAt': 'Consultado às {{time}}',\n 'orders.ifoodStore.view.store': \"Loja\",\n 'orders.ifoodStore.view.menu': \"Cardápio iFood\",\n 'orders.ifoodMenu.newCategory': \"Nova categoria\",\n 'orders.ifoodMenu.createCategory': \"Criar categoria\",\n 'orders.ifoodMenu.categoryCreated': \"Categoria criada no iFood.\",\n 'orders.ifoodMenu.refresh': \"Atualizar cardápio\",\n 'orders.ifoodMenu.refreshed': \"Cardápio lido do iFood.\",\n 'orders.ifoodMenu.empty': \"O cardápio do iFood desta loja está vazio.\",\n 'orders.ifoodMenu.productCountOne': \"1 produto\",\n 'orders.ifoodMenu.productCount': \"{{n}} produtos\",\n 'orders.ifoodMenu.newItem': \"Novo produto\",\n 'orders.ifoodMenu.editItem': \"Editar {{name}}\",\n 'orders.ifoodMenu.edit': \"Editar\",\n 'orders.ifoodMenu.pause': \"Pausar\",\n 'orders.ifoodMenu.resume': \"Ativar\",\n 'orders.ifoodMenu.available': \"Disponível\",\n 'orders.ifoodMenu.paused': \"Pausado\",\n 'orders.ifoodMenu.pauseSelected': \"Pausar {{n}} selecionados\",\n 'orders.ifoodMenu.resumeSelected': \"Ativar {{n}} selecionados\",\n 'orders.ifoodMenu.select': \"Selecionar {{name}}\",\n 'orders.ifoodMenu.saved': \"Enviado ao iFood.\",\n 'orders.ifoodMenu.bulkFailed': \"O iFood recusou {{n}} alteração(ões): {{codes}}\",\n 'orders.ifoodMenu.minMax': \"mín. {{min}}, máx. {{max}}\",\n 'orders.ifoodMenu.pdvCode': \"Código PDV\",\n 'orders.ifoodMenu.link': \"Vincular\",\n 'orders.ifoodMenu.unlink': \"Desvincular\",\n 'orders.ifoodMenu.linked': \"Vinculado a {{name}}.\",\n 'orders.ifoodMenu.unlinked': \"Vínculo removido.\",\n 'orders.ifoodMenu.linkTitle': \"Vincular a um produto da casa\",\n 'orders.ifoodMenu.searchProduct': \"Buscar produto\",\n 'orders.ifoodMenu.noProducts': \"Nenhum produto encontrado.\",\n 'orders.ifoodMenu.name': \"Nome\",\n 'orders.ifoodMenu.price': \"Preço (R$)\",\n 'orders.ifoodMenu.status': \"Situação\",\n 'orders.ifoodMenu.description': \"Descrição\",\n 'orders.ifoodMenu.groupName': \"Grupo de complementos\",\n 'orders.ifoodMenu.min': \"Mín.\",\n 'orders.ifoodMenu.max': \"Máx.\",\n 'orders.ifoodMenu.optionName': \"Complemento\",\n 'orders.ifoodMenu.addOption': \"Adicionar complemento\",\n 'orders.ifoodMenu.addGroup': \"Adicionar grupo de complementos\",\n 'orders.ifoodMenu.removeGroup': \"Remover grupo\",\n 'orders.ifoodMenu.removeOption': \"Remover complemento\",\n 'orders.ifoodMenu.photoAdd': \"Adicionar foto\",\n 'orders.ifoodMenu.photoChange': \"Trocar foto\",\n 'orders.ifoodMenu.photoSending': \"Enviando foto…\",\n 'orders.ifoodMenu.photoSaved': \"Foto atualizada no iFood.\",\n 'orders.ifoodMenu.photoFailed': \"A foto não foi aceita (PNG ou JPEG, até 3,9 MB).\",\n 'orders.ifoodMenu.save': \"Salvar no iFood\",\n 'orders.ifoodMenu.deleteCategory': \"Excluir categoria\",\n 'orders.ifoodMenu.deleteItem': \"Tirar do cardápio\",\n 'orders.ifoodMenu.confirmCategory': \"Excluir a categoria \\\"{{name}}\\\" e os {{n}} produto(s) dela no iFood?\",\n 'orders.ifoodMenu.confirmGroup': \"Remover o grupo \\\"{{name}}\\\" e os {{n}} complemento(s) dele? Vai pro iFood quando você salvar.\",\n 'orders.ifoodMenu.confirmOption': \"Remover o complemento \\\"{{name}}\\\"? Vai pro iFood quando você salvar.\",\n 'orders.ifoodMenu.confirmItem': \"Tirar \\\"{{name}}\\\" deste cardápio do iFood?\",\n 'orders.ifoodMenu.confirmDelete': \"Excluir\",\n 'orders.ifoodMenu.deleting': \"excluindo no iFood…\",\n 'orders.ifoodMenu.deleted': \"Excluído no iFood.\",\n 'orders.ifoodMenu.sent': \"Enviado ao iFood. Aguardando o iFood confirmar…\",\n 'orders.ifoodMenu.confirmed': \"Confirmado pelo iFood.\",\n 'orders.ifoodMenu.confirming': \"aguardando o iFood…\",\n 'orders.ifoodMenu.creating': \"criando no iFood…\",\n 'orders.ifoodMenu.notConfirmed': \"O iFood aceitou, mas ainda não mostra a alteração. Atualize o cardápio em alguns minutos.\",\n 'orders.ifoodMenu.selectedCount': \"{{n}} selecionado(s)\",\n 'orders.ifoodMenu.cancel': \"Cancelar\",\n 'orders.ifoodStore.linked.title': 'Lojas vinculadas',\n 'orders.ifoodStore.linked.none': 'Nenhuma loja do iFood vinculada a esta conta.',\n 'orders.ifoodStore.linked.authorized': 'autorizada',\n 'orders.ifoodStore.linked.revoked': 'sem autorização no iFood',\n 'orders.ifoodStore.linked.open': 'Abrir',\n 'orders.ifoodStore.validation.is.connected.config': 'Conexão com o iFood',\n 'orders.ifoodStore.validation.is.not.connected.config': 'Conexão com o iFood',\n 'orders.ifoodStore.validation.during.opening-hours.config': 'Dentro do horário de funcionamento',\n 'orders.ifoodStore.validation.has.unavailabilities.active': 'Pausas ativas',\n 'orders.ifoodStore.validation.state.OK': 'ok',\n 'orders.ifoodStore.validation.state.WARNING': 'atenção',\n 'orders.ifoodStore.validation.state.ERROR': 'impede pedidos',\n 'orders.ifoodStore.refresh': 'Atualizar loja',\n 'orders.ifoodStore.refreshed': 'Loja atualizada.',\n 'orders.ifoodStore.status.title': 'Status no iFood',\n 'orders.ifoodStore.status.receiving': 'Recebendo pedidos',\n 'orders.ifoodStore.status.notReceiving': 'Sem receber pedidos',\n 'orders.ifoodStore.state.OK': 'Aberta',\n 'orders.ifoodStore.state.WARNING': 'Aberta com restrições',\n 'orders.ifoodStore.state.CLOSED': 'Fechada',\n 'orders.ifoodStore.state.ERROR': 'Fechada (verificar)',\n 'orders.ifoodStore.state.UNKNOWN': 'Sem status',\n 'orders.ifoodStore.pause.title': 'Pausas',\n 'orders.ifoodStore.pause.defaultReason': 'Pausa operacional',\n 'orders.ifoodStore.pause.reason': 'Motivo',\n 'orders.ifoodStore.pause.minutes': 'Minutos',\n 'orders.ifoodStore.pause.action': 'Pausar loja',\n 'orders.ifoodStore.pause.done': 'Pausa criada no iFood.',\n 'orders.ifoodStore.pause.remove': 'Remover pausa',\n 'orders.ifoodStore.pause.removed': 'Pausa removida no iFood.',\n 'orders.ifoodStore.pause.removing': 'removendo no iFood…',\n 'orders.ifoodStore.pause.waiting': 'aguardando o iFood listar',\n 'orders.ifoodStore.pause.none': 'Nenhuma pausa ativa ou agendada.',\n 'orders.ifoodStore.reopen.action': 'Reabrir loja',\n 'orders.ifoodStore.reopen.done': 'Loja reaberta: todas as pausas foram removidas.',\n 'orders.ifoodStore.hours.title': 'Horário de funcionamento',\n 'orders.ifoodStore.hours.replaces': 'Salvar substitui a semana inteira no iFood: dias sem turno ficam fechados.',\n 'orders.ifoodStore.hours.until': 'até',\n 'orders.ifoodStore.hours.removeShift': 'Remover turno',\n 'orders.ifoodStore.hours.addShift': 'Turno',\n 'orders.ifoodStore.hours.save': 'Salvar horários',\n 'orders.ifoodStore.hours.waiting': 'Salvo no iFood. Aguardando a lista do iFood atualizar…',\n 'orders.ifoodStore.hours.saved': 'Horários salvos no iFood.',\n 'orders.ifoodStore.hours.discard': 'Descartar',\n 'orders.ifoodStore.day.MONDAY': 'Segunda',\n 'orders.ifoodStore.day.TUESDAY': 'Terça',\n 'orders.ifoodStore.day.WEDNESDAY': 'Quarta',\n 'orders.ifoodStore.day.THURSDAY': 'Quinta',\n 'orders.ifoodStore.day.FRIDAY': 'Sexta',\n 'orders.ifoodStore.day.SATURDAY': 'Sábado',\n 'orders.ifoodStore.day.SUNDAY': 'Domingo',\n 'orders.ifoodStore.log.title': 'Log de integração',\n 'orders.ifoodStore.log.desc': 'Chamadas feitas ao iFood por esta loja, mais recentes primeiro.',\n 'orders.ifoodStore.log.time': 'Hora',\n 'orders.ifoodStore.log.method': 'Método',\n 'orders.ifoodStore.log.endpoint': 'Endpoint',\n 'orders.ifoodStore.log.response': 'Resposta',\n 'orders.ifoodStore.log.see': 'ver ({{ms}} ms)',\n 'orders.ifoodStore.log.empty': 'Nenhuma chamada registrada ainda.',\n 'orders.ifoodStore.error.overlap': 'Já existe uma pausa nesse horário. Remova a pausa atual ou escolha outro período.',\n 'orders.ifoodStore.error.pauseRange': 'Uma pausa dura de 1 minuto a 7 dias.',\n 'orders.ifoodStore.error.pauseReason': 'Informe o motivo da pausa.',\n 'orders.ifoodStore.error.hoursOverlap': 'Dois turnos do mesmo dia se sobrepõem. Ajuste os horários e salve de novo.',\n 'orders.ifoodStore.error.hoursMidnight': 'Um turno termina depois das 23:59. Divida-o em dois dias.',\n 'orders.ifoodStore.error.hoursEmpty': 'Informe ao menos um turno. Para fechar a loja por um período, use a pausa.',\n 'orders.ifoodStore.error.hoursTime': 'Horário inválido. Use o formato HH:MM.',\n 'orders.ifoodStore.error.hoursDuration': 'O fim do turno precisa ser depois do início.',\n 'orders.ifoodStore.error.noStore': 'Esta conta ainda não tem uma loja iFood ligada.',\n 'orders.ifoodStore.error.notAllowed': 'Você não tem permissão para gerenciar as integrações desta conta.',\n 'orders.ifoodStore.error.signIn': 'Sua sessão expirou. Entre novamente.',\n 'orders.ifoodStore.error.credentials': 'O iFood recusou as credenciais do aplicativo (401). Fale com o suporte.',\n 'orders.ifoodStore.error.unavailable': 'O iFood está indisponível no momento (erro 5xx). Tente novamente em instantes.',\n 'orders.ifoodStore.error.serviceDown': 'O serviço de integração está indisponível. Tente novamente em instantes.',\n 'orders.ifoodStore.error.invalid': 'O iFood recusou os dados enviados (400). Confira os campos e tente novamente.',\n 'orders.ifoodStore.error.forbidden': 'O iFood negou acesso a esta loja (403): o aplicativo não tem permissão para ela.',\n 'orders.ifoodStore.error.notFound': 'O iFood não encontrou o recurso (404).',\n 'orders.ifoodStore.error.rateLimit': 'Muitas requisições ao iFood (429). Aguarde 30 segundos e tente novamente.',\n 'orders.ifoodStore.error.nameRequired': \"Informe o nome.\",\n 'orders.ifoodStore.error.nameTooLong': \"O nome passa de 100 caracteres.\",\n 'orders.ifoodStore.error.descriptionTooLong': \"A descrição passa de 500 caracteres.\",\n 'orders.ifoodStore.error.badPrice': \"Preço inválido: o produto precisa custar mais que zero e o complemento não pode ser negativo.\",\n 'orders.ifoodStore.error.groupLimits': \"Confira o mínimo e o máximo do grupo de complementos: o máximo precisa ser pelo menos 1 e não menor que o mínimo.\",\n 'orders.ifoodStore.error.groupEmpty': \"Todo grupo de complementos precisa de ao menos um complemento.\",\n 'orders.ifoodStore.error.categoryRequired': \"Escolha a categoria do produto.\",\n 'orders.ifoodStore.error.badImage': \"O iFood aceita fotos PNG ou JPEG. Envie a foto em um desses formatos.\",\n 'orders.ifoodStore.error.imageTooBig': \"A foto passa de 3,9 MB, o limite do iFood. Envie uma foto menor.\",\n 'orders.ifoodStore.error.generic': 'Não foi possível concluir a ação.',\n // Faixas de entrega por distância (Configurações › Delivery)\n 'orders.zones.title': 'Faixas por distância',\n 'orders.zones.description': 'Taxa e tempo por quilômetro a partir da casa. Vazio = a taxa única acima vale para todo mundo.',\n 'orders.zones.empty': 'Nenhuma faixa. A taxa de entrega acima vale para qualquer distância.',\n 'orders.zones.upTo': 'até',\n 'orders.zones.km': 'km',\n 'orders.zones.fee': 'Taxa',\n 'orders.zones.eta': 'min',\n 'orders.zones.add': 'Adicionar faixa',\n 'orders.zones.remove': 'Remover faixa até {{km}} km',\n 'orders.zones.invalid': 'Use números, como 3 e 5,90.',\n 'orders.zones.radius': 'Raio de entrega: {{km}} km (a maior faixa).',\n // Entrega por conversa: o card de confirmação e o aviso da tela\n 'orders.delivery.saveFailed': 'Não foi possível salvar a entrega',\n 'chat.tool.proposeDeliveryZones': 'Montar faixas de entrega',\n 'chat.tool.saveDeliveryZones': 'Gravar faixas de entrega',\n 'chat.field.saveDeliveryZones.zones': 'Faixas',\n 'chat.field.saveDeliveryZones.summary': 'Resumo',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const ordersLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import type { ConnectorPermission, ConnectorSetting } from '@fayz-ai/core'\n\n// The provider name is a parameter because the sentence a tenant judges names it.\nexport function marketplacePermissions(provider: string): ConnectorPermission[] {\n return [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read', 'write'],\n reason:\n `Trazer para cá cada pedido feito no ${provider} — itens, observações, forma de pagamento e o total — ` +\n `e ler o pedido de volta para avisar o ${provider} quando ele for confirmado, sair para entrega ou for cancelado.`,\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'menu_item',\n actions: ['read'],\n reason: `Descobrir qual item do seu cardápio corresponde ao que foi vendido no ${provider}. Nenhum item é alterado.`,\n },\n {\n kind: 'data',\n resource: 'customer',\n actions: ['write'],\n reason: `Registrar quem pediu, com o nome, o telefone e o endereço que o ${provider} envia junto do pedido.`,\n sensitive: true,\n },\n ]\n}\n\nexport const AUTO_ACCEPT_SETTING: ConnectorSetting = {\n key: 'autoAccept',\n label: 'Confirmar o pedido automaticamente',\n description: 'Ligado, o pedido já entra confirmado. Desligado, ele espera alguém aceitar na tela de Pedidos.',\n type: 'toggle',\n defaultValue: false,\n}\n\nexport const PREP_TIME_SETTING: ConnectorSetting = {\n key: 'prepTimeMinutes',\n label: 'Tempo de preparo',\n description: 'Quantos minutos são informados ao aplicativo quando o pedido é confirmado.',\n type: 'text',\n // 5–120: outside that the providers refuse, and the first order is a bad place to find out.\n pattern: '[5-9]|[1-9]\\\\d|1[01]\\\\d|120',\n patternHint: 'De 5 a 120 minutos.',\n placeholder: '30',\n defaultValue: '30',\n}\n\n/** One-line summary for the connection row. Tolerates a hand-edited jsonb string. */\nexport function serviceModesDetail(labels: Record<string, string>, value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const named = list.map((v) => labels[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return named.length > 0 ? named.join(', ') : undefined\n}\n","// The iFood store, as the integration service runs it (control-sdk-backend,\n// the store resources of ADR 0006: /v1/delivery/stores/{storeId}/…). The\n// service verifies who is asking and asks the database whether they may\n// manage this account's settings; nothing here decides that, and no iFood\n// credential ever reaches the browser. Without a service URL (`VITE_CONTROL_API_URL`)\n// every call is refused with 503 `no_client`.\nimport { getActiveTenantId, getActiveUnitId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport { serviceBaseUrl } from '@fayz-ai/admin'\n\nexport interface StoreValidation { code: string; state: string; title: string | null; subtitle: string | null }\nexport interface StoreStatus {\n operation: string\n salesChannel: string\n state: string\n available: boolean\n title: string | null\n subtitle: string | null\n validations: StoreValidation[]\n reopenableInterruptionId: string | null\n}\nexport interface StoreDetails {\n bindingId: string\n merchantId: string\n name: string | null\n corporateName: string | null\n address: Record<string, unknown> | null\n status: StoreStatus | null\n}\nexport interface LinkedStore { bindingId: string; merchantId: string; name: string | null; corporateName: string | null; authorized: boolean }\nexport interface StorePause { id: string; description: string | null; start: string | null; end: string | null }\nexport interface StoreShift { dayOfWeek: string; start: string; duration: number }\nexport interface StoreCall {\n id: number\n at: string\n method: string\n path: string\n status: number | null\n durationMs: number\n errorCode: string | null\n request: unknown\n response: unknown\n}\n\n/** A refusal from the service: the code picks the sentence, the status says what kind. */\nexport class StoreError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) {\n super(message)\n this.name = 'StoreError'\n }\n}\n\n/**\n * `?ifood-simulate=429` or `=500` in the address makes every action answer that\n * refusal without calling anyone. iFood's homologation asks to see what the\n * screen says for errors that cannot be caused on demand; nothing else reads it.\n */\nfunction simulated(): StoreError | null {\n if (typeof window === 'undefined') return null\n const kind = new URLSearchParams(window.location.search).get('ifood-simulate')\n if (kind === '429') return new StoreError(429, 'rate_limited', 'simulated')\n if (kind === '500') return new StoreError(502, 'provider_unavailable', 'simulated')\n return null\n}\n\n/** One call to a store resource as the signed-in member, the refusal parsed the same way. */\nexport async function serviceRequest<T>(method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', path: string, body?: unknown): Promise<T> {\n const fake = simulated()\n if (fake) throw fake\n const base = serviceBaseUrl()\n const supabase = getSupabaseClientOptional() as any\n if (!base || !supabase) throw new StoreError(503, 'no_client', 'the integration service is not configured')\n const { data } = await supabase.auth.getSession()\n const token: string | undefined = data?.session?.access_token\n if (!token) throw new StoreError(401, 'unauthorized', 'sign in again')\n const tenant = getActiveTenantId()\n const unit = getActiveUnitId()\n let response: Response\n try {\n response = await fetch(`${base}${path}`, {\n method,\n headers: {\n authorization: `Bearer ${token}`,\n ...(tenant ? { 'x-fayz-tenant': tenant } : {}),\n ...(unit ? { 'x-fayz-unit': unit } : {}),\n ...(body === undefined ? {} : { 'content-type': 'application/json' }),\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n })\n } catch (error) {\n throw new StoreError(503, 'unavailable', error instanceof Error ? error.message : String(error))\n }\n const text = await response.text()\n let payload: any = null\n try {\n payload = text ? JSON.parse(text) : null\n } catch {\n // not JSON: the status alone decides the sentence\n }\n if (response.ok) return payload as T\n throw new StoreError(response.status, payload?.error ?? 'unavailable', payload?.message ?? text.slice(0, 200))\n}\n\n/** The store a call is about: the one named, or the account's first iFood store. */\nasync function storeId(bindingId?: string): Promise<string> {\n if (bindingId) return bindingId\n const [first] = await serviceRequest<Array<{ storeId: string }>>('GET', '/v1/delivery/stores?provider=ifood')\n if (!first) throw new StoreError(404, 'unknown_store', 'this account has no iFood store linked')\n return first.storeId\n}\n\nexport const store = (id: string, rest = '') => `/v1/delivery/stores/${encodeURIComponent(id)}${rest}`\n\nexport const storePanel = {\n stores: async () => {\n const rows = await serviceRequest<Array<{ storeId: string; merchantRef: string; name: string | null; corporateName: string | null; authorized: boolean | null; active: boolean }>>('GET', '/v1/delivery/stores?provider=ifood')\n return {\n stores: rows.filter((r) => r.active).map((r) => ({ bindingId: r.storeId, merchantId: r.merchantRef, name: r.name, corporateName: r.corporateName, authorized: r.authorized !== false })),\n }\n },\n details: async (bindingId?: string) => serviceRequest<StoreDetails>('GET', store(await storeId(bindingId))),\n pauses: async (bindingId?: string) => serviceRequest<StorePause[]>('GET', store(await storeId(bindingId), '/pauses')),\n pause: async (bindingId: string | undefined, description: string, minutes: number) =>\n serviceRequest<StorePause>('POST', store(await storeId(bindingId), '/pauses'), { description, minutes }),\n removePause: async (bindingId: string | undefined, pauseId: string) => {\n await serviceRequest('DELETE', store(await storeId(bindingId), `/pauses/${encodeURIComponent(pauseId)}`))\n return { removed: pauseId }\n },\n /** Opening the store lifts every pause. */\n reopen: async (bindingId?: string) => serviceRequest<unknown>('PUT', store(await storeId(bindingId), '/status'), { open: true }),\n hours: async (bindingId?: string) => serviceRequest<{ shifts: StoreShift[] }>('GET', store(await storeId(bindingId), '/hours')),\n saveHours: async (bindingId: string | undefined, shifts: StoreShift[]) =>\n serviceRequest<{ shifts: StoreShift[] }>('PUT', store(await storeId(bindingId), '/hours'), { shifts }),\n calls: async (bindingId?: string) => ({ calls: await serviceRequest<StoreCall[]>('GET', store(await storeId(bindingId), '/calls?limit=50')) }),\n /** Every marketplace's store, for screens that run more than iFood's. */\n storeId,\n}\n\n/** The translation key for a refusal; the screen falls back to the status when a code is not listed. */\nexport function storeErrorKey(error: unknown): string {\n if (!(error instanceof StoreError)) return 'orders.ifoodStore.error.generic'\n const byCode: Record<string, string> = {\n InterruptionOverlap: 'overlap',\n pause_out_of_range: 'pauseRange',\n pause_needs_reason: 'pauseReason',\n hours_overlap: 'hoursOverlap',\n hours_past_midnight: 'hoursMidnight',\n hours_empty: 'hoursEmpty',\n hours_bad_time: 'hoursTime',\n hours_bad_duration: 'hoursDuration',\n unknown_store: 'noStore',\n not_allowed: 'notAllowed',\n unauthorized: 'signIn',\n provider_auth_failed: 'credentials',\n provider_unavailable: 'unavailable',\n name_required: 'nameRequired',\n name_too_long: 'nameTooLong',\n description_too_long: 'descriptionTooLong',\n bad_price: 'badPrice',\n bad_group_limits: 'groupLimits',\n group_empty: 'groupEmpty',\n category_required: 'categoryRequired',\n bad_image: 'badImage',\n image_too_big: 'imageTooBig',\n }\n const byStatus: Record<number, string> = { 400: 'invalid', 401: 'signIn', 403: 'forbidden', 404: 'notFound', 413: 'imageTooBig', 429: 'rateLimit', 502: 'unavailable', 503: 'serviceDown' }\n const key = byCode[error.code] ?? byStatus[error.status] ?? (error.status >= 500 ? 'unavailable' : 'generic')\n return `orders.ifoodStore.error.${key}`\n}\n","// The iFood menu, as the integration service edits it (control-sdk-backend,\n// /v1/delivery/stores/{storeId}/catalog), and the\n// links from its items to the house's products, which live in this account's\n// database (plugin-orders migration 005) and are written here under RLS.\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport { serviceRequest, storePanel, store } from './storePanel'\n\nexport const PROVIDER = 'ifood'\n\nexport type CatalogStatus = 'AVAILABLE' | 'UNAVAILABLE'\nexport interface MenuOption { id: string; productId: string | null; name: string; externalCode: string | null; status: string; price: number | null; imageUrl: string | null }\nexport interface MenuGroup { id: string; name: string; externalCode: string | null; min: number; max: number; status: string; options: MenuOption[] }\nexport interface MenuItem {\n id: string; productId: string | null; name: string; description: string | null; externalCode: string | null\n status: string; price: number | null; imagePath: string | null; imageUrl: string | null; optionGroups: MenuGroup[]\n}\nexport interface MenuCategory { id: string; name: string; status: string; externalCode: string | null; index: number; items: MenuItem[] }\nexport interface Menu { catalogId: string | null; categories: MenuCategory[] }\n\nexport interface OptionDraft { id?: string; productId?: string; name: string; price: number; status: CatalogStatus; externalCode?: string; imagePath?: string }\nexport interface GroupDraft { id?: string; name: string; min: number; max: number; status?: CatalogStatus; externalCode?: string; options: OptionDraft[] }\nexport interface ItemDraft {\n id?: string; productId?: string; categoryId: string; name: string; description?: string; price: number\n status: CatalogStatus; externalCode?: string; imagePath?: string; optionGroups: GroupDraft[]\n}\n\nexport interface BulkResult { id: string; ok: boolean; error?: string }\n\nconst catalog = async (bindingId: string | undefined, rest = '') => store(await storePanel.storeId(bindingId), `/catalog${rest}`)\n\n/** The store's iFood menu, as resources at the service. */\nexport const catalogPanel = {\n menu: async (bindingId?: string) => serviceRequest<Menu>('GET', await catalog(bindingId)),\n saveCategory: async (bindingId: string | undefined, category: { id?: string; name: string; status?: CatalogStatus }) =>\n serviceRequest<{ id: string }>('POST', await catalog(bindingId, '/categories'), { category }),\n saveItem: async (bindingId: string | undefined, item: ItemDraft) =>\n serviceRequest<{ id: string }>('PUT', await catalog(bindingId, '/items'), { item }),\n uploadImage: async (bindingId: string | undefined, image: string) =>\n serviceRequest<{ imagePath: string }>('POST', await catalog(bindingId, '/images'), { image }),\n /** The category and every product in it. */\n deleteCategory: async (bindingId: string | undefined, categoryId: string) =>\n serviceRequest<{ id: string }>('DELETE', await catalog(bindingId, `/categories/${encodeURIComponent(categoryId)}`)),\n /** Takes the product out of this category's menu; the product itself stays at iFood. */\n deleteItem: async (bindingId: string | undefined, categoryId: string, productId: string) =>\n serviceRequest<{ id: string }>('DELETE', await catalog(bindingId, `/categories/${encodeURIComponent(categoryId)}/products/${encodeURIComponent(productId)}`)),\n /** One row per item or option; iFood takes them one per call, and the answer says which failed. */\n bulk: async (\n bindingId: string | undefined,\n kind: 'items' | 'options',\n field: 'price' | 'status' | 'externalCode',\n changes: Array<{ id: string; price?: number; status?: CatalogStatus; externalCode?: string }>,\n ) => serviceRequest<{ results: BulkResult[] }>('PATCH', await catalog(bindingId, `/${kind}`), { field, changes }),\n}\n\n/** A picked file as the data URL the image upload takes. */\nexport function readImage(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error ?? new Error('could not read the image'))\n reader.readAsDataURL(file)\n })\n}\n\n// ── links to the house's products ───────────────────────────────────────────\n\nexport interface ProductLink { kind: 'item' | 'option'; externalId: string; productId: string; productName: string | null }\nexport interface ProductHit { id: string; name: string; price: number | null; imageUrl: string | null }\n\nfunction db(): any {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nexport async function loadLinks(): Promise<ProductLink[]> {\n const { data, error } = await db().from('plg_orders_marketplace_links')\n .select('kind, external_id, product_id, products ( name )')\n .eq('tenant_id', getActiveTenantId()).eq('provider', PROVIDER)\n if (error) throw new Error(error.message)\n return ((data ?? []) as Array<{ kind: 'item' | 'option'; external_id: string; product_id: string; products?: { name?: string } | null }>)\n .map((r) => ({ kind: r.kind, externalId: r.external_id, productId: r.product_id, productName: r.products?.name ?? null }))\n}\n\nexport async function linkProduct(kind: 'item' | 'option', externalId: string, productId: string): Promise<void> {\n const { error } = await db().from('plg_orders_marketplace_links').upsert({\n tenant_id: getActiveTenantId(), provider: PROVIDER, kind, external_id: externalId, product_id: productId, updated_at: new Date().toISOString(),\n }, { onConflict: 'tenant_id,provider,kind,external_id' })\n if (error) throw new Error(error.message)\n}\n\nexport async function unlinkProduct(kind: 'item' | 'option', externalId: string): Promise<void> {\n const { error } = await db().from('plg_orders_marketplace_links').delete()\n .eq('tenant_id', getActiveTenantId()).eq('provider', PROVIDER).eq('kind', kind).eq('external_id', externalId)\n if (error) throw new Error(error.message)\n}\n\nexport async function searchProducts(term: string): Promise<ProductHit[]> {\n let q = db().from('products').select('id, name, price, image_url')\n .eq('tenant_id', getActiveTenantId()).eq('is_active', true).order('name').limit(20)\n if (term.trim()) q = q.ilike('name', `%${term.trim()}%`)\n const { data, error } = await q\n if (error) throw new Error(error.message)\n return ((data ?? []) as Array<{ id: string; name: string; price: number | string | null; image_url: string | null }>)\n .map((p) => ({ id: p.id, name: p.name, price: p.price === null ? null : Number(p.price), imageUrl: p.image_url }))\n}\n\n/** The edit form, starting from what iFood has. */\nconst IMAGE_BASE = 'https://static-images.ifood.com.br/image/upload/t_medium/pratos/'\n/** The URL a stored photo is shown at. */\nexport const imageUrlOf = (path: string) => `${IMAGE_BASE}${path}`\nconst pathOf = (url: string | null) => (url && url.startsWith(IMAGE_BASE) ? url.slice(IMAGE_BASE.length) : undefined)\n\nexport function draftOf(item: MenuItem, categoryId: string): ItemDraft {\n return {\n id: item.id,\n productId: item.productId ?? undefined,\n categoryId,\n name: item.name,\n description: item.description ?? undefined,\n price: item.price ?? 0,\n status: item.status === 'UNAVAILABLE' ? 'UNAVAILABLE' : 'AVAILABLE',\n externalCode: item.externalCode ?? undefined,\n imagePath: item.imagePath ?? undefined,\n optionGroups: item.optionGroups.map((g) => ({\n id: g.id, name: g.name, min: g.min, max: g.max, externalCode: g.externalCode ?? undefined,\n status: g.status === 'UNAVAILABLE' ? 'UNAVAILABLE' : 'AVAILABLE',\n options: g.options.map((o) => ({\n id: o.id, productId: o.productId ?? undefined, name: o.name, price: o.price ?? 0,\n status: o.status === 'UNAVAILABLE' ? 'UNAVAILABLE' : 'AVAILABLE', externalCode: o.externalCode ?? undefined,\n // Saving an item rewrites its complements: their photos must travel too.\n imagePath: pathOf(o.imageUrl),\n })),\n })),\n }\n}\n\n/**\n * What saving an edited item sends. The homologation asks for prices and\n * pauses to go by PATCH, so those leave the full PUT: the PUT carries the\n * name, description, photo and structure with the OLD price and status, and\n * the changes to price and status go after it as PATCH calls.\n */\nexport function editPlan(before: ItemDraft, after: ItemDraft): {\n put: ItemDraft | null\n itemPrice: number | null\n itemStatus: CatalogStatus | null\n optionPrices: Array<{ id: string; price: number }>\n optionStatuses: Array<{ id: string; status: CatalogStatus }>\n} {\n const optionsBefore = new Map(before.optionGroups.flatMap((g) => g.options).filter((o) => o.id).map((o) => [o.id!, o]))\n const keepOld = (o: OptionDraft) => {\n const old = o.id ? optionsBefore.get(o.id) : undefined\n return old ? { ...o, price: old.price, status: old.status } : o\n }\n const put: ItemDraft = {\n ...after,\n price: before.price,\n status: before.status,\n optionGroups: after.optionGroups.map((g) => ({ ...g, options: g.options.map(keepOld) })),\n }\n const strip = (d: ItemDraft) => JSON.stringify({ ...d, price: 0, status: 'AVAILABLE', optionGroups: d.optionGroups.map((g) => ({ ...g, options: g.options.map((o) => ({ ...o, price: 0, status: 'AVAILABLE' })) })) })\n const after_ = after.optionGroups.flatMap((g) => g.options)\n return {\n put: strip(put) === strip(before) ? null : put,\n itemPrice: after.price !== before.price ? after.price : null,\n itemStatus: after.status !== before.status ? after.status : null,\n optionPrices: after_.filter((o) => o.id && optionsBefore.has(o.id) && optionsBefore.get(o.id)!.price !== o.price).map((o) => ({ id: o.id!, price: o.price })),\n optionStatuses: after_.filter((o) => o.id && optionsBefore.has(o.id) && optionsBefore.get(o.id)!.status !== o.status).map((o) => ({ id: o.id!, status: o.status })),\n }\n}\n","// The iFood menu of the store, edited here and published to iFood, with each\n// product and complement linked to one of the house's products. It is iFood's\n// own menu (as Takeat's «Cardápio iFood» is): names and prices may differ from\n// the house's; the link is what ties the two.\nimport React from 'react'\nimport { Image as ImageIcon, Link2, Loader2, Pause, Pencil, Play, Plus, RefreshCw, Trash2, Unlink, X } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Input } from '@fayz-ai/ui'\nimport {\n catalogPanel, draftOf, editPlan, imageUrlOf, linkProduct, loadLinks, readImage, searchProducts, unlinkProduct,\n type CatalogStatus, type ItemDraft, type Menu, type MenuItem, type ProductHit, type ProductLink,\n} from './catalogPanel'\nimport { storeErrorKey } from './storePanel'\n\nconst money = (v: number | null) => (v === null ? '—' : v.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }))\n\n/**\n * A change iFood accepted but its menu does not show yet. iFood's menu lags\n * its writes by seconds to minutes, so every write waits here until the menu\n * shows it, and only then is it announced as done.\n */\ninterface Pending {\n key: string\n kind: 'create' | 'change' | 'delete'\n at: number\n /** What a not-yet-listed new category or product shows meanwhile. */\n placeholder?: { categoryId?: string; name: string; price?: number }\n done: (menu: Menu) => boolean\n}\nconst PENDING_GIVE_UP_MS = 5 * 60_000\n\nconst itemIn = (menu: Menu, id: string) => menu.categories.flatMap((c) => c.items).find((i) => i.id === id)\nconst optionIn = (menu: Menu, id: string) => menu.categories.flatMap((c) => c.items).flatMap((i) => i.optionGroups).flatMap((g) => g.options).find((o) => o.id === id)\n// iFood capitalizes the first letter of every name it stores (\"dsadasd\" comes back \"Dsadasd\").\nconst nameOf = (s: string) => s.trim().toLocaleLowerCase('pt-BR')\nconst samePrice = (a: number | null | undefined, b: number | null | undefined) => Math.round((a ?? 0) * 100) === Math.round((b ?? 0) * 100)\n\n/** Whether iFood's menu shows the item as the draft wants it. */\nfunction shows(menu: Menu, draft: ItemDraft): boolean {\n const item = draft.id ? itemIn(menu, draft.id) : undefined\n if (!item) return false\n if (nameOf(item.name) !== nameOf(draft.name) || !samePrice(item.price, draft.price) || item.status !== draft.status) return false\n if (draft.imagePath && item.imagePath !== draft.imagePath) return false\n // Complements added in this edit have no id until iFood answers with one,\n // so those are matched by name; the rest by id. Removed ones must be gone.\n const wanted = draft.optionGroups.flatMap((g) => g.options)\n const kept = new Set(wanted.map((o) => o.id).filter(Boolean))\n const added = wanted.filter((o) => !o.id).map((o) => nameOf(o.name))\n const now = item.optionGroups.flatMap((g) => g.options)\n if (item.optionGroups.length !== draft.optionGroups.length || now.length !== wanted.length) return false\n if (now.some((o) => !kept.has(o.id) && !added.includes(nameOf(o.name)))) return false\n return draft.optionGroups.flatMap((g) => g.options).filter((o) => o.id).every((o) => {\n const now = optionIn(menu, o.id!)\n return !!now && nameOf(now.name) === nameOf(o.name) && samePrice(now.price, o.price) && now.status === o.status\n && (!o.imagePath || !!now.imageUrl?.endsWith(o.imagePath))\n })\n}\n\nexport function IfoodMenuPanel({ bindingId, onChanged }: { bindingId?: string; onChanged?: () => void }) {\n const t = useTranslation()\n const [menu, setMenu] = React.useState<Menu | null>(null)\n const [links, setLinks] = React.useState<ProductLink[]>([])\n const [error, setError] = React.useState<string | null>(null)\n const [message, setMessage] = React.useState<{ tone: 'ok' | 'error' | 'wait'; text: string } | null>(null)\n const [busy, setBusy] = React.useState<string | null>(null)\n const [newCategory, setNewCategory] = React.useState('')\n const [editing, setEditing] = React.useState<{ before: ItemDraft | null; draft: ItemDraft } | null>(null)\n const [linking, setLinking] = React.useState<{ kind: 'item' | 'option'; id: string } | null>(null)\n const [selected, setSelected] = React.useState<Set<string>>(new Set())\n // Delete asks once, inline (no modal on top of the drawer).\n const [confirming, setConfirming] = React.useState<string | null>(null)\n const [pending, setPending] = React.useState<Pending[]>([])\n const pendingRef = React.useRef<Pending[]>([])\n const expect = (p: Omit<Pending, 'at'>) => {\n pendingRef.current = [...pendingRef.current.filter((x) => x.key !== p.key), { ...p, at: Date.now() }]\n setPending(pendingRef.current)\n }\n\n const load = React.useCallback(async () => {\n setError(null)\n try {\n const [m, l] = await Promise.all([catalogPanel.menu(bindingId), loadLinks().catch(() => [] as ProductLink[])])\n const settled = pendingRef.current.filter((p) => p.done(m))\n const stale = pendingRef.current.filter((p) => !settled.includes(p) && Date.now() - p.at > PENDING_GIVE_UP_MS)\n if (settled.length || stale.length) {\n pendingRef.current = pendingRef.current.filter((p) => !settled.includes(p) && !stale.includes(p))\n setPending(pendingRef.current)\n if (stale.length) setMessage({ tone: 'error', text: t('orders.ifoodMenu.notConfirmed') })\n else setMessage({ tone: 'ok', text: t(settled.some((p) => p.kind === 'delete') ? 'orders.ifoodMenu.deleted' : 'orders.ifoodMenu.confirmed') })\n }\n setMenu(m)\n setLinks(l)\n } catch (e) {\n setError(t(storeErrorKey(e)))\n }\n }, [bindingId, t])\n\n React.useEffect(() => { void load() }, [load])\n React.useEffect(() => {\n if (!pending.length) return\n const timer = setInterval(() => { if (!document.hidden) void load() }, 5_000)\n return () => clearInterval(timer)\n }, [pending.length, load])\n\n /** A write to iFood: on success it waits for iFood's menu (see Pending); a refusal shows at once. */\n async function act(key: string, work: () => Promise<unknown>, after?: 'wait' | string) {\n if (busy) return\n setBusy(key)\n setMessage(null)\n try {\n await work()\n if (after === 'wait') setMessage({ tone: 'wait', text: t('orders.ifoodMenu.sent') })\n else if (after) setMessage({ tone: 'ok', text: after })\n await load()\n } catch (e) {\n const code = storeErrorKey(e)\n const known = code !== 'orders.ifoodStore.error.generic' && code !== 'orders.ifoodStore.error.invalid'\n setMessage({ tone: 'error', text: t(code) + (!known && e instanceof Error && e.message ? ` (${e.message})` : '') })\n } finally {\n setBusy(null)\n onChanged?.()\n }\n }\n\n /** A bulk answer with refusals is an error worth naming. */\n const bulk = async (...args: Parameters<typeof catalogPanel.bulk>) => {\n const { results } = await catalogPanel.bulk(...args)\n const failed = results.filter((r) => !r.ok)\n if (failed.length) throw new Error(t('orders.ifoodMenu.bulkFailed', { n: failed.length, codes: failed.map((f) => f.error).join(', ') }))\n }\n\n const linkOf = (kind: 'item' | 'option', id: string) => links.find((l) => l.kind === kind && l.externalId === id)\n const flip = (s: string): CatalogStatus => (s === 'AVAILABLE' ? 'UNAVAILABLE' : 'AVAILABLE')\n const pendingOf = (key: string) => pending.find((p) => p.key === key)\n\n if (error && !menu) {\n return (\n <div className=\"space-y-2 text-sm\">\n <p role=\"alert\" className=\"text-destructive\">{error}</p>\n <Button size=\"sm\" variant=\"outline\" onClick={() => void load()}>{t('orders.ifoodStore.retry')}</Button>\n </div>\n )\n }\n if (!menu) return <p className=\"text-sm text-muted-foreground\">{t('orders.ifoodStore.loading')}</p>\n\n const setStatus = (kind: 'items' | 'options', id: string, status: CatalogStatus) =>\n void act(`${kind}-${id}`, async () => {\n await bulk(bindingId, kind, 'status', [{ id, status }])\n expect({ key: `${kind === 'items' ? 'item' : 'opt'}-${id}`, kind: 'change',\n done: (m) => (kind === 'items' ? itemIn(m, id)?.status : optionIn(m, id)?.status) === status })\n }, 'wait')\n\n // A photo changed from the list: upload, then the item goes back to iFood\n // whole with the new path (iFood has no photo-only call).\n const changePhoto = (item: MenuItem, categoryId: string, file: File, optionId?: string) =>\n void act(`photo-${optionId ?? item.id}`, async () => {\n const { imagePath } = await catalogPanel.uploadImage(bindingId, await readImage(file))\n const d = draftOf(item, categoryId)\n await catalogPanel.saveItem(bindingId, optionId\n ? { ...d, optionGroups: d.optionGroups.map((g) => ({ ...g, options: g.options.map((o) => (o.id === optionId ? { ...o, imagePath } : o)) })) }\n : { ...d, imagePath })\n expect({ key: optionId ? `opt-${optionId}` : `item-${item.id}`, kind: 'change',\n done: (m) => (optionId ? !!optionIn(m, optionId)?.imageUrl?.endsWith(imagePath) : itemIn(m, item.id)?.imagePath === imagePath) })\n }, 'wait')\n\n const save = (draft: ItemDraft, before: ItemDraft | null) =>\n void act('item', async () => {\n if (!before) {\n const { id } = await catalogPanel.saveItem(bindingId, draft)\n expect({ key: `item-${id}`, kind: 'create', placeholder: { categoryId: draft.categoryId, name: draft.name, price: draft.price },\n done: (m) => !!m.categories.find((c) => c.id === draft.categoryId)?.items.some((i) => i.id === id) })\n } else {\n const plan = editPlan(before, draft)\n if (plan.put) await catalogPanel.saveItem(bindingId, plan.put)\n if (plan.itemPrice !== null) await bulk(bindingId, 'items', 'price', [{ id: draft.id!, price: plan.itemPrice }])\n if (plan.itemStatus) await bulk(bindingId, 'items', 'status', [{ id: draft.id!, status: plan.itemStatus }])\n if (plan.optionPrices.length) await bulk(bindingId, 'options', 'price', plan.optionPrices)\n if (plan.optionStatuses.length) await bulk(bindingId, 'options', 'status', plan.optionStatuses)\n expect({ key: `item-${draft.id}`, kind: 'change', done: (m) => shows(m, draft) })\n }\n setEditing(null)\n }, 'wait')\n\n const editorFor = (e: { before: ItemDraft | null; draft: ItemDraft }) => (\n <ItemEditor key={e.before?.id ?? `new-${e.draft.categoryId}`} value={e.draft} isNew={!e.before} busy={!!busy}\n bindingId={bindingId} onCancel={() => setEditing(null)} onSave={(draft) => save(draft, e.before)} />\n )\n\n const linkerFor = (kind: 'item' | 'option', id: string) => linking?.kind === kind && linking.id === id && (\n <LinkPicker onCancel={() => setLinking(null)}\n onPick={(p) => void act('link', async () => {\n await linkProduct(kind, id, p.id)\n setLinking(null)\n }, t('orders.ifoodMenu.linked', { name: p.name }))} />\n )\n\n const newCategories = pending.filter((p) => p.kind === 'create' && p.placeholder && !p.placeholder.categoryId)\n\n return (\n <div className=\"space-y-4\">\n {message && (\n <p role={message.tone === 'error' ? 'alert' : 'status'}\n className={`flex items-center gap-2 rounded-md px-3 py-2 text-sm ${message.tone === 'error' ? 'bg-destructive/10 text-destructive' : message.tone === 'wait' ? 'bg-muted text-foreground' : 'bg-success/10 text-success'}`}>\n {message.tone === 'wait' && pending.length > 0 && <Loader2 className=\"h-4 w-4 shrink-0 animate-spin\" />}\n {message.tone === 'wait' && pending.length === 0 ? t('orders.ifoodMenu.confirmed') : message.text}\n </p>\n )}\n\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto_auto] items-end gap-2\">\n <label className=\"space-y-1 text-xs\">\n <span>{t('orders.ifoodMenu.newCategory')}</span>\n <Input value={newCategory} onChange={(e) => setNewCategory(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') (e.currentTarget.closest('div')?.querySelector('button') as HTMLButtonElement | null)?.click() }} />\n </label>\n <Button size=\"lg\" disabled={!!busy}\n onClick={() => void act('category', async () => {\n const name = newCategory.trim()\n const { id } = await catalogPanel.saveCategory(bindingId, { name, status: 'AVAILABLE' })\n setNewCategory('')\n expect({ key: `cat-${id}`, kind: 'create', placeholder: { name }, done: (m) => m.categories.some((c) => c.id === id) })\n }, 'wait')}>\n {busy === 'category' ? <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" /> : <Plus className=\"mr-1 h-4 w-4\" />} {t('orders.ifoodMenu.createCategory')}\n </Button>\n <Button size=\"lg\" variant=\"outline\" disabled={!!busy} aria-label={t('orders.ifoodMenu.refresh')} title={t('orders.ifoodMenu.refresh')}\n onClick={() => void act('refresh', async () => {}, t('orders.ifoodMenu.refreshed'))}>\n <RefreshCw className={`h-4 w-4 ${busy === 'refresh' ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n {selected.size > 0 && (\n <div className=\"flex flex-wrap items-center gap-2 rounded-md bg-muted/60 px-3 py-2 text-sm\">\n <span className=\"flex-1\">{t('orders.ifoodMenu.selectedCount', { n: selected.size })}</span>\n {(['UNAVAILABLE', 'AVAILABLE'] as const).map((status) => (\n <Button key={status} size=\"sm\" variant=\"outline\" disabled={!!busy}\n onClick={() => void act('bulk', async () => {\n const ids = [...selected]\n await bulk(bindingId, 'items', 'status', ids.map((id) => ({ id, status })))\n setSelected(new Set())\n for (const id of ids) expect({ key: `item-${id}`, kind: 'change', done: (m) => itemIn(m, id)?.status === status })\n }, 'wait')}>\n {status === 'UNAVAILABLE' ? <Pause className=\"mr-1 h-4 w-4\" /> : <Play className=\"mr-1 h-4 w-4\" />}\n {status === 'UNAVAILABLE' ? t('orders.ifoodMenu.pauseSelected', { n: selected.size }) : t('orders.ifoodMenu.resumeSelected', { n: selected.size })}\n </Button>\n ))}\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setSelected(new Set())}>{t('orders.ifoodMenu.cancel')}</Button>\n </div>\n )}\n\n {newCategories.map((p) => (\n <section key={p.key} aria-busy className=\"rounded-md border border-dashed border-border opacity-70\">\n <header className=\"flex items-center gap-2 bg-muted/50 px-3 py-2 text-sm\">\n <span className=\"min-w-0 flex-1 truncate font-semibold\">{p.placeholder!.name}</span>\n <WaitTag label={t('orders.ifoodMenu.creating')} />\n </header>\n </section>\n ))}\n\n {menu.categories.length === 0 && newCategories.length === 0 && <p className=\"text-sm text-muted-foreground\">{t('orders.ifoodMenu.empty')}</p>}\n\n {menu.categories.map((category) => {\n const catPending = pendingOf(`cat-${category.id}`)\n const creating = pending.filter((p) => p.kind === 'create' && p.placeholder?.categoryId === category.id)\n return (\n <section key={category.id} aria-busy={!!catPending}\n className={`rounded-md border border-border ${catPending?.kind === 'delete' ? 'pointer-events-none opacity-50' : ''}`}>\n <header className=\"flex items-center gap-2 bg-muted/50 px-3 py-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <h3 className=\"truncate text-sm font-semibold\" title={category.name}>{category.name}</h3>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {t(category.items.length === 1 ? 'orders.ifoodMenu.productCountOne' : 'orders.ifoodMenu.productCount', { n: category.items.length })}\n </span>\n <StatusBadge status={category.status} />\n </div>\n {catPending?.kind === 'delete' ? (\n <WaitTag label={t('orders.ifoodMenu.deleting')} />\n ) : (\n <>\n <Button size=\"sm\" variant=\"outline\" className=\"shrink-0\" disabled={!!busy || !!editing}\n onClick={() => { setLinking(null); setEditing({ before: null, draft: { categoryId: category.id, name: '', price: 0, status: 'AVAILABLE', optionGroups: [] } }) }}>\n <Plus className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodMenu.newItem')}\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"shrink-0\" disabled={!!busy}\n aria-label={t('orders.ifoodMenu.deleteCategory')} title={t('orders.ifoodMenu.deleteCategory')}\n onClick={() => setConfirming(`cat-${category.id}`)}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </>\n )}\n </header>\n {confirming === `cat-${category.id}` && (\n <ConfirmRow text={t('orders.ifoodMenu.confirmCategory', { name: category.name, n: category.items.length })}\n onCancel={() => setConfirming(null)}\n onConfirm={() => { setConfirming(null); void act(`del-cat-${category.id}`, async () => {\n await catalogPanel.deleteCategory(bindingId, category.id)\n expect({ key: `cat-${category.id}`, kind: 'delete', done: (m) => !m.categories.some((c) => c.id === category.id) })\n }, 'wait') }} />\n )}\n {editing && !editing.before && editing.draft.categoryId === category.id && (\n <div className=\"border-t border-border p-3\">{editorFor(editing)}</div>\n )}\n\n <ul className=\"divide-y divide-border\">\n {creating.map((p) => (\n <li key={p.key} aria-busy className=\"flex items-center gap-3 px-3 py-2 opacity-70\">\n <span className=\"flex h-14 w-14 shrink-0 items-center justify-center rounded-md border border-dashed border-border\"><ImageIcon className=\"h-4 w-4 text-muted-foreground\" /></span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{p.placeholder!.name}</p>\n <span className=\"text-xs font-semibold\">{money(p.placeholder!.price ?? null)}</span>\n </div>\n <WaitTag label={t('orders.ifoodMenu.creating')} />\n </li>\n ))}\n {category.items.map((item) => {\n const itemPending = pendingOf(`item-${item.id}`)\n if (editing?.before?.id === item.id) {\n // The editor takes the product's place: no second copy of it, nor its buttons.\n return <li key={item.id} className=\"p-3\">{editorFor(editing)}</li>\n }\n return (\n <li key={item.id} aria-busy={!!itemPending}\n className={`space-y-2 px-3 py-2 ${itemPending?.kind === 'delete' ? 'pointer-events-none opacity-50' : ''}`}>\n <ItemRow\n item={item}\n pending={itemPending ? t(itemPending.kind === 'delete' ? 'orders.ifoodMenu.deleting' : 'orders.ifoodMenu.confirming') : null}\n selected={selected.has(item.id)}\n onSelect={(on) => setSelected((s) => { const n = new Set(s); if (on) n.add(item.id); else n.delete(item.id); return n })}\n link={linkOf('item', item.id)}\n busy={!!busy || !!itemPending}\n photoBusy={busy === `photo-${item.id}`}\n onPhoto={(file) => changePhoto(item, category.id, file)}\n onDelete={item.productId ? () => setConfirming(`item-${item.id}`) : undefined}\n onEdit={() => { setLinking(null); setConfirming(null); const d = draftOf(item, category.id); setEditing({ before: d, draft: structuredClone(d) }) }}\n onToggle={() => setStatus('items', item.id, flip(item.status))}\n onLink={() => { setEditing(null); setLinking({ kind: 'item', id: item.id }) }}\n onUnlink={() => void act(`u-${item.id}`, () => unlinkProduct('item', item.id), t('orders.ifoodMenu.unlinked'))}\n />\n {confirming === `item-${item.id}` && (\n <ConfirmRow text={t('orders.ifoodMenu.confirmItem', { name: item.name })}\n onCancel={() => setConfirming(null)}\n onConfirm={() => { setConfirming(null); void act(`del-item-${item.id}`, async () => {\n await catalogPanel.deleteItem(bindingId, category.id, item.productId!)\n expect({ key: `item-${item.id}`, kind: 'delete',\n done: (m) => !m.categories.find((c) => c.id === category.id)?.items.some((i) => i.id === item.id) })\n }, 'wait') }} />\n )}\n {linkerFor('item', item.id)}\n {item.optionGroups.map((g) => (\n <div key={g.id} className=\"ml-14 space-y-1 border-l border-border pl-3 text-sm\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n {g.name} · {t('orders.ifoodMenu.minMax', { min: g.min, max: g.max })}\n </p>\n {g.options.map((o) => {\n const optPending = pendingOf(`opt-${o.id}`)\n return (\n <div key={o.id} className=\"space-y-1\">\n <div className=\"flex items-center gap-2\">\n <EditablePhoto url={o.imageUrl} small busy={busy === `photo-${o.id}`} disabled={!!busy || !!optPending}\n label={o.imageUrl ? t('orders.ifoodMenu.photoChange') : t('orders.ifoodMenu.photoAdd')}\n onPick={(file) => changePhoto(item, category.id, file, o.id)} />\n <span className=\"min-w-0 flex-1 truncate\" title={o.name}>{o.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{money(o.price)}</span>\n <StatusBadge status={o.status} />\n {optPending ? (\n <WaitTag label={t('orders.ifoodMenu.confirming')} />\n ) : (\n <>\n <LinkChip compact link={linkOf('option', o.id)} onLink={() => { setEditing(null); setLinking({ kind: 'option', id: o.id }) }}\n onUnlink={() => void act(`u-${o.id}`, () => unlinkProduct('option', o.id), t('orders.ifoodMenu.unlinked'))} />\n <Button size=\"icon\" variant=\"ghost\" disabled={!!busy}\n aria-label={o.status === 'AVAILABLE' ? t('orders.ifoodMenu.pause') : t('orders.ifoodMenu.resume')}\n title={o.status === 'AVAILABLE' ? t('orders.ifoodMenu.pause') : t('orders.ifoodMenu.resume')}\n onClick={() => setStatus('options', o.id, flip(o.status))}>\n {o.status === 'AVAILABLE' ? <Pause className=\"h-4 w-4\" /> : <Play className=\"h-4 w-4\" />}\n </Button>\n </>\n )}\n </div>\n {linkerFor('option', o.id)}\n </div>\n )\n })}\n </div>\n ))}\n </li>\n )\n })}\n </ul>\n </section>\n )\n })}\n </div>\n )\n}\n\n/** \"waiting for iFood\", with a spinner: something sent and not yet shown by iFood. */\nfunction WaitTag({ label }: { label: string }) {\n return (\n <span className=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" /> {label}\n </span>\n )\n}\n\n/** Money typed as the store reads it: \"19,90\" in Brazil. Keeps the number; shows the text. */\nfunction MoneyInput({ value, onChange, wrapperClassName }: { value: number; onChange: (v: number) => void; wrapperClassName?: string }) {\n const format = (v: number) => (v ? v.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '')\n const [text, setText] = React.useState(format(value))\n return (\n <Input inputMode=\"decimal\" value={text} wrapperClassName={wrapperClassName} placeholder=\"0,00\"\n onChange={(e) => {\n const raw = e.target.value.replace(/[^\\d.,]/g, '')\n setText(raw)\n // Brazilian money: the comma is the decimal mark, dots group thousands.\n const normal = raw.includes(',') ? raw.replace(/\\./g, '').replace(',', '.') : raw\n const n = Number(normal)\n onChange(Number.isFinite(n) ? n : 0)\n }}\n onBlur={() => setText(format(value))} />\n )\n}\n\n\nfunction StatusBadge({ status }: { status: string }) {\n const t = useTranslation()\n const on = status === 'AVAILABLE'\n return (\n <span className={`rounded-full px-2 py-0.5 text-xs ${on ? 'bg-success/10 text-success' : 'bg-muted text-muted-foreground'}`}>\n {on ? t('orders.ifoodMenu.available') : t('orders.ifoodMenu.paused')}\n </span>\n )\n}\n\nfunction ConfirmRow({ text, onConfirm, onCancel }: { text: string; onConfirm: () => void; onCancel: () => void }) {\n const t = useTranslation()\n return (\n <div role=\"alertdialog\" className=\"flex flex-wrap items-center gap-2 border-t border-border bg-destructive/5 px-3 py-2 text-sm\">\n <span className=\"min-w-0 flex-1\">{text}</span>\n <Button size=\"sm\" variant=\"destructive\" onClick={onConfirm}>{t('orders.ifoodMenu.confirmDelete')}</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={onCancel}>{t('orders.ifoodMenu.cancel')}</Button>\n </div>\n )\n}\n\n/** A photo you can click to replace: a pencil shows on hover, a spinner while it uploads. */\nfunction EditablePhoto({ url, small, large, busy, disabled, label, onPick }: {\n url: string | null; small?: boolean; large?: boolean; busy?: boolean; disabled?: boolean; label: string; onPick: (file: File) => void\n}) {\n const input = React.useRef<HTMLInputElement>(null)\n const size = large ? 'h-24 w-24' : small ? 'h-9 w-9' : 'h-14 w-14'\n return (\n <button type=\"button\" aria-label={label} title={label} disabled={disabled}\n onClick={() => input.current?.click()}\n className={`group relative ${size} shrink-0 overflow-hidden rounded-md border border-border bg-muted text-muted-foreground disabled:cursor-not-allowed`}>\n {url ? <img src={url} alt=\"\" className=\"h-full w-full object-cover\" /> : <ImageIcon className=\"m-auto h-4 w-4\" />}\n <span className={`absolute inset-0 flex items-center justify-center bg-black/50 text-white transition-opacity ${busy ? 'opacity-100' : 'opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100'}`}>\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Pencil className=\"h-4 w-4\" />}\n </span>\n <input ref={input} type=\"file\" accept=\"image/png,image/jpeg\" className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (file) onPick(file)\n }} />\n </button>\n )\n}\n\nfunction Thumb({ url, small }: { url: string | null; small?: boolean }) {\n const size = small ? 'h-6 w-6' : 'h-12 w-12'\n return url\n ? <img src={url} alt=\"\" className={`${size} rounded object-cover`} />\n : <span className={`${size} flex items-center justify-center rounded bg-muted text-muted-foreground`}><ImageIcon className=\"h-4 w-4\" /></span>\n}\n\nfunction LinkChip({ link, onLink, onUnlink, compact }: { link?: ProductLink; onLink: () => void; onUnlink: () => void; compact?: boolean }) {\n const t = useTranslation()\n if (!link) {\n return compact ? (\n <Button size=\"icon\" variant=\"ghost\" onClick={onLink} aria-label={t('orders.ifoodMenu.link')} title={t('orders.ifoodMenu.linkTitle')}>\n <Link2 className=\"h-4 w-4\" />\n </Button>\n ) : (\n <Button size=\"sm\" variant=\"outline\" onClick={onLink}>\n <Link2 className=\"mr-1 h-3 w-3\" /> {t('orders.ifoodMenu.link')}\n </Button>\n )\n }\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full border border-border px-2 py-0.5 text-xs\">\n <Link2 className=\"h-3 w-3\" /> {link.productName ?? link.productId}\n <button type=\"button\" aria-label={t('orders.ifoodMenu.unlink')} onClick={onUnlink}><Unlink className=\"h-3 w-3\" /></button>\n </span>\n )\n}\n\nfunction ItemRow({ item, pending, selected, onSelect, link, busy, photoBusy, onPhoto, onDelete, onEdit, onToggle, onLink, onUnlink }: {\n item: MenuItem; pending: string | null; selected: boolean; onSelect: (on: boolean) => void; link?: ProductLink; busy: boolean\n photoBusy: boolean; onPhoto: (file: File) => void; onDelete?: () => void\n onEdit: () => void; onToggle: () => void; onLink: () => void; onUnlink: () => void\n}) {\n const t = useTranslation()\n return (\n <div className=\"flex items-center gap-3\">\n <input type=\"checkbox\" checked={selected} onChange={(e) => onSelect(e.target.checked)} aria-label={t('orders.ifoodMenu.select', { name: item.name })} />\n <EditablePhoto url={item.imageUrl} busy={photoBusy} disabled={busy}\n label={item.imageUrl ? t('orders.ifoodMenu.photoChange') : t('orders.ifoodMenu.photoAdd')} onPick={onPhoto} />\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n <p className=\"truncate text-sm font-medium\" title={item.name}>{item.name}</p>\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"font-semibold\">{money(item.price)}</span>\n <StatusBadge status={item.status} />\n </div>\n {item.externalCode && (\n <p className=\"truncate text-[11px] text-muted-foreground\" title={item.externalCode}>\n {t('orders.ifoodMenu.pdvCode')}: <code>{item.externalCode}</code>\n </p>\n )}\n </div>\n {pending ? <WaitTag label={pending} /> : (\n <div className=\"flex shrink-0 items-center gap-1\">\n <LinkChip compact link={link} onLink={onLink} onUnlink={onUnlink} />\n <Button size=\"icon\" variant=\"ghost\" disabled={busy} onClick={onToggle}\n aria-label={item.status === 'AVAILABLE' ? t('orders.ifoodMenu.pause') : t('orders.ifoodMenu.resume')}\n title={item.status === 'AVAILABLE' ? t('orders.ifoodMenu.pause') : t('orders.ifoodMenu.resume')}>\n {item.status === 'AVAILABLE' ? <Pause className=\"h-4 w-4\" /> : <Play className=\"h-4 w-4\" />}\n </Button>\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={onEdit}>\n <Pencil className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodMenu.edit')}\n </Button>\n {onDelete && (\n <Button size=\"icon\" variant=\"ghost\" disabled={busy} onClick={onDelete}\n aria-label={t('orders.ifoodMenu.deleteItem')} title={t('orders.ifoodMenu.deleteItem')}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n )}\n </div>\n )\n}\n\n/** The editor's photo: click it to pick a file; it uploads at once and keeps the path iFood answers. */\nfunction PhotoField({ bindingId, path, small, large, onPath }: { bindingId?: string; path?: string; small?: boolean; large?: boolean; onPath: (p: string | undefined) => void }) {\n const t = useTranslation()\n const [state, setState] = React.useState<'idle' | 'sending' | 'failed'>('idle')\n const [failure, setFailure] = React.useState('')\n return (\n <span className={`inline-flex gap-1 text-xs ${large ? 'flex-col items-center text-center' : 'items-center'}`}>\n <EditablePhoto url={path ? imageUrlOf(path) : null} small={small} large={large} busy={state === 'sending'} disabled={state === 'sending'}\n label={path ? t('orders.ifoodMenu.photoChange') : t('orders.ifoodMenu.photoAdd')}\n onPick={async (file) => {\n setState('sending')\n try {\n const { imagePath } = await catalogPanel.uploadImage(bindingId, await readImage(file))\n onPath(imagePath)\n setState('idle')\n } catch (error) {\n // The service's refusal says why (size, format); the generic line is the fallback.\n const key = storeErrorKey(error)\n setFailure(key.endsWith('.generic') ? t('orders.ifoodMenu.photoFailed') : t(key))\n setState('failed')\n }\n }} />\n {large && state !== 'failed' && (\n <span className=\"text-muted-foreground\">{path ? t('orders.ifoodMenu.photoChange') : t('orders.ifoodMenu.photoAdd')}</span>\n )}\n {state === 'failed' && <span role=\"alert\" className={`text-destructive ${large ? 'w-24' : ''}`}>{failure}</span>}\n </span>\n )\n}\n\n/** Available / paused as two buttons side by side, the height of the fields beside it. */\nfunction StatusToggle({ value, onChange, compact }: { value: CatalogStatus; onChange: (v: CatalogStatus) => void; compact?: boolean }) {\n const t = useTranslation()\n const options: Array<[CatalogStatus, string]> = [['AVAILABLE', t('orders.ifoodMenu.available')], ['UNAVAILABLE', t('orders.ifoodMenu.paused')]]\n return (\n <div role=\"radiogroup\" className=\"inline-flex h-9 overflow-hidden rounded-md border border-input bg-background text-xs\">\n {options.map(([v, label]) => (\n <button key={v} type=\"button\" role=\"radio\" aria-checked={value === v} onClick={() => onChange(v)}\n className={`${compact ? 'px-2' : 'px-3'} font-medium transition-colors ${value === v\n ? (v === 'AVAILABLE' ? 'bg-success/15 text-success' : 'bg-muted text-foreground')\n : 'text-muted-foreground hover:bg-muted/50'}`}>\n {label}\n </button>\n ))}\n </div>\n )\n}\n\nfunction ItemEditor({ value, isNew, busy, bindingId, onCancel, onSave }: {\n value: ItemDraft; isNew: boolean; busy: boolean; bindingId?: string; onCancel: () => void; onSave: (d: ItemDraft) => void\n}) {\n const t = useTranslation()\n const [d, setD] = React.useState<ItemDraft>(value)\n const set = (patch: Partial<ItemDraft>) => setD((x) => ({ ...x, ...patch }))\n const setGroup = (gi: number, patch: Partial<ItemDraft['optionGroups'][number]>) =>\n set({ optionGroups: d.optionGroups.map((g, i) => (i === gi ? { ...g, ...patch } : g)) })\n const setOption = (gi: number, oi: number, patch: Partial<ItemDraft['optionGroups'][number]['options'][number]>) =>\n setGroup(gi, { options: d.optionGroups[gi]!.options.map((o, i) => (i === oi ? { ...o, ...patch } : o)) })\n // Removing a group or complement that holds anything asks once, inline, like the other deletes.\n const [confirming, setConfirming] = React.useState<string | null>(null)\n const removeGroup = (gi: number) => { setConfirming(null); set({ optionGroups: d.optionGroups.filter((_, i) => i !== gi) }) }\n const removeOption = (gi: number, oi: number) => { setConfirming(null); setGroup(gi, { options: d.optionGroups[gi]!.options.filter((_, i) => i !== oi) }) }\n\n return (\n <section className=\"space-y-3 rounded-md border border-primary bg-background p-3\" aria-label={isNew ? t('orders.ifoodMenu.newItem') : t('orders.ifoodMenu.edit')}>\n <header className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{isNew ? t('orders.ifoodMenu.newItem') : t('orders.ifoodMenu.editItem', { name: value.name })}</h3>\n <Button size=\"sm\" variant=\"ghost\" aria-label={t('orders.ifoodMenu.cancel')} onClick={onCancel}><X className=\"h-4 w-4\" /></Button>\n </header>\n {/* Laid out like the product's card: photo on the left, its facts beside it. */}\n <div className=\"flex items-start gap-4 text-xs\">\n <PhotoField large bindingId={bindingId} path={d.imagePath} onPath={(imagePath) => set({ imagePath })} />\n <div className=\"min-w-0 flex-1 space-y-3\">\n <label className=\"block space-y-1\"><span>{t('orders.ifoodMenu.name')}</span>\n <Input value={d.name} onChange={(e) => set({ name: e.target.value })} /></label>\n <div className=\"flex flex-wrap items-end gap-3\">\n <label className=\"space-y-1\"><span>{t('orders.ifoodMenu.price')}</span>\n <MoneyInput value={d.price} wrapperClassName=\"w-28\" onChange={(price) => set({ price })} /></label>\n <div className=\"space-y-1\"><span className=\"block\">{t('orders.ifoodMenu.status')}</span>\n <StatusToggle value={d.status} onChange={(status) => set({ status })} /></div>\n </div>\n </div>\n </div>\n <label className=\"block space-y-1 text-xs\"><span>{t('orders.ifoodMenu.description')}</span>\n <textarea className=\"w-full rounded-md border border-input bg-background p-2 text-sm\" rows={2}\n value={d.description ?? ''} onChange={(e) => set({ description: e.target.value })} /></label>\n\n <div className=\"space-y-2\">\n {d.optionGroups.map((g, gi) => (\n <div key={g.id ?? `new-${gi}`} className=\"overflow-hidden rounded-md border border-border\">\n <div className=\"flex flex-wrap items-end gap-2 bg-muted/40 px-3 py-2 text-xs\">\n <label className=\"min-w-40 flex-1 space-y-1\"><span>{t('orders.ifoodMenu.groupName')}</span>\n <Input value={g.name} onChange={(e) => setGroup(gi, { name: e.target.value })} /></label>\n <label className=\"space-y-1\"><span>{t('orders.ifoodMenu.min')}</span>\n <Input type=\"number\" min={0} value={String(g.min)} wrapperClassName=\"w-16\" onChange={(e) => setGroup(gi, { min: Number(e.target.value) })} /></label>\n <label className=\"space-y-1\"><span>{t('orders.ifoodMenu.max')}</span>\n <Input type=\"number\" min={1} value={String(g.max)} wrapperClassName=\"w-16\" onChange={(e) => setGroup(gi, { max: Number(e.target.value) })} /></label>\n <Button size=\"icon\" variant=\"ghost\" aria-label={t('orders.ifoodMenu.removeGroup')} title={t('orders.ifoodMenu.removeGroup')}\n onClick={() => (g.id || g.name.trim() || g.options.some((o) => o.id || o.name.trim()) ? setConfirming(`g-${gi}`) : removeGroup(gi))}>\n <Trash2 className=\"h-4 w-4\" /></Button>\n </div>\n {confirming === `g-${gi}` && (\n <ConfirmRow text={t('orders.ifoodMenu.confirmGroup', { name: g.name.trim() || t('orders.ifoodMenu.groupName'), n: g.options.length })}\n onConfirm={() => removeGroup(gi)} onCancel={() => setConfirming(null)} />\n )}\n <ul className=\"divide-y divide-border\">\n {g.options.map((o, oi) => (\n <li key={o.id ?? `new-${oi}`} className=\"flex flex-wrap items-center gap-2 px-3 py-2 text-xs\">\n <PhotoField small bindingId={bindingId} path={o.imagePath} onPath={(imagePath) => setOption(gi, oi, { imagePath })} />\n <Input value={o.name} placeholder={t('orders.ifoodMenu.optionName')} aria-label={t('orders.ifoodMenu.optionName')}\n wrapperClassName=\"min-w-36 flex-1\" onChange={(e) => setOption(gi, oi, { name: e.target.value })} />\n <MoneyInput value={o.price} wrapperClassName=\"w-24\" onChange={(price) => setOption(gi, oi, { price })} />\n <StatusToggle compact value={o.status} onChange={(status) => setOption(gi, oi, { status })} />\n <Button size=\"icon\" variant=\"ghost\" aria-label={t('orders.ifoodMenu.removeOption')} title={t('orders.ifoodMenu.removeOption')}\n onClick={() => (o.id || o.name.trim() ? setConfirming(`o-${gi}-${oi}`) : removeOption(gi, oi))}><Trash2 className=\"h-4 w-4\" /></Button>\n {confirming === `o-${gi}-${oi}` && (\n <div className=\"-mx-3 -mb-2 basis-full\">\n <ConfirmRow text={t('orders.ifoodMenu.confirmOption', { name: o.name.trim() })}\n onConfirm={() => removeOption(gi, oi)} onCancel={() => setConfirming(null)} />\n </div>\n )}\n </li>\n ))}\n </ul>\n <div className=\"border-t border-border px-3 py-2\">\n <Button size=\"sm\" variant=\"ghost\"\n onClick={() => setGroup(gi, { options: [...g.options, { name: '', price: 0, status: 'AVAILABLE' }] })}>\n <Plus className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodMenu.addOption')}\n </Button>\n </div>\n </div>\n ))}\n <Button size=\"sm\" variant=\"outline\"\n onClick={() => set({ optionGroups: [...d.optionGroups, { name: '', min: 0, max: 1, status: 'AVAILABLE', options: [{ name: '', price: 0, status: 'AVAILABLE' }] }] })}>\n <Plus className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodMenu.addGroup')}\n </Button>\n </div>\n\n <div className=\"flex justify-end gap-2 border-t border-border pt-3\">\n <Button size=\"sm\" variant=\"ghost\" onClick={onCancel}>{t('orders.ifoodMenu.cancel')}</Button>\n <Button size=\"sm\" disabled={busy} onClick={() => onSave(d)}>\n {busy && <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />} {t('orders.ifoodMenu.save')}\n </Button>\n </div>\n </section>\n )\n}\n\nfunction LinkPicker({ onPick, onCancel }: { onPick: (p: ProductHit) => void; onCancel: () => void }) {\n const t = useTranslation()\n const [term, setTerm] = React.useState('')\n const [hits, setHits] = React.useState<ProductHit[]>([])\n React.useEffect(() => {\n let alive = true\n const id = setTimeout(() => { searchProducts(term).then((h) => { if (alive) setHits(h) }).catch(() => { if (alive) setHits([]) }) }, 250)\n return () => { alive = false; clearTimeout(id) }\n }, [term])\n return (\n <section className=\"space-y-2 rounded-md border border-primary bg-background p-3\" aria-label={t('orders.ifoodMenu.linkTitle')}>\n <header className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodMenu.linkTitle')}</h3>\n <Button size=\"sm\" variant=\"ghost\" aria-label={t('orders.ifoodMenu.cancel')} onClick={onCancel}><X className=\"h-4 w-4\" /></Button>\n </header>\n <Input autoFocus value={term} placeholder={t('orders.ifoodMenu.searchProduct')} onChange={(e) => setTerm(e.target.value)} />\n <ul className=\"max-h-64 space-y-1 overflow-auto\">\n {hits.map((p) => (\n <li key={p.id}>\n <button type=\"button\" className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-muted\" onClick={() => onPick(p)}>\n <Thumb url={p.imageUrl} small />\n <span className=\"flex-1\">{p.name}</span>\n <span className=\"text-xs text-muted-foreground\">{money(p.price)}</span>\n </button>\n </li>\n ))}\n {hits.length === 0 && <li className=\"px-2 text-xs text-muted-foreground\">{t('orders.ifoodMenu.noProducts')}</li>}\n </ul>\n </section>\n )\n}\n","// Operação: the iFood store this account is linked to — its live status, pauses,\n// the week of opening hours, and the log of what iFood answered to each action.\n// Every action shows up in the log below it, which is what iFood's Merchant\n// homologation records next to the action.\nimport React from 'react'\nimport { Loader2, Pause, Play, Plus, RefreshCw, Save, Trash2 } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Input } from '@fayz-ai/ui'\nimport { IfoodMenuPanel } from './IfoodMenuPanel'\nimport {\n storeErrorKey,\n storePanel,\n type LinkedStore,\n type StoreCall,\n type StoreDetails,\n type StorePause,\n type StoreShift,\n} from './storePanel'\n\nconst DAYS = ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'] as const\nconst STATE_TONE: Record<string, string> = {\n OK: 'bg-success/15 text-success',\n WARNING: 'bg-warning/15 text-warning',\n CLOSED: 'bg-muted text-muted-foreground',\n ERROR: 'bg-destructive/15 text-destructive',\n}\n\ninterface Row { dayOfWeek: string; start: string; end: string }\n\nconst minutesOf = (hhmm: string) => {\n const [h, m] = hhmm.split(':').map(Number)\n return (h ?? 0) * 60 + (m ?? 0)\n}\nconst clock = (minutes: number) => `${String(Math.floor(minutes / 60)).padStart(2, '0')}:${String(minutes % 60).padStart(2, '0')}`\nconst toRow = (s: StoreShift): Row => ({ dayOfWeek: s.dayOfWeek, start: s.start.slice(0, 5), end: clock(minutesOf(s.start) + s.duration) })\nconst weekKey = (rows: Row[]) => rows.map((r) => `${r.dayOfWeek} ${r.start} ${r.end}`).sort().join('|')\nconst sameWeek = (a: Row[], b: Row[]) => weekKey(a) === weekKey(b)\nconst wallClock = (v: string | null) => (v ? v.replace('T', ' ').slice(0, 16) : '—')\n\nexport function IfoodStorePanel() {\n const t = useTranslation()\n const [details, setDetails] = React.useState<StoreDetails | null>(null)\n const [linked, setLinked] = React.useState<LinkedStore[]>([])\n // The store and its menu share one tab and one log: every video shows the\n // action and, under it, what iFood answered.\n const [view, setView] = React.useState<'store' | 'menu'>('store')\n const [chosen, setChosen] = React.useState<string | undefined>(undefined)\n const [pauses, setPauses] = React.useState<StorePause[]>([])\n // iFood lists a new pause only a minute or more after accepting it; until\n // then the pause it answered with is shown, marked as waiting for the list.\n const [pending, setPending] = React.useState<StorePause[]>([])\n // The same lag the other way: a removed pause stays in iFood's list for a\n // while after the 204. It stays greyed out until the list drops it, which\n // is when the removal is announced.\n const [removing, setRemoving] = React.useState<string[]>([])\n const removingRef = React.useRef<string[]>([])\n const markRemoving = (ids: string[]) => {\n removingRef.current = [...new Set([...removingRef.current, ...ids])]\n setRemoving(removingRef.current)\n }\n // What iFood's list says now, against what we already know it will say.\n const settle = React.useCallback((listed: StorePause[]) => {\n const isListed = (id: string) => listed.some((l) => l.id === id)\n const gone = removingRef.current.filter((id) => !isListed(id))\n setPauses(listed)\n setPending((current) => current.filter((x) => !isListed(x.id) && !gone.includes(x.id)))\n if (gone.length) {\n removingRef.current = removingRef.current.filter((id) => !gone.includes(id))\n setRemoving(removingRef.current)\n setMessage({ tone: 'ok', text: t('orders.ifoodStore.pause.removed') })\n }\n }, [t])\n const [rows, setRows] = React.useState<Row[] | null>(null)\n // iFood's hours list can also lag a saved week by minutes (its status\n // already obeys the new hours). The week iFood accepted is shown until the\n // list agrees, for up to 10 min.\n const acceptedRef = React.useRef<{ rows: Row[]; at: number } | null>(null)\n const [hoursWaiting, setHoursWaiting] = React.useState(false)\n const applyHours = React.useCallback((listed: Row[]) => {\n const accepted = acceptedRef.current\n if (accepted && sameWeek(listed, accepted.rows)) acceptedRef.current = null\n if (accepted && Date.now() - accepted.at > 10 * 60_000) acceptedRef.current = null\n setRows(acceptedRef.current ? acceptedRef.current.rows : listed)\n setHoursWaiting(!!acceptedRef.current)\n }, [])\n const [draft, setDraft] = React.useState<Row[] | null>(null)\n const [calls, setCalls] = React.useState<StoreCall[]>([])\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState<string | null>(null)\n const [message, setMessage] = React.useState<{ tone: 'error' | 'ok'; text: string } | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [checkedAt, setCheckedAt] = React.useState<Date | null>(null)\n // iFood names its checks with codes it may add to; a code with no sentence\n // here still shows, as the code.\n const known = (key: string, fallback: string) => {\n const text = t(key)\n return text === key ? fallback : text\n }\n const [reason, setReason] = React.useState(t('orders.ifoodStore.pause.defaultReason'))\n const [minutes, setMinutes] = React.useState('30')\n\n const bindingId = details?.bindingId\n\n const loadCalls = React.useCallback(async () => {\n try {\n setCalls((await storePanel.calls(bindingId)).calls)\n } catch {\n // the log is a view; its failure never hides the store\n }\n }, [bindingId])\n\n const load = React.useCallback(async () => {\n setLoadError(null)\n try {\n // The account's stores first, as iFood lists them; the rest is about one.\n const { stores } = await storePanel.stores()\n setLinked(stores)\n const pick = stores.find((s) => s.bindingId === chosen)?.bindingId ?? stores[0]?.bindingId\n // With a store in hand its three reads go together: one wait, not two.\n const first = pick ? null : await storePanel.details()\n const id = pick ?? first!.bindingId\n const [d, p, h] = await Promise.all([first ?? storePanel.details(id), storePanel.pauses(id), storePanel.hours(id)])\n setDetails(d)\n settle(p)\n applyHours(h.shifts.map(toRow))\n setCheckedAt(new Date())\n } catch (error) {\n setLoadError(t(storeErrorKey(error)))\n } finally {\n setLoading(false)\n }\n }, [t, chosen, settle, applyHours])\n\n React.useEffect(() => {\n void load()\n }, [load])\n\n React.useEffect(() => {\n void loadCalls()\n // Every 5 s while someone is looking: a tab left open in the background\n // has no one to show the log to.\n const timer = setInterval(() => { if (!document.hidden) void loadCalls() }, 5000)\n return () => clearInterval(timer)\n }, [loadCalls])\n\n React.useEffect(() => {\n if (!hoursWaiting || !bindingId) return\n const timer = setInterval(() => {\n if (document.hidden) return\n storePanel.hours(bindingId).then((h) => applyHours(h.shifts.map(toRow))).catch(() => {})\n }, 15_000)\n return () => clearInterval(timer)\n }, [hoursWaiting, bindingId, applyHours])\n\n React.useEffect(() => {\n if ((!pending.length && !removing.length) || !bindingId) return\n const timer = setInterval(() => {\n if (document.hidden) return\n storePanel.pauses(bindingId).then(settle).catch(() => {})\n }, 15_000)\n return () => clearInterval(timer)\n }, [pending.length, removing.length, bindingId, settle])\n\n async function act(key: string, ok: string | null, work: () => Promise<unknown>) {\n if (busy) return\n setBusy(key)\n setMessage(null)\n try {\n await work()\n if (ok) setMessage({ tone: 'ok', text: ok })\n } catch (error) {\n setMessage({ tone: 'error', text: t(storeErrorKey(error)) })\n } finally {\n setBusy(null)\n await Promise.all([load(), loadCalls()])\n }\n }\n\n const editing = draft ?? rows ?? []\n const change = (index: number, patch: Partial<Row>) => setDraft(editing.map((r, i) => (i === index ? { ...r, ...patch } : r)))\n\n if (loading) return <p className=\"text-sm text-muted-foreground\">{t('orders.ifoodStore.loading')}</p>\n if (loadError && !details) {\n return (\n <div className=\"space-y-2 text-sm\">\n <p role=\"alert\" className=\"text-destructive\">{loadError}</p>\n <Button size=\"sm\" variant=\"outline\" onClick={() => void load()}>{t('orders.ifoodStore.retry')}</Button>\n </div>\n )\n }\n\n const status = details?.status ?? null\n const shownPauses = [...pauses, ...pending.filter((x) => !pauses.some((p) => p.id === x.id))]\n const waiting = (p: StorePause) => !pauses.some((listed) => listed.id === p.id)\n // Reopen only means something while a pause keeps the store closed.\n const pausedNow = !!status && !status.available && ((!!status.reopenableInterruptionId && !removing.includes(status.reopenableInterruptionId)) || shownPauses.some((p) => !removing.includes(p.id)))\n const address = details?.address\n ? ['street', 'number', 'district', 'city', 'state', 'postalCode'].map((k) => details.address![k]).filter(Boolean).join(', ')\n : null\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"space-y-0.5 text-sm\">\n <p className=\"font-medium\">{details?.name ?? t('orders.ifoodStore.store')}</p>\n {details?.corporateName && <p className=\"text-xs text-muted-foreground\">{details.corporateName}</p>}\n {address && <p className=\"text-xs text-muted-foreground\">{address}</p>}\n </div>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n {checkedAt && t('orders.ifoodStore.checkedAt', { time: checkedAt.toLocaleTimeString() })}\n <Button size=\"sm\" variant=\"ghost\" aria-label={t('orders.ifoodStore.refresh')} onClick={() => void act('refresh', t('orders.ifoodStore.refreshed'), async () => {})}>\n <RefreshCw className={`h-4 w-4 ${busy === 'refresh' ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n </div>\n\n <div role=\"tablist\" className=\"inline-flex rounded-md bg-muted p-1 text-sm\">\n {(['store', 'menu'] as const).map((v) => (\n <button key={v} type=\"button\" role=\"tab\" aria-selected={view === v}\n className={`rounded px-3 py-1 ${view === v ? 'bg-background font-medium shadow-sm' : 'text-muted-foreground'}`}\n onClick={() => setView(v)}>\n {t(`orders.ifoodStore.view.${v}`)}\n </button>\n ))}\n </div>\n\n {view === 'menu' ? (\n <IfoodMenuPanel bindingId={bindingId} onChanged={() => void loadCalls()} />\n ) : (\n <>\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.linked.title')}</h3>\n {linked.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.linked.none')}</p>\n ) : (\n <ul className=\"space-y-1\">\n {linked.map((store) => (\n <li key={store.bindingId}\n className={`flex flex-wrap items-center gap-2 rounded-md border px-2 py-1 text-sm ${store.bindingId === details?.bindingId ? 'border-primary' : 'border-border'}`}>\n <span className=\"font-medium\">{store.name ?? store.merchantId}</span>\n {store.corporateName && <span className=\"text-xs text-muted-foreground\">{store.corporateName}</span>}\n <code className=\"text-xs text-muted-foreground\">{store.merchantId}</code>\n <span className={`rounded-full px-2 py-0.5 text-xs ${store.authorized ? 'bg-success/10 text-success' : 'bg-destructive/10 text-destructive'}`}>\n {store.authorized ? t('orders.ifoodStore.linked.authorized') : t('orders.ifoodStore.linked.revoked')}\n </span>\n {linked.length > 1 && store.bindingId !== details?.bindingId && (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setChosen(store.bindingId)}>{t('orders.ifoodStore.linked.open')}</Button>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n\n {message && (\n <p role={message.tone === 'error' ? 'alert' : 'status'}\n className={`rounded-md px-3 py-2 text-sm ${message.tone === 'error' ? 'bg-destructive/10 text-destructive' : 'bg-success/10 text-success'}`}>\n {message.text}\n </p>\n )}\n\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.status.title')}</h3>\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className={`rounded-full px-3 py-1 text-sm font-semibold ${STATE_TONE[status?.state ?? ''] ?? 'bg-muted'}`}>\n {t(`orders.ifoodStore.state.${status?.state ?? 'UNKNOWN'}`)}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {status?.available ? t('orders.ifoodStore.status.receiving') : t('orders.ifoodStore.status.notReceiving')}\n </span>\n {pausedNow && (\n <Button size=\"sm\" variant=\"outline\" className=\"ml-auto\" disabled={!!busy}\n onClick={() => void act('reopen', t('orders.ifoodStore.reopen.done'), async () => {\n await storePanel.reopen(bindingId)\n markRemoving(shownPauses.map((p) => p.id))\n })}>\n <Play className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodStore.reopen.action')}\n </Button>\n )}\n </div>\n {(status?.title || status?.subtitle) && (\n <p className=\"text-sm\">{[status.title, status.subtitle].filter(Boolean).join(' — ')}</p>\n )}\n {!!status?.validations?.length && (\n <ul className=\"grid gap-1 text-xs sm:grid-cols-2\">\n {status.validations.map((v) => (\n <li key={v.code} className=\"flex items-center gap-2\">\n <span className={`h-2 w-2 rounded-full ${v.state === 'OK' ? 'bg-success' : v.state === 'WARNING' ? 'bg-warning' : 'bg-destructive'}`} />\n <span>{v.title ?? known(`orders.ifoodStore.validation.${v.code}`, v.code)}</span>\n <span className=\"text-muted-foreground\">{known(`orders.ifoodStore.validation.state.${v.state}`, v.state)}</span>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.pause.title')}</h3>\n <div className=\"grid grid-cols-[minmax(0,1fr)_5.5rem] items-end gap-2 sm:grid-cols-[minmax(0,1fr)_5.5rem_auto]\">\n <label className=\"space-y-1 text-xs\">\n <span>{t('orders.ifoodStore.pause.reason')}</span>\n <Input value={reason} maxLength={255} onChange={(e) => setReason(e.target.value)} />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span>{t('orders.ifoodStore.pause.minutes')}</span>\n <Input type=\"number\" min={1} max={10080} value={minutes} onChange={(e) => setMinutes(e.target.value)} />\n </label>\n <Button size=\"lg\" className=\"col-span-2 sm:col-span-1\" disabled={!!busy}\n onClick={() => void act('pause', t('orders.ifoodStore.pause.done'), async () => {\n const created = await storePanel.pause(bindingId, reason, Number(minutes))\n if (created?.id) setPending((current) => [...current.filter((x) => x.id !== created.id), created])\n })}>\n <Pause className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodStore.pause.action')}\n </Button>\n </div>\n {shownPauses.length ? (\n <ul className=\"space-y-1 text-sm\">\n {shownPauses.map((p) => (\n <li key={p.id} aria-busy={removing.includes(p.id)}\n className={`flex items-center gap-2 rounded-md border border-border px-3 py-2 ${removing.includes(p.id) ? 'opacity-50' : ''}`}>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium\">{p.description ?? t('orders.ifoodStore.pause.title')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {wallClock(p.start)} → {wallClock(p.end)}\n {!removing.includes(p.id) && waiting(p) && <span className=\"ml-2 rounded bg-muted px-1.5 py-0.5\">{t('orders.ifoodStore.pause.waiting')}</span>}\n </p>\n </div>\n {removing.includes(p.id) ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" /> {t('orders.ifoodStore.pause.removing')}\n </span>\n ) : (\n <Button size=\"sm\" variant=\"ghost\" disabled={!!busy} aria-label={t('orders.ifoodStore.pause.remove')}\n onClick={() => void act(`rm:${p.id}`, null, async () => {\n await storePanel.removePause(bindingId, p.id)\n markRemoving([p.id])\n })}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n )}\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.pause.none')}</p>\n )}\n </section>\n\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.hours.title')}</h3>\n <p className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.hours.replaces')}</p>\n {hoursWaiting && !draft && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> {t('orders.ifoodStore.hours.waiting')}\n </p>\n )}\n <div className=\"space-y-1\">\n {editing.map((row, index) => (\n <div key={index} className=\"flex flex-wrap items-center gap-2 text-sm\">\n <select className=\"h-9 rounded-md border border-input bg-background px-2\" value={row.dayOfWeek}\n onChange={(e) => change(index, { dayOfWeek: e.target.value })}>\n {DAYS.map((d) => <option key={d} value={d}>{t(`orders.ifoodStore.day.${d}`)}</option>)}\n </select>\n <Input type=\"time\" value={row.start} wrapperClassName=\"w-28\" onChange={(e) => change(index, { start: e.target.value })} />\n <span className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.hours.until')}</span>\n <Input type=\"time\" value={row.end} wrapperClassName=\"w-28\" onChange={(e) => change(index, { end: e.target.value })} />\n <Button size=\"sm\" variant=\"ghost\" aria-label={t('orders.ifoodStore.hours.removeShift')}\n onClick={() => setDraft(editing.filter((_, i) => i !== index))}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={() => setDraft([...editing, { dayOfWeek: 'MONDAY', start: '09:00', end: '18:00' }])}>\n <Plus className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodStore.hours.addShift')}\n </Button>\n <Button size=\"sm\" disabled={!!busy || !draft}\n onClick={() => void act('hours', t('orders.ifoodStore.hours.saved'), async () => {\n const saved = await storePanel.saveHours(bindingId, editing.map((r) => ({\n dayOfWeek: r.dayOfWeek,\n start: `${r.start}:00`,\n duration: minutesOf(r.end) - minutesOf(r.start),\n })))\n acceptedRef.current = { rows: (saved?.shifts?.length ? saved.shifts.map(toRow) : editing), at: Date.now() }\n setDraft(null)\n })}>\n <Save className=\"mr-1 h-4 w-4\" /> {t('orders.ifoodStore.hours.save')}\n </Button>\n {draft && <Button size=\"sm\" variant=\"ghost\" onClick={() => setDraft(null)}>{t('orders.ifoodStore.hours.discard')}</Button>}\n </div>\n </section>\n </>\n )}\n\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{t('orders.ifoodStore.log.title')}</h3>\n <p className=\"text-xs text-muted-foreground\">{t('orders.ifoodStore.log.desc')}</p>\n <div className=\"max-h-80 overflow-auto rounded-md border border-border\">\n <table className=\"w-full text-xs\">\n <thead className=\"sticky top-0 bg-muted text-left\">\n <tr>\n <th className=\"p-2\">{t('orders.ifoodStore.log.time')}</th>\n <th className=\"p-2\">{t('orders.ifoodStore.log.method')}</th>\n <th className=\"p-2\">{t('orders.ifoodStore.log.endpoint')}</th>\n <th className=\"p-2\">HTTP</th>\n <th className=\"p-2\">{t('orders.ifoodStore.log.response')}</th>\n </tr>\n </thead>\n <tbody>\n {calls.map((c) => (\n <tr key={c.id} className=\"border-t border-border align-top\">\n <td className=\"whitespace-nowrap p-2\">{new Date(c.at).toLocaleTimeString()}</td>\n <td className=\"p-2 font-mono\">{c.method}</td>\n <td className=\"break-all p-2 font-mono\">{c.path}</td>\n <td className={`p-2 font-mono font-semibold ${c.status === null || c.status >= 400 ? 'text-destructive' : 'text-success'}`}>\n {c.status ?? '—'}{c.errorCode ? ` ${c.errorCode}` : ''}\n </td>\n <td className=\"p-2\">\n {c.response !== null && c.response !== undefined ? (\n <details>\n <summary className=\"cursor-pointer\">{t('orders.ifoodStore.log.see', { ms: c.durationMs })}</summary>\n <pre className=\"max-w-md whitespace-pre-wrap break-all\">{JSON.stringify(c.response, null, 2)}</pre>\n </details>\n ) : (\n <span className=\"text-muted-foreground\">{c.durationMs} ms</span>\n )}\n </td>\n </tr>\n ))}\n {calls.length === 0 && (\n <tr><td colSpan={5} className=\"p-3 text-center text-muted-foreground\">{t('orders.ifoodStore.log.empty')}</td></tr>\n )}\n </tbody>\n </table>\n </div>\n </section>\n </div>\n )\n}\n","// The store's Merchant ID, checked by the integration service. Our iFood apps\n// are CENTRALIZED (one client_credentials token for every store that\n// authorized them): there is no consent screen to send the merchant to and no\n// redirect to come back from, so the platform's OAuth start answered 404 and\n// no new store could connect. Now the store authorizes our app at iFood (we\n// send the request; the owner approves it in the Portal do Parceiro), then\n// types its Merchant ID here. The service checks that the store authorized\n// us and that no other account holds it, and starts reading its orders\n// (control-sdk-backend `POST /v1/delivery/connections/ifood/stores`).\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n tl,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\nimport { IfoodStorePanel } from './IfoodStorePanel'\nimport { serviceRequest, StoreError } from './storePanel'\n\nexport const IFOOD_CONNECTOR_ID = 'ifood'\n\nconst ORDER_TYPE_LABELS: Record<string, string> = {\n DELIVERY: 'Entrega',\n TAKEOUT: 'Retirada',\n INDOOR: 'Consumo no local',\n}\n\nexport const IFOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'orderTypes',\n label: 'Quais pedidos trazer',\n description: 'iFood entrega, deixa retirar e atende no salão; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: ORDER_TYPE_LABELS.DELIVERY },\n { value: 'TAKEOUT', label: ORDER_TYPE_LABELS.TAKEOUT },\n { value: 'INDOOR', label: ORDER_TYPE_LABELS.INDOOR },\n ],\n // Required to OPERATE, not to connect: nothing selected reads as \"conectado, falta configurar\".\n requiredToOperate: true,\n defaultValue: ['DELIVERY', 'TAKEOUT'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `merchantId` is what the store typed; `storeId` is the service's id for the\n// link (the binding), which Desconectar lets go of.\nconst store = createConnectionStore(IFOOD_CONNECTOR_ID, {\n settings: IFOOD_SETTINGS,\n settingsKeys: ['merchantId', 'storeId'],\n})\n\n/** The sentence for each refusal of the link, in the store's words. */\nexport function ifoodLinkRefusal(error: unknown): string {\n const code = error instanceof StoreError ? error.code : ''\n switch (code) {\n case 'merchant_id_invalid':\n return tl(\n \"That is not an iFood Merchant ID. Copy it from the Portal do Parceiro (it looks like 491b9546-ab27-…).\",\n 'Isso não é um ID de loja do iFood. Copie o ID da loja no Portal do Parceiro (ele tem o formato 491b9546-ab27-…).',\n )\n case 'ifood_not_authorized':\n return tl(\n 'This store has not authorized us on iFood yet. Ask our support to send the request, approve it in the Portal do Parceiro, and connect again.',\n 'Esta loja ainda não autorizou o nosso aplicativo no iFood. Peça ao suporte para enviar a solicitação, aprove-a no Portal do Parceiro e conecte de novo.',\n )\n case 'store_taken':\n return tl('This iFood store is already connected to another account.', 'Esta loja do iFood já está conectada a outra conta.')\n case 'not_allowed':\n return tl('Your user cannot change the connections of this account.', 'Seu usuário não pode alterar as conexões desta conta.')\n case 'unauthorized':\n return tl('Your session expired. Sign in again.', 'Sua sessão expirou. Entre de novo.')\n default:\n return tl(\"We could not reach iFood now. Try again in a moment.\", 'Não foi possível falar com o iFood agora. Tente de novo em instantes.')\n }\n}\n\nexport const ifoodConnectorDef: ConnectorDefinition = {\n id: IFOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'iFood',\n description: 'Traga para a cozinha cada pedido feito no iFood, e avise o iFood quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // A typed id the service verifies, not a consent redirect: see the header.\n authKind: 'api-key',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.ifood.com.br/pt-BR/docs/guides/modules/order/workflow/',\n // A ceiling for the scheduler, not the cadence: iFood asks for one poll every 30s.\n rateLimit: { perSecond: 1 },\n permissions: marketplacePermissions('iFood'),\n // Not a secret: the store's own id at iFood. Our client pair never leaves\n // the integration service, and the restaurant never sees a credential.\n fields: [\n {\n key: 'merchantId',\n label: tl('iFood Merchant ID (Portal do Parceiro)', 'ID da loja no iFood (Portal do Parceiro)'),\n type: 'text',\n placeholder: '00000000-0000-0000-0000-000000000000',\n },\n ],\n settings: IFOOD_SETTINGS,\n howItSyncs: [\n 'A ligação com o iFood é lida de tempos em tempos e cada pedido novo entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no iFood.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o iFood — o cliente acompanha pelo aplicativo dele.',\n ],\n ...connectionStatus(\n IFOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(ORDER_TYPE_LABELS, connection?.settings?.orderTypes),\n plane: 'sync',\n ...settingsStatus(IFOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n // The service decides: the store authorized us at iFood, and it is no other\n // account's. Only then is the connection recorded here.\n saveConnection: async (values) => {\n const merchantId = (values.merchantId ?? '').trim()\n let linked: { storeId: string; merchantRef: string; name?: string | null }\n try {\n linked = await serviceRequest('POST', '/v1/delivery/connections/ifood/stores', { merchantId })\n } catch (error) {\n throw new Error(ifoodLinkRefusal(error))\n }\n await store.save({\n active: true,\n settings: { merchantId: linked.merchantRef, storeId: linked.storeId },\n ...(linked.name ? { displayName: `iFood · ${linked.name}` } : {}),\n })\n },\n // The store itself (status, pauses, hours) and what iFood answered, run by\n // the integration service: what iFood's Merchant homologation records.\n OperatePanel: IfoodStorePanel,\n operateLabel: 'Loja',\n // The service stops reading the store's orders first; then the connection\n // here. A store the service already let go of is not an error.\n disconnect: async () => {\n const current = await store.get().catch(() => null)\n const merchantId = typeof current?.settings?.merchantId === 'string' ? current.settings.merchantId : null\n let storeId = typeof current?.settings?.storeId === 'string' ? current.settings.storeId : null\n // A connection made by hand before this (no storeId): the account's link\n // to that iFood store, as the service lists it.\n if (!storeId && merchantId) {\n const linked = await serviceRequest<Array<{ storeId: string; merchantRef: string }>>('GET', '/v1/delivery/stores?provider=ifood').catch(() => [])\n storeId = linked.find((s) => s.merchantRef === merchantId)?.storeId ?? null\n }\n if (storeId) {\n try {\n await serviceRequest('DELETE', `/v1/delivery/connections/ifood/stores/${encodeURIComponent(storeId)}`)\n } catch (error) {\n if (!(error instanceof StoreError && error.status === 404)) throw new Error(ifoodLinkRefusal(error))\n }\n }\n await store.disconnect()\n },\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, like Keeta — but 99Food's reference is behind partner access, so\n// that its open platform brokers merchant authorization the same way is an\n// assumption, not a reading. See ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const NINETY_NINE_FOOD_CONNECTOR_ID = '99food'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const NINETY_NINE_FOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: '99Food entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\nconst store = createConnectionStore(NINETY_NINE_FOOD_CONNECTOR_ID, {\n settings: NINETY_NINE_FOOD_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const nineNineFoodConnectorDef: ConnectorDefinition = {\n id: NINETY_NINE_FOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: '99Food',\n description: 'Traga para a cozinha cada pedido feito no 99Food, e avise o 99Food quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Declared as the same open-platform shape Keeta turned out to be — see the\n // header for what that assumption rests on.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer-food.99app.com/',\n // No rateLimit: whether we poll at all is part of what is unverified.\n permissions: marketplacePermissions('99Food'),\n fields: [],\n settings: NINETY_NINE_FOOD_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no 99Food entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no 99Food.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o 99Food.',\n ],\n ...connectionStatus(\n NINETY_NINE_FOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(NINETY_NINE_FOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(NINETY_NINE_FOOD_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button: appId/appSecret are the platform's and the merchant self-authorizes\n// on Keeta's page. Keeta pushes orders, and there is no connector webhook ingress\n// yet — see ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const KEETA_CONNECTOR_ID = 'keeta'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const KEETA_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'Keeta entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `shopId` comes back with the grant — it is what an inbound push matches a\n// tenant on, and it is discovered, never typed.\nconst store = createConnectionStore(KEETA_CONNECTOR_ID, {\n settings: KEETA_SETTINGS,\n settingsKeys: ['shopId'],\n})\n\nexport const keetaConnectorDef: ConnectorDefinition = {\n id: KEETA_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Keeta',\n description: 'Traga para a cozinha cada pedido feito no Keeta, e avise o Keeta quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Keeta's own words: the credentials are software-level and the merchant\n // self-authorizes, which is the redirect flow this declares.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Keeta dials us, iFood does not.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://api-docs.mykeeta.com/apis/standard/docs/intro',\n // No rateLimit: a budget describes what we spend, and nothing here polls Keeta.\n permissions: marketplacePermissions('Keeta'),\n fields: [],\n settings: KEETA_SETTINGS,\n howItSyncs: [\n 'O Keeta avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Se o aviso não chegar de primeira, o Keeta tenta de novo — e um pedido já trazido não entra duas vezes.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Keeta.',\n ],\n ...connectionStatus(\n KEETA_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(KEETA_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(KEETA_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, and this one is Uber's own documented flow rather than an\n// assumption: the merchant is sent to Uber's login, authorizes the scope\n// `eats.pos_provisioning`, and comes back with an authorization code. The pair\n// behind it is ours — the restaurant never sees it. See\n// ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const UBER_EATS_CONNECTOR_ID = 'ubereats'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const UBER_EATS_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O Uber Eats entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` is Uber's own store id, read from `GET /stores` with the grant and\n// then provisioned with `POST /pos_data`. Discovered, never typed — Uber's docs\n// say in so many words that the external id \"can be arbitrary and should not be\n// used as a sole matchpoint\".\nconst store = createConnectionStore(UBER_EATS_CONNECTOR_ID, {\n settings: UBER_EATS_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const uberEatsConnectorDef: ConnectorDefinition = {\n id: UBER_EATS_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Uber Eats',\n description:\n 'Traga para a cozinha cada pedido feito no Uber Eats, e avise o Uber Eats quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Two grants, one merchant-facing: `client_credentials` for the day-to-day\n // calls and `authorization_code` for the store activation. It is the second\n // that this button opens.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Uber Eats pushes, like Keeta.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.uber.com/docs/eats/introduction',\n // No rateLimit: a budget describes what we spend, and nothing here polls Uber.\n permissions: marketplacePermissions('Uber Eats'),\n fields: [],\n settings: UBER_EATS_SETTINGS,\n howItSyncs: [\n 'O Uber Eats avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no Uber Eats.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Uber Eats.',\n ],\n ...connectionStatus(\n UBER_EATS_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(UBER_EATS_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(UBER_EATS_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// The one on this shelf with no consent screen to open, and it is Rappi's\n// protocol that decides it: the `client_id`/`client_secret` pair is issued in\n// Rappi's onboarding to WHOEVER INTEGRATES — one pair for the whole fleet, not\n// one per restaurant — and exchanged at `token/login/integrations` for a bearer\n// token. Nothing is redirected, so there is nothing to broker.\n//\n// That makes it the PlugBank shape, not the Cielo one: `api-key` with no\n// `fields`, because the credential is ours and lives in the platform. The\n// restaurant fills in nothing — asking it to paste our pair would be the defect\n// the house rule exists to prevent, and asking it to paste a pair of its own\n// would send every restaurant to register an application Rappi issues to\n// integrators anyway.\n//\n// Declaring `oauth` would be the other lie: a Conectar that opens a screen Rappi\n// does not have. ../DELIVERY-MARKETPLACES.md keeps the evidence.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const RAPPI_CONNECTOR_ID = 'rappi'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const RAPPI_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O Rappi entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` is read from Rappi with our token, never typed: the pair is issued\n// per integration and one integration carries every store Rappi linked to it.\nconst store = createConnectionStore(RAPPI_CONNECTOR_ID, {\n settings: RAPPI_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const rappiConnectorDef: ConnectorDefinition = {\n id: RAPPI_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Rappi',\n description: 'Traga para a cozinha cada pedido feito no Rappi, e avise o Rappi quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n authKind: 'api-key',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://dev-portal.rappi.com/pt/',\n // No `providerInstall`: there is no panel where the restaurant fetches a key,\n // because there is no key for the restaurant to fetch.\n //\n // No rateLimit: Rappi's own standard is a request every 45 seconds, and that\n // budget belongs with the job that spends it — which is not written yet.\n permissions: marketplacePermissions('Rappi'),\n // Nothing to fill in: the pair is registered in Fayz, and the connect step\n // says exactly that instead of drawing an empty grid.\n fields: [],\n settings: RAPPI_SETTINGS,\n howItSyncs: [\n 'De tempos em tempos, os pedidos novos do Rappi entram na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no Rappi.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Rappi.',\n ],\n ...connectionStatus(\n RAPPI_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(RAPPI_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n // No `testConnection`, for PlugBank's reason: the credential is not in this\n // app, so there is nothing this side can validate — and ConnectorDetail\n // renders the button only when the verb exists.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, through Magalu ID — the aiqfome V2 standard. The lojista\n// authorizes the application STORE BY STORE, which is the same grant shape the\n// other marketplaces use and not a second kind of thing: one authorization, one\n// connection, one store. The pair behind it is ours. See\n// ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const AIQFOME_CONNECTOR_ID = 'aiqfome'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const AIQFOME_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O aiqfome entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` comes back with the grant: the authorization is per store, so the\n// grant already names which one. Discovered, never typed.\nconst store = createConnectionStore(AIQFOME_CONNECTOR_ID, {\n settings: AIQFOME_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const aiqfomeConnectorDef: ConnectorDefinition = {\n id: AIQFOME_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'aiqfome',\n description: 'Traga para a cozinha cada pedido feito no aiqfome, e avise o aiqfome quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Magalu ID: authorization code, `access_token` + `refresh_token`, and the\n // consent lives on the seller's own panel.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.aiqfome.com/docs/api/versions',\n // No rateLimit: how often the orders are read is part of what is unverified.\n permissions: marketplacePermissions('aiqfome'),\n fields: [],\n settings: AIQFOME_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no aiqfome entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no aiqfome.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o aiqfome.',\n ],\n ...connectionStatus(\n AIQFOME_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(AIQFOME_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(AIQFOME_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","import { defineSettingsTab } from '@fayz-ai/admin'\nimport { tl } from '@fayz-ai/core'\n\nexport const ordersV1SettingsTabs = [\n defineSettingsTab({\n id: 'orders-scale',\n label: tl('Scale & sale by weight', 'Balança e venda por peso'),\n icon: 'Scale',\n section: 'operations',\n requiresFacet: 'scale',\n pending: true,\n defaults: { 'scale.auto_launch': false, 'scale.min_weight_g': 10, 'scale.label_enabled': false, 'scale.label_prefix': '2', 'scale.label_code_length': 4, 'scale.label_value_kind': 'price' },\n sections: [\n { title: tl('Weighing', 'Pesagem'), fields: [\n { key: 'scale.auto_launch', type: 'boolean', scope: 'unit', label: tl('Launch on its own once the weight settles', 'Lançar sozinho quando o peso estabilizar') },\n { key: 'scale.min_weight_g', type: 'number', scope: 'unit', min: 1, max: 5000, label: tl('Minimum weight (g)', 'Peso mínimo (g)') },\n ] },\n { title: tl('Scale labels', 'Etiqueta da balança'), fields: [\n { key: 'scale.label_enabled', type: 'boolean', scope: 'unit', label: tl('Read scale labels at the POS', 'Ler etiqueta de balança no PDV') },\n { key: 'scale.label_prefix', type: 'string', scope: 'unit', label: tl('Barcode prefix', 'Prefixo do código') },\n { key: 'scale.label_code_length', type: 'number', scope: 'unit', min: 4, max: 6, label: tl('Product code digits', 'Dígitos do código do produto') },\n { key: 'scale.label_value_kind', type: 'select', scope: 'unit', label: tl('The label carries', 'A etiqueta traz'), options: [\n { value: 'price', label: tl('Price', 'Preço') }, { value: 'weight', label: tl('Weight', 'Peso') },\n ] },\n ] },\n ],\n }),\n]\n","import { emitDomainEvent, getActiveTenantId, getSupabaseClientOptional, tl, type OnboardingProgramDef } from '@fayz-ai/core'\nimport { registerAIToolHandler } from '@fayz-ai/admin'\nimport {\n classifySettingWriteError, describeZones, labelZones, normalizeZones, parseDeliveryZonesText, renderZonesTable, summarizeZonesShort,\n zonesFromSetting, zonesToSetting, type DeliveryZone, type LabelledDeliveryZone, type SettingWriteFailure,\n} from './delivery-zones'\n\n/** The setup answer the delivery step reads: `food.serviceModes` carrying `own-delivery`. */\nexport const SERVICE_MODES_ANSWER = 'food.serviceModes'\nexport const OWN_DELIVERY_MODE = 'own-delivery'\n\n/** Fired after the bands are written, so the activation sensors sweep again. */\nexport const DELIVERY_ZONES_SAVED_EVENT = 'orders.delivery_zones_saved'\n\n/** Phase 1 — the sentence becomes a proposal. Never writes. */\nexport const PROPOSE_DELIVERY_ZONES_TOOL = 'proposeDeliveryZones'\n/**\n * Phase 2 — the proposal is written, behind the native confirmation card.\n * That card is the ONE confirmation of the flow: phase 1 asks nothing of the\n * person, so they never confirm the same bands twice.\n */\nexport const SAVE_DELIVERY_ZONES_TOOL = 'saveDeliveryZones'\n\n/**\n * Where a delivery sentence belongs, in the model's words. Shared by the tool\n * descriptions, the program and the step hint, because the misroute happened\n * on a fresh conversation where only one of them was in front of the model.\n */\nexport const DELIVERY_ROUTING_RULE =\n 'Qualquer frase sobre entrega/delivery/taxa de entrega/frete/raio com km, R$ ou minutos (\"até 3 km R$ 5 em 30 min, 5 km por R$ 8 em 40 min\", \"configurar entrega\", \"cobro 6 reais até 4 km\") é proposeDeliveryZones. NUNCA é conta a pagar, despesa, fornecedor ou financeiro: \"entrega\" aqui não é um fornecedor e esses R$ são a taxa cobrada do cliente.'\n\nconst NOT_UNDERSTOOD_HINT = 'Não consegui montar as faixas com isso. Peça assim: até 3 km R$ 5 em 30 min; até 5 km R$ 8 em 40 min.'\nconst MISSING_ETA_HINT = 'Entendi as distâncias, mas não o tempo de todas as faixas. Pergunte só o que faltou e mantenha o resto.'\n\ntype Client = {\n rpc: (fn: string, args?: Record<string, unknown>) => PromiseLike<{ data: unknown; error: unknown }>\n}\n\nfunction client(): Client | null {\n return getSupabaseClientOptional() as Client | null\n}\n\n/** The sensor: bands saved, or a single fee a house configured by hand. */\nexport async function deliveryConfigured(): Promise<boolean> {\n const db = client()\n if (!db) return false\n const { data, error } = await db.rpc('tenant_settings')\n if (error || !data || typeof data !== 'object') return false\n const flat = data as Record<string, unknown>\n if (zonesFromSetting(flat['delivery.zones']).length > 0) return true\n const fee = Number(flat['delivery.fee'])\n return Number.isFinite(fee) && fee > 0\n}\n\n/** Structured bands win over the sentence; `[]` means nothing was understood. */\nfunction zonesFromArgs(args: Record<string, unknown>): DeliveryZone[] {\n const structured = Array.isArray(args.zones) ? normalizeZones(args.zones as Partial<DeliveryZone>[]) : []\n return structured.length > 0 ? structured : parseDeliveryZonesText(String(args.text ?? ''))\n}\n\nexport type ProposeDeliveryZonesResult =\n | { ok: false; reason: 'not_understood'; hint: string }\n | {\n ok: true\n saved: false\n /** The bands, each with the line the confirmation card shows for it. */\n proposal: LabelledDeliveryZone[]\n /** The markdown table. The reply's text starts with it, verbatim. */\n card: string\n /** One short clause per band, every band whole — fits the card's single-line RESUMO. */\n summary: string\n missingEta: boolean\n hint?: string\n next: string\n }\n\n/**\n * Phase 1. Text or structured bands in, a proposal out — the table, the\n * one-line summary and the labelled bands `saveDeliveryZones` is to be called\n * with. It never touches the database, whatever the model passes (a\n * `confirm: true` here is ignored), and it asks the person nothing: the\n * confirmation is the native card the runtime puts in front of the write.\n */\nexport function proposeDeliveryZones(args: Record<string, unknown>): ProposeDeliveryZonesResult {\n const zones = zonesFromArgs(args)\n if (zones.length === 0) return { ok: false, reason: 'not_understood', hint: NOT_UNDERSTOOD_HINT }\n const missingEta = zones.some((z) => !z.etaMinutes)\n const summary = summarizeZonesShort(zones)\n return {\n ok: true,\n saved: false,\n proposal: labelZones(zones),\n card: renderZonesTable(zones),\n summary,\n missingEta,\n ...(missingEta ? { hint: MISSING_ETA_HINT } : {}),\n next: missingEta\n ? `Nada foi gravado. Comece o texto da sua resposta pela tabela de card, copiada tal qual (é markdown), e pergunte só o que faltou (tempo ou valor), mantendo o resto; depois proponha de novo.`\n : `Nada foi gravado. Sua resposta em texto DEVE começar pela tabela de card, copiada tal qual (é markdown; não a resuma nem a descreva) — a pessoa precisa ler as faixas antes do card de confirmação. Em seguida, NESTA MESMA resposta, chame ${SAVE_DELIVERY_ZONES_TOOL} com estas mesmas faixas em zones (com label e etaMinutes) e este summary. O card nativo dessa ferramenta é onde a pessoa confirma ou cancela — não pergunte \"posso gravar?\" em texto, a pergunta é o card. Se ela cancelar, pergunte o que ajustar.`,\n }\n}\n\nexport type SaveDeliveryZonesResult =\n | { ok: false; reason: 'not_understood' | 'unsupported' | SettingWriteFailure; message: string; hint?: string }\n | { ok: true; saved: true; zones: DeliveryZone[]; card: string; summary: string }\n\n/**\n * Phase 2. Writes the bands to `delivery.zones` and keeps the single-fee keys\n * coherent. Declared `requiresConfirmation: true`, so the chat shows the\n * ConfirmActionCard with the bands before this runs — the model cannot reach\n * the write without the person's tap, and that tap is the only one asked of\n * them (phase 1 draws no card of its own).\n */\nexport async function saveDeliveryZones(args: Record<string, unknown>): Promise<SaveDeliveryZonesResult> {\n const zones = zonesFromArgs(args)\n if (zones.length === 0) {\n return { ok: false, reason: 'not_understood', message: 'Nenhuma faixa para gravar.', hint: NOT_UNDERSTOOD_HINT }\n }\n const db = client()\n if (!db) return { ok: false, reason: 'unsupported', message: 'Este app não guarda a configuração de entrega.' }\n const writes: Array<[string, unknown]> = [\n ['delivery.zones', zonesToSetting(zones)],\n ['delivery.enabled', true],\n ['delivery.radius_km', zones[zones.length - 1].maxKm],\n ]\n const firstEta = zones[0].etaMinutes\n if (firstEta) writes.push(['delivery.eta_minutes', firstEta])\n try {\n for (const [key, value] of writes) {\n const { error } = await db.rpc('tenant_setting_set', { p_key: key, p_value: value })\n if (error) throw error\n }\n } catch (e) {\n const failure = classifySettingWriteError(e)\n return {\n ok: false,\n ...failure,\n hint: failure.reason === 'migration_missing'\n ? 'Diga à pessoa, com estas palavras, que a migration 007 ainda não foi aplicada no banco e que as faixas podem ser gravadas assim que ela estiver no ar. Não tente de novo agora.'\n : undefined,\n }\n }\n emitDomainEvent(DELIVERY_ZONES_SAVED_EVENT, { zones: zones.length }, { tenantId: getActiveTenantId() ?? null })\n return { ok: true, saved: true, zones, card: renderZonesTable(zones), summary: describeZones(zones) }\n}\n\nexport function registerDeliveryZonesHandler(): void {\n registerAIToolHandler(PROPOSE_DELIVERY_ZONES_TOOL, (args) => proposeDeliveryZones(args))\n registerAIToolHandler(SAVE_DELIVERY_ZONES_TOOL, (args) => saveDeliveryZones(args))\n}\n\n/**\n * Activation program of the orders plugin — one step, and it is a conversation.\n *\n * Order 20: delivery is asked before the menu (30) because the wizard already\n * said the house delivers, and the answer is a sentence, not a form.\n */\nexport function buildOrdersOnboarding(): OnboardingProgramDef {\n return {\n id: 'orders',\n title: tl('Your orders', 'Seus pedidos'),\n order: 20,\n instructions: tl(\n `You are setting up delivery. ROUTING: any sentence about delivery/delivery fee/radius with km, R$ or minutes (\"até 3 km R$ 5 em 30 min, 5 km por R$ 8 em 40 min\", \"configurar entrega\") goes to ${PROPOSE_DELIVERY_ZONES_TOOL} — never to payables, expenses, suppliers or anything financial; \"entrega\" is not a supplier and those R$ are what the customer pays.\n- Call ${PROPOSE_DELIVERY_ZONES_TOOL} with the text EXACTLY as typed (never rewrite it: \"em 40 min\" is a time). It never writes and asks nothing: it returns the table and the labelled bands.\n- Start your reply's text with the table (the card field, verbatim markdown) and, in the SAME reply, call ${SAVE_DELIVERY_ZONES_TOOL} with those bands (zones with label and etaMinutes) and the summary. Its native confirmation card is the ONE place the person approves or cancels — never ask \"can I save?\" in text, and never confirm twice.\n- If a band is missing its time or fee, ask only for what is missing and keep the rest; propose again before saving.\n- If saving fails because the key does not exist yet (migration 007), say exactly that and do not retry. If the person cancels the card, ask what to change.\n- A house that charges by neighbourhood: ask for the neighbourhoods and the fee of each, then translate with the person (\"how far is the farthest one?\") into distance bands; a single fee is one band.\n- Every step has a guide (readSetupGuide). Read it before leading.`,\n `Você está configurando a entrega. ROTEAMENTO: ${DELIVERY_ROUTING_RULE}\n- Chame ${PROPOSE_DELIVERY_ZONES_TOOL} com o texto EXATAMENTE como veio (nunca reescreva: \"em 40 min\" é tempo). Ela nunca grava e não pergunta nada: devolve a tabela e as faixas com rótulo.\n- Comece o texto da resposta pela tabela (o campo card, markdown copiado tal qual) e, NA MESMA resposta, chame ${SAVE_DELIVERY_ZONES_TOOL} com essas faixas (zones com label e etaMinutes) e o summary. O card nativo de confirmação dela é o ÚNICO lugar em que a pessoa aprova ou cancela — nunca pergunte \"posso gravar?\" em texto, nunca confirme duas vezes.\n- Se faltou o tempo ou o valor de uma faixa, pergunte só o que faltou, mantenha o resto e proponha de novo antes de gravar.\n- Se a gravação falhar porque a chave ainda não existe (migration 007), diga exatamente isso e não tente de novo. Se a pessoa cancelar o card, pergunte o que mudar.\n- Casa que cobra por bairro: peça os bairros e o valor de cada um e traduza com a pessoa (\"o mais longe fica a quantos km?\") em faixas por distância; taxa única é uma faixa só.\n- Cada passo tem um guia (readSetupGuide). Leia antes de conduzir.`,\n ),\n steps: [\n {\n key: 'delivery-zones',\n title: tl('Delivery areas', 'Áreas de entrega'),\n description: tl(\n 'How far you deliver and what each band costs — said in a sentence.',\n 'Até onde você entrega e quanto custa cada faixa — dito numa frase.',\n ),\n icon: 'Bike',\n route: '/settings/orders-delivery',\n priority: 'high',\n journey: { group: 'launch' },\n // How the house serves is answered by conversation now (the\n // getting-started profile step writes the same key the wizard did);\n // \"own delivery\" absent from the answer rules the step out, and no\n // answer yet (older tenant, profile still loading) keeps it.\n appliesWhen: (answers) => {\n const modes = answers[SERVICE_MODES_ANSWER]\n if (!Array.isArray(modes)) return true\n return modes.includes(OWN_DELIVERY_MODE)\n },\n agentHint: tl(\n 'Ask how the house charges for delivery and wait for the sentence. Any km/R$/min sentence about delivery is proposeDeliveryZones (never a payable): show its table, then call saveDeliveryZones in the same reply — its native card is the one confirmation.',\n 'Pergunte como a casa cobra a entrega e espere a frase. Toda frase com km/R$/min sobre entrega é proposeDeliveryZones (nunca conta a pagar): mostre a tabela e chame saveDeliveryZones na mesma resposta — o card nativo dela é a única confirmação.',\n ),\n howTo: tl(\n 'Configurações › Delivery. Tell the assistant how you charge (\"up to 3 km R$ 5 in 30 min, up to 5 km R$ 8 in 40 min\") and confirm the table it shows; or type the bands by hand on the Delivery screen. One fee for everyone is one band.',\n 'Configurações › Delivery. Diga à assistente como você cobra (\"até 3 km R$ 5 em 30 min, até 5 km R$ 8 em 40 min\") e confirme a tabela que ela mostrar; ou digite as faixas à mão na tela de Delivery. Taxa única para todo mundo é uma faixa só.',\n ),\n celebrate: tl('Delivery saved.', 'Entrega salva.'),\n script: [\n { kind: 'say', text: tl('How do you charge for delivery? Send it your way.', 'Como você cobra a entrega? Pode me mandar do seu jeito.') },\n { kind: 'await' },\n ],\n check: deliveryConfigured,\n },\n ],\n }\n}\n","import React from 'react'\nimport { lazyComponent, tl } from '@fayz-ai/core'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from '@fayz-ai/orders/data/provider'\nimport type { RestaurantOrder } from '@fayz-ai/orders/domain/order'\nimport { createSupabaseOrdersProvider } from '@fayz-ai/orders/data/supabase'\nimport { createOrdersStore } from '@fayz-ai/orders/store'\nimport { ordersRegistries } from './data/registries'\nimport { MIGRATIONS } from './migrations'\nimport { ordersLocales } from './locales'\nimport { ifoodConnectorDef } from './integrations/ifood/connectorDef'\nimport { nineNineFoodConnectorDef } from './integrations/99food/connectorDef'\nimport { keetaConnectorDef } from './integrations/keeta/connectorDef'\nimport { uberEatsConnectorDef } from './integrations/ubereats/connectorDef'\nimport { rappiConnectorDef } from './integrations/rappi/connectorDef'\nimport { aiqfomeConnectorDef } from './integrations/aiqfome/connectorDef'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport type { OrderSourceOption, OrdersPluginLabels, ResolvedOrdersConfig } from './context'\nimport { ordersV1SettingsTabs } from './settings/v1-settings'\nimport { DELIVERY_ROUTING_RULE, buildOrdersOnboarding, registerDeliveryZonesHandler, PROPOSE_DELIVERY_ZONES_TOOL, SAVE_DELIVERY_ZONES_TOOL } from './lib/onboarding'\n\n// Code loads when it is first drawn, not with the app. Pages use React.lazy\n// (the shell's route boundary shows the page skeleton); anything that may\n// render elsewhere uses lazyComponent, which carries its own boundary.\nconst DeliverySettings = lazyComponent(() => import('./settings/DeliverySettings').then((m) => m.DeliverySettings))\n\nconst OrdersPage = React.lazy(() => import('./views/OrdersPage').then((m) => ({ default: m.OrdersPage })))\nconst OrderDetailRoute = React.lazy(() => import('./views/OrderDetailRoute').then((m) => ({ default: m.OrderDetailRoute })))\n\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n moduleName: tl('Orders & POS', 'Pedidos e PDV'),\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\n]\n\nexport interface OrdersPluginOptions {\n modules?: {\n delivery?: boolean\n takeout?: boolean\n }\n labels?: Partial<OrdersPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: OrdersDataProvider\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n onOrderCancelled?: (order: RestaurantOrder) => Promise<void>\n orderSources?: OrderSourceOption[]\n /** @deprecated One screen serves every account now; the value is ignored. */\n variant?: 'restaurant' | 'commercial'\n /**\n * Where \"create order\" goes, and whether the list offers it at all.\n *\n * This plugin shipped a board and no way to put anything on it — its own\n * `declaredLimits` note says order creation \"flows only through the\n * store/AI-tool with no dedicated UI create handler\". The restaurant app\n * worked around that with a rail entry called \"Nova comanda\", which put the\n * act of opening an order in the navigation instead of on the screen that\n * lists them, two clicks from the board it belongs to.\n *\n * The screen still belongs to the host — a comanda asks for a table and a\n * service mode, an e-commerce order asks for a customer and an address, and\n * neither belongs in this plugin. What belongs here is the BUTTON, in the\n * place every other list in the product keeps it.\n *\n * Unset means no button, which stays right for a variant whose orders arrive\n * from a storefront rather than from someone standing at a counter.\n */\n createRoute?: string\n /** The full order page for an id. Unset = the rail offers no \"Ver pedido completo\". */\n orderRoute?: (orderId: string) => string\n /** The edit screen for an id. Unset hides \"Editar pedido\". */\n editRoute?: (orderId: string) => string\n /** Whether this order may still be edited. Defaults to the archetype's `orderIsEditable` (open and new). */\n canEditOrder?: (order: { status?: string }) => boolean\n}\n\nfunction resolveConfig(options?: OrdersPluginOptions): ResolvedOrdersConfig {\n return {\n modules: {\n delivery: options?.modules?.delivery !== false,\n takeout: options?.modules?.takeout !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n orderSources: options?.orderSources ?? DEFAULT_ORDER_SOURCES,\n menuItemLookup: options?.menuItemLookup,\n staffLookup: options?.staffLookup,\n onOrderCompleted: options?.onOrderCompleted,\n onOrderCancelled: options?.onOrderCancelled,\n createRoute: options?.createRoute,\n editRoute: options?.editRoute,\n canEditOrder: options?.canEditOrder,\n orderRoute: options?.orderRoute,\n }\n}\n\nexport function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // Reads the account's real orders unless the app brings its own provider.\n // Read-only by default: status changes go through `@fayz-ai/core/orders`.\n const provider = options?.dataProvider ?? createSupabaseOrdersProvider()\n const store = createOrdersStore(provider, {\n onOrderCompleted: config.onOrderCompleted,\n onOrderCancelled: config.onOrderCancelled,\n })\n // The executor behind `proposeDeliveryZones` (client plane). Registering is a\n // map write; an app with no assistant simply never calls it.\n registerDeliveryZonesHandler()\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrdersPage, { config, provider, store, registries: ordersRegistries }))\n\n // `:id` arrives as a prop — AdminShell spreads the matched route params.\n const DetailComponent: React.FC<any> = ({ id }: { id?: string }) =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrderDetailRoute, {\n id,\n options: { editRoute: options?.editRoute, canEditOrder: options?.canEditOrder },\n }))\n\n return {\n id: 'orders',\n // The tenant's config arrives after load; the merge is shallow, per block, like the app's own call.\n rebuild: (tenantConfig) =>\n createOrdersPlugin({ ...options, ...(tenantConfig as OrdersPluginOptions) }),\n defaultAgentRole: 'operations',\n name: config.labels.moduleName,\n icon: 'Coins',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n // No `menu`: a sale is not a restaurant's, and a dependency lights up by\n // drag — every account with Orders would grow a Cardápio line.\n dependencies: [],\n // What installing this provisions, byte-for-byte the files under\n // src/migrations (embed barrel). The spine holds the orders tables; this\n // list holds the doors the plugin adds on top of them.\n migrations: MIGRATIONS.map((m) => ({\n id: `orders-${m.id}`,\n version: '1.0.0',\n sql: m.sql,\n description: m.id,\n })),\n events: [\n {\n name: 'orders.order_completed',\n title: 'Order completed',\n trigger: 'When an order reaches the completed status.',\n payloadSchema: {\n type: 'object',\n properties: {\n order_id: { type: 'string' },\n reference_number: { type: 'string' },\n total: { type: 'number' },\n item_count: { type: 'number' },\n source: { type: 'string' },\n },\n required: ['order_id', 'reference_number', 'total', 'item_count', 'source'],\n },\n },\n {\n name: 'orders.order_cancelled',\n title: 'Order cancelled',\n trigger: 'When an order reaches the cancelled status.',\n payloadSchema: {\n type: 'object',\n properties: {\n order_id: { type: 'string' },\n reference_number: { type: 'string' },\n total: { type: 'number' },\n item_count: { type: 'number' },\n source: { type: 'string' },\n },\n required: ['order_id', 'reference_number', 'total', 'item_count', 'source'],\n },\n },\n ],\n // No client-side guard yet: creation goes through the AI tool; the declaration keeps the cap countable.\n declaredLimits: [\n { key: 'orders_month', label: 'Orders / month', table: 'orders', kindFilter: 'order', period: 'month' },\n ],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/orders',\n icon: 'Coins',\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/orders',\n component: PageComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n {\n path: '/orders/:id',\n component: DetailComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'orders.today-summary',\n name: 'getOrdersSummary',\n description: 'Returns order count, revenue, and average ticket for today or a given period.',\n icon: 'ClipboardList',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n period: { type: 'string' as const, description: 'today, week, month' },\n },\n },\n suggestions: [\n { label: 'Quantos pedidos hoje?' },\n { label: \"Qual o ticket médio hoje?\" },\n { label: \"Qual o item mais pedido?\" },\n ],\n },\n {\n id: 'orders.active-orders',\n name: 'getActiveOrders',\n description: 'Lists currently active (non-completed) orders.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n status: { type: 'string' as const, description: 'Filter by status' },\n },\n },\n suggestions: [\n { label: 'Quais pedidos estão em preparo agora?' },\n { label: 'Tem pedido de delivery esperando?' },\n ],\n },\n {\n id: 'orders.create-order',\n name: 'createOrder',\n description: 'Creates a new restaurant order with items.',\n icon: 'PlusCircle',\n mode: 'persist' as const,\n limitKey: 'orders_month',\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n tableNumber: { type: 'number' as const, description: 'Table number (for dine-in)' },\n items: { type: 'array' as const, description: 'Item names and quantities' },\n },\n required: ['kind', 'items'],\n },\n permission: { feature: 'orders', action: 'create' as const },\n },\n {\n id: 'orders.propose-delivery-zones',\n name: PROPOSE_DELIVERY_ZONES_TOOL,\n description: `ENTREGA POR DISTÂNCIA (taxa de entrega, delivery, frete, raio, km) — ${DELIVERY_ROUTING_RULE} FASE 1 de 2: monta as faixas a partir do que a casa escreveu e devolve a tabela e as faixas com rótulo. NUNCA grava e não pergunta nada. Passe o texto EXATAMENTE como a pessoa escreveu em text (não reescreva nem resuma: \"em 40 min\" é o tempo da faixa); use zones só se as faixas já vieram estruturadas. Em seguida, na mesma resposta, chame saveDeliveryZones com as faixas devolvidas — o card nativo dela é a única confirmação.`,\n icon: 'Bike',\n mode: 'read' as const,\n category: 'Orders',\n execution: { plane: 'client' as const },\n permission: { feature: 'settings', action: 'read' as const },\n parameters: {\n type: 'object' as const,\n properties: {\n text: { type: 'string' as const, description: 'A frase da casa, sem alterar, ex.: \"até 3 km R$ 5 em 30 min, 5 km por R$ 8 em 40 min\".' },\n zones: {\n type: 'array' as const,\n description: 'Faixas já estruturadas, em vez do texto (maxKm, fee e etaMinutes em minutos).',\n items: {\n type: 'object' as const,\n properties: {\n maxKm: { type: 'number' as const },\n fee: { type: 'number' as const },\n etaMinutes: { type: 'number' as const },\n label: { type: 'string' as const, description: 'A faixa como a pessoa lê no card (\"até 3 km · R$ 5,00 · 30 min\"), copiada de proposeDeliveryZones.' },\n },\n required: ['maxKm', 'fee'],\n },\n },\n },\n },\n suggestions: [\n {\n label: 'Configurar entrega por distância',\n prompt: 'Quero configurar a entrega por distância (faixas de km, taxa e tempo). Me pergunte como eu cobro.',\n },\n {\n label: 'Mudar a taxa de entrega',\n prompt: 'Quero mudar a taxa de entrega por distância. Pergunte como eu cobro hoje e monte as faixas.',\n },\n ],\n },\n {\n id: 'orders.save-delivery-zones',\n name: SAVE_DELIVERY_ZONES_TOOL,\n description: 'FASE 2 de 2 da entrega por distância (taxa de entrega — nunca financeiro). Grava as faixas em delivery.zones e liga a entrega. Abre o card nativo em que a PESSOA confirma ou cancela antes de qualquer gravação — é a ÚNICA confirmação do fluxo. Chame logo depois de proposeDeliveryZones, na mesma resposta, com as mesmas faixas (zones, com label e etaMinutes) e o summary; não pergunte \"posso gravar?\" em texto. Nunca chame por conta própria com faixas que a pessoa não disse.',\n icon: 'Bike',\n mode: 'persist' as const,\n category: 'Orders',\n execution: { plane: 'client' as const },\n // The person's gate, and the only one: the runtime draws the\n // ConfirmActionCard with the labelled bands and nothing runs until they\n // tap. A model that skips phase 1 still cannot skip this.\n requiresConfirmation: true,\n permission: { feature: 'settings', action: 'manage' as const },\n parameters: {\n type: 'object' as const,\n properties: {\n zones: {\n type: 'array' as const,\n description: 'As faixas confirmadas pela pessoa, em ordem crescente de maxKm.',\n items: {\n type: 'object' as const,\n properties: {\n maxKm: { type: 'number' as const },\n fee: { type: 'number' as const },\n etaMinutes: { type: 'number' as const },\n label: { type: 'string' as const, description: 'A faixa como a pessoa lê no card (\"até 3 km · R$ 5,00 · 30 min\"), copiada de proposeDeliveryZones.' },\n },\n required: ['maxKm', 'fee'],\n },\n },\n summary: { type: 'string' as const, description: 'O resumo que proposeDeliveryZones devolveu, para a pessoa ler no card.' },\n },\n required: ['zones'],\n },\n },\n ],\n onboarding: { program: buildOrdersOnboarding() },\n registries: ordersRegistries,\n facets: [\n { id: 'scale', label: 'Balança', description: 'Venda por peso com balança e etiqueta.' },\n { id: 'delivery', label: 'Delivery e iFood', description: 'Entrega própria e pedidos do iFood e outros marketplaces.', defaultEnabled: true },\n ],\n settings: [\n ...ordersV1SettingsTabs,\n {\n id: 'orders',\n label: config.labels.pageTitle,\n icon: 'ClipboardList',\n component: (() => {\n const OrdersSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Orders Settings',\n registries: ordersRegistries,\n routeBase: '/settings/orders',\n })\n OrdersSettingsTab.displayName = 'OrdersSettingsTab'\n return OrdersSettingsTab\n })(),\n order: 22,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ...(config.modules.delivery\n ? [{\n id: 'orders-delivery',\n label: 'Delivery',\n icon: 'Bike',\n // Delivery is sold apart: its settings appear once the account turns it on.\n requiresFacet: 'delivery',\n component: (() => {\n const DeliverySettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(DeliverySettings))\n DeliverySettingsTab.displayName = 'DeliverySettingsTab'\n return DeliverySettingsTab\n })(),\n order: 23,\n // The delivery fee is the owner's decision, like the service charge in plugin-tables.\n permission: { feature: 'orders', action: 'edit' as const },\n }]\n : []),\n ],\n locales: ordersLocales,\n // Offered regardless of `modules.delivery`: a takeout-only house still takes iFood pickup orders.\n connectors: [\n ifoodConnectorDef,\n nineNineFoodConnectorDef,\n keetaConnectorDef,\n uberEatsConnectorDef,\n rappiConnectorDef,\n aiqfomeConnectorDef,\n ],\n }\n}\n\nexport type { OrderSourceOption, OrdersPluginLabels, ResolvedOrdersConfig } from './context'\n\nexport { ifoodConnectorDef, IFOOD_CONNECTOR_ID, IFOOD_SETTINGS } from './integrations/ifood/connectorDef'\nexport {\n nineNineFoodConnectorDef, NINETY_NINE_FOOD_CONNECTOR_ID, NINETY_NINE_FOOD_SETTINGS,\n} from './integrations/99food/connectorDef'\nexport { keetaConnectorDef, KEETA_CONNECTOR_ID, KEETA_SETTINGS } from './integrations/keeta/connectorDef'\nexport { uberEatsConnectorDef, UBER_EATS_CONNECTOR_ID, UBER_EATS_SETTINGS } from './integrations/ubereats/connectorDef'\nexport { rappiConnectorDef, RAPPI_CONNECTOR_ID, RAPPI_SETTINGS } from './integrations/rappi/connectorDef'\nexport { aiqfomeConnectorDef, AIQFOME_CONNECTOR_ID, AIQFOME_SETTINGS } from './integrations/aiqfome/connectorDef'\nexport { marketplacePermissions, AUTO_ACCEPT_SETTING, PREP_TIME_SETTING } from './integrations/shared'\n\n// Published names apps already import from this package; the definitions live in @fayz-ai/orders.\nexport {\n ADVANCE_VERB, DEFAULT_STATUS_CONFIGS, KANBAN_COLUMNS, STATUS_FLOW,\n getNextStatus, getPreviousStatus, mapToKanbanColumn,\n} from '@fayz-ai/orders/domain/order'\nexport type {\n CreateOrderInput, CreateOrderItemInput, DeliveryStatus, DineInStatus, KanbanColumn, OrderKind, OrderQuery,\n OrderStatus, OrderStatusConfig, OrdersSummary, PaginatedResult, RestaurantOrder, RestaurantOrderItem,\n TakeoutStatus, UpdateOrderStatusInput,\n} from '@fayz-ai/orders/domain/order'\nexport type { OrdersDataProvider } from '@fayz-ai/orders/data/provider'\nexport { createFayzOrdersProvider, type FayzOrdersProviderOptions } from '@fayz-ai/orders/data/platform'\n// The pool-direct provider: reads v_orders under RLS instead of proxying\n// through the platform's data API. `writes` makes it the flow's owner.\nexport {\n createSupabaseOrdersProvider as createCoreOrdersProvider,\n type SupabaseOrdersProviderOptions as CoreOrdersProviderOptions,\n type SupabaseOrdersWriteOptions as CoreOrdersWriteOptions,\n} from '@fayz-ai/orders/data/supabase'\nexport { createMockOrdersProvider } from '@fayz-ai/orders/data/mock'\nexport { ORDER_DETAIL_COMPONENT_ID } from './lib/detail-slot'\nexport type { OrderDetailSlotProps } from './lib/detail-slot'\n"]}