From 16bcf4b07fc2ab2c47091cff688877c8444d501a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Thu, 13 Nov 2025 11:25:18 -0300 Subject: [PATCH] add scorm --- .../routes/_.$orgid.admins._index/route.tsx | 4 +- .../app/routes/_.$orgid.users.add/route.tsx | 56 +++++++++++++++---- apps/admin.saladeaula.digital/package.json | 1 + .../app/components/container.tsx | 14 +++++ apps/saladeaula.digital/app/lib/utils.ts | 20 ------- apps/saladeaula.digital/app/root.tsx | 4 +- apps/saladeaula.digital/app/routes/certs.tsx | 6 +- apps/saladeaula.digital/app/routes/index.tsx | 5 +- apps/saladeaula.digital/app/routes/layout.tsx | 8 +-- .../app/routes/payments.tsx | 6 +- apps/saladeaula.digital/app/routes/player.tsx | 16 +++--- .../app/routes/settings.tsx | 9 +-- package-lock.json | 10 ++++ users-events/template.yaml | 4 +- 14 files changed, 104 insertions(+), 59 deletions(-) create mode 100644 apps/saladeaula.digital/app/components/container.tsx delete mode 100644 apps/saladeaula.digital/app/lib/utils.ts diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.admins._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.admins._index/route.tsx index 7ce8e2e..1025ffb 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.admins._index/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.admins._index/route.tsx @@ -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 } }) { }> - {([{ items }, _]) => { + {({ items }) => { return (
{items.map(({ sk, name, email }: Admin) => { diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.add/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.add/route.tsx index ae8ac75..4b8231b 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.add/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.add/route.tsx @@ -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 @@ -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 (
@@ -157,6 +166,7 @@ export default function Route() { ( @@ -168,12 +178,27 @@ export default function Route() { )} /> -
- - -
+ + ( + + + + + + Usar um email fornecido pela plataforma. + + + )} + />
) } + +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` +} diff --git a/apps/admin.saladeaula.digital/package.json b/apps/admin.saladeaula.digital/package.json index 7fbe386..323acc8 100644 --- a/apps/admin.saladeaula.digital/package.json +++ b/apps/admin.saladeaula.digital/package.json @@ -28,6 +28,7 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "react-router": "^7.9.5", + "unique-names-generator": "^4.7.1", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", "zod": "^4.1.12" }, diff --git a/apps/saladeaula.digital/app/components/container.tsx b/apps/saladeaula.digital/app/components/container.tsx new file mode 100644 index 0000000..2c5ae8b --- /dev/null +++ b/apps/saladeaula.digital/app/components/container.tsx @@ -0,0 +1,14 @@ +import { cn } from '@repo/ui/lib/utils' + +type ContainerProps = { + children: React.ReactNode + className?: string +} + +export function Container({ children, className }: ContainerProps) { + return ( +
+
{children}
+
+ ) +} diff --git a/apps/saladeaula.digital/app/lib/utils.ts b/apps/saladeaula.digital/app/lib/utils.ts deleted file mode 100644 index 71aab92..0000000 --- a/apps/saladeaula.digital/app/lib/utils.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { clsx, type ClassValue } from 'clsx' -import { twMerge } from 'tailwind-merge' - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) -} - -export function initials(s: string): string { - const initials = s - .split(' ') - .map((word) => word.charAt(0).toUpperCase()) as string[] - - if (initials.length == 0) { - return '' - } - - const first = initials[0] - const last = initials[initials.length - 1] - return first + last -} diff --git a/apps/saladeaula.digital/app/root.tsx b/apps/saladeaula.digital/app/root.tsx index b0ecd56..aba8e9d 100644 --- a/apps/saladeaula.digital/app/root.tsx +++ b/apps/saladeaula.digital/app/root.tsx @@ -17,7 +17,7 @@ export const middleware: Route.MiddlewareFunction[] = [loggingMiddleware] export function Layout({ children }: { children: React.ReactNode }) { return ( - + @@ -26,7 +26,7 @@ export function Layout({ children }: { children: React.ReactNode }) { - + + @@ -39,6 +41,6 @@ export default function Component() { acompanhe seus cursos concluídos.

- + ) } diff --git a/apps/saladeaula.digital/app/routes/index.tsx b/apps/saladeaula.digital/app/routes/index.tsx index 3e03824..817589a 100644 --- a/apps/saladeaula.digital/app/routes/index.tsx +++ b/apps/saladeaula.digital/app/routes/index.tsx @@ -27,6 +27,7 @@ import { Await, useSearchParams } from 'react-router' import placeholder from '@/assets/placeholder.webp' import { createSearch } from '@/lib/meili' +import { Container } from '@/components/container' import type { User } from '@repo/auth/auth' import { userContext } from '@repo/auth/context' import { FacetedFilter } from '@repo/ui/components/faceted-filter' @@ -102,7 +103,7 @@ export default function Component({ const term = searchParams.get('term') as string return ( -
+

Meus cursos

@@ -164,7 +165,7 @@ export default function Component({

-
+ ) } diff --git a/apps/saladeaula.digital/app/routes/layout.tsx b/apps/saladeaula.digital/app/routes/layout.tsx index b401e8b..ed63046 100644 --- a/apps/saladeaula.digital/app/routes/layout.tsx +++ b/apps/saladeaula.digital/app/routes/layout.tsx @@ -50,7 +50,7 @@ export default function Component({ loaderData }: Route.ComponentProps) { const [isOpen, { toggle }] = useToggle() return ( -
+
-
-
- -
-
+
) } diff --git a/apps/saladeaula.digital/app/routes/payments.tsx b/apps/saladeaula.digital/app/routes/payments.tsx index 729a386..2f36d6d 100644 --- a/apps/saladeaula.digital/app/routes/payments.tsx +++ b/apps/saladeaula.digital/app/routes/payments.tsx @@ -11,13 +11,15 @@ import { BreadcrumbSeparator } from '@repo/ui/components/ui/breadcrumb' +import { Container } from '@/components/container' + export function meta({}: Route.MetaArgs) { return [{ title: 'Histórico de compras' }] } export default function Component() { return ( -
+ @@ -41,6 +43,6 @@ export default function Component() { o controle financeiro.

-
+ ) } diff --git a/apps/saladeaula.digital/app/routes/player.tsx b/apps/saladeaula.digital/app/routes/player.tsx index 28ccc2f..9f83a82 100644 --- a/apps/saladeaula.digital/app/routes/player.tsx +++ b/apps/saladeaula.digital/app/routes/player.tsx @@ -4,16 +4,18 @@ import { ScormPlayer } from '@/components/scorm-player' import { useLocalStorage } from '@/hooks/useLocalStorage' import SHA256 from 'crypto-js/sha256' -import { data } from './index' - export function meta({ params }: Route.MetaArgs) { - const course = data.find((course) => course.id === params.course) - - return [{ title: course.courseName }] + return [{ title: '' }] } -export default function Home({ params }: Route.ComponentProps) { - const course = data.find((course) => course.id === params.course) +export default function Route({ params }: Route.ComponentProps) { + const course = { + id: 'fbad867a-0022-4605-814f-db8ebe2b17fb', + courseName: 'All Golf', + scormContentPath: + 'nr-33-espacos-confinados-conteudo-de-demonstracao-scorm12/scormdriver/indexAPI.html' + } + // const course = data.find((course) => course.id === params.course) const hash = SHA256(course.scormContentPath).toString() const [scormState] = useLocalStorage(`scormState.${hash}`, {}) diff --git a/apps/saladeaula.digital/app/routes/settings.tsx b/apps/saladeaula.digital/app/routes/settings.tsx index 117bfb9..b9aba30 100644 --- a/apps/saladeaula.digital/app/routes/settings.tsx +++ b/apps/saladeaula.digital/app/routes/settings.tsx @@ -4,6 +4,7 @@ import { Link } from 'react-router' import { request as req } from '@/lib/request' +import { Container } from '@/components/container' import type { User } from '@repo/auth/auth' import { userContext } from '@repo/auth/context' import { @@ -48,7 +49,7 @@ export async function loader({ context, request }: Route.ActionArgs) { return { user: await r.json() } } -export default function Component({ loaderData: { user } }) { +export default function Route({ loaderData: { user } }) { const form = useForm({ defaultValues: user }) const { handleSubmit, control, formState } = form @@ -57,7 +58,7 @@ export default function Component({ loaderData: { user } }) { } return ( -
+ @@ -144,7 +145,7 @@ export default function Component({ loaderData: { user } }) {
-
+ ) } diff --git a/package-lock.json b/package-lock.json index c75a81f..05e7a58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "react-router": "^7.9.5", + "unique-names-generator": "^4.7.1", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", "zod": "^4.1.12" }, @@ -7247,6 +7248,15 @@ "devOptional": true, "license": "MIT" }, + "node_modules/unique-names-generator": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", + "integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/users-events/template.yaml b/users-events/template.yaml index de1a61d..330bb0a 100644 --- a/users-events/template.yaml +++ b/users-events/template.yaml @@ -17,7 +17,7 @@ Globals: Architectures: - x86_64 Layers: - - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:79 + - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:100 Environment: Variables: TZ: America/Sao_Paulo @@ -110,7 +110,7 @@ Resources: InvocationType: RequestResponse - S3Action: BucketName: !Ref BucketName - ObjectKeyPrefix: "mailbox" + ObjectKeyPrefix: 'mailbox' ScanEnabled: true EventAddTenantFunction: