@fayz-ai/plugin-courses 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +2 -0
  2. package/dist/components/CommerceUI.d.ts +39 -0
  3. package/dist/components/CommerceUI.d.ts.map +1 -0
  4. package/dist/connectors/stripe.d.ts +3 -0
  5. package/dist/connectors/stripe.d.ts.map +1 -0
  6. package/dist/dashboardWidgets.d.ts +3 -0
  7. package/dist/dashboardWidgets.d.ts.map +1 -0
  8. package/dist/index.cjs +735 -54
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +738 -57
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/format.d.ts +4 -0
  14. package/dist/lib/format.d.ts.map +1 -0
  15. package/dist/locales/en.d.ts.map +1 -1
  16. package/dist/locales/pt-BR.d.ts.map +1 -1
  17. package/dist/pages/CourseEditorPage.d.ts.map +1 -1
  18. package/dist/pages/FinancialPage.d.ts +6 -0
  19. package/dist/pages/FinancialPage.d.ts.map +1 -0
  20. package/dist/pages/MembersAreaPage.d.ts +6 -0
  21. package/dist/pages/MembersAreaPage.d.ts.map +1 -0
  22. package/dist/pages/ReportsPage.d.ts +6 -0
  23. package/dist/pages/ReportsPage.d.ts.map +1 -0
  24. package/dist/pages/SalesPage.d.ts +6 -0
  25. package/dist/pages/SalesPage.d.ts.map +1 -0
  26. package/dist/pages/SubscriptionsPage.d.ts +6 -0
  27. package/dist/pages/SubscriptionsPage.d.ts.map +1 -0
  28. package/dist/settings/CoursesSettings.d.ts +6 -0
  29. package/dist/settings/CoursesSettings.d.ts.map +1 -0
  30. package/package.json +6 -4
  31. package/src/components/CommerceUI.tsx +77 -0
  32. package/src/connectors/stripe.ts +34 -0
  33. package/src/dashboardWidgets.tsx +51 -0
  34. package/src/index.ts +51 -12
  35. package/src/lib/format.ts +22 -0
  36. package/src/locales/en.ts +109 -0
  37. package/src/locales/pt-BR.ts +109 -0
  38. package/src/pages/CourseEditorPage.tsx +133 -35
  39. package/src/pages/FinancialPage.tsx +76 -0
  40. package/src/pages/MembersAreaPage.tsx +60 -0
  41. package/src/pages/ReportsPage.tsx +59 -0
  42. package/src/pages/SalesPage.tsx +57 -0
  43. package/src/pages/SubscriptionsPage.tsx +56 -0
  44. package/src/settings/CoursesSettings.tsx +55 -0
