@fayz-ai/plugin-agenda 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-DRZF6CV2.js +421 -0
- package/dist/chunk-DRZF6CV2.js.map +1 -0
- package/dist/chunk-LFUELUIT.cjs +423 -0
- package/dist/chunk-LFUELUIT.cjs.map +1 -0
- package/dist/index.cjs +741 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +741 -10
- package/dist/index.js.map +1 -1
- package/dist/migrations/index.d.ts +2 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/public/BookingWidget.d.ts +4 -2
- package/dist/public/BookingWidget.d.ts.map +1 -1
- package/dist/public/components/BrandHeader.d.ts +6 -0
- package/dist/public/components/BrandHeader.d.ts.map +1 -0
- package/dist/public/components/ServiceCard.d.ts +5 -0
- package/dist/public/components/ServiceCard.d.ts.map +1 -0
- package/dist/public/components/SidebarExtras.d.ts +4 -0
- package/dist/public/components/SidebarExtras.d.ts.map +1 -0
- package/dist/public/components/StepRailItem.d.ts +4 -0
- package/dist/public/components/StepRailItem.d.ts.map +1 -0
- package/dist/public/components/SuccessPanel.d.ts +4 -0
- package/dist/public/components/SuccessPanel.d.ts.map +1 -0
- package/dist/public/components/SummaryRail.d.ts +27 -0
- package/dist/public/components/SummaryRail.d.ts.map +1 -0
- package/dist/public/components/defaults.d.ts +3 -0
- package/dist/public/components/defaults.d.ts.map +1 -0
- package/dist/public/context.d.ts +22 -8
- package/dist/public/context.d.ts.map +1 -1
- package/dist/public/createPublicBookingPlugin.d.ts +27 -10
- package/dist/public/createPublicBookingPlugin.d.ts.map +1 -1
- package/dist/public/data.d.ts +37 -0
- package/dist/public/data.d.ts.map +1 -0
- package/dist/public/data.supabase.d.ts +7 -0
- package/dist/public/data.supabase.d.ts.map +1 -0
- package/dist/public/format.d.ts +18 -0
- package/dist/public/format.d.ts.map +1 -0
- package/dist/public/hooks.d.ts +13 -11
- package/dist/public/hooks.d.ts.map +1 -1
- package/dist/public/index.cjs +1016 -613
- package/dist/public/index.cjs.map +1 -1
- package/dist/public/index.d.ts +15 -4
- package/dist/public/index.d.ts.map +1 -1
- package/dist/public/index.js +1006 -616
- package/dist/public/index.js.map +1 -1
- package/dist/public/steps/ContactStep.d.ts +30 -0
- package/dist/public/steps/ContactStep.d.ts.map +1 -0
- package/dist/public/steps/DateTimeStep.d.ts +23 -0
- package/dist/public/steps/DateTimeStep.d.ts.map +1 -0
- package/dist/public/steps/OverviewStep.d.ts +16 -0
- package/dist/public/steps/OverviewStep.d.ts.map +1 -0
- package/dist/public/steps/PaymentStep.d.ts +20 -0
- package/dist/public/steps/PaymentStep.d.ts.map +1 -0
- package/dist/public/types.d.ts +134 -0
- package/dist/public/types.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/index.ts +11 -0
- package/src/migrations/001_public_booking.sql +278 -0
- package/src/migrations/index.ts +282 -0
- package/src/public/BookingWidget.tsx +136 -713
- package/src/public/components/BrandHeader.tsx +27 -0
- package/src/public/components/ServiceCard.tsx +39 -0
- package/src/public/components/SidebarExtras.tsx +30 -0
- package/src/public/components/StepRailItem.tsx +27 -0
- package/src/public/components/SuccessPanel.tsx +27 -0
- package/src/public/components/SummaryRail.tsx +90 -0
- package/src/public/components/defaults.ts +14 -0
- package/src/public/context.tsx +64 -7
- package/src/public/createPublicBookingPlugin.ts +131 -21
- package/src/public/data.supabase.ts +94 -0
- package/src/public/data.ts +99 -0
- package/src/public/format.ts +61 -0
- package/src/public/hooks.ts +22 -34
- package/src/public/index.ts +57 -4
- package/src/public/steps/ContactStep.tsx +179 -0
- package/src/public/steps/DateTimeStep.tsx +138 -0
- package/src/public/steps/OverviewStep.tsx +81 -0
- package/src/public/steps/PaymentStep.tsx +180 -0
- package/src/public/types.ts +169 -3
- package/dist/chunk-GAJVIEXM.cjs +0 -870
- package/dist/chunk-GAJVIEXM.cjs.map +0 -1
- package/dist/chunk-U6VTLOHN.js +0 -867
- package/dist/chunk-U6VTLOHN.js.map +0 -1
package/dist/public/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/public/context.tsx","../../src/public/hooks.ts","../../src/public/BookingWidget.tsx","../../src/public/createPublicBookingPlugin.ts"],"names":["window","jsx","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext, type ReactNode } from 'react'\nimport type { PaymentProvider } from '@fayz-ai/core'\nimport type { AgendaDataProvider } from '../data/types'\nimport type { PublicService, BookingWindow, PublicBookingLabels, WorkingHours, ResolvedPayment } from './types'\n\n/** Emitted when the customer's phone is verified / identity captured, for the\n * host to bridge to auth (booking stays decoupled — data-only, optional). */\nexport type OnIdentityVerified = (identity: { name: string; phone: string; email?: string }) => void\n\nexport interface PublicBookingContextValue {\n provider: AgendaDataProvider\n /** The professional/resource bookings are created against (POC: single professional). */\n professionalId: string\n professionalName: string\n services: PublicService[]\n /** Business opening hours, shown on the overview \"Sobre\" section. */\n businessHours: WorkingHours\n /** Payment step config, or null when the flow ends at confirmation. */\n payment: ResolvedPayment | null\n /** Injected charge provider (Pix). When absent, the payment step self-mocks. */\n paymentProvider: PaymentProvider | null\n /** Fired on phone-verify / details submit so the host can sign the user in. */\n onIdentityVerified: OnIdentityVerified | null\n window: BookingWindow\n labels: PublicBookingLabels\n /** Currency code for price formatting (e.g. 'BRL'). */\n currency: string\n locale: string\n}\n\nconst PublicBookingContext = createContext<PublicBookingContextValue | null>(null)\n\nexport function BookingProvider({ value, children }: { value: PublicBookingContextValue; children: ReactNode }) {\n return <PublicBookingContext.Provider value={value}>{children}</PublicBookingContext.Provider>\n}\n\nexport function useBooking(): PublicBookingContextValue {\n const ctx = useContext(PublicBookingContext)\n if (!ctx) {\n throw new Error('[plugin-agenda] useBooking must be used within <BookingProvider>.')\n }\n return ctx\n}\n","import { useEffect, useState } from 'react'\nimport { useBooking } from './context'\nimport type { PublicService, ContactInfo } from './types'\nimport type { TimeSlot } from '../types'\n\n/** The configured bookable services (from context; POC-static, ERP-driven later). */\nexport function useServices(): PublicService[] {\n return useBooking().services\n}\n\nexport interface UseAvailableSlotsResult {\n slots: TimeSlot[]\n loading: boolean\n error: Error | null\n}\n\n/**\n * Available time slots for a service on a given date. Delegates to\n * provider.getAvailableSlots — mock now, real availability later, same call.\n */\nexport function useAvailableSlots(params: { serviceId: string | null; date: string | null }): UseAvailableSlotsResult {\n const { provider, professionalId, services, window } = useBooking()\n const [slots, setSlots] = useState<TimeSlot[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const { serviceId, date } = params\n const service = services.find((s) => s.id === serviceId)\n const durationMinutes = service?.durationMinutes ?? 0\n\n useEffect(() => {\n let active = true\n if (!serviceId || !date || !durationMinutes) {\n setSlots([])\n return\n }\n setLoading(true)\n provider\n .getAvailableSlots({ assigneeId: professionalId, date, durationMinutes, slotInterval: window.slotInterval })\n .then((result) => {\n if (!active) return\n setSlots(result)\n setError(null)\n })\n .catch((err) => {\n if (!active) return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (active) setLoading(false)\n })\n return () => {\n active = false\n }\n }, [provider, professionalId, serviceId, date, durationMinutes, window.slotInterval])\n\n return { slots, loading, error }\n}\n\nexport interface CreatePublicBookingInput {\n serviceId: string\n /** ISO datetime of the chosen slot start. */\n startsAt: string\n contact: ContactInfo\n}\n\nexport interface UseCreateBookingResult {\n submit: (input: CreatePublicBookingInput) => Promise<void>\n submitting: boolean\n error: Error | null\n done: boolean\n}\n\n/** Create a booking via the provider. POC: mock append; real persistence later. */\nexport function useCreateBooking(): UseCreateBookingResult {\n const { provider, professionalId, services } = useBooking()\n const [submitting, setSubmitting] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [done, setDone] = useState(false)\n\n async function submit(input: CreatePublicBookingInput): Promise<void> {\n const service = services.find((s) => s.id === input.serviceId)\n if (!service) throw new Error('Serviço inválido')\n setSubmitting(true)\n setError(null)\n try {\n await provider.createBooking({\n kind: 'appointment',\n // POC: the customer is captured as the booking title; a real flow would\n // upsert a client/person record and pass its id here.\n clientId: 'public-guest',\n professionalId,\n startsAt: input.startsAt,\n title: input.contact.name,\n notes: [input.contact.phone, input.contact.email, input.contact.notes].filter(Boolean).join(' · ') || undefined,\n services: [\n {\n serviceId: service.id,\n name: service.name,\n durationMinutes: service.durationMinutes,\n price: service.price,\n assigneeId: professionalId,\n },\n ],\n })\n setDone(true)\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n } finally {\n setSubmitting(false)\n }\n }\n\n return { submit, submitting, error, done }\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport {\n Calendar, Clock, Check, ChevronLeft, ChevronRight, ChevronDown, Loader2,\n MapPin, CreditCard, ShieldCheck, User, Video, QrCode, Copy, CalendarCheck, Plus,\n} from 'lucide-react'\nimport { COUNTRIES, DEFAULT_COUNTRY, getCountry, maskPhone, unmaskPhone } from '@fayz-ai/core'\nimport type { PixCharge } from '@fayz-ai/core'\nimport { useBooking } from './context'\nimport { useAvailableSlots, useCreateBooking } from './hooks'\nimport type { PublicService } from './types'\n\ntype Step = 'overview' | 'datetime' | 'contact' | 'payment' | 'success'\ntype StepState = 'done' | 'active' | 'todo'\n\nconst DAY_NAMES = ['Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado']\nconst WEEK_ORDER = [1, 2, 3, 4, 5, 6, 0] // Monday-first, like the reference\n\nfunction useFormatters(locale: string, currency: string) {\n return useMemo(\n () => ({\n price: new Intl.NumberFormat(locale, { style: 'currency', currency }),\n time: new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit' }),\n weekday: new Intl.DateTimeFormat(locale, { weekday: 'short' }),\n dayNum: new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit' }),\n longDay: new Intl.DateTimeFormat(locale, { weekday: 'long', day: '2-digit', month: 'long' }),\n dateShort: new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit', year: 'numeric' }),\n month: new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }),\n }),\n [locale, currency],\n )\n}\n\nfunction toIso(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\n/** Read a preselected service id from the URL (?service=…), router-agnostic. */\nfunction readServiceParam(): string | null {\n if (typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get('service')\n}\n\ninterface DayCell {\n iso: string\n date: Date\n isToday: boolean\n}\n\n/** 7 consecutive days starting `weekOffset*7` days from today. */\nfunction buildWeek(weekOffset: number): DayCell[] {\n const base = new Date()\n base.setHours(0, 0, 0, 0)\n const cells: DayCell[] = []\n for (let i = 0; i < 7; i++) {\n const d = new Date(base.getFullYear(), base.getMonth(), base.getDate() + weekOffset * 7 + i)\n cells.push({ iso: toIso(d), date: d, isToday: weekOffset === 0 && i === 0 })\n }\n return cells\n}\n\n/** \"13/07/2026 – 21:30 até 22:00 (30min)\" */\nfunction formatSlotRange(startIso: string, durationMin: number, fmt: ReturnType<typeof useFormatters>): string {\n const start = new Date(startIso)\n const end = new Date(start.getTime() + durationMin * 60_000)\n return `${fmt.dateShort.format(start)} – ${fmt.time.format(start)} até ${fmt.time.format(end)} (${durationMin}min)`\n}\n\n// Static, realistic-looking Pix payload for the POC copia-e-cola field.\nconst PIX_PAYLOAD =\n '00020126840014br.gov.bcb.pix2562qrcode.hempdent.com.br/pix/v2/9d8f7a6b-consulta-canabica5204000053039865802BR5913HEMPDENT6009SAO PAULO62070503***6304AB12'\n\n/** Deterministic QR-looking placeholder rendered from a payload (POC visual). */\nfunction QrPlaceholder({ data }: { data: string }) {\n const size = 25\n // Seed the data-cell pattern from the payload so different charges look different.\n let seed = 0\n for (let i = 0; i < data.length; i++) seed = (seed * 31 + data.charCodeAt(i)) % 100000\n const cells: { x: number; y: number }[] = []\n const isFinder = (x: number, y: number) => {\n const inBox = (bx: number, by: number) => x >= bx && x < bx + 7 && y >= by && y < by + 7\n return inBox(0, 0) || inBox(size - 7, 0) || inBox(0, size - 7)\n }\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n if (isFinder(x, y)) {\n const ring = x === 0 || y === 0 || x === size - 1 || y === size - 1\n // draw finder squares (outer ring + inner block) deterministically\n const local = (bx: number, by: number) => ({ lx: x - bx, ly: y - by })\n const corner = x < 7 && y < 7 ? { bx: 0, by: 0 } : x >= size - 7 && y < 7 ? { bx: size - 7, by: 0 } : { bx: 0, by: size - 7 }\n const { lx, ly } = local(corner.bx, corner.by)\n const outer = lx === 0 || lx === 6 || ly === 0 || ly === 6\n const inner = lx >= 2 && lx <= 4 && ly >= 2 && ly <= 4\n if (outer || inner) cells.push({ x, y })\n void ring\n } else if ((x * 31 + y * 17 + x * y + seed) % 3 === 0) {\n cells.push({ x, y })\n }\n }\n }\n return (\n <svg viewBox={`0 0 ${size} ${size}`} className=\"h-40 w-40\" role=\"img\" aria-label=\"QR Code Pix (demonstração)\">\n <rect width={size} height={size} fill=\"white\" />\n {cells.map((c, i) => (\n <rect key={i} x={c.x} y={c.y} width={1} height={1} fill=\"currentColor\" className=\"text-foreground\" />\n ))}\n </svg>\n )\n}\n\n/** Brand header shown above every booking view. */\nfunction BrandHeader() {\n return (\n <div className=\"mb-5 flex items-center gap-3 rounded-2xl border border-border bg-card px-5 py-4 shadow-sm\">\n <span className=\"flex h-11 w-11 items-center justify-center rounded-xl bg-primary text-lg font-bold text-primary-foreground\">\n H\n </span>\n <div>\n <p className=\"font-heading text-base font-bold text-foreground\">HempDent · Consulta Canábica</p>\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <ShieldCheck className=\"h-3.5 w-3.5 text-primary\" /> Agendamento online seguro · CRO-SP 166513\n </p>\n </div>\n </div>\n )\n}\n\n/** A service row (used on the overview and reused elsewhere). */\nfunction ServiceRow({\n service, featured, onSelect, fmt,\n}: {\n service: PublicService\n featured?: boolean\n onSelect: () => void\n fmt: ReturnType<typeof useFormatters>\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className=\"group flex w-full items-center gap-4 rounded-2xl border border-border p-4 text-left transition-colors hover:border-primary hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-accent text-primary\">\n <Video className=\"h-5 w-5\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-foreground\">{service.name}</span>\n {featured ? (\n <span className=\"rounded-full bg-accent px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-primary\">\n Mais procurado\n </span>\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" /> {service.durationMinutes} min · Online\n </span>\n {service.description ? (\n <span className=\"mt-1 block text-sm text-muted-foreground\">{service.description}</span>\n ) : null}\n </span>\n <span className=\"shrink-0 text-right\">\n <span className=\"block font-semibold tabular-nums text-primary\">{fmt.price.format(service.price)}</span>\n <ChevronRight className=\"ml-auto mt-1 h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-0.5\" />\n </span>\n </button>\n )\n}\n\n/** One row in the wizard's right-hand progress rail. */\nfunction StepRail({\n n, label, state, children,\n}: { n: number; label: string; state: StepState; children?: ReactNode }) {\n return (\n <li className=\"relative pl-11\">\n <span aria-hidden className=\"absolute left-[15px] top-8 bottom-[-18px] w-px bg-border last:hidden\" />\n <span\n className={[\n 'absolute left-0 top-0 flex h-8 w-8 items-center justify-center rounded-full text-sm font-semibold transition-colors',\n state === 'done'\n ? 'bg-primary text-primary-foreground'\n : state === 'active'\n ? 'bg-accent text-primary ring-2 ring-primary'\n : 'bg-muted text-muted-foreground',\n ].join(' ')}\n >\n {state === 'done' ? <Check className=\"h-4 w-4\" /> : n}\n </span>\n <p className={`pt-1 text-sm font-semibold ${state === 'todo' ? 'text-muted-foreground' : 'text-foreground'}`}>\n {label}\n </p>\n {children ? <div className=\"mt-2\">{children}</div> : null}\n </li>\n )\n}\n\n/**\n * Customer-facing booking surface. Default view is an overview (services +\n * opening hours + CTA) like Quaddro; picking a service — or landing with\n * ?service=… — enters a stepped flow (date → time → contact → confirmation)\n * with a live progress + summary rail. Token-only, keyboard-accessible, 44px\n * targets. Runs on mock slots today; real availability is a provider swap.\n */\nexport function BookingWidget() {\n const {\n services, professionalName, businessHours, payment, paymentProvider, onIdentityVerified,\n labels, window: bookingWindow, locale, currency,\n } = useBooking()\n const fmt = useFormatters(locale, currency)\n\n const preselected = useMemo(() => {\n const q = readServiceParam()\n if (q && services.some((s) => s.id === q)) return q\n return null\n }, [services])\n const todayIso = useMemo(() => toIso(new Date()), [])\n\n const [step, setStep] = useState<Step>(preselected ? 'datetime' : 'overview')\n const [serviceId, setServiceId] = useState<string | null>(preselected)\n const [weekOffset, setWeekOffset] = useState(0)\n const [date, setDate] = useState<string | null>(todayIso)\n const [slotStart, setSlotStart] = useState<string | null>(null)\n const [contact, setContact] = useState({ name: '', phone: '', email: '', notes: '' })\n // Contact step is phone-verification-first (like Quaddro): phone → code → details.\n const [contactStep, setContactStep] = useState<'phone' | 'code' | 'details'>('phone')\n const [code, setCode] = useState('')\n const [codeError, setCodeError] = useState(false)\n // Payment sub-flow: choose method → Pix QR (\"aguardando pagamento\").\n const [paymentStep, setPaymentStep] = useState<'choose' | 'pix'>('choose')\n const [copied, setCopied] = useState(false)\n const [countryIso, setCountryIso] = useState(DEFAULT_COUNTRY)\n const country = getCountry(countryIso)\n // Pix charge from the injected payment provider (null → self-mocked fallback).\n const [charge, setCharge] = useState<PixCharge | null>(null)\n const [charging, setCharging] = useState(false)\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n // Poll the charge status while on the Pix screen; settle → success.\n useEffect(() => {\n if (!(step === 'payment' && paymentStep === 'pix' && charge && paymentProvider)) return\n let active = true\n const clear = () => { if (pollRef.current) { clearInterval(pollRef.current); pollRef.current = null } }\n const tick = () => {\n paymentProvider.getChargeStatus(charge.chargeId).then((s) => {\n if (!active) return\n if (s === 'paid') { clear(); setStep('success') }\n else if (s === 'expired' || s === 'failed') clear()\n }).catch(() => { /* keep polling on transient errors */ })\n }\n tick()\n pollRef.current = setInterval(tick, 2500)\n return () => { active = false; clear() }\n }, [step, paymentStep, charge, paymentProvider])\n\n const week = useMemo(() => buildWeek(weekOffset), [weekOffset])\n const { slots, loading: slotsLoading } = useAvailableSlots({ serviceId, date })\n const { submit, submitting, error } = useCreateBooking()\n\n const minTime = Date.now() + bookingWindow.minAdvanceHours * 3600_000\n const bookableSlots = slots.filter((s) => new Date(s.start).getTime() >= minTime)\n const service = services.find((s) => s.id === serviceId) ?? null\n const maxWeekOffset = Math.floor(bookingWindow.maxAdvanceDays / 7)\n const openDays = new Set(businessHours.daysOfWeek)\n\n function startBooking(id?: string) {\n setServiceId(id ?? serviceId ?? services[0]?.id ?? null)\n setDate(todayIso)\n setSlotStart(null)\n setStep('datetime')\n }\n\n async function handleConfirm() {\n if (!serviceId || !slotStart || !contact.name.trim()) return\n try {\n await submit({ serviceId, startsAt: slotStart, contact })\n setStep('success')\n } catch {\n /* error surfaced inline */\n }\n }\n\n function emitIdentity() {\n onIdentityVerified?.({\n name: contact.name,\n phone: `${country.dial} ${contact.phone}`,\n email: contact.email || undefined,\n })\n }\n\n // Contact sub-step submit handlers (also used by Enter via <form onSubmit>).\n function sendCode() {\n if (unmaskPhone(contact.phone).length < 8) return\n setCode(''); setCodeError(false); setContactStep('code')\n }\n function confirmCode() {\n if (code.trim() === '0000') {\n setCodeError(false)\n emitIdentity() // phone verified → host signs the user in\n setContactStep('details')\n } else {\n setCodeError(true)\n }\n }\n function submitDetails() {\n if (!contact.name.trim() || submitting) return\n emitIdentity() // re-fire with the full name to enrich the account\n if (payment) { setPaymentStep('choose'); setStep('payment') } else void handleConfirm()\n }\n async function payWithPix(fee: number, svcId: string, svcName: string) {\n if (charging) return\n setCharging(true)\n try {\n await submit({ serviceId: svcId, startsAt: slotStart!, contact })\n if (paymentProvider) {\n const c = await paymentProvider.createCharge({\n amount: fee, currency, method: 'pix', description: svcName,\n customer: { name: contact.name, email: contact.email || undefined, phone: contact.phone || undefined },\n })\n setCharge(c)\n }\n setPaymentStep('pix')\n } catch {\n /* error surfaced inline */\n } finally {\n setCharging(false)\n }\n }\n\n // ---- OVERVIEW (default view, no service chosen) ----\n if (step === 'overview') {\n return (\n <div className=\"mx-auto max-w-4xl\">\n <BrandHeader />\n <div className=\"grid gap-6 lg:grid-cols-[1fr_18rem]\">\n <div className=\"space-y-6\">\n {/* Serviços */}\n <section className=\"rounded-2xl border border-border bg-card p-6 shadow-sm\">\n <h3 className=\"mb-4 font-heading text-lg font-bold text-foreground\">Serviços</h3>\n <div className=\"space-y-3\">\n {services.map((s, i) => (\n <ServiceRow key={s.id} service={s} featured={i === 0} onSelect={() => startBooking(s.id)} fmt={fmt} />\n ))}\n </div>\n </section>\n\n {/* Sobre — horário de funcionamento */}\n <section className=\"rounded-2xl border border-border bg-card p-6 shadow-sm\">\n <h3 className=\"font-heading text-lg font-bold text-foreground\">Sobre</h3>\n <p className=\"mt-3 mb-2 flex items-center gap-1.5 text-sm font-medium text-muted-foreground\">\n <Clock className=\"h-4 w-4\" /> Horário de funcionamento\n </p>\n <ul className=\"divide-y divide-border border-l-2 border-primary/20 pl-4\">\n {WEEK_ORDER.map((day) => {\n const open = openDays.has(day)\n return (\n <li key={day} className=\"flex items-center justify-between py-2 text-sm\">\n <span className=\"text-foreground\">{DAY_NAMES[day]}</span>\n <span className={open ? 'tabular-nums text-foreground' : 'text-muted-foreground'}>\n {open ? `${businessHours.start} – ${businessHours.end}` : 'Fechado'}\n </span>\n </li>\n )\n })}\n </ul>\n </section>\n </div>\n\n {/* Sidebar CTA */}\n <aside className=\"lg:sticky lg:top-24 lg:self-start\">\n <div className=\"rounded-2xl border border-border bg-card p-5 shadow-sm\">\n <button\n type=\"button\"\n onClick={() => startBooking()}\n className=\"w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Agendar agora\n </button>\n <div className=\"mt-5 space-y-2 border-t border-border pt-4 text-xs text-muted-foreground\">\n <p className=\"flex items-center gap-2\"><Video className=\"h-3.5 w-3.5 text-primary\" /> Consulta 100% online</p>\n <p className=\"flex items-center gap-2\"><MapPin className=\"h-3.5 w-3.5 text-primary\" /> Atende todo o Brasil</p>\n <p className=\"flex items-center gap-2\"><CreditCard className=\"h-3.5 w-3.5 text-primary\" /> Aceitamos Pix</p>\n <p className=\"flex items-center gap-2\"><User className=\"h-3.5 w-3.5 text-primary\" /> {professionalName}</p>\n </div>\n </div>\n </aside>\n </div>\n </div>\n )\n }\n\n // ---- WIZARD (datetime → contact → success) ----\n const railState = {\n service: 'done' as StepState,\n professional: 'done' as StepState,\n datetime: (slotStart ? 'done' : step === 'datetime' ? 'active' : 'todo') as StepState,\n contact: (step === 'payment' || step === 'success' ? 'done' : step === 'contact' ? 'active' : 'todo') as StepState,\n payment: (step === 'success' ? 'done' : step === 'payment' ? 'active' : 'todo') as StepState,\n }\n const railTitle = step === 'payment' && paymentStep === 'pix' ? 'Aguardando pagamento' : 'Passos para agendar'\n\n return (\n <div className=\"mx-auto max-w-4xl\">\n <BrandHeader />\n <div className=\"grid gap-6 lg:grid-cols-[1fr_18rem]\">\n {/* LEFT — step panel */}\n <div className=\"rounded-2xl border border-border bg-card p-6 md:p-7 shadow-sm\">\n <div className=\"mb-5 flex items-center gap-1.5 lg:hidden\">\n {(['datetime', 'contact'] as const).map((s) => (\n <span key={s} className={`h-1.5 flex-1 rounded-full ${railState[s] !== 'todo' ? 'bg-primary' : 'bg-muted'}`} />\n ))}\n </div>\n\n {step !== 'success' ? (\n <button\n type=\"button\"\n onClick={() => setStep(step === 'payment' ? 'contact' : step === 'contact' ? 'datetime' : 'overview')}\n className=\"mb-4 inline-flex items-center gap-1 rounded text-sm font-medium text-muted-foreground hover:text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronLeft className=\"h-4 w-4\" /> {step === 'datetime' ? 'Serviços' : 'Voltar'}\n </button>\n ) : null}\n\n {/* STEP: datetime */}\n {step === 'datetime' ? (\n <div>\n <div className=\"flex flex-wrap items-baseline justify-between gap-2\">\n <h3 className=\"font-heading text-xl font-bold text-foreground\">{labels.dateStep}</h3>\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3.5 w-3.5\" /> Fuso: Horário de Brasília\n </span>\n </div>\n\n <div className=\"mt-5 flex items-center justify-between\">\n <span className=\"text-sm font-semibold capitalize text-foreground\">{fmt.month.format(week[0].date)}</span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n disabled={weekOffset === 0}\n onClick={() => setWeekOffset((w) => Math.max(0, w - 1))}\n className=\"flex h-9 w-9 items-center justify-center rounded-lg border border-border text-foreground transition-colors hover:bg-accent disabled:opacity-40 disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label=\"Semana anterior\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n disabled={weekOffset >= maxWeekOffset}\n onClick={() => setWeekOffset((w) => Math.min(maxWeekOffset, w + 1))}\n className=\"flex h-9 w-9 items-center justify-center rounded-lg border border-border text-foreground transition-colors hover:bg-accent disabled:opacity-40 disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label=\"Próxima semana\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"mt-3 grid grid-cols-7 gap-1.5\">\n {week.map((d) => {\n const selected = date === d.iso\n const closed = !openDays.has(d.date.getDay())\n return (\n <button\n key={d.iso}\n type=\"button\"\n disabled={closed}\n onClick={() => { setDate(d.iso); setSlotStart(null) }}\n className={[\n 'flex flex-col items-center gap-0.5 rounded-xl border py-2.5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n closed\n ? 'cursor-not-allowed border-transparent text-muted-foreground/40'\n : selected\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border text-foreground hover:border-primary/60 hover:bg-accent/40',\n ].join(' ')}\n >\n <span className=\"text-[11px] font-medium capitalize opacity-80\">\n {fmt.weekday.format(d.date).replace('.', '')}\n </span>\n <span className=\"text-sm font-bold tabular-nums\">{fmt.dayNum.format(d.date)}</span>\n </button>\n )\n })}\n </div>\n\n {date ? (\n <div className=\"mt-6\">\n <p className=\"mb-2 text-sm font-semibold text-foreground\">Horários disponíveis</p>\n {slotsLoading ? (\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"h-10 animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n ) : bookableSlots.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">\n Nenhum horário disponível neste dia. Tente outra data.\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4\">\n {bookableSlots.map((s) => {\n const selected = slotStart === s.start\n return (\n <button\n key={s.start}\n type=\"button\"\n onClick={() => setSlotStart(s.start)}\n className={[\n 'rounded-lg border py-2.5 text-sm font-semibold tabular-nums transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border text-foreground hover:border-primary/60 hover:bg-accent/40',\n ].join(' ')}\n >\n {fmt.time.format(new Date(s.start))}\n </button>\n )\n })}\n </div>\n )}\n </div>\n ) : null}\n\n <button\n type=\"button\"\n disabled={!slotStart}\n onClick={() => setStep('contact')}\n className=\"mt-6 w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Continuar\n </button>\n </div>\n ) : null}\n\n {/* STEP: contact — phone verification first, then details */}\n {step === 'contact' ? (\n <div>\n <h3 className=\"font-heading text-xl font-bold text-foreground\">{labels.contactStep}</h3>\n\n {/* Sub-step: phone */}\n {contactStep === 'phone' ? (\n <form onSubmit={(e) => { e.preventDefault(); sendCode() }}>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Preencha as informações abaixo para que seu agendamento seja identificado.\n </p>\n <div className=\"mt-5\">\n <label htmlFor=\"bk-phone\" className=\"mb-1 block text-sm font-medium text-foreground\">Celular</label>\n <div className=\"flex\">\n <div className=\"relative\">\n <select\n aria-label=\"País\"\n value={countryIso}\n onChange={(e) => {\n const c = getCountry(e.target.value)\n setCountryIso(c.iso2)\n setContact({ ...contact, phone: maskPhone(unmaskPhone(contact.phone), c.mask) })\n }}\n className=\"h-full appearance-none rounded-l-xl border border-r-0 border-border bg-muted py-3 pl-3 pr-8 text-sm font-medium text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {COUNTRIES.map((c) => (\n <option key={c.iso2} value={c.iso2}>{c.flag} {c.dial}</option>\n ))}\n </select>\n <ChevronDown className=\"pointer-events-none absolute right-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n </div>\n <input\n id=\"bk-phone\" type=\"tel\" autoComplete=\"tel\" inputMode=\"tel\" value={contact.phone}\n onChange={(e) => setContact({ ...contact, phone: maskPhone(e.target.value, country.mask) })}\n className=\"w-full rounded-r-xl border border-border bg-background px-4 py-3 text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={`Ex.: ${maskPhone('11987654321', country.mask)}`}\n />\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n Enviaremos um código para confirmar que o número de telefone é seu. Usaremos este número para associar as suas informações à sua conta.\n </p>\n </div>\n <button\n type=\"submit\"\n disabled={unmaskPhone(contact.phone).length < 8}\n className=\"mt-5 w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Enviar código via WhatsApp\n </button>\n </form>\n ) : null}\n\n {/* Sub-step: details (after verification) */}\n {contactStep === 'details' ? (\n <form onSubmit={(e) => { e.preventDefault(); submitDetails() }}>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Preencha as informações abaixo para que seu agendamento seja identificado.\n </p>\n <div className=\"mt-4 flex items-center justify-between rounded-xl border border-border bg-muted/40 px-4 py-3\">\n <span className=\"flex items-center gap-2 text-sm text-foreground\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" /> Celular verificado · {country.flag} {country.dial} {contact.phone}\n </span>\n <button\n type=\"button\"\n onClick={() => setContactStep('phone')}\n className=\"rounded text-sm font-medium text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Trocar telefone\n </button>\n </div>\n <div className=\"mt-4 space-y-3\">\n <div>\n <label htmlFor=\"bk-name\" className=\"mb-1 block text-sm font-medium text-foreground\">Nome completo *</label>\n <input\n id=\"bk-name\" type=\"text\" autoComplete=\"name\" value={contact.name}\n onChange={(e) => setContact({ ...contact, name: e.target.value })}\n className=\"w-full rounded-xl border border-border bg-background px-4 py-3 text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder=\"Seu nome\"\n />\n </div>\n <div>\n <label htmlFor=\"bk-email\" className=\"mb-1 block text-sm font-medium text-foreground\">E-mail</label>\n <input\n id=\"bk-email\" type=\"email\" autoComplete=\"email\" inputMode=\"email\" value={contact.email}\n onChange={(e) => setContact({ ...contact, email: e.target.value })}\n className=\"w-full rounded-xl border border-border bg-background px-4 py-3 text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder=\"voce@email.com\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">Enviaremos uma confirmação e um lembrete antes do agendamento.</p>\n </div>\n <div>\n <label htmlFor=\"bk-notes\" className=\"mb-1 block text-sm font-medium text-foreground\">Observação</label>\n <textarea\n id=\"bk-notes\" rows={3} value={contact.notes}\n onChange={(e) => setContact({ ...contact, notes: e.target.value })}\n className=\"w-full resize-none rounded-xl border border-border bg-background px-4 py-3 text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder=\"Use esse espaço para deixar uma observação sobre este agendamento\"\n />\n </div>\n </div>\n {error ? (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n Não foi possível concluir o agendamento. Tente novamente.\n </p>\n ) : null}\n <button\n type=\"submit\"\n disabled={!contact.name.trim() || submitting}\n className=\"mt-5 flex w-full items-center justify-center gap-2 rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {submitting ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Check className=\"h-4 w-4\" />}\n {payment ? 'Salvar e continuar' : labels.confirmCta}\n </button>\n {!payment ? (\n <p className=\"mt-3 flex items-center justify-center gap-1.5 text-xs text-muted-foreground\">\n <CreditCard className=\"h-3.5 w-3.5\" /> Pagamento via Pix · Sem cobrança agora\n </p>\n ) : null}\n </form>\n ) : null}\n </div>\n ) : null}\n\n {/* Code verification modal */}\n {step === 'contact' && contactStep === 'code' ? (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-foreground/40 p-4\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Verificação de código\">\n <div className=\"w-full max-w-md rounded-2xl border border-border bg-card p-6 shadow-xl\">\n <h4 className=\"font-heading text-lg font-bold text-foreground\">Insira o código</h4>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Enviamos um código via WhatsApp para você confirmar seu número.\n </p>\n <form onSubmit={(e) => { e.preventDefault(); confirmCode() }}>\n <input\n type=\"text\" inputMode=\"numeric\" value={code} autoFocus\n onChange={(e) => { setCode(e.target.value); setCodeError(false) }}\n className=\"mt-4 w-full rounded-xl border border-border bg-background px-4 py-3 text-center text-lg tracking-[0.4em] text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring placeholder:text-sm placeholder:tracking-normal\"\n placeholder=\"Digite o código\"\n />\n {codeError ? (\n <p role=\"alert\" className=\"mt-2 text-sm text-destructive\">Código inválido. Para testar, use 0000.</p>\n ) : null}\n <button\n type=\"submit\"\n className=\"mt-4 w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Confirmar\n </button>\n </form>\n <div className=\"mt-3 flex items-center justify-between text-xs text-muted-foreground\">\n <span>Reenviar código via WhatsApp em 28 segundos.</span>\n <button type=\"button\" onClick={() => setContactStep('phone')} className=\"font-medium text-primary hover:underline\">\n Voltar\n </button>\n </div>\n </div>\n </div>\n ) : null}\n\n {/* STEP: payment */}\n {step === 'payment' && service ? (() => {\n const feePct = payment?.reservationFeePercent ?? 100\n const fee = Math.round(service.price * feePct) / 100\n const remaining = Math.round((service.price - fee) * 100) / 100\n return (\n <div>\n {paymentStep === 'choose' ? (\n <div>\n {/* Order summary */}\n <div className=\"rounded-2xl border border-border p-4\">\n <div className=\"flex items-center justify-between font-semibold text-foreground\">\n <span>{service.name}</span>\n <span className=\"tabular-nums\">{fmt.price.format(service.price)}</span>\n </div>\n <div className=\"mt-3 space-y-2 text-sm\">\n <div className=\"flex items-center justify-between text-foreground\">\n <span className=\"flex items-center gap-2\">\n <span className=\"flex h-4 w-4 items-center justify-center rounded bg-primary text-primary-foreground\"><Check className=\"h-3 w-3\" /></span>\n Taxa de reserva <span className=\"rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\">{feePct}%</span>\n </span>\n <span className=\"tabular-nums\">{fmt.price.format(fee)}</span>\n </div>\n <div className=\"flex items-center justify-between text-muted-foreground\">\n <span className=\"flex items-center gap-2\">\n <span className=\"h-4 w-4 rounded border border-border\" /> Valor restante\n </span>\n <span className=\"tabular-nums\">{remaining <= 0 ? 'Grátis' : fmt.price.format(remaining)}</span>\n </div>\n <button type=\"button\" className=\"flex items-center gap-1 text-sm font-medium text-primary hover:underline\">\n <Plus className=\"h-3.5 w-3.5\" /> Adicionar cupom\n </button>\n </div>\n <div className=\"mt-3 flex items-center justify-between border-t border-dashed border-border pt-3 font-semibold text-foreground\">\n <span>Valor total</span>\n <span className=\"tabular-nums\">{fmt.price.format(service.price)}</span>\n </div>\n </div>\n\n {/* Method */}\n <div className=\"mt-6 flex items-center justify-between\">\n <h3 className=\"font-heading text-lg font-bold text-foreground\">Escolha como pagar</h3>\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\"><ShieldCheck className=\"h-3.5 w-3.5 text-primary\" /> Pagamento seguro</span>\n </div>\n <div className=\"mt-3 rounded-2xl border-2 border-primary bg-accent/20 p-4\">\n <p className=\"flex items-center gap-2 font-semibold text-foreground\">\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-primary text-primary-foreground\"><Check className=\"h-3.5 w-3.5\" /></span>\n Pix\n </p>\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-3\">\n {[\n { icon: Check, t: 'Finalize o agendamento clicando em \"Pagar com Pix\".' },\n { icon: QrCode, t: 'Mostraremos um QR Code e o Pix copia-e-cola.' },\n { icon: CalendarCheck, t: 'Após o pagamento, seu agendamento é reservado.' },\n ].map((s, i) => (\n <div key={i} className=\"text-sm text-muted-foreground\">\n <span className=\"mb-2 flex h-8 w-8 items-center justify-center rounded-lg bg-accent text-primary\"><s.icon className=\"h-4 w-4\" /></span>\n <span className=\"font-semibold text-foreground\">{i + 1}.</span> {s.t}\n </div>\n ))}\n </div>\n </div>\n\n {error ? <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">Não foi possível iniciar o pagamento. Tente novamente.</p> : null}\n <button\n type=\"button\"\n disabled={submitting || charging}\n onClick={() => void payWithPix(fee, service.id, service.name)}\n className=\"mt-6 flex w-full items-center justify-center gap-2 rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {submitting || charging ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <CreditCard className=\"h-4 w-4\" />}\n Pagar {fmt.price.format(fee)} com Pix\n </button>\n </div>\n ) : (\n /* Pix QR — aguardando pagamento */\n <div>\n <div className=\"rounded-xl border border-amber-300/60 bg-amber-50 p-4 dark:border-amber-400/30 dark:bg-amber-950/30\">\n <p className=\"flex items-center gap-2 text-sm font-semibold text-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" /> Realize o pagamento para finalizar\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Este código Pix é válido por somente 5 minutos. Não feche esta página até receber a confirmação do pagamento.\n </p>\n </div>\n <h3 className=\"mt-6 font-heading text-lg font-bold text-foreground\">Escaneie ou copie este código para pagar</h3>\n <ol className=\"mt-2 space-y-1 text-sm text-muted-foreground\">\n <li>1. Acesse o app do seu banco, pagamentos ou Internet Banking.</li>\n <li>2. Escolha pagar via Pix.</li>\n <li>3. Escaneie o QR Code ou use o Pix copia-e-cola:</li>\n </ol>\n <div className=\"mt-4 w-fit rounded-xl border border-border bg-white p-3\">\n <QrPlaceholder data={charge?.pixQrCode ?? PIX_PAYLOAD} />\n </div>\n <div className=\"mt-4 flex max-w-md items-center gap-2\">\n <code className=\"flex-1 truncate rounded-lg border border-border bg-muted px-3 py-2 text-xs text-muted-foreground\">{charge?.pixCopyPaste ?? PIX_PAYLOAD}</code>\n <button\n type=\"button\"\n onClick={() => {\n const payload = charge?.pixCopyPaste ?? PIX_PAYLOAD\n try { void navigator.clipboard?.writeText(payload); setCopied(true) } catch { setCopied(true) }\n }}\n className=\"inline-flex shrink-0 items-center gap-1.5 rounded-lg bg-foreground px-3 py-2 text-xs font-medium text-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {copied ? <Check className=\"h-3.5 w-3.5\" /> : <Copy className=\"h-3.5 w-3.5\" />} {copied ? 'Copiado' : 'Copiar'}\n </button>\n </div>\n {/* POC shortcut — the mock provider also auto-confirms via polling after a few seconds. */}\n <button\n type=\"button\"\n onClick={() => setStep('success')}\n className=\"mt-6 w-full rounded-xl border border-primary py-3 font-semibold text-primary transition-colors hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Já paguei — confirmar (simulação)\n </button>\n </div>\n )}\n </div>\n )\n })() : null}\n\n {/* STEP: success */}\n {step === 'success' ? (\n <div className=\"py-8 text-center\">\n <div className=\"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-accent text-primary\">\n <Check className=\"h-8 w-8\" />\n </div>\n <h3 className=\"font-heading text-2xl font-bold text-foreground\">{labels.successTitle}</h3>\n <p className=\"mx-auto mt-2 max-w-sm text-muted-foreground\">{labels.successBody}</p>\n {service && slotStart ? (\n <div className=\"mx-auto mt-6 max-w-sm rounded-2xl border border-border bg-muted/50 p-4 text-left\">\n <p className=\"font-semibold text-foreground\">{service.name}</p>\n <p className=\"mt-1 flex items-center gap-1.5 text-sm tabular-nums text-muted-foreground\">\n <Calendar className=\"h-4 w-4 text-primary\" /> {formatSlotRange(slotStart, service.durationMinutes, fmt)}\n </p>\n <p className=\"mt-1 flex items-center gap-1.5 text-sm text-muted-foreground\">\n <User className=\"h-4 w-4 text-primary\" /> {professionalName}\n </p>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n\n {/* RIGHT — progress + summary rail */}\n <aside className=\"hidden lg:block\">\n <div className=\"sticky top-24 rounded-2xl border border-border bg-card p-5 shadow-sm\">\n <p className=\"mb-5 font-heading text-sm font-bold uppercase tracking-wide text-muted-foreground\">\n {railTitle}\n </p>\n <ol className=\"space-y-6\">\n <StepRail n={1} label=\"Serviço\" state={railState.service}>\n {service ? (\n <div className=\"rounded-xl border border-border bg-background p-3\">\n <p className=\"truncate text-sm font-semibold text-foreground\">{service.name}</p>\n <p className=\"mt-0.5 flex items-center justify-between text-xs text-muted-foreground\">\n <span>Online · {service.durationMinutes} min</span>\n <span className=\"font-semibold tabular-nums text-primary\">{fmt.price.format(service.price)}</span>\n </p>\n </div>\n ) : null}\n </StepRail>\n\n <StepRail n={2} label=\"Profissional\" state={railState.professional}>\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-primary text-xs font-semibold text-primary-foreground\">\n {professionalName.charAt(0)}\n </span>\n <span className=\"text-sm text-foreground\">{professionalName}</span>\n </div>\n </StepRail>\n\n <StepRail n={3} label=\"Data e horário\" state={railState.datetime}>\n {slotStart && service ? (\n <p className=\"text-sm tabular-nums text-foreground\">\n {formatSlotRange(slotStart, service.durationMinutes, fmt)}\n </p>\n ) : null}\n </StepRail>\n\n <StepRail n={4} label=\"Informações pessoais\" state={railState.contact}>\n {(contact.name || contact.phone) && (step === 'payment' || step === 'success' || contactStep === 'details') ? (\n <p className=\"text-sm text-foreground\">\n {contact.name || 'Contato'}{contact.phone ? ` · ${country.dial} ${contact.phone}` : ''}\n </p>\n ) : null}\n </StepRail>\n\n {payment ? (\n <StepRail n={5} label=\"Pagamento\" state={railState.payment}>\n {step === 'payment' || step === 'success' ? (\n <p className=\"flex items-center gap-1.5 text-sm text-foreground\"><CreditCard className=\"h-3.5 w-3.5 text-primary\" /> Pix à vista</p>\n ) : null}\n </StepRail>\n ) : null}\n </ol>\n </div>\n </aside>\n </div>\n </div>\n )\n}\n","import { createElement, type FC, type ReactNode } from 'react'\nimport type { PluginManifest, PluginScope, VerticalId, PaymentProvider } from '@fayz-ai/core'\nimport { createSafeDataProvider } from '@fayz-ai/core'\nimport type { AgendaDataProvider } from '../data/types'\nimport type { Professional, Schedule } from '../types'\nimport { createMockAgendaProvider, type MockAgendaSeed } from '../data/mock'\nimport { createSupabaseAgendaProvider } from '../data/supabase'\nimport { BookingProvider, type PublicBookingContextValue, type OnIdentityVerified } from './context'\nimport { BookingWidget } from './BookingWidget'\nimport type { PublicService, BookingWindow, PublicBookingLabels, WorkingHours, PaymentConfig, ResolvedPayment } from './types'\n\nexport interface PublicBookingOptions {\n /** Mount path for the public booking route. Default '/agendar'. */\n basePath?: string\n /** The single professional/resource bookings target (POC). */\n professional?: { id?: string; name?: string }\n /** Bookable services shown in the widget. */\n services: PublicService[]\n /** Working hours used to seed the mock provider's availability. */\n workingHours?: WorkingHours\n /** Booking-window bounds for the date/slot picker. */\n window?: Partial<BookingWindow>\n labels?: Partial<PublicBookingLabels>\n /** Adds a final Pagamento (Pix) step. Omit/disable to end the flow at confirmation. */\n payment?: PaymentConfig\n /** Charge provider (from a payments plugin) used by the Pagamento step. Optional. */\n paymentProvider?: PaymentProvider\n /** Host bridge: fired when the customer's phone is verified / details submitted. */\n onIdentityVerified?: OnIdentityVerified\n currency?: string\n locale?: string\n /** Inject a custom provider (real availability). Overrides the safe resolver. */\n dataProvider?: AgendaDataProvider\n /** Override the full mock seed (advanced). */\n seed?: MockAgendaSeed\n scope?: PluginScope\n verticalId?: VerticalId\n}\n\nexport interface PublicBookingPlugin {\n manifest: PluginManifest\n Provider: FC<{ children: ReactNode }>\n dataProvider: AgendaDataProvider\n}\n\nconst DEFAULT_LABELS: PublicBookingLabels = {\n title: 'Agende sua consulta',\n serviceStep: 'Escolha o serviço',\n dateStep: 'Escolha a data',\n contactStep: 'Seus dados',\n confirmCta: 'Confirmar agendamento',\n successTitle: 'Agendamento confirmado!',\n successBody: 'Você receberá os detalhes em breve. Até logo!',\n}\n\nconst DEFAULT_WINDOW: BookingWindow = { minAdvanceHours: 2, maxAdvanceDays: 21, slotInterval: 30 }\n\nconst DEFAULT_HOURS: WorkingHours = { daysOfWeek: [1, 2, 3, 4, 5, 6], start: '09:00', end: '18:00' }\n\nlet scheduleId = 0\n\nfunction buildSchedules(professionalId: string, hours: WorkingHours): Schedule[] {\n return hours.daysOfWeek.map((day) => ({\n id: `sched-${professionalId}-${day}-${scheduleId++}`,\n tenantId: 'public',\n kind: 'working_hours',\n assigneeId: professionalId,\n locationId: null,\n dayOfWeek: day,\n specificDate: null,\n startsAt: hours.start,\n endsAt: hours.end,\n isActive: true,\n metadata: {},\n }))\n}\n\nexport function createPublicBookingPlugin(options: PublicBookingOptions): PublicBookingPlugin {\n const basePath = options.basePath ?? '/agendar'\n const professionalId = options.professional?.id ?? 'dr-hiago'\n const professionalName = options.professional?.name ?? 'Especialista'\n const window: BookingWindow = { ...DEFAULT_WINDOW, ...options.window }\n const labels: PublicBookingLabels = { ...DEFAULT_LABELS, ...options.labels }\n const currency = options.currency ?? 'BRL'\n const locale = options.locale ?? 'pt-BR'\n const hours = options.workingHours ?? DEFAULT_HOURS\n const payment: ResolvedPayment | null = options.payment?.enabled\n ? {\n reservationFeePercent: options.payment.reservationFeePercent ?? 100,\n method: options.payment.method ?? 'pix',\n }\n : null\n\n const professional: Professional = {\n id: professionalId,\n name: professionalName,\n avatarUrl: null,\n locationId: null,\n locationName: null,\n isActive: true,\n }\n const mockSeed: MockAgendaSeed = options.seed ?? {\n professionals: [professional],\n schedules: buildSchedules(professionalId, hours),\n bookings: [],\n }\n\n const provider =\n options.dataProvider ??\n createSafeDataProvider(\n () => createSupabaseAgendaProvider(),\n () => createMockAgendaProvider({ seed: mockSeed }),\n )\n\n const value: PublicBookingContextValue = {\n provider,\n professionalId,\n professionalName,\n services: options.services,\n businessHours: hours,\n payment,\n paymentProvider: options.paymentProvider ?? null,\n onIdentityVerified: options.onIdentityVerified ?? null,\n window,\n labels,\n currency,\n locale,\n }\n const Provider: FC<{ children: ReactNode }> = ({ children }) =>\n createElement(BookingProvider, { value, children })\n Provider.displayName = 'PublicBookingProvider'\n\n const BookingScreen: FC<unknown> = () =>\n createElement('section', { className: 'py-16 bg-background' },\n createElement('div', { className: 'container mx-auto px-6' },\n createElement(BookingWidget)))\n BookingScreen.displayName = 'BookingScreen'\n\n const manifest: PluginManifest = {\n id: 'booking',\n name: 'Agendamento',\n icon: 'CalendarCheck',\n version: '0.1.0',\n scope: options.scope ?? 'universal',\n verticalId: options.verticalId,\n scaffolds: ['website', 'landing_page'],\n defaultEnabled: true,\n dependencies: [],\n navigation: [],\n routes: [{ path: basePath, component: BookingScreen, guard: 'public' }],\n widgets: [],\n }\n\n return { manifest, Provider, dataProvider: provider }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/public/data.ts","../../src/public/data.supabase.ts","../../src/public/context.tsx","../../src/public/hooks.ts","../../src/public/format.ts","../../src/public/steps/OverviewStep.tsx","../../src/public/steps/DateTimeStep.tsx","../../src/public/steps/ContactStep.tsx","../../src/public/steps/PaymentStep.tsx","../../src/public/components/SummaryRail.tsx","../../src/public/BookingWidget.tsx","../../src/public/components/BrandHeader.tsx","../../src/public/components/ServiceCard.tsx","../../src/public/components/SidebarExtras.tsx","../../src/public/components/StepRailItem.tsx","../../src/public/components/SuccessPanel.tsx","../../src/public/components/defaults.ts","../../src/public/createPublicBookingPlugin.ts"],"names":["window","useState","useEffect","useMemo","jsx","jsxs","Clock","Check","ShieldCheck","Loader2","CreditCard","unmaskPhone","ChevronLeft","maskPhone","ChevronRight","User","CalendarCheck"],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// PublicBookingDataProvider — the narrow data seam the public booking surface\n// depends on. The admin calendar's 15-method AgendaDataProvider is deliberately\n// NOT used here: a public page needs exactly three capabilities, and the\n// Supabase implementation must be anon-safe (SECURITY DEFINER RPCs + whitelisted\n// views) rather than the authenticated table access the admin provider does.\n// ---------------------------------------------------------------------------\n\nimport type { TimeSlot } from '../types'\nimport { createMockAgendaProvider, type MockAgendaSeed } from '../data/mock'\nimport type { PublicService, ContactInfo } from './types'\n\nexport interface PublicSlotQuery {\n /** Staff person id; null → any active professional for the tenant. */\n assigneeId: string | null\n /** 'YYYY-MM-DD' local calendar day. */\n date: string\n durationMinutes: number\n slotInterval: number\n}\n\nexport interface PublicCreateBookingInput {\n serviceId: string\n /** ISO datetime of the chosen slot start. */\n startsAt: string\n /** name required; phone should include the country dial for real backends. */\n contact: ContactInfo\n}\n\nexport interface PublicBookingResult {\n bookingId: string\n startsAt: string\n endsAt: string\n}\n\nexport interface PublicBookingDataProvider {\n /** Bookable catalog. Used when the host doesn't pass static `services`. */\n getServices(): Promise<PublicService[]>\n getAvailableSlots(query: PublicSlotQuery): Promise<TimeSlot[]>\n createBooking(input: PublicCreateBookingInput): Promise<PublicBookingResult>\n}\n\n// ---------------------------------------------------------------------------\n// Mock implementation — adapter over the admin mock provider (reuses its slot\n// algorithm + seed machinery, so mock and live behave identically).\n// ---------------------------------------------------------------------------\n\nexport interface MockPublicBookingOptions {\n seed: MockAgendaSeed\n services: PublicService[]\n /** The seed professional bookings are created against. */\n professionalId: string\n}\n\nexport function createMockPublicBookingProvider(options: MockPublicBookingOptions): PublicBookingDataProvider {\n const inner = createMockAgendaProvider({ seed: options.seed })\n const { services, professionalId } = options\n\n return {\n async getServices() {\n return services\n },\n async getAvailableSlots(query) {\n return inner.getAvailableSlots({\n assigneeId: query.assigneeId ?? professionalId,\n date: query.date,\n durationMinutes: query.durationMinutes,\n slotInterval: query.slotInterval,\n })\n },\n async createBooking(input) {\n const service = services.find((s) => s.id === input.serviceId)\n if (!service) throw new Error('Serviço inválido')\n const booking = await inner.createBooking({\n kind: 'appointment',\n // Mock: the customer is captured as the booking title; the Supabase\n // path upserts a person record server-side instead.\n clientId: 'public-guest',\n professionalId,\n startsAt: input.startsAt,\n title: input.contact.name,\n notes:\n [input.contact.phone, input.contact.email, input.contact.notes].filter(Boolean).join(' · ') || undefined,\n services: [\n {\n serviceId: service.id,\n name: service.name,\n durationMinutes: service.durationMinutes,\n price: service.price,\n assigneeId: professionalId,\n },\n ],\n })\n const endsAt =\n booking.endsAt ?? new Date(new Date(input.startsAt).getTime() + service.durationMinutes * 60_000).toISOString()\n return { bookingId: booking.id, startsAt: booking.startsAt, endsAt }\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// Supabase implementation of PublicBookingDataProvider — anon-safe.\n//\n// Public booking pages run with the publishable (anon) key and NO user session,\n// so the canonical tenant RLS (`tenant_id IN user_tenant_ids()`) yields nothing.\n// This provider therefore only touches objects designed for anon access:\n// - public.v_public_services (column-whitelisted view of active services)\n// - public.get_available_slots (SECURITY DEFINER RPC, mirrors the mock algo)\n// - public.create_public_booking (SECURITY DEFINER RPC: validates the slot,\n// upserts the customer person, writes order+booking+order_item atomically)\n// Shipped by plugins/plugin-agenda/src/migrations/001_public_booking.sql.\n// ---------------------------------------------------------------------------\n\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { TimeSlot } from '../types'\nimport type { PublicService } from './types'\nimport type { PublicBookingDataProvider } from './data'\n\nexport interface SupabasePublicBookingOptions {\n /** The tenant this public page books against (RPC arg — required). */\n tenantId: string\n}\n\ninterface SupabaseLikeClient {\n from(table: string): any\n rpc(fn: string, args: Record<string, unknown>): PromiseLike<{ data: unknown; error: { message: string } | null }>\n}\n\nfunction getClient(): SupabaseLikeClient {\n const client = getSupabaseClientOptional() as SupabaseLikeClient | null\n if (!client) throw new Error('[plugin-agenda/public] Supabase client not initialized')\n return client\n}\n\n/** Digits-only phone (RPC normalizes again server-side; keep the dial code). */\nfunction toPhoneDigits(phone: string | undefined): string {\n return (phone ?? '').replace(/\\D/g, '')\n}\n\nexport function createSupabasePublicBookingProvider(options: SupabasePublicBookingOptions): PublicBookingDataProvider {\n const { tenantId } = options\n\n return {\n async getServices(): Promise<PublicService[]> {\n const { data, error } = await getClient()\n .from('v_public_services')\n .select('id, name, description, price, currency, duration_minutes, sort_order')\n .eq('tenant_id', tenantId)\n .order('sort_order', { ascending: true })\n if (error) throw new Error(`[plugin-agenda/public] getServices: ${error.message}`)\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => ({\n id: String(row.id),\n name: String(row.name),\n description: (row.description as string | null) ?? undefined,\n price: Number(row.price ?? 0),\n durationMinutes: Number(row.duration_minutes ?? 30),\n }))\n },\n\n async getAvailableSlots(query): Promise<TimeSlot[]> {\n const { data, error } = await getClient().rpc('get_available_slots', {\n p_tenant_id: tenantId,\n p_assignee_id: query.assigneeId,\n p_date: query.date,\n p_duration_minutes: query.durationMinutes,\n p_slot_interval: query.slotInterval,\n })\n if (error) throw new Error(`[plugin-agenda/public] getAvailableSlots: ${error.message}`)\n return ((data ?? []) as Array<{ slot_start: string; slot_end: string }>).map((row) => ({\n start: row.slot_start,\n end: row.slot_end,\n }))\n },\n\n async createBooking(input) {\n const phone = toPhoneDigits(input.contact.phone)\n const { data, error } = await getClient().rpc('create_public_booking', {\n p_tenant_id: tenantId,\n p_service_id: input.serviceId,\n p_starts_at: input.startsAt,\n p_name: input.contact.name.trim(),\n p_phone: phone,\n p_email: input.contact.email?.trim() || null,\n p_notes: input.contact.notes?.trim() || null,\n })\n if (error) throw new Error(`[plugin-agenda/public] createBooking: ${error.message}`)\n const row = (Array.isArray(data) ? data[0] : data) as\n | { booking_id: string; starts_at: string; ends_at: string }\n | undefined\n if (!row) throw new Error('[plugin-agenda/public] createBooking: empty RPC response')\n return { bookingId: row.booking_id, startsAt: row.starts_at, endsAt: row.ends_at }\n },\n }\n}\n","import { createContext, useContext, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport type { PaymentProvider } from '@fayz-ai/core'\nimport type { PublicBookingDataProvider } from './data'\nimport type {\n BookingComponents,\n BookingWindow,\n PublicBookingLabels,\n PublicService,\n ResolvedBookingBrand,\n ResolvedPayment,\n WorkingHours,\n} from './types'\n\n/** Emitted when the customer's phone is verified / identity captured, for the\n * host to bridge to auth (booking stays decoupled — data-only, optional). */\nexport type OnIdentityVerified = (identity: { name: string; phone: string; email?: string }) => void\n\nexport interface PublicBookingContextValue {\n provider: PublicBookingDataProvider\n /** The professional/resource bookings are created against; null → any. */\n professionalId: string | null\n professionalName: string\n /** Resolved catalog: static `services` option, or fetched from the provider. */\n services: PublicService[]\n servicesLoading: boolean\n /** Business opening hours, shown on the overview \"Sobre\" section. */\n businessHours: WorkingHours\n /** Payment step config, or null when the flow ends at confirmation. */\n payment: ResolvedPayment | null\n /** Injected charge provider (Pix). When absent, the payment step self-mocks. */\n paymentProvider: PaymentProvider | null\n /** Fired on phone-verify / details submit so the host can sign the user in. */\n onIdentityVerified: OnIdentityVerified | null\n window: BookingWindow\n labels: PublicBookingLabels\n /** Brand personalization (resolved with defaults). */\n brand: ResolvedBookingBrand\n /** Host-overridable subcomponents (resolved with defaults). */\n components: BookingComponents\n /** Currency code for price formatting (e.g. 'BRL'). */\n currency: string\n locale: string\n}\n\nconst PublicBookingContext = createContext<PublicBookingContextValue | null>(null)\n\nexport interface BookingProviderProps {\n /** Everything but the (possibly async) service catalog. */\n base: Omit<PublicBookingContextValue, 'services' | 'servicesLoading'>\n /** Static catalog from options — wins over the provider fetch when present. */\n staticServices: PublicService[] | null\n children: ReactNode\n}\n\n/**\n * Owns the service-catalog resolution: static services pass through untouched;\n * otherwise the provider is queried once (e.g. Supabase v_public_services).\n */\nexport function BookingProvider({ base, staticServices, children }: BookingProviderProps) {\n const [fetched, setFetched] = useState<PublicService[] | null>(null)\n const [loading, setLoading] = useState(staticServices === null)\n\n useEffect(() => {\n if (staticServices !== null) return\n let active = true\n setLoading(true)\n base.provider\n .getServices()\n .then((result) => {\n if (active) setFetched(result)\n })\n .catch((err) => {\n // Surface in dev; the overview renders its empty state.\n console.error('[plugin-agenda/public] failed to load services:', err)\n if (active) setFetched([])\n })\n .finally(() => {\n if (active) setLoading(false)\n })\n return () => {\n active = false\n }\n // base.provider is stable (created once by the plugin factory).\n }, [base.provider, staticServices])\n\n const value = useMemo<PublicBookingContextValue>(\n () => ({ ...base, services: staticServices ?? fetched ?? [], servicesLoading: loading }),\n [base, staticServices, fetched, loading],\n )\n\n return <PublicBookingContext.Provider value={value}>{children}</PublicBookingContext.Provider>\n}\n\nexport function useBooking(): PublicBookingContextValue {\n const ctx = useContext(PublicBookingContext)\n if (!ctx) {\n throw new Error('[plugin-agenda] useBooking must be used within <BookingProvider>.')\n }\n return ctx\n}\n","import { useEffect, useState } from 'react'\nimport { useBooking } from './context'\nimport type { PublicService } from './types'\nimport type { PublicCreateBookingInput, PublicBookingResult } from './data'\nimport type { TimeSlot } from '../types'\n\n/** The resolved bookable services (static option or fetched from the provider). */\nexport function useServices(): PublicService[] {\n return useBooking().services\n}\n\nexport interface UsePublicServicesResult {\n services: PublicService[]\n loading: boolean\n}\n\n/** Like useServices, but exposes the fetch state for skeletons. */\nexport function usePublicServices(): UsePublicServicesResult {\n const { services, servicesLoading } = useBooking()\n return { services, loading: servicesLoading }\n}\n\nexport interface UseAvailableSlotsResult {\n slots: TimeSlot[]\n loading: boolean\n error: Error | null\n}\n\n/**\n * Available time slots for a service on a given date. Delegates to\n * provider.getAvailableSlots — mock now, Supabase RPC when configured, same call.\n */\nexport function useAvailableSlots(params: { serviceId: string | null; date: string | null }): UseAvailableSlotsResult {\n const { provider, professionalId, services, window } = useBooking()\n const [slots, setSlots] = useState<TimeSlot[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const { serviceId, date } = params\n const service = services.find((s) => s.id === serviceId)\n const durationMinutes = service?.durationMinutes ?? 0\n\n useEffect(() => {\n let active = true\n if (!serviceId || !date || !durationMinutes) {\n setSlots([])\n return\n }\n setLoading(true)\n provider\n .getAvailableSlots({ assigneeId: professionalId, date, durationMinutes, slotInterval: window.slotInterval })\n .then((result) => {\n if (!active) return\n setSlots(result)\n setError(null)\n })\n .catch((err) => {\n if (!active) return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (active) setLoading(false)\n })\n return () => {\n active = false\n }\n }, [provider, professionalId, serviceId, date, durationMinutes, window.slotInterval])\n\n return { slots, loading, error }\n}\n\nexport type CreatePublicBookingInput = PublicCreateBookingInput\n\nexport interface UseCreateBookingResult {\n submit: (input: CreatePublicBookingInput) => Promise<PublicBookingResult>\n submitting: boolean\n error: Error | null\n done: boolean\n}\n\n/** Create a booking via the provider (mock append / Supabase RPC). */\nexport function useCreateBooking(): UseCreateBookingResult {\n const { provider } = useBooking()\n const [submitting, setSubmitting] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [done, setDone] = useState(false)\n\n async function submit(input: CreatePublicBookingInput): Promise<PublicBookingResult> {\n setSubmitting(true)\n setError(null)\n try {\n const result = await provider.createBooking(input)\n setDone(true)\n return result\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n } finally {\n setSubmitting(false)\n }\n }\n\n return { submit, submitting, error, done }\n}\n","// ---------------------------------------------------------------------------\n// Date/price formatting + calendar helpers shared by the booking widget and\n// its (host-overridable) subcomponents.\n// ---------------------------------------------------------------------------\n\nimport { useMemo } from 'react'\nimport type { BookingFormatters } from './types'\n\nexport const DAY_NAMES = ['Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado']\nexport const WEEK_ORDER = [1, 2, 3, 4, 5, 6, 0] // Monday-first, like the reference\n\nexport function useFormatters(locale: string, currency: string): BookingFormatters {\n return useMemo(\n () => ({\n price: new Intl.NumberFormat(locale, { style: 'currency', currency }),\n time: new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit' }),\n weekday: new Intl.DateTimeFormat(locale, { weekday: 'short' }),\n dayNum: new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit' }),\n longDay: new Intl.DateTimeFormat(locale, { weekday: 'long', day: '2-digit', month: 'long' }),\n dateShort: new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit', year: 'numeric' }),\n month: new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }),\n }),\n [locale, currency],\n )\n}\n\n/** Local 'YYYY-MM-DD' for a Date. */\nexport function toIso(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\n/** Read a preselected service id from the URL (?service=…), router-agnostic. */\nexport function readServiceParam(): string | null {\n if (typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get('service')\n}\n\nexport interface DayCell {\n iso: string\n date: Date\n isToday: boolean\n}\n\n/** 7 consecutive days starting `weekOffset*7` days from today. */\nexport function buildWeek(weekOffset: number): DayCell[] {\n const base = new Date()\n base.setHours(0, 0, 0, 0)\n const cells: DayCell[] = []\n for (let i = 0; i < 7; i++) {\n const d = new Date(base.getFullYear(), base.getMonth(), base.getDate() + weekOffset * 7 + i)\n cells.push({ iso: toIso(d), date: d, isToday: weekOffset === 0 && i === 0 })\n }\n return cells\n}\n\n/** \"13/07/2026 – 21:30 até 22:00 (30min)\" */\nexport function formatSlotRange(startIso: string, durationMin: number, fmt: BookingFormatters): string {\n const start = new Date(startIso)\n const end = new Date(start.getTime() + durationMin * 60_000)\n return `${fmt.dateShort.format(start)} – ${fmt.time.format(start)} até ${fmt.time.format(end)} (${durationMin}min)`\n}\n","import { Clock } from 'lucide-react'\nimport { DAY_NAMES, WEEK_ORDER } from '../format'\nimport type { BookingComponents, BookingFormatters, PublicBookingLabels, PublicService, ResolvedBookingBrand, WorkingHours } from '../types'\n\ninterface OverviewStepProps {\n services: PublicService[]\n servicesLoading: boolean\n businessHours: WorkingHours\n professionalName: string\n labels: PublicBookingLabels\n brand: ResolvedBookingBrand\n fmt: BookingFormatters\n components: BookingComponents\n onStartBooking: (serviceId?: string) => void\n}\n\n/** Default view: services + opening hours + sidebar CTA (Quaddro-style). */\nexport function OverviewStep({\n services, servicesLoading, businessHours, professionalName, labels, brand, fmt, components: C, onStartBooking,\n}: OverviewStepProps) {\n const openDays = new Set(businessHours.daysOfWeek)\n return (\n <div className=\"grid gap-6 lg:grid-cols-[1fr_18rem]\">\n <div className=\"space-y-6\">\n {/* Serviços */}\n <section className=\"rounded-2xl border border-border bg-card p-6 shadow-sm\">\n <h3 className=\"mb-4 font-heading text-lg font-bold text-foreground\">{labels.servicesHeading}</h3>\n <div className=\"space-y-3\">\n {servicesLoading ? (\n Array.from({ length: 2 }).map((_, i) => (\n <div key={i} className=\"h-24 animate-pulse rounded-2xl bg-muted\" />\n ))\n ) : (\n services.map((s, i) => (\n <C.ServiceCard\n key={s.id}\n service={s}\n featured={i === 0}\n onSelect={() => onStartBooking(s.id)}\n fmt={fmt}\n brand={brand}\n />\n ))\n )}\n </div>\n </section>\n\n {/* Sobre — horário de funcionamento */}\n <section className=\"rounded-2xl border border-border bg-card p-6 shadow-sm\">\n <h3 className=\"font-heading text-lg font-bold text-foreground\">{labels.aboutHeading}</h3>\n <p className=\"mt-3 mb-2 flex items-center gap-1.5 text-sm font-medium text-muted-foreground\">\n <Clock className=\"h-4 w-4\" /> {labels.openingHoursHeading}\n </p>\n <ul className=\"divide-y divide-border border-l-2 border-primary/20 pl-4\">\n {WEEK_ORDER.map((day) => {\n const open = openDays.has(day)\n return (\n <li key={day} className=\"flex items-center justify-between py-2 text-sm\">\n <span className=\"text-foreground\">{DAY_NAMES[day]}</span>\n <span className={open ? 'tabular-nums text-foreground' : 'text-muted-foreground'}>\n {open ? `${businessHours.start} – ${businessHours.end}` : labels.closedLabel}\n </span>\n </li>\n )\n })}\n </ul>\n </section>\n </div>\n\n {/* Sidebar CTA + highlights */}\n <aside className=\"lg:sticky lg:top-24 lg:self-start\">\n <C.SidebarExtras\n professionalName={professionalName}\n brand={brand}\n labels={labels}\n onStartBooking={() => onStartBooking()}\n />\n </aside>\n </div>\n )\n}\n","import { ChevronLeft, ChevronRight, Clock } from 'lucide-react'\nimport type { TimeSlot } from '../../types'\nimport type { DayCell } from '../format'\nimport type { BookingFormatters, PublicBookingLabels, WorkingHours } from '../types'\n\ninterface DateTimeStepProps {\n labels: PublicBookingLabels\n fmt: BookingFormatters\n week: DayCell[]\n weekOffset: number\n maxWeekOffset: number\n onWeekOffset: (updater: (w: number) => number) => void\n businessHours: WorkingHours\n date: string | null\n onSelectDate: (iso: string) => void\n slots: TimeSlot[]\n slotsLoading: boolean\n slotStart: string | null\n onSelectSlot: (startIso: string) => void\n onContinue: () => void\n}\n\n/** Week strip + available-slot grid. */\nexport function DateTimeStep({\n labels, fmt, week, weekOffset, maxWeekOffset, onWeekOffset, businessHours,\n date, onSelectDate, slots, slotsLoading, slotStart, onSelectSlot, onContinue,\n}: DateTimeStepProps) {\n const openDays = new Set(businessHours.daysOfWeek)\n return (\n <div>\n <div className=\"flex flex-wrap items-baseline justify-between gap-2\">\n <h3 className=\"font-heading text-xl font-bold text-foreground\">{labels.dateStep}</h3>\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3.5 w-3.5\" /> {labels.timezoneNote}\n </span>\n </div>\n\n <div className=\"mt-5 flex items-center justify-between\">\n <span className=\"text-sm font-semibold capitalize text-foreground\">{fmt.month.format(week[0].date)}</span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n disabled={weekOffset === 0}\n onClick={() => onWeekOffset((w) => Math.max(0, w - 1))}\n className=\"flex h-9 w-9 items-center justify-center rounded-lg border border-border text-foreground transition-colors hover:bg-accent disabled:opacity-40 disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={labels.prevWeek}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n disabled={weekOffset >= maxWeekOffset}\n onClick={() => onWeekOffset((w) => Math.min(maxWeekOffset, w + 1))}\n className=\"flex h-9 w-9 items-center justify-center rounded-lg border border-border text-foreground transition-colors hover:bg-accent disabled:opacity-40 disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={labels.nextWeek}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"mt-3 grid grid-cols-7 gap-1.5\">\n {week.map((d) => {\n const selected = date === d.iso\n const closed = !openDays.has(d.date.getDay())\n return (\n <button\n key={d.iso}\n type=\"button\"\n disabled={closed}\n onClick={() => onSelectDate(d.iso)}\n className={[\n 'flex flex-col items-center gap-0.5 rounded-xl border py-2.5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n closed\n ? 'cursor-not-allowed border-transparent text-muted-foreground/40'\n : selected\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border text-foreground hover:border-primary/60 hover:bg-accent/40',\n ].join(' ')}\n >\n <span className=\"text-[11px] font-medium capitalize opacity-80\">\n {fmt.weekday.format(d.date).replace('.', '')}\n </span>\n <span className=\"text-sm font-bold tabular-nums\">{fmt.dayNum.format(d.date)}</span>\n </button>\n )\n })}\n </div>\n\n {date ? (\n <div className=\"mt-6\">\n <p className=\"mb-2 text-sm font-semibold text-foreground\">{labels.slotsHeading}</p>\n {slotsLoading ? (\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"h-10 animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n ) : slots.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">\n {labels.noSlots}\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4\">\n {slots.map((s) => {\n const selected = slotStart === s.start\n return (\n <button\n key={s.start}\n type=\"button\"\n onClick={() => onSelectSlot(s.start)}\n className={[\n 'rounded-lg border py-2.5 text-sm font-semibold tabular-nums transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border text-foreground hover:border-primary/60 hover:bg-accent/40',\n ].join(' ')}\n >\n {fmt.time.format(new Date(s.start))}\n </button>\n )\n })}\n </div>\n )}\n </div>\n ) : null}\n\n <button\n type=\"button\"\n disabled={!slotStart}\n onClick={onContinue}\n className=\"mt-6 w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {labels.continueCta}\n </button>\n </div>\n )\n}\n","import { Check, ChevronDown, CreditCard, Loader2, ShieldCheck } from 'lucide-react'\nimport { COUNTRIES, maskPhone, unmaskPhone, type CountryDef } from '@fayz-ai/core'\nimport type { PublicBookingLabels, ResolvedPayment } from '../types'\n\nexport interface ContactDraft {\n name: string\n phone: string\n email: string\n notes: string\n}\n\ninterface ContactStepProps {\n labels: PublicBookingLabels\n contact: ContactDraft\n onContactChange: (contact: ContactDraft) => void\n contactStep: 'phone' | 'code' | 'details'\n country: CountryDef\n onCountryChange: (iso2: string) => void\n code: string\n onCodeChange: (code: string) => void\n codeError: boolean\n onSendCode: () => void\n onConfirmCode: () => void\n onBackToPhone: () => void\n onSubmitDetails: () => void\n payment: ResolvedPayment | null\n submitting: boolean\n error: Error | null\n}\n\n/** Contact step — phone verification first (Quaddro-style), then details. */\nexport function ContactStep({\n labels, contact, onContactChange, contactStep, country, onCountryChange,\n code, onCodeChange, codeError, onSendCode, onConfirmCode, onBackToPhone,\n onSubmitDetails, payment, submitting, error,\n}: ContactStepProps) {\n return (\n <div>\n <h3 className=\"font-heading text-xl font-bold text-foreground\">{labels.contactStep}</h3>\n\n {/* Sub-step: phone */}\n {contactStep === 'phone' ? (\n <form onSubmit={(e) => { e.preventDefault(); onSendCode() }}>\n <p className=\"mt-1 text-sm text-muted-foreground\">{labels.contactIntro}</p>\n <div className=\"mt-5\">\n <label htmlFor=\"bk-phone\" className=\"mb-1 block text-sm font-medium text-foreground\">{labels.phoneLabel}</label>\n <div className=\"flex\">\n <div className=\"relative\">\n <select\n aria-label=\"País\"\n value={country.iso2}\n onChange={(e) => onCountryChange(e.target.value)}\n className=\"h-full appearance-none rounded-l-xl border border-r-0 border-border bg-muted py-3 pl-3 pr-8 text-sm font-medium text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {COUNTRIES.map((c) => (\n <option key={c.iso2} value={c.iso2}>{c.flag} {c.dial}</option>\n ))}\n </select>\n <ChevronDown className=\"pointer-events-none absolute right-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n </div>\n <input\n id=\"bk-phone\" type=\"tel\" autoComplete=\"tel\" inputMode=\"tel\" value={contact.phone}\n onChange={(e) => onContactChange({ ...contact, phone: maskPhone(e.target.value, country.mask) })}\n className=\"w-full rounded-r-xl border border-border bg-background px-4 py-3 text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={`Ex.: ${maskPhone('11987654321', country.mask)}`}\n />\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">{labels.phoneHint}</p>\n </div>\n <button\n type=\"submit\"\n disabled={unmaskPhone(contact.phone).length < 8}\n className=\"mt-5 w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {labels.sendCodeCta}\n </button>\n </form>\n ) : null}\n\n {/* Sub-step: details (after verification) */}\n {contactStep === 'details' ? (\n <form onSubmit={(e) => { e.preventDefault(); onSubmitDetails() }}>\n <p className=\"mt-1 text-sm text-muted-foreground\">{labels.contactIntro}</p>\n <div className=\"mt-4 flex items-center justify-between rounded-xl border border-border bg-muted/40 px-4 py-3\">\n <span className=\"flex items-center gap-2 text-sm text-foreground\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" /> {labels.phoneVerified} · {country.flag} {country.dial} {contact.phone}\n </span>\n <button\n type=\"button\"\n onClick={onBackToPhone}\n className=\"rounded text-sm font-medium text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {labels.changePhone}\n </button>\n </div>\n <div className=\"mt-4 space-y-3\">\n <div>\n <label htmlFor=\"bk-name\" className=\"mb-1 block text-sm font-medium text-foreground\">{labels.nameLabel}</label>\n <input\n id=\"bk-name\" type=\"text\" autoComplete=\"name\" value={contact.name}\n onChange={(e) => onContactChange({ ...contact, name: e.target.value })}\n className=\"w-full rounded-xl border border-border bg-background px-4 py-3 text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={labels.namePlaceholder}\n />\n </div>\n <div>\n <label htmlFor=\"bk-email\" className=\"mb-1 block text-sm font-medium text-foreground\">{labels.emailLabel}</label>\n <input\n id=\"bk-email\" type=\"email\" autoComplete=\"email\" inputMode=\"email\" value={contact.email}\n onChange={(e) => onContactChange({ ...contact, email: e.target.value })}\n className=\"w-full rounded-xl border border-border bg-background px-4 py-3 text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={labels.emailPlaceholder}\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.emailHint}</p>\n </div>\n <div>\n <label htmlFor=\"bk-notes\" className=\"mb-1 block text-sm font-medium text-foreground\">{labels.notesLabel}</label>\n <textarea\n id=\"bk-notes\" rows={3} value={contact.notes}\n onChange={(e) => onContactChange({ ...contact, notes: e.target.value })}\n className=\"w-full resize-none rounded-xl border border-border bg-background px-4 py-3 text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={labels.notesPlaceholder}\n />\n </div>\n </div>\n {error ? (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">{labels.submitError}</p>\n ) : null}\n <button\n type=\"submit\"\n disabled={!contact.name.trim() || submitting}\n className=\"mt-5 flex w-full items-center justify-center gap-2 rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {submitting ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Check className=\"h-4 w-4\" />}\n {payment ? labels.saveAndContinueCta : labels.confirmCta}\n </button>\n {!payment ? (\n <p className=\"mt-3 flex items-center justify-center gap-1.5 text-xs text-muted-foreground\">\n <CreditCard className=\"h-3.5 w-3.5\" /> {labels.noChargeNote}\n </p>\n ) : null}\n </form>\n ) : null}\n\n {/* Code verification modal */}\n {contactStep === 'code' ? (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-foreground/40 p-4\" role=\"dialog\" aria-modal=\"true\" aria-label={labels.codeTitle}>\n <div className=\"w-full max-w-md rounded-2xl border border-border bg-card p-6 shadow-xl\">\n <h4 className=\"font-heading text-lg font-bold text-foreground\">{labels.codeTitle}</h4>\n <p className=\"mt-1 text-sm text-muted-foreground\">{labels.codeBody}</p>\n <form onSubmit={(e) => { e.preventDefault(); onConfirmCode() }}>\n <input\n type=\"text\" inputMode=\"numeric\" value={code} autoFocus\n onChange={(e) => onCodeChange(e.target.value)}\n className=\"mt-4 w-full rounded-xl border border-border bg-background px-4 py-3 text-center text-lg tracking-[0.4em] text-foreground outline-none transition-colors focus:border-primary focus-visible:ring-2 focus-visible:ring-ring placeholder:text-sm placeholder:tracking-normal\"\n placeholder=\"Digite o código\"\n />\n {codeError ? (\n <p role=\"alert\" className=\"mt-2 text-sm text-destructive\">{labels.codeInvalid}</p>\n ) : null}\n <button\n type=\"submit\"\n className=\"mt-4 w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {labels.codeConfirmCta}\n </button>\n </form>\n <div className=\"mt-3 flex items-center justify-between text-xs text-muted-foreground\">\n <span>{labels.codeResendHint}</span>\n <button type=\"button\" onClick={onBackToPhone} className=\"font-medium text-primary hover:underline\">\n {labels.back}\n </button>\n </div>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n","import { CalendarCheck, Check, Copy, CreditCard, Loader2, Plus, QrCode, ShieldCheck } from 'lucide-react'\nimport type { PixCharge } from '@fayz-ai/core'\nimport type { BookingFormatters, PublicService, ResolvedPayment } from '../types'\n\n// Static, realistic-looking Pix payload for the POC copia-e-cola fallback\n// (used only when no payment provider is injected).\nconst PIX_PAYLOAD =\n '00020126840014br.gov.bcb.pix2562qrcode.fayz.ai/pix/v2/9d8f7a6b-agendamento5204000053039865802BR5904FAYZ6009SAO PAULO62070503***6304AB12'\n\n/** Deterministic QR-looking placeholder rendered from a payload (POC visual). */\nfunction QrPlaceholder({ data }: { data: string }) {\n const size = 25\n // Seed the data-cell pattern from the payload so different charges look different.\n let seed = 0\n for (let i = 0; i < data.length; i++) seed = (seed * 31 + data.charCodeAt(i)) % 100000\n const cells: { x: number; y: number }[] = []\n const isFinder = (x: number, y: number) => {\n const inBox = (bx: number, by: number) => x >= bx && x < bx + 7 && y >= by && y < by + 7\n return inBox(0, 0) || inBox(size - 7, 0) || inBox(0, size - 7)\n }\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n if (isFinder(x, y)) {\n const corner = x < 7 && y < 7 ? { bx: 0, by: 0 } : x >= size - 7 && y < 7 ? { bx: size - 7, by: 0 } : { bx: 0, by: size - 7 }\n const lx = x - corner.bx\n const ly = y - corner.by\n const outer = lx === 0 || lx === 6 || ly === 0 || ly === 6\n const inner = lx >= 2 && lx <= 4 && ly >= 2 && ly <= 4\n if (outer || inner) cells.push({ x, y })\n } else if ((x * 31 + y * 17 + x * y + seed) % 3 === 0) {\n cells.push({ x, y })\n }\n }\n }\n return (\n <svg viewBox={`0 0 ${size} ${size}`} className=\"h-40 w-40\" role=\"img\" aria-label=\"QR Code Pix (demonstração)\">\n <rect width={size} height={size} fill=\"white\" />\n {cells.map((c, i) => (\n <rect key={i} x={c.x} y={c.y} width={1} height={1} fill=\"currentColor\" className=\"text-foreground\" />\n ))}\n </svg>\n )\n}\n\ninterface PaymentStepProps {\n service: PublicService\n payment: ResolvedPayment\n paymentStep: 'choose' | 'pix'\n charge: PixCharge | null\n busy: boolean\n error: Error | null\n copied: boolean\n fmt: BookingFormatters\n onPayWithPix: (fee: number) => void\n onCopy: () => void\n onSimulatePaid: () => void\n}\n\n/** Payment step: order summary + Pix method → QR/copia-e-cola while polling. */\nexport function PaymentStep({\n service, payment, paymentStep, charge, busy, error, copied, fmt, onPayWithPix, onCopy, onSimulatePaid,\n}: PaymentStepProps) {\n const feePct = payment.reservationFeePercent\n const fee = Math.round(service.price * feePct) / 100\n const remaining = Math.round((service.price - fee) * 100) / 100\n\n if (paymentStep === 'choose') {\n return (\n <div>\n {/* Order summary */}\n <div className=\"rounded-2xl border border-border p-4\">\n <div className=\"flex items-center justify-between font-semibold text-foreground\">\n <span>{service.name}</span>\n <span className=\"tabular-nums\">{fmt.price.format(service.price)}</span>\n </div>\n <div className=\"mt-3 space-y-2 text-sm\">\n <div className=\"flex items-center justify-between text-foreground\">\n <span className=\"flex items-center gap-2\">\n <span className=\"flex h-4 w-4 items-center justify-center rounded bg-primary text-primary-foreground\"><Check className=\"h-3 w-3\" /></span>\n Taxa de reserva <span className=\"rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\">{feePct}%</span>\n </span>\n <span className=\"tabular-nums\">{fmt.price.format(fee)}</span>\n </div>\n <div className=\"flex items-center justify-between text-muted-foreground\">\n <span className=\"flex items-center gap-2\">\n <span className=\"h-4 w-4 rounded border border-border\" /> Valor restante\n </span>\n <span className=\"tabular-nums\">{remaining <= 0 ? 'Grátis' : fmt.price.format(remaining)}</span>\n </div>\n <button type=\"button\" className=\"flex items-center gap-1 text-sm font-medium text-primary hover:underline\">\n <Plus className=\"h-3.5 w-3.5\" /> Adicionar cupom\n </button>\n </div>\n <div className=\"mt-3 flex items-center justify-between border-t border-dashed border-border pt-3 font-semibold text-foreground\">\n <span>Valor total</span>\n <span className=\"tabular-nums\">{fmt.price.format(service.price)}</span>\n </div>\n </div>\n\n {/* Method */}\n <div className=\"mt-6 flex items-center justify-between\">\n <h3 className=\"font-heading text-lg font-bold text-foreground\">Escolha como pagar</h3>\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\"><ShieldCheck className=\"h-3.5 w-3.5 text-primary\" /> Pagamento seguro</span>\n </div>\n <div className=\"mt-3 rounded-2xl border-2 border-primary bg-accent/20 p-4\">\n <p className=\"flex items-center gap-2 font-semibold text-foreground\">\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-primary text-primary-foreground\"><Check className=\"h-3.5 w-3.5\" /></span>\n Pix\n </p>\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-3\">\n {[\n { icon: Check, t: 'Finalize o agendamento clicando em \"Pagar com Pix\".' },\n { icon: QrCode, t: 'Mostraremos um QR Code e o Pix copia-e-cola.' },\n { icon: CalendarCheck, t: 'Após o pagamento, seu agendamento é reservado.' },\n ].map((s, i) => (\n <div key={i} className=\"text-sm text-muted-foreground\">\n <span className=\"mb-2 flex h-8 w-8 items-center justify-center rounded-lg bg-accent text-primary\"><s.icon className=\"h-4 w-4\" /></span>\n <span className=\"font-semibold text-foreground\">{i + 1}.</span> {s.t}\n </div>\n ))}\n </div>\n </div>\n\n {error ? <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">Não foi possível iniciar o pagamento. Tente novamente.</p> : null}\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onPayWithPix(fee)}\n className=\"mt-6 flex w-full items-center justify-center gap-2 rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <CreditCard className=\"h-4 w-4\" />}\n Pagar {fmt.price.format(fee)} com Pix\n </button>\n </div>\n )\n }\n\n // Pix QR — aguardando pagamento\n return (\n <div>\n <div className=\"rounded-xl border border-amber-300/60 bg-amber-50 p-4 dark:border-amber-400/30 dark:bg-amber-950/30\">\n <p className=\"flex items-center gap-2 text-sm font-semibold text-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" /> Realize o pagamento para finalizar\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Este código Pix é válido por somente 5 minutos. Não feche esta página até receber a confirmação do pagamento.\n </p>\n </div>\n <h3 className=\"mt-6 font-heading text-lg font-bold text-foreground\">Escaneie ou copie este código para pagar</h3>\n <ol className=\"mt-2 space-y-1 text-sm text-muted-foreground\">\n <li>1. Acesse o app do seu banco, pagamentos ou Internet Banking.</li>\n <li>2. Escolha pagar via Pix.</li>\n <li>3. Escaneie o QR Code ou use o Pix copia-e-cola:</li>\n </ol>\n <div className=\"mt-4 w-fit rounded-xl border border-border bg-white p-3\">\n <QrPlaceholder data={charge?.pixQrCode ?? PIX_PAYLOAD} />\n </div>\n <div className=\"mt-4 flex max-w-md items-center gap-2\">\n <code className=\"flex-1 truncate rounded-lg border border-border bg-muted px-3 py-2 text-xs text-muted-foreground\">{charge?.pixCopyPaste ?? PIX_PAYLOAD}</code>\n <button\n type=\"button\"\n onClick={onCopy}\n className=\"inline-flex shrink-0 items-center gap-1.5 rounded-lg bg-foreground px-3 py-2 text-xs font-medium text-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {copied ? <Check className=\"h-3.5 w-3.5\" /> : <Copy className=\"h-3.5 w-3.5\" />} {copied ? 'Copiado' : 'Copiar'}\n </button>\n </div>\n {/* POC shortcut — the mock provider also auto-confirms via polling after a few seconds. */}\n <button\n type=\"button\"\n onClick={onSimulatePaid}\n className=\"mt-6 w-full rounded-xl border border-primary py-3 font-semibold text-primary transition-colors hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Já paguei — confirmar (simulação)\n </button>\n </div>\n )\n}\n\nexport { PIX_PAYLOAD }\n","import { CreditCard } from 'lucide-react'\nimport { formatSlotRange } from '../format'\nimport type {\n BookingComponents,\n BookingFormatters,\n PublicBookingLabels,\n PublicService,\n ResolvedPayment,\n StepState,\n} from '../types'\n\nexport interface RailState {\n service: StepState\n professional: StepState\n datetime: StepState\n contact: StepState\n payment: StepState\n}\n\ninterface SummaryRailProps {\n title: string\n railState: RailState\n service: PublicService | null\n professionalName: string\n slotStart: string | null\n /** Display string for the verified contact (\"Nome · +55 (11) …\"), or null. */\n contactSummary: string | null\n payment: ResolvedPayment | null\n paymentReached: boolean\n labels: PublicBookingLabels\n fmt: BookingFormatters\n components: BookingComponents\n serviceMeta: string | null\n}\n\n/** Right-hand progress + summary rail (internal; rows via components.StepRailItem). */\nexport function SummaryRail({\n title, railState, service, professionalName, slotStart, contactSummary,\n payment, paymentReached, labels, fmt, components: C, serviceMeta,\n}: SummaryRailProps) {\n return (\n <div className=\"sticky top-24 rounded-2xl border border-border bg-card p-5 shadow-sm\">\n <p className=\"mb-5 font-heading text-sm font-bold uppercase tracking-wide text-muted-foreground\">{title}</p>\n <ol className=\"space-y-6\">\n <C.StepRailItem n={1} label={labels.railService} state={railState.service}>\n {service ? (\n <div className=\"rounded-xl border border-border bg-background p-3\">\n <p className=\"truncate text-sm font-semibold text-foreground\">{service.name}</p>\n <p className=\"mt-0.5 flex items-center justify-between text-xs text-muted-foreground\">\n <span>{serviceMeta ? `${serviceMeta} · ` : ''}{service.durationMinutes} min</span>\n <span className=\"font-semibold tabular-nums text-primary\">{fmt.price.format(service.price)}</span>\n </p>\n </div>\n ) : null}\n </C.StepRailItem>\n\n <C.StepRailItem n={2} label={labels.railProfessional} state={railState.professional}>\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-primary text-xs font-semibold text-primary-foreground\">\n {professionalName.charAt(0)}\n </span>\n <span className=\"text-sm text-foreground\">{professionalName}</span>\n </div>\n </C.StepRailItem>\n\n <C.StepRailItem n={3} label={labels.railDatetime} state={railState.datetime}>\n {slotStart && service ? (\n <p className=\"text-sm tabular-nums text-foreground\">\n {formatSlotRange(slotStart, service.durationMinutes, fmt)}\n </p>\n ) : null}\n </C.StepRailItem>\n\n <C.StepRailItem n={4} label={labels.railContact} state={railState.contact}>\n {contactSummary ? <p className=\"text-sm text-foreground\">{contactSummary}</p> : null}\n </C.StepRailItem>\n\n {payment ? (\n <C.StepRailItem n={5} label={labels.railPayment} state={railState.payment}>\n {paymentReached ? (\n <p className=\"flex items-center gap-1.5 text-sm text-foreground\">\n <CreditCard className=\"h-3.5 w-3.5 text-primary\" /> Pix à vista\n </p>\n ) : null}\n </C.StepRailItem>\n ) : null}\n </ol>\n </div>\n )\n}\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport { ChevronLeft } from 'lucide-react'\nimport { DEFAULT_COUNTRY, getCountry, maskPhone, unmaskPhone } from '@fayz-ai/core'\nimport type { PixCharge } from '@fayz-ai/core'\nimport { useBooking } from './context'\nimport { useAvailableSlots, useCreateBooking } from './hooks'\nimport { buildWeek, toIso, readServiceParam, useFormatters } from './format'\nimport type { StepState } from './types'\nimport { OverviewStep } from './steps/OverviewStep'\nimport { DateTimeStep } from './steps/DateTimeStep'\nimport { ContactStep, type ContactDraft } from './steps/ContactStep'\nimport { PaymentStep, PIX_PAYLOAD } from './steps/PaymentStep'\nimport { SummaryRail, type RailState } from './components/SummaryRail'\n\ntype Step = 'overview' | 'datetime' | 'contact' | 'payment' | 'success'\n\n/**\n * Customer-facing booking surface. Default view is an overview (services +\n * opening hours + CTA) like Quaddro; picking a service — or landing with\n * ?service=… — enters a stepped flow (date → time → contact → [payment])\n * with a live progress + summary rail. Token-only, keyboard-accessible, 44px\n * targets. Brand-visible parts render via the host-overridable\n * `components`/`brand` seams; data flows through PublicBookingDataProvider\n * (mock seed or Supabase RPCs — same calls).\n */\nexport function BookingWidget() {\n const {\n services, servicesLoading, professionalName, businessHours, payment, paymentProvider,\n onIdentityVerified, labels, brand, components: C, window: bookingWindow, locale, currency,\n } = useBooking()\n const fmt = useFormatters(locale, currency)\n\n const preselected = useMemo(() => {\n const q = readServiceParam()\n if (q && services.some((s) => s.id === q)) return q\n return null\n }, [services])\n const todayIso = useMemo(() => toIso(new Date()), [])\n\n const [step, setStep] = useState<Step>(preselected ? 'datetime' : 'overview')\n const [serviceId, setServiceId] = useState<string | null>(preselected)\n const [weekOffset, setWeekOffset] = useState(0)\n const [date, setDate] = useState<string | null>(todayIso)\n const [slotStart, setSlotStart] = useState<string | null>(null)\n const [contact, setContact] = useState<ContactDraft>({ name: '', phone: '', email: '', notes: '' })\n // Contact step is phone-verification-first (like Quaddro): phone → code → details.\n const [contactStep, setContactStep] = useState<'phone' | 'code' | 'details'>('phone')\n const [code, setCode] = useState('')\n const [codeError, setCodeError] = useState(false)\n // Payment sub-flow: choose method → Pix QR (\"aguardando pagamento\").\n const [paymentStep, setPaymentStep] = useState<'choose' | 'pix'>('choose')\n const [copied, setCopied] = useState(false)\n const [countryIso, setCountryIso] = useState(DEFAULT_COUNTRY)\n const country = getCountry(countryIso)\n // Pix charge from the injected payment provider (null → self-mocked fallback).\n const [charge, setCharge] = useState<PixCharge | null>(null)\n const [charging, setCharging] = useState(false)\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n // ?service=… deep link: enter the flow once the (possibly async) catalog resolves.\n useEffect(() => {\n if (preselected && step === 'overview') {\n setServiceId(preselected)\n setStep('datetime')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [preselected])\n\n // Poll the charge status while on the Pix screen; settle → success.\n useEffect(() => {\n if (!(step === 'payment' && paymentStep === 'pix' && charge && paymentProvider)) return\n let active = true\n const clear = () => { if (pollRef.current) { clearInterval(pollRef.current); pollRef.current = null } }\n const tick = () => {\n paymentProvider.getChargeStatus(charge.chargeId).then((s) => {\n if (!active) return\n if (s === 'paid') { clear(); setStep('success') }\n else if (s === 'expired' || s === 'failed') clear()\n }).catch(() => { /* keep polling on transient errors */ })\n }\n tick()\n pollRef.current = setInterval(tick, 2500)\n return () => { active = false; clear() }\n }, [step, paymentStep, charge, paymentProvider])\n\n const week = useMemo(() => buildWeek(weekOffset), [weekOffset])\n const { slots, loading: slotsLoading } = useAvailableSlots({ serviceId, date })\n const { submit, submitting, error } = useCreateBooking()\n\n const minTime = Date.now() + bookingWindow.minAdvanceHours * 3600_000\n const bookableSlots = slots.filter((s) => new Date(s.start).getTime() >= minTime)\n const service = services.find((s) => s.id === serviceId) ?? null\n const maxWeekOffset = Math.floor(bookingWindow.maxAdvanceDays / 7)\n\n /** Contact with the full international phone, as real backends expect. */\n function contactForSubmit(): ContactDraft {\n return { ...contact, phone: `${country.dial} ${contact.phone}` }\n }\n\n function startBooking(id?: string) {\n setServiceId(id ?? serviceId ?? services[0]?.id ?? null)\n setDate(todayIso)\n setSlotStart(null)\n setStep('datetime')\n }\n\n async function handleConfirm() {\n if (!serviceId || !slotStart || !contact.name.trim()) return\n try {\n await submit({ serviceId, startsAt: slotStart, contact: contactForSubmit() })\n setStep('success')\n } catch {\n /* error surfaced inline */\n }\n }\n\n function emitIdentity() {\n onIdentityVerified?.({\n name: contact.name,\n phone: `${country.dial} ${contact.phone}`,\n email: contact.email || undefined,\n })\n }\n\n // Contact sub-step submit handlers (also used by Enter via <form onSubmit>).\n function sendCode() {\n if (unmaskPhone(contact.phone).length < 8) return\n setCode(''); setCodeError(false); setContactStep('code')\n }\n function confirmCode() {\n if (code.trim() === '0000') {\n setCodeError(false)\n emitIdentity() // phone verified → host signs the user in\n setContactStep('details')\n } else {\n setCodeError(true)\n }\n }\n function submitDetails() {\n if (!contact.name.trim() || submitting) return\n emitIdentity() // re-fire with the full name to enrich the account\n if (payment) { setPaymentStep('choose'); setStep('payment') } else void handleConfirm()\n }\n async function payWithPix(fee: number) {\n if (charging || !service || !slotStart) return\n setCharging(true)\n try {\n await submit({ serviceId: service.id, startsAt: slotStart, contact: contactForSubmit() })\n if (paymentProvider) {\n const c = await paymentProvider.createCharge({\n amount: fee, currency, method: 'pix', description: service.name,\n customer: { name: contact.name, email: contact.email || undefined, phone: contact.phone || undefined },\n })\n setCharge(c)\n }\n setPaymentStep('pix')\n } catch {\n /* error surfaced inline */\n } finally {\n setCharging(false)\n }\n }\n function copyPixPayload() {\n const payload = charge?.pixCopyPaste ?? PIX_PAYLOAD\n try { void navigator.clipboard?.writeText(payload); setCopied(true) } catch { setCopied(true) }\n }\n\n // ---- OVERVIEW (default view, no service chosen) ----\n if (step === 'overview') {\n return (\n <div className=\"mx-auto max-w-4xl\">\n <C.BrandHeader brand={brand} />\n <OverviewStep\n services={services}\n servicesLoading={servicesLoading}\n businessHours={businessHours}\n professionalName={professionalName}\n labels={labels}\n brand={brand}\n fmt={fmt}\n components={C}\n onStartBooking={startBooking}\n />\n </div>\n )\n }\n\n // ---- WIZARD (datetime → contact → [payment] → success) ----\n const railState: RailState = {\n service: 'done',\n professional: 'done',\n datetime: (slotStart ? 'done' : step === 'datetime' ? 'active' : 'todo') as StepState,\n contact: (step === 'payment' || step === 'success' ? 'done' : step === 'contact' ? 'active' : 'todo') as StepState,\n payment: (step === 'success' ? 'done' : step === 'payment' ? 'active' : 'todo') as StepState,\n }\n const railTitle = step === 'payment' && paymentStep === 'pix' ? labels.railWaitingPayment : labels.railTitle\n const contactSummary =\n (contact.name || contact.phone) && (step === 'payment' || step === 'success' || contactStep === 'details')\n ? `${contact.name || 'Contato'}${contact.phone ? ` · ${country.dial} ${contact.phone}` : ''}`\n : null\n\n return (\n <div className=\"mx-auto max-w-4xl\">\n <C.BrandHeader brand={brand} />\n <div className=\"grid gap-6 lg:grid-cols-[1fr_18rem]\">\n {/* LEFT — step panel */}\n <div className=\"rounded-2xl border border-border bg-card p-6 md:p-7 shadow-sm\">\n <div className=\"mb-5 flex items-center gap-1.5 lg:hidden\">\n {(['datetime', 'contact'] as const).map((s) => (\n <span key={s} className={`h-1.5 flex-1 rounded-full ${railState[s] !== 'todo' ? 'bg-primary' : 'bg-muted'}`} />\n ))}\n </div>\n\n {step !== 'success' ? (\n <button\n type=\"button\"\n onClick={() => setStep(step === 'payment' ? 'contact' : step === 'contact' ? 'datetime' : 'overview')}\n className=\"mb-4 inline-flex items-center gap-1 rounded text-sm font-medium text-muted-foreground hover:text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronLeft className=\"h-4 w-4\" /> {step === 'datetime' ? labels.backToServices : labels.back}\n </button>\n ) : null}\n\n {step === 'datetime' ? (\n <DateTimeStep\n labels={labels}\n fmt={fmt}\n week={week}\n weekOffset={weekOffset}\n maxWeekOffset={maxWeekOffset}\n onWeekOffset={setWeekOffset}\n businessHours={businessHours}\n date={date}\n onSelectDate={(iso) => { setDate(iso); setSlotStart(null) }}\n slots={bookableSlots}\n slotsLoading={slotsLoading}\n slotStart={slotStart}\n onSelectSlot={setSlotStart}\n onContinue={() => setStep('contact')}\n />\n ) : null}\n\n {step === 'contact' ? (\n <ContactStep\n labels={labels}\n contact={contact}\n onContactChange={setContact}\n contactStep={contactStep}\n country={country}\n onCountryChange={(iso2) => {\n const c = getCountry(iso2)\n setCountryIso(c.iso2)\n setContact((prev) => ({ ...prev, phone: maskPhone(unmaskPhone(prev.phone), c.mask) }))\n }}\n code={code}\n onCodeChange={(v) => { setCode(v); setCodeError(false) }}\n codeError={codeError}\n onSendCode={sendCode}\n onConfirmCode={confirmCode}\n onBackToPhone={() => setContactStep('phone')}\n onSubmitDetails={submitDetails}\n payment={payment}\n submitting={submitting}\n error={error}\n />\n ) : null}\n\n {step === 'payment' && service && payment ? (\n <PaymentStep\n service={service}\n payment={payment}\n paymentStep={paymentStep}\n charge={charge}\n busy={submitting || charging}\n error={error}\n copied={copied}\n fmt={fmt}\n onPayWithPix={(fee) => void payWithPix(fee)}\n onCopy={copyPixPayload}\n onSimulatePaid={() => setStep('success')}\n />\n ) : null}\n\n {step === 'success' ? (\n <C.SuccessPanel\n service={service}\n slotStart={slotStart}\n professionalName={professionalName}\n labels={labels}\n fmt={fmt}\n />\n ) : null}\n </div>\n\n {/* RIGHT — progress + summary rail */}\n <aside className=\"hidden lg:block\">\n <SummaryRail\n title={railTitle}\n railState={railState}\n service={service}\n professionalName={professionalName}\n slotStart={slotStart}\n contactSummary={contactSummary}\n payment={payment}\n paymentReached={step === 'payment' || step === 'success'}\n labels={labels}\n fmt={fmt}\n components={C}\n serviceMeta={brand.serviceMeta}\n />\n </aside>\n </div>\n </div>\n )\n}\n","import { ShieldCheck } from 'lucide-react'\nimport type { BrandHeaderProps } from '../types'\n\n/** Default brand header shown above every booking view. Override via\n * `components.BrandHeader` when the structure must change; text/logo-only\n * changes need just the `brand` option. */\nexport function DefaultBrandHeader({ brand }: BrandHeaderProps) {\n return (\n <div className=\"mb-5 flex items-center gap-3 rounded-2xl border border-border bg-card px-5 py-4 shadow-sm\">\n {brand.logoUrl ? (\n <img src={brand.logoUrl} alt={brand.name} className=\"h-11 w-11 rounded-xl object-cover\" />\n ) : (\n <span className=\"flex h-11 w-11 items-center justify-center rounded-xl bg-primary text-lg font-bold text-primary-foreground\">\n {brand.initials}\n </span>\n )}\n <div>\n <p className=\"font-heading text-base font-bold text-foreground\">{brand.name}</p>\n {brand.tagline ? (\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <ShieldCheck className=\"h-3.5 w-3.5 text-primary\" /> {brand.tagline}\n </p>\n ) : null}\n </div>\n </div>\n )\n}\n","import { ChevronRight, Clock } from 'lucide-react'\nimport type { ServiceCardProps } from '../types'\n\n/** Default service row (overview list). Icon/badge/meta come from `brand`;\n * swap the whole card via `components.ServiceCard`. */\nexport function DefaultServiceCard({ service, featured, onSelect, fmt, brand }: ServiceCardProps) {\n const Icon = brand.serviceIcon\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className=\"group flex w-full items-center gap-4 rounded-2xl border border-border p-4 text-left transition-colors hover:border-primary hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-accent text-primary\">\n <Icon className=\"h-5 w-5\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-foreground\">{service.name}</span>\n {featured && brand.featuredBadge ? (\n <span className=\"rounded-full bg-accent px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-primary\">\n {brand.featuredBadge}\n </span>\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" /> {service.durationMinutes} min{brand.serviceMeta ? ` · ${brand.serviceMeta}` : ''}\n </span>\n {service.description ? (\n <span className=\"mt-1 block text-sm text-muted-foreground\">{service.description}</span>\n ) : null}\n </span>\n <span className=\"shrink-0 text-right\">\n <span className=\"block font-semibold tabular-nums text-primary\">{fmt.price.format(service.price)}</span>\n <ChevronRight className=\"ml-auto mt-1 h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-0.5\" />\n </span>\n </button>\n )\n}\n","import { User } from 'lucide-react'\nimport type { SidebarExtrasProps } from '../types'\n\n/** Default overview sidebar: primary CTA + brand highlights + professional. */\nexport function DefaultSidebarExtras({ professionalName, brand, onStartBooking, labels }: SidebarExtrasProps) {\n return (\n <div className=\"rounded-2xl border border-border bg-card p-5 shadow-sm\">\n <button\n type=\"button\"\n onClick={onStartBooking}\n className=\"w-full rounded-xl bg-primary py-3 font-semibold text-primary-foreground transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {labels.bookNowCta}\n </button>\n <div className=\"mt-5 space-y-2 border-t border-border pt-4 text-xs text-muted-foreground\">\n {brand.highlights.map((h, i) => {\n const Icon = h.icon ?? User\n return (\n <p key={i} className=\"flex items-center gap-2\">\n <Icon className=\"h-3.5 w-3.5 text-primary\" /> {h.text}\n </p>\n )\n })}\n <p className=\"flex items-center gap-2\">\n <User className=\"h-3.5 w-3.5 text-primary\" /> {professionalName}\n </p>\n </div>\n </div>\n )\n}\n","import { Check } from 'lucide-react'\nimport type { StepRailItemProps } from '../types'\n\n/** One row in the wizard's right-hand progress rail. */\nexport function DefaultStepRailItem({ n, label, state, children }: StepRailItemProps) {\n return (\n <li className=\"relative pl-11\">\n <span aria-hidden className=\"absolute left-[15px] top-8 bottom-[-18px] w-px bg-border last:hidden\" />\n <span\n className={[\n 'absolute left-0 top-0 flex h-8 w-8 items-center justify-center rounded-full text-sm font-semibold transition-colors',\n state === 'done'\n ? 'bg-primary text-primary-foreground'\n : state === 'active'\n ? 'bg-accent text-primary ring-2 ring-primary'\n : 'bg-muted text-muted-foreground',\n ].join(' ')}\n >\n {state === 'done' ? <Check className=\"h-4 w-4\" /> : n}\n </span>\n <p className={`pt-1 text-sm font-semibold ${state === 'todo' ? 'text-muted-foreground' : 'text-foreground'}`}>\n {label}\n </p>\n {children ? <div className=\"mt-2\">{children}</div> : null}\n </li>\n )\n}\n","import { Calendar, Check, User } from 'lucide-react'\nimport { formatSlotRange } from '../format'\nimport type { SuccessPanelProps } from '../types'\n\n/** Default confirmation panel (final step). */\nexport function DefaultSuccessPanel({ service, slotStart, professionalName, labels, fmt }: SuccessPanelProps) {\n return (\n <div className=\"py-8 text-center\">\n <div className=\"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-accent text-primary\">\n <Check className=\"h-8 w-8\" />\n </div>\n <h3 className=\"font-heading text-2xl font-bold text-foreground\">{labels.successTitle}</h3>\n <p className=\"mx-auto mt-2 max-w-sm text-muted-foreground\">{labels.successBody}</p>\n {service && slotStart ? (\n <div className=\"mx-auto mt-6 max-w-sm rounded-2xl border border-border bg-muted/50 p-4 text-left\">\n <p className=\"font-semibold text-foreground\">{service.name}</p>\n <p className=\"mt-1 flex items-center gap-1.5 text-sm tabular-nums text-muted-foreground\">\n <Calendar className=\"h-4 w-4 text-primary\" /> {formatSlotRange(slotStart, service.durationMinutes, fmt)}\n </p>\n <p className=\"mt-1 flex items-center gap-1.5 text-sm text-muted-foreground\">\n <User className=\"h-4 w-4 text-primary\" /> {professionalName}\n </p>\n </div>\n ) : null}\n </div>\n )\n}\n","import type { BookingComponents } from '../types'\nimport { DefaultBrandHeader } from './BrandHeader'\nimport { DefaultServiceCard } from './ServiceCard'\nimport { DefaultSidebarExtras } from './SidebarExtras'\nimport { DefaultStepRailItem } from './StepRailItem'\nimport { DefaultSuccessPanel } from './SuccessPanel'\n\nexport const DEFAULT_BOOKING_COMPONENTS: BookingComponents = {\n BrandHeader: DefaultBrandHeader,\n ServiceCard: DefaultServiceCard,\n SidebarExtras: DefaultSidebarExtras,\n StepRailItem: DefaultStepRailItem,\n SuccessPanel: DefaultSuccessPanel,\n}\n","import { createElement, type FC, type ReactNode } from 'react'\nimport { CalendarCheck, ShieldCheck, Video } from 'lucide-react'\nimport type { PluginManifest, PluginScope, VerticalId, PaymentProvider } from '@fayz-ai/core'\nimport { createSafeDataProvider } from '@fayz-ai/core'\nimport type { Professional, Schedule } from '../types'\nimport type { MockAgendaSeed } from '../data/mock'\nimport { createMockPublicBookingProvider, type PublicBookingDataProvider } from './data'\nimport { createSupabasePublicBookingProvider } from './data.supabase'\nimport { BookingProvider, type PublicBookingContextValue, type OnIdentityVerified } from './context'\nimport { BookingWidget } from './BookingWidget'\nimport { DEFAULT_BOOKING_COMPONENTS } from './components/defaults'\nimport type {\n BookingBrand,\n BookingComponents,\n BookingWindow,\n PaymentConfig,\n PublicBookingLabels,\n PublicService,\n ResolvedBookingBrand,\n ResolvedPayment,\n WorkingHours,\n} from './types'\n\nexport interface PublicBookingOptions {\n /** Mount path for the public booking route. Default '/agendar'. */\n basePath?: string\n /**\n * Tenant this public page books against. REQUIRED when a Supabase client is\n * configured (setGlobalSupabaseClient) — it scopes services/slots/bookings.\n */\n tenantId?: string\n /**\n * The single professional/resource bookings target. With Supabase this must\n * be the staff person UUID; omit → any active professional (RPC unions\n * schedules across staff).\n */\n professional?: { id?: string; name?: string }\n /**\n * Bookable services. Optional: when omitted, the widget fetches the catalog\n * from the provider (Supabase v_public_services). Static wins when provided.\n */\n services?: PublicService[]\n /** Working hours used to seed mock availability + the overview \"Sobre\" card. */\n workingHours?: WorkingHours\n /** Booking-window bounds for the date/slot picker. */\n window?: Partial<BookingWindow>\n /** Every user-visible string (all defaulted, pt-BR). */\n labels?: Partial<PublicBookingLabels>\n /** Brand personalization: name/logo/tagline/icons/badges/highlights. */\n brand?: BookingBrand\n /** Swap whole subcomponents when structure must change (defaults exported). */\n components?: Partial<BookingComponents>\n /** Adds a final Pagamento (Pix) step. Omit/disable to end the flow at confirmation. */\n payment?: PaymentConfig\n /** Charge provider (from a payments plugin) used by the Pagamento step. Optional. */\n paymentProvider?: PaymentProvider\n /** Host bridge: fired when the customer's phone is verified / details submitted. */\n onIdentityVerified?: OnIdentityVerified\n currency?: string\n locale?: string\n /** Inject a custom provider (overrides the mock/Supabase safe resolver). */\n dataProvider?: PublicBookingDataProvider\n /** Override the full mock seed (advanced). */\n seed?: MockAgendaSeed\n scope?: PluginScope\n verticalId?: VerticalId\n}\n\nexport interface PublicBookingPlugin {\n manifest: PluginManifest\n Provider: FC<{ children: ReactNode }>\n dataProvider: PublicBookingDataProvider\n}\n\nconst DEFAULT_LABELS: PublicBookingLabels = {\n title: 'Agende sua consulta',\n serviceStep: 'Escolha o serviço',\n dateStep: 'Escolha a data',\n contactStep: 'Seus dados',\n confirmCta: 'Confirmar agendamento',\n successTitle: 'Agendamento confirmado!',\n successBody: 'Você receberá os detalhes em breve. Até logo!',\n // overview\n servicesHeading: 'Serviços',\n aboutHeading: 'Sobre',\n openingHoursHeading: 'Horário de funcionamento',\n closedLabel: 'Fechado',\n bookNowCta: 'Agendar agora',\n // datetime\n timezoneNote: 'Fuso: Horário de Brasília',\n slotsHeading: 'Horários disponíveis',\n noSlots: 'Nenhum horário disponível neste dia. Tente outra data.',\n continueCta: 'Continuar',\n backToServices: 'Serviços',\n back: 'Voltar',\n prevWeek: 'Semana anterior',\n nextWeek: 'Próxima semana',\n // contact\n contactIntro: 'Preencha as informações abaixo para que seu agendamento seja identificado.',\n phoneLabel: 'Celular',\n phoneHint:\n 'Enviaremos um código para confirmar que o número de telefone é seu. Usaremos este número para associar as suas informações à sua conta.',\n sendCodeCta: 'Enviar código via WhatsApp',\n codeTitle: 'Insira o código',\n codeBody: 'Enviamos um código via WhatsApp para você confirmar seu número.',\n codeInvalid: 'Código inválido. Para testar, use 0000.',\n codeConfirmCta: 'Confirmar',\n codeResendHint: 'Reenviar código via WhatsApp em 28 segundos.',\n phoneVerified: 'Celular verificado',\n changePhone: 'Trocar telefone',\n nameLabel: 'Nome completo *',\n namePlaceholder: 'Seu nome',\n emailLabel: 'E-mail',\n emailPlaceholder: 'voce@email.com',\n emailHint: 'Enviaremos uma confirmação e um lembrete antes do agendamento.',\n notesLabel: 'Observação',\n notesPlaceholder: 'Use esse espaço para deixar uma observação sobre este agendamento',\n saveAndContinueCta: 'Salvar e continuar',\n submitError: 'Não foi possível concluir o agendamento. Tente novamente.',\n noChargeNote: 'Pagamento via Pix · Sem cobrança agora',\n // right rail\n railTitle: 'Passos para agendar',\n railWaitingPayment: 'Aguardando pagamento',\n railService: 'Serviço',\n railProfessional: 'Profissional',\n railDatetime: 'Data e horário',\n railContact: 'Informações pessoais',\n railPayment: 'Pagamento',\n}\n\nconst DEFAULT_WINDOW: BookingWindow = { minAdvanceHours: 2, maxAdvanceDays: 21, slotInterval: 30 }\n\nconst DEFAULT_HOURS: WorkingHours = { daysOfWeek: [1, 2, 3, 4, 5, 6], start: '09:00', end: '18:00' }\n\nfunction resolveBrand(brand: BookingBrand | undefined, labels: PublicBookingLabels): ResolvedBookingBrand {\n const name = brand?.name ?? labels.title\n return {\n name,\n initials: brand?.initials ?? name.charAt(0).toUpperCase(),\n logoUrl: brand?.logoUrl,\n tagline: brand?.tagline === undefined ? 'Agendamento online seguro' : brand.tagline,\n serviceIcon: brand?.serviceIcon ?? Video,\n serviceMeta: brand?.serviceMeta === undefined ? 'Online' : brand.serviceMeta,\n featuredBadge: brand?.featuredBadge === undefined ? 'Mais procurado' : brand.featuredBadge,\n highlights: brand?.highlights ?? [\n { icon: CalendarCheck, text: 'Confirmação imediata' },\n { icon: ShieldCheck, text: 'Agendamento seguro' },\n ],\n }\n}\n\nlet scheduleId = 0\n\nfunction buildSchedules(professionalId: string, hours: WorkingHours): Schedule[] {\n return hours.daysOfWeek.map((day) => ({\n id: `sched-${professionalId}-${day}-${scheduleId++}`,\n tenantId: 'public',\n kind: 'working_hours',\n assigneeId: professionalId,\n locationId: null,\n dayOfWeek: day,\n specificDate: null,\n startsAt: hours.start,\n endsAt: hours.end,\n isActive: true,\n metadata: {},\n }))\n}\n\nexport function createPublicBookingPlugin(options: PublicBookingOptions): PublicBookingPlugin {\n const basePath = options.basePath ?? '/agendar'\n // Mock needs a concrete seed professional; Supabase can target any (null).\n const mockProfessionalId = options.professional?.id ?? 'pro-1'\n const professionalId = options.professional?.id ?? null\n const professionalName = options.professional?.name ?? 'Especialista'\n const window: BookingWindow = { ...DEFAULT_WINDOW, ...options.window }\n const labels: PublicBookingLabels = { ...DEFAULT_LABELS, ...options.labels }\n const brand = resolveBrand(options.brand, labels)\n const components: BookingComponents = { ...DEFAULT_BOOKING_COMPONENTS, ...options.components }\n const currency = options.currency ?? 'BRL'\n const locale = options.locale ?? 'pt-BR'\n const hours = options.workingHours ?? DEFAULT_HOURS\n const staticServices = options.services ?? null\n const payment: ResolvedPayment | null = options.payment?.enabled\n ? {\n reservationFeePercent: options.payment.reservationFeePercent ?? 100,\n method: options.payment.method ?? 'pix',\n }\n : null\n\n const professional: Professional = {\n id: mockProfessionalId,\n name: professionalName,\n avatarUrl: null,\n locationId: null,\n locationName: null,\n isActive: true,\n }\n const mockSeed: MockAgendaSeed = options.seed ?? {\n professionals: [professional],\n schedules: buildSchedules(mockProfessionalId, hours),\n bookings: [],\n }\n\n const provider =\n options.dataProvider ??\n createSafeDataProvider<PublicBookingDataProvider>(\n () => {\n if (!options.tenantId) {\n throw new Error(\n '[plugin-agenda/public] `tenantId` is required when a Supabase client is configured (setGlobalSupabaseClient).',\n )\n }\n return createSupabasePublicBookingProvider({ tenantId: options.tenantId })\n },\n () =>\n createMockPublicBookingProvider({\n seed: mockSeed,\n services: staticServices ?? [],\n professionalId: mockProfessionalId,\n }),\n )\n\n const base: Omit<PublicBookingContextValue, 'services' | 'servicesLoading'> = {\n provider,\n professionalId,\n professionalName,\n businessHours: hours,\n payment,\n paymentProvider: options.paymentProvider ?? null,\n onIdentityVerified: options.onIdentityVerified ?? null,\n window,\n labels,\n brand,\n components,\n currency,\n locale,\n }\n const Provider: FC<{ children: ReactNode }> = ({ children }) =>\n createElement(BookingProvider, { base, staticServices, children })\n Provider.displayName = 'PublicBookingProvider'\n\n const BookingScreen: FC<unknown> = () =>\n createElement('section', { className: 'py-16 bg-background' },\n createElement('div', { className: 'container mx-auto px-6' },\n createElement(BookingWidget)))\n BookingScreen.displayName = 'BookingScreen'\n\n const manifest: PluginManifest = {\n id: 'booking',\n name: 'Agendamento',\n icon: 'CalendarCheck',\n version: '0.3.0',\n scope: options.scope ?? 'universal',\n verticalId: options.verticalId,\n scaffolds: ['website', 'landing_page'],\n defaultEnabled: true,\n dependencies: [],\n navigation: [],\n routes: [{ path: basePath, component: BookingScreen, guard: 'public' }],\n widgets: [],\n }\n\n return { manifest, Provider, dataProvider: provider }\n}\n"]}
|