import type { Route } from './+types/index' import Fuse from 'fuse.js' import { AwardIcon, BanIcon, FileBadgeIcon, LaptopIcon } from 'lucide-react' import { Suspense, useMemo } from 'react' import { Await, NavLink, useSearchParams } from 'react-router' import placeholder from '@/assets/placeholder.webp' import { createSearch } from '@/lib/meili' import { SearchForm } from '@repo/ui/components/search-form' import { Skeleton } from '@repo/ui/components/skeleton' import { Card, CardFooter, CardHeader, CardTitle } from '@repo/ui/components/ui/card' import { Empty, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from '@repo/ui/components/ui/empty' import { Kbd } from '@repo/ui/components/ui/kbd' import { Spinner } from '@repo/ui/components/ui/spinner' import { Tooltip, TooltipContent, TooltipTrigger } from '@repo/ui/components/ui/tooltip' import type { Course } from './edit' export function meta({}: Route.MetaArgs) { return [{ title: 'Gerenciar seus cursos' }] } export const loader = async ({ context }: Route.ActionArgs) => { return { data: createSearch({ index: 'saladeaula_courses', sort: ['created_at:desc'], env: context.cloudflare.env }) } } export default function Component({ loaderData: { data } }) { const [searchParams, setSearchParams] = useSearchParams() const term = searchParams.get('term') as string return (

Cursos

Gerencie seus cursos com facilidade e organize seu conteúdo.

}>
Pressione / para filtrar... } defaultValue={term} onChange={(term) => { setSearchParams({ term }) }} />
{({ hits = [] }) => { return }}
) } function List({ term, hits = [] }: { term: string; hits: Course[] }) { const fuse = useMemo(() => { return new Fuse(hits, { keys: ['name'], threshold: 0.3, includeMatches: true }) }, [hits]) const hits_ = useMemo(() => { if (!term) { return hits } return fuse.search(term).map(({ item }) => item) }, [term, fuse, hits]) if (hits_.length === 0) { return ( Nada encontrado Nenhum resultado para {term}. ) } return hits_.map((props: Course, idx) => { return }) } function Course({ id, name, access_period, cert, draft }: Course) { return ( {({ isPending }) => ( {isPending && (
)} {name} {draft ? <>(rascunho) : null}
  • {access_period}d

    Tempo de acesso ao curso

  • {cert?.exp_interval && (
  • {cert.exp_interval}d

    Perído de validade do certificado

  • )} {cert?.s3_uri && (
  • )}
{name}
)}
) }