@@ -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/pages/CourseEditorPage.tsx","../src/index.ts"],"names":["hashRouterAdapter","useTranslation","useModuleLayout","courses","React","getCoursesProvider","jsxs","PageHeaderActions","jsx","Button","Badge","React2","toast","Input","registerTranslations","getCoursesProviderOptional","setCoursesProvider","createMockCoursesProvider","registerPluginFactory"],"mappings":"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","file":"index.cjs","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.addModule': 'Add module',\n 'courses.editor.moduleTitle': 'Module title',\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',\n 'courses.editor.untitledCourse': 'Untitled course',\n 'courses.editor.untitledModule': 'New module',\n 'courses.editor.untitledLesson': 'New lesson',\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.addModule': 'Adicionar módulo',\n 'courses.editor.moduleTitle': 'Título do módulo',\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',\n 'courses.editor.untitledCourse': 'Curso sem título',\n 'courses.editor.untitledModule': 'Novo módulo',\n 'courses.editor.untitledLesson': 'Nova aula',\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 } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Course } from '@fayz-ai/courses'\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\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 setCreating(true)\n try {\n const course = await getCoursesProvider().createCourse({\n title: t('courses.editor.untitledCourse') || 'Untitled course',\n status: 'draft',\n })\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 <Button onClick={onCreate} disabled={creating}>\n {t('courses.new') || 'New course'}\n </Button>\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 <Button onClick={onCreate} disabled={creating}>\n {t('courses.new') || 'New course'}\n </Button>\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?.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","import * as React from 'react'\nimport { Button, Input, toast } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n getCoursesProvider,\n type Course, type Module, type Lesson, type CourseStatus,\n} from '@fayz-ai/courses'\nimport { navigateTo } from '../nav'\n\nconst STATUSES: CourseStatus[] = ['draft', 'published', 'archived']\n\nexport function CourseEditorPage({ id }: { id?: string }) {\n const t = useTranslation()\n const [tab, setTab] = React.useState<'details' | 'curriculum'>('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\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 const [m, l] = await Promise.all([provider.listModules(c.id), provider.listLessons(c.id)])\n setModules(m)\n setLessons(l)\n }\n }, [id])\n\n React.useEffect(() => { void reload() }, [reload])\n\n if (!course) {\n return <div className=\"p-8 text-muted-foreground\">…</div>\n }\n\n async function saveDetails() {\n const provider = getCoursesProvider()\n await provider.updateCourse(course!.id, {\n title: course!.title,\n subtitle: course!.subtitle ?? undefined,\n description: course!.description ?? undefined,\n price: course!.price,\n status: course!.status,\n })\n toast.success(t('courses.editor.saved') || 'Course saved')\n }\n\n function patchCourse(patch: Partial<Course>) {\n setCourse((c) => (c ? { ...c, ...patch } : c))\n }\n\n // --- module / lesson mutations (persist immediately, then reload) ---------\n async function addModule() {\n await getCoursesProvider().createModule({\n courseId: course!.id,\n title: t('courses.editor.untitledModule') || 'New module',\n })\n await reload()\n }\n async function renameModule(moduleId: string, title: string) {\n await getCoursesProvider().updateModule(moduleId, { title })\n }\n async function deleteModule(moduleId: string) {\n await getCoursesProvider().deleteModule(moduleId)\n await reload()\n }\n async function addLesson(moduleId: string) {\n await getCoursesProvider().createLesson({\n courseId: course!.id,\n moduleId,\n title: t('courses.editor.untitledLesson') || 'New lesson',\n videoUrl: 'https://www.youtube.com/embed/dQw4w9WgXcQ',\n })\n await reload()\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 async function deleteLesson(lessonId: string) {\n await getCoursesProvider().deleteLesson(lessonId)\n await reload()\n }\n\n return (\n <div className=\"mx-auto max-w-4xl p-6 md:p-8\">\n <button onClick={() => navigateTo('/courses')} className=\"mb-4 text-sm text-muted-foreground hover:text-foreground\">\n ← {t('courses.editor.back') || 'Back to courses'}\n </button>\n\n <h1 className=\"mb-1 text-2xl font-bold text-foreground\">{course.title}</h1>\n\n <div className=\"mb-6 mt-4 flex gap-2 border-b border-border\">\n {(['details', 'curriculum'] as const).map((tk) => (\n <button\n key={tk}\n onClick={() => setTab(tk)}\n className={`-mb-px border-b-2 px-3 py-2 text-sm font-medium ${\n tab === tk ? 'border-primary text-foreground' : 'border-transparent text-muted-foreground'\n }`}\n >\n {tk === 'details' ? (t('courses.editor.details') || 'Details') : (t('courses.editor.curriculum') || 'Curriculum')}\n </button>\n ))}\n </div>\n\n {tab === 'details' && (\n <div className=\"max-w-xl 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 className=\"min-h-24 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={course.description ?? ''}\n onChange={(e) => patchCourse({ description: e.target.value })}\n />\n </Field>\n <div className=\"flex gap-4\">\n <Field label={t('courses.editor.fieldPrice') || 'Price'}>\n <Input\n type=\"number\"\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\n className=\"h-10 rounded-md border border-input bg-background px-3 text-sm\"\n value={course.status}\n onChange={(e) => patchCourse({ status: e.target.value as CourseStatus })}\n >\n {STATUSES.map((s) => (\n <option key={s} value={s}>{t(`courses.status.${s}`) || s}</option>\n ))}\n </select>\n </Field>\n </div>\n <Button onClick={saveDetails}>{t('courses.editor.save') || 'Save'}</Button>\n </div>\n )}\n\n {tab === 'curriculum' && (\n <div className=\"space-y-6\">\n {modules.map((mod) => (\n <div key={mod.id} className=\"rounded-xl border border-border bg-card p-4\">\n <div className=\"mb-3 flex items-center gap-2\">\n <Input\n className=\"font-medium\"\n defaultValue={mod.title}\n onBlur={(e) => renameModule(mod.id, e.target.value)}\n aria-label={t('courses.editor.moduleTitle') || 'Module title'}\n />\n <Button variant=\"ghost\" size=\"sm\" onClick={() => deleteModule(mod.id)}>\n {t('courses.editor.deleteModule') || 'Delete module'}\n </Button>\n </div>\n <div className=\"space-y-2\">\n {lessons.filter((l) => l.moduleId === mod.id).map((lesson) => (\n <div key={lesson.id} className=\"grid grid-cols-1 gap-2 rounded-md border border-border p-3 md:grid-cols-[1fr_1fr_90px_auto]\">\n <Input\n defaultValue={lesson.title}\n placeholder={t('courses.editor.lessonTitle') || 'Lesson title'}\n onBlur={(e) => patchLesson(lesson.id, { title: e.target.value })}\n />\n <Input\n defaultValue={lesson.videoUrl}\n placeholder={t('courses.editor.lessonVideo') || 'Video URL (embed)'}\n onBlur={(e) => patchLesson(lesson.id, { videoUrl: e.target.value })}\n />\n <Input\n type=\"number\"\n defaultValue={String(Math.round(lesson.durationSec / 60))}\n onBlur={(e) => patchLesson(lesson.id, { durationSec: (Number(e.target.value) || 0) * 60 })}\n aria-label={t('courses.editor.lessonDuration') || 'Duration (min)'}\n />\n <Button variant=\"ghost\" size=\"sm\" onClick={() => deleteLesson(lesson.id)}>\n {t('courses.editor.deleteLesson') || 'Remove'}\n </Button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={() => addLesson(mod.id)}>\n + {t('courses.editor.addLesson') || 'Add lesson'}\n </Button>\n </div>\n </div>\n ))}\n <Button onClick={addModule}>{t('courses.editor.addModule') || 'Add module'}</Button>\n </div>\n )}\n </div>\n )\n}\nCourseEditorPage.displayName = 'CourseEditorPage'\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\n {children}\n </div>\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} from '@fayz-ai/courses'\nimport { coursesLocales } from './locales'\nimport { CoursesListPage } from './pages/CoursesListPage'\nimport { CourseEditorPage } from './pages/CourseEditorPage'\n\n// ---------------------------------------------------------------------------\n// @fayz-ai/plugin-courses — admin management for the courses domain. Mirrors\n// @fayz-ai/plugin-shop: a navigation entry + routes pointing at custom admin pages\n// built directly on @fayz-ai/courses. Native from day one (no saas-core imports).\n// ---------------------------------------------------------------------------\n\nexport interface CoursesPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n scope?: PluginScope\n verticalId?: VerticalId\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 // 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 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 defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 1,\n label: options?.navLabel ?? 'Courses',\n route: '/courses',\n icon: 'BookOpen',\n },\n ],\n routes: [\n { path: '/courses', component: CoursesListPage as React.ComponentType<unknown> },\n { path: '/courses/:id', component: CourseEditorPage as React.ComponentType<unknown> },\n ],\n widgets: [],\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/nav.ts","../src/pages/CoursesListPage.tsx","../src/lib/format.ts","../src/pages/CourseEditorPage.tsx","../src/components/CommerceUI.tsx","../src/pages/SalesPage.tsx","../src/pages/SubscriptionsPage.tsx","../src/pages/FinancialPage.tsx","../src/pages/ReportsPage.tsx","../src/pages/MembersAreaPage.tsx","../src/settings/CoursesSettings.tsx","../src/dashboardWidgets.tsx","../src/connectors/stripe.ts","../src/index.ts"],"names":["hashRouterAdapter","useTranslation","useModuleLayout","courses","React","getCoursesProvider","jsxs","PageHeaderActions","jsx","Button","Badge","React2","toast","Input","Card","React3","DataTable","statusVariant","React4","React5","React6","React7","React8","React9","SettingsGroup","SelectRow","ToggleRow","PluginSettingsPanel","React10","KpiCard","defineKpiWidget","registerTranslations","setCoursesTenantResolver","useOrganizationStore","getCoursesProviderOptional","setCoursesProvider","createMockCoursesProvider","registerPluginFactory"],"mappings":"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","file":"index.cjs","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.addModule': 'Add module',\n 'courses.editor.moduleTitle': 'Module title',\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',\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 'courses.editor.tab.settings': 'Payment',\n 'courses.editor.tab.checkout': 'Checkout',\n 'courses.editor.tab.links': 'Links',\n 'courses.editor.membersHelp': 'Buyers of this course are added to its members area automatically. Access groups per offer:',\n 'courses.editor.defaultGroup': 'Default group',\n 'courses.editor.settingsHelp': 'Payment methods offered at checkout (Stripe).',\n 'courses.editor.payCard': 'Credit card (up to 12x)',\n 'courses.editor.payPix': 'Pix',\n 'courses.editor.payBoleto': 'Boleto',\n 'courses.editor.settingsNote': 'Method availability depends on Stripe in your region; wired in Stage 3.',\n 'courses.editor.checkoutSoon': 'Custom checkout builder comes in a later milestone. A default checkout is generated per offer.',\n 'courses.editor.linksHelp': 'Shareable checkout links, one per offer.',\n // Offers\n 'courses.offers.help': 'Price points a customer can buy. Mark one default; order-bumps show on other checkouts.',\n 'courses.offers.name': 'Offer name',\n 'courses.offers.price': 'Price',\n 'courses.offers.oneTime': 'One-time',\n 'courses.offers.subscription': 'Subscription',\n 'courses.offers.default': 'Default',\n 'courses.offers.bump': 'Bump',\n 'courses.offers.remove': 'Remove',\n 'courses.offers.add': 'Add offer',\n 'courses.offers.newName': 'New offer',\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.addModule': 'Adicionar módulo',\n 'courses.editor.moduleTitle': 'Título do módulo',\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',\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 'courses.editor.tab.settings': 'Pagamento',\n 'courses.editor.tab.checkout': 'Checkout',\n 'courses.editor.tab.links': 'Links',\n 'courses.editor.membersHelp': 'Quem compra este curso entra automaticamente na área de membros. Grupos de acesso por oferta:',\n 'courses.editor.defaultGroup': 'Grupo padrão',\n 'courses.editor.settingsHelp': 'Métodos de pagamento no checkout (Stripe).',\n 'courses.editor.payCard': 'Cartão de crédito (até 12x)',\n 'courses.editor.payPix': 'Pix',\n 'courses.editor.payBoleto': 'Boleto',\n 'courses.editor.settingsNote': 'A disponibilidade de cada método depende do Stripe na sua região; ligado na Etapa 3.',\n 'courses.editor.checkoutSoon': 'O construtor de checkout chega numa etapa futura. Um checkout padrão é gerado por oferta.',\n 'courses.editor.linksHelp': 'Links de checkout compartilháveis, um por oferta.',\n // Offers\n 'courses.offers.help': 'Preços que o cliente pode comprar. Marque um padrão; order-bumps aparecem nos checkouts das outras.',\n 'courses.offers.name': 'Nome da oferta',\n 'courses.offers.price': 'Preço',\n 'courses.offers.oneTime': 'Único',\n 'courses.offers.subscription': 'Assinatura',\n 'courses.offers.default': 'Padrão',\n 'courses.offers.bump': 'Bump',\n 'courses.offers.remove': 'Remover',\n 'courses.offers.add': 'Adicionar oferta',\n 'courses.offers.newName': 'Nova oferta',\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 } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Course } from '@fayz-ai/courses'\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\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 setCreating(true)\n try {\n const course = await getCoursesProvider().createCourse({\n title: t('courses.editor.untitledCourse') || 'Untitled course',\n status: 'draft',\n })\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 <Button onClick={onCreate} disabled={creating}>\n {t('courses.new') || 'New course'}\n </Button>\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 <Button onClick={onCreate} disabled={creating}>\n {t('courses.new') || 'New course'}\n </Button>\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?.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","// 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 { Button, Input, Badge, toast } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n getCoursesProvider,\n type Course, type Module, type Lesson, type CourseStatus,\n type Offer, type OfferKind,\n} from '@fayz-ai/courses'\nimport { navigateTo } from '../nav'\nimport { formatMoney } from '../lib/format'\n\nconst STATUSES: CourseStatus[] = ['draft', 'published', 'archived']\n\nconst TABS = ['details', 'curriculum', 'offers', 'members', 'settings', 'checkout', 'links'] as const\ntype Tab = (typeof TABS)[number]\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\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 const [m, l, o] = await Promise.all([\n provider.listModules(c.id),\n provider.listLessons(c.id),\n provider.listOffers(c.id),\n ])\n setModules(m)\n setLessons(l)\n setOffers(o)\n }\n }, [id])\n\n React.useEffect(() => { void reload() }, [reload])\n\n if (!course) {\n return <div className=\"p-8 text-muted-foreground\">…</div>\n }\n\n async function saveDetails() {\n await getCoursesProvider().updateCourse(course!.id, {\n title: course!.title,\n subtitle: course!.subtitle ?? undefined,\n description: course!.description ?? undefined,\n price: course!.price,\n status: course!.status,\n })\n toast.success(t('courses.editor.saved') || 'Course saved')\n }\n\n function patchCourse(patch: Partial<Course>) {\n setCourse((c) => (c ? { ...c, ...patch } : c))\n }\n\n // --- module / lesson mutations (persist immediately, then reload) ---------\n async function addModule() {\n await getCoursesProvider().createModule({ courseId: course!.id, title: t('courses.editor.untitledModule') || 'New module' })\n await reload()\n }\n async function renameModule(moduleId: string, title: string) {\n await getCoursesProvider().updateModule(moduleId, { title })\n }\n async function deleteModule(moduleId: string) {\n await getCoursesProvider().deleteModule(moduleId)\n await reload()\n }\n async function addLesson(moduleId: string) {\n await getCoursesProvider().createLesson({\n courseId: course!.id,\n moduleId,\n title: t('courses.editor.untitledLesson') || 'New lesson',\n videoUrl: 'https://www.youtube.com/embed/dQw4w9WgXcQ',\n })\n await reload()\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 async function deleteLesson(lessonId: string) {\n await getCoursesProvider().deleteLesson(lessonId)\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 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 await reload()\n }\n\n return (\n <div className=\"mx-auto max-w-4xl p-6 md:p-8\">\n <button onClick={() => navigateTo('/courses')} className=\"mb-4 text-sm text-muted-foreground hover:text-foreground\">\n ← {t('courses.editor.back') || 'Back to courses'}\n </button>\n\n <h1 className=\"mb-1 text-2xl font-bold text-foreground\">{course.title}</h1>\n\n <div className=\"mb-6 mt-4 flex gap-1 overflow-x-auto border-b border-border\">\n {TABS.map((tk) => (\n <button\n key={tk}\n onClick={() => setTab(tk)}\n className={`-mb-px whitespace-nowrap border-b-2 px-3 py-2 text-sm font-medium ${\n tab === tk ? 'border-primary text-foreground' : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {t(`courses.editor.tab.${tk}`) || tk}\n </button>\n ))}\n </div>\n\n {tab === 'details' && (\n <div className=\"max-w-xl 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 className=\"min-h-24 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={course.description ?? ''}\n onChange={(e) => patchCourse({ description: e.target.value })}\n />\n </Field>\n <div className=\"flex gap-4\">\n <Field label={t('courses.editor.fieldPrice') || 'Price'}>\n <Input type=\"number\" value={String(course.price)} onChange={(e) => patchCourse({ price: Number(e.target.value) || 0 })} />\n </Field>\n <Field label={t('courses.editor.fieldStatus') || 'Status'}>\n <select\n className=\"h-10 rounded-md border border-input bg-background px-3 text-sm\"\n value={course.status}\n onChange={(e) => patchCourse({ status: e.target.value as CourseStatus })}\n >\n {STATUSES.map((s) => (\n <option key={s} value={s}>{t(`courses.status.${s}`) || s}</option>\n ))}\n </select>\n </Field>\n </div>\n <Button onClick={saveDetails}>{t('courses.editor.save') || 'Save'}</Button>\n </div>\n )}\n\n {tab === 'curriculum' && (\n <div className=\"space-y-6\">\n {modules.map((mod) => (\n <div key={mod.id} className=\"rounded-xl border border-border bg-card p-4\">\n <div className=\"mb-3 flex items-center gap-2\">\n <Input\n className=\"font-medium\"\n defaultValue={mod.title}\n onBlur={(e) => renameModule(mod.id, e.target.value)}\n aria-label={t('courses.editor.moduleTitle') || 'Module title'}\n />\n <Button variant=\"ghost\" size=\"sm\" onClick={() => deleteModule(mod.id)}>\n {t('courses.editor.deleteModule') || 'Delete module'}\n </Button>\n </div>\n <div className=\"space-y-2\">\n {lessons.filter((l) => l.moduleId === mod.id).map((lesson) => (\n <div key={lesson.id} className=\"grid grid-cols-1 gap-2 rounded-md border border-border p-3 md:grid-cols-[1fr_1fr_90px_auto]\">\n <Input defaultValue={lesson.title} placeholder={t('courses.editor.lessonTitle') || 'Lesson title'} onBlur={(e) => patchLesson(lesson.id, { title: e.target.value })} />\n <Input defaultValue={lesson.videoUrl} placeholder={t('courses.editor.lessonVideo') || 'Video URL (embed)'} onBlur={(e) => patchLesson(lesson.id, { videoUrl: e.target.value })} />\n <Input type=\"number\" defaultValue={String(Math.round(lesson.durationSec / 60))} onBlur={(e) => patchLesson(lesson.id, { durationSec: (Number(e.target.value) || 0) * 60 })} aria-label={t('courses.editor.lessonDuration') || 'Duration (min)'} />\n <Button variant=\"ghost\" size=\"sm\" onClick={() => deleteLesson(lesson.id)}>\n {t('courses.editor.deleteLesson') || 'Remove'}\n </Button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={() => addLesson(mod.id)}>\n + {t('courses.editor.addLesson') || 'Add lesson'}\n </Button>\n </div>\n </div>\n ))}\n <Button onClick={addModule}>{t('courses.editor.addModule') || 'Add module'}</Button>\n </div>\n )}\n\n {tab === 'offers' && (\n <div className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {t('courses.offers.help') || 'Price points a customer can buy. Mark one default; order-bumps show on other checkouts.'}\n </p>\n {offers.map((offer) => (\n <div key={offer.id} className=\"grid grid-cols-1 gap-2 rounded-xl border border-border bg-card p-3 md:grid-cols-[1fr_120px_130px_auto]\">\n <Input defaultValue={offer.name} onBlur={(e) => patchOffer(offer.id, { name: e.target.value })} aria-label={t('courses.offers.name') || 'Offer name'} />\n <Input type=\"number\" defaultValue={String(offer.price)} onBlur={(e) => patchOffer(offer.id, { price: Number(e.target.value) || 0 })} aria-label={t('courses.offers.price') || 'Price'} />\n <select\n className=\"h-10 rounded-md border border-input bg-background px-2 text-sm\"\n value={offer.kind}\n onChange={(e) => patchOffer(offer.id, { kind: e.target.value as OfferKind, recurringInterval: e.target.value === 'subscription' ? (offer.recurringInterval ?? 'month') : null })}\n >\n <option value=\"one_time\">{t('courses.offers.oneTime') || 'One-time'}</option>\n <option value=\"subscription\">{t('courses.offers.subscription') || 'Subscription'}</option>\n </select>\n <div className=\"flex items-center gap-2\">\n {offer.isDefault && <Badge variant=\"secondary\">{t('courses.offers.default') || 'Default'}</Badge>}\n {offer.isOrderBump && <Badge variant=\"outline\">{t('courses.offers.bump') || 'Bump'}</Badge>}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => deleteOffer(offer.id)}>{t('courses.offers.remove') || 'Remove'}</Button>\n </div>\n </div>\n ))}\n <Button onClick={addOffer}>+ {t('courses.offers.add') || 'Add offer'}</Button>\n </div>\n )}\n\n {tab === 'members' && (\n <div className=\"space-y-3 text-sm\">\n <p className=\"text-muted-foreground\">\n {t('courses.editor.membersHelp') || 'Buyers of this course are added to its members area automatically. Access groups per offer:'}\n </p>\n <div className=\"rounded-xl border border-border bg-card divide-y divide-border\">\n {offers.map((offer) => (\n <div key={offer.id} className=\"flex items-center justify-between px-4 py-3\">\n <span className=\"font-medium text-foreground\">{offer.name}</span>\n <span className=\"text-muted-foreground\">{formatMoney(offer.price, offer.currency)}</span>\n <Badge variant=\"secondary\">{t('courses.editor.defaultGroup') || 'Default group'}</Badge>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {tab === 'settings' && (\n <div className=\"max-w-xl space-y-4 text-sm\">\n <p className=\"text-muted-foreground\">{t('courses.editor.settingsHelp') || 'Payment methods offered at checkout (Stripe).'}</p>\n {[\n ['card', t('courses.editor.payCard') || 'Credit card (up to 12x)'],\n ['pix', t('courses.editor.payPix') || 'Pix'],\n ['boleto', t('courses.editor.payBoleto') || 'Boleto'],\n ].map(([k, label]) => (\n <label key={k} className=\"flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3\">\n <input type=\"checkbox\" defaultChecked className=\"h-4 w-4\" />\n <span className=\"text-foreground\">{label}</span>\n </label>\n ))}\n <p className=\"text-xs text-muted-foreground\">{t('courses.editor.settingsNote') || 'Method availability depends on Stripe in your region; wired in Stage 3.'}</p>\n </div>\n )}\n\n {tab === 'checkout' && (\n <div className=\"rounded-xl border border-dashed border-border p-10 text-center text-sm text-muted-foreground\">\n {t('courses.editor.checkoutSoon') || 'Custom checkout builder comes in a later milestone. A default checkout is generated per offer.'}\n </div>\n )}\n\n {tab === 'links' && (\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">{t('courses.editor.linksHelp') || 'Shareable checkout links, one per offer.'}</p>\n <div className=\"rounded-xl border border-border bg-card divide-y divide-border\">\n {offers.map((offer) => (\n <div key={offer.id} className=\"flex flex-col gap-1 px-4 py-3 md:flex-row md:items-center md:justify-between\">\n <span className=\"font-medium text-foreground\">{offer.name}</span>\n <code className=\"rounded bg-muted px-2 py-1 text-xs text-muted-foreground\">/checkout/{course.slug}?offer={offer.id}</code>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\nCourseEditorPage.displayName = 'CourseEditorPage'\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\n {children}\n </div>\n )\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\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 }: {\n columns: SimpleColumn<T>[]\n rows: T[]\n empty: string\n loading?: boolean\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 <DataTable columns={cols} data={rows} emptyMessage={empty} loading={loading} />\n}\n","import * as React from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Order, type FinancialStatus } from '@fayz-ai/courses'\nimport { PageContainer, StatCard, StatGrid, SimpleTable, type SimpleColumn } from '../components/CommerceUI'\nimport { formatMoney, formatDate } from '../lib/format'\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\nexport function SalesPage() {\n const t = useTranslation()\n const [orders, setOrders] = React.useState<Order[] | null>(null)\n\n React.useEffect(() => {\n void getCoursesProvider().listOrders().then(setOrders)\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: SimpleColumn<Order>[] = [\n { key: 'date', header: t('courses.sales.date') || 'Date', render: (o) => <span className=\"text-muted-foreground\">{formatDate(o.createdAt)}</span> },\n { key: 'customer', header: t('courses.sales.customer') || 'Customer', 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') || 'Method', render: (o) => <span className=\"capitalize\">{o.paymentMethod ?? '—'}</span> },\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') || 'Platform fee', align: 'right', render: (o) => <span className=\"text-muted-foreground\">{formatMoney(o.platformFee, o.currency)}</span> },\n { key: 'total', header: t('courses.sales.amount') || 'Amount', align: 'right', render: (o) => <span className=\"font-medium text-foreground\">{formatMoney(o.total, o.currency)}</span> },\n ]\n\n return (\n <PageContainer title={t('courses.sales.title') || 'Sales'} subtitle={t('courses.sales.subtitle') || 'Every transaction across your courses.'}>\n <StatGrid>\n <StatCard label={t('courses.sales.count') || 'Sales'} value={String(paid.length)} />\n <StatCard label={t('courses.sales.revenue') || 'Revenue'} value={formatMoney(revenue, currency)} />\n </StatGrid>\n <SimpleTable\n columns={columns}\n rows={orders ?? []}\n empty={t('courses.sales.empty') || 'No sales yet.'}\n />\n </PageContainer>\n )\n}\nSalesPage.displayName = 'SalesPage'\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\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 { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCoursesProvider, type Order, type Course } from '@fayz-ai/courses'\nimport { PageContainer, SimpleTable, type SimpleColumn } from '../components/CommerceUI'\n\ninterface Row {\n courseId: string\n title: string\n status: Course['status']\n students: number\n}\n\nexport function MembersAreaPage() {\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(buildMembersAreas(courses, orders))\n })\n }, [])\n\n const columns: SimpleColumn<Row>[] = [\n { key: 'title', header: t('courses.membersArea.name') || 'Members area', render: (r) => <span className=\"font-medium text-foreground\">{r.title}</span> },\n { key: 'status', header: t('courses.membersArea.status') || 'Status', render: (r) => (\n <Badge variant={r.status === 'published' ? 'success' : r.status === 'archived' ? 'outline' : 'secondary'}>\n {t(`courses.status.${r.status}`) || r.status}\n </Badge>\n ) },\n { key: 'students', header: t('courses.membersArea.students') || 'Students', align: 'right', render: (r) => <span className=\"text-foreground\">{r.students}</span> },\n ]\n\n return (\n <PageContainer title={t('courses.membersArea.title') || 'Members area'} subtitle={t('courses.membersArea.subtitle') || 'One area per course; students land here after purchase.'}>\n <SimpleTable\n columns={columns}\n rows={rows ?? []}\n empty={t('courses.membersArea.empty') || 'No members areas yet.'}\n />\n </PageContainer>\n )\n}\nMembersAreaPage.displayName = 'MembersAreaPage'\n\nfunction buildMembersAreas(courses: Course[], orders: Order[]): Row[] {\n const students = new Map<string, Set<string>>()\n for (const o of orders) {\n const set = students.get(o.courseId) ?? new Set<string>()\n if (o.customerId) set.add(o.customerId)\n students.set(o.courseId, set)\n }\n return courses.map((c) => ({\n courseId: c.id,\n title: c.title,\n status: c.status,\n students: students.get(c.id)?.size ?? 0,\n }))\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\nexport function createCoursesDashboardWidgets(): DashboardWidgetDef[] {\n return [\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 defineKpiWidget({ id: 'courses.kpi.mrr', title: 'courses.kpi.mrr', domain: 'courses', defaultOrder: 2, component: MrrKpi }),\n defineKpiWidget({ id: 'courses.kpi.fees', title: 'courses.kpi.fees', domain: 'courses', defaultOrder: 3, component: FeesKpi }),\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 { SubscriptionsPage } from './pages/SubscriptionsPage'\nimport { FinancialPage } from './pages/FinancialPage'\nimport { ReportsPage } from './pages/ReportsPage'\nimport { MembersAreaPage } from './pages/MembersAreaPage'\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 scope?: PluginScope\n verticalId?: VerticalId\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\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 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 navigation: [\n { section, position: base, label: options?.navLabel ?? 'Courses', route: '/courses', icon: 'BookOpen', permission: read('courses') },\n { section, position: base + 1, label: 'Members area', route: '/courses/members', icon: 'GraduationCap', permission: read('courses') },\n { section, position: base + 2, label: 'Sales', route: '/courses/sales', icon: 'TrendingUp', permission: read('courses.sales') },\n { section, position: base + 3, label: 'Subscriptions', route: '/courses/subscriptions', icon: 'Repeat', permission: read('courses.sales') },\n { section, position: base + 4, label: 'Financial', route: '/courses/financial', icon: 'CreditCard', permission: read('courses.finance') },\n { section, position: base + 5, label: 'Reports', route: '/courses/reports', icon: 'BarChart3', permission: read('courses.sales') },\n ],\n 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 { path: '/courses/members', component: asComp(MembersAreaPage), permission: read('courses') },\n { path: '/courses/sales', component: asComp(SalesPage), permission: read('courses.sales') },\n { path: '/courses/subscriptions', component: asComp(SubscriptionsPage), permission: read('courses.sales') },\n { path: '/courses/financial', component: asComp(FinancialPage), permission: read('courses.finance') },\n { path: '/courses/reports', component: asComp(ReportsPage), permission: read('courses.sales') },\n { path: '/courses/:id', component: asComp(CourseEditorPage) },\n ],\n widgets: [],\n dashboardWidgets: createCoursesDashboardWidgets(),\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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAiB5E,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,cAAc,CAmClF;AAOD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AA8B5E,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB;AAKD,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,cAAc,CA0DlF;AAOD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA"}