import type { Route } from './+types/route' import { useToggle } from 'ahooks' import { ErrorMessage } from '@hookform/error-message' import { CalendarIcon, CopyIcon, CopyPlusIcon, Trash2Icon, PlusIcon, XIcon, ChevronsUpDownIcon, CheckIcon, BookIcon } from 'lucide-react' import { Link, useParams } from 'react-router' import { Controller, useFieldArray, useForm } from 'react-hook-form' import { Fragment, use, useEffect, useMemo, useState } from 'react' import { format } from 'date-fns' import { ptBR } from 'react-day-picker/locale' import { zodResolver } from '@hookform/resolvers/zod' import Fuse from 'fuse.js' import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@repo/ui/components/ui/command' import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from '@repo/ui/components/ui/breadcrumb' import { InputGroup, InputGroupAddon, InputGroupInput } from '@repo/ui/components/ui/input-group' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@repo/ui/components/ui/card' import { Spinner } from '@repo/ui/components/ui/spinner' import { Input } from '@repo/ui/components/ui/input' import { Button } from '@repo/ui/components/ui/button' import { Separator } from '@repo/ui/components/ui/separator' import { Popover, PopoverContent, PopoverTrigger } from '@repo/ui/components/ui/popover' import { Label } from '@repo/ui/components/ui/label' import { Calendar } from '@repo/ui/components/ui/calendar' import { createSearch } from '@repo/util/meili' import { cn } from '@repo/ui/lib/utils' import { useIsMobile } from '@repo/ui/hooks/use-mobile' import { formSchema, type Schema, MAX_ITEMS } from './data' import { AsyncCombobox } from './async-combobox' export function meta({}: Route.MetaArgs) { return [{ title: 'Adicionar matrícula' }] } export async function loader({ context }: Route.LoaderArgs) { const courses = createSearch({ index: 'saladeaula_courses', sort: ['created_at:desc'], filter: 'unlisted NOT EXISTS', hitsPerPage: 100, env: context.cloudflare.env }) return { courses } } export async function action({}: Route.ActionArgs) { return {} } const emptyRow = { user: undefined, course: undefined, scheduled_for: undefined } export default function Route({ loaderData: { courses } }: Route.ComponentProps) { const { orgid } = useParams() const [data, setData] = useState({}) const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { enrollments: [emptyRow] } }) const { formState, control, handleSubmit, getValues } = form const { fields, insert, remove, append } = useFieldArray({ control, name: 'enrollments' }) const onSubmit = async (data: Schema) => { setData(data) } const onSearch = async (search: string) => { const params = new URLSearchParams({ q: search }) const r = await fetch(`/${orgid}/users.json?${params.toString()}`) const { hits } = (await r.json()) as { hits: any[] } return hits } const duplicateRow = (index: number, times: number = 1) => { if (fields.length + times > MAX_ITEMS) { return null } const { user, ...rest } = getValues(`enrollments.${index}`) Array.from({ length: times }, (_, i) => { // @ts-ignore insert(index + 1 + i, rest) }) } return (
{JSON.stringify(data, null, 2)}
)}