import type { Route } from './+types/index' import Fuse from 'fuse.js' import { AwardIcon, BanIcon, FileBadgeIcon, HatGlassesIcon, LaptopIcon } from 'lucide-react' import { Suspense, useMemo } from 'react' import { Await, NavLink, useSearchParams } from 'react-router' import { cloudflareContext } from '@repo/auth/context' import { createSearch } from '@repo/util/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' import placeholder from '@/assets/placeholder.webp' import { cn } from '@repo/ui/lib/utils' export function meta({}: Route.MetaArgs) { return [{ title: 'Gerenciar seus cursos' }] } export const loader = async ({ context }: Route.ActionArgs) => { const cloudflare = context.get(cloudflareContext) const courses = createSearch({ index: 'saladeaula_courses', sort: ['created_at:desc'], hitsPerPage: 100, env: cloudflare.env }) return { data: courses } } export default function Component({ loaderData: { data } }: Route.ComponentProps) { const [searchParams, setSearchParams] = useSearchParams() const term = searchParams.get('term') as string return ( }>

Cursos

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

Digite / para pesquisar } defaultValue={term} onChange={(term) => { setSearchParams({ term: String(term) }) }} />
{({ hits }) => }
) } 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, unlisted }: Course) { return ( {({ isPending }) => ( {isPending && (
)} {name}
  • {access_period}d

    Tempo de acesso ao curso

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

    Perído de validade do certificado

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