import type { Route } from './+types/route' import { useState } from 'react' import { Link } from 'react-router' import { useLocalStorageState, useMount } from 'ahooks' import { BookSearchIcon, CircleCheckBigIcon, WalletIcon } from 'lucide-react' import { Card, CardContent, CardHeader, CardDescription, CardTitle } from '@repo/ui/components/ui/card' import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from '@repo/ui/components/ui/breadcrumb' import { Switch } from '@repo/ui/components/ui/switch' import { createSearch } from '@repo/util/meili' import { cloudflareContext } from '@repo/auth/context' import { Label } from '@repo/ui/components/ui/label' import { Skeleton } from '@repo/ui/components/skeleton' import type { PaymentMethod } from '@repo/ui/routes/orders/data' import { Wizard, WizardStep } from '@/components/wizard' import { Step, StepItem, StepSeparator } from '@/components/step' import type { Course, Enrollment } from '../_.$orgid.enrollments.add/data' import { Assigned } from './assigned' import { Bulk, type Item } from './bulk' import { Payment, type CreditCard } from './payment' import { Review } from './review' import type { Coupon } from './discount' import { useFetcher } from 'react-router' export type WizardState = { index: number kind: 'bulk' | 'assigned' items: Item[] enrollments: Enrollment[] coupon?: Coupon installments?: number payment_method?: PaymentMethod credit_card?: CreditCard } const emptyWizard: WizardState = { index: 0, kind: 'bulk', items: [], enrollments: [], coupon: undefined, payment_method: undefined, installments: undefined, credit_card: undefined } export function meta({}: Route.MetaArgs) { return [{ title: 'Comprar matrículas' }] } export async function loader({ context }: Route.LoaderArgs) { const cloudflare = context.get(cloudflareContext) const courses = createSearch({ index: 'saladeaula_courses', sort: ['created_at:desc'], filter: 'unlisted = false', hitsPerPage: 100, env: cloudflare.env }) return { courses } } export async function action({ request }: Route.ActionArgs) { const body = (await request.json()) as object console.log(body) } export default function Route({ loaderData: { courses } }: Route.ComponentProps) { const fetcher = useFetcher() const [mounted, setMounted] = useState(false) const [state, setState] = useLocalStorageState('wizard_cart', { defaultValue: emptyWizard }) const index = state.index const kind = state.kind const props = { ...state, courses, onSubmit: async (data: any) => setState((prev) => ({ ...(prev ?? emptyWizard), ...data })) } const onSubmit = async (data: WizardState) => { await fetcher.submit(JSON.stringify(data), { method: 'post', encType: 'application/json' }) } useMount(() => { setMounted(true) }) if (!mounted) { return } return (
Matrículas Comprar matrículas
Comprar matrículas Siga os passos abaixo para comprar novas matrículas. Escolher cursos Pagamento Revisão & confirmação setState((prev) => ({ ...(prev ?? emptyWizard), index: nextIndex })) } > {/* Cart */} {kind == 'assigned' ? ( ) : ( )} {/* Payment */} { setState((prev) => ({ ...(prev ?? emptyWizard), ...data })) }} /> {/* Review */}
) }