@fayz-ai/plugin-courses 0.10.26 → 0.10.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/public/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useState, useEffect, useMemo, createElement } from 'react';
|
|
2
|
-
import { getSupabaseClientOptional } from '@fayz-ai/core';
|
|
2
|
+
import { describeError, getSupabaseClientOptional } from '@fayz-ai/core';
|
|
3
3
|
import { createSupabaseCoursesProvider } from '@fayz-ai/courses';
|
|
4
4
|
import { Loader2, CheckCircle2, ShieldCheck, QrCode, CreditCard, Lock } from 'lucide-react';
|
|
5
5
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
@@ -121,7 +121,7 @@ var CheckoutScreen = ({
|
|
|
121
121
|
setCourse(c);
|
|
122
122
|
setOffer(o);
|
|
123
123
|
} catch (err) {
|
|
124
|
-
if (!cancelled) setLoadError(err
|
|
124
|
+
if (!cancelled) setLoadError(describeError(err, "Falha ao carregar o curso."));
|
|
125
125
|
} finally {
|
|
126
126
|
if (!cancelled) setLoading(false);
|
|
127
127
|
}
|
|
@@ -152,7 +152,7 @@ var CheckoutScreen = ({
|
|
|
152
152
|
setOrderId(id);
|
|
153
153
|
onSuccess?.({ orderId: id, email: email.trim() });
|
|
154
154
|
} catch (err) {
|
|
155
|
-
setSubmitError(err
|
|
155
|
+
setSubmitError(describeError(err, "N\xE3o foi poss\xEDvel concluir a compra. Tente novamente."));
|
|
156
156
|
} finally {
|
|
157
157
|
setSubmitting(false);
|
|
158
158
|
}
|
package/dist/public/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/public/data/index.ts","../../src/public/data/supabase.ts","../../src/public/views/CheckoutScreen.tsx","../../src/public/createPublicCheckoutPlugin.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Data seam for the public course checkout surface.\n//\n// Mirrors plugins/plugin-agenda/src/public/data.ts: a small provider interface\n// with a mock default (dev without a backend) and a Supabase implementation\n// (data.supabase.ts) that reads the anon-visible catalog and calls the\n// course_place_order_simulated RPC. Kept dependency-light on purpose — the\n// public surface must NOT drag in @fayz-ai/admin or the courses admin graph.\n// ---------------------------------------------------------------------------\n\nimport type { Course, Offer } from '@fayz-ai/courses'\n\nexport type CheckoutPaymentMethod = 'pix' | 'card'\n\nexport interface PlaceOrderInput {\n email: string\n name?: string\n paymentMethod?: CheckoutPaymentMethod\n}\n\nexport interface PlaceOrderResult {\n orderId: string\n}\n\nexport interface PublicCheckoutDataProvider {\n /** Published course by slug (or id). Null when not found / not published. */\n getCourseBySlug(slug: string): Promise<Course | null>\n /** The offer pre-selected on the checkout (isDefault, else the first). */\n getDefaultOffer(courseId: string): Promise<Offer | null>\n /** Records the (simulated-paid) sale + enrollment. Returns the order id. */\n placeOrder(offerId: string, input: PlaceOrderInput): Promise<PlaceOrderResult>\n}\n\nexport interface MockCheckoutOptions {\n course?: Partial<Course>\n offer?: Partial<Offer>\n}\n\n/**\n * Loud mock: usable for a UI-only dev run with no backend. It fabricates a\n * single course + offer and a fake order id so the flow renders end-to-end.\n */\nexport function createMockCheckoutProvider(opts: MockCheckoutOptions = {}): PublicCheckoutDataProvider {\n const course: Course = {\n id: 'mock-course',\n slug: 'curso-demo',\n title: 'Curso Demo',\n subtitle: 'Um curso de demonstração',\n description: 'Conteúdo de exemplo para validar o fluxo de checkout.',\n thumbnailUrl: null,\n price: 197,\n currency: 'BRL',\n status: 'published',\n sortOrder: 0,\n createdAt: '2026-01-01T00:00:00.000Z',\n updatedAt: '2026-01-01T00:00:00.000Z',\n ...(opts.course as Partial<Course>),\n } as Course\n const offer: Offer = {\n id: 'mock-offer',\n courseId: course.id,\n name: course.title,\n price: course.price,\n currency: course.currency,\n kind: 'one_time',\n recurringInterval: null,\n isDefault: true,\n isOrderBump: false,\n sortOrder: 0,\n ...(opts.offer as Partial<Offer>),\n } as Offer\n\n let seq = 0\n return {\n async getCourseBySlug(slug: string) {\n return { ...course, slug: slug || course.slug }\n },\n async getDefaultOffer() {\n return offer\n },\n async placeOrder() {\n seq += 1\n if (typeof console !== 'undefined') {\n console.warn('[plugin-courses/public] MOCK placeOrder — no sale was recorded. Pass a tenantId for the real DB.')\n }\n return { orderId: `mock-order-${seq}` }\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// Supabase implementation of PublicCheckoutDataProvider — anon-safe.\n//\n// Public checkout runs with the publishable (anon) key and (usually) no user\n// session, so it only touches objects designed for anon access:\n// - plg_courses_courses / plg_courses_offers (published catalog is anon-\n// readable via the storefront RLS — read here through the shared\n// @fayz-ai/courses Supabase provider)\n// - course_place_order_simulated (SECURITY DEFINER RPC: places the order and\n// simulates a confirmed payment — paid order + enrollment [+ subscription])\n// Shipped by packages/courses/migrations/0009_course_place_order_simulated.sql.\n// ---------------------------------------------------------------------------\n\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { createSupabaseCoursesProvider } from '@fayz-ai/courses'\nimport type { PublicCheckoutDataProvider, PlaceOrderInput } from './index'\n\nexport interface SupabaseCheckoutOptions {\n /** Tenant this checkout sells for (RPC arg — required). */\n tenantId: string\n}\n\ninterface SupabaseLikeClient {\n rpc(fn: string, args: Record<string, unknown>): PromiseLike<{ data: unknown; error: { message: string } | null }>\n}\n\nfunction getClient(): SupabaseLikeClient {\n const client = getSupabaseClientOptional()\n if (!client) throw new Error('No Supabase client registered — call setGlobalSupabaseClient() at app startup.')\n return client as SupabaseLikeClient\n}\n\nexport function createSupabaseCheckoutProvider(options: SupabaseCheckoutOptions): PublicCheckoutDataProvider {\n const { tenantId } = options\n // Catalog reads reuse the courses provider (tenant scoping comes from the\n // host's setCoursesTenantResolver + storefront RLS on published rows).\n const courses = createSupabaseCoursesProvider()\n\n return {\n async getCourseBySlug(slug: string) {\n return courses.getCourse(slug)\n },\n\n async getDefaultOffer(courseId: string) {\n const offers = await courses.listOffers(courseId)\n return offers.find((o) => o.isDefault) ?? offers[0] ?? null\n },\n\n async placeOrder(offerId: string, input: PlaceOrderInput) {\n const email = input.email.trim()\n const { data, error } = await getClient().rpc('course_place_order_simulated', {\n p_tenant_id: tenantId,\n p_offer_id: offerId,\n p_customer_email: email,\n p_customer_name: input.name?.trim() || null,\n p_payment_method: input.paymentMethod ?? 'pix',\n })\n if (error) throw new Error(`[plugin-courses/public] placeOrder: ${error.message}`)\n const orderId = Array.isArray(data) ? (data[0] as string) : (data as string)\n return { orderId: String(orderId) }\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// CheckoutScreen — the public \"comprar curso\" surface.\n//\n// Loads a published course + its default offer by slug, collects name/email/\n// payment method, and records a (simulated-paid) sale via the data provider.\n// Dependency-light: React + lucide + Tailwind only — no @fayz-ai/admin.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useMemo, useState, type FC, type FormEvent } from 'react'\nimport { CheckCircle2, CreditCard, Loader2, Lock, QrCode, ShieldCheck } from 'lucide-react'\nimport type { Course, Offer } from '@fayz-ai/courses'\nimport type { CheckoutPaymentMethod, PublicCheckoutDataProvider } from '../data'\n\nexport interface CheckoutScreenProps {\n slug: string\n provider: PublicCheckoutDataProvider\n /** Accent color (CSS) for buttons/highlights. Default emerald. */\n accent?: string\n /** Where \"acessar área de membros\" points after success. Default '#/'. */\n memberAreaHref?: string\n /** Fired after a successful order with the resulting order id + email. */\n onSuccess?: (info: { orderId: string; email: string }) => void\n}\n\nfunction formatMoney(value: number, currency = 'BRL', locale = 'pt-BR'): string {\n try {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)\n } catch {\n return `R$ ${value.toFixed(2)}`\n }\n}\n\nexport const CheckoutScreen: FC<CheckoutScreenProps> = ({\n slug,\n provider,\n accent = '#10b981',\n memberAreaHref = '#/',\n onSuccess,\n}) => {\n const [course, setCourse] = useState<Course | null>(null)\n const [offer, setOffer] = useState<Offer | null>(null)\n const [loading, setLoading] = useState(true)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [method, setMethod] = useState<CheckoutPaymentMethod>('pix')\n\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [orderId, setOrderId] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n ;(async () => {\n try {\n const c = await provider.getCourseBySlug(slug)\n if (!c) throw new Error('Curso não encontrado.')\n const o = await provider.getDefaultOffer(c.id)\n if (cancelled) return\n setCourse(c)\n setOffer(o)\n } catch (err) {\n if (!cancelled) setLoadError(err instanceof Error ? err.message : 'Falha ao carregar o curso.')\n } finally {\n if (!cancelled) setLoading(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [slug, provider])\n\n const price = offer?.price ?? course?.price ?? 0\n const currency = offer?.currency ?? course?.currency ?? 'BRL'\n const isSubscription = offer?.kind === 'subscription'\n const intervalLabel = offer?.recurringInterval === 'year' ? '/ano' : '/mês'\n\n const canSubmit = useMemo(\n () => !!offer && !!email.trim() && /.+@.+\\..+/.test(email.trim()) && !submitting,\n [offer, email, submitting],\n )\n\n async function handleSubmit(e: FormEvent) {\n e.preventDefault()\n if (!offer || !canSubmit) return\n setSubmitting(true)\n setSubmitError(null)\n try {\n const { orderId: id } = await provider.placeOrder(offer.id, {\n email: email.trim(),\n name: name.trim() || undefined,\n paymentMethod: method,\n })\n setOrderId(id)\n onSuccess?.({ orderId: id, email: email.trim() })\n } catch (err) {\n setSubmitError(err instanceof Error ? err.message : 'Não foi possível concluir a compra. Tente novamente.')\n } finally {\n setSubmitting(false)\n }\n }\n\n if (loading) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50\">\n <Loader2 className=\"w-6 h-6 animate-spin text-gray-400\" />\n </div>\n )\n }\n\n if (loadError || !course) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 p-6\">\n <div className=\"max-w-md text-center\">\n <p className=\"text-lg font-semibold text-gray-900\">Ops!</p>\n <p className=\"mt-2 text-gray-600\">{loadError ?? 'Curso indisponível.'}</p>\n <a href=\"#/\" className=\"mt-4 inline-block text-sm font-medium underline\" style={{ color: accent }}>\n Voltar\n </a>\n </div>\n </div>\n )\n }\n\n // Success state ----------------------------------------------------------\n if (orderId) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 p-6\">\n <div className=\"max-w-md w-full bg-white rounded-2xl shadow-sm border border-gray-100 p-8 text-center\">\n <div\n className=\"mx-auto w-14 h-14 rounded-full flex items-center justify-center\"\n style={{ backgroundColor: `${accent}1a` }}\n >\n <CheckCircle2 className=\"w-8 h-8\" style={{ color: accent }} />\n </div>\n <h1 className=\"mt-4 text-xl font-bold text-gray-900\">Compra confirmada!</h1>\n <p className=\"mt-2 text-gray-600\">\n Seu acesso a <strong>{course.title}</strong> já está liberado. Enviamos os detalhes para{' '}\n <strong>{email.trim()}</strong>.\n </p>\n <p className=\"mt-1 text-xs text-gray-400\">Pedido {orderId}</p>\n <a\n href={memberAreaHref}\n className=\"mt-6 inline-flex w-full items-center justify-center rounded-xl px-4 py-3 font-semibold text-white\"\n style={{ backgroundColor: accent }}\n >\n Acessar área de membros\n </a>\n </div>\n </div>\n )\n }\n\n // Checkout form ----------------------------------------------------------\n return (\n <div className=\"min-h-screen bg-gray-50 py-10 px-4\">\n <div className=\"max-w-3xl mx-auto grid gap-6 md:grid-cols-5\">\n {/* Order summary */}\n <aside className=\"md:col-span-2 bg-white rounded-2xl border border-gray-100 shadow-sm p-6 h-fit\">\n {course.thumbnailUrl && (\n <img\n src={course.thumbnailUrl}\n alt={course.title}\n className=\"w-full aspect-video object-cover rounded-xl mb-4\"\n />\n )}\n <h2 className=\"text-lg font-bold text-gray-900\">{course.title}</h2>\n {course.subtitle && <p className=\"mt-1 text-sm text-gray-500\">{course.subtitle}</p>}\n <div className=\"mt-4 border-t border-gray-100 pt-4\">\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-sm text-gray-500\">{offer?.name ?? 'Acesso ao curso'}</span>\n <span className=\"text-xl font-bold text-gray-900\">\n {formatMoney(price, currency)}\n {isSubscription && <span className=\"text-sm font-normal text-gray-400\"> {intervalLabel}</span>}\n </span>\n </div>\n </div>\n <div className=\"mt-4 flex items-center gap-2 text-xs text-gray-400\">\n <ShieldCheck className=\"w-4 h-4\" />\n Pagamento seguro · acesso imediato\n </div>\n </aside>\n\n {/* Payment form */}\n <form onSubmit={handleSubmit} className=\"md:col-span-3 bg-white rounded-2xl border border-gray-100 shadow-sm p-6\">\n <h1 className=\"text-xl font-bold text-gray-900\">Finalizar compra</h1>\n <p className=\"mt-1 text-sm text-gray-500\">Preencha seus dados para liberar o acesso.</p>\n\n <label className=\"block mt-6 text-sm font-medium text-gray-700\">\n Nome completo\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Seu nome\"\n className=\"mt-1 w-full rounded-xl border border-gray-200 px-3 py-2.5 focus:outline-none focus:ring-2\"\n style={{ ['--tw-ring-color' as string]: accent }}\n />\n </label>\n\n <label className=\"block mt-4 text-sm font-medium text-gray-700\">\n E-mail *\n <input\n type=\"email\"\n required\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"voce@email.com\"\n className=\"mt-1 w-full rounded-xl border border-gray-200 px-3 py-2.5 focus:outline-none focus:ring-2\"\n style={{ ['--tw-ring-color' as string]: accent }}\n />\n </label>\n\n <fieldset className=\"mt-4\">\n <legend className=\"text-sm font-medium text-gray-700\">Forma de pagamento</legend>\n <div className=\"mt-2 grid grid-cols-2 gap-3\">\n {(\n [\n { id: 'pix' as const, label: 'Pix', icon: QrCode },\n { id: 'card' as const, label: 'Cartão', icon: CreditCard },\n ]\n ).map(({ id, label, icon: Icon }) => {\n const active = method === id\n return (\n <button\n key={id}\n type=\"button\"\n onClick={() => setMethod(id)}\n className=\"flex items-center gap-2 rounded-xl border px-3 py-2.5 text-sm font-medium transition\"\n style={\n active\n ? { borderColor: accent, backgroundColor: `${accent}0f`, color: accent }\n : { borderColor: '#e5e7eb', color: '#374151' }\n }\n >\n <Icon className=\"w-4 h-4\" />\n {label}\n </button>\n )\n })}\n </div>\n </fieldset>\n\n {submitError && (\n <p className=\"mt-4 text-sm text-red-600 bg-red-50 border border-red-100 rounded-xl px-3 py-2\">\n {submitError}\n </p>\n )}\n\n <button\n type=\"submit\"\n disabled={!canSubmit}\n className=\"mt-6 inline-flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 font-semibold text-white disabled:opacity-50\"\n style={{ backgroundColor: accent }}\n >\n {submitting ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" /> Processando…\n </>\n ) : (\n <>\n <Lock className=\"w-4 h-4\" /> Pagar {formatMoney(price, currency)}\n {isSubscription && ` ${intervalLabel}`}\n </>\n )}\n </button>\n <p className=\"mt-3 text-center text-xs text-gray-400\">\n Ambiente de demonstração — pagamento simulado, sem cobrança real.\n </p>\n </form>\n </div>\n </div>\n )\n}\n\nCheckoutScreen.displayName = 'CheckoutScreen'\n","// ---------------------------------------------------------------------------\n// createPublicCheckoutPlugin — the public \"landing → checkout\" seam for courses.\n//\n// Mirrors plugin-agenda/src/public/createPublicBookingPlugin: resolve a data\n// provider (injected → Supabase when a tenantId is set → loud mock), expose a\n// ready-to-mount CheckoutScreen + a PluginManifest with a public route. A host\n// app (e.g. course-members) either mounts the manifest route or renders\n// CheckoutScreen directly in its own router.\n// ---------------------------------------------------------------------------\n\nimport { createElement, type FC } from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { createMockCheckoutProvider, type PublicCheckoutDataProvider } from './data'\nimport { createSupabaseCheckoutProvider } from './data/supabase'\nimport { CheckoutScreen, type CheckoutScreenProps } from './views/CheckoutScreen'\n\nexport interface PublicCheckoutOptions {\n /** Mount path for the public checkout route. Default '/checkout'. Slug is appended as ':slug'. */\n basePath?: string\n /**\n * Tenant this checkout sells for. REQUIRED when a Supabase client is\n * configured (setGlobalSupabaseClient) — it scopes the catalog + the RPC.\n */\n tenantId?: string\n /** Accent color forwarded to CheckoutScreen. */\n accent?: string\n /** Inject a custom provider (overrides the mock/Supabase resolver). */\n dataProvider?: PublicCheckoutDataProvider\n scope?: PluginScope\n verticalId?: VerticalId\n}\n\nexport interface PublicCheckoutPlugin {\n manifest: PluginManifest\n dataProvider: PublicCheckoutDataProvider\n /** CheckoutScreen bound to the resolved provider — pass `slug` (+ optional onSuccess). */\n CheckoutScreen: FC<Omit<CheckoutScreenProps, 'provider'>>\n}\n\nexport function createPublicCheckoutPlugin(options: PublicCheckoutOptions = {}): PublicCheckoutPlugin {\n const basePath = options.basePath ?? '/checkout'\n\n // Resolution: explicit dataProvider → Supabase whenever a tenantId is declared\n // (app's global client if registered, else Fayz Cloud) → seeded mock (LOUD).\n let provider: PublicCheckoutDataProvider\n if (options.dataProvider) {\n provider = options.dataProvider\n } else if (options.tenantId) {\n provider = createSupabaseCheckoutProvider({ tenantId: options.tenantId })\n } else {\n if (typeof console !== 'undefined') {\n console.warn(\n '[plugin-courses/public] no `tenantId` and no `dataProvider` — falling back to the MOCK checkout provider. ' +\n 'Pass `tenantId` to sell against the real DB, or inject a dataProvider.',\n )\n }\n provider = createMockCheckoutProvider()\n }\n\n const BoundCheckoutScreen: FC<Omit<CheckoutScreenProps, 'provider'>> = (props) =>\n createElement(CheckoutScreen, { ...props, provider, accent: props.accent ?? options.accent })\n BoundCheckoutScreen.displayName = 'BoundCheckoutScreen'\n\n // Route component for manifest-driven hosts (slug injected via route params).\n // course-members renders BoundCheckoutScreen directly instead.\n const RouteScreen: FC<unknown> = (props) => {\n const slug = (props as { slug?: string }).slug ?? ''\n return createElement(BoundCheckoutScreen, { slug, accent: options.accent })\n }\n RouteScreen.displayName = 'CourseCheckoutScreen'\n\n const manifest: PluginManifest = {\n id: 'course-checkout',\n name: 'Checkout de curso',\n icon: 'ShoppingCart',\n version: '0.1.0',\n scope: options.scope ?? 'universal',\n verticalId: options.verticalId,\n scaffolds: ['member', 'website', 'landing_page'],\n defaultEnabled: true,\n dependencies: [],\n navigation: [],\n routes: [{ path: `${basePath}/:slug`, component: RouteScreen, guard: 'public' }],\n widgets: [],\n }\n\n return { manifest, dataProvider: provider, CheckoutScreen: BoundCheckoutScreen }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/public/data/index.ts","../../src/public/data/supabase.ts","../../src/public/views/CheckoutScreen.tsx","../../src/public/createPublicCheckoutPlugin.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Data seam for the public course checkout surface.\n//\n// Mirrors plugins/plugin-agenda/src/public/data.ts: a small provider interface\n// with a mock default (dev without a backend) and a Supabase implementation\n// (data.supabase.ts) that reads the anon-visible catalog and calls the\n// course_place_order_simulated RPC. Kept dependency-light on purpose — the\n// public surface must NOT drag in @fayz-ai/admin or the courses admin graph.\n// ---------------------------------------------------------------------------\n\nimport type { Course, Offer } from '@fayz-ai/courses'\n\nexport type CheckoutPaymentMethod = 'pix' | 'card'\n\nexport interface PlaceOrderInput {\n email: string\n name?: string\n paymentMethod?: CheckoutPaymentMethod\n}\n\nexport interface PlaceOrderResult {\n orderId: string\n}\n\nexport interface PublicCheckoutDataProvider {\n /** Published course by slug (or id). Null when not found / not published. */\n getCourseBySlug(slug: string): Promise<Course | null>\n /** The offer pre-selected on the checkout (isDefault, else the first). */\n getDefaultOffer(courseId: string): Promise<Offer | null>\n /** Records the (simulated-paid) sale + enrollment. Returns the order id. */\n placeOrder(offerId: string, input: PlaceOrderInput): Promise<PlaceOrderResult>\n}\n\nexport interface MockCheckoutOptions {\n course?: Partial<Course>\n offer?: Partial<Offer>\n}\n\n/**\n * Loud mock: usable for a UI-only dev run with no backend. It fabricates a\n * single course + offer and a fake order id so the flow renders end-to-end.\n */\nexport function createMockCheckoutProvider(opts: MockCheckoutOptions = {}): PublicCheckoutDataProvider {\n const course: Course = {\n id: 'mock-course',\n slug: 'curso-demo',\n title: 'Curso Demo',\n subtitle: 'Um curso de demonstração',\n description: 'Conteúdo de exemplo para validar o fluxo de checkout.',\n thumbnailUrl: null,\n price: 197,\n currency: 'BRL',\n status: 'published',\n sortOrder: 0,\n createdAt: '2026-01-01T00:00:00.000Z',\n updatedAt: '2026-01-01T00:00:00.000Z',\n ...(opts.course as Partial<Course>),\n } as Course\n const offer: Offer = {\n id: 'mock-offer',\n courseId: course.id,\n name: course.title,\n price: course.price,\n currency: course.currency,\n kind: 'one_time',\n recurringInterval: null,\n isDefault: true,\n isOrderBump: false,\n sortOrder: 0,\n ...(opts.offer as Partial<Offer>),\n } as Offer\n\n let seq = 0\n return {\n async getCourseBySlug(slug: string) {\n return { ...course, slug: slug || course.slug }\n },\n async getDefaultOffer() {\n return offer\n },\n async placeOrder() {\n seq += 1\n if (typeof console !== 'undefined') {\n console.warn('[plugin-courses/public] MOCK placeOrder — no sale was recorded. Pass a tenantId for the real DB.')\n }\n return { orderId: `mock-order-${seq}` }\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// Supabase implementation of PublicCheckoutDataProvider — anon-safe.\n//\n// Public checkout runs with the publishable (anon) key and (usually) no user\n// session, so it only touches objects designed for anon access:\n// - plg_courses_courses / plg_courses_offers (published catalog is anon-\n// readable via the storefront RLS — read here through the shared\n// @fayz-ai/courses Supabase provider)\n// - course_place_order_simulated (SECURITY DEFINER RPC: places the order and\n// simulates a confirmed payment — paid order + enrollment [+ subscription])\n// Shipped by packages/courses/migrations/0009_course_place_order_simulated.sql.\n// ---------------------------------------------------------------------------\n\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { createSupabaseCoursesProvider } from '@fayz-ai/courses'\nimport type { PublicCheckoutDataProvider, PlaceOrderInput } from './index'\n\nexport interface SupabaseCheckoutOptions {\n /** Tenant this checkout sells for (RPC arg — required). */\n tenantId: string\n}\n\ninterface SupabaseLikeClient {\n rpc(fn: string, args: Record<string, unknown>): PromiseLike<{ data: unknown; error: { message: string } | null }>\n}\n\nfunction getClient(): SupabaseLikeClient {\n const client = getSupabaseClientOptional()\n if (!client) throw new Error('No Supabase client registered — call setGlobalSupabaseClient() at app startup.')\n return client as SupabaseLikeClient\n}\n\nexport function createSupabaseCheckoutProvider(options: SupabaseCheckoutOptions): PublicCheckoutDataProvider {\n const { tenantId } = options\n // Catalog reads reuse the courses provider (tenant scoping comes from the\n // host's setCoursesTenantResolver + storefront RLS on published rows).\n const courses = createSupabaseCoursesProvider()\n\n return {\n async getCourseBySlug(slug: string) {\n return courses.getCourse(slug)\n },\n\n async getDefaultOffer(courseId: string) {\n const offers = await courses.listOffers(courseId)\n return offers.find((o) => o.isDefault) ?? offers[0] ?? null\n },\n\n async placeOrder(offerId: string, input: PlaceOrderInput) {\n const email = input.email.trim()\n const { data, error } = await getClient().rpc('course_place_order_simulated', {\n p_tenant_id: tenantId,\n p_offer_id: offerId,\n p_customer_email: email,\n p_customer_name: input.name?.trim() || null,\n p_payment_method: input.paymentMethod ?? 'pix',\n })\n if (error) throw new Error(`[plugin-courses/public] placeOrder: ${error.message}`)\n const orderId = Array.isArray(data) ? (data[0] as string) : (data as string)\n return { orderId: String(orderId) }\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// CheckoutScreen — the public \"comprar curso\" surface.\n//\n// Loads a published course + its default offer by slug, collects name/email/\n// payment method, and records a (simulated-paid) sale via the data provider.\n// Dependency-light: React + lucide + Tailwind only — no @fayz-ai/admin.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useMemo, useState, type FC, type FormEvent } from 'react'\nimport { CheckCircle2, CreditCard, Loader2, Lock, QrCode, ShieldCheck } from 'lucide-react'\nimport type { Course, Offer } from '@fayz-ai/courses'\nimport type { CheckoutPaymentMethod, PublicCheckoutDataProvider } from '../data'\nimport { describeError } from '@fayz-ai/core'\n\nexport interface CheckoutScreenProps {\n slug: string\n provider: PublicCheckoutDataProvider\n /** Accent color (CSS) for buttons/highlights. Default emerald. */\n accent?: string\n /** Where \"acessar área de membros\" points after success. Default '#/'. */\n memberAreaHref?: string\n /** Fired after a successful order with the resulting order id + email. */\n onSuccess?: (info: { orderId: string; email: string }) => void\n}\n\nfunction formatMoney(value: number, currency = 'BRL', locale = 'pt-BR'): string {\n try {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)\n } catch {\n return `R$ ${value.toFixed(2)}`\n }\n}\n\nexport const CheckoutScreen: FC<CheckoutScreenProps> = ({\n slug,\n provider,\n accent = '#10b981',\n memberAreaHref = '#/',\n onSuccess,\n}) => {\n const [course, setCourse] = useState<Course | null>(null)\n const [offer, setOffer] = useState<Offer | null>(null)\n const [loading, setLoading] = useState(true)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [method, setMethod] = useState<CheckoutPaymentMethod>('pix')\n\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [orderId, setOrderId] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n ;(async () => {\n try {\n const c = await provider.getCourseBySlug(slug)\n if (!c) throw new Error('Curso não encontrado.')\n const o = await provider.getDefaultOffer(c.id)\n if (cancelled) return\n setCourse(c)\n setOffer(o)\n } catch (err) {\n if (!cancelled) setLoadError(describeError(err, 'Falha ao carregar o curso.'))\n } finally {\n if (!cancelled) setLoading(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [slug, provider])\n\n const price = offer?.price ?? course?.price ?? 0\n const currency = offer?.currency ?? course?.currency ?? 'BRL'\n const isSubscription = offer?.kind === 'subscription'\n const intervalLabel = offer?.recurringInterval === 'year' ? '/ano' : '/mês'\n\n const canSubmit = useMemo(\n () => !!offer && !!email.trim() && /.+@.+\\..+/.test(email.trim()) && !submitting,\n [offer, email, submitting],\n )\n\n async function handleSubmit(e: FormEvent) {\n e.preventDefault()\n if (!offer || !canSubmit) return\n setSubmitting(true)\n setSubmitError(null)\n try {\n const { orderId: id } = await provider.placeOrder(offer.id, {\n email: email.trim(),\n name: name.trim() || undefined,\n paymentMethod: method,\n })\n setOrderId(id)\n onSuccess?.({ orderId: id, email: email.trim() })\n } catch (err) {\n setSubmitError(describeError(err, 'Não foi possível concluir a compra. Tente novamente.'))\n } finally {\n setSubmitting(false)\n }\n }\n\n if (loading) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50\">\n <Loader2 className=\"w-6 h-6 animate-spin text-gray-400\" />\n </div>\n )\n }\n\n if (loadError || !course) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 p-6\">\n <div className=\"max-w-md text-center\">\n <p className=\"text-lg font-semibold text-gray-900\">Ops!</p>\n <p className=\"mt-2 text-gray-600\">{loadError ?? 'Curso indisponível.'}</p>\n <a href=\"#/\" className=\"mt-4 inline-block text-sm font-medium underline\" style={{ color: accent }}>\n Voltar\n </a>\n </div>\n </div>\n )\n }\n\n // Success state ----------------------------------------------------------\n if (orderId) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 p-6\">\n <div className=\"max-w-md w-full bg-white rounded-2xl shadow-sm border border-gray-100 p-8 text-center\">\n <div\n className=\"mx-auto w-14 h-14 rounded-full flex items-center justify-center\"\n style={{ backgroundColor: `${accent}1a` }}\n >\n <CheckCircle2 className=\"w-8 h-8\" style={{ color: accent }} />\n </div>\n <h1 className=\"mt-4 text-xl font-bold text-gray-900\">Compra confirmada!</h1>\n <p className=\"mt-2 text-gray-600\">\n Seu acesso a <strong>{course.title}</strong> já está liberado. Enviamos os detalhes para{' '}\n <strong>{email.trim()}</strong>.\n </p>\n <p className=\"mt-1 text-xs text-gray-400\">Pedido {orderId}</p>\n <a\n href={memberAreaHref}\n className=\"mt-6 inline-flex w-full items-center justify-center rounded-xl px-4 py-3 font-semibold text-white\"\n style={{ backgroundColor: accent }}\n >\n Acessar área de membros\n </a>\n </div>\n </div>\n )\n }\n\n // Checkout form ----------------------------------------------------------\n return (\n <div className=\"min-h-screen bg-gray-50 py-10 px-4\">\n <div className=\"max-w-3xl mx-auto grid gap-6 md:grid-cols-5\">\n {/* Order summary */}\n <aside className=\"md:col-span-2 bg-white rounded-2xl border border-gray-100 shadow-sm p-6 h-fit\">\n {course.thumbnailUrl && (\n <img\n src={course.thumbnailUrl}\n alt={course.title}\n className=\"w-full aspect-video object-cover rounded-xl mb-4\"\n />\n )}\n <h2 className=\"text-lg font-bold text-gray-900\">{course.title}</h2>\n {course.subtitle && <p className=\"mt-1 text-sm text-gray-500\">{course.subtitle}</p>}\n <div className=\"mt-4 border-t border-gray-100 pt-4\">\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-sm text-gray-500\">{offer?.name ?? 'Acesso ao curso'}</span>\n <span className=\"text-xl font-bold text-gray-900\">\n {formatMoney(price, currency)}\n {isSubscription && <span className=\"text-sm font-normal text-gray-400\"> {intervalLabel}</span>}\n </span>\n </div>\n </div>\n <div className=\"mt-4 flex items-center gap-2 text-xs text-gray-400\">\n <ShieldCheck className=\"w-4 h-4\" />\n Pagamento seguro · acesso imediato\n </div>\n </aside>\n\n {/* Payment form */}\n <form onSubmit={handleSubmit} className=\"md:col-span-3 bg-white rounded-2xl border border-gray-100 shadow-sm p-6\">\n <h1 className=\"text-xl font-bold text-gray-900\">Finalizar compra</h1>\n <p className=\"mt-1 text-sm text-gray-500\">Preencha seus dados para liberar o acesso.</p>\n\n <label className=\"block mt-6 text-sm font-medium text-gray-700\">\n Nome completo\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Seu nome\"\n className=\"mt-1 w-full rounded-xl border border-gray-200 px-3 py-2.5 focus:outline-none focus:ring-2\"\n style={{ ['--tw-ring-color' as string]: accent }}\n />\n </label>\n\n <label className=\"block mt-4 text-sm font-medium text-gray-700\">\n E-mail *\n <input\n type=\"email\"\n required\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"voce@email.com\"\n className=\"mt-1 w-full rounded-xl border border-gray-200 px-3 py-2.5 focus:outline-none focus:ring-2\"\n style={{ ['--tw-ring-color' as string]: accent }}\n />\n </label>\n\n <fieldset className=\"mt-4\">\n <legend className=\"text-sm font-medium text-gray-700\">Forma de pagamento</legend>\n <div className=\"mt-2 grid grid-cols-2 gap-3\">\n {(\n [\n { id: 'pix' as const, label: 'Pix', icon: QrCode },\n { id: 'card' as const, label: 'Cartão', icon: CreditCard },\n ]\n ).map(({ id, label, icon: Icon }) => {\n const active = method === id\n return (\n <button\n key={id}\n type=\"button\"\n onClick={() => setMethod(id)}\n className=\"flex items-center gap-2 rounded-xl border px-3 py-2.5 text-sm font-medium transition\"\n style={\n active\n ? { borderColor: accent, backgroundColor: `${accent}0f`, color: accent }\n : { borderColor: '#e5e7eb', color: '#374151' }\n }\n >\n <Icon className=\"w-4 h-4\" />\n {label}\n </button>\n )\n })}\n </div>\n </fieldset>\n\n {submitError && (\n <p className=\"mt-4 text-sm text-red-600 bg-red-50 border border-red-100 rounded-xl px-3 py-2\">\n {submitError}\n </p>\n )}\n\n <button\n type=\"submit\"\n disabled={!canSubmit}\n className=\"mt-6 inline-flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 font-semibold text-white disabled:opacity-50\"\n style={{ backgroundColor: accent }}\n >\n {submitting ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" /> Processando…\n </>\n ) : (\n <>\n <Lock className=\"w-4 h-4\" /> Pagar {formatMoney(price, currency)}\n {isSubscription && ` ${intervalLabel}`}\n </>\n )}\n </button>\n <p className=\"mt-3 text-center text-xs text-gray-400\">\n Ambiente de demonstração — pagamento simulado, sem cobrança real.\n </p>\n </form>\n </div>\n </div>\n )\n}\n\nCheckoutScreen.displayName = 'CheckoutScreen'\n","// ---------------------------------------------------------------------------\n// createPublicCheckoutPlugin — the public \"landing → checkout\" seam for courses.\n//\n// Mirrors plugin-agenda/src/public/createPublicBookingPlugin: resolve a data\n// provider (injected → Supabase when a tenantId is set → loud mock), expose a\n// ready-to-mount CheckoutScreen + a PluginManifest with a public route. A host\n// app (e.g. course-members) either mounts the manifest route or renders\n// CheckoutScreen directly in its own router.\n// ---------------------------------------------------------------------------\n\nimport { createElement, type FC } from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { createMockCheckoutProvider, type PublicCheckoutDataProvider } from './data'\nimport { createSupabaseCheckoutProvider } from './data/supabase'\nimport { CheckoutScreen, type CheckoutScreenProps } from './views/CheckoutScreen'\n\nexport interface PublicCheckoutOptions {\n /** Mount path for the public checkout route. Default '/checkout'. Slug is appended as ':slug'. */\n basePath?: string\n /**\n * Tenant this checkout sells for. REQUIRED when a Supabase client is\n * configured (setGlobalSupabaseClient) — it scopes the catalog + the RPC.\n */\n tenantId?: string\n /** Accent color forwarded to CheckoutScreen. */\n accent?: string\n /** Inject a custom provider (overrides the mock/Supabase resolver). */\n dataProvider?: PublicCheckoutDataProvider\n scope?: PluginScope\n verticalId?: VerticalId\n}\n\nexport interface PublicCheckoutPlugin {\n manifest: PluginManifest\n dataProvider: PublicCheckoutDataProvider\n /** CheckoutScreen bound to the resolved provider — pass `slug` (+ optional onSuccess). */\n CheckoutScreen: FC<Omit<CheckoutScreenProps, 'provider'>>\n}\n\nexport function createPublicCheckoutPlugin(options: PublicCheckoutOptions = {}): PublicCheckoutPlugin {\n const basePath = options.basePath ?? '/checkout'\n\n // Resolution: explicit dataProvider → Supabase whenever a tenantId is declared\n // (app's global client if registered, else Fayz Cloud) → seeded mock (LOUD).\n let provider: PublicCheckoutDataProvider\n if (options.dataProvider) {\n provider = options.dataProvider\n } else if (options.tenantId) {\n provider = createSupabaseCheckoutProvider({ tenantId: options.tenantId })\n } else {\n if (typeof console !== 'undefined') {\n console.warn(\n '[plugin-courses/public] no `tenantId` and no `dataProvider` — falling back to the MOCK checkout provider. ' +\n 'Pass `tenantId` to sell against the real DB, or inject a dataProvider.',\n )\n }\n provider = createMockCheckoutProvider()\n }\n\n const BoundCheckoutScreen: FC<Omit<CheckoutScreenProps, 'provider'>> = (props) =>\n createElement(CheckoutScreen, { ...props, provider, accent: props.accent ?? options.accent })\n BoundCheckoutScreen.displayName = 'BoundCheckoutScreen'\n\n // Route component for manifest-driven hosts (slug injected via route params).\n // course-members renders BoundCheckoutScreen directly instead.\n const RouteScreen: FC<unknown> = (props) => {\n const slug = (props as { slug?: string }).slug ?? ''\n return createElement(BoundCheckoutScreen, { slug, accent: options.accent })\n }\n RouteScreen.displayName = 'CourseCheckoutScreen'\n\n const manifest: PluginManifest = {\n id: 'course-checkout',\n name: 'Checkout de curso',\n icon: 'ShoppingCart',\n version: '0.1.0',\n scope: options.scope ?? 'universal',\n verticalId: options.verticalId,\n scaffolds: ['member', 'website', 'landing_page'],\n defaultEnabled: true,\n dependencies: [],\n navigation: [],\n routes: [{ path: `${basePath}/:slug`, component: RouteScreen, guard: 'public' }],\n widgets: [],\n }\n\n return { manifest, dataProvider: provider, CheckoutScreen: BoundCheckoutScreen }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckoutScreen.d.ts","sourceRoot":"","sources":["../../../src/public/views/CheckoutScreen.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAgC,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAA;AAG7E,OAAO,KAAK,EAAyB,0BAA0B,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"CheckoutScreen.d.ts","sourceRoot":"","sources":["../../../src/public/views/CheckoutScreen.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAgC,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAA;AAG7E,OAAO,KAAK,EAAyB,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAGhF,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,0BAA0B,CAAA;IACpC,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CAC/D;AAUD,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAoPlD,CAAA"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"financial"
|
|
7
7
|
]
|
|
8
8
|
},
|
|
9
|
-
"version": "0.10.
|
|
9
|
+
"version": "0.10.28",
|
|
10
10
|
"description": "[experimental] Fayz SDK — courses admin management plugin",
|
|
11
11
|
"type": "module",
|
|
12
12
|
"sideEffects": false,
|
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"@dnd-kit/core": "^6.3.1",
|
|
37
37
|
"@dnd-kit/sortable": "^10.0.0",
|
|
38
38
|
"@dnd-kit/utilities": "^3.2.2",
|
|
39
|
-
"@fayz-ai/core": "^0.
|
|
40
|
-
"@fayz-ai/ui": "^0.
|
|
41
|
-
"@fayz-ai/courses": "^0.
|
|
42
|
-
"@fayz-ai/admin": "^0.
|
|
39
|
+
"@fayz-ai/core": "^0.40.0",
|
|
40
|
+
"@fayz-ai/ui": "^0.40.0",
|
|
41
|
+
"@fayz-ai/courses": "^0.40.0",
|
|
42
|
+
"@fayz-ai/admin": "^0.40.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/react": "^18.3.0",
|