@fayz-ai/plugin-courses 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +3 -3
  2. package/dist/components/CommerceUI.d.ts +19 -2
  3. package/dist/components/CommerceUI.d.ts.map +1 -1
  4. package/dist/components/dashboardWidgets.d.ts.map +1 -0
  5. package/dist/index.d.ts +26 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +773 -309
  8. package/dist/index.js.map +1 -1
  9. package/dist/integrations/kiwify/connectorDef.d.ts +34 -0
  10. package/dist/integrations/kiwify/connectorDef.d.ts.map +1 -0
  11. package/dist/integrations/kiwify/data.d.ts +58 -0
  12. package/dist/integrations/kiwify/data.d.ts.map +1 -0
  13. package/dist/lib/nav.d.ts.map +1 -0
  14. package/dist/locales/en.d.ts.map +1 -1
  15. package/dist/locales/pt-BR.d.ts.map +1 -1
  16. package/dist/public/createPublicCheckoutPlugin.d.ts +1 -1
  17. package/dist/public/createPublicCheckoutPlugin.d.ts.map +1 -1
  18. package/dist/public/{data.d.ts → data/index.d.ts} +1 -1
  19. package/dist/public/data/index.d.ts.map +1 -0
  20. package/dist/public/{data.supabase.d.ts → data/supabase.d.ts} +2 -2
  21. package/dist/public/data/supabase.d.ts.map +1 -0
  22. package/dist/public/index.d.ts +4 -4
  23. package/dist/public/index.d.ts.map +1 -1
  24. package/dist/public/index.js +353 -0
  25. package/dist/public/index.js.map +1 -0
  26. package/dist/public/{CheckoutScreen.d.ts → views/CheckoutScreen.d.ts} +1 -1
  27. package/dist/public/views/CheckoutScreen.d.ts.map +1 -0
  28. package/dist/views/CourseEditorPage.d.ts.map +1 -0
  29. package/dist/views/CourseOrderDetailView.d.ts +4 -3
  30. package/dist/views/CourseOrderDetailView.d.ts.map +1 -1
  31. package/dist/{pages → views}/CoursesListPage.d.ts.map +1 -1
  32. package/dist/views/FinancialPage.d.ts.map +1 -0
  33. package/dist/{pages → views}/ReportsPage.d.ts.map +1 -1
  34. package/dist/views/SalesPage.d.ts +19 -0
  35. package/dist/views/SalesPage.d.ts.map +1 -0
  36. package/dist/views/SubscriptionsPage.d.ts +7 -0
  37. package/dist/views/SubscriptionsPage.d.ts.map +1 -0
  38. package/package.json +12 -12
  39. package/dist/connectors/stripe.d.ts +0 -3
  40. package/dist/connectors/stripe.d.ts.map +0 -1
  41. package/dist/dashboardWidgets.d.ts.map +0 -1
  42. package/dist/nav.d.ts.map +0 -1
  43. package/dist/pages/CourseEditorPage.d.ts.map +0 -1
  44. package/dist/pages/FinancialPage.d.ts.map +0 -1
  45. package/dist/pages/SalesPage.d.ts +0 -6
  46. package/dist/pages/SalesPage.d.ts.map +0 -1
  47. package/dist/pages/SubscriptionsPage.d.ts +0 -6
  48. package/dist/pages/SubscriptionsPage.d.ts.map +0 -1
  49. package/dist/public/CheckoutScreen.d.ts.map +0 -1
  50. package/dist/public/data.d.ts.map +0 -1
  51. package/dist/public/data.supabase.d.ts.map +0 -1
  52. package/src/components/CommerceUI.tsx +0 -153
  53. package/src/connectors/stripe.ts +0 -34
  54. package/src/dashboardWidgets.tsx +0 -64
  55. package/src/index.ts +0 -150
  56. package/src/lib/format.ts +0 -22
  57. package/src/locales/en.ts +0 -203
  58. package/src/locales/index.ts +0 -7
  59. package/src/locales/pt-BR.ts +0 -203
  60. package/src/nav.ts +0 -9
  61. package/src/pages/CourseEditorPage.tsx +0 -1122
  62. package/src/pages/CoursesListPage.tsx +0 -137
  63. package/src/pages/FinancialPage.tsx +0 -81
  64. package/src/pages/ReportsPage.tsx +0 -59
  65. package/src/pages/SalesPage.tsx +0 -86
  66. package/src/pages/SubscriptionsPage.tsx +0 -56
  67. package/src/public/CheckoutScreen.tsx +0 -279
  68. package/src/public/createPublicCheckoutPlugin.tsx +0 -88
  69. package/src/public/data.supabase.ts +0 -63
  70. package/src/public/data.ts +0 -89
  71. package/src/public/index.ts +0 -26
  72. package/src/settings/CoursesSettings.tsx +0 -55
  73. package/src/views/CourseOrderDetailView.tsx +0 -132
  74. /package/dist/{dashboardWidgets.d.ts → components/dashboardWidgets.d.ts} +0 -0
  75. /package/dist/{nav.d.ts → lib/nav.d.ts} +0 -0
  76. /package/dist/{pages → views}/CourseEditorPage.d.ts +0 -0
  77. /package/dist/{pages → views}/CoursesListPage.d.ts +0 -0
  78. /package/dist/{pages → views}/FinancialPage.d.ts +0 -0
  79. /package/dist/{pages → views}/ReportsPage.d.ts +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/nav.ts","../src/pages/CoursesListPage.tsx","../src/lib/format.ts","../src/components/CommerceUI.tsx","../src/pages/CourseEditorPage.tsx","../src/pages/SalesPage.tsx","../src/views/CourseOrderDetailView.tsx","../src/pages/SubscriptionsPage.tsx","../src/pages/FinancialPage.tsx","../src/pages/ReportsPage.tsx","../src/settings/CoursesSettings.tsx","../src/dashboardWidgets.tsx","../src/connectors/stripe.ts","../src/index.ts"],"names":["React","jsxs","jsx","React2","useTranslation","getCoursesProvider","Badge","Button","Skeleton","statusVariant","React4","React5","SharedOrderDetailView","React6","React7","toast","React8","React9","React10"],"mappings":"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","file":"index.js","sourcesContent":["export const en: Record<string, string> = {\n 'courses.nav': 'Courses',\n 'courses.title': 'Courses',\n 'courses.new': 'New course',\n 'courses.empty': 'No courses yet. Create your first one.',\n 'courses.count': '{count} courses',\n 'courses.students': 'students',\n 'courses.lessons': 'lessons',\n 'courses.status.draft': 'Draft',\n 'courses.status.published': 'Published',\n 'courses.status.archived': 'Archived',\n 'courses.editor.back': 'Back to courses',\n 'courses.editor.details': 'Details',\n 'courses.editor.curriculum': 'Curriculum',\n 'courses.editor.fieldTitle': 'Title',\n 'courses.editor.fieldSubtitle': 'Subtitle',\n 'courses.editor.fieldDescription': 'Description',\n 'courses.editor.fieldPrice': 'Price',\n 'courses.editor.fieldStatus': 'Status',\n 'courses.editor.save': 'Save',\n 'courses.editor.saved': 'Course saved',\n 'courses.editor.saveFailed': 'Could not save the course',\n 'courses.editor.unsaved': 'Unsaved changes',\n // General tab\n 'courses.editor.sectionBasics': 'Basics',\n 'courses.editor.sectionThumbnail': 'Cover image',\n 'courses.editor.sectionPricing': 'Pricing & status',\n 'courses.editor.descriptionPlaceholder': 'What will students learn?',\n 'courses.editor.fieldDelivery': 'Format',\n 'courses.editor.deliveryHint': 'How this course is delivered.',\n 'courses.editor.delivery.online': 'Online',\n 'courses.editor.delivery.in_person': 'In person',\n 'courses.editor.delivery.hybrid': 'Hybrid',\n 'courses.editor.thumbnailHint': 'Shown on the storefront and in listings. 1280×720 recommended.',\n 'courses.editor.thumbnailUpload': 'Upload image',\n 'courses.editor.thumbnailUrl': 'Or paste an image URL',\n 'courses.editor.thumbnailEmpty': 'No image',\n 'courses.editor.thumbnailUploaded': 'Image uploaded — remember to save.',\n 'courses.editor.uploading': 'Uploading…',\n 'courses.editor.uploadFailed': 'Could not upload the image',\n 'courses.editor.uploadUnavailable': 'Upload unavailable — paste an image URL instead.',\n // Curriculum tab\n 'courses.editor.addModule': 'Add module',\n 'courses.editor.moduleTitle': 'Module title',\n 'courses.editor.moduleAdded': 'Module added',\n 'courses.editor.addLesson': 'Add lesson',\n 'courses.editor.lessonTitle': 'Lesson title',\n 'courses.editor.lessonVideo': 'Video URL (embed)',\n 'courses.editor.lessonDuration': 'Duration (min)',\n 'courses.editor.deleteModule': 'Delete module',\n 'courses.editor.deleteLesson': 'Remove lesson',\n 'courses.editor.deleted': 'Removed',\n 'courses.editor.autosaved': 'Changes are saved automatically.',\n 'courses.editor.modulesEmpty': 'No modules yet',\n 'courses.editor.modulesEmptyHint': 'Create a module to start organizing your lessons.',\n 'courses.editor.lessonsEmpty': 'No lessons in this module yet.',\n 'courses.editor.deleteModuleConfirm': 'Delete this module?',\n 'courses.editor.deleteModuleConfirmBody': 'Its lessons will be removed too. This cannot be undone.',\n 'courses.editor.deleteLessonConfirm': 'Remove this lesson?',\n 'courses.editor.deleteLessonConfirmBody': 'This cannot be undone.',\n 'courses.editor.confirmDelete': 'Delete',\n 'courses.editor.cancel': 'Cancel',\n // Curriculum tree builder\n 'courses.editor.newModule': 'New module',\n 'courses.editor.firstModule': 'Create first module',\n 'courses.editor.newLesson': 'New lesson',\n 'courses.editor.firstLesson': 'Add the first lesson',\n 'courses.editor.moduleLabel': 'module',\n 'courses.editor.moduleLabelPlural': 'modules',\n 'courses.editor.lessonUnitOne': 'lesson',\n 'courses.editor.lessonUnitOther': 'lessons',\n 'courses.editor.noLessons': 'No lessons',\n 'courses.editor.minShort': 'min',\n 'courses.editor.hourShort': 'h',\n 'courses.editor.dragToReorder': 'Drag to reorder',\n 'courses.editor.expand': 'Expand',\n 'courses.editor.collapse': 'Collapse',\n 'courses.editor.editLesson': 'Edit lesson',\n 'courses.editor.addVideo': 'Add video',\n 'courses.editor.videoSet': 'Video',\n 'courses.editor.videoUrlLabel': 'Video URL',\n 'courses.editor.videoUrlPlaceholder': 'Paste the video link (YouTube, Vimeo…)',\n 'courses.editor.reorderFailed': 'Could not reorder',\n // Members area\n 'courses.editor.membersHelp': 'Buyers are enrolled automatically through orders and get access to all of this course’s content.',\n 'courses.editor.enrolledStudents': 'Enrolled students',\n 'courses.editor.membersEmpty': 'No students yet',\n 'courses.editor.membersEmptyHint': 'Buyers are enrolled here automatically after a paid order.',\n 'courses.editor.accessUnlockedBy': 'Access is unlocked by',\n 'courses.editor.membersNote': 'Buying any offer grants full access to this course’s content.',\n 'courses.editor.untitledCourse': 'Untitled course',\n 'courses.editor.untitledModule': 'New module',\n 'courses.editor.untitledLesson': 'New lesson',\n // Editor tabs\n 'courses.editor.tab.details': 'General',\n 'courses.editor.tab.curriculum': 'Curriculum',\n 'courses.editor.tab.offers': 'Offers',\n 'courses.editor.tab.members': 'Members area',\n // Payment methods (used by the Courses plugin settings surface)\n 'courses.editor.payCard': 'Credit card (up to 12x)',\n 'courses.editor.payPix': 'Pix',\n 'courses.editor.payBoleto': 'Boleto',\n // Offers\n 'courses.offers.help': 'Price points for this course. Sales run through orders and the Financeiro module.',\n 'courses.offers.name': 'Offer name',\n 'courses.offers.price': 'Price',\n 'courses.offers.kind': 'Type',\n 'courses.offers.oneTime': 'One-time',\n 'courses.offers.subscription': 'Subscription',\n 'courses.offers.interval': 'Billing interval',\n 'courses.offers.default': 'Default',\n 'courses.offers.bump': 'Order bump',\n 'courses.offers.remove': 'Remove',\n 'courses.offers.add': 'Add offer',\n 'courses.offers.added': 'Offer added',\n 'courses.offers.removed': 'Offer removed',\n 'courses.offers.newName': 'New offer',\n 'courses.offers.empty': 'No offers yet',\n 'courses.offers.emptyHint': 'Create an offer to sell this course.',\n 'courses.offers.firstOffer': 'Create first offer',\n 'courses.offers.checkoutFlagsNote': 'Apply once the public checkout ships (coming soon).',\n // Sales\n 'courses.sales.title': 'Sales',\n 'courses.sales.subtitle': 'Every transaction across your courses.',\n 'courses.sales.date': 'Date',\n 'courses.sales.customer': 'Customer',\n 'courses.sales.method': 'Method',\n 'courses.sales.status': 'Status',\n 'courses.sales.fee': 'Platform fee',\n 'courses.sales.amount': 'Amount',\n 'courses.sales.count': 'Sales',\n 'courses.sales.revenue': 'Revenue',\n 'courses.sales.empty': 'No sales yet.',\n 'courses.financialStatus.paid': 'Paid',\n 'courses.financialStatus.pending': 'Pending',\n 'courses.financialStatus.refunded': 'Refunded',\n 'courses.financialStatus.chargeback': 'Chargeback',\n // Subscriptions\n 'courses.subs.title': 'Subscriptions',\n 'courses.subs.subtitle': 'Recurring plans and MRR.',\n 'courses.subs.start': 'Start date',\n 'courses.subs.customer': 'Customer',\n 'courses.subs.status': 'Status',\n 'courses.subs.value': 'Net value',\n 'courses.subs.active': 'Active subscriptions',\n 'courses.subs.mrr': 'Monthly recurring revenue',\n 'courses.subs.empty': 'No subscriptions yet.',\n 'courses.subStatus.active': 'Active',\n 'courses.subStatus.canceled': 'Canceled',\n 'courses.subStatus.past_due': 'Past due',\n 'courses.interval.month': 'month',\n 'courses.interval.year': 'year',\n // Financial\n 'courses.financial.title': 'Financial settings',\n 'courses.financial.subtitle': 'Balance, payouts and your Stripe connection.',\n 'courses.financial.available': 'Available balance',\n 'courses.financial.pending': 'Pending balance',\n 'courses.financial.revenue': 'Total revenue',\n 'courses.financial.feeCollected': 'Platform fees',\n 'courses.financial.refundRate': 'refund rate',\n 'courses.financial.payouts': 'Payouts',\n 'courses.financial.noPayouts': 'No payouts yet.',\n 'courses.financial.date': 'Date',\n 'courses.financial.amount': 'Amount',\n 'courses.financial.status': 'Status',\n 'courses.financial.connect': 'Connect Stripe',\n 'courses.financial.connected': 'Stripe connected',\n 'courses.financial.notConnected': 'Connect your Stripe account to receive payouts. The platform fee is applied automatically on each sale.',\n 'courses.financial.platformFee': 'Platform fee',\n 'courses.financial.connectSoon': 'Stripe Connect onboarding wires up in Stage 3.',\n 'courses.payoutStatus.paid': 'Paid',\n 'courses.payoutStatus.pending': 'Pending',\n 'courses.payoutStatus.failed': 'Failed',\n // Reports\n 'courses.reports.title': 'Reports',\n 'courses.reports.subtitle': 'Revenue by course.',\n 'courses.reports.byCourse': 'Revenue by course',\n 'courses.reports.course': 'Course',\n 'courses.reports.sales': 'Sales',\n 'courses.reports.revenue': 'Revenue',\n 'courses.reports.empty': 'No revenue yet.',\n // Members area\n 'courses.membersArea.title': 'Members area',\n 'courses.membersArea.subtitle': 'One area per course; students land here after purchase.',\n 'courses.membersArea.name': 'Members area',\n 'courses.membersArea.status': 'Status',\n 'courses.membersArea.students': 'Students',\n 'courses.membersArea.empty': 'No members areas yet.',\n // Settings\n 'courses.settings.title': 'Course settings',\n 'courses.settings.subtitle': 'Payments, currency and checkout methods',\n 'courses.settings.payments': 'Payments',\n 'courses.settings.paymentsHelp': 'Connect Stripe in the Integrations tab; the platform fee applies automatically.',\n 'courses.settings.currency': 'Default currency',\n 'courses.settings.methods': 'Payment methods',\n // Dashboard KPIs\n 'courses.kpi.revenue': 'Total revenue',\n 'courses.kpi.sales': 'Sales',\n 'courses.kpi.refunds': 'refunds',\n 'courses.kpi.mrr': 'Recurring revenue (MRR)',\n 'courses.kpi.activeSubs': 'active',\n 'courses.kpi.fees': 'Platform fees',\n}\n","export const ptBR: Record<string, string> = {\n 'courses.nav': 'Cursos',\n 'courses.title': 'Cursos',\n 'courses.new': 'Novo curso',\n 'courses.empty': 'Nenhum curso ainda. Crie o primeiro.',\n 'courses.count': '{count} cursos',\n 'courses.students': 'alunos',\n 'courses.lessons': 'aulas',\n 'courses.status.draft': 'Rascunho',\n 'courses.status.published': 'Publicado',\n 'courses.status.archived': 'Arquivado',\n 'courses.editor.back': 'Voltar aos cursos',\n 'courses.editor.details': 'Detalhes',\n 'courses.editor.curriculum': 'Conteúdo',\n 'courses.editor.fieldTitle': 'Título',\n 'courses.editor.fieldSubtitle': 'Subtítulo',\n 'courses.editor.fieldDescription': 'Descrição',\n 'courses.editor.fieldPrice': 'Preço',\n 'courses.editor.fieldStatus': 'Status',\n 'courses.editor.save': 'Salvar',\n 'courses.editor.saved': 'Curso salvo',\n 'courses.editor.saveFailed': 'Não foi possível salvar o curso',\n 'courses.editor.unsaved': 'Alterações não salvas',\n // Geral tab\n 'courses.editor.sectionBasics': 'Informações básicas',\n 'courses.editor.sectionThumbnail': 'Imagem de capa',\n 'courses.editor.sectionPricing': 'Preço e publicação',\n 'courses.editor.descriptionPlaceholder': 'O que o aluno vai aprender?',\n 'courses.editor.fieldDelivery': 'Formato',\n 'courses.editor.deliveryHint': 'Como o curso é entregue.',\n 'courses.editor.delivery.online': 'Online',\n 'courses.editor.delivery.in_person': 'Presencial',\n 'courses.editor.delivery.hybrid': 'Híbrido',\n 'courses.editor.thumbnailHint': 'Aparece na loja e nas listagens. Recomendado 1280×720.',\n 'courses.editor.thumbnailUpload': 'Enviar imagem',\n 'courses.editor.thumbnailUrl': 'Ou cole uma URL de imagem',\n 'courses.editor.thumbnailEmpty': 'Sem imagem',\n 'courses.editor.thumbnailUploaded': 'Imagem enviada — lembre de salvar.',\n 'courses.editor.uploading': 'Enviando…',\n 'courses.editor.uploadFailed': 'Não foi possível enviar a imagem',\n 'courses.editor.uploadUnavailable': 'Upload indisponível — cole uma URL de imagem.',\n // Conteúdo tab\n 'courses.editor.addModule': 'Adicionar módulo',\n 'courses.editor.moduleTitle': 'Título do módulo',\n 'courses.editor.moduleAdded': 'Módulo adicionado',\n 'courses.editor.addLesson': 'Adicionar aula',\n 'courses.editor.lessonTitle': 'Título da aula',\n 'courses.editor.lessonVideo': 'URL do vídeo (embed)',\n 'courses.editor.lessonDuration': 'Duração (min)',\n 'courses.editor.deleteModule': 'Excluir módulo',\n 'courses.editor.deleteLesson': 'Remover aula',\n 'courses.editor.deleted': 'Removido',\n 'courses.editor.autosaved': 'As alterações são salvas automaticamente.',\n 'courses.editor.modulesEmpty': 'Nenhum módulo ainda',\n 'courses.editor.modulesEmptyHint': 'Crie um módulo para começar a organizar as aulas.',\n 'courses.editor.lessonsEmpty': 'Nenhuma aula neste módulo ainda.',\n 'courses.editor.deleteModuleConfirm': 'Excluir este módulo?',\n 'courses.editor.deleteModuleConfirmBody': 'As aulas deste módulo também serão removidas. Isso não pode ser desfeito.',\n 'courses.editor.deleteLessonConfirm': 'Remover esta aula?',\n 'courses.editor.deleteLessonConfirmBody': 'Isso não pode ser desfeito.',\n 'courses.editor.confirmDelete': 'Excluir',\n 'courses.editor.cancel': 'Cancelar',\n // Curriculum tree builder\n 'courses.editor.newModule': 'Novo módulo',\n 'courses.editor.firstModule': 'Criar primeiro módulo',\n 'courses.editor.newLesson': 'Nova aula',\n 'courses.editor.firstLesson': 'Adicione a primeira aula',\n 'courses.editor.moduleLabel': 'módulo',\n 'courses.editor.moduleLabelPlural': 'módulos',\n 'courses.editor.lessonUnitOne': 'aula',\n 'courses.editor.lessonUnitOther': 'aulas',\n 'courses.editor.noLessons': 'Sem aulas',\n 'courses.editor.minShort': 'min',\n 'courses.editor.hourShort': 'h',\n 'courses.editor.dragToReorder': 'Arraste para reordenar',\n 'courses.editor.expand': 'Expandir',\n 'courses.editor.collapse': 'Recolher',\n 'courses.editor.editLesson': 'Editar aula',\n 'courses.editor.addVideo': 'Adicionar vídeo',\n 'courses.editor.videoSet': 'Vídeo',\n 'courses.editor.videoUrlLabel': 'URL do vídeo',\n 'courses.editor.videoUrlPlaceholder': 'Cole o link do vídeo (YouTube, Vimeo…)',\n 'courses.editor.reorderFailed': 'Não foi possível reordenar',\n // Área de membros\n 'courses.editor.membersHelp': 'Quem compra este curso é matriculado automaticamente pelos pedidos e ganha acesso a todo o conteúdo.',\n 'courses.editor.enrolledStudents': 'Alunos matriculados',\n 'courses.editor.membersEmpty': 'Nenhum aluno ainda',\n 'courses.editor.membersEmptyHint': 'Os compradores são matriculados aqui automaticamente após um pedido pago.',\n 'courses.editor.accessUnlockedBy': 'Acesso liberado por',\n 'courses.editor.membersNote': 'Comprar qualquer oferta libera o acesso completo ao conteúdo deste curso.',\n 'courses.editor.untitledCourse': 'Curso sem título',\n 'courses.editor.untitledModule': 'Novo módulo',\n 'courses.editor.untitledLesson': 'Nova aula',\n // Editor tabs\n 'courses.editor.tab.details': 'Geral',\n 'courses.editor.tab.curriculum': 'Conteúdo',\n 'courses.editor.tab.offers': 'Ofertas',\n 'courses.editor.tab.members': 'Área de membros',\n // Métodos de pagamento (usados na tela de configurações do plugin de Cursos)\n 'courses.editor.payCard': 'Cartão de crédito (até 12x)',\n 'courses.editor.payPix': 'Pix',\n 'courses.editor.payBoleto': 'Boleto',\n // Offers\n 'courses.offers.help': 'Preços deste curso. As vendas acontecem pelos pedidos e pelo Financeiro.',\n 'courses.offers.name': 'Nome da oferta',\n 'courses.offers.price': 'Preço',\n 'courses.offers.kind': 'Tipo',\n 'courses.offers.oneTime': 'Único',\n 'courses.offers.subscription': 'Assinatura',\n 'courses.offers.interval': 'Intervalo de cobrança',\n 'courses.offers.default': 'Padrão',\n 'courses.offers.bump': 'Order bump',\n 'courses.offers.remove': 'Remover',\n 'courses.offers.add': 'Adicionar oferta',\n 'courses.offers.added': 'Oferta adicionada',\n 'courses.offers.removed': 'Oferta removida',\n 'courses.offers.newName': 'Nova oferta',\n 'courses.offers.empty': 'Nenhuma oferta ainda',\n 'courses.offers.emptyHint': 'Crie uma oferta para vender este curso.',\n 'courses.offers.firstOffer': 'Criar primeira oferta',\n 'courses.offers.checkoutFlagsNote': 'Aplicam-se quando o checkout público entrar no ar (em breve).',\n // Sales\n 'courses.sales.title': 'Vendas',\n 'courses.sales.subtitle': 'Todas as transações dos seus cursos.',\n 'courses.sales.date': 'Data',\n 'courses.sales.customer': 'Cliente',\n 'courses.sales.method': 'Método',\n 'courses.sales.status': 'Status',\n 'courses.sales.fee': 'Taxa da plataforma',\n 'courses.sales.amount': 'Valor',\n 'courses.sales.count': 'Vendas',\n 'courses.sales.revenue': 'Receita',\n 'courses.sales.empty': 'Nenhuma venda ainda.',\n 'courses.financialStatus.paid': 'Pago',\n 'courses.financialStatus.pending': 'Pendente',\n 'courses.financialStatus.refunded': 'Reembolsado',\n 'courses.financialStatus.chargeback': 'Chargeback',\n // Subscriptions\n 'courses.subs.title': 'Assinaturas',\n 'courses.subs.subtitle': 'Planos recorrentes e MRR.',\n 'courses.subs.start': 'Início',\n 'courses.subs.customer': 'Cliente',\n 'courses.subs.status': 'Status',\n 'courses.subs.value': 'Valor líquido',\n 'courses.subs.active': 'Assinaturas ativas',\n 'courses.subs.mrr': 'Receita recorrente mensal',\n 'courses.subs.empty': 'Nenhuma assinatura ainda.',\n 'courses.subStatus.active': 'Ativa',\n 'courses.subStatus.canceled': 'Cancelada',\n 'courses.subStatus.past_due': 'Em atraso',\n 'courses.interval.month': 'mês',\n 'courses.interval.year': 'ano',\n // Financial\n 'courses.financial.title': 'Financeiro',\n 'courses.financial.subtitle': 'Saldo, saques e sua conexão com o Stripe.',\n 'courses.financial.available': 'Saldo disponível',\n 'courses.financial.pending': 'Saldo pendente',\n 'courses.financial.revenue': 'Receita total',\n 'courses.financial.feeCollected': 'Taxas da plataforma',\n 'courses.financial.refundRate': 'taxa de reembolso',\n 'courses.financial.payouts': 'Saques',\n 'courses.financial.noPayouts': 'Nenhum saque ainda.',\n 'courses.financial.date': 'Data',\n 'courses.financial.amount': 'Valor',\n 'courses.financial.status': 'Status',\n 'courses.financial.connect': 'Conectar Stripe',\n 'courses.financial.connected': 'Stripe conectado',\n 'courses.financial.notConnected': 'Conecte sua conta Stripe para receber os saques. A taxa da plataforma é aplicada automaticamente em cada venda.',\n 'courses.financial.platformFee': 'Taxa da plataforma',\n 'courses.financial.connectSoon': 'O onboarding do Stripe Connect é ligado na Etapa 3.',\n 'courses.payoutStatus.paid': 'Concluído',\n 'courses.payoutStatus.pending': 'Pendente',\n 'courses.payoutStatus.failed': 'Falhou',\n // Reports\n 'courses.reports.title': 'Relatórios',\n 'courses.reports.subtitle': 'Receita por curso.',\n 'courses.reports.byCourse': 'Receita por curso',\n 'courses.reports.course': 'Curso',\n 'courses.reports.sales': 'Vendas',\n 'courses.reports.revenue': 'Receita',\n 'courses.reports.empty': 'Nenhuma receita ainda.',\n // Members area\n 'courses.membersArea.title': 'Área de membros',\n 'courses.membersArea.subtitle': 'Uma área por curso; o aluno entra após a compra.',\n 'courses.membersArea.name': 'Área de membros',\n 'courses.membersArea.status': 'Status',\n 'courses.membersArea.students': 'Alunos',\n 'courses.membersArea.empty': 'Nenhuma área de membros ainda.',\n // Settings\n 'courses.settings.title': 'Configurações do curso',\n 'courses.settings.subtitle': 'Pagamentos, moeda e métodos de checkout',\n 'courses.settings.payments': 'Pagamentos',\n 'courses.settings.paymentsHelp': 'Conecte o Stripe na aba Integrações; a taxa da plataforma é aplicada automaticamente.',\n 'courses.settings.currency': 'Moeda padrão',\n 'courses.settings.methods': 'Métodos de pagamento',\n // Dashboard KPIs\n 'courses.kpi.revenue': 'Receita total',\n 'courses.kpi.sales': 'Vendas',\n 'courses.kpi.refunds': 'reembolsos',\n 'courses.kpi.mrr': 'Receita recorrente (MRR)',\n 'courses.kpi.activeSubs': 'ativas',\n 'courses.kpi.fees': 'Taxas da plataforma',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const coursesLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import { hashRouterAdapter } from '@fayz-ai/core'\n\n// Shared hash-router adapter — the same singleton the admin shell drives, so\n// navigateTo here updates the shell's active route.\nconst adapter = hashRouterAdapter()\n\nexport function navigateTo(to: string): void {\n adapter.navigate(to)\n}\n","import * as React from 'react'\nimport { Button, Badge, PageHeaderActions, useModuleLayout, Skeleton } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Course } from '@fayz-ai/courses'\nimport { useLimitGuard, invalidateLimit, PermissionGate, usePermissionOptional } from '@fayz-ai/saas'\nimport { navigateTo } from '../nav'\n\nfunction statusVariant(status: Course['status']): 'success' | 'secondary' | 'outline' {\n if (status === 'published') return 'success'\n if (status === 'archived') return 'outline'\n return 'secondary'\n}\n\nexport function CoursesListPage() {\n const t = useTranslation()\n // When the app shell owns the page header (sidebar/GHL-style layouts), don't\n // render our own title — and project the action button into the top bar.\n const shellOwnsHeader = useModuleLayout() === 'tabs'\n const [courses, setCourses] = React.useState<Course[] | null>(null)\n const [creating, setCreating] = React.useState(false)\n const guardCourses = useLimitGuard('courses')\n const can = usePermissionOptional()\n\n const load = React.useCallback(async () => {\n setCourses(await getCoursesProvider().listCourses())\n }, [])\n\n React.useEffect(() => {\n void load()\n }, [load])\n\n async function onCreate() {\n // Defense in depth: never create without the role's `create` action.\n if (!can('courses', 'create')) return\n // Plan quantity guard (client-side, before the provider call). Opens the\n // global UpgradeModal and aborts when the plan's course cap is reached.\n if ((await guardCourses()) === 'blocked') return\n setCreating(true)\n try {\n const course = await getCoursesProvider().createCourse({\n title: t('courses.editor.untitledCourse') || 'Untitled course',\n status: 'draft',\n })\n invalidateLimit('courses')\n navigateTo(`/courses/${course.id}`)\n } finally {\n setCreating(false)\n }\n }\n\n return (\n <div className=\"mx-auto max-w-6xl p-6 md:p-8\">\n {shellOwnsHeader ? (\n <PageHeaderActions>\n <PermissionGate feature=\"courses\" action=\"create\">\n <Button onClick={onCreate} disabled={creating}>\n {t('courses.new') || 'New course'}\n </Button>\n </PermissionGate>\n </PageHeaderActions>\n ) : (\n <div className=\"mb-6 flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">{t('courses.title') || 'Courses'}</h1>\n {courses && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {(t('courses.count') || '{count} courses').replace('{count}', String(courses.length))}\n </p>\n )}\n </div>\n <PermissionGate feature=\"courses\" action=\"create\">\n <Button onClick={onCreate} disabled={creating}>\n {t('courses.new') || 'New course'}\n </Button>\n </PermissionGate>\n </div>\n )}\n\n {courses && courses.length === 0 && (\n <div className=\"rounded-xl border border-dashed border-border p-12 text-center text-muted-foreground\">\n {t('courses.empty') || 'No courses yet. Create your first one.'}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {courses === null &&\n Array.from({ length: 6 }).map((_, i) => <CourseCardSkeleton key={i} />)}\n {courses?.map((course) => (\n <button\n key={course.id}\n onClick={() => navigateTo(`/courses/${course.id}`)}\n className=\"group overflow-hidden rounded-xl border border-border bg-card text-left transition hover:border-primary hover:shadow-md\"\n >\n <div className=\"aspect-video w-full overflow-hidden bg-muted\">\n {course.thumbnailUrl && (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={course.thumbnailUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n )}\n </div>\n <div className=\"space-y-2 p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3 className=\"font-semibold text-foreground line-clamp-2\">{course.title}</h3>\n <Badge variant={statusVariant(course.status)}>\n {t(`courses.status.${course.status}`) || course.status}\n </Badge>\n </div>\n {course.subtitle && (\n <p className=\"text-sm text-muted-foreground line-clamp-2\">{course.subtitle}</p>\n )}\n <p className=\"text-sm font-medium text-foreground\">\n {course.price > 0 ? `${course.currency} ${course.price.toFixed(2)}` : '—'}\n </p>\n </div>\n </button>\n ))}\n </div>\n </div>\n )\n}\nCoursesListPage.displayName = 'CoursesListPage'\n\n/** Loading placeholder mirroring the course card layout. */\nfunction CourseCardSkeleton() {\n return (\n <div className=\"overflow-hidden rounded-xl border border-border bg-card\">\n <Skeleton className=\"aspect-video w-full rounded-none\" />\n <div className=\"space-y-3 p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n </div>\n <Skeleton className=\"h-3 w-full\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n </div>\n )\n}\n","// Small display helpers shared across the courses admin pages. Kept local so the\n// plugin depends only on @fayz-ai/core + @fayz-ai/ui + @fayz-ai/courses.\n\nexport function formatMoney(value: number, currency = 'BRL'): string {\n try {\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(value)\n } catch {\n return `${currency} ${value.toFixed(2)}`\n }\n}\n\nexport function formatDate(iso: string): string {\n try {\n return new Intl.DateTimeFormat('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric' }).format(new Date(iso))\n } catch {\n return iso.slice(0, 10)\n }\n}\n\nexport function formatPercent(fraction: number, digits = 0): string {\n return `${(fraction * 100).toFixed(digits)}%`\n}\n","import * as React from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Card, DataTable } from '@fayz-ai/ui'\n\n/** Standard padded container for the commerce admin pages. */\nexport function PageContainer({ title, subtitle, actions, children }: {\n title: string\n subtitle?: string\n actions?: React.ReactNode\n children: React.ReactNode\n}) {\n return (\n <div className=\"mx-auto max-w-6xl p-6 md:p-8\">\n <div className=\"mb-6 flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">{title}</h1>\n {subtitle && <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {actions}\n </div>\n {children}\n </div>\n )\n}\n\n/** A single KPI tile (revenue, sales, MRR…). */\nexport function StatCard({ label, value, hint }: { label: string; value: string; hint?: string }) {\n return (\n <Card className=\"p-5\">\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n <p className=\"mt-1 text-2xl font-bold text-foreground\">{value}</p>\n {hint && <p className=\"mt-1 text-xs text-muted-foreground\">{hint}</p>}\n </Card>\n )\n}\n\nexport function StatGrid({ children }: { children: React.ReactNode }) {\n return <div className=\"mb-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">{children}</div>\n}\n\n/** Empty/loading state for the tables. */\nexport function TableEmpty({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"rounded-xl border border-dashed border-border p-12 text-center text-sm text-muted-foreground\">\n {children}\n </div>\n )\n}\n\n/**\n * Standard empty state — an icon chip, a title, an optional description and a\n * call-to-action. Use anywhere a list/section can be legitimately empty so the\n * screen never shows a bare dashed box.\n */\nexport function EmptyState({ icon, title, description, action }: {\n icon?: React.ReactNode\n title: string\n description?: string\n action?: React.ReactNode\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center rounded-xl border border-dashed border-border bg-card/40 px-6 py-12 text-center\">\n {icon && (\n <div className=\"mb-3 flex h-11 w-11 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n {icon}\n </div>\n )}\n <p className=\"text-sm font-medium text-foreground\">{title}</p>\n {description && <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{description}</p>}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n )\n}\n\n/**\n * A muted, low-emphasis informational callout. Use to set honest expectations\n * (e.g. \"this applies to a feature that isn't shipped yet\") without dressing it\n * up as an interactive control. Wrap key phrases in <strong> for emphasis.\n */\nexport function InfoNote({ icon, children, className }: {\n icon?: React.ReactNode\n children: React.ReactNode\n className?: string\n}) {\n return (\n <div className={'flex items-start gap-2.5 rounded-lg border border-border bg-muted/40 px-3.5 py-3 text-sm text-muted-foreground ' + (className ?? '')}>\n {icon && <span className=\"mt-0.5 shrink-0 text-muted-foreground/80\">{icon}</span>}\n <div className=\"min-w-0 [&_strong]:font-medium [&_strong]:text-foreground\">{children}</div>\n </div>\n )\n}\n\n/** A titled card section — the house pattern for grouping form fields. */\nexport function SectionCard({ title, description, actions, children, className }: {\n title?: string\n description?: string\n actions?: React.ReactNode\n children: React.ReactNode\n className?: string\n}) {\n return (\n <Card className={'p-5 md:p-6 ' + (className ?? '')}>\n {(title || actions) && (\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <div>\n {title && <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>}\n {description && <p className=\"mt-0.5 text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions}\n </div>\n )}\n {children}\n </Card>\n )\n}\n\nexport interface SimpleColumn<T> {\n key: string\n header: string\n render: (row: T) => React.ReactNode\n align?: 'left' | 'right'\n}\n\n/**\n * Thin adapter over the design-system DataTable (@fayz-ai/ui): the commerce\n * pages describe columns declaratively; this maps them to tanstack ColumnDef so\n * we reuse DataTable's sorting/skeleton/empty chrome instead of a bespoke table.\n */\nexport function SimpleTable<T>({ columns, rows, empty, loading, onRowClick }: {\n columns: SimpleColumn<T>[]\n rows: T[]\n empty: string\n loading?: boolean\n onRowClick?: (row: T) => void\n}) {\n const cols = React.useMemo<ColumnDef<T>[]>(\n () => columns.map((c) => ({\n id: c.key,\n header: () => <div className={c.align === 'right' ? 'text-right' : ''}>{c.header}</div>,\n cell: ({ row }) => <div className={c.align === 'right' ? 'text-right' : ''}>{c.render(row.original)}</div>,\n })),\n [columns],\n )\n return (\n <DataTable\n columns={cols}\n data={rows}\n emptyMessage={empty}\n loading={loading}\n onRowClick={onRowClick ? (row: T) => onRowClick(row) : undefined}\n />\n )\n}\n","import * as React from 'react'\nimport {\n Button, Input, Badge, toast, Skeleton,\n Tabs, TabsList, TabsTrigger, TabsContent,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n SegmentedControl, type SegmentedOption,\n Checkbox, ConfirmDialog, useSaveBar,\n} from '@fayz-ai/ui'\nimport { useTranslation, getSupabaseClientOptional } from '@fayz-ai/core'\nimport {\n getCoursesProvider,\n type Course, type Module, type Lesson, type CourseStatus,\n type Offer, type OfferKind, type RecurringInterval, type Order,\n} from '@fayz-ai/courses'\n\n/** Derived from the Course model (the package doesn't re-export the union name). */\ntype CourseDeliveryType = Course['deliveryType']\nimport {\n ArrowLeft, Plus, Trash2, Check, ImagePlus, UploadCloud,\n Layers, Tag, Users, ShoppingCart, Loader2, Clock,\n GripVertical, ChevronDown, Video, FileText, PlayCircle, Lock, Info,\n} from 'lucide-react'\nimport {\n DndContext, closestCenter, PointerSensor, KeyboardSensor,\n useSensor, useSensors, type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy,\n useSortable, arrayMove,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { navigateTo } from '../nav'\nimport { formatMoney } from '../lib/format'\nimport { EmptyState, SectionCard, InfoNote } from '../components/CommerceUI'\n\n/** Local alias for the translate function used across the tree builder below. */\ntype TFn = (key: string) => string\n\n/** A distinct enrolled student for this course, derived from its paid orders. */\ninterface CourseStudent {\n key: string\n name: string\n email: string | null\n since: string | null\n}\n\n/** Dedupe paid orders into one row per buyer (latest purchase kept). */\nfunction buildCourseStudents(orders: Order[]): CourseStudent[] {\n const byKey = new Map<string, CourseStudent>()\n for (const o of orders) {\n const key = o.customerId ?? o.customerEmail ?? o.id\n const existing = byKey.get(key)\n if (!existing || (o.createdAt && existing.since && o.createdAt > existing.since)) {\n byKey.set(key, {\n key,\n name: o.customerName ?? o.customerEmail ?? '—',\n email: o.customerEmail ?? null,\n since: o.createdAt ?? null,\n })\n }\n }\n return [...byKey.values()].sort((a, b) => (b.since ?? '').localeCompare(a.since ?? ''))\n}\n\nconst STATUSES: CourseStatus[] = ['draft', 'published', 'archived']\nconst DELIVERY_TYPES: CourseDeliveryType[] = ['online', 'in_person', 'hybrid']\n\nconst TABS = ['details', 'curriculum', 'offers', 'members'] as const\ntype Tab = (typeof TABS)[number]\n\nconst TAB_ICON: Record<Tab, React.ElementType> = {\n details: Tag,\n curriculum: Layers,\n offers: ShoppingCart,\n members: Users,\n}\n\n/** The editable subset of a course — used to detect unsaved changes on the Geral tab. */\nfunction editSnapshot(c: Course): string {\n return JSON.stringify({\n title: c.title, subtitle: c.subtitle, description: c.description,\n price: c.price, status: c.status, deliveryType: c.deliveryType, thumbnailUrl: c.thumbnailUrl,\n })\n}\n\nexport function CourseEditorPage({ id }: { id?: string }) {\n const t = useTranslation()\n const [tab, setTab] = React.useState<Tab>('details')\n const [course, setCourse] = React.useState<Course | null>(null)\n const [modules, setModules] = React.useState<Module[]>([])\n const [lessons, setLessons] = React.useState<Lesson[]>([])\n const [offers, setOffers] = React.useState<Offer[]>([])\n const [students, setStudents] = React.useState<CourseStudent[]>([])\n const [loading, setLoading] = React.useState(true)\n\n // Geral tab: explicit-save model with dirty tracking.\n const [savedSnap, setSavedSnap] = React.useState('')\n const [saving, setSaving] = React.useState(false)\n const [uploading, setUploading] = React.useState(false)\n const fileRef = React.useRef<HTMLInputElement>(null)\n\n // Delete confirmation for the curriculum tab.\n const [pendingDelete, setPendingDelete] = React.useState<\n { kind: 'module' | 'lesson'; id: string } | null\n >(null)\n // Id of a just-created module/lesson whose title input should grab focus.\n const [autoFocusId, setAutoFocusId] = React.useState<string | null>(null)\n\n const reload = React.useCallback(async () => {\n if (!id) return\n const provider = getCoursesProvider()\n const c = await provider.getCourse(id)\n setCourse(c)\n if (c) {\n setSavedSnap(editSnapshot(c))\n const [m, l, o, paidOrders] = await Promise.all([\n provider.listModules(c.id),\n provider.listLessons(c.id),\n provider.listOffers(c.id),\n provider.listOrders({ courseId: c.id, financialStatus: 'paid' }),\n ])\n setModules(m)\n setLessons(l)\n setOffers(o)\n setStudents(buildCourseStudents(paidOrders))\n }\n setLoading(false)\n }, [id])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const dirty = !!course && editSnapshot(course) !== savedSnap\n\n // Persist the Geral tab through the app's generic floating unsaved-changes bar\n // (the same SaveBar the rest of the CRUD uses) instead of an inline button.\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void saveDetails() },\n onDiscard: () => { void reload() },\n saveLabel: t('courses.editor.save') || 'Salvar',\n })\n\n if (loading || !course) return <EditorSkeleton />\n\n function patchCourse(patch: Partial<Course>) {\n setCourse((c) => (c ? { ...c, ...patch } : c))\n }\n\n async function saveDetails() {\n if (!course) return\n setSaving(true)\n try {\n await getCoursesProvider().updateCourse(course.id, {\n title: course.title,\n subtitle: course.subtitle ?? undefined,\n description: course.description ?? undefined,\n thumbnailUrl: course.thumbnailUrl ?? undefined,\n price: course.price,\n status: course.status,\n deliveryType: course.deliveryType,\n })\n setSavedSnap(editSnapshot(course))\n toast.success(t('courses.editor.saved') || 'Course saved')\n } catch {\n toast.error(t('courses.editor.saveFailed') || 'Could not save the course')\n } finally {\n setSaving(false)\n }\n }\n\n async function onPickThumbnail(e: React.ChangeEvent<HTMLInputElement>) {\n const file = e.target.files?.[0]\n if (!file || !course) return\n const supabase = getSupabaseClientOptional() as {\n storage?: {\n from: (b: string) => {\n upload: (p: string, f: File, o?: unknown) => Promise<{ error: unknown }>\n getPublicUrl: (p: string) => { data: { publicUrl: string } }\n }\n }\n } | null\n if (!supabase?.storage) {\n toast.error(t('courses.editor.uploadUnavailable') || 'Upload unavailable — paste an image URL instead.')\n if (fileRef.current) fileRef.current.value = ''\n return\n }\n setUploading(true)\n try {\n const ext = file.name.split('.').pop() || 'jpg'\n const path = `${course.id}/cover-${Date.now()}.${ext}`\n const bucket = supabase.storage.from('course-media')\n const { error } = await bucket.upload(path, file, { upsert: true, contentType: file.type })\n if (error) throw error\n const { data } = bucket.getPublicUrl(path)\n patchCourse({ thumbnailUrl: data.publicUrl })\n toast.success(t('courses.editor.thumbnailUploaded') || 'Image uploaded — remember to save.')\n } catch {\n toast.error(t('courses.editor.uploadFailed') || 'Could not upload the image')\n } finally {\n setUploading(false)\n if (fileRef.current) fileRef.current.value = ''\n }\n }\n\n // --- module / lesson mutations (persist immediately, then reload) ---------\n async function addModule() {\n const mod = await getCoursesProvider().createModule({ courseId: course!.id, title: t('courses.editor.untitledModule') || 'New module' })\n toast.success(t('courses.editor.moduleAdded') || 'Module added')\n await reload()\n setAutoFocusId(mod.id)\n }\n async function renameModule(moduleId: string, title: string) {\n await getCoursesProvider().updateModule(moduleId, { title })\n }\n async function addLesson(moduleId: string) {\n // Optimistic: drop the row at the END of the module's list immediately,\n // then persist in the background (swap the temp id for the real one, keeping\n // any edits made meanwhile). No full reload → no flash.\n const tempId = `tmp-${crypto.randomUUID()}`\n const nextOrder = lessons\n .filter((l) => l.moduleId === moduleId)\n .reduce((max, l) => Math.max(max, l.sortOrder), -1) + 1\n const optimistic: Lesson = {\n id: tempId,\n courseId: course!.id,\n moduleId,\n title: t('courses.editor.untitledLesson') || 'New lesson',\n description: null,\n videoUrl: '',\n durationSec: 0,\n sortOrder: nextOrder,\n }\n setLessons((ls) => [...ls, optimistic])\n setAutoFocusId(tempId)\n try {\n const real = await getCoursesProvider().createLesson({\n courseId: course!.id,\n moduleId,\n title: optimistic.title,\n videoUrl: '',\n })\n setLessons((ls) => ls.map((l) => (l.id === tempId ? { ...l, id: real.id } : l)))\n setAutoFocusId((cur) => (cur === tempId ? real.id : cur))\n } catch {\n setLessons((ls) => ls.filter((l) => l.id !== tempId))\n toast.error(t('courses.editor.saveFailed') || 'Could not add the lesson')\n }\n }\n async function patchLesson(lessonId: string, patch: Partial<Lesson>) {\n await getCoursesProvider().updateLesson(lessonId, {\n title: patch.title,\n videoUrl: patch.videoUrl,\n durationSec: patch.durationSec,\n description: patch.description ?? undefined,\n })\n }\n\n // Persist a new module order (optimistic — reload re-sorts by sort_order).\n async function reorderModules(orderedIds: string[]) {\n const prev = modules\n setModules(orderedIds.map((mid, i) => ({ ...prev.find((m) => m.id === mid)!, sortOrder: i })))\n try {\n await Promise.all(orderedIds.map((mid, i) => getCoursesProvider().updateModule(mid, { sortOrder: i })))\n } catch {\n toast.error(t('courses.editor.reorderFailed') || 'Could not reorder')\n } finally {\n await reload()\n }\n }\n // Persist a new lesson order within one module.\n async function reorderLessons(moduleId: string, orderedIds: string[]) {\n const prev = lessons\n const others = prev.filter((l) => l.moduleId !== moduleId)\n const reordered = orderedIds.map((lid, i) => ({ ...prev.find((l) => l.id === lid)!, sortOrder: i }))\n setLessons([...others, ...reordered])\n try {\n await Promise.all(orderedIds.map((lid, i) => getCoursesProvider().updateLesson(lid, { sortOrder: i })))\n } catch {\n toast.error(t('courses.editor.reorderFailed') || 'Could not reorder')\n } finally {\n await reload()\n }\n }\n\n async function confirmDelete() {\n if (!pendingDelete) return\n const provider = getCoursesProvider()\n if (pendingDelete.kind === 'module') await provider.deleteModule(pendingDelete.id)\n else await provider.deleteLesson(pendingDelete.id)\n toast.success(t('courses.editor.deleted') || 'Removed')\n setPendingDelete(null)\n await reload()\n }\n\n // --- offer mutations ------------------------------------------------------\n async function addOffer() {\n await getCoursesProvider().createOffer({\n courseId: course!.id,\n name: t('courses.offers.newName') || 'New offer',\n price: course!.price,\n kind: 'one_time',\n })\n toast.success(t('courses.offers.added') || 'Offer added')\n await reload()\n }\n async function patchOffer(offerId: string, patch: Partial<Offer>) {\n await getCoursesProvider().updateOffer(offerId, {\n name: patch.name,\n price: patch.price,\n kind: patch.kind,\n recurringInterval: patch.recurringInterval,\n isOrderBump: patch.isOrderBump,\n isDefault: patch.isDefault,\n })\n await reload()\n }\n async function deleteOffer(offerId: string) {\n await getCoursesProvider().deleteOffer(offerId)\n toast.success(t('courses.offers.removed') || 'Offer removed')\n await reload()\n }\n\n const deliveryOptions: SegmentedOption<CourseDeliveryType>[] = DELIVERY_TYPES.map((d) => ({\n value: d,\n label: t(`courses.editor.delivery.${d}`) || d,\n }))\n\n return (\n <div className=\"mx-auto max-w-4xl p-6 md:p-8\">\n <button\n onClick={() => navigateTo('/courses')}\n className=\"mb-4 inline-flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> {t('courses.editor.back') || 'Back to courses'}\n </button>\n\n <div className=\"mb-6 flex flex-wrap items-center gap-x-3 gap-y-2\">\n <h1 className=\"text-2xl font-bold text-foreground\">{course.title || (t('courses.editor.untitledCourse') || 'Untitled course')}</h1>\n <Badge variant={course.status === 'published' ? 'success' : course.status === 'archived' ? 'secondary' : 'outline'}>\n {t(`courses.status.${course.status}`) || course.status}\n </Badge>\n <Badge variant=\"outline\">{t(`courses.editor.delivery.${course.deliveryType}`) || course.deliveryType}</Badge>\n </div>\n\n <Tabs value={tab} onValueChange={(v) => setTab(v as Tab)}>\n <div className=\"-mx-1 mb-6 overflow-x-auto px-1 pb-1\">\n <TabsList className=\"h-auto flex-nowrap\">\n {TABS.map((tk) => {\n const Icon = TAB_ICON[tk]\n return (\n <TabsTrigger key={tk} value={tk} className=\"gap-1.5 whitespace-nowrap py-1.5\">\n <Icon className=\"h-3.5 w-3.5\" />\n {t(`courses.editor.tab.${tk}`) || tk}\n </TabsTrigger>\n )\n })}\n </TabsList>\n </div>\n\n {/* ---- Geral ---------------------------------------------------- */}\n <TabsContent value=\"details\" className=\"space-y-5\">\n <SectionCard title={t('courses.editor.sectionBasics') || 'Basics'}>\n <div className=\"space-y-4\">\n <Field label={t('courses.editor.fieldTitle') || 'Title'}>\n <Input value={course.title} onChange={(e) => patchCourse({ title: e.target.value })} />\n </Field>\n <Field label={t('courses.editor.fieldSubtitle') || 'Subtitle'}>\n <Input value={course.subtitle ?? ''} onChange={(e) => patchCourse({ subtitle: e.target.value })} />\n </Field>\n <Field label={t('courses.editor.fieldDescription') || 'Description'}>\n <Textarea\n value={course.description ?? ''}\n onChange={(e) => patchCourse({ description: e.target.value })}\n placeholder={t('courses.editor.descriptionPlaceholder') || 'What will students learn?'}\n />\n </Field>\n <Field label={t('courses.editor.fieldDelivery') || 'Format'} hint={t('courses.editor.deliveryHint') || 'How this course is delivered.'}>\n <SegmentedControl\n size=\"md\"\n options={deliveryOptions}\n value={course.deliveryType}\n onChange={(v) => patchCourse({ deliveryType: v })}\n aria-label={t('courses.editor.fieldDelivery') || 'Format'}\n />\n </Field>\n </div>\n </SectionCard>\n\n <SectionCard title={t('courses.editor.sectionThumbnail') || 'Cover image'} description={t('courses.editor.thumbnailHint') || 'Shown on the storefront and in listings. 1280×720 recommended.'}>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start\">\n <div className=\"aspect-video w-full shrink-0 overflow-hidden rounded-lg border border-border bg-muted sm:w-56\">\n {course.thumbnailUrl ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={course.thumbnailUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n <div className=\"flex h-full w-full flex-col items-center justify-center gap-1 text-muted-foreground\">\n <ImagePlus className=\"h-6 w-6\" />\n <span className=\"text-xs\">{t('courses.editor.thumbnailEmpty') || 'No image'}</span>\n </div>\n )}\n </div>\n <div className=\"flex-1 space-y-3\">\n <input ref={fileRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={onPickThumbnail} />\n <Button variant=\"outline\" size=\"sm\" disabled={uploading} onClick={() => fileRef.current?.click()}>\n {uploading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <UploadCloud className=\"h-4 w-4\" />}\n {uploading ? (t('courses.editor.uploading') || 'Uploading…') : (t('courses.editor.thumbnailUpload') || 'Upload image')}\n </Button>\n <Field label={t('courses.editor.thumbnailUrl') || 'Or paste an image URL'}>\n <Input\n value={course.thumbnailUrl ?? ''}\n placeholder=\"https://…\"\n onChange={(e) => patchCourse({ thumbnailUrl: e.target.value || null })}\n />\n </Field>\n </div>\n </div>\n </SectionCard>\n\n <SectionCard title={t('courses.editor.sectionPricing') || 'Pricing & status'}>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <Field label={t('courses.editor.fieldPrice') || 'Price'} hint={course.currency}>\n <Input\n type=\"number\"\n min={0}\n step=\"0.01\"\n inputMode=\"decimal\"\n value={String(course.price)}\n onChange={(e) => patchCourse({ price: Number(e.target.value) || 0 })}\n />\n </Field>\n <Field label={t('courses.editor.fieldStatus') || 'Status'}>\n <Select value={course.status} onValueChange={(v) => patchCourse({ status: v as CourseStatus })}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STATUSES.map((s) => (\n <SelectItem key={s} value={s}>{t(`courses.status.${s}`) || s}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n </div>\n </SectionCard>\n </TabsContent>\n\n {/* ---- Conteúdo ------------------------------------------------- */}\n <TabsContent value=\"curriculum\" className=\"space-y-4\">\n <CurriculumBuilder\n t={t}\n modules={modules}\n lessons={lessons}\n autoFocusId={autoFocusId}\n onAutoFocused={() => setAutoFocusId(null)}\n onAddModule={addModule}\n onRenameModule={renameModule}\n onAddLesson={addLesson}\n onPatchLesson={patchLesson}\n onRequestDelete={(kind, delId) => setPendingDelete({ kind, id: delId })}\n onReorderModules={reorderModules}\n onReorderLessons={reorderLessons}\n />\n </TabsContent>\n\n {/* ---- Ofertas -------------------------------------------------- */}\n <TabsContent value=\"offers\" className=\"space-y-4\">\n <InfoNote icon={<Info className=\"h-4 w-4\" />}>\n {t('courses.offers.help') || 'Price points for this course. Sales run through orders and the Financeiro module.'}\n </InfoNote>\n {offers.length === 0 ? (\n <EmptyState\n icon={<Tag className=\"h-5 w-5\" />}\n title={t('courses.offers.empty') || 'No offers yet'}\n description={t('courses.offers.emptyHint') || 'Create an offer to sell this course.'}\n action={<Button onClick={addOffer}><Plus className=\"h-4 w-4\" />{t('courses.offers.firstOffer') || 'Create first offer'}</Button>}\n />\n ) : (\n <>\n {offers.map((offer) => (\n <div key={offer.id} className=\"rounded-xl border border-border bg-card p-4 shadow-sm md:p-5\">\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <Badge variant=\"outline\" className=\"gap-1\">\n {offer.kind === 'subscription'\n ? (t('courses.offers.subscription') || 'Subscription')\n : (t('courses.offers.oneTime') || 'One-time')}\n </Badge>\n <button\n onClick={() => deleteOffer(offer.id)}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground/60 transition-colors hover:bg-destructive/10 hover:text-destructive\"\n aria-label={t('courses.offers.remove') || 'Remove'}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-[1fr_140px_160px]\">\n <Field label={t('courses.offers.name') || 'Offer name'}>\n <Input defaultValue={offer.name} onBlur={(e) => patchOffer(offer.id, { name: e.target.value })} />\n </Field>\n <Field label={t('courses.offers.price') || 'Price'} hint={offer.currency}>\n <Input type=\"number\" min={0} step=\"0.01\" inputMode=\"decimal\" defaultValue={String(offer.price)} onBlur={(e) => patchOffer(offer.id, { price: Number(e.target.value) || 0 })} />\n </Field>\n <Field label={t('courses.offers.kind') || 'Type'}>\n <Select\n value={offer.kind}\n onValueChange={(v) => patchOffer(offer.id, { kind: v as OfferKind, recurringInterval: v === 'subscription' ? (offer.recurringInterval ?? 'month') : null })}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"one_time\">{t('courses.offers.oneTime') || 'One-time'}</SelectItem>\n <SelectItem value=\"subscription\">{t('courses.offers.subscription') || 'Subscription'}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </div>\n\n {offer.kind === 'subscription' && (\n <div className=\"mt-3 max-w-[200px]\">\n <Field label={t('courses.offers.interval') || 'Billing interval'}>\n <Select\n value={offer.recurringInterval ?? 'month'}\n onValueChange={(v) => patchOffer(offer.id, { recurringInterval: v as RecurringInterval })}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"month\">{t('courses.interval.month') || 'month'}</SelectItem>\n <SelectItem value=\"year\">{t('courses.interval.year') || 'year'}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </div>\n )}\n\n {/* Storefront-only flags — de-emphasized: they persist but only take\n effect once the public checkout ships (deferred / bridge scope). */}\n <div className=\"mt-4 rounded-lg border border-dashed border-border bg-muted/30 p-3\">\n <p className=\"mb-2.5 flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"h-3.5 w-3.5\" />\n {t('courses.offers.checkoutFlagsNote') || 'Apply once the public checkout ships (coming soon).'}\n </p>\n <div className=\"flex flex-wrap items-center gap-x-5 gap-y-2\">\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-muted-foreground\">\n <Checkbox checked={offer.isDefault} onChange={(v) => patchOffer(offer.id, { isDefault: v })} />\n {t('courses.offers.default') || 'Default'}\n </label>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-muted-foreground\">\n <Checkbox checked={offer.isOrderBump} onChange={(v) => patchOffer(offer.id, { isOrderBump: v })} />\n {t('courses.offers.bump') || 'Order bump'}\n </label>\n </div>\n </div>\n </div>\n ))}\n <Button variant=\"outline\" onClick={addOffer} className=\"w-full border-dashed\">\n <Plus className=\"h-4 w-4\" />{t('courses.offers.add') || 'Add offer'}\n </Button>\n </>\n )}\n </TabsContent>\n\n {/* ---- Área de membros ----------------------------------------- */}\n <TabsContent value=\"members\" className=\"space-y-4\">\n <InfoNote icon={<Users className=\"h-4 w-4\" />}>\n {t('courses.editor.membersHelp') || 'Buyers are enrolled automatically through orders and get access to all of this course’s content.'}\n </InfoNote>\n\n {/* Enrolled students for THIS course (the actual \"área de membros\"). */}\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {(t('courses.editor.enrolledStudents') || 'Enrolled students')} ({students.length})\n </p>\n {students.length === 0 ? (\n <EmptyState\n icon={<Users className=\"h-5 w-5\" />}\n title={t('courses.editor.membersEmpty') || 'No students yet'}\n description={t('courses.editor.membersEmptyHint') || 'Buyers are enrolled here automatically after a paid order.'}\n />\n ) : (\n <div className=\"divide-y divide-border overflow-hidden rounded-xl border border-border bg-card\">\n {students.map((s) => (\n <div key={s.key} className=\"flex items-center gap-3 px-4 py-3\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-xs font-semibold uppercase text-muted-foreground\" aria-hidden>\n {(s.name || s.email || '?').charAt(0)}\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate font-medium text-foreground\">{s.name}</span>\n {s.email && <span className=\"truncate text-xs text-muted-foreground\">{s.email}</span>}\n </span>\n {s.since && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {new Date(s.since).toLocaleDateString()}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Which offers grant access — kept as secondary context. */}\n {offers.length > 0 && (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {t('courses.editor.accessUnlockedBy') || 'Access is unlocked by'}\n </p>\n <div className=\"divide-y divide-border overflow-hidden rounded-xl border border-border bg-card\">\n {offers.map((offer) => (\n <div key={offer.id} className=\"flex items-center gap-3 px-4 py-3\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground\" aria-hidden>\n <Lock className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate font-medium text-foreground\">{offer.name}</span>\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{formatMoney(offer.price, offer.currency)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </TabsContent>\n </Tabs>\n\n <ConfirmDialog\n open={pendingDelete !== null}\n variant=\"destructive\"\n title={pendingDelete?.kind === 'module'\n ? (t('courses.editor.deleteModuleConfirm') || 'Delete this module?')\n : (t('courses.editor.deleteLessonConfirm') || 'Remove this lesson?')}\n description={pendingDelete?.kind === 'module'\n ? (t('courses.editor.deleteModuleConfirmBody') || 'Its lessons will be removed too. This cannot be undone.')\n : (t('courses.editor.deleteLessonConfirmBody') || 'This cannot be undone.')}\n confirmLabel={t('courses.editor.confirmDelete') || 'Delete'}\n cancelLabel={t('courses.editor.cancel') || 'Cancel'}\n onConfirm={confirmDelete}\n onCancel={() => setPendingDelete(null)}\n />\n </div>\n )\n}\nCourseEditorPage.displayName = 'CourseEditorPage'\n\n// ===========================================================================\n// Curriculum tree builder (module → lesson), Kiwify/Hotmart style.\n// ===========================================================================\n\ninterface CurriculumBuilderProps {\n t: TFn\n modules: Module[]\n lessons: Lesson[]\n autoFocusId: string | null\n onAutoFocused: () => void\n onAddModule: () => void\n onRenameModule: (moduleId: string, title: string) => void\n onAddLesson: (moduleId: string) => void\n onPatchLesson: (lessonId: string, patch: Partial<Lesson>) => void\n onRequestDelete: (kind: 'module' | 'lesson', id: string) => void\n onReorderModules: (orderedIds: string[]) => void\n onReorderLessons: (moduleId: string, orderedIds: string[]) => void\n}\n\n/** Human-friendly total duration, e.g. \"8 min\" or \"1 h 20 min\". */\nfunction formatDuration(sec: number, t: TFn): string {\n const min = Math.max(0, Math.round(sec / 60))\n const mLabel = t('courses.editor.minShort') || 'min'\n if (min < 60) return `${min} ${mLabel}`\n const h = Math.floor(min / 60)\n const rem = min % 60\n const hLabel = t('courses.editor.hourShort') || 'h'\n return rem ? `${h} ${hLabel} ${rem} ${mLabel}` : `${h} ${hLabel}`\n}\n\nfunction CurriculumBuilder({\n t, modules, lessons, autoFocusId, onAutoFocused,\n onAddModule, onRenameModule, onAddLesson, onPatchLesson,\n onRequestDelete, onReorderModules, onReorderLessons,\n}: CurriculumBuilderProps) {\n // Track only the *collapsed* modules so freshly-created ones default to open.\n const [collapsed, setCollapsed] = React.useState<Set<string>>(new Set())\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n\n function toggleModule(id: string) {\n setCollapsed((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n function handleModuleDragEnd(e: DragEndEvent) {\n const { active, over } = e\n if (!over || active.id === over.id) return\n const ids = modules.map((m) => m.id)\n const from = ids.indexOf(String(active.id))\n const to = ids.indexOf(String(over.id))\n if (from < 0 || to < 0) return\n onReorderModules(arrayMove(ids, from, to))\n }\n\n if (modules.length === 0) {\n return (\n <div className=\"space-y-4\">\n <AutosaveHint t={t} />\n <EmptyState\n icon={<Layers className=\"h-5 w-5\" />}\n title={t('courses.editor.modulesEmpty') || 'No modules yet'}\n description={t('courses.editor.modulesEmptyHint') || 'Create a module to start organizing your lessons.'}\n action={<Button onClick={onAddModule}><Plus className=\"h-4 w-4\" />{t('courses.editor.firstModule') || 'Create first module'}</Button>}\n />\n </div>\n )\n }\n\n const totalLessons = lessons.length\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <AutosaveHint t={t} />\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {modules.length} {modules.length === 1 ? (t('courses.editor.moduleLabel') || 'module') : (t('courses.editor.moduleLabelPlural') || 'modules')}\n {' · '}\n {totalLessons} {totalLessons === 1 ? (t('courses.editor.lessonUnitOne') || 'lesson') : (t('courses.editor.lessonUnitOther') || 'lessons')}\n </span>\n </div>\n\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleModuleDragEnd}>\n <SortableContext items={modules.map((m) => m.id)} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-3\">\n {modules.map((mod, i) => (\n <SortableModuleCard\n key={mod.id}\n t={t}\n index={i}\n mod={mod}\n lessons={lessons.filter((l) => l.moduleId === mod.id)}\n expanded={!collapsed.has(mod.id)}\n onToggle={() => toggleModule(mod.id)}\n autoFocusId={autoFocusId}\n onAutoFocused={onAutoFocused}\n onRenameModule={onRenameModule}\n onAddLesson={onAddLesson}\n onPatchLesson={onPatchLesson}\n onRequestDelete={onRequestDelete}\n onReorderLessons={onReorderLessons}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n\n <Button variant=\"outline\" onClick={onAddModule} className=\"w-full border-dashed\">\n <Plus className=\"h-4 w-4\" />{t('courses.editor.newModule') || 'New module'}\n </Button>\n </div>\n )\n}\n\ninterface SortableModuleCardProps {\n t: TFn\n index: number\n mod: Module\n lessons: Lesson[]\n expanded: boolean\n onToggle: () => void\n autoFocusId: string | null\n onAutoFocused: () => void\n onRenameModule: (moduleId: string, title: string) => void\n onAddLesson: (moduleId: string) => void\n onPatchLesson: (lessonId: string, patch: Partial<Lesson>) => void\n onRequestDelete: (kind: 'module' | 'lesson', id: string) => void\n onReorderLessons: (moduleId: string, orderedIds: string[]) => void\n}\n\nfunction SortableModuleCard({\n t, index, mod, lessons, expanded, onToggle, autoFocusId, onAutoFocused,\n onRenameModule, onAddLesson, onPatchLesson, onRequestDelete, onReorderLessons,\n}: SortableModuleCardProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: mod.id })\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n zIndex: isDragging ? 20 : undefined,\n }\n\n const count = lessons.length\n const totalSec = lessons.reduce((s, l) => s + (l.durationSec || 0), 0)\n\n function handleLessonDragEnd(e: DragEndEvent) {\n const { active, over } = e\n if (!over || active.id === over.id) return\n const ids = lessons.map((l) => l.id)\n const from = ids.indexOf(String(active.id))\n const to = ids.indexOf(String(over.id))\n if (from < 0 || to < 0) return\n onReorderLessons(mod.id, arrayMove(ids, from, to))\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className=\"overflow-hidden rounded-xl border border-border bg-card shadow-sm\"\n >\n {/* Module header */}\n <div className=\"flex items-center gap-1.5 px-2 py-2 sm:gap-2 sm:px-3\">\n <button\n {...attributes}\n {...listeners}\n className=\"hidden h-8 w-6 shrink-0 cursor-grab touch-none items-center justify-center rounded-md text-muted-foreground/40 transition-colors hover:text-muted-foreground active:cursor-grabbing sm:flex\"\n aria-label={t('courses.editor.dragToReorder') || 'Drag to reorder'}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n <button\n onClick={onToggle}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n aria-label={expanded ? (t('courses.editor.collapse') || 'Collapse') : (t('courses.editor.expand') || 'Expand')}\n aria-expanded={expanded}\n >\n <ChevronDown className={'h-4 w-4 transition-transform ' + (expanded ? '' : '-rotate-90')} />\n </button>\n\n <span className=\"hidden shrink-0 items-center rounded-md bg-muted px-2 py-1 text-xs font-semibold tabular-nums text-muted-foreground sm:inline-flex\">\n {String(index + 1).padStart(2, '0')}\n </span>\n\n <TitleField\n value={mod.title}\n autoFocus={autoFocusId === mod.id}\n onAutoFocused={onAutoFocused}\n onCommit={(v) => onRenameModule(mod.id, v)}\n placeholder={t('courses.editor.moduleTitle') || 'Module title'}\n ariaLabel={t('courses.editor.moduleTitle') || 'Module title'}\n className=\"text-sm font-semibold\"\n />\n\n <span className=\"hidden shrink-0 text-xs text-muted-foreground tabular-nums md:inline\">\n {count > 0\n ? `${count} ${count === 1 ? (t('courses.editor.lessonUnitOne') || 'lesson') : (t('courses.editor.lessonUnitOther') || 'lessons')} · ${formatDuration(totalSec, t)}`\n : (t('courses.editor.noLessons') || 'No lessons')}\n </span>\n\n <button\n onClick={() => onRequestDelete('module', mod.id)}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground/60 transition-colors hover:bg-destructive/10 hover:text-destructive\"\n aria-label={t('courses.editor.deleteModule') || 'Delete module'}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Module body */}\n {expanded && (\n <div className=\"border-t border-border/60 bg-muted/20 p-2 sm:p-3\">\n {count === 0 ? (\n <button\n onClick={() => onAddLesson(mod.id)}\n className=\"flex w-full items-center justify-center gap-2 rounded-lg border border-dashed border-border px-3 py-4 text-sm text-muted-foreground transition-colors hover:border-primary/40 hover:bg-card hover:text-foreground\"\n >\n <Plus className=\"h-4 w-4\" /> {t('courses.editor.firstLesson') || 'Add the first lesson'}\n </button>\n ) : (\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleLessonDragEnd}>\n <SortableContext items={lessons.map((l) => l.id)} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-1.5\">\n {lessons.map((lesson) => (\n <SortableLessonRow\n key={lesson.id}\n t={t}\n lesson={lesson}\n autoFocusId={autoFocusId}\n onAutoFocused={onAutoFocused}\n onPatchLesson={onPatchLesson}\n onRequestDelete={onRequestDelete}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n )}\n\n {count > 0 && (\n <button\n onClick={() => onAddLesson(mod.id)}\n className=\"mt-2 flex items-center gap-1.5 rounded-md px-2 py-1.5 text-sm font-medium text-primary transition-colors hover:bg-primary/10\"\n >\n <Plus className=\"h-4 w-4\" /> {t('courses.editor.newLesson') || 'New lesson'}\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n\ninterface SortableLessonRowProps {\n t: TFn\n lesson: Lesson\n autoFocusId: string | null\n onAutoFocused: () => void\n onPatchLesson: (lessonId: string, patch: Partial<Lesson>) => void\n onRequestDelete: (kind: 'module' | 'lesson', id: string) => void\n}\n\nfunction SortableLessonRow({ t, lesson, autoFocusId, onAutoFocused, onPatchLesson, onRequestDelete }: SortableLessonRowProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: lesson.id })\n const [open, setOpen] = React.useState(false)\n // Local mirrors so the type icon + duration chip refresh on blur without a reload.\n const [videoUrl, setVideoUrl] = React.useState(lesson.videoUrl)\n const [durationSec, setDurationSec] = React.useState(lesson.durationSec)\n React.useEffect(() => { setVideoUrl(lesson.videoUrl) }, [lesson.videoUrl])\n React.useEffect(() => { setDurationSec(lesson.durationSec) }, [lesson.durationSec])\n\n const hasVideo = videoUrl.trim().length > 0\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n zIndex: isDragging ? 10 : undefined,\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={\n 'group rounded-lg border bg-card transition-colors ' +\n (open ? 'border-border' : 'border-transparent hover:border-border')\n }\n >\n <div className=\"flex items-center gap-1.5 px-1.5 py-1.5 sm:gap-2 sm:px-2\">\n <button\n {...attributes}\n {...listeners}\n className=\"hidden h-8 w-5 shrink-0 cursor-grab touch-none items-center justify-center text-muted-foreground/40 transition-colors hover:text-muted-foreground active:cursor-grabbing sm:flex\"\n aria-label={t('courses.editor.dragToReorder') || 'Drag to reorder'}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n <span\n className={\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ' +\n (hasVideo ? 'bg-primary/10 text-primary' : 'bg-muted text-muted-foreground')\n }\n aria-hidden\n >\n {hasVideo ? <Video className=\"h-4 w-4\" /> : <FileText className=\"h-4 w-4\" />}\n </span>\n\n <TitleField\n value={lesson.title}\n autoFocus={autoFocusId === lesson.id}\n onAutoFocused={onAutoFocused}\n onCommit={(v) => onPatchLesson(lesson.id, { title: v })}\n placeholder={t('courses.editor.lessonTitle') || 'Lesson title'}\n ariaLabel={t('courses.editor.lessonTitle') || 'Lesson title'}\n className=\"text-sm\"\n />\n\n <span className=\"hidden shrink-0 items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs tabular-nums text-muted-foreground sm:inline-flex\">\n <Clock className=\"h-3 w-3\" />\n {Math.round(durationSec / 60)}\n {' '}\n {t('courses.editor.minShort') || 'min'}\n </span>\n\n <button\n onClick={() => setOpen((v) => !v)}\n className={\n 'inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-1 text-xs font-medium transition-colors ' +\n (hasVideo\n ? 'border-border text-muted-foreground hover:text-foreground'\n : 'border-dashed border-border text-muted-foreground hover:border-primary/40 hover:text-foreground') +\n ' opacity-100 sm:opacity-0 sm:group-hover:opacity-100 ' + (open ? 'sm:opacity-100' : '')\n }\n aria-label={t('courses.editor.editLesson') || 'Edit lesson'}\n aria-expanded={open}\n >\n <PlayCircle className=\"h-3.5 w-3.5\" />\n <span className=\"hidden sm:inline\">\n {hasVideo ? (t('courses.editor.videoSet') || 'Video') : (t('courses.editor.addVideo') || 'Add video')}\n </span>\n </button>\n\n <button\n onClick={() => onRequestDelete('lesson', lesson.id)}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground/60 transition-colors hover:bg-destructive/10 hover:text-destructive sm:opacity-0 sm:group-hover:opacity-100\"\n aria-label={t('courses.editor.deleteLesson') || 'Remove lesson'}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {open && (\n <div className=\"space-y-3 border-t border-border/60 px-3 py-3 sm:pl-11\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('courses.editor.videoUrlLabel') || 'Video URL'}\n </label>\n <Input\n defaultValue={lesson.videoUrl}\n placeholder={t('courses.editor.videoUrlPlaceholder') || 'Paste the video link (YouTube, Vimeo…)'}\n onBlur={(e) => { setVideoUrl(e.target.value); onPatchLesson(lesson.id, { videoUrl: e.target.value }) }}\n aria-label={t('courses.editor.videoUrlLabel') || 'Video URL'}\n />\n </div>\n <div className=\"max-w-[160px] space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('courses.editor.lessonDuration') || 'Duration (min)'}\n </label>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n defaultValue={String(Math.round(lesson.durationSec / 60))}\n onBlur={(e) => { const s = (Number(e.target.value) || 0) * 60; setDurationSec(s); onPatchLesson(lesson.id, { durationSec: s }) }}\n aria-label={t('courses.editor.lessonDuration') || 'Duration (min)'}\n />\n </div>\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Borderless, text-like inline title input. Uncontrolled (defaultValue + onBlur\n * autosave) so it plays nicely with the reload-after-mutation flow, and focuses\n * itself when it is the freshly-created item.\n */\nfunction TitleField({ value, autoFocus, onAutoFocused, onCommit, placeholder, ariaLabel, className }: {\n value: string\n autoFocus?: boolean\n onAutoFocused?: () => void\n onCommit: (v: string) => void\n placeholder?: string\n ariaLabel?: string\n className?: string\n}) {\n const ref = React.useRef<HTMLInputElement>(null)\n React.useEffect(() => {\n if (autoFocus && ref.current) {\n ref.current.focus()\n ref.current.select()\n onAutoFocused?.()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoFocus])\n return (\n <input\n ref={ref}\n defaultValue={value}\n placeholder={placeholder}\n aria-label={ariaLabel}\n onBlur={(e) => onCommit(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') e.currentTarget.blur() }}\n className={\n 'min-w-0 flex-1 rounded-md bg-transparent px-2 py-1.5 text-foreground outline-none transition-colors placeholder:text-muted-foreground/60 hover:bg-muted/60 focus:bg-background focus:ring-2 focus:ring-ring ' +\n (className ?? '')\n }\n />\n )\n}\n\nfunction Field({ label, hint, children }: { label: string; hint?: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\n {hint && <span className=\"text-xs text-muted-foreground\">{hint}</span>}\n </div>\n {children}\n </div>\n )\n}\n\nfunction Textarea(props: React.TextareaHTMLAttributes<HTMLTextAreaElement>) {\n const { className, ...rest } = props\n return (\n <textarea\n className={\n 'flex min-h-[96px] w-full rounded-input border border-input bg-card px-2 py-1.5 text-sm text-foreground shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ' +\n (className ?? '')\n }\n {...rest}\n />\n )\n}\n\nfunction AutosaveHint({ t }: { t: (k: string) => string }) {\n return (\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Check className=\"h-3.5 w-3.5 text-success\" />\n {t('courses.editor.autosaved') || 'Changes are saved automatically.'}\n </p>\n )\n}\n\nfunction EditorSkeleton() {\n return (\n <div className=\"mx-auto max-w-4xl p-6 md:p-8\">\n <Skeleton className=\"mb-4 h-4 w-28\" />\n <Skeleton className=\"mb-6 h-8 w-64\" />\n <Skeleton className=\"mb-6 h-10 w-full\" />\n <div className=\"space-y-4\">\n <Skeleton className=\"h-40 w-full rounded-xl\" />\n <Skeleton className=\"h-40 w-full rounded-xl\" />\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { OrderListView, type OrderListColumn } from '@fayz-ai/saas'\nimport { getCoursesProvider, type Order, type FinancialStatus } from '@fayz-ai/courses'\nimport { formatMoney, formatDate } from '../lib/format'\nimport { navigateTo } from '../nav'\n\nfunction statusVariant(s: FinancialStatus): 'success' | 'secondary' | 'destructive' | 'outline' {\n if (s === 'paid') return 'success'\n if (s === 'pending') return 'secondary'\n if (s === 'refunded' || s === 'chargeback') return 'destructive'\n return 'outline'\n}\n\n// Cache (fora do componente) — trocar de aba remonta a página; sem cache refaz a\n// consulta toda vez. Cache-first evita o refetch/skeleton ao voltar pra aba.\nlet salesCache: Order[] | null = null\n\nexport function SalesPage() {\n const t = useTranslation()\n const [orders, setOrders] = React.useState<Order[] | null>(salesCache)\n\n React.useEffect(() => {\n if (salesCache) return // cache hit → sem request\n let alive = true\n const p = getCoursesProvider()\n // public.orders (via listCoreSales) é a fonte da verdade; listOrders é a\n // projeção nativa do courses. Dedupe por id: uma venda espelhada aparece 1x,\n // com a linha canônica (orders) ganhando.\n void Promise.all([\n p.listCoreSales().catch(() => [] as Order[]),\n p.listOrders().catch(() => [] as Order[]),\n ]).then(([core, store]) => {\n if (!alive) return\n const byId = new Map<string, Order>()\n for (const o of store) byId.set(o.id, o)\n for (const o of core) byId.set(o.id, o)\n const list = [...byId.values()].sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1))\n salesCache = list\n setOrders(list)\n })\n return () => { alive = false }\n }, [])\n\n const paid = (orders ?? []).filter((o) => o.financialStatus === 'paid')\n const revenue = paid.reduce((s, o) => s + o.total, 0)\n const currency = orders?.[0]?.currency ?? 'BRL'\n\n const columns: OrderListColumn<Order>[] = [\n { key: 'date', header: t('courses.sales.date') || 'Data', render: (o) => <span className=\"text-muted-foreground\">{formatDate(o.createdAt)}</span> },\n { key: 'customer', header: t('courses.sales.customer') || 'Cliente', render: (o) => (\n <div>\n <div className=\"font-medium text-foreground\">{o.customerName ?? '—'}</div>\n <div className=\"text-xs text-muted-foreground\">{o.customerEmail}</div>\n </div>\n ) },\n { key: 'method', header: t('courses.sales.method') || 'Forma', render: (o) => (\n <span className=\"capitalize\">\n {o.paymentMethod ?? '—'}{o.installmentCount && o.installmentCount > 1 ? ` · ${o.installmentCount}x` : ''}\n </span>\n ) },\n { key: 'status', header: t('courses.sales.status') || 'Status', render: (o) => (\n <Badge variant={statusVariant(o.financialStatus)}>{t(`courses.financialStatus.${o.financialStatus}`) || o.financialStatus}</Badge>\n ) },\n { key: 'fee', header: t('courses.sales.fee') || 'Taxa', align: 'right', render: (o) => <span className=\"text-muted-foreground\">{formatMoney(o.platformFee, o.currency)}</span> },\n { key: 'total', header: t('courses.sales.amount') || 'Valor', align: 'right', render: (o) => <span className=\"font-medium text-foreground\">{formatMoney(o.total, o.currency)}</span> },\n ]\n\n return (\n <OrderListView<Order>\n title={t('courses.sales.title') || 'Vendas'}\n subtitle={t('courses.sales.subtitle') || 'Todas as transações dos seus cursos.'}\n stats={[\n { label: t('courses.sales.count') || 'Vendas', value: String(paid.length) },\n { label: t('courses.sales.revenue') || 'Receita', value: formatMoney(revenue, currency) },\n ]}\n columns={columns}\n rows={orders ?? []}\n loading={orders === null}\n empty={t('courses.sales.empty') || 'Nenhuma venda ainda.'}\n onRowClick={(o) => navigateTo(`/courses/sales/${o.id}`)}\n />\n )\n}\nSalesPage.displayName = 'SalesPage'\n","import * as React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n OrderDetailView as SharedOrderDetailView, OrderDetailSkeleton, PersonLink,\n type OrderDetailData, type OrderDetailInstallment, type OrderDetailTone,\n} from '@fayz-ai/saas'\nimport { getCoursesProvider, type OrderDetail, type FinancialStatus } from '@fayz-ai/courses'\nimport { EmptyState } from '../components/CommerceUI'\nimport { formatMoney, formatDate } from '../lib/format'\nimport { navigateTo } from '../nav'\n\nconst Page = ({ children }: { children: React.ReactNode }) => (\n <div className=\"mx-auto max-w-6xl p-6 md:p-8\">{children}</div>\n)\n\n// Cache por id (fora do componente) — trocar de aba remonta a view; sem cache\n// isso refaz o getOrder (skeleton + request) toda vez. Cache-first evita o refetch.\nconst orderCache = new Map<string, OrderDetail>()\n\nfunction statusTone(s: FinancialStatus): OrderDetailTone {\n if (s === 'paid') return 'success'\n if (s === 'pending') return 'warning'\n if (s === 'refunded' || s === 'chargeback') return 'destructive'\n return 'muted'\n}\nfunction instTone(s: string): OrderDetailTone {\n if (s === 'paid') return 'success'\n if (s === 'overdue') return 'destructive'\n return 'warning'\n}\n\n/** Order detail (`/courses/sales/:id`). Loads the canonical order and renders the\n * SHARED archetype OrderDetailView (@fayz-ai/saas) — same component the shop uses. */\nexport function CourseOrderDetailView({ id }: { id?: string }) {\n const t = useTranslation()\n const [order, setOrder] = React.useState<OrderDetail | null>(() => (id ? orderCache.get(id) ?? null : null))\n const [loading, setLoading] = React.useState(() => !(id && orderCache.has(id)))\n\n React.useEffect(() => {\n let alive = true\n if (!id) { setLoading(false); return }\n const cached = orderCache.get(id)\n if (cached) { setOrder(cached); setLoading(false); return } // cache hit → sem request\n setLoading(true)\n void getCoursesProvider().getOrder(id).then((o) => {\n if (!alive) return\n if (o) orderCache.set(id, o)\n setOrder(o); setLoading(false)\n })\n return () => { alive = false }\n }, [id])\n\n const back = () => navigateTo('/courses/sales')\n\n if (loading) return <Page><OrderDetailSkeleton /></Page>\n if (!order) {\n return (\n <Page>\n <EmptyState\n title={t('courses.order.notFound') || 'Pedido não encontrado'}\n description=\"\"\n action={<button className=\"text-sm text-primary underline\" onClick={back}>{t('common.back') || 'Voltar'}</button>}\n />\n </Page>\n )\n }\n\n const cur = order.currency\n const installments: OrderDetailInstallment[] = order.installments.map((m) => ({\n number: m.installmentNumber,\n amount: formatMoney(m.amount, cur),\n status: m.status,\n statusTone: instTone(m.status),\n dueDate: m.dueDate ? formatDate(m.dueDate) : null,\n paymentDate: m.paymentDate ? formatDate(m.paymentDate) : null,\n note: m.cardBrand ? `${m.cardBrand}${m.cardInstallments ? ` ${m.cardInstallments}x` : ''}` : null,\n }))\n\n const data: OrderDetailData = {\n title: `${t('courses.order.title') || 'Pedido'} #${order.id.slice(0, 8)}`,\n subtitle: formatDate(order.createdAt),\n badges: [\n { label: t(`courses.financialStatus.${order.financialStatus}`) || order.financialStatus, tone: statusTone(order.financialStatus) },\n ...(order.installmentCount && order.installmentCount > 1 ? [{ label: `${order.installmentCount}x`, tone: 'muted' as OrderDetailTone }] : []),\n ],\n customer: { name: order.customerName, email: order.customerEmail },\n customerNode: (\n <div className=\"space-y-1 text-sm\">\n {order.customerId ? (\n <PersonLink\n personId={order.customerId}\n name={order.customerName ?? order.customerEmail ?? 'Cliente'}\n className=\"font-medium\"\n />\n ) : (\n <p className=\"font-medium\">{order.customerName ?? '—'}</p>\n )}\n {order.customerEmail && <p className=\"text-muted-foreground\">{order.customerEmail}</p>}\n </div>\n ),\n items: [{\n name: order.courseTitle ?? '—',\n description: order.offerName,\n quantity: 1,\n unitPrice: formatMoney(order.total, cur),\n total: formatMoney(order.total, cur),\n }],\n totals: [\n { label: 'Total', value: formatMoney(order.total, cur), strong: true },\n ...(order.platformFee > 0 ? [{ label: 'Taxa', value: `− ${formatMoney(order.platformFee, cur)}`, muted: true }] : []),\n { label: 'Líquido', value: formatMoney(order.netValue, cur) },\n ],\n paymentMethod: order.paymentMethod ?? undefined,\n receivable: {\n rows: [\n { label: 'Recebido', value: formatMoney(order.paidAmount, cur) },\n { label: 'Saldo', value: formatMoney(order.balance, cur), strong: order.balance > 0 },\n ],\n installments,\n emptyLabel: t('courses.order.noInstallments') || 'Sem parcelas.',\n },\n onBack: back,\n backLabel: t('courses.sales.title') || 'Vendas',\n }\n\n return (\n <Page>\n <SharedOrderDetailView {...data} />\n </Page>\n )\n}\nCourseOrderDetailView.displayName = 'CourseOrderDetailView'\n","import * as React from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Subscription, type SubscriptionStatus } from '@fayz-ai/courses'\nimport { PageContainer, StatCard, StatGrid, SimpleTable, type SimpleColumn } from '../components/CommerceUI'\nimport { formatMoney, formatDate } from '../lib/format'\n\nfunction statusVariant(s: SubscriptionStatus): 'success' | 'secondary' | 'destructive' {\n if (s === 'active') return 'success'\n if (s === 'past_due') return 'secondary'\n return 'destructive'\n}\n\nexport function SubscriptionsPage() {\n const t = useTranslation()\n const [subs, setSubs] = React.useState<Subscription[] | null>(null)\n\n React.useEffect(() => {\n void getCoursesProvider().listSubscriptions().then(setSubs)\n }, [])\n\n const active = (subs ?? []).filter((s) => s.status === 'active')\n const mrr = active.reduce((sum, s) => sum + (s.interval === 'year' ? s.netValue / 12 : s.netValue), 0)\n const currency = subs?.[0]?.currency ?? 'BRL'\n\n const columns: SimpleColumn<Subscription>[] = [\n { key: 'start', header: t('courses.subs.start') || 'Start date', render: (s) => <span className=\"text-muted-foreground\">{formatDate(s.startedAt)}</span> },\n { key: 'customer', header: t('courses.subs.customer') || 'Customer', render: (s) => (\n <div>\n <div className=\"font-medium text-foreground\">{s.customerName ?? '—'}</div>\n <div className=\"text-xs text-muted-foreground\">{s.customerEmail}</div>\n </div>\n ) },\n { key: 'status', header: t('courses.subs.status') || 'Status', render: (s) => (\n <Badge variant={statusVariant(s.status)}>{t(`courses.subStatus.${s.status}`) || s.status}</Badge>\n ) },\n { key: 'value', header: t('courses.subs.value') || 'Net value', align: 'right', render: (s) => (\n <span className=\"font-medium text-foreground\">{formatMoney(s.netValue, s.currency)}<span className=\"text-xs text-muted-foreground\"> / {t(`courses.interval.${s.interval}`) || s.interval}</span></span>\n ) },\n ]\n\n return (\n <PageContainer title={t('courses.subs.title') || 'Subscriptions'} subtitle={t('courses.subs.subtitle') || 'Recurring plans and MRR.'}>\n <StatGrid>\n <StatCard label={t('courses.subs.active') || 'Active subscriptions'} value={String(active.length)} />\n <StatCard label={t('courses.subs.mrr') || 'Monthly recurring revenue'} value={formatMoney(mrr, currency)} />\n </StatGrid>\n <SimpleTable\n columns={columns}\n rows={subs ?? []}\n empty={t('courses.subs.empty') || 'No subscriptions yet.'}\n />\n </PageContainer>\n )\n}\nSubscriptionsPage.displayName = 'SubscriptionsPage'\n","import * as React from 'react'\nimport { Badge, Button, toast } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Payout, type FinancialSummary, type CreatorAccount } from '@fayz-ai/courses'\nimport { PageContainer, StatCard, StatGrid, SimpleTable, type SimpleColumn } from '../components/CommerceUI'\nimport { formatMoney, formatDate, formatPercent } from '../lib/format'\n\n// No plan gate here on purpose. The page is registered as a shell ROUTE with\n// `permission: read('courses.finance')`, so the route guard already resolves\n// role AND plan for it — and whether `courses.finance` is a paid feature is the\n// APP's call (its billing.ts), never the plugin's. Hardcoding a gate here would\n// bake one product's packaging into the SDK.\nexport function FinancialPage() {\n const t = useTranslation()\n const [summary, setSummary] = React.useState<FinancialSummary | null>(null)\n const [payouts, setPayouts] = React.useState<Payout[] | null>(null)\n const [account, setAccount] = React.useState<CreatorAccount | null>(null)\n\n React.useEffect(() => {\n const p = getCoursesProvider()\n void p.getFinancialSummary().then(setSummary)\n void p.listPayouts().then(setPayouts)\n void p.getCreatorAccount().then(setAccount)\n }, [])\n\n const currency = summary?.currency ?? 'BRL'\n const connected = !!account?.stripeAccountId && account.chargesEnabled\n\n function connectStripe() {\n // Wired to the real Stripe Connect onboarding edge function in Stage 3.\n toast.info(t('courses.financial.connectSoon') || 'Stripe Connect onboarding wires up in Stage 3.')\n }\n\n const columns: SimpleColumn<Payout>[] = [\n { key: 'date', header: t('courses.financial.date') || 'Date', render: (p) => <span className=\"text-muted-foreground\">{formatDate(p.createdAt)}</span> },\n { key: 'amount', header: t('courses.financial.amount') || 'Amount', align: 'right', render: (p) => <span className=\"font-medium text-foreground\">{formatMoney(p.amount, p.currency)}</span> },\n { key: 'status', header: t('courses.financial.status') || 'Status', align: 'right', render: (p) => (\n <Badge variant={p.status === 'paid' ? 'success' : p.status === 'pending' ? 'secondary' : 'destructive'}>\n {t(`courses.payoutStatus.${p.status}`) || p.status}\n </Badge>\n ) },\n ]\n\n return (\n <PageContainer\n title={t('courses.financial.title') || 'Financial settings'}\n subtitle={t('courses.financial.subtitle') || 'Balance, payouts and your Stripe connection.'}\n actions={\n <Button variant={connected ? 'outline' : 'default'} onClick={connectStripe}>\n {connected ? (t('courses.financial.connected') || 'Stripe connected') : (t('courses.financial.connect') || 'Connect Stripe')}\n </Button>\n }\n >\n {!connected && (\n <div className=\"mb-6 rounded-xl border border-amber-500/40 bg-amber-500/10 p-4 text-sm text-foreground\">\n {t('courses.financial.notConnected') || 'Connect your Stripe account to receive payouts. The platform fee is applied automatically on each sale.'}\n {account && (\n <span className=\"ml-1 text-muted-foreground\">\n ({t('courses.financial.platformFee') || 'Platform fee'}: {(account.platformFeeBps / 100).toFixed(2)}%)\n </span>\n )}\n </div>\n )}\n\n <StatGrid>\n <StatCard label={t('courses.financial.available') || 'Available balance'} value={formatMoney(summary?.availableBalance ?? 0, currency)} />\n <StatCard label={t('courses.financial.pending') || 'Pending balance'} value={formatMoney(summary?.pendingBalance ?? 0, currency)} />\n <StatCard label={t('courses.financial.revenue') || 'Total revenue'} value={formatMoney(summary?.totalRevenue ?? 0, currency)} />\n <StatCard label={t('courses.financial.feeCollected') || 'Platform fees'} value={formatMoney(summary?.platformFeeTotal ?? 0, currency)} hint={summary ? formatPercent(summary.refundRate, 1) + ' ' + (t('courses.financial.refundRate') || 'refund rate') : undefined} />\n </StatGrid>\n\n <h2 className=\"mb-3 text-sm font-semibold text-foreground\">{t('courses.financial.payouts') || 'Payouts'}</h2>\n <SimpleTable\n columns={columns}\n rows={payouts ?? []}\n empty={t('courses.financial.noPayouts') || 'No payouts yet.'}\n />\n </PageContainer>\n )\n}\nFinancialPage.displayName = 'FinancialPage'\n","import * as React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Order, type Course } from '@fayz-ai/courses'\nimport { PageContainer, SimpleTable, type SimpleColumn } from '../components/CommerceUI'\nimport { formatMoney } from '../lib/format'\n\ninterface Row {\n courseId: string\n title: string\n sales: number\n revenue: number\n currency: string\n}\n\nexport function ReportsPage() {\n const t = useTranslation()\n const [rows, setRows] = React.useState<Row[] | null>(null)\n\n React.useEffect(() => {\n const p = getCoursesProvider()\n void Promise.all([p.listCourses(), p.listOrders({ financialStatus: 'paid' })]).then(([courses, orders]) => {\n setRows(buildRevenueByCourse(courses, orders))\n })\n }, [])\n\n const columns: SimpleColumn<Row>[] = [\n { key: 'title', header: t('courses.reports.course') || 'Course', render: (r) => <span className=\"font-medium text-foreground\">{r.title}</span> },\n { key: 'sales', header: t('courses.reports.sales') || 'Sales', align: 'right', render: (r) => <span>{r.sales}</span> },\n { key: 'revenue', header: t('courses.reports.revenue') || 'Revenue', align: 'right', render: (r) => <span className=\"font-medium text-foreground\">{formatMoney(r.revenue, r.currency)}</span> },\n ]\n\n return (\n <PageContainer title={t('courses.reports.title') || 'Reports'} subtitle={t('courses.reports.subtitle') || 'Revenue by course.'}>\n <h2 className=\"mb-3 text-sm font-semibold text-foreground\">{t('courses.reports.byCourse') || 'Revenue by course'}</h2>\n <SimpleTable\n columns={columns}\n rows={rows ?? []}\n empty={t('courses.reports.empty') || 'No revenue yet.'}\n />\n </PageContainer>\n )\n}\nReportsPage.displayName = 'ReportsPage'\n\nfunction buildRevenueByCourse(courses: Course[], orders: Order[]): Row[] {\n const byCourse = new Map<string, { sales: number; revenue: number; currency: string }>()\n for (const o of orders) {\n const agg = byCourse.get(o.courseId) ?? { sales: 0, revenue: 0, currency: o.currency }\n agg.sales += 1\n agg.revenue = Math.round((agg.revenue + o.total) * 100) / 100\n byCourse.set(o.courseId, agg)\n }\n return courses\n .map((c) => {\n const agg = byCourse.get(c.id)\n return { courseId: c.id, title: c.title, sales: agg?.sales ?? 0, revenue: agg?.revenue ?? 0, currency: agg?.currency ?? c.currency }\n })\n .sort((a, b) => b.revenue - a.revenue)\n}\n","import * as React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { PluginSettingsPanel, SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/saas'\n\n// The course plugin's Settings tab. Reuses the saas settings shell\n// (PluginSettingsPanel + SettingsGroup/SelectRow/ToggleRow) instead of\n// hand-rolling a settings layout — same chrome as every other plugin. Stripe\n// Connect lives in the \"Integrations\" tab (a connector), not here.\n\nfunction CoursesGeneralSettings() {\n const t = useTranslation()\n const [currency, setCurrency] = React.useState('BRL')\n const [methods, setMethods] = React.useState({ card: true, pix: true, boleto: true })\n\n return (\n <div className=\"space-y-6\">\n <SettingsGroup\n title={t('courses.settings.payments') || 'Payments'}\n description={t('courses.settings.paymentsHelp') || 'Connect Stripe in the Integrations tab; the platform fee applies automatically.'}\n >\n <SelectRow\n label={t('courses.settings.currency') || 'Default currency'}\n value={currency}\n onChange={setCurrency}\n options={[\n { value: 'BRL', label: 'BRL (R$)' },\n { value: 'USD', label: 'USD ($)' },\n { value: 'EUR', label: 'EUR (€)' },\n ]}\n />\n </SettingsGroup>\n\n <SettingsGroup title={t('courses.settings.methods') || 'Payment methods'}>\n <ToggleRow label={t('courses.editor.payCard') || 'Credit card'} checked={methods.card} onChange={(v) => setMethods((m) => ({ ...m, card: v }))} />\n <ToggleRow label={t('courses.editor.payPix') || 'Pix'} checked={methods.pix} onChange={(v) => setMethods((m) => ({ ...m, pix: v }))} />\n <ToggleRow label={t('courses.editor.payBoleto') || 'Boleto'} checked={methods.boleto} onChange={(v) => setMethods((m) => ({ ...m, boleto: v }))} />\n </SettingsGroup>\n </div>\n )\n}\nCoursesGeneralSettings.displayName = 'CoursesGeneralSettings'\n\nexport function CoursesSettingsTab() {\n const t = useTranslation()\n return (\n <PluginSettingsPanel\n title={t('courses.settings.title') || 'Course settings'}\n subtitle={t('courses.settings.subtitle') || 'Payments, currency and checkout methods'}\n generalSettings={<CoursesGeneralSettings />}\n hostPluginId=\"courses\"\n routeBase=\"/settings/courses\"\n />\n )\n}\nCoursesSettingsTab.displayName = 'CoursesSettingsTab'\n","import * as React from 'react'\nimport type { DashboardWidgetDef } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { KpiCard, defineKpiWidget } from '@fayz-ai/ui'\nimport { getCoursesProvider, type FinancialSummary } from '@fayz-ai/courses'\nimport { formatMoney, formatPercent } from './lib/format'\n\n// Course KPIs contributed to the central admin Dashboard (rendered by\n// @fayz-ai/plugin-dashboard's DashboardCanvas, which auto-collects every\n// plugin's dashboardWidgets for surface 'home'). Mirrors Kiwify's dashboard.\n\nfunction useSummary(): FinancialSummary | null {\n const [summary, setSummary] = React.useState<FinancialSummary | null>(null)\n React.useEffect(() => {\n void getCoursesProvider().getFinancialSummary().then(setSummary)\n }, [])\n return summary\n}\n\nfunction RevenueKpi() {\n const t = useTranslation()\n const s = useSummary()\n return <KpiCard label={t('courses.kpi.revenue') || 'Total revenue'} icon=\"DollarSign\" loading={!s} value={s ? formatMoney(s.totalRevenue, s.currency) : undefined} />\n}\n\nfunction SalesKpi() {\n const t = useTranslation()\n const s = useSummary()\n return <KpiCard label={t('courses.kpi.sales') || 'Sales'} icon=\"TrendingUp\" loading={!s} value={s ? String(s.salesCount) : undefined} sub={s ? formatPercent(s.refundRate, 1) + ' ' + (t('courses.kpi.refunds') || 'refunds') : undefined} />\n}\n\nfunction MrrKpi() {\n const t = useTranslation()\n const s = useSummary()\n return <KpiCard label={t('courses.kpi.mrr') || 'MRR'} icon=\"Repeat\" loading={!s} value={s ? formatMoney(s.mrr, s.currency) : undefined} sub={s ? `${s.activeSubscriptions} ${t('courses.kpi.activeSubs') || 'active'}` : undefined} />\n}\n\nfunction FeesKpi() {\n const t = useTranslation()\n const s = useSummary()\n return <KpiCard label={t('courses.kpi.fees') || 'Platform fees'} icon=\"Percent\" loading={!s} value={s ? formatMoney(s.platformFeeTotal, s.currency) : undefined} />\n}\n\n/** Commerce KPIs are contributed only for the modules the host opted into —\n * a host embedding courses as a lightweight members feature must not get\n * revenue/MRR cards broadcast onto its home dashboard (FAY-1247 rule). */\nexport function createCoursesDashboardWidgets(\n modules: { sales?: boolean; subscriptions?: boolean; financial?: boolean } = {},\n): DashboardWidgetDef[] {\n return [\n ...(modules.sales\n ? [\n defineKpiWidget({ id: 'courses.kpi.revenue', title: 'courses.kpi.revenue', domain: 'courses', defaultOrder: 0, component: RevenueKpi }),\n defineKpiWidget({ id: 'courses.kpi.sales', title: 'courses.kpi.sales', domain: 'courses', defaultOrder: 1, component: SalesKpi }),\n ]\n : []),\n ...(modules.subscriptions\n ? [defineKpiWidget({ id: 'courses.kpi.mrr', title: 'courses.kpi.mrr', domain: 'courses', defaultOrder: 2, component: MrrKpi })]\n : []),\n ...(modules.financial\n ? [defineKpiWidget({ id: 'courses.kpi.fees', title: 'courses.kpi.fees', domain: 'courses', defaultOrder: 3, component: FeesKpi })]\n : []),\n ]\n}\n","import type { ConnectorDefinition } from '@fayz-ai/core'\nimport { getCoursesProvider } from '@fayz-ai/courses'\n\n// Stripe Connect modeled as a connector so it surfaces in the plugin's unified\n// \"Integrations\" settings tab (same pattern as Financial Settings → Integrações),\n// instead of a bespoke block in the General tab. The host plugin is 'courses'.\nexport function createStripeConnector(): ConnectorDefinition {\n return {\n id: 'stripe-connect',\n hostPluginId: 'courses',\n name: 'Stripe',\n description: 'Receba os pagamentos dos alunos; a taxa da plataforma é aplicada automaticamente.',\n icon: 'CreditCard',\n authKind: 'oauth',\n async getStatus() {\n try {\n const account = await getCoursesProvider().getCreatorAccount()\n const fee = (account.platformFeeBps / 100).toFixed(2)\n return {\n connected: !!account.stripeAccountId && account.chargesEnabled,\n detail: `Taxa da plataforma: ${fee}%`,\n }\n } catch {\n return { connected: false }\n }\n },\n async startOAuth(_redirectTo?: string): Promise<string> {\n // Stage 3 wires this to the `courses-connect-onboard` edge function and\n // returns the Stripe account-link URL to redirect to. Until then, surface\n // a clear message (ConnectorsHub toasts a thrown error's message).\n throw new Error('O onboarding do Stripe Connect é ligado na Etapa 3.')\n },\n }\n}\n","import * as React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { registerTranslations, registerPluginFactory } from '@fayz-ai/core'\nimport {\n getCoursesProviderOptional,\n setCoursesProvider,\n createMockCoursesProvider,\n setCoursesTenantResolver,\n} from '@fayz-ai/courses'\nimport { useOrganizationStore } from '@fayz-ai/saas'\nimport { coursesLocales } from './locales'\nimport { CoursesListPage } from './pages/CoursesListPage'\nimport { CourseEditorPage } from './pages/CourseEditorPage'\nimport { SalesPage } from './pages/SalesPage'\nimport { CourseOrderDetailView } from './views/CourseOrderDetailView'\nimport { SubscriptionsPage } from './pages/SubscriptionsPage'\nimport { FinancialPage } from './pages/FinancialPage'\nimport { ReportsPage } from './pages/ReportsPage'\nimport { CoursesSettingsTab } from './settings/CoursesSettings'\nimport { createCoursesDashboardWidgets } from './dashboardWidgets'\nimport { createStripeConnector } from './connectors/stripe'\n\n// ---------------------------------------------------------------------------\n// @fayz-ai/plugin-courses — admin management for the courses domain. This is a\n// PLUGIN, not an app: it only contributes nav + routes + settings + dashboard\n// widgets to the @fayz-ai/saas admin scaffold. Login, auth, permissions, the\n// sidebar/AppShell chrome and layout all come from @fayz-ai/saas — the plugin\n// never rebuilds them. Its screens render inside the saas AdminShell and use\n// @fayz-ai/ui primitives.\n// ---------------------------------------------------------------------------\n\nexport interface CoursesPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n /** Nav labels for the module entries (default English). */\n labels?: {\n membersArea?: string\n sales?: string\n subscriptions?: string\n financial?: string\n reports?: string\n }\n scope?: PluginScope\n verticalId?: VerticalId\n /**\n * Commerce-vertical modules — ALL OFF by default (the one architectural\n * rule: shared-surface contributions are opt-in, never broadcast — FAY-1247).\n * course-admin (the vertical owner) enables everything via its PluginRef\n * config; a host embedding courses as a lightweight members feature (e.g.\n * agency-os's \"Memberships\") gets only the base nav entry + editor.\n */\n modules?: {\n membersArea?: boolean\n sales?: boolean\n subscriptions?: boolean\n financial?: boolean\n reports?: boolean\n }\n}\n\nconst asComp = (c: unknown) => c as React.ComponentType<unknown>\nconst read = (feature: string) => ({ feature, action: 'read' as const })\n\nexport function createCoursesPlugin(options?: CoursesPluginOptions): PluginManifest {\n // Register locales globally so keys resolve even before the I18nProvider mounts.\n registerTranslations(coursesLocales)\n\n // Scope Supabase queries to the active organization (the creator/tenant). The\n // mock provider ignores this; the Supabase provider appends .eq('tenant_id').\n setCoursesTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n // Defensive default: if the host app didn't set a provider, fall back to a\n // mock so the admin still renders. Apps that share admin↔member set their own.\n if (!getCoursesProviderOptional()) {\n setCoursesProvider(createMockCoursesProvider())\n }\n\n const base = options?.navPosition ?? 1\n const section = options?.navSection ?? 'main'\n const modules = options?.modules ?? {}\n\n // Opt-in nav/routes per module. Position offsets stay stable relative to the\n // enabled set so hosts control exactly where the block sits.\n const labels = options?.labels ?? {}\n const navigation = [\n { section, position: base, label: options?.navLabel ?? 'Courses', route: '/courses', icon: 'BookOpen', permission: read('courses') },\n // The members area is no longer a standalone nav entry — it lives inside each\n // course's record (CourseEditorPage → \"Alunos\" tab). modules.membersArea is\n // kept accepted-but-inert for backward compat with existing manifests.\n ...(modules.sales ? [{ section, position: base + 2, label: labels.sales ?? 'Sales', route: '/courses/sales', icon: 'TrendingUp', permission: read('courses.sales') }] : []),\n ...(modules.subscriptions ? [{ section, position: base + 3, label: labels.subscriptions ?? 'Subscriptions', route: '/courses/subscriptions', icon: 'Repeat', permission: read('courses.sales') }] : []),\n ...(modules.financial ? [{ section, position: base + 4, label: labels.financial ?? 'Financial', route: '/courses/financial', icon: 'CreditCard', permission: read('courses.finance') }] : []),\n ...(modules.reports ? [{ section, position: base + 5, label: labels.reports ?? 'Reports', route: '/courses/reports', icon: 'BarChart3', permission: read('courses.sales') }] : []),\n ]\n\n const routes = [\n // Static segments outscore the `:id` param in the saas router, so these\n // resolve before the editor route (AdminShell sorts by routeScore).\n { path: '/courses', component: asComp(CoursesListPage), permission: read('courses') },\n ...(modules.sales ? [{ path: '/courses/sales', component: asComp(SalesPage), permission: read('courses.sales') }] : []),\n // Order detail — static `/courses/sales/:id` outscores `/courses/:id`.\n ...(modules.sales ? [{ path: '/courses/sales/:id', component: asComp(CourseOrderDetailView), permission: read('courses.sales') }] : []),\n ...(modules.subscriptions ? [{ path: '/courses/subscriptions', component: asComp(SubscriptionsPage), permission: read('courses.sales') }] : []),\n ...(modules.financial ? [{ path: '/courses/financial', component: asComp(FinancialPage), permission: read('courses.finance') }] : []),\n ...(modules.reports ? [{ path: '/courses/reports', component: asComp(ReportsPage), permission: read('courses.sales') }] : []),\n { path: '/courses/:id', component: asComp(CourseEditorPage) },\n ]\n\n return {\n id: 'courses',\n name: options?.navLabel ?? 'Courses',\n icon: 'BookOpen',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n // LMS is its own business model with opt-in commerce modules\n // (members/sales/subscriptions — see modules.* below) — targets the\n // saas/admin Panel world rather than the ecommerce storefront.\n scaffolds: ['saas'],\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'courses', label: 'Courses', group: 'Courses' },\n { id: 'courses.sales', label: 'Sales', group: 'Courses' },\n { id: 'courses.finance', label: 'Financial', group: 'Courses' },\n ],\n declaredLimits: [\n { key: 'courses', label: 'Courses', table: 'plg_courses_courses' },\n ],\n navigation,\n routes,\n widgets: [],\n // Commerce KPIs on the shared 'home' surface follow the same opt-in rule:\n // no module enabled → no widgets broadcast into a host's dashboard.\n dashboardWidgets: createCoursesDashboardWidgets(modules),\n connectors: [createStripeConnector()],\n settings: [\n { id: 'courses', label: 'Courses', icon: 'BookOpen', component: asComp(CoursesSettingsTab), order: 20, permission: read('courses') },\n ],\n locales: coursesLocales,\n }\n}\n\n// Self-register the factory so renderApp(manifest) with a PluginRef { id:\n// 'courses' } resolves without a separate plugins.generated.ts entry (apps may\n// still register explicitly; registration is idempotent on id).\nregisterPluginFactory('courses', createCoursesPlugin as (config?: Record<string, unknown>) => PluginManifest)\n\nexport { coursesLocales } from './locales'\n"]}
1
+ {"version":3,"sources":["../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/lib/nav.ts","../src/views/CoursesListPage.tsx","../src/lib/format.ts","../src/components/CommerceUI.tsx","../src/views/CourseEditorPage.tsx","../src/views/SalesPage.tsx","../src/views/CourseOrderDetailView.tsx","../src/views/SubscriptionsPage.tsx","../src/views/FinancialPage.tsx","../src/views/ReportsPage.tsx","../src/settings/CoursesSettings.tsx","../src/components/dashboardWidgets.tsx","../src/integrations/kiwify/data.ts","../src/integrations/kiwify/connectorDef.tsx","../src/index.ts"],"names":["React","jsxs","jsx","React2","useTranslation","getCoursesProvider","Badge","Button","Skeleton","statusVariant","React4","store","React5","SharedOrderDetailView","React6","React7","React8","React9","React10","getSupabaseClientOptional","useState","useEffect","useMemo","toast","Loader2","Page","React12"],"mappings":"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","file":"index.js","sourcesContent":["export const en: Record<string, string> = {\n 'courses.nav': 'Courses',\n 'courses.title': 'Courses',\n 'courses.new': 'New course',\n 'courses.empty': 'No courses yet. Create your first one.',\n 'courses.count': '{count} courses',\n 'courses.students': 'students',\n 'courses.lessons': 'lessons',\n 'courses.status.draft': 'Draft',\n 'courses.status.published': 'Published',\n 'courses.status.archived': 'Archived',\n 'courses.editor.details': 'Details',\n 'courses.editor.curriculum': 'Curriculum',\n 'courses.editor.fieldTitle': 'Title',\n 'courses.editor.fieldSubtitle': 'Subtitle',\n 'courses.editor.fieldDescription': 'Description',\n 'courses.editor.fieldPrice': 'Price',\n 'courses.editor.fieldStatus': 'Status',\n 'courses.editor.save': 'Save',\n 'courses.editor.saved': 'Course saved',\n 'courses.editor.saveFailed': 'Could not save the course',\n 'courses.editor.unsaved': 'Unsaved changes',\n // General tab\n 'courses.editor.sectionBasics': 'Basics',\n 'courses.editor.sectionThumbnail': 'Cover image',\n 'courses.editor.sectionPricing': 'Pricing & status',\n 'courses.editor.descriptionPlaceholder': 'What will students learn?',\n 'courses.editor.fieldDelivery': 'Format',\n 'courses.editor.deliveryHint': 'How this course is delivered.',\n 'courses.editor.delivery.online': 'Online',\n 'courses.editor.delivery.in_person': 'In person',\n 'courses.editor.delivery.hybrid': 'Hybrid',\n 'courses.editor.thumbnailHint': 'Shown on the storefront and in listings. 1280×720 recommended.',\n 'courses.editor.thumbnailUpload': 'Upload image',\n 'courses.editor.thumbnailUrl': 'Or paste an image URL',\n 'courses.editor.thumbnailEmpty': 'No image',\n 'courses.editor.thumbnailUploaded': 'Image uploaded — remember to save.',\n 'courses.editor.uploading': 'Uploading…',\n 'courses.editor.uploadFailed': 'Could not upload the image',\n 'courses.editor.uploadUnavailable': 'Upload unavailable — paste an image URL instead.',\n // Curriculum tab\n 'courses.editor.addModule': 'Add module',\n 'courses.editor.moduleTitle': 'Module title',\n 'courses.editor.moduleAdded': 'Module added',\n 'courses.editor.addLesson': 'Add lesson',\n 'courses.editor.lessonTitle': 'Lesson title',\n 'courses.editor.lessonVideo': 'Video URL (embed)',\n 'courses.editor.lessonDuration': 'Duration (min)',\n 'courses.editor.deleteModule': 'Delete module',\n 'courses.editor.deleteLesson': 'Remove lesson',\n 'courses.editor.deleted': 'Removed',\n 'courses.editor.autosaved': 'Changes are saved automatically.',\n 'courses.editor.modulesEmpty': 'No modules yet',\n 'courses.editor.modulesEmptyHint': 'Create a module to start organizing your lessons.',\n 'courses.editor.lessonsEmpty': 'No lessons in this module yet.',\n 'courses.editor.deleteModuleConfirm': 'Delete this module?',\n 'courses.editor.deleteModuleConfirmBody': 'Its lessons will be removed too. This cannot be undone.',\n 'courses.editor.deleteLessonConfirm': 'Remove this lesson?',\n 'courses.editor.deleteLessonConfirmBody': 'This cannot be undone.',\n 'courses.editor.confirmDelete': 'Delete',\n 'courses.editor.cancel': 'Cancel',\n // Curriculum tree builder\n 'courses.editor.newModule': 'New module',\n 'courses.editor.firstModule': 'Create first module',\n 'courses.editor.newLesson': 'New lesson',\n 'courses.editor.firstLesson': 'Add the first lesson',\n 'courses.editor.moduleLabel': 'module',\n 'courses.editor.moduleLabelPlural': 'modules',\n 'courses.editor.lessonUnitOne': 'lesson',\n 'courses.editor.lessonUnitOther': 'lessons',\n 'courses.editor.noLessons': 'No lessons',\n 'courses.editor.minShort': 'min',\n 'courses.editor.hourShort': 'h',\n 'courses.editor.dragToReorder': 'Drag to reorder',\n 'courses.editor.expand': 'Expand',\n 'courses.editor.collapse': 'Collapse',\n 'courses.editor.editLesson': 'Edit lesson',\n 'courses.editor.addVideo': 'Add video',\n 'courses.editor.videoSet': 'Video',\n 'courses.editor.videoUrlLabel': 'Video URL',\n 'courses.editor.videoUrlPlaceholder': 'Paste the video link (YouTube, Vimeo…)',\n 'courses.editor.reorderFailed': 'Could not reorder',\n // Members area\n 'courses.editor.membersHelp': 'Buyers are enrolled automatically through orders and get access to all of this course’s content.',\n 'courses.editor.enrolledStudents': 'Enrolled students',\n 'courses.editor.membersEmpty': 'No students yet',\n 'courses.editor.membersEmptyHint': 'Buyers are enrolled here automatically after a paid order.',\n 'courses.editor.accessUnlockedBy': 'Access is unlocked by',\n 'courses.editor.membersNote': 'Buying any offer grants full access to this course’s content.',\n 'courses.editor.untitledCourse': 'Untitled course',\n 'courses.editor.untitledModule': 'New module',\n 'courses.editor.untitledLesson': 'New lesson',\n // Editor tabs\n 'courses.editor.tab.details': 'General',\n 'courses.editor.tab.curriculum': 'Curriculum',\n 'courses.editor.tab.offers': 'Offers',\n 'courses.editor.tab.members': 'Members area',\n // Payment methods (used by the Courses plugin settings surface)\n 'courses.editor.payCard': 'Credit card (up to 12x)',\n 'courses.editor.payPix': 'Pix',\n 'courses.editor.payBoleto': 'Boleto',\n // Offers\n 'courses.offers.help': 'Price points for this course. Sales run through orders and the Financeiro module.',\n 'courses.offers.name': 'Offer name',\n 'courses.offers.price': 'Price',\n 'courses.offers.kind': 'Type',\n 'courses.offers.oneTime': 'One-time',\n 'courses.offers.subscription': 'Subscription',\n 'courses.offers.interval': 'Billing interval',\n 'courses.offers.default': 'Default',\n 'courses.offers.bump': 'Order bump',\n 'courses.offers.remove': 'Remove',\n 'courses.offers.add': 'Add offer',\n 'courses.offers.added': 'Offer added',\n 'courses.offers.removed': 'Offer removed',\n 'courses.offers.newName': 'New offer',\n 'courses.offers.empty': 'No offers yet',\n 'courses.offers.emptyHint': 'Create an offer to sell this course.',\n 'courses.offers.firstOffer': 'Create first offer',\n 'courses.offers.checkoutFlagsNote': 'Apply once the public checkout ships (coming soon).',\n // Sales\n 'courses.sales.title': 'Sales',\n 'courses.order.title': 'Order',\n 'courses.order.notFound': 'Order not found',\n 'courses.order.noInstallments': 'No installments.',\n 'courses.sales.subtitle': 'Every transaction across your courses.',\n 'courses.sales.date': 'Date',\n 'courses.sales.customer': 'Customer',\n 'courses.sales.method': 'Method',\n 'courses.sales.status': 'Status',\n 'courses.sales.fee': 'Platform fee',\n 'courses.sales.amount': 'Amount',\n 'courses.sales.count': 'Sales',\n 'courses.sales.revenue': 'Revenue',\n 'courses.sales.empty': 'No sales yet.',\n 'courses.financialStatus.paid': 'Paid',\n 'courses.financialStatus.pending': 'Pending',\n 'courses.financialStatus.refunded': 'Refunded',\n 'courses.financialStatus.chargeback': 'Chargeback',\n // Subscriptions\n 'courses.subs.title': 'Subscriptions',\n 'courses.subs.subtitle': 'Recurring plans and MRR.',\n 'courses.subs.start': 'Start date',\n 'courses.subs.customer': 'Customer',\n 'courses.subs.status': 'Status',\n 'courses.subs.value': 'Net value',\n 'courses.subs.active': 'Active subscriptions',\n 'courses.subs.mrr': 'Monthly recurring revenue',\n 'courses.subs.empty': 'No subscriptions yet.',\n 'courses.subStatus.active': 'Active',\n 'courses.subStatus.canceled': 'Canceled',\n 'courses.subStatus.past_due': 'Past due',\n 'courses.interval.month': 'month',\n 'courses.interval.year': 'year',\n // Financial\n 'courses.financial.title': 'Financial settings',\n 'courses.financial.subtitle': 'Balance, payouts and your Stripe connection.',\n 'courses.financial.available': 'Available balance',\n 'courses.financial.pending': 'Pending balance',\n 'courses.financial.revenue': 'Total revenue',\n 'courses.financial.feeCollected': 'Platform fees',\n 'courses.financial.refundRate': 'refund rate',\n 'courses.financial.payouts': 'Payouts',\n 'courses.financial.noPayouts': 'No payouts yet.',\n 'courses.financial.date': 'Date',\n 'courses.financial.amount': 'Amount',\n 'courses.financial.status': 'Status',\n 'courses.payoutStatus.paid': 'Paid',\n 'courses.payoutStatus.pending': 'Pending',\n 'courses.payoutStatus.failed': 'Failed',\n // Reports\n 'courses.reports.title': 'Reports',\n 'courses.reports.subtitle': 'Revenue by course.',\n 'courses.reports.byCourse': 'Revenue by course',\n 'courses.reports.course': 'Course',\n 'courses.reports.sales': 'Sales',\n 'courses.reports.revenue': 'Revenue',\n 'courses.reports.empty': 'No revenue yet.',\n // Members area\n 'courses.membersArea.title': 'Members area',\n 'courses.membersArea.subtitle': 'One area per course; students land here after purchase.',\n 'courses.membersArea.name': 'Members area',\n 'courses.membersArea.status': 'Status',\n 'courses.membersArea.students': 'Students',\n 'courses.membersArea.empty': 'No members areas yet.',\n // Settings\n 'courses.settings.title': 'Course settings',\n 'courses.settings.subtitle': 'Payments, currency and checkout methods',\n 'courses.settings.payments': 'Payments',\n 'courses.settings.paymentsHelp': 'Connect Stripe in the Integrations tab; the platform fee applies automatically.',\n 'courses.settings.currency': 'Default currency',\n 'courses.settings.methods': 'Payment methods',\n // Dashboard KPIs\n 'courses.kpi.revenue': 'Total revenue',\n 'courses.kpi.sales': 'Sales',\n 'courses.kpi.refunds': 'refunds',\n 'courses.kpi.mrr': 'Recurring revenue (MRR)',\n 'courses.kpi.activeSubs': 'active',\n 'courses.kpi.fees': 'Platform fees',\n}\n","export const ptBR: Record<string, string> = {\n 'courses.nav': 'Cursos',\n 'courses.title': 'Cursos',\n 'courses.new': 'Novo curso',\n 'courses.empty': 'Nenhum curso ainda. Crie o primeiro.',\n 'courses.count': '{count} cursos',\n 'courses.students': 'alunos',\n 'courses.lessons': 'aulas',\n 'courses.status.draft': 'Rascunho',\n 'courses.status.published': 'Publicado',\n 'courses.status.archived': 'Arquivado',\n 'courses.editor.details': 'Detalhes',\n 'courses.editor.curriculum': 'Conteúdo',\n 'courses.editor.fieldTitle': 'Título',\n 'courses.editor.fieldSubtitle': 'Subtítulo',\n 'courses.editor.fieldDescription': 'Descrição',\n 'courses.editor.fieldPrice': 'Preço',\n 'courses.editor.fieldStatus': 'Status',\n 'courses.editor.save': 'Salvar',\n 'courses.editor.saved': 'Curso salvo',\n 'courses.editor.saveFailed': 'Não foi possível salvar o curso',\n 'courses.editor.unsaved': 'Alterações não salvas',\n // Geral tab\n 'courses.editor.sectionBasics': 'Informações básicas',\n 'courses.editor.sectionThumbnail': 'Imagem de capa',\n 'courses.editor.sectionPricing': 'Preço e publicação',\n 'courses.editor.descriptionPlaceholder': 'O que o aluno vai aprender?',\n 'courses.editor.fieldDelivery': 'Formato',\n 'courses.editor.deliveryHint': 'Como o curso é entregue.',\n 'courses.editor.delivery.online': 'Online',\n 'courses.editor.delivery.in_person': 'Presencial',\n 'courses.editor.delivery.hybrid': 'Híbrido',\n 'courses.editor.thumbnailHint': 'Aparece na loja e nas listagens. Recomendado 1280×720.',\n 'courses.editor.thumbnailUpload': 'Enviar imagem',\n 'courses.editor.thumbnailUrl': 'Ou cole uma URL de imagem',\n 'courses.editor.thumbnailEmpty': 'Sem imagem',\n 'courses.editor.thumbnailUploaded': 'Imagem enviada — lembre de salvar.',\n 'courses.editor.uploading': 'Enviando…',\n 'courses.editor.uploadFailed': 'Não foi possível enviar a imagem',\n 'courses.editor.uploadUnavailable': 'Upload indisponível — cole uma URL de imagem.',\n // Conteúdo tab\n 'courses.editor.addModule': 'Adicionar módulo',\n 'courses.editor.moduleTitle': 'Título do módulo',\n 'courses.editor.moduleAdded': 'Módulo adicionado',\n 'courses.editor.addLesson': 'Adicionar aula',\n 'courses.editor.lessonTitle': 'Título da aula',\n 'courses.editor.lessonVideo': 'URL do vídeo (embed)',\n 'courses.editor.lessonDuration': 'Duração (min)',\n 'courses.editor.deleteModule': 'Excluir módulo',\n 'courses.editor.deleteLesson': 'Remover aula',\n 'courses.editor.deleted': 'Removido',\n 'courses.editor.autosaved': 'As alterações são salvas automaticamente.',\n 'courses.editor.modulesEmpty': 'Nenhum módulo ainda',\n 'courses.editor.modulesEmptyHint': 'Crie um módulo para começar a organizar as aulas.',\n 'courses.editor.lessonsEmpty': 'Nenhuma aula neste módulo ainda.',\n 'courses.editor.deleteModuleConfirm': 'Excluir este módulo?',\n 'courses.editor.deleteModuleConfirmBody': 'As aulas deste módulo também serão removidas. Isso não pode ser desfeito.',\n 'courses.editor.deleteLessonConfirm': 'Remover esta aula?',\n 'courses.editor.deleteLessonConfirmBody': 'Isso não pode ser desfeito.',\n 'courses.editor.confirmDelete': 'Excluir',\n 'courses.editor.cancel': 'Cancelar',\n // Curriculum tree builder\n 'courses.editor.newModule': 'Novo módulo',\n 'courses.editor.firstModule': 'Criar primeiro módulo',\n 'courses.editor.newLesson': 'Nova aula',\n 'courses.editor.firstLesson': 'Adicione a primeira aula',\n 'courses.editor.moduleLabel': 'módulo',\n 'courses.editor.moduleLabelPlural': 'módulos',\n 'courses.editor.lessonUnitOne': 'aula',\n 'courses.editor.lessonUnitOther': 'aulas',\n 'courses.editor.noLessons': 'Sem aulas',\n 'courses.editor.minShort': 'min',\n 'courses.editor.hourShort': 'h',\n 'courses.editor.dragToReorder': 'Arraste para reordenar',\n 'courses.editor.expand': 'Expandir',\n 'courses.editor.collapse': 'Recolher',\n 'courses.editor.editLesson': 'Editar aula',\n 'courses.editor.addVideo': 'Adicionar vídeo',\n 'courses.editor.videoSet': 'Vídeo',\n 'courses.editor.videoUrlLabel': 'URL do vídeo',\n 'courses.editor.videoUrlPlaceholder': 'Cole o link do vídeo (YouTube, Vimeo…)',\n 'courses.editor.reorderFailed': 'Não foi possível reordenar',\n // Área de membros\n 'courses.editor.membersHelp': 'Quem compra este curso é matriculado automaticamente pelos pedidos e ganha acesso a todo o conteúdo.',\n 'courses.editor.enrolledStudents': 'Alunos matriculados',\n 'courses.editor.membersEmpty': 'Nenhum aluno ainda',\n 'courses.editor.membersEmptyHint': 'Os compradores são matriculados aqui automaticamente após um pedido pago.',\n 'courses.editor.accessUnlockedBy': 'Acesso liberado por',\n 'courses.editor.membersNote': 'Comprar qualquer oferta libera o acesso completo ao conteúdo deste curso.',\n 'courses.editor.untitledCourse': 'Curso sem título',\n 'courses.editor.untitledModule': 'Novo módulo',\n 'courses.editor.untitledLesson': 'Nova aula',\n // Editor tabs\n 'courses.editor.tab.details': 'Geral',\n 'courses.editor.tab.curriculum': 'Conteúdo',\n 'courses.editor.tab.offers': 'Ofertas',\n 'courses.editor.tab.members': 'Área de membros',\n // Métodos de pagamento (usados na tela de configurações do plugin de Cursos)\n 'courses.editor.payCard': 'Cartão de crédito (até 12x)',\n 'courses.editor.payPix': 'Pix',\n 'courses.editor.payBoleto': 'Boleto',\n // Offers\n 'courses.offers.help': 'Preços deste curso. As vendas acontecem pelos pedidos e pelo Financeiro.',\n 'courses.offers.name': 'Nome da oferta',\n 'courses.offers.price': 'Preço',\n 'courses.offers.kind': 'Tipo',\n 'courses.offers.oneTime': 'Único',\n 'courses.offers.subscription': 'Assinatura',\n 'courses.offers.interval': 'Intervalo de cobrança',\n 'courses.offers.default': 'Padrão',\n 'courses.offers.bump': 'Order bump',\n 'courses.offers.remove': 'Remover',\n 'courses.offers.add': 'Adicionar oferta',\n 'courses.offers.added': 'Oferta adicionada',\n 'courses.offers.removed': 'Oferta removida',\n 'courses.offers.newName': 'Nova oferta',\n 'courses.offers.empty': 'Nenhuma oferta ainda',\n 'courses.offers.emptyHint': 'Crie uma oferta para vender este curso.',\n 'courses.offers.firstOffer': 'Criar primeira oferta',\n 'courses.offers.checkoutFlagsNote': 'Aplicam-se quando o checkout público entrar no ar (em breve).',\n // Sales\n 'courses.sales.title': 'Vendas',\n 'courses.order.title': 'Pedido',\n 'courses.order.notFound': 'Pedido não encontrado',\n 'courses.order.noInstallments': 'Sem parcelas.',\n 'courses.sales.subtitle': 'Todas as transações dos seus cursos.',\n 'courses.sales.date': 'Data',\n 'courses.sales.customer': 'Cliente',\n 'courses.sales.method': 'Método',\n 'courses.sales.status': 'Status',\n 'courses.sales.fee': 'Taxa da plataforma',\n 'courses.sales.amount': 'Valor',\n 'courses.sales.count': 'Vendas',\n 'courses.sales.revenue': 'Receita',\n 'courses.sales.empty': 'Nenhuma venda ainda.',\n 'courses.financialStatus.paid': 'Pago',\n 'courses.financialStatus.pending': 'Pendente',\n 'courses.financialStatus.refunded': 'Reembolsado',\n 'courses.financialStatus.chargeback': 'Chargeback',\n // Subscriptions\n 'courses.subs.title': 'Assinaturas',\n 'courses.subs.subtitle': 'Planos recorrentes e MRR.',\n 'courses.subs.start': 'Início',\n 'courses.subs.customer': 'Cliente',\n 'courses.subs.status': 'Status',\n 'courses.subs.value': 'Valor líquido',\n 'courses.subs.active': 'Assinaturas ativas',\n 'courses.subs.mrr': 'Receita recorrente mensal',\n 'courses.subs.empty': 'Nenhuma assinatura ainda.',\n 'courses.subStatus.active': 'Ativa',\n 'courses.subStatus.canceled': 'Cancelada',\n 'courses.subStatus.past_due': 'Em atraso',\n 'courses.interval.month': 'mês',\n 'courses.interval.year': 'ano',\n // Financial\n 'courses.financial.title': 'Financeiro',\n 'courses.financial.subtitle': 'Saldo, saques e sua conexão com o Stripe.',\n 'courses.financial.available': 'Saldo disponível',\n 'courses.financial.pending': 'Saldo pendente',\n 'courses.financial.revenue': 'Receita total',\n 'courses.financial.feeCollected': 'Taxas da plataforma',\n 'courses.financial.refundRate': 'taxa de reembolso',\n 'courses.financial.payouts': 'Saques',\n 'courses.financial.noPayouts': 'Nenhum saque ainda.',\n 'courses.financial.date': 'Data',\n 'courses.financial.amount': 'Valor',\n 'courses.financial.status': 'Status',\n 'courses.payoutStatus.paid': 'Concluído',\n 'courses.payoutStatus.pending': 'Pendente',\n 'courses.payoutStatus.failed': 'Falhou',\n // Reports\n 'courses.reports.title': 'Relatórios',\n 'courses.reports.subtitle': 'Receita por curso.',\n 'courses.reports.byCourse': 'Receita por curso',\n 'courses.reports.course': 'Curso',\n 'courses.reports.sales': 'Vendas',\n 'courses.reports.revenue': 'Receita',\n 'courses.reports.empty': 'Nenhuma receita ainda.',\n // Members area\n 'courses.membersArea.title': 'Área de membros',\n 'courses.membersArea.subtitle': 'Uma área por curso; o aluno entra após a compra.',\n 'courses.membersArea.name': 'Área de membros',\n 'courses.membersArea.status': 'Status',\n 'courses.membersArea.students': 'Alunos',\n 'courses.membersArea.empty': 'Nenhuma área de membros ainda.',\n // Settings\n 'courses.settings.title': 'Configurações do curso',\n 'courses.settings.subtitle': 'Pagamentos, moeda e métodos de checkout',\n 'courses.settings.payments': 'Pagamentos',\n 'courses.settings.paymentsHelp': 'Conecte o Stripe na aba Integrações; a taxa da plataforma é aplicada automaticamente.',\n 'courses.settings.currency': 'Moeda padrão',\n 'courses.settings.methods': 'Métodos de pagamento',\n // Dashboard KPIs\n 'courses.kpi.revenue': 'Receita total',\n 'courses.kpi.sales': 'Vendas',\n 'courses.kpi.refunds': 'reembolsos',\n 'courses.kpi.mrr': 'Receita recorrente (MRR)',\n 'courses.kpi.activeSubs': 'ativas',\n 'courses.kpi.fees': 'Taxas da plataforma',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const coursesLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import { hashRouterAdapter } from '@fayz-ai/core'\n\n// Shared hash-router adapter — the same singleton the admin shell drives, so\n// navigateTo here updates the shell's active route.\nconst adapter = hashRouterAdapter()\n\nexport function navigateTo(to: string): void {\n adapter.navigate(to)\n}\n","import * as React from 'react'\nimport { Button, Badge, PageHeaderActions, useModuleLayout, Skeleton } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Course } from '@fayz-ai/courses'\nimport { useLimitGuard, invalidateLimit, PermissionGate, usePermissionOptional } from '@fayz-ai/admin'\nimport { navigateTo } from '../lib/nav'\n\nfunction statusVariant(status: Course['status']): 'success' | 'secondary' | 'outline' {\n if (status === 'published') return 'success'\n if (status === 'archived') return 'outline'\n return 'secondary'\n}\n\nexport function CoursesListPage() {\n const t = useTranslation()\n // When the app shell owns the page header (sidebar/GHL-style layouts), don't\n // render our own title — and project the action button into the top bar.\n const shellOwnsHeader = useModuleLayout() === 'tabs'\n const [courses, setCourses] = React.useState<Course[] | null>(null)\n const [creating, setCreating] = React.useState(false)\n const guardCourses = useLimitGuard('courses')\n const can = usePermissionOptional()\n\n const load = React.useCallback(async () => {\n setCourses(await getCoursesProvider().listCourses())\n }, [])\n\n React.useEffect(() => {\n void load()\n }, [load])\n\n async function onCreate() {\n // Defense in depth: never create without the role's `create` action.\n if (!can('courses', 'create')) return\n // Plan quantity guard (client-side, before the provider call). Opens the\n // global UpgradeModal and aborts when the plan's course cap is reached.\n if ((await guardCourses()) === 'blocked') return\n setCreating(true)\n try {\n const course = await getCoursesProvider().createCourse({\n title: t('courses.editor.untitledCourse') || 'Untitled course',\n status: 'draft',\n })\n invalidateLimit('courses')\n navigateTo(`/courses/${course.id}`)\n } finally {\n setCreating(false)\n }\n }\n\n return (\n <div className=\"mx-auto max-w-6xl p-6 md:p-8\">\n {shellOwnsHeader ? (\n <PageHeaderActions>\n <PermissionGate feature=\"courses\" action=\"create\">\n <Button onClick={onCreate} disabled={creating}>\n {t('courses.new') || 'New course'}\n </Button>\n </PermissionGate>\n </PageHeaderActions>\n ) : (\n <div className=\"mb-6 flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">{t('courses.title') || 'Courses'}</h1>\n {courses && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {(t('courses.count') || '{count} courses').replace('{count}', String(courses.length))}\n </p>\n )}\n </div>\n <PermissionGate feature=\"courses\" action=\"create\">\n <Button onClick={onCreate} disabled={creating}>\n {t('courses.new') || 'New course'}\n </Button>\n </PermissionGate>\n </div>\n )}\n\n {courses && courses.length === 0 && (\n <div className=\"rounded-xl border border-dashed border-border p-12 text-center text-muted-foreground\">\n {t('courses.empty') || 'No courses yet. Create your first one.'}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {courses === null &&\n Array.from({ length: 6 }).map((_, i) => <CourseCardSkeleton key={i} />)}\n {courses?.map((course) => (\n <button\n key={course.id}\n onClick={() => navigateTo(`/courses/${course.id}`)}\n className=\"group overflow-hidden rounded-xl border border-border bg-card text-left transition hover:border-primary hover:shadow-md\"\n >\n <div className=\"aspect-video w-full overflow-hidden bg-muted\">\n {course.thumbnailUrl && (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={course.thumbnailUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n )}\n </div>\n <div className=\"space-y-2 p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3 className=\"font-semibold text-foreground line-clamp-2\">{course.title}</h3>\n <Badge variant={statusVariant(course.status)}>\n {t(`courses.status.${course.status}`) || course.status}\n </Badge>\n </div>\n {course.subtitle && (\n <p className=\"text-sm text-muted-foreground line-clamp-2\">{course.subtitle}</p>\n )}\n <p className=\"text-sm font-medium text-foreground\">\n {course.price > 0 ? `${course.currency} ${course.price.toFixed(2)}` : '—'}\n </p>\n </div>\n </button>\n ))}\n </div>\n </div>\n )\n}\nCoursesListPage.displayName = 'CoursesListPage'\n\n/** Loading placeholder mirroring the course card layout. */\nfunction CourseCardSkeleton() {\n return (\n <div className=\"overflow-hidden rounded-xl border border-border bg-card\">\n <Skeleton className=\"aspect-video w-full rounded-none\" />\n <div className=\"space-y-3 p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n </div>\n <Skeleton className=\"h-3 w-full\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n </div>\n )\n}\n","// Small display helpers shared across the courses admin pages. Kept local so the\n// plugin depends only on @fayz-ai/core + @fayz-ai/ui + @fayz-ai/courses.\n\nexport function formatMoney(value: number, currency = 'BRL'): string {\n try {\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(value)\n } catch {\n return `${currency} ${value.toFixed(2)}`\n }\n}\n\nexport function formatDate(iso: string): string {\n try {\n return new Intl.DateTimeFormat('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric' }).format(new Date(iso))\n } catch {\n return iso.slice(0, 10)\n }\n}\n\nexport function formatPercent(fraction: number, digits = 0): string {\n return `${(fraction * 100).toFixed(digits)}%`\n}\n","import * as React from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Card, DataTable, HeaderTabs, type HeaderTab } from '@fayz-ai/ui'\n\n/**\n * Cabeçalho padrão das telas de comércio (Assinaturas, Relatórios, Financeiro\n * de cursos).\n *\n * Sem padding e sem max-width próprios: a shell já envolve toda página em\n * `p-3 md:p-6` (AdminShell). Reaplicar `p-6 md:p-8` aqui empurrava estas telas\n * 32px à direita do título na barra de topo e de todas as outras, e o\n * `mx-auto max-w-6xl` ainda as centralizava enquanto a barra ficava à esquerda.\n *\n * O <h1> continua: a barra de topo nomeia o item de menu e estas páginas não\n * têm outro cabeçalho. Vira duplicata quando o título repete o rótulo do menu —\n * é o que `subtitle` existe para desfazer.\n */\nexport function PageContainer({ title, subtitle, actions, navTabs, activeNavTab, onNavTabChange, children }: {\n title: string\n subtitle?: string\n actions?: React.ReactNode\n /** Listas irmãs com que esta divide uma faixa de abas (ver OrderListView). */\n navTabs?: HeaderTab[]\n activeNavTab?: string\n onNavTabChange?: (id: string) => void\n children: React.ReactNode\n}) {\n return (\n <div>\n {navTabs && navTabs.length > 0 ? (\n // Mesma linha de CrudListView/OrderListView: abas à esquerda, ações à\n // direita. Com abas o <h1> sai: a aba ativa já nomeia a tela, e a barra\n // de topo nomeia o grupo.\n <div className=\"mb-6 flex flex-wrap items-center justify-between gap-3\">\n <HeaderTabs\n tabs={navTabs}\n value={activeNavTab ?? navTabs[0]!.value}\n onChange={(v) => onNavTabChange?.(v)}\n />\n {actions}\n </div>\n ) : (\n <div className=\"mb-6 flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">{title}</h1>\n {subtitle && <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {actions}\n </div>\n )}\n {children}\n </div>\n )\n}\n\n/** A single KPI tile (revenue, sales, MRR…). */\nexport function StatCard({ label, value, hint }: { label: string; value: string; hint?: string }) {\n return (\n <Card className=\"p-5\">\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n <p className=\"mt-1 text-2xl font-bold text-foreground\">{value}</p>\n {hint && <p className=\"mt-1 text-xs text-muted-foreground\">{hint}</p>}\n </Card>\n )\n}\n\nexport function StatGrid({ children }: { children: React.ReactNode }) {\n return <div className=\"mb-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">{children}</div>\n}\n\n/** Empty/loading state for the tables. */\nexport function TableEmpty({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"rounded-xl border border-dashed border-border p-12 text-center text-sm text-muted-foreground\">\n {children}\n </div>\n )\n}\n\n/**\n * Standard empty state — an icon chip, a title, an optional description and a\n * call-to-action. Use anywhere a list/section can be legitimately empty so the\n * screen never shows a bare dashed box.\n */\nexport function EmptyState({ icon, title, description, action }: {\n icon?: React.ReactNode\n title: string\n description?: string\n action?: React.ReactNode\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center rounded-xl border border-dashed border-border bg-card/40 px-6 py-12 text-center\">\n {icon && (\n <div className=\"mb-3 flex h-11 w-11 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n {icon}\n </div>\n )}\n <p className=\"text-sm font-medium text-foreground\">{title}</p>\n {description && <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{description}</p>}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n )\n}\n\n/**\n * A muted, low-emphasis informational callout. Use to set honest expectations\n * (e.g. \"this applies to a feature that isn't shipped yet\") without dressing it\n * up as an interactive control. Wrap key phrases in <strong> for emphasis.\n */\nexport function InfoNote({ icon, children, className }: {\n icon?: React.ReactNode\n children: React.ReactNode\n className?: string\n}) {\n return (\n <div className={'flex items-start gap-2.5 rounded-lg border border-border bg-muted/40 px-3.5 py-3 text-sm text-muted-foreground ' + (className ?? '')}>\n {icon && <span className=\"mt-0.5 shrink-0 text-muted-foreground/80\">{icon}</span>}\n <div className=\"min-w-0 [&_strong]:font-medium [&_strong]:text-foreground\">{children}</div>\n </div>\n )\n}\n\n/** A titled card section — the house pattern for grouping form fields. */\nexport function SectionCard({ title, description, actions, children, className }: {\n title?: string\n description?: string\n actions?: React.ReactNode\n children: React.ReactNode\n className?: string\n}) {\n return (\n <Card className={'p-5 md:p-6 ' + (className ?? '')}>\n {(title || actions) && (\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <div>\n {title && <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>}\n {description && <p className=\"mt-0.5 text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions}\n </div>\n )}\n {children}\n </Card>\n )\n}\n\nexport interface SimpleColumn<T> {\n key: string\n header: string\n render: (row: T) => React.ReactNode\n align?: 'left' | 'right'\n}\n\n/**\n * Thin adapter over the design-system DataTable (@fayz-ai/ui): the commerce\n * pages describe columns declaratively; this maps them to tanstack ColumnDef so\n * we reuse DataTable's sorting/skeleton/empty chrome instead of a bespoke table.\n */\nexport function SimpleTable<T>({ columns, rows, empty, loading, onRowClick }: {\n columns: SimpleColumn<T>[]\n rows: T[]\n empty: string\n loading?: boolean\n onRowClick?: (row: T) => void\n}) {\n const cols = React.useMemo<ColumnDef<T>[]>(\n () => columns.map((c) => ({\n id: c.key,\n header: () => <div className={c.align === 'right' ? 'text-right' : ''}>{c.header}</div>,\n cell: ({ row }) => <div className={c.align === 'right' ? 'text-right' : ''}>{c.render(row.original)}</div>,\n })),\n [columns],\n )\n return (\n <DataTable\n columns={cols}\n data={rows}\n emptyMessage={empty}\n loading={loading}\n onRowClick={onRowClick ? (row: T) => onRowClick(row) : undefined}\n />\n )\n}\n","import * as React from 'react'\nimport {\n Button, Input, Badge, toast, Skeleton,\n Tabs, TabsList, TabsTrigger, TabsContent,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n SegmentedControl, type SegmentedOption,\n Checkbox, ConfirmDialog, useSaveBar,\n Separator, PageHeader,\n} from '@fayz-ai/ui'\nimport { useTranslation, getSupabaseClientOptional } from '@fayz-ai/core'\nimport {\n getCoursesProvider,\n type Course, type Module, type Lesson, type CourseStatus,\n type Offer, type OfferKind, type RecurringInterval, type Order,\n} from '@fayz-ai/courses'\n\n/** Derived from the Course model (the package doesn't re-export the union name). */\ntype CourseDeliveryType = Course['deliveryType']\nimport {\n Plus, Trash2, Check, ImagePlus, UploadCloud,\n Layers, Tag, Users, ShoppingCart, Loader2, Clock,\n GripVertical, ChevronDown, Video, FileText, PlayCircle, Lock, Info,\n} from 'lucide-react'\nimport {\n DndContext, closestCenter, PointerSensor, KeyboardSensor,\n useSensor, useSensors, type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy,\n useSortable, arrayMove,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { navigateTo } from '../lib/nav'\nimport { formatMoney } from '../lib/format'\nimport { EmptyState, SectionCard, InfoNote } from '../components/CommerceUI'\n\n/** Local alias for the translate function used across the tree builder below. */\ntype TFn = (key: string) => string\n\n/** A distinct enrolled student for this course, derived from its paid orders. */\ninterface CourseStudent {\n key: string\n name: string\n email: string | null\n since: string | null\n}\n\n/** Dedupe paid orders into one row per buyer (latest purchase kept). */\nfunction buildCourseStudents(orders: Order[]): CourseStudent[] {\n const byKey = new Map<string, CourseStudent>()\n for (const o of orders) {\n const key = o.customerId ?? o.customerEmail ?? o.id\n const existing = byKey.get(key)\n if (!existing || (o.createdAt && existing.since && o.createdAt > existing.since)) {\n byKey.set(key, {\n key,\n name: o.customerName ?? o.customerEmail ?? '—',\n email: o.customerEmail ?? null,\n since: o.createdAt ?? null,\n })\n }\n }\n return [...byKey.values()].sort((a, b) => (b.since ?? '').localeCompare(a.since ?? ''))\n}\n\nconst STATUSES: CourseStatus[] = ['draft', 'published', 'archived']\nconst DELIVERY_TYPES: CourseDeliveryType[] = ['online', 'in_person', 'hybrid']\n\nconst TABS = ['details', 'curriculum', 'offers', 'members'] as const\ntype Tab = (typeof TABS)[number]\n\nconst TAB_ICON: Record<Tab, React.ElementType> = {\n details: Tag,\n curriculum: Layers,\n offers: ShoppingCart,\n members: Users,\n}\n\n/** The editable subset of a course — used to detect unsaved changes on the Geral tab. */\nfunction editSnapshot(c: Course): string {\n return JSON.stringify({\n title: c.title, subtitle: c.subtitle, description: c.description,\n price: c.price, status: c.status, deliveryType: c.deliveryType, thumbnailUrl: c.thumbnailUrl,\n })\n}\n\nexport function CourseEditorPage({ id }: { id?: string }) {\n const t = useTranslation()\n const [tab, setTab] = React.useState<Tab>('details')\n const [course, setCourse] = React.useState<Course | null>(null)\n const [modules, setModules] = React.useState<Module[]>([])\n const [lessons, setLessons] = React.useState<Lesson[]>([])\n const [offers, setOffers] = React.useState<Offer[]>([])\n const [students, setStudents] = React.useState<CourseStudent[]>([])\n const [loading, setLoading] = React.useState(true)\n\n // Geral tab: explicit-save model with dirty tracking.\n const [savedSnap, setSavedSnap] = React.useState('')\n const [saving, setSaving] = React.useState(false)\n const [uploading, setUploading] = React.useState(false)\n const fileRef = React.useRef<HTMLInputElement>(null)\n\n // Delete confirmation for the curriculum tab.\n const [pendingDelete, setPendingDelete] = React.useState<\n { kind: 'module' | 'lesson'; id: string } | null\n >(null)\n // Id of a just-created module/lesson whose title input should grab focus.\n const [autoFocusId, setAutoFocusId] = React.useState<string | null>(null)\n\n const reload = React.useCallback(async () => {\n if (!id) return\n const provider = getCoursesProvider()\n const c = await provider.getCourse(id)\n setCourse(c)\n if (c) {\n setSavedSnap(editSnapshot(c))\n const [m, l, o, paidOrders] = await Promise.all([\n provider.listModules(c.id),\n provider.listLessons(c.id),\n provider.listOffers(c.id),\n provider.listOrders({ courseId: c.id, financialStatus: 'paid' }),\n ])\n setModules(m)\n setLessons(l)\n setOffers(o)\n setStudents(buildCourseStudents(paidOrders))\n }\n setLoading(false)\n }, [id])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const dirty = !!course && editSnapshot(course) !== savedSnap\n\n // Persist the Geral tab through the app's generic floating unsaved-changes bar\n // (the same SaveBar the rest of the CRUD uses) instead of an inline button.\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void saveDetails() },\n onDiscard: () => { void reload() },\n saveLabel: t('courses.editor.save') || 'Salvar',\n })\n\n // A volta vai para a barra de topo da shell, não para uma linha acima do\n // título — empilhados, a barra dizia \"Cursos\" e o link logo abaixo dizia\n // \"Voltar aos cursos\": a mesma navegação duas vezes, com uma linha de\n // distância. É o que CrudDetailPage já faz em toda ficha de registro, e de\n // quebra liga o Esc e o voltar entre módulos, que o botão inline não tinha.\n //\n // Chamado ANTES do early return do skeleton (regra dos hooks); com `current`\n // vazio o Breadcrumb desenha um placeholder pulsando enquanto o curso carrega.\n const header = (\n <PageHeader\n title={course?.title ?? ''}\n parentLabel={t('courses.title') || 'Courses'}\n onBack={() => navigateTo('/courses')}\n />\n )\n\n if (loading || !course) return <>{header}<EditorSkeleton /></>\n\n function patchCourse(patch: Partial<Course>) {\n setCourse((c) => (c ? { ...c, ...patch } : c))\n }\n\n async function saveDetails() {\n if (!course) return\n setSaving(true)\n try {\n await getCoursesProvider().updateCourse(course.id, {\n title: course.title,\n subtitle: course.subtitle ?? undefined,\n description: course.description ?? undefined,\n thumbnailUrl: course.thumbnailUrl ?? undefined,\n price: course.price,\n status: course.status,\n deliveryType: course.deliveryType,\n })\n setSavedSnap(editSnapshot(course))\n toast.success(t('courses.editor.saved') || 'Course saved')\n } catch {\n toast.error(t('courses.editor.saveFailed') || 'Could not save the course')\n } finally {\n setSaving(false)\n }\n }\n\n async function onPickThumbnail(e: React.ChangeEvent<HTMLInputElement>) {\n const file = e.target.files?.[0]\n if (!file || !course) return\n const supabase = getSupabaseClientOptional() as {\n storage?: {\n from: (b: string) => {\n upload: (p: string, f: File, o?: unknown) => Promise<{ error: unknown }>\n getPublicUrl: (p: string) => { data: { publicUrl: string } }\n }\n }\n } | null\n if (!supabase?.storage) {\n toast.error(t('courses.editor.uploadUnavailable') || 'Upload unavailable — paste an image URL instead.')\n if (fileRef.current) fileRef.current.value = ''\n return\n }\n setUploading(true)\n try {\n const ext = file.name.split('.').pop() || 'jpg'\n const path = `${course.id}/cover-${Date.now()}.${ext}`\n const bucket = supabase.storage.from('course-media')\n const { error } = await bucket.upload(path, file, { upsert: true, contentType: file.type })\n if (error) throw error\n const { data } = bucket.getPublicUrl(path)\n patchCourse({ thumbnailUrl: data.publicUrl })\n toast.success(t('courses.editor.thumbnailUploaded') || 'Image uploaded — remember to save.')\n } catch {\n toast.error(t('courses.editor.uploadFailed') || 'Could not upload the image')\n } finally {\n setUploading(false)\n if (fileRef.current) fileRef.current.value = ''\n }\n }\n\n // --- module / lesson mutations (persist immediately, then reload) ---------\n async function addModule() {\n const mod = await getCoursesProvider().createModule({ courseId: course!.id, title: t('courses.editor.untitledModule') || 'New module' })\n toast.success(t('courses.editor.moduleAdded') || 'Module added')\n await reload()\n setAutoFocusId(mod.id)\n }\n async function renameModule(moduleId: string, title: string) {\n await getCoursesProvider().updateModule(moduleId, { title })\n }\n async function addLesson(moduleId: string) {\n // Optimistic: drop the row at the END of the module's list immediately,\n // then persist in the background (swap the temp id for the real one, keeping\n // any edits made meanwhile). No full reload → no flash.\n const tempId = `tmp-${crypto.randomUUID()}`\n const nextOrder = lessons\n .filter((l) => l.moduleId === moduleId)\n .reduce((max, l) => Math.max(max, l.sortOrder), -1) + 1\n const optimistic: Lesson = {\n id: tempId,\n courseId: course!.id,\n moduleId,\n title: t('courses.editor.untitledLesson') || 'New lesson',\n description: null,\n videoUrl: '',\n durationSec: 0,\n sortOrder: nextOrder,\n }\n setLessons((ls) => [...ls, optimistic])\n setAutoFocusId(tempId)\n try {\n const real = await getCoursesProvider().createLesson({\n courseId: course!.id,\n moduleId,\n title: optimistic.title,\n videoUrl: '',\n })\n setLessons((ls) => ls.map((l) => (l.id === tempId ? { ...l, id: real.id } : l)))\n setAutoFocusId((cur) => (cur === tempId ? real.id : cur))\n } catch {\n setLessons((ls) => ls.filter((l) => l.id !== tempId))\n toast.error(t('courses.editor.saveFailed') || 'Could not add the lesson')\n }\n }\n async function patchLesson(lessonId: string, patch: Partial<Lesson>) {\n await getCoursesProvider().updateLesson(lessonId, {\n title: patch.title,\n videoUrl: patch.videoUrl,\n durationSec: patch.durationSec,\n description: patch.description ?? undefined,\n })\n }\n\n // Persist a new module order (optimistic — reload re-sorts by sort_order).\n async function reorderModules(orderedIds: string[]) {\n const prev = modules\n setModules(orderedIds.map((mid, i) => ({ ...prev.find((m) => m.id === mid)!, sortOrder: i })))\n try {\n await Promise.all(orderedIds.map((mid, i) => getCoursesProvider().updateModule(mid, { sortOrder: i })))\n } catch {\n toast.error(t('courses.editor.reorderFailed') || 'Could not reorder')\n } finally {\n await reload()\n }\n }\n // Persist a new lesson order within one module.\n async function reorderLessons(moduleId: string, orderedIds: string[]) {\n const prev = lessons\n const others = prev.filter((l) => l.moduleId !== moduleId)\n const reordered = orderedIds.map((lid, i) => ({ ...prev.find((l) => l.id === lid)!, sortOrder: i }))\n setLessons([...others, ...reordered])\n try {\n await Promise.all(orderedIds.map((lid, i) => getCoursesProvider().updateLesson(lid, { sortOrder: i })))\n } catch {\n toast.error(t('courses.editor.reorderFailed') || 'Could not reorder')\n } finally {\n await reload()\n }\n }\n\n async function confirmDelete() {\n if (!pendingDelete) return\n const provider = getCoursesProvider()\n if (pendingDelete.kind === 'module') await provider.deleteModule(pendingDelete.id)\n else await provider.deleteLesson(pendingDelete.id)\n toast.success(t('courses.editor.deleted') || 'Removed')\n setPendingDelete(null)\n await reload()\n }\n\n // --- offer mutations ------------------------------------------------------\n async function addOffer() {\n await getCoursesProvider().createOffer({\n courseId: course!.id,\n name: t('courses.offers.newName') || 'New offer',\n price: course!.price,\n kind: 'one_time',\n })\n toast.success(t('courses.offers.added') || 'Offer added')\n await reload()\n }\n async function patchOffer(offerId: string, patch: Partial<Offer>) {\n await getCoursesProvider().updateOffer(offerId, {\n name: patch.name,\n price: patch.price,\n kind: patch.kind,\n recurringInterval: patch.recurringInterval,\n isOrderBump: patch.isOrderBump,\n isDefault: patch.isDefault,\n })\n await reload()\n }\n async function deleteOffer(offerId: string) {\n await getCoursesProvider().deleteOffer(offerId)\n toast.success(t('courses.offers.removed') || 'Offer removed')\n await reload()\n }\n\n const deliveryOptions: SegmentedOption<CourseDeliveryType>[] = DELIVERY_TYPES.map((d) => ({\n value: d,\n label: t(`courses.editor.delivery.${d}`) || d,\n }))\n\n return (\n // Sem padding e sem max-width próprios: a shell já envolve toda página em\n // `p-3 md:p-6` (AdminShell). Reaplicar `p-6 md:p-8` aqui empurrava o editor\n // 32px à direita do título na barra de topo e de todas as outras telas, e o\n // `mx-auto max-w-4xl` ainda o centralizava enquanto a barra ficava à esquerda.\n <div className=\"space-y-6\">\n {/* Hero — mesma anatomia da ficha de registro (CrudDetailPage): imagem à\n esquerda, título e selos à direita. A capa 16:9 em w-36 fecha os mesmos\n ~80px de altura do avatar quadrado de lá, então a linha do cabeçalho\n tem a mesma altura em todo o app. Só leitura aqui — quem troca a\n imagem é o uploader na aba Geral. */}\n <div className=\"flex items-start gap-5\">\n <div className=\"aspect-video w-36 shrink-0 overflow-hidden rounded-2xl border border-border bg-muted shadow-sm\">\n {course.thumbnailUrl ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={course.thumbnailUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center text-muted-foreground\">\n <ImagePlus className=\"h-6 w-6\" />\n </div>\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-2\">\n <h1 className=\"truncate text-2xl font-bold text-foreground\">{course.title || (t('courses.editor.untitledCourse') || 'Untitled course')}</h1>\n <Badge variant={course.status === 'published' ? 'success' : course.status === 'archived' ? 'secondary' : 'outline'}>\n {t(`courses.status.${course.status}`) || course.status}\n </Badge>\n <Badge variant=\"outline\">{t(`courses.editor.delivery.${course.deliveryType}`) || course.deliveryType}</Badge>\n </div>\n </div>\n </div>\n\n <Separator />\n\n <Tabs value={tab} onValueChange={(v) => setTab(v as Tab)}>\n <TabsList className=\"max-w-full justify-start overflow-x-auto scrollbar-none\">\n {TABS.map((tk) => {\n const Icon = TAB_ICON[tk]\n return (\n <TabsTrigger key={tk} value={tk} className=\"gap-1.5\">\n <Icon className=\"h-3.5 w-3.5\" />\n {t(`courses.editor.tab.${tk}`) || tk}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n {/* ---- Geral ---------------------------------------------------- */}\n <TabsContent value=\"details\" className=\"mt-4 space-y-5\">\n <SectionCard title={t('courses.editor.sectionBasics') || 'Basics'}>\n <div className=\"space-y-4\">\n <Field label={t('courses.editor.fieldTitle') || 'Title'}>\n <Input value={course.title} onChange={(e) => patchCourse({ title: e.target.value })} />\n </Field>\n <Field label={t('courses.editor.fieldSubtitle') || 'Subtitle'}>\n <Input value={course.subtitle ?? ''} onChange={(e) => patchCourse({ subtitle: e.target.value })} />\n </Field>\n <Field label={t('courses.editor.fieldDescription') || 'Description'}>\n <Textarea\n value={course.description ?? ''}\n onChange={(e) => patchCourse({ description: e.target.value })}\n placeholder={t('courses.editor.descriptionPlaceholder') || 'What will students learn?'}\n />\n </Field>\n <Field label={t('courses.editor.fieldDelivery') || 'Format'} hint={t('courses.editor.deliveryHint') || 'How this course is delivered.'}>\n <SegmentedControl\n size=\"md\"\n options={deliveryOptions}\n value={course.deliveryType}\n onChange={(v) => patchCourse({ deliveryType: v })}\n aria-label={t('courses.editor.fieldDelivery') || 'Format'}\n />\n </Field>\n </div>\n </SectionCard>\n\n <SectionCard title={t('courses.editor.sectionThumbnail') || 'Cover image'} description={t('courses.editor.thumbnailHint') || 'Shown on the storefront and in listings. 1280×720 recommended.'}>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start\">\n <div className=\"aspect-video w-full shrink-0 overflow-hidden rounded-lg border border-border bg-muted sm:w-56\">\n {course.thumbnailUrl ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={course.thumbnailUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n <div className=\"flex h-full w-full flex-col items-center justify-center gap-1 text-muted-foreground\">\n <ImagePlus className=\"h-6 w-6\" />\n <span className=\"text-xs\">{t('courses.editor.thumbnailEmpty') || 'No image'}</span>\n </div>\n )}\n </div>\n <div className=\"flex-1 space-y-3\">\n <input ref={fileRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={onPickThumbnail} />\n <Button variant=\"outline\" size=\"sm\" disabled={uploading} onClick={() => fileRef.current?.click()}>\n {uploading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <UploadCloud className=\"h-4 w-4\" />}\n {uploading ? (t('courses.editor.uploading') || 'Uploading…') : (t('courses.editor.thumbnailUpload') || 'Upload image')}\n </Button>\n <Field label={t('courses.editor.thumbnailUrl') || 'Or paste an image URL'}>\n <Input\n value={course.thumbnailUrl ?? ''}\n placeholder=\"https://…\"\n onChange={(e) => patchCourse({ thumbnailUrl: e.target.value || null })}\n />\n </Field>\n </div>\n </div>\n </SectionCard>\n\n <SectionCard title={t('courses.editor.sectionPricing') || 'Pricing & status'}>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <Field label={t('courses.editor.fieldPrice') || 'Price'} hint={course.currency}>\n <Input\n type=\"number\"\n min={0}\n step=\"0.01\"\n inputMode=\"decimal\"\n value={String(course.price)}\n onChange={(e) => patchCourse({ price: Number(e.target.value) || 0 })}\n />\n </Field>\n <Field label={t('courses.editor.fieldStatus') || 'Status'}>\n <Select value={course.status} onValueChange={(v) => patchCourse({ status: v as CourseStatus })}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STATUSES.map((s) => (\n <SelectItem key={s} value={s}>{t(`courses.status.${s}`) || s}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n </div>\n </SectionCard>\n </TabsContent>\n\n {/* ---- Conteúdo ------------------------------------------------- */}\n <TabsContent value=\"curriculum\" className=\"mt-4 space-y-4\">\n <CurriculumBuilder\n t={t}\n modules={modules}\n lessons={lessons}\n autoFocusId={autoFocusId}\n onAutoFocused={() => setAutoFocusId(null)}\n onAddModule={addModule}\n onRenameModule={renameModule}\n onAddLesson={addLesson}\n onPatchLesson={patchLesson}\n onRequestDelete={(kind, delId) => setPendingDelete({ kind, id: delId })}\n onReorderModules={reorderModules}\n onReorderLessons={reorderLessons}\n />\n </TabsContent>\n\n {/* ---- Ofertas -------------------------------------------------- */}\n <TabsContent value=\"offers\" className=\"mt-4 space-y-4\">\n <InfoNote icon={<Info className=\"h-4 w-4\" />}>\n {t('courses.offers.help') || 'Price points for this course. Sales run through orders and the Financeiro module.'}\n </InfoNote>\n {offers.length === 0 ? (\n <EmptyState\n icon={<Tag className=\"h-5 w-5\" />}\n title={t('courses.offers.empty') || 'No offers yet'}\n description={t('courses.offers.emptyHint') || 'Create an offer to sell this course.'}\n action={<Button onClick={addOffer}><Plus className=\"h-4 w-4\" />{t('courses.offers.firstOffer') || 'Create first offer'}</Button>}\n />\n ) : (\n <>\n {offers.map((offer) => (\n <div key={offer.id} className=\"rounded-xl border border-border bg-card p-4 shadow-sm md:p-5\">\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <Badge variant=\"outline\" className=\"gap-1\">\n {offer.kind === 'subscription'\n ? (t('courses.offers.subscription') || 'Subscription')\n : (t('courses.offers.oneTime') || 'One-time')}\n </Badge>\n <button\n onClick={() => deleteOffer(offer.id)}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground/60 transition-colors hover:bg-destructive/10 hover:text-destructive\"\n aria-label={t('courses.offers.remove') || 'Remove'}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-[1fr_140px_160px]\">\n <Field label={t('courses.offers.name') || 'Offer name'}>\n <Input defaultValue={offer.name} onBlur={(e) => patchOffer(offer.id, { name: e.target.value })} />\n </Field>\n <Field label={t('courses.offers.price') || 'Price'} hint={offer.currency}>\n <Input type=\"number\" min={0} step=\"0.01\" inputMode=\"decimal\" defaultValue={String(offer.price)} onBlur={(e) => patchOffer(offer.id, { price: Number(e.target.value) || 0 })} />\n </Field>\n <Field label={t('courses.offers.kind') || 'Type'}>\n <Select\n value={offer.kind}\n onValueChange={(v) => patchOffer(offer.id, { kind: v as OfferKind, recurringInterval: v === 'subscription' ? (offer.recurringInterval ?? 'month') : null })}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"one_time\">{t('courses.offers.oneTime') || 'One-time'}</SelectItem>\n <SelectItem value=\"subscription\">{t('courses.offers.subscription') || 'Subscription'}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </div>\n\n {offer.kind === 'subscription' && (\n <div className=\"mt-3 max-w-[200px]\">\n <Field label={t('courses.offers.interval') || 'Billing interval'}>\n <Select\n value={offer.recurringInterval ?? 'month'}\n onValueChange={(v) => patchOffer(offer.id, { recurringInterval: v as RecurringInterval })}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"month\">{t('courses.interval.month') || 'month'}</SelectItem>\n <SelectItem value=\"year\">{t('courses.interval.year') || 'year'}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </div>\n )}\n\n {/* Storefront-only flags — de-emphasized: they persist but only take\n effect once the public checkout ships (deferred / bridge scope). */}\n <div className=\"mt-4 rounded-lg border border-dashed border-border bg-muted/30 p-3\">\n <p className=\"mb-2.5 flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"h-3.5 w-3.5\" />\n {t('courses.offers.checkoutFlagsNote') || 'Apply once the public checkout ships (coming soon).'}\n </p>\n <div className=\"flex flex-wrap items-center gap-x-5 gap-y-2\">\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-muted-foreground\">\n <Checkbox checked={offer.isDefault} onChange={(v) => patchOffer(offer.id, { isDefault: v })} />\n {t('courses.offers.default') || 'Default'}\n </label>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-muted-foreground\">\n <Checkbox checked={offer.isOrderBump} onChange={(v) => patchOffer(offer.id, { isOrderBump: v })} />\n {t('courses.offers.bump') || 'Order bump'}\n </label>\n </div>\n </div>\n </div>\n ))}\n <Button variant=\"outline\" onClick={addOffer} className=\"w-full border-dashed\">\n <Plus className=\"h-4 w-4\" />{t('courses.offers.add') || 'Add offer'}\n </Button>\n </>\n )}\n </TabsContent>\n\n {/* ---- Área de membros ----------------------------------------- */}\n <TabsContent value=\"members\" className=\"mt-4 space-y-4\">\n <InfoNote icon={<Users className=\"h-4 w-4\" />}>\n {t('courses.editor.membersHelp') || 'Buyers are enrolled automatically through orders and get access to all of this course’s content.'}\n </InfoNote>\n\n {/* Enrolled students for THIS course (the actual \"área de membros\"). */}\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {(t('courses.editor.enrolledStudents') || 'Enrolled students')} ({students.length})\n </p>\n {students.length === 0 ? (\n <EmptyState\n icon={<Users className=\"h-5 w-5\" />}\n title={t('courses.editor.membersEmpty') || 'No students yet'}\n description={t('courses.editor.membersEmptyHint') || 'Buyers are enrolled here automatically after a paid order.'}\n />\n ) : (\n <div className=\"divide-y divide-border overflow-hidden rounded-xl border border-border bg-card\">\n {students.map((s) => (\n <div key={s.key} className=\"flex items-center gap-3 px-4 py-3\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-xs font-semibold uppercase text-muted-foreground\" aria-hidden>\n {(s.name || s.email || '?').charAt(0)}\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate font-medium text-foreground\">{s.name}</span>\n {s.email && <span className=\"truncate text-xs text-muted-foreground\">{s.email}</span>}\n </span>\n {s.since && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {new Date(s.since).toLocaleDateString()}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Which offers grant access — kept as secondary context. */}\n {offers.length > 0 && (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {t('courses.editor.accessUnlockedBy') || 'Access is unlocked by'}\n </p>\n <div className=\"divide-y divide-border overflow-hidden rounded-xl border border-border bg-card\">\n {offers.map((offer) => (\n <div key={offer.id} className=\"flex items-center gap-3 px-4 py-3\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground\" aria-hidden>\n <Lock className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate font-medium text-foreground\">{offer.name}</span>\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{formatMoney(offer.price, offer.currency)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </TabsContent>\n </Tabs>\n\n <ConfirmDialog\n open={pendingDelete !== null}\n variant=\"destructive\"\n title={pendingDelete?.kind === 'module'\n ? (t('courses.editor.deleteModuleConfirm') || 'Delete this module?')\n : (t('courses.editor.deleteLessonConfirm') || 'Remove this lesson?')}\n description={pendingDelete?.kind === 'module'\n ? (t('courses.editor.deleteModuleConfirmBody') || 'Its lessons will be removed too. This cannot be undone.')\n : (t('courses.editor.deleteLessonConfirmBody') || 'This cannot be undone.')}\n confirmLabel={t('courses.editor.confirmDelete') || 'Delete'}\n cancelLabel={t('courses.editor.cancel') || 'Cancel'}\n onConfirm={confirmDelete}\n onCancel={() => setPendingDelete(null)}\n />\n </div>\n )\n}\nCourseEditorPage.displayName = 'CourseEditorPage'\n\n// ===========================================================================\n// Curriculum tree builder (module → lesson), Kiwify/Hotmart style.\n// ===========================================================================\n\ninterface CurriculumBuilderProps {\n t: TFn\n modules: Module[]\n lessons: Lesson[]\n autoFocusId: string | null\n onAutoFocused: () => void\n onAddModule: () => void\n onRenameModule: (moduleId: string, title: string) => void\n onAddLesson: (moduleId: string) => void\n onPatchLesson: (lessonId: string, patch: Partial<Lesson>) => void\n onRequestDelete: (kind: 'module' | 'lesson', id: string) => void\n onReorderModules: (orderedIds: string[]) => void\n onReorderLessons: (moduleId: string, orderedIds: string[]) => void\n}\n\n/** Human-friendly total duration, e.g. \"8 min\" or \"1 h 20 min\". */\nfunction formatDuration(sec: number, t: TFn): string {\n const min = Math.max(0, Math.round(sec / 60))\n const mLabel = t('courses.editor.minShort') || 'min'\n if (min < 60) return `${min} ${mLabel}`\n const h = Math.floor(min / 60)\n const rem = min % 60\n const hLabel = t('courses.editor.hourShort') || 'h'\n return rem ? `${h} ${hLabel} ${rem} ${mLabel}` : `${h} ${hLabel}`\n}\n\nfunction CurriculumBuilder({\n t, modules, lessons, autoFocusId, onAutoFocused,\n onAddModule, onRenameModule, onAddLesson, onPatchLesson,\n onRequestDelete, onReorderModules, onReorderLessons,\n}: CurriculumBuilderProps) {\n // Track only the *collapsed* modules so freshly-created ones default to open.\n const [collapsed, setCollapsed] = React.useState<Set<string>>(new Set())\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n\n function toggleModule(id: string) {\n setCollapsed((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n function handleModuleDragEnd(e: DragEndEvent) {\n const { active, over } = e\n if (!over || active.id === over.id) return\n const ids = modules.map((m) => m.id)\n const from = ids.indexOf(String(active.id))\n const to = ids.indexOf(String(over.id))\n if (from < 0 || to < 0) return\n onReorderModules(arrayMove(ids, from, to))\n }\n\n if (modules.length === 0) {\n return (\n <div className=\"space-y-4\">\n <AutosaveHint t={t} />\n <EmptyState\n icon={<Layers className=\"h-5 w-5\" />}\n title={t('courses.editor.modulesEmpty') || 'No modules yet'}\n description={t('courses.editor.modulesEmptyHint') || 'Create a module to start organizing your lessons.'}\n action={<Button onClick={onAddModule}><Plus className=\"h-4 w-4\" />{t('courses.editor.firstModule') || 'Create first module'}</Button>}\n />\n </div>\n )\n }\n\n const totalLessons = lessons.length\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <AutosaveHint t={t} />\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {modules.length} {modules.length === 1 ? (t('courses.editor.moduleLabel') || 'module') : (t('courses.editor.moduleLabelPlural') || 'modules')}\n {' · '}\n {totalLessons} {totalLessons === 1 ? (t('courses.editor.lessonUnitOne') || 'lesson') : (t('courses.editor.lessonUnitOther') || 'lessons')}\n </span>\n </div>\n\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleModuleDragEnd}>\n <SortableContext items={modules.map((m) => m.id)} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-3\">\n {modules.map((mod, i) => (\n <SortableModuleCard\n key={mod.id}\n t={t}\n index={i}\n mod={mod}\n lessons={lessons.filter((l) => l.moduleId === mod.id)}\n expanded={!collapsed.has(mod.id)}\n onToggle={() => toggleModule(mod.id)}\n autoFocusId={autoFocusId}\n onAutoFocused={onAutoFocused}\n onRenameModule={onRenameModule}\n onAddLesson={onAddLesson}\n onPatchLesson={onPatchLesson}\n onRequestDelete={onRequestDelete}\n onReorderLessons={onReorderLessons}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n\n <Button variant=\"outline\" onClick={onAddModule} className=\"w-full border-dashed\">\n <Plus className=\"h-4 w-4\" />{t('courses.editor.newModule') || 'New module'}\n </Button>\n </div>\n )\n}\n\ninterface SortableModuleCardProps {\n t: TFn\n index: number\n mod: Module\n lessons: Lesson[]\n expanded: boolean\n onToggle: () => void\n autoFocusId: string | null\n onAutoFocused: () => void\n onRenameModule: (moduleId: string, title: string) => void\n onAddLesson: (moduleId: string) => void\n onPatchLesson: (lessonId: string, patch: Partial<Lesson>) => void\n onRequestDelete: (kind: 'module' | 'lesson', id: string) => void\n onReorderLessons: (moduleId: string, orderedIds: string[]) => void\n}\n\nfunction SortableModuleCard({\n t, index, mod, lessons, expanded, onToggle, autoFocusId, onAutoFocused,\n onRenameModule, onAddLesson, onPatchLesson, onRequestDelete, onReorderLessons,\n}: SortableModuleCardProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: mod.id })\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n zIndex: isDragging ? 20 : undefined,\n }\n\n const count = lessons.length\n const totalSec = lessons.reduce((s, l) => s + (l.durationSec || 0), 0)\n\n function handleLessonDragEnd(e: DragEndEvent) {\n const { active, over } = e\n if (!over || active.id === over.id) return\n const ids = lessons.map((l) => l.id)\n const from = ids.indexOf(String(active.id))\n const to = ids.indexOf(String(over.id))\n if (from < 0 || to < 0) return\n onReorderLessons(mod.id, arrayMove(ids, from, to))\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className=\"overflow-hidden rounded-xl border border-border bg-card shadow-sm\"\n >\n {/* Module header */}\n <div className=\"flex items-center gap-1.5 px-2 py-2 sm:gap-2 sm:px-3\">\n <button\n {...attributes}\n {...listeners}\n className=\"hidden h-8 w-6 shrink-0 cursor-grab touch-none items-center justify-center rounded-md text-muted-foreground/40 transition-colors hover:text-muted-foreground active:cursor-grabbing sm:flex\"\n aria-label={t('courses.editor.dragToReorder') || 'Drag to reorder'}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n <button\n onClick={onToggle}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n aria-label={expanded ? (t('courses.editor.collapse') || 'Collapse') : (t('courses.editor.expand') || 'Expand')}\n aria-expanded={expanded}\n >\n <ChevronDown className={'h-4 w-4 transition-transform ' + (expanded ? '' : '-rotate-90')} />\n </button>\n\n <span className=\"hidden shrink-0 items-center rounded-md bg-muted px-2 py-1 text-xs font-semibold tabular-nums text-muted-foreground sm:inline-flex\">\n {String(index + 1).padStart(2, '0')}\n </span>\n\n <TitleField\n value={mod.title}\n autoFocus={autoFocusId === mod.id}\n onAutoFocused={onAutoFocused}\n onCommit={(v) => onRenameModule(mod.id, v)}\n placeholder={t('courses.editor.moduleTitle') || 'Module title'}\n ariaLabel={t('courses.editor.moduleTitle') || 'Module title'}\n className=\"text-sm font-semibold\"\n />\n\n <span className=\"hidden shrink-0 text-xs text-muted-foreground tabular-nums md:inline\">\n {count > 0\n ? `${count} ${count === 1 ? (t('courses.editor.lessonUnitOne') || 'lesson') : (t('courses.editor.lessonUnitOther') || 'lessons')} · ${formatDuration(totalSec, t)}`\n : (t('courses.editor.noLessons') || 'No lessons')}\n </span>\n\n <button\n onClick={() => onRequestDelete('module', mod.id)}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground/60 transition-colors hover:bg-destructive/10 hover:text-destructive\"\n aria-label={t('courses.editor.deleteModule') || 'Delete module'}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Module body */}\n {expanded && (\n <div className=\"border-t border-border/60 bg-muted/20 p-2 sm:p-3\">\n {count === 0 ? (\n <button\n onClick={() => onAddLesson(mod.id)}\n className=\"flex w-full items-center justify-center gap-2 rounded-lg border border-dashed border-border px-3 py-4 text-sm text-muted-foreground transition-colors hover:border-primary/40 hover:bg-card hover:text-foreground\"\n >\n <Plus className=\"h-4 w-4\" /> {t('courses.editor.firstLesson') || 'Add the first lesson'}\n </button>\n ) : (\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleLessonDragEnd}>\n <SortableContext items={lessons.map((l) => l.id)} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-1.5\">\n {lessons.map((lesson) => (\n <SortableLessonRow\n key={lesson.id}\n t={t}\n lesson={lesson}\n autoFocusId={autoFocusId}\n onAutoFocused={onAutoFocused}\n onPatchLesson={onPatchLesson}\n onRequestDelete={onRequestDelete}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n )}\n\n {count > 0 && (\n <button\n onClick={() => onAddLesson(mod.id)}\n className=\"mt-2 flex items-center gap-1.5 rounded-md px-2 py-1.5 text-sm font-medium text-primary transition-colors hover:bg-primary/10\"\n >\n <Plus className=\"h-4 w-4\" /> {t('courses.editor.newLesson') || 'New lesson'}\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n\ninterface SortableLessonRowProps {\n t: TFn\n lesson: Lesson\n autoFocusId: string | null\n onAutoFocused: () => void\n onPatchLesson: (lessonId: string, patch: Partial<Lesson>) => void\n onRequestDelete: (kind: 'module' | 'lesson', id: string) => void\n}\n\nfunction SortableLessonRow({ t, lesson, autoFocusId, onAutoFocused, onPatchLesson, onRequestDelete }: SortableLessonRowProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: lesson.id })\n const [open, setOpen] = React.useState(false)\n // Local mirrors so the type icon + duration chip refresh on blur without a reload.\n const [videoUrl, setVideoUrl] = React.useState(lesson.videoUrl)\n const [durationSec, setDurationSec] = React.useState(lesson.durationSec)\n React.useEffect(() => { setVideoUrl(lesson.videoUrl) }, [lesson.videoUrl])\n React.useEffect(() => { setDurationSec(lesson.durationSec) }, [lesson.durationSec])\n\n const hasVideo = videoUrl.trim().length > 0\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n zIndex: isDragging ? 10 : undefined,\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={\n 'group rounded-lg border bg-card transition-colors ' +\n (open ? 'border-border' : 'border-transparent hover:border-border')\n }\n >\n <div className=\"flex items-center gap-1.5 px-1.5 py-1.5 sm:gap-2 sm:px-2\">\n <button\n {...attributes}\n {...listeners}\n className=\"hidden h-8 w-5 shrink-0 cursor-grab touch-none items-center justify-center text-muted-foreground/40 transition-colors hover:text-muted-foreground active:cursor-grabbing sm:flex\"\n aria-label={t('courses.editor.dragToReorder') || 'Drag to reorder'}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n <span\n className={\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ' +\n (hasVideo ? 'bg-primary/10 text-primary' : 'bg-muted text-muted-foreground')\n }\n aria-hidden\n >\n {hasVideo ? <Video className=\"h-4 w-4\" /> : <FileText className=\"h-4 w-4\" />}\n </span>\n\n <TitleField\n value={lesson.title}\n autoFocus={autoFocusId === lesson.id}\n onAutoFocused={onAutoFocused}\n onCommit={(v) => onPatchLesson(lesson.id, { title: v })}\n placeholder={t('courses.editor.lessonTitle') || 'Lesson title'}\n ariaLabel={t('courses.editor.lessonTitle') || 'Lesson title'}\n className=\"text-sm\"\n />\n\n <span className=\"hidden shrink-0 items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs tabular-nums text-muted-foreground sm:inline-flex\">\n <Clock className=\"h-3 w-3\" />\n {Math.round(durationSec / 60)}\n {' '}\n {t('courses.editor.minShort') || 'min'}\n </span>\n\n <button\n onClick={() => setOpen((v) => !v)}\n className={\n 'inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-1 text-xs font-medium transition-colors ' +\n (hasVideo\n ? 'border-border text-muted-foreground hover:text-foreground'\n : 'border-dashed border-border text-muted-foreground hover:border-primary/40 hover:text-foreground') +\n ' opacity-100 sm:opacity-0 sm:group-hover:opacity-100 ' + (open ? 'sm:opacity-100' : '')\n }\n aria-label={t('courses.editor.editLesson') || 'Edit lesson'}\n aria-expanded={open}\n >\n <PlayCircle className=\"h-3.5 w-3.5\" />\n <span className=\"hidden sm:inline\">\n {hasVideo ? (t('courses.editor.videoSet') || 'Video') : (t('courses.editor.addVideo') || 'Add video')}\n </span>\n </button>\n\n <button\n onClick={() => onRequestDelete('lesson', lesson.id)}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground/60 transition-colors hover:bg-destructive/10 hover:text-destructive sm:opacity-0 sm:group-hover:opacity-100\"\n aria-label={t('courses.editor.deleteLesson') || 'Remove lesson'}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {open && (\n <div className=\"space-y-3 border-t border-border/60 px-3 py-3 sm:pl-11\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('courses.editor.videoUrlLabel') || 'Video URL'}\n </label>\n <Input\n defaultValue={lesson.videoUrl}\n placeholder={t('courses.editor.videoUrlPlaceholder') || 'Paste the video link (YouTube, Vimeo…)'}\n onBlur={(e) => { setVideoUrl(e.target.value); onPatchLesson(lesson.id, { videoUrl: e.target.value }) }}\n aria-label={t('courses.editor.videoUrlLabel') || 'Video URL'}\n />\n </div>\n <div className=\"max-w-[160px] space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('courses.editor.lessonDuration') || 'Duration (min)'}\n </label>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n defaultValue={String(Math.round(lesson.durationSec / 60))}\n onBlur={(e) => { const s = (Number(e.target.value) || 0) * 60; setDurationSec(s); onPatchLesson(lesson.id, { durationSec: s }) }}\n aria-label={t('courses.editor.lessonDuration') || 'Duration (min)'}\n />\n </div>\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Borderless, text-like inline title input. Uncontrolled (defaultValue + onBlur\n * autosave) so it plays nicely with the reload-after-mutation flow, and focuses\n * itself when it is the freshly-created item.\n */\nfunction TitleField({ value, autoFocus, onAutoFocused, onCommit, placeholder, ariaLabel, className }: {\n value: string\n autoFocus?: boolean\n onAutoFocused?: () => void\n onCommit: (v: string) => void\n placeholder?: string\n ariaLabel?: string\n className?: string\n}) {\n const ref = React.useRef<HTMLInputElement>(null)\n React.useEffect(() => {\n if (autoFocus && ref.current) {\n ref.current.focus()\n ref.current.select()\n onAutoFocused?.()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoFocus])\n return (\n <input\n ref={ref}\n defaultValue={value}\n placeholder={placeholder}\n aria-label={ariaLabel}\n onBlur={(e) => onCommit(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') e.currentTarget.blur() }}\n className={\n 'min-w-0 flex-1 rounded-md bg-transparent px-2 py-1.5 text-foreground outline-none transition-colors placeholder:text-muted-foreground/60 hover:bg-muted/60 focus:bg-background focus:ring-2 focus:ring-ring ' +\n (className ?? '')\n }\n />\n )\n}\n\nfunction Field({ label, hint, children }: { label: string; hint?: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\n {hint && <span className=\"text-xs text-muted-foreground\">{hint}</span>}\n </div>\n {children}\n </div>\n )\n}\n\nfunction Textarea(props: React.TextareaHTMLAttributes<HTMLTextAreaElement>) {\n const { className, ...rest } = props\n return (\n <textarea\n className={\n 'flex min-h-[96px] w-full rounded-input border border-input bg-card px-2 py-1.5 text-sm text-foreground shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ' +\n (className ?? '')\n }\n {...rest}\n />\n )\n}\n\nfunction AutosaveHint({ t }: { t: (k: string) => string }) {\n return (\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Check className=\"h-3.5 w-3.5 text-success\" />\n {t('courses.editor.autosaved') || 'Changes are saved automatically.'}\n </p>\n )\n}\n\nfunction EditorSkeleton() {\n return (\n <div className=\"mx-auto max-w-4xl p-6 md:p-8\">\n <Skeleton className=\"mb-4 h-4 w-28\" />\n <Skeleton className=\"mb-6 h-8 w-64\" />\n <Skeleton className=\"mb-6 h-10 w-full\" />\n <div className=\"space-y-4\">\n <Skeleton className=\"h-40 w-full rounded-xl\" />\n <Skeleton className=\"h-40 w-full rounded-xl\" />\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { OrderListView, type OrderListColumn } from '@fayz-ai/admin'\nimport { getCoursesProvider, type Order, type FinancialStatus } from '@fayz-ai/courses'\nimport { formatMoney, formatDate } from '../lib/format'\nimport { navigateTo } from '../lib/nav'\n\nfunction statusVariant(s: FinancialStatus): 'success' | 'secondary' | 'destructive' | 'outline' {\n if (s === 'paid') return 'success'\n if (s === 'pending') return 'secondary'\n if (s === 'refunded' || s === 'chargeback') return 'destructive'\n return 'outline'\n}\n\n// Cache (fora do componente) — trocar de aba remonta a página; sem cache refaz a\n// consulta toda vez. Cache-first evita o refetch/skeleton ao voltar pra aba.\nlet salesCache: Order[] | null = null\n\n/** Uma aba da faixa que Pedidos e Assinaturas dividem (ver `salesTabs`). */\nexport interface SalesTab {\n value: string\n label: string\n route: string\n}\n\nexport interface SalesTabProps {\n /** Construída por chamada: navegar depende do roteador. */\n navTabs?: () => SalesTab[]\n activeNavTab?: string\n /** Base do detalhe do pedido (`${ordersRoute}/:id`). */\n ordersRoute?: string\n}\n\nexport function SalesPage({ navTabs, activeNavTab, ordersRoute = '/courses/sales' }: SalesTabProps = {}) {\n const t = useTranslation()\n const [orders, setOrders] = React.useState<Order[] | null>(salesCache)\n const tabs = navTabs?.()\n\n React.useEffect(() => {\n if (salesCache) return // cache hit → sem request\n let alive = true\n const p = getCoursesProvider()\n // public.orders (via listCoreSales) é a fonte da verdade; listOrders é a\n // projeção nativa do courses. Dedupe por id: uma venda espelhada aparece 1x,\n // com a linha canônica (orders) ganhando.\n void Promise.all([\n p.listCoreSales().catch(() => [] as Order[]),\n p.listOrders().catch(() => [] as Order[]),\n ]).then(([core, store]) => {\n if (!alive) return\n const byId = new Map<string, Order>()\n for (const o of store) byId.set(o.id, o)\n for (const o of core) byId.set(o.id, o)\n const list = [...byId.values()].sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1))\n salesCache = list\n setOrders(list)\n })\n return () => { alive = false }\n }, [])\n\n const paid = (orders ?? []).filter((o) => o.financialStatus === 'paid')\n const revenue = paid.reduce((s, o) => s + o.total, 0)\n const currency = orders?.[0]?.currency ?? 'BRL'\n\n const columns: OrderListColumn<Order>[] = [\n { key: 'date', header: t('courses.sales.date') || 'Data', render: (o) => <span className=\"text-muted-foreground\">{formatDate(o.createdAt)}</span> },\n { key: 'customer', header: t('courses.sales.customer') || 'Cliente', render: (o) => (\n <div>\n <div className=\"font-medium text-foreground\">{o.customerName ?? '—'}</div>\n <div className=\"text-xs text-muted-foreground\">{o.customerEmail}</div>\n </div>\n ) },\n { key: 'method', header: t('courses.sales.method') || 'Forma', render: (o) => (\n <span className=\"capitalize\">\n {o.paymentMethod ?? '—'}{o.installmentCount && o.installmentCount > 1 ? ` · ${o.installmentCount}x` : ''}\n </span>\n ) },\n { key: 'status', header: t('courses.sales.status') || 'Status', render: (o) => (\n <Badge variant={statusVariant(o.financialStatus)}>{t(`courses.financialStatus.${o.financialStatus}`) || o.financialStatus}</Badge>\n ) },\n { key: 'fee', header: t('courses.sales.fee') || 'Taxa', align: 'right', render: (o) => <span className=\"text-muted-foreground\">{formatMoney(o.platformFee, o.currency)}</span> },\n { key: 'total', header: t('courses.sales.amount') || 'Valor', align: 'right', render: (o) => <span className=\"font-medium text-foreground\">{formatMoney(o.total, o.currency)}</span> },\n ]\n\n return (\n <OrderListView<Order>\n title={t('courses.sales.title') || 'Vendas'}\n subtitle={t('courses.sales.subtitle') || 'Todas as transações dos seus cursos.'}\n navTabs={tabs?.map((tb) => ({ value: tb.value, label: tb.label }))}\n activeNavTab={activeNavTab}\n onNavTabChange={(v) => {\n const target = tabs?.find((tb) => tb.value === v)\n if (target) navigateTo(target.route)\n }}\n stats={[\n { label: t('courses.sales.count') || 'Vendas', value: String(paid.length) },\n { label: t('courses.sales.revenue') || 'Receita', value: formatMoney(revenue, currency) },\n ]}\n columns={columns}\n rows={orders ?? []}\n loading={orders === null}\n empty={t('courses.sales.empty') || 'Nenhuma venda ainda.'}\n onRowClick={(o) => navigateTo(`${ordersRoute}/${o.id}`)}\n />\n )\n}\nSalesPage.displayName = 'SalesPage'\n","import * as React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n OrderDetailView as SharedOrderDetailView, OrderDetailSkeleton, PersonLink,\n type OrderDetailData, type OrderDetailInstallment, type OrderDetailTone,\n} from '@fayz-ai/admin'\nimport { getCoursesProvider, type OrderDetail, type FinancialStatus } from '@fayz-ai/courses'\nimport { EmptyState } from '../components/CommerceUI'\nimport { formatMoney, formatDate } from '../lib/format'\nimport { navigateTo } from '../lib/nav'\n\nconst Page = ({ children }: { children: React.ReactNode }) => (\n <div className=\"mx-auto max-w-6xl p-6 md:p-8\">{children}</div>\n)\n\n// Cache por id (fora do componente) — trocar de aba remonta a view; sem cache\n// isso refaz o getOrder (skeleton + request) toda vez. Cache-first evita o refetch.\nconst orderCache = new Map<string, OrderDetail>()\n\nfunction statusTone(s: FinancialStatus): OrderDetailTone {\n if (s === 'paid') return 'success'\n if (s === 'pending') return 'warning'\n if (s === 'refunded' || s === 'chargeback') return 'destructive'\n return 'muted'\n}\nfunction instTone(s: string): OrderDetailTone {\n if (s === 'paid') return 'success'\n if (s === 'overdue') return 'destructive'\n return 'warning'\n}\n\n/** Order detail (`${ordersRoute}/:id`). Loads the canonical order and renders the\n * SHARED archetype OrderDetailView (@fayz-ai/admin) — same component the shop uses. */\nexport function CourseOrderDetailView({ id, ordersRoute = '/courses/sales' }: { id?: string; ordersRoute?: string }) {\n const t = useTranslation()\n const [order, setOrder] = React.useState<OrderDetail | null>(() => (id ? orderCache.get(id) ?? null : null))\n const [loading, setLoading] = React.useState(() => !(id && orderCache.has(id)))\n\n React.useEffect(() => {\n let alive = true\n if (!id) { setLoading(false); return }\n const cached = orderCache.get(id)\n if (cached) { setOrder(cached); setLoading(false); return } // cache hit → sem request\n setLoading(true)\n void getCoursesProvider().getOrder(id).then((o) => {\n if (!alive) return\n if (o) orderCache.set(id, o)\n setOrder(o); setLoading(false)\n })\n return () => { alive = false }\n }, [id])\n\n // A lista de onde este pedido veio — não '/courses/sales' fixo: o host pode\n // ter reposicionado a tela (routes.orders), e voltar para o caminho antigo só\n // funcionava de carona no redirecionamento.\n const back = () => navigateTo(ordersRoute)\n\n if (loading) return <Page><OrderDetailSkeleton /></Page>\n if (!order) {\n return (\n <Page>\n <EmptyState\n title={t('courses.order.notFound') || 'Pedido não encontrado'}\n description=\"\"\n action={<button className=\"text-sm text-primary underline\" onClick={back}>{t('common.back') || 'Voltar'}</button>}\n />\n </Page>\n )\n }\n\n const cur = order.currency\n const installments: OrderDetailInstallment[] = order.installments.map((m) => ({\n number: m.installmentNumber,\n amount: formatMoney(m.amount, cur),\n status: m.status,\n statusTone: instTone(m.status),\n dueDate: m.dueDate ? formatDate(m.dueDate) : null,\n paymentDate: m.paymentDate ? formatDate(m.paymentDate) : null,\n note: m.cardBrand ? `${m.cardBrand}${m.cardInstallments ? ` ${m.cardInstallments}x` : ''}` : null,\n }))\n\n const data: OrderDetailData = {\n title: `${t('courses.order.title') || 'Pedido'} #${order.id.slice(0, 8)}`,\n subtitle: formatDate(order.createdAt),\n badges: [\n { label: t(`courses.financialStatus.${order.financialStatus}`) || order.financialStatus, tone: statusTone(order.financialStatus) },\n ...(order.installmentCount && order.installmentCount > 1 ? [{ label: `${order.installmentCount}x`, tone: 'muted' as OrderDetailTone }] : []),\n ],\n customer: { name: order.customerName, email: order.customerEmail },\n customerNode: (\n <div className=\"space-y-1 text-sm\">\n {order.customerId ? (\n <PersonLink\n personId={order.customerId}\n name={order.customerName ?? order.customerEmail ?? 'Cliente'}\n className=\"font-medium\"\n />\n ) : (\n <p className=\"font-medium\">{order.customerName ?? '—'}</p>\n )}\n {order.customerEmail && <p className=\"text-muted-foreground\">{order.customerEmail}</p>}\n </div>\n ),\n items: [{\n name: order.courseTitle ?? '—',\n description: order.offerName,\n quantity: 1,\n unitPrice: formatMoney(order.total, cur),\n total: formatMoney(order.total, cur),\n }],\n totals: [\n { label: 'Total', value: formatMoney(order.total, cur), strong: true },\n ...(order.platformFee > 0 ? [{ label: 'Taxa', value: `− ${formatMoney(order.platformFee, cur)}`, muted: true }] : []),\n { label: 'Líquido', value: formatMoney(order.netValue, cur) },\n ],\n paymentMethod: order.paymentMethod ?? undefined,\n receivable: {\n rows: [\n { label: 'Recebido', value: formatMoney(order.paidAmount, cur) },\n { label: 'Saldo', value: formatMoney(order.balance, cur), strong: order.balance > 0 },\n ],\n installments,\n emptyLabel: t('courses.order.noInstallments') || 'Sem parcelas.',\n },\n onBack: back,\n backLabel: t('courses.sales.title') || 'Vendas',\n }\n\n return (\n <Page>\n <SharedOrderDetailView {...data} />\n </Page>\n )\n}\nCourseOrderDetailView.displayName = 'CourseOrderDetailView'\n","import * as React from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Subscription, type SubscriptionStatus } from '@fayz-ai/courses'\nimport { PageContainer, StatCard, StatGrid, SimpleTable, type SimpleColumn } from '../components/CommerceUI'\nimport { formatMoney, formatDate } from '../lib/format'\nimport { navigateTo } from '../lib/nav'\nimport type { SalesTabProps } from './SalesPage'\n\nfunction statusVariant(s: SubscriptionStatus): 'success' | 'secondary' | 'destructive' {\n if (s === 'active') return 'success'\n if (s === 'past_due') return 'secondary'\n return 'destructive'\n}\n\nexport function SubscriptionsPage({ navTabs, activeNavTab }: SalesTabProps = {}) {\n const t = useTranslation()\n const [subs, setSubs] = React.useState<Subscription[] | null>(null)\n const tabs = navTabs?.()\n\n React.useEffect(() => {\n void getCoursesProvider().listSubscriptions().then(setSubs)\n }, [])\n\n const active = (subs ?? []).filter((s) => s.status === 'active')\n const mrr = active.reduce((sum, s) => sum + (s.interval === 'year' ? s.netValue / 12 : s.netValue), 0)\n const currency = subs?.[0]?.currency ?? 'BRL'\n\n const columns: SimpleColumn<Subscription>[] = [\n { key: 'start', header: t('courses.subs.start') || 'Start date', render: (s) => <span className=\"text-muted-foreground\">{formatDate(s.startedAt)}</span> },\n { key: 'customer', header: t('courses.subs.customer') || 'Customer', render: (s) => (\n <div>\n <div className=\"font-medium text-foreground\">{s.customerName ?? '—'}</div>\n <div className=\"text-xs text-muted-foreground\">{s.customerEmail}</div>\n </div>\n ) },\n { key: 'status', header: t('courses.subs.status') || 'Status', render: (s) => (\n <Badge variant={statusVariant(s.status)}>{t(`courses.subStatus.${s.status}`) || s.status}</Badge>\n ) },\n { key: 'value', header: t('courses.subs.value') || 'Net value', align: 'right', render: (s) => (\n <span className=\"font-medium text-foreground\">{formatMoney(s.netValue, s.currency)}<span className=\"text-xs text-muted-foreground\"> / {t(`courses.interval.${s.interval}`) || s.interval}</span></span>\n ) },\n ]\n\n return (\n <PageContainer\n title={t('courses.subs.title') || 'Subscriptions'}\n subtitle={t('courses.subs.subtitle') || 'Recurring plans and MRR.'}\n navTabs={tabs?.map((tb) => ({ value: tb.value, label: tb.label }))}\n activeNavTab={activeNavTab}\n onNavTabChange={(v) => {\n const target = tabs?.find((tb) => tb.value === v)\n if (target) navigateTo(target.route)\n }}\n >\n <StatGrid>\n <StatCard label={t('courses.subs.active') || 'Active subscriptions'} value={String(active.length)} />\n <StatCard label={t('courses.subs.mrr') || 'Monthly recurring revenue'} value={formatMoney(mrr, currency)} />\n </StatGrid>\n <SimpleTable\n columns={columns}\n rows={subs ?? []}\n empty={t('courses.subs.empty') || 'No subscriptions yet.'}\n />\n </PageContainer>\n )\n}\nSubscriptionsPage.displayName = 'SubscriptionsPage'\n","import * as React from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Payout, type FinancialSummary } from '@fayz-ai/courses'\nimport { PageContainer, StatCard, StatGrid, SimpleTable, type SimpleColumn } from '../components/CommerceUI'\nimport { formatMoney, formatDate, formatPercent } from '../lib/format'\n\n// No plan gate here on purpose. The page is registered as a shell ROUTE with\n// `permission: read('courses.finance')`, so the route guard already resolves\n// role AND plan for it — and whether `courses.finance` is a paid feature is the\n// APP's call (its billing.ts), never the plugin's. Hardcoding a gate here would\n// bake one product's packaging into the SDK.\nexport function FinancialPage() {\n const t = useTranslation()\n const [summary, setSummary] = React.useState<FinancialSummary | null>(null)\n const [payouts, setPayouts] = React.useState<Payout[] | null>(null)\n\n React.useEffect(() => {\n const p = getCoursesProvider()\n void p.getFinancialSummary().then(setSummary)\n void p.listPayouts().then(setPayouts)\n }, [])\n\n const currency = summary?.currency ?? 'BRL'\n\n const columns: SimpleColumn<Payout>[] = [\n { key: 'date', header: t('courses.financial.date') || 'Date', render: (p) => <span className=\"text-muted-foreground\">{formatDate(p.createdAt)}</span> },\n { key: 'amount', header: t('courses.financial.amount') || 'Amount', align: 'right', render: (p) => <span className=\"font-medium text-foreground\">{formatMoney(p.amount, p.currency)}</span> },\n { key: 'status', header: t('courses.financial.status') || 'Status', align: 'right', render: (p) => (\n <Badge variant={p.status === 'paid' ? 'success' : p.status === 'pending' ? 'secondary' : 'destructive'}>\n {t(`courses.payoutStatus.${p.status}`) || p.status}\n </Badge>\n ) },\n ]\n\n return (\n <PageContainer\n title={t('courses.financial.title') || 'Financial settings'}\n subtitle={t('courses.financial.subtitle') || 'Balance and payouts.'}\n >\n {/* The \"Connect Stripe\" action that used to sit here only ever raised a\n toast saying it would be wired later. It is gone rather than fixed:\n Cursos does not collect money — it produces the receivable and\n Financeiro receives it, which is the dependency the manifest now\n declares. One module charges, and it is not this one. */}\n <StatGrid>\n <StatCard label={t('courses.financial.available') || 'Available balance'} value={formatMoney(summary?.availableBalance ?? 0, currency)} />\n <StatCard label={t('courses.financial.pending') || 'Pending balance'} value={formatMoney(summary?.pendingBalance ?? 0, currency)} />\n <StatCard label={t('courses.financial.revenue') || 'Total revenue'} value={formatMoney(summary?.totalRevenue ?? 0, currency)} />\n <StatCard label={t('courses.financial.feeCollected') || 'Platform fees'} value={formatMoney(summary?.platformFeeTotal ?? 0, currency)} hint={summary ? formatPercent(summary.refundRate, 1) + ' ' + (t('courses.financial.refundRate') || 'refund rate') : undefined} />\n </StatGrid>\n\n <h2 className=\"mb-3 text-sm font-semibold text-foreground\">{t('courses.financial.payouts') || 'Payouts'}</h2>\n <SimpleTable\n columns={columns}\n rows={payouts ?? []}\n empty={t('courses.financial.noPayouts') || 'No payouts yet.'}\n />\n </PageContainer>\n )\n}\nFinancialPage.displayName = 'FinancialPage'\n","import * as React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Order, type Course } from '@fayz-ai/courses'\nimport { PageContainer, SimpleTable, type SimpleColumn } from '../components/CommerceUI'\nimport { formatMoney } from '../lib/format'\n\ninterface Row {\n courseId: string\n title: string\n sales: number\n revenue: number\n currency: string\n}\n\nexport function ReportsPage() {\n const t = useTranslation()\n const [rows, setRows] = React.useState<Row[] | null>(null)\n\n React.useEffect(() => {\n const p = getCoursesProvider()\n void Promise.all([p.listCourses(), p.listOrders({ financialStatus: 'paid' })]).then(([courses, orders]) => {\n setRows(buildRevenueByCourse(courses, orders))\n })\n }, [])\n\n const columns: SimpleColumn<Row>[] = [\n { key: 'title', header: t('courses.reports.course') || 'Course', render: (r) => <span className=\"font-medium text-foreground\">{r.title}</span> },\n { key: 'sales', header: t('courses.reports.sales') || 'Sales', align: 'right', render: (r) => <span>{r.sales}</span> },\n { key: 'revenue', header: t('courses.reports.revenue') || 'Revenue', align: 'right', render: (r) => <span className=\"font-medium text-foreground\">{formatMoney(r.revenue, r.currency)}</span> },\n ]\n\n return (\n <PageContainer title={t('courses.reports.title') || 'Reports'} subtitle={t('courses.reports.subtitle') || 'Revenue by course.'}>\n <h2 className=\"mb-3 text-sm font-semibold text-foreground\">{t('courses.reports.byCourse') || 'Revenue by course'}</h2>\n <SimpleTable\n columns={columns}\n rows={rows ?? []}\n empty={t('courses.reports.empty') || 'No revenue yet.'}\n />\n </PageContainer>\n )\n}\nReportsPage.displayName = 'ReportsPage'\n\nfunction buildRevenueByCourse(courses: Course[], orders: Order[]): Row[] {\n const byCourse = new Map<string, { sales: number; revenue: number; currency: string }>()\n for (const o of orders) {\n const agg = byCourse.get(o.courseId) ?? { sales: 0, revenue: 0, currency: o.currency }\n agg.sales += 1\n agg.revenue = Math.round((agg.revenue + o.total) * 100) / 100\n byCourse.set(o.courseId, agg)\n }\n return courses\n .map((c) => {\n const agg = byCourse.get(c.id)\n return { courseId: c.id, title: c.title, sales: agg?.sales ?? 0, revenue: agg?.revenue ?? 0, currency: agg?.currency ?? c.currency }\n })\n .sort((a, b) => b.revenue - a.revenue)\n}\n","import * as React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { PluginSettingsPanel, SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\n\n// The course plugin's Settings tab. Reuses the saas settings shell\n// (PluginSettingsPanel + SettingsGroup/SelectRow/ToggleRow) instead of\n// hand-rolling a settings layout — same chrome as every other plugin. Stripe\n// Connect lives in the \"Integrations\" tab (a connector), not here.\n\nfunction CoursesGeneralSettings() {\n const t = useTranslation()\n const [currency, setCurrency] = React.useState('BRL')\n const [methods, setMethods] = React.useState({ card: true, pix: true, boleto: true })\n\n return (\n <div className=\"space-y-6\">\n <SettingsGroup\n title={t('courses.settings.payments') || 'Payments'}\n description={t('courses.settings.paymentsHelp') || 'Connect Stripe in the Integrations tab; the platform fee applies automatically.'}\n >\n <SelectRow\n label={t('courses.settings.currency') || 'Default currency'}\n value={currency}\n onChange={setCurrency}\n options={[\n { value: 'BRL', label: 'BRL (R$)' },\n { value: 'USD', label: 'USD ($)' },\n { value: 'EUR', label: 'EUR (€)' },\n ]}\n />\n </SettingsGroup>\n\n <SettingsGroup title={t('courses.settings.methods') || 'Payment methods'}>\n <ToggleRow label={t('courses.editor.payCard') || 'Credit card'} checked={methods.card} onChange={(v) => setMethods((m) => ({ ...m, card: v }))} />\n <ToggleRow label={t('courses.editor.payPix') || 'Pix'} checked={methods.pix} onChange={(v) => setMethods((m) => ({ ...m, pix: v }))} />\n <ToggleRow label={t('courses.editor.payBoleto') || 'Boleto'} checked={methods.boleto} onChange={(v) => setMethods((m) => ({ ...m, boleto: v }))} />\n </SettingsGroup>\n </div>\n )\n}\nCoursesGeneralSettings.displayName = 'CoursesGeneralSettings'\n\nexport function CoursesSettingsTab() {\n const t = useTranslation()\n return (\n <PluginSettingsPanel\n title={t('courses.settings.title') || 'Course settings'}\n subtitle={t('courses.settings.subtitle') || 'Payments, currency and checkout methods'}\n generalSettings={<CoursesGeneralSettings />}\n hostPluginId=\"courses\"\n routeBase=\"/settings/courses\"\n />\n )\n}\nCoursesSettingsTab.displayName = 'CoursesSettingsTab'\n","import * as React from 'react'\nimport type { DashboardWidgetDef } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { KpiCard, defineKpiWidget } from '@fayz-ai/ui'\nimport { getCoursesProvider, type FinancialSummary } from '@fayz-ai/courses'\nimport { formatMoney, formatPercent } from '../lib/format'\n\n// Course KPIs contributed to the central admin Dashboard (rendered by\n// @fayz-ai/plugin-dashboard's DashboardCanvas, which auto-collects every\n// plugin's dashboardWidgets for surface 'home'). Mirrors Kiwify's dashboard.\n\nfunction useSummary(): FinancialSummary | null {\n const [summary, setSummary] = React.useState<FinancialSummary | null>(null)\n React.useEffect(() => {\n void getCoursesProvider().getFinancialSummary().then(setSummary)\n }, [])\n return summary\n}\n\nfunction RevenueKpi() {\n const t = useTranslation()\n const s = useSummary()\n return <KpiCard label={t('courses.kpi.revenue') || 'Total revenue'} icon=\"DollarSign\" loading={!s} value={s ? formatMoney(s.totalRevenue, s.currency) : undefined} />\n}\n\nfunction SalesKpi() {\n const t = useTranslation()\n const s = useSummary()\n return <KpiCard label={t('courses.kpi.sales') || 'Sales'} icon=\"TrendingUp\" loading={!s} value={s ? String(s.salesCount) : undefined} sub={s ? formatPercent(s.refundRate, 1) + ' ' + (t('courses.kpi.refunds') || 'refunds') : undefined} />\n}\n\nfunction MrrKpi() {\n const t = useTranslation()\n const s = useSummary()\n return <KpiCard label={t('courses.kpi.mrr') || 'MRR'} icon=\"Repeat\" loading={!s} value={s ? formatMoney(s.mrr, s.currency) : undefined} sub={s ? `${s.activeSubscriptions} ${t('courses.kpi.activeSubs') || 'active'}` : undefined} />\n}\n\nfunction FeesKpi() {\n const t = useTranslation()\n const s = useSummary()\n return <KpiCard label={t('courses.kpi.fees') || 'Platform fees'} icon=\"Percent\" loading={!s} value={s ? formatMoney(s.platformFeeTotal, s.currency) : undefined} />\n}\n\n/** Commerce KPIs are contributed only for the modules the host opted into —\n * a host embedding courses as a lightweight members feature must not get\n * revenue/MRR cards broadcast onto its home dashboard (FAY-1247 rule). */\nexport function createCoursesDashboardWidgets(\n modules: { sales?: boolean; subscriptions?: boolean; financial?: boolean } = {},\n): DashboardWidgetDef[] {\n return [\n ...(modules.sales\n ? [\n defineKpiWidget({ id: 'courses.kpi.revenue', title: 'courses.kpi.revenue', domain: 'courses', defaultOrder: 0, component: RevenueKpi }),\n defineKpiWidget({ id: 'courses.kpi.sales', title: 'courses.kpi.sales', domain: 'courses', defaultOrder: 1, component: SalesKpi }),\n ]\n : []),\n ...(modules.subscriptions\n ? [defineKpiWidget({ id: 'courses.kpi.mrr', title: 'courses.kpi.mrr', domain: 'courses', defaultOrder: 2, component: MrrKpi })]\n : []),\n ...(modules.financial\n ? [defineKpiWidget({ id: 'courses.kpi.fees', title: 'courses.kpi.fees', domain: 'courses', defaultOrder: 3, component: FeesKpi })]\n : []),\n ]\n}\n","// The one place that names the Kiwify data plane.\n//\n// Kept apart from connectorDef.tsx for the reason data.ts exists on the Stripe\n// connector: the credential path is the part that moves when the platform\n// broker lands, and when it does only this file should change.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n} from '@fayz-ai/core'\nimport { COURSES_TABLES, getCoursesTenantId } from '@fayz-ai/courses'\n\n/** The edge function that holds every Kiwify call this connector makes. */\nexport const KIWIFY_FUNCTION = 'kiwify-courses-sync'\n\n/** `plg_courses_orders.external_source` for everything this connector writes. */\nexport const KIWIFY_SOURCE = 'kiwify'\n\nexport interface KiwifyProduct {\n id: string\n name: string\n}\n\nexport interface KiwifyImportResult {\n fetched: number\n imported: number\n updated: number\n duplicates: number\n unmapped: number\n enrolled: number\n}\n\n/** A course here, and the Kiwify product it is — the tenant's own de-para. */\nexport interface CourseMapping {\n courseId: string\n title: string\n externalId: string | null\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n from: (table: string) => any\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com a Kiwify.')\n return supabase\n}\n\n/**\n * One call to the data plane, carrying the two things it cannot derive.\n *\n * The Supabase session goes in `Authorization` (the gateway checks it), and the\n * Fayz runtime token goes in its own header — that is the one the function\n * FORWARDS to redeem this tenant's Kiwify credential. An edge function cannot\n * mint one, so a call without it is a call the function must refuse; asking for\n * it here means the refusal happens before the round trip.\n */\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getCoursesTenantId()\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(KIWIFY_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (error) throw new Error(error.message)\n return data as T\n}\n\n/**\n * Ask the provider who we are.\n *\n * Not `testConnection`, and not on the ConnectorDefinition: that verb runs\n * BEFORE saving, with the form's values, and this connector's secret never\n * reaches this code — the hub correctly hides the button for exactly that\n * reason. This runs AFTER the credential is placed, which is the only moment\n * there is anything to test.\n *\n * What comes back is the account's name, which is the only answer a person can\n * verify: \"sim, é a minha conta\" is a different statement from \"a chamada não\n * deu erro\".\n */\nexport function checkAccount(): Promise<{ ok: boolean; message?: string }> {\n return invoke<{ ok: boolean; message?: string }>({ action: 'test' })\n}\n\n/** The provider's catalogue, for the mapping panel. Never stored — read each time it is shown. */\nexport function listProducts(): Promise<KiwifyProduct[]> {\n return invoke<{ products: KiwifyProduct[] }>({ action: 'products' }).then((data) => data.products ?? [])\n}\n\n/** Pull a period of sales. The window is capped at Kiwify's own 90 days server-side. */\nexport function importSales(input: { from: string; to: string }): Promise<KiwifyImportResult> {\n return invoke<KiwifyImportResult>({ action: 'sync_sales', from: input.from, to: input.to })\n}\n\n/**\n * The de-para, read straight off the courses table.\n *\n * `external_id` is not on the `Course` domain type and is not going on it: it is\n * a fact about an INTEGRATION, meaningless to a school that never sold on\n * Kiwify, and putting it in the provider contract would make every consumer of\n * `Course` carry a field only this panel reads.\n */\nexport async function listMappings(): Promise<CourseMapping[]> {\n const tenantId = getCoursesTenantId()\n let query = client()\n .from(COURSES_TABLES.courses)\n .select('id,title,external_id,external_source')\n .order('title')\n if (tenantId) query = query.eq('tenant_id', tenantId)\n\n const { data, error } = await query\n if (error) throw new Error(error.message)\n return (data ?? []).map((row: Record<string, unknown>) => ({\n courseId: String(row.id),\n title: String(row.title ?? ''),\n // A course mapped to another provider is unmapped as far as Kiwify is\n // concerned — showing Hotmart's id in Kiwify's column would invite someone\n // to overwrite it.\n externalId: row.external_source === KIWIFY_SOURCE ? ((row.external_id as string) ?? null) : null,\n }))\n}\n\n/** Point a course at a Kiwify product, or clear it. */\nexport async function saveMapping(courseId: string, externalId: string | null): Promise<void> {\n const value = externalId?.trim() ? externalId.trim() : null\n const { error } = await client()\n .from(COURSES_TABLES.courses)\n .update({\n external_id: value,\n // Cleared together: a source with no id is a row that claims an origin it\n // cannot name, and the partial unique index would stop enforcing anything.\n external_source: value ? KIWIFY_SOURCE : null,\n })\n .eq('id', courseId)\n if (error) throw new Error(error.message)\n}\n\n// The import history is NOT read here: `plg_sync_runs` belongs to the shared\n// connection store, and `store.listRuns()` already scopes it to this connection\n// rather than to the connector at large. A second query would be a second\n// answer to the same question.\n","// Kiwify as the Cursos module's inbound sales feed.\n//\n// ── What this connector is, and what it is deliberately not ─────────────────\n// Kiwify sold the course. The student paid on KIWIFY's checkout, into the\n// creator's Kiwify account, and Kiwify pays out from there. Nothing about that\n// money is ours to move, so this connector takes no payment and writes nothing\n// to Financeiro — it imports the FACT of a sale so the members area can let the\n// student in. That is what the catalogue's `courses` shelf means: \"cursos\n// vendidos por terceiros\", which is a different relationship from a gateway.\n//\n// It is also why Cursos may host a connector at all after `stripe` left it: a\n// third-party sale is not this app charging anyone, so there is no overlap with\n// the module that does.\n//\n// ── Why api-key and not oauth ───────────────────────────────────────────────\n// Kiwify has no consent screen. Its dashboard (Apps → API) issues a client pair\n// the tenant copies, and the token is minted from that pair server-side —\n// `POST /v1/oauth/token` with client_id + client_secret, no browser, no\n// redirect. So the connect step is a form, and `client_secret` is the one value\n// that must never reach this file: `type: 'password'` routes it to the\n// credential sink instead (packages/admin/.../connect/credentials.ts).\n//\n// A PULL connector: Kiwify has never heard of Fayz, so an edge function reaches\n// out to it and needs the credential at fetch time.\nimport React, { useEffect, useMemo, useState } from 'react'\nimport { Download, History, CheckCircle2, AlertCircle, Link2, Loader2, Plug } from 'lucide-react'\nimport { Button, DatePicker, toast } from '@fayz-ai/ui'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n type SyncRun,\n} from '@fayz-ai/core'\nimport {\n checkAccount,\n importSales,\n listMappings,\n listProducts,\n saveMapping,\n type CourseMapping,\n type KiwifyProduct,\n} from './data'\n\nexport const KIWIFY_CONNECTOR_ID = 'kiwify'\n\n/**\n * What authorizes the connection — all three come from the same Kiwify screen\n * (\"Apps → API → Criar API Key\"), and none can be inferred from the others.\n *\n * Two of them are one credential. `client_id` and `client_secret` are issued\n * together and the id is useless to anyone without the secret, so the id\n * carries `secret: true`: it goes to the vault WITH its other half instead of\n * falling through to this file, which is how half a credential ends up in a\n * pool table. Only the secret is masked — a merchant has to be able to check\n * they pasted the right id.\n *\n * The account id is genuinely not a credential. It is the\n * `x-kiwify-account-id` header that says WHICH account the token is spent on,\n * so it stays on the connection row where an operator can read it back.\n *\n * No `providerInstall`: Kiwify's docs name the path (\"Apps → API\") and publish\n * no URL for it, and a door that opens somewhere wrong is worse than a\n * placeholder that says where to look.\n */\nexport const KIWIFY_FIELDS: ConnectorField[] = [\n { key: 'accountId', label: 'Account ID', type: 'text', placeholder: 'Kiwify → Apps → API' },\n { key: 'clientId', label: 'Client ID', type: 'text', secret: true, placeholder: 'Kiwify → Apps → API' },\n { key: 'clientSecret', label: 'Client Secret', type: 'password', placeholder: 'Mostrado junto com o Client ID' },\n]\n\n/** Kiwify's own 90-day ceiling on a sales query, in one place. */\nexport const KIWIFY_MAX_WINDOW_DAYS = 90\n\n/**\n * How the live feed BEHAVES — chosen after the account is linked, changed\n * whenever the tenant likes.\n *\n * None of it authorizes anything, which is why none of it is a field: a school\n * that decides to stop auto-enrolling has not re-authorized Kiwify.\n */\nexport const KIWIFY_SETTINGS: ConnectorSetting[] = [\n {\n key: 'importStatuses',\n label: 'Quais vendas importar',\n description: 'Kiwify tem onze situações de venda; estas são as que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'paid', label: 'Pagas' },\n { value: 'pending', label: 'Aguardando pagamento' },\n { value: 'refunded', label: 'Reembolsadas' },\n { value: 'chargeback', label: 'Chargeback' },\n ],\n // Required to OPERATE and not to connect: a feed with nothing selected has\n // nothing to bring, so the connection is real and reads as \"conectado,\n // falta configurar\" (`plg_connections.status = 'pending'`).\n requiredToOperate: true,\n defaultValue: ['paid', 'refunded', 'chargeback'],\n },\n {\n // The difference between \"a venda entrou\" and \"o aluno entrou\" is a\n // decision. A school that reviews enrolments by hand needs the sale\n // recorded and the door still shut.\n key: 'grantAccess',\n label: 'Liberar o acesso automaticamente',\n description: 'Venda paga vira matrícula na hora. Desligado, o pedido entra e a matrícula é sua.',\n type: 'toggle',\n defaultValue: true,\n },\n {\n key: 'windowDays',\n label: 'Período de cada sincronização',\n description: 'Quantos dias para trás buscar quando a sincronização roda.',\n type: 'text',\n placeholder: '30',\n // 1–90. Kiwify refuses a wider window than 90 days, so a number that reads\n // fine here and fails at the provider is not expressible.\n pattern: '[1-9]|[1-8]\\\\d|90',\n patternHint: 'De 1 a 90 dias — o limite é da própria Kiwify.',\n defaultValue: '30',\n },\n]\n\nconst store = createConnectionStore(KIWIFY_CONNECTOR_ID, {\n fields: KIWIFY_FIELDS,\n settings: KIWIFY_SETTINGS,\n})\n\nconst STATUS_LABELS: Record<string, string> = {\n paid: 'Pagas',\n pending: 'Aguardando',\n refunded: 'Reembolsadas',\n chargeback: 'Chargeback',\n}\n\n/** The row's one-line summary. Tolerates a pre-split string a live row may hold. */\nfunction statusesDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => STATUS_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction daysAgo(days: number): string {\n const d = new Date()\n d.setDate(d.getDate() - days)\n return d.toISOString().slice(0, 10)\n}\n\nfunction KiwifyExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n const [products, setProducts] = useState<KiwifyProduct[] | null>(null)\n const [mappings, setMappings] = useState<CourseMapping[]>([])\n const [from, setFrom] = useState(() => daysAgo(30))\n const [to, setTo] = useState(() => new Date().toISOString().slice(0, 10))\n const [importing, setImporting] = useState(false)\n const [checking, setChecking] = useState(false)\n const [runs, setRuns] = useState<SyncRun[]>([])\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n useEffect(() => {\n if (!connected) return\n void listMappings().then(setMappings).catch(() => {})\n void store.listRuns({ limit: 10 }).then(setRuns).catch(() => {})\n // The catalogue is the provider's, so a failure here is a failure to reach\n // Kiwify — reported as an empty list rather than as a broken panel.\n void listProducts().then(setProducts).catch(() => setProducts([]))\n }, [connected])\n\n const mappedCount = useMemo(() => mappings.filter((m) => m.externalId).length, [mappings])\n\n if (!loaded || !connected) return null\n\n async function handleMap(courseId: string, externalId: string) {\n const previous = mappings\n setMappings((rows) => rows.map((r) => (r.courseId === courseId ? { ...r, externalId: externalId || null } : r)))\n try {\n await saveMapping(courseId, externalId || null)\n } catch (e: any) {\n setMappings(previous)\n toast.error(e?.message ?? 'Não deu para salvar o vínculo')\n }\n }\n\n async function handleImport() {\n setImporting(true)\n try {\n const result = await importSales({ from, to })\n const parts = [`${result.imported} novas`]\n if (result.updated) parts.push(`${result.updated} atualizadas`)\n if (result.enrolled) parts.push(`${result.enrolled} matrículas`)\n if (result.unmapped) parts.push(`${result.unmapped} sem curso vinculado`)\n toast.success(parts.join(' · '))\n void store.listRuns({ limit: 10 }).then(setRuns)\n } catch (e: any) {\n toast.error(e?.message ?? 'Erro ao importar as vendas')\n } finally {\n setImporting(false)\n }\n }\n\n async function handleCheck() {\n setChecking(true)\n try {\n const result = await checkAccount()\n if (!result.ok) throw new Error(result.message ?? 'A Kiwify não reconheceu essa credencial')\n toast.success(result.message ?? 'Credencial válida')\n } catch (e: any) {\n toast.error(e?.message ?? 'Não deu para falar com a Kiwify')\n } finally {\n setChecking(false)\n }\n }\n\n return (\n <div className=\"space-y-5 border-t pt-4\">\n {/* Post-connection and not pre-save: the secret never reaches this app, so\n the only moment there is anything to test is after it was placed. */}\n <Button variant=\"outline\" size=\"sm\" onClick={handleCheck} disabled={checking}>\n {checking ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <Plug className=\"h-3.5 w-3.5\" />}\n {' '}Testar credencial\n </Button>\n\n <div>\n <div className=\"flex items-center gap-2\">\n <Link2 className=\"h-4 w-4 text-muted-foreground\" />\n <h4 className=\"text-sm font-semibold\">Qual produto é qual curso</h4>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Uma venda só entra se o produto vendido na Kiwify apontar para um curso daqui.\n {' '}{mappedCount} de {mappings.length} vinculados.\n </p>\n\n <div className=\"mt-3 max-h-72 divide-y overflow-auto rounded-md border\">\n {mappings.length === 0 && (\n <p className=\"px-3 py-4 text-xs text-muted-foreground\">Nenhum curso cadastrado ainda.</p>\n )}\n {mappings.map((m) => (\n <label key={m.courseId} className=\"flex items-center gap-3 px-3 py-2 text-sm\">\n <span className=\"min-w-0 flex-1 truncate\">{m.title}</span>\n <select\n className=\"h-8 w-56 shrink-0 rounded-md border border-border bg-background px-2 text-xs\"\n value={m.externalId ?? ''}\n onChange={(e) => void handleMap(m.courseId, e.target.value)}\n >\n <option value=\"\">— sem vínculo —</option>\n {/* The course's own id stays selectable even if the catalogue\n call failed, so a mapping is never silently blanked by an\n unreachable provider. */}\n {m.externalId && !(products ?? []).some((p) => p.id === m.externalId) && (\n <option value={m.externalId}>{m.externalId}</option>\n )}\n {(products ?? []).map((p) => (\n <option key={p.id} value={p.id}>{p.name}</option>\n ))}\n </select>\n </label>\n ))}\n </div>\n {products?.length === 0 && (\n <p className=\"mt-2 text-[11px] text-muted-foreground\">\n Não deu para ler o catálogo da Kiwify agora. Você ainda pode colar o id do produto.\n </p>\n )}\n </div>\n\n <div>\n <div className=\"flex items-center gap-2\">\n <Download className=\"h-4 w-4 text-muted-foreground\" />\n <h4 className=\"text-sm font-semibold\">Importar vendas</h4>\n </div>\n <div className=\"mt-2 flex flex-wrap items-end gap-3\">\n <div>\n <span className=\"text-xs font-medium text-muted-foreground\">De</span>\n <DatePicker value={from} onChange={setFrom} className=\"mt-1\" />\n </div>\n <div>\n <span className=\"text-xs font-medium text-muted-foreground\">Até</span>\n <DatePicker value={to} onChange={setTo} className=\"mt-1\" />\n </div>\n <Button size=\"sm\" onClick={handleImport} disabled={importing}>\n {importing ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <Download className=\"h-3.5 w-3.5\" />}\n {' '}Importar\n </Button>\n </div>\n <p className=\"mt-2 text-[11px] text-muted-foreground\">\n A Kiwify responde no máximo {KIWIFY_MAX_WINDOW_DAYS} dias por consulta. Reimportar o mesmo\n período não duplica: uma venda já importada é reconhecida pelo id da Kiwify e só tem a\n situação atualizada.\n </p>\n </div>\n\n {runs.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <History className=\"h-4 w-4 text-muted-foreground\" />\n <h4 className=\"text-sm font-semibold\">Histórico</h4>\n </div>\n <div className=\"divide-y rounded-md border text-sm\">\n {runs.map((r) => (\n <div key={r.id} className=\"flex items-center gap-3 px-3 py-2\" title={r.error ?? undefined}>\n <span className=\"text-xs text-muted-foreground\">\n {r.startedAt ? new Date(r.startedAt).toLocaleString('pt-BR') : '—'}\n </span>\n <span className=\"ml-auto text-xs\">\n {r.written}/{r.fetched} importadas\n {typeof r.stats?.unmapped === 'number' && r.stats.unmapped > 0\n ? ` · ${r.stats.unmapped} sem vínculo`\n : ''}\n </span>\n {r.status === 'success'\n ? <CheckCircle2 className=\"h-3.5 w-3.5 text-success\" />\n : <AlertCircle className=\"h-3.5 w-3.5 text-warning\" />}\n </div>\n ))}\n </div>\n </div>\n )}\n\n <p className=\"text-[11px] text-muted-foreground\">\n O segredo da API fica guardado fora deste aplicativo. Quem fala com a Kiwify é o servidor,\n que pede a credencial na hora da consulta.\n </p>\n </div>\n )\n}\n\nexport const kiwifyConnectorDef: ConnectorDefinition = {\n id: KIWIFY_CONNECTOR_ID,\n hostPluginId: 'courses',\n name: 'Kiwify',\n description: 'Traga as vendas feitas na Kiwify e libere o acesso do aluno na área de membros.',\n icon: 'GraduationCap',\n category: 'courses',\n authKind: 'api-key',\n // Inbound because WE reach Kiwify: it has never heard of Fayz, which is what\n // makes this a pull connector and why it ships an edge function at all.\n direction: 'inbound',\n // Sync only. The sale has to exist INSIDE Fayz to enrol the student, appear in\n // Pedidos and be reported on — it is not a question the assistant can answer\n // by asking Kiwify at the moment it is asked.\n planes: ['sync'],\n docsUrl: 'https://docs.kiwify.com.br/api-reference/general',\n // Kiwify documents 100 calls per minute for one account, and the budget is\n // expressed per SECOND — 1/s rather than 1.66/s because the scheduler rounds\n // its spacing up to whole milliseconds anyway and a pull of a few hundred\n // sales has no reason to run at the edge of a 429.\n rateLimit: { perSecond: 1 },\n // Grounded in what 0010's `courses_import_external_sales` actually does, and\n // padded with nothing. It reads courses to find which one was sold; it writes\n // the order, the student and the enrolment. It reads no order back, so there\n // is no `order: read` here.\n permissions: [\n {\n kind: 'data',\n resource: 'course',\n actions: ['read'],\n reason: 'Descobrir qual curso daqui corresponde ao produto vendido na Kiwify. Nenhum curso é alterado.',\n },\n {\n kind: 'data',\n resource: 'order',\n actions: ['write'],\n reason:\n 'Registrar a venda: valor, forma de pagamento, situação e os dados de quem comprou. Uma venda já importada é atualizada, nunca duplicada.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'customer',\n actions: ['write'],\n reason: 'Cadastrar o aluno que comprou, com nome e e-mail, quando ele ainda não existe aqui.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'enrollment',\n actions: ['write'],\n reason:\n 'Dar acesso ao curso quando a venda está paga — e tirar o acesso quando ela é reembolsada ou vira chargeback.',\n },\n ],\n // Manual only, and that is the whole list today. A scheduled pull belongs to\n // the Fayz schedule worker (FAY-1347) and a webhook needs an endpoint Kiwify\n // can reach; declaring either here would promise a moment that never arrives.\n invokedAt: [\n {\n key: 'courses.sales.import',\n label: 'Você escolhe um período aqui e as vendas da Kiwify são importadas',\n plane: 'sync',\n trigger: 'manual',\n touches: ['course', 'order', 'customer', 'enrollment'],\n },\n ],\n fields: KIWIFY_FIELDS,\n settings: KIWIFY_SETTINGS,\n // Read from the row the list already batched, so a screen with N connectors\n // costs one plg_connections request rather than N.\n ...connectionStatus(\n KIWIFY_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: statusesDetail(connection?.settings?.importStatuses),\n plane: 'sync',\n ...settingsStatus(KIWIFY_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the pair — that ordering is\n // what makes `active = true` mean \"a credential was placed for this tenant\"\n // rather than \"somebody pressed a button\". Neither `clientId` nor\n // `clientSecret` arrives here; the hub split both out before calling this, so\n // the account id is the whole of what this function sees.\n saveConnection: async (values) => {\n await store.save({\n active: true,\n // The provider's own id for the account: what the row shows an operator,\n // and what the edge function spends the redeemed token against.\n providerAccountKey: values.accountId ?? null,\n settings: { accountId: values.accountId },\n })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: KiwifyExtraPanel,\n}\n","import * as React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { registerTranslations, registerPluginFactory } from '@fayz-ai/core'\nimport {\n getCoursesProviderOptional,\n setCoursesProvider,\n createMockCoursesProvider,\n setCoursesTenantResolver,\n} from '@fayz-ai/courses'\nimport { useOrganizationStore } from '@fayz-ai/admin'\nimport { coursesLocales } from './locales'\nimport { CoursesListPage } from './views/CoursesListPage'\nimport { CourseEditorPage } from './views/CourseEditorPage'\nimport { SalesPage } from './views/SalesPage'\nimport { CourseOrderDetailView } from './views/CourseOrderDetailView'\nimport { SubscriptionsPage } from './views/SubscriptionsPage'\nimport { FinancialPage } from './views/FinancialPage'\nimport { ReportsPage } from './views/ReportsPage'\nimport { CoursesSettingsTab } from './settings/CoursesSettings'\nimport { createCoursesDashboardWidgets } from './components/dashboardWidgets'\nimport { kiwifyConnectorDef } from './integrations/kiwify/connectorDef'\nimport { KIWIFY_FUNCTION } from './integrations/kiwify/data'\nimport { navigateTo } from './lib/nav'\n\n// ---------------------------------------------------------------------------\n// @fayz-ai/plugin-courses — admin management for the courses domain. This is a\n// PLUGIN, not an app: it only contributes nav + routes + settings + dashboard\n// widgets to the @fayz-ai/admin admin scaffold. Login, auth, permissions, the\n// sidebar/AppShell chrome and layout all come from @fayz-ai/admin — the plugin\n// never rebuilds them. Its screens render inside the saas AdminShell and use\n// @fayz-ai/ui primitives.\n// ---------------------------------------------------------------------------\n\nexport interface CoursesPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n /** Nav labels for the module entries (default English). */\n labels?: {\n membersArea?: string\n sales?: string\n subscriptions?: string\n financial?: string\n reports?: string\n }\n scope?: PluginScope\n verticalId?: VerticalId\n /**\n * Commerce-vertical modules — ALL OFF by default (the one architectural\n * rule: shared-surface contributions are opt-in, never broadcast — FAY-1247).\n * course-admin (the vertical owner) enables everything via its PluginRef\n * config; a host embedding courses as a lightweight members feature (e.g.\n * agency-os's \"Memberships\") gets only the base nav entry + editor.\n */\n modules?: {\n membersArea?: boolean\n sales?: boolean\n subscriptions?: boolean\n financial?: boolean\n reports?: boolean\n }\n /**\n * Onde as telas de venda montam. Os padrões mantêm tudo sob /courses; um app\n * que agrupa a venda em outro lugar (um CRM em /sales, por exemplo) reposiciona\n * sem forkar o plugin — o menu da shell aninha por PREFIXO de rota, então mudar\n * o caminho é o que muda o grupo em que a tela aparece.\n */\n routes?: {\n /** Lista de pedidos (e o detalhe em `${orders}/:id`). Default '/courses/sales'. */\n orders?: string\n /** Assinaturas. Default '/courses/subscriptions'. */\n subscriptions?: string\n }\n /**\n * Posição do item Pedidos quando ele é reposicionado para fora do bloco de\n * Cursos. Necessária porque a shell aninha por prefixo E POR ORDEM: ela só\n * acha o pai entre os itens JÁ processados, então um filho com posição menor\n * que a do pai vira um item de topo em vez de entrar no grupo. Default:\n * `navPosition + 2`, que é onde o item sempre esteve dentro de Cursos.\n */\n ordersNavPosition?: number\n /**\n * Pedidos e Assinaturas passam a dividir UMA faixa de abas e UMA entrada de\n * menu (Pedidos) — Assinaturas some da navegação e é alcançada pela aba.\n * Desligado por padrão: são duas entradas de menu, como sempre foram.\n */\n salesTabs?: boolean\n}\n\nconst asComp = (c: unknown) => c as React.ComponentType<unknown>\nconst read = (feature: string) => ({ feature, action: 'read' as const })\n\n/** Binds config-time props to a page — the router only passes route params. */\nfunction withProps<P extends object>(Page: React.ComponentType<P>, props: P) {\n const Bound: React.FC<Record<string, unknown>> = (routeProps) =>\n React.createElement(Page, { ...props, ...routeProps } as P)\n Bound.displayName = `${Page.displayName ?? Page.name}(bound)`\n return Bound\n}\n\n/**\n * Rota antiga que só reencaminha para a nova. `target` recebe os params da rota,\n * então um redirecionamento de detalhe PRESERVA o id — registrar só o pai e\n * deixar o curinga `/antigo/*` pegar o resto manda todo link de detalhe para a\n * lista, que é a mesma coisa que perder o link.\n */\nfunction redirectTo(target: string | ((params: Record<string, string>) => string)) {\n const Redirect: React.FC<Record<string, unknown>> = (params) => {\n const to = typeof target === 'function' ? target(params as Record<string, string>) : target\n React.useEffect(() => { navigateTo(to) }, [to])\n return null\n }\n Redirect.displayName = `Redirect(${typeof target === 'string' ? target : 'fn'})`\n return Redirect\n}\n\nexport function createCoursesPlugin(options?: CoursesPluginOptions): PluginManifest {\n // Register locales globally so keys resolve even before the I18nProvider mounts.\n registerTranslations(coursesLocales)\n\n // Scope Supabase queries to the active organization (the creator/tenant). The\n // mock provider ignores this; the Supabase provider appends .eq('tenant_id').\n setCoursesTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n // Defensive default: if the host app didn't set a provider, fall back to a\n // mock so the admin still renders. Apps that share admin↔member set their own.\n if (!getCoursesProviderOptional()) {\n setCoursesProvider(createMockCoursesProvider())\n }\n\n const base = options?.navPosition ?? 1\n const section = options?.navSection ?? 'main'\n const modules = options?.modules ?? {}\n\n // Opt-in nav/routes per module. Position offsets stay stable relative to the\n // enabled set so hosts control exactly where the block sits.\n const labels = options?.labels ?? {}\n const ordersRoute = options?.routes?.orders ?? '/courses/sales'\n const subscriptionsRoute = options?.routes?.subscriptions ?? '/courses/subscriptions'\n const salesTabs = options?.salesTabs ?? false\n\n // A faixa de abas que Pedidos e Assinaturas dividem quando `salesTabs` está\n // ligado. Construída por chamada (e não em escopo de módulo) porque navegar\n // depende do roteador, que não existe onde as páginas são declaradas.\n const salesTabStrip = salesTabs\n ? () => [\n { value: 'orders', label: labels.sales ?? 'Sales', route: ordersRoute },\n { value: 'subscriptions', label: labels.subscriptions ?? 'Subscriptions', route: subscriptionsRoute },\n ]\n : undefined\n\n const navigation = [\n { section, position: base, label: options?.navLabel ?? 'Courses', route: '/courses', icon: 'BookOpen', permission: read('courses') },\n // The members area is no longer a standalone nav entry — it lives inside each\n // course's record (CourseEditorPage → \"Alunos\" tab). modules.membersArea is\n // kept accepted-but-inert for backward compat with existing manifests.\n ...(modules.sales ? [{ section, position: options?.ordersNavPosition ?? base + 2, label: labels.sales ?? 'Sales', route: ordersRoute, icon: 'TrendingUp', permission: read('courses.sales') }] : []),\n // Com `salesTabs`, Assinaturas é uma ABA de Pedidos — listá-la também no menu\n // seria a mesma navegação duas vezes, que é o que a faixa existe para evitar.\n ...(modules.subscriptions && !salesTabs ? [{ section, position: base + 3, label: labels.subscriptions ?? 'Subscriptions', route: subscriptionsRoute, icon: 'Repeat', permission: read('courses.sales') }] : []),\n ...(modules.financial ? [{ section, position: base + 4, label: labels.financial ?? 'Financial', route: '/courses/financial', icon: 'CreditCard', permission: read('courses.finance') }] : []),\n ...(modules.reports ? [{ section, position: base + 5, label: labels.reports ?? 'Reports', route: '/courses/reports', icon: 'BarChart3', permission: read('courses.sales') }] : []),\n ]\n\n const salesProps = { navTabs: salesTabStrip, activeNavTab: 'orders' as const }\n const subsProps = { navTabs: salesTabStrip, activeNavTab: 'subscriptions' as const }\n\n const routes = [\n // Static segments outscore the `:id` param in the saas router, so these\n // resolve before the editor route (AdminShell sorts by routeScore).\n { path: '/courses', component: asComp(CoursesListPage), permission: read('courses') },\n ...(modules.sales ? [{ path: ordersRoute, component: asComp(withProps(SalesPage, salesProps)), permission: read('courses.sales') }] : []),\n // Order detail — the static `${ordersRoute}/:id` outscores `/courses/:id`.\n ...(modules.sales ? [{ path: `${ordersRoute}/:id`, component: asComp(withProps(CourseOrderDetailView, { ordersRoute })), permission: read('courses.sales') }] : []),\n ...(modules.subscriptions ? [{ path: subscriptionsRoute, component: asComp(withProps(SubscriptionsPage, subsProps)), permission: read('courses.sales') }] : []),\n ...(modules.financial ? [{ path: '/courses/financial', component: asComp(FinancialPage), permission: read('courses.finance') }] : []),\n ...(modules.reports ? [{ path: '/courses/reports', component: asComp(ReportsPage), permission: read('courses.sales') }] : []),\n { path: '/courses/:id', component: asComp(CourseEditorPage) },\n // Onde as telas moravam quando o host as reposiciona. Redirecionam para não\n // deixar um link antigo renderizando tela em branco.\n ...(modules.sales && ordersRoute !== '/courses/sales'\n ? [\n // O detalhe vem PRIMEIRO e com o param: `/courses/sales/:id` (score 40)\n // ganha do curinga `/courses/sales/*` (29) que o shell registra junto\n // com o pai — sem ele, todo link antigo de pedido caía na lista.\n { path: '/courses/sales/:id', component: asComp(redirectTo((p) => `${ordersRoute}/${p.id}`)) },\n { path: '/courses/sales', component: asComp(redirectTo(ordersRoute)) },\n ] : []),\n ...(modules.subscriptions && subscriptionsRoute !== '/courses/subscriptions'\n ? [{ path: '/courses/subscriptions', component: asComp(redirectTo(subscriptionsRoute)) }] : []),\n ]\n\n return {\n id: 'courses',\n name: options?.navLabel ?? 'Courses',\n icon: 'BookOpen',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n // LMS is its own business model with opt-in commerce modules\n // (members/sales/subscriptions — see modules.* below) — targets the\n // saas/admin Panel world rather than the ecommerce storefront.\n scaffolds: ['saas'],\n defaultEnabled: true,\n // Cursos does not collect money. It produces the reason to charge — a\n // matrícula, a mensalidade — and Financeiro is what turns that into a\n // receivable and receives it. Stating the dependency is what keeps the two\n // from overlapping: the module that charges is one, and it is not this one.\n dependencies: ['financial'],\n declaredFeatures: [\n { id: 'courses', label: 'Courses', group: 'Courses' },\n { id: 'courses.sales', label: 'Sales', group: 'Courses' },\n { id: 'courses.finance', label: 'Financial', group: 'Courses' },\n ],\n declaredLimits: [\n { key: 'courses', label: 'Courses', table: 'plg_courses_courses' },\n ],\n navigation,\n routes,\n widgets: [],\n // Commerce KPIs on the shared 'home' surface follow the same opt-in rule:\n // no module enabled → no widgets broadcast into a host's dashboard.\n dashboardWidgets: createCoursesDashboardWidgets(modules),\n settings: [\n { id: 'courses', label: 'Courses', icon: 'BookOpen', component: asComp(CoursesSettingsTab), order: 20, permission: read('courses') },\n ],\n // No payment connector here, and no payment slug on the shelf either.\n // `stripe` and `mercadopago` used to sit in both lists, which put a second\n // Stripe row on the connectors screen of an app that has one Stripe account\n // and one place to charge from. Money-in is Financeiro's, whoever raised the\n // invoice — see `dependencies` above.\n //\n // Hotmart and Kiwify stay: the catalogue's `courses` shelf is literally\n // \"courses sold by a third party\", which is a different relationship — the\n // sale happens over there and we learn about it.\n integrations: ['mailchimp', 'hotmart', 'kiwify'],\n // Kiwify is that shelf's first BUILT one. It takes no payment: the student\n // paid on Kiwify's checkout into the creator's Kiwify account, and what is\n // imported is the fact of the sale, so the members area can let them in.\n // The slug stays on `integrations` above too — the catalogue row joins on\n // the union of the two lists.\n connectors: [kiwifyConnectorDef],\n functions: [\n {\n slug: KIWIFY_FUNCTION,\n // Invoked from the browser by an authenticated operator picking a\n // period, so Supabase must check the caller's JWT. Nothing outside\n // reaches it: Kiwify does not call us, and no Fayz ingress wakes a pull\n // connector.\n ingress: 'none',\n verifyJwt: true,\n // NAMES only. The tenant's Kiwify pair is NOT here and could not be: a\n // Supabase secret is per-POOL and a pool serves N schools with N Kiwify\n // accounts. The pair is redeemed per call from the platform vault, which\n // is what the last three names are for.\n secrets: [\n 'SUPABASE_URL',\n 'SUPABASE_SERVICE_ROLE_KEY',\n 'FAYZ_API_URL',\n 'FAYZ_PROJECT_ID',\n 'CONNECTOR_REDEMPTION_SECRET',\n ],\n // What this connector's credential may touch. Direct table access is\n // not on the list on purpose (2026-08-11 ADR): the import goes through\n // the RPC, which takes the tenant from the connection row instead of\n // from the request body.\n grants: ['courses_import_external_sales'],\n },\n ],\n declaredRpcs: [\n {\n name: 'courses_import_external_sales',\n kind: 'write',\n description:\n 'Import third-party course sales as orders, students and enrolments. Idempotent on (tenant, external source, external id); the tenant comes from the connection row, never from the payload. A sale whose product maps to no course here is counted and skipped.',\n audits: false,\n },\n ],\n locales: coursesLocales,\n }\n}\n\n// Self-register the factory so renderApp(manifest) with a PluginRef { id:\n// 'courses' } resolves without a separate plugins.generated.ts entry (apps may\n// still register explicitly; registration is idempotent on id).\nregisterPluginFactory('courses', createCoursesPlugin as (config?: Record<string, unknown>) => PluginManifest)\n\nexport { coursesLocales } from './locales'\n"]}