add scorm

This commit is contained in:
2025-11-13 11:25:18 -03:00
parent b5e0684de7
commit 16bcf4b07f
14 changed files with 104 additions and 59 deletions

View File

@@ -53,7 +53,7 @@ export async function loader({ context, request, params }: Route.LoaderArgs) {
}).then((r) => r.json())
return {
data: Promise.all([users, new Promise((r) => setTimeout(r, 5000))])
data: users
}
}
@@ -69,7 +69,7 @@ export default function Route({ loaderData: { data } }) {
<Suspense fallback={<Skeleton />}>
<Await resolve={data}>
{([{ items }, _]) => {
{({ items }) => {
return (
<div className="grid gap-4 lg:gap-8 md:grid-cols-2 lg:grid-cols-3">
{items.map(({ sk, name, email }: Admin) => {

View File

@@ -6,6 +6,12 @@ import { useForm } from 'react-hook-form'
import { PatternFormat } from 'react-number-format'
import { Link, useFetcher } from 'react-router'
import { toast } from 'sonner'
import {
adjectives,
colors,
NumberDictionary,
uniqueNamesGenerator
} from 'unique-names-generator'
import { z } from 'zod'
import {
@@ -34,7 +40,6 @@ import {
FormMessage
} from '@repo/ui/components/ui/form'
import { Input } from '@repo/ui/components/ui/input'
import { Label } from '@repo/ui/components/ui/label'
import { Spinner } from '@repo/ui/components/ui/spinner'
import { useWorksapce } from '@/components/workspace-switcher'
@@ -49,10 +54,11 @@ export const formSchema = z.object({
.trim()
.nonempty('Digite um nome')
.refine(isName, { message: 'Nome inválido' }),
email: z.email('Email inválido').trim().toLowerCase(),
email: z.email('Email inválido').trim().toLowerCase().optional(),
cpf: z
.string('CPF obrigatório')
.refine(isValidCPF, { message: 'CPF inválido' })
.refine(isValidCPF, { message: 'CPF inválido' }),
given_email: z.coerce.boolean()
})
export type Schema = z.infer<typeof formSchema>
@@ -87,7 +93,8 @@ export default function Route() {
const form = useForm({
resolver: zodResolver(formSchema)
})
const { handleSubmit, control, formState, reset } = form
const { handleSubmit, control, formState, reset, watch } = form
const givenEmail = watch('given_email') as boolean
const onSubmit = async (user: Schema) => {
await fetcher.submit(JSON.stringify({ user, org: activeWorkspace }), {
@@ -108,6 +115,8 @@ export default function Route() {
}
}, [fetcher.data])
// console.log(randomEmail())
return (
<div className="space-y-2.5">
<Breadcrumb>
@@ -157,6 +166,7 @@ export default function Route() {
<FormField
control={control}
name="email"
disabled={givenEmail}
defaultValue=""
render={({ field }) => (
<FormItem>
@@ -168,12 +178,27 @@ export default function Route() {
</FormItem>
)}
/>
<div className="flex items-center gap-2">
<Checkbox id="terms" tabIndex={-1} />
<Label htmlFor="terms">
Usar um email fornecido pela plataforma.
</Label>
</div>
<FormField
control={control}
name="given_email"
defaultValue={false}
render={({ field: { value, onChange, ...field } }) => (
<FormItem className="flex items-center gap-2">
<FormControl>
<Checkbox
checked={Boolean(value)}
onCheckedChange={onChange}
tabIndex={-1}
{...field}
/>
</FormControl>
<FormLabel className="cursor-pointer">
Usar um email fornecido pela plataforma.
</FormLabel>
</FormItem>
)}
/>
</div>
<FormField
@@ -219,3 +244,14 @@ export default function Route() {
</div>
)
}
function randomEmail() {
const numberDict = NumberDictionary.generate({ min: 100, max: 999 })
const randomName: string = uniqueNamesGenerator({
dictionaries: [adjectives, colors, numberDict],
length: 3,
separator: '-'
})
return `${randomName}@users.noreply.saladeaula.digital`
}