From 21840506b0e040eba056e5139e68bd85b5626b6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Mon, 24 Nov 2025 19:11:20 -0300 Subject: [PATCH] share route itens --- .../_.$orgid.enrollments._index/columns.tsx | 11 +- .../_.$orgid.enrollments._index/route.tsx | 27 ++-- .../routes/_.$orgid.orders._index/route.tsx | 2 +- .../routes/_.$orgid.users._index/columns.tsx | 1 - .../app/routes/_.$orgid/route.tsx | 4 +- .../worker-configuration.d.ts | 85 ++++++----- .../worker-configuration.d.ts | 85 ++++++----- .../_app.enrollments._index/columns.tsx | 3 +- .../routes/_app.enrollments._index/data.tsx | 69 --------- .../routes/_app.enrollments._index/route.tsx | 2 +- .../routes/_app.payments._index/columns.tsx | 71 +-------- .../app/routes/_app.payments._index/route.tsx | 5 +- .../app/routes/_app/route.tsx | 4 +- .../app/components/container.tsx | 4 +- .../app/components/scorm12-player.tsx | 71 --------- .../app/components/scorm2004-player.tsx | 70 --------- apps/saladeaula.digital/app/routes/index.tsx | 51 ++++--- apps/saladeaula.digital/app/routes/layout.tsx | 2 +- .../app/routes/orders/route.tsx | 10 +- .../worker-configuration.d.ts | 85 ++++++----- .../app/lib/meili.ts | 34 ----- .../app/lib/request.ts | 49 ------- .../app/routes/edit.tsx | 33 +++-- .../app/routes/index.tsx | 66 ++++----- .../app/routes/layout.tsx | 4 +- .../worker-configuration.d.ts | 85 ++++++----- package-lock.json | 136 +++++++++--------- packages/ui/package.json | 1 + .../ui/src/routes/enrollments}/data.tsx | 0 .../ui/src/routes/orders}/columns.tsx | 32 ++++- packages/ui/src/routes/orders/data.tsx | 61 ++++++++ 31 files changed, 460 insertions(+), 703 deletions(-) delete mode 100644 apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/data.tsx delete mode 100644 apps/saladeaula.digital/app/components/scorm12-player.tsx delete mode 100644 apps/saladeaula.digital/app/components/scorm2004-player.tsx delete mode 100644 apps/studio.saladeaula.digital/app/lib/meili.ts delete mode 100644 apps/studio.saladeaula.digital/app/lib/request.ts rename {apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index => packages/ui/src/routes/enrollments}/data.tsx (100%) rename {apps/admin.saladeaula.digital/app/routes/_.$orgid.orders._index => packages/ui/src/routes/orders}/columns.tsx (61%) create mode 100644 packages/ui/src/routes/orders/data.tsx diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/columns.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/columns.tsx index 537d487..c9a93eb 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/columns.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/columns.tsx @@ -42,8 +42,7 @@ import { import { Progress } from '@repo/ui/components/ui/progress' import { Spinner } from '@repo/ui/components/ui/spinner' import { cn, initials } from '@repo/ui/lib/utils' - -import { labels, statuses } from './data' +import { labels, statuses } from '@repo/ui/routes/enrollments/data' // This type is used to define the shape of our data. // You can use a Zod schema here if you want. @@ -61,14 +60,6 @@ export type Enrollment = { created_at: string } -const formatted = new Intl.DateTimeFormat('pt-BR', { - day: '2-digit', - month: '2-digit', - year: 'numeric', - hour: '2-digit', - minute: '2-digit' -}) - export const columns: ColumnDef[] = [ { id: 'select', diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/route.tsx index 1208c1d..af755d6 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/route.tsx @@ -3,7 +3,7 @@ import type { Route } from './+types/route' import { CalendarIcon, PlusCircleIcon, PlusIcon } from 'lucide-react' import { MeiliSearchFilterBuilder } from 'meilisearch-helper' import { Suspense, useState } from 'react' -import { Await, Link, Outlet, useParams, useSearchParams } from 'react-router' +import { Await, Link, useParams, useSearchParams } from 'react-router' import { DataTable, DataTableViewOptions } from '@repo/ui/components/data-table' import { FacetedFilter } from '@repo/ui/components/faceted-filter' @@ -12,12 +12,11 @@ import { SearchForm } from '@repo/ui/components/search-form' import { Skeleton } from '@repo/ui/components/skeleton' import { Button } from '@repo/ui/components/ui/button' import { ExportMenu } from '@repo/ui/components/export-menu' - import { Kbd } from '@repo/ui/components/ui/kbd' import { createSearch } from '@repo/util/meili' +import { headers, sortings, statuses } from '@repo/ui/routes/enrollments/data' import { columns, type Enrollment } from './columns' -import { headers, sortings, statuses } from './data' export function meta({}: Route.MetaArgs) { return [{ title: 'Matrículas' }] @@ -45,16 +44,18 @@ export async function loader({ params, context, request }: Route.LoaderArgs) { builder = builder.where(field, 'between', [from_, to]) } + const enrollments = createSearch({ + index: 'betaeducacao-prod-enrollments', + filter: builder.build(), + sort: [sort], + query, + page, + hitsPerPage, + env: context.cloudflare.env + }) + return { - data: createSearch({ - index: 'betaeducacao-prod-enrollments', - filter: builder.build(), - sort: [sort], - query, - page, - hitsPerPage, - env: context.cloudflare.env - }) + data: enrollments } } @@ -211,8 +212,6 @@ export default function Route({ loaderData: { data } }) { )} - - ) } diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.orders._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.orders._index/route.tsx index 59321b7..e8990df 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.orders._index/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.orders._index/route.tsx @@ -8,7 +8,7 @@ import { DataTable } from '@repo/ui/components/data-table' import { Skeleton } from '@repo/ui/components/skeleton' import { createSearch } from '@repo/util/meili' -import { columns, type Order } from './columns' +import { columns, type Order } from '@repo/ui/routes/orders/columns' export function meta({}: Route.MetaArgs) { return [{ title: 'Histórico de compras' }] diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/columns.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/columns.tsx index 4ee75fd..6dc1355 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/columns.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/columns.tsx @@ -1,6 +1,5 @@ 'use client' -import { formatCPF } from '@brazilian-utils/brazilian-utils' import { type ColumnDef } from '@tanstack/react-table' import { useToggle } from 'ahooks' import { diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid/route.tsx index 62dda77..de6d6ff 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid/route.tsx @@ -73,7 +73,7 @@ export default function Route({ loaderData }: Route.ComponentProps) { className="bg-background/15 backdrop-blur-sm px-4 py-2 lg:py-4 sticky top-0 z-5" > -
+
@@ -85,7 +85,7 @@ export default function Route({ loaderData }: Route.ComponentProps) {
-
+
{ } ? ReadableStream : AiModelList[Name]["postProcessedOutputs"]>; models(params?: AiModelsSearchParams): Promise; toMarkdown(): ToMarkdownService; - toMarkdown(files: { - name: string; - blob: Blob; - }[], options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - }): Promise; - toMarkdown(files: { - name: string; - blob: Blob; - }, options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - }): Promise; + toMarkdown(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise; + toMarkdown(files: MarkdownDocument, options?: ConversionRequestOptions): Promise; } type GatewayRetries = { maxAttempts?: 1 | 2 | 3 | 4 | 5; @@ -8415,21 +8403,22 @@ declare namespace CloudflareWorkersModule { protected ctx: ExecutionContext; protected env: Env; constructor(ctx: ExecutionContext, env: Env); + email?(message: ForwardableEmailMessage): void | Promise; fetch?(request: Request): Response | Promise; + queue?(batch: MessageBatch): void | Promise; + scheduled?(controller: ScheduledController): void | Promise; tail?(events: TraceItem[]): void | Promise; tailStream?(event: TailStream.TailEvent): TailStream.TailEventHandlerType | Promise; - trace?(traces: TraceItem[]): void | Promise; - scheduled?(controller: ScheduledController): void | Promise; - queue?(batch: MessageBatch): void | Promise; test?(controller: TestController): void | Promise; + trace?(traces: TraceItem[]): void | Promise; } export abstract class DurableObject implements Rpc.DurableObjectBranded { [Rpc.__DURABLE_OBJECT_BRAND]: never; protected ctx: DurableObjectState; protected env: Env; constructor(ctx: DurableObjectState, env: Env); - fetch?(request: Request): Response | Promise; alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise; + fetch?(request: Request): Response | Promise; webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise; webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise; webSocketError?(ws: WebSocket, error: unknown): void | Promise; @@ -8492,36 +8481,56 @@ declare module "cloudflare:sockets" { function _connect(address: string | SocketAddress, options?: SocketOptions): Socket; export { _connect as connect }; } +type MarkdownDocument = { + name: string; + blob: Blob; +}; type ConversionResponse = { name: string; mimeType: string; -} & ({ - format: "markdown"; + format: 'markdown'; tokens: number; data: string; } | { - format: "error"; + name: string; + mimeType: string; + format: 'error'; error: string; -}); +}; +type ImageConversionOptions = { + descriptionLanguage?: 'en' | 'es' | 'fr' | 'it' | 'pt' | 'de'; +}; +type EmbeddedImageConversionOptions = ImageConversionOptions & { + convert?: boolean; + maxConvertedImages?: number; +}; +type ConversionOptions = { + html?: { + images?: EmbeddedImageConversionOptions & { + convertOGImage?: boolean; + }; + }; + docx?: { + images?: EmbeddedImageConversionOptions; + }; + image?: ImageConversionOptions; + pdf?: { + images?: EmbeddedImageConversionOptions; + metadata?: boolean; + }; +}; +type ConversionRequestOptions = { + gateway?: GatewayOptions; + extraHeaders?: object; + conversionOptions?: ConversionOptions; +}; type SupportedFileFormat = { mimeType: string; extension: string; }; declare abstract class ToMarkdownService { - transform(files: { - name: string; - blob: Blob; - }[], options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - }): Promise; - transform(files: { - name: string; - blob: Blob; - }, options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - }): Promise; + transform(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise; + transform(files: MarkdownDocument, options?: ConversionRequestOptions): Promise; supported(): Promise; } declare namespace TailStream { diff --git a/apps/id.saladeaula.digital/worker-configuration.d.ts b/apps/id.saladeaula.digital/worker-configuration.d.ts index 19e79a9..9b85f42 100644 --- a/apps/id.saladeaula.digital/worker-configuration.d.ts +++ b/apps/id.saladeaula.digital/worker-configuration.d.ts @@ -1,6 +1,6 @@ /* eslint-disable */ // Generated by Wrangler by running `wrangler types` (hash: 20d12d2cb42a565d117b277533ca85a9) -// Runtime types generated with workerd@1.20251113.0 2025-04-04 +// Runtime types generated with workerd@1.20251118.0 2025-04-04 declare namespace Cloudflare { interface GlobalProps { mainModule: typeof import("./workers/app"); @@ -452,7 +452,7 @@ interface StructuredSerializeOptions { transfer?: any[]; } declare abstract class Navigator { - sendBeacon(url: string, body?: (ReadableStream | string | (ArrayBuffer | ArrayBufferView) | Blob | FormData | URLSearchParams | URLSearchParams)): boolean; + sendBeacon(url: string, body?: BodyInit): boolean; readonly userAgent: string; readonly hardwareConcurrency: number; } @@ -6742,20 +6742,8 @@ declare abstract class Ai { } ? ReadableStream : AiModelList[Name]["postProcessedOutputs"]>; models(params?: AiModelsSearchParams): Promise; toMarkdown(): ToMarkdownService; - toMarkdown(files: { - name: string; - blob: Blob; - }[], options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - }): Promise; - toMarkdown(files: { - name: string; - blob: Blob; - }, options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - }): Promise; + toMarkdown(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise; + toMarkdown(files: MarkdownDocument, options?: ConversionRequestOptions): Promise; } type GatewayRetries = { maxAttempts?: 1 | 2 | 3 | 4 | 5; @@ -8407,21 +8395,22 @@ declare namespace CloudflareWorkersModule { protected ctx: ExecutionContext; protected env: Env; constructor(ctx: ExecutionContext, env: Env); + email?(message: ForwardableEmailMessage): void | Promise; fetch?(request: Request): Response | Promise; + queue?(batch: MessageBatch): void | Promise; + scheduled?(controller: ScheduledController): void | Promise; tail?(events: TraceItem[]): void | Promise; tailStream?(event: TailStream.TailEvent): TailStream.TailEventHandlerType | Promise; - trace?(traces: TraceItem[]): void | Promise; - scheduled?(controller: ScheduledController): void | Promise; - queue?(batch: MessageBatch): void | Promise; test?(controller: TestController): void | Promise; + trace?(traces: TraceItem[]): void | Promise; } export abstract class DurableObject implements Rpc.DurableObjectBranded { [Rpc.__DURABLE_OBJECT_BRAND]: never; protected ctx: DurableObjectState; protected env: Env; constructor(ctx: DurableObjectState, env: Env); - fetch?(request: Request): Response | Promise; alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise; + fetch?(request: Request): Response | Promise; webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise; webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise; webSocketError?(ws: WebSocket, error: unknown): void | Promise; @@ -8484,36 +8473,56 @@ declare module "cloudflare:sockets" { function _connect(address: string | SocketAddress, options?: SocketOptions): Socket; export { _connect as connect }; } +type MarkdownDocument = { + name: string; + blob: Blob; +}; type ConversionResponse = { name: string; mimeType: string; -} & ({ - format: "markdown"; + format: 'markdown'; tokens: number; data: string; } | { - format: "error"; + name: string; + mimeType: string; + format: 'error'; error: string; -}); +}; +type ImageConversionOptions = { + descriptionLanguage?: 'en' | 'es' | 'fr' | 'it' | 'pt' | 'de'; +}; +type EmbeddedImageConversionOptions = ImageConversionOptions & { + convert?: boolean; + maxConvertedImages?: number; +}; +type ConversionOptions = { + html?: { + images?: EmbeddedImageConversionOptions & { + convertOGImage?: boolean; + }; + }; + docx?: { + images?: EmbeddedImageConversionOptions; + }; + image?: ImageConversionOptions; + pdf?: { + images?: EmbeddedImageConversionOptions; + metadata?: boolean; + }; +}; +type ConversionRequestOptions = { + gateway?: GatewayOptions; + extraHeaders?: object; + conversionOptions?: ConversionOptions; +}; type SupportedFileFormat = { mimeType: string; extension: string; }; declare abstract class ToMarkdownService { - transform(files: { - name: string; - blob: Blob; - }[], options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - }): Promise; - transform(files: { - name: string; - blob: Blob; - }, options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - }): Promise; + transform(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise; + transform(files: MarkdownDocument, options?: ConversionRequestOptions): Promise; supported(): Promise; } declare namespace TailStream { diff --git a/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/columns.tsx b/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/columns.tsx index 94df538..8e615d8 100644 --- a/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/columns.tsx +++ b/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/columns.tsx @@ -24,8 +24,7 @@ import { import { Progress } from '@repo/ui/components/ui/progress' import { Spinner } from '@repo/ui/components/ui/spinner' import { cn, initials } from '@repo/ui/lib/utils' - -import { labels, statuses } from './data' +import { labels, statuses } from '@repo/ui/routes/enrollments/data' // This type is used to define the shape of our data. // You can use a Zod schema here if you want. diff --git a/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/data.tsx b/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/data.tsx deleted file mode 100644 index d345e15..0000000 --- a/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/data.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { - CircleCheckIcon, - CircleIcon, - CircleOffIcon, - CircleXIcon, - TimerIcon, - type LucideIcon -} from 'lucide-react' - -export const statuses: Record< - string, - { icon: LucideIcon; color?: string; label: string } -> = { - PENDING: { - icon: CircleIcon, - label: 'Não iniciado' - }, - IN_PROGRESS: { - icon: TimerIcon, - color: 'text-blue-400 [&_svg]:text-blue-500', - label: 'Em andamento' - }, - COMPLETED: { - icon: CircleCheckIcon, - color: 'text-green-400 [&_svg]:text-background [&_svg]:fill-green-500', - label: 'Concluído' - }, - FAILED: { - icon: CircleXIcon, - color: 'text-red-400 [&_svg]:text-red-500', - label: 'Reprovado' - }, - CANCELED: { - icon: CircleOffIcon, - color: 'text-orange-400 [&_svg]:text-orange-500', - label: 'Cancelado' - } -} - -export const labels: Record = { - PENDING: 'Não iniciado', - IN_PROGRESS: 'Em andamento', - COMPLETED: 'Concluído', - FAILED: 'Reprovado', - CANCELED: 'Cancelado' -} - -export const sortings: Record = { - created_at: 'Cadastrado em', - started_at: 'Iniciado em', - completed_at: 'Concluído em', - failed_at: 'Reprovado em', - canceled_at: 'Cancelado em' -} - -export const headers = { - id: 'ID', - 'user.name': 'Nome', - 'user.email': 'Email', - 'user.cpf': 'CPF', - 'course.name': 'Curso', - status: 'Status', - progress: 'Progresso', - created_at: 'Cadastrado em', - started_at: 'Iniciado em', - completed_at: 'Concluído em', - failed_at: 'Reprovado em', - canceled_at: 'Cancelado em' -} diff --git a/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/route.tsx index bd1d9ec..5178464 100644 --- a/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/route.tsx +++ b/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/route.tsx @@ -31,8 +31,8 @@ import { import { Kbd } from '@repo/ui/components/ui/kbd' import { createSearch } from '@repo/util/meili' +import { headers, sortings, statuses } from '@repo/ui/routes/enrollments/data' import { columns, type Enrollment } from './columns' -import { headers, sortings, statuses } from './data' export function meta({}: Route.MetaArgs) { return [{ title: 'Matrículas' }] diff --git a/apps/insights.saladeaula.digital/app/routes/_app.payments._index/columns.tsx b/apps/insights.saladeaula.digital/app/routes/_app.payments._index/columns.tsx index 24bd5d6..6848f29 100644 --- a/apps/insights.saladeaula.digital/app/routes/_app.payments._index/columns.tsx +++ b/apps/insights.saladeaula.digital/app/routes/_app.payments._index/columns.tsx @@ -1,5 +1,7 @@ 'use client' +import { columns as columns_, type Order } from '@repo/ui/routes/orders/columns' + import { formatCNPJ, formatCPF } from '@brazilian-utils/brazilian-utils' import { type ColumnDef } from '@tanstack/react-table' @@ -7,23 +9,7 @@ import { Abbr } from '@repo/ui/components/abbr' import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar' import { initials } from '@repo/ui/lib/utils' -// This type is used to define the shape of our data. -// You can use a Zod schema here if you want. -export type Order = { - id: string - total: number - status: 'pending' | 'processing' | 'success' | 'failed' - payment_method: 'PIX' | 'CREDIT_CARD' | 'MANUAL' | 'failed' - name: string -} - -const formatted = new Intl.DateTimeFormat('pt-BR', { - day: '2-digit', - month: '2-digit', - year: 'numeric', - hour: '2-digit', - minute: '2-digit' -}) +export type { Order } export const columns: ColumnDef[] = [ { @@ -65,54 +51,5 @@ export const columns: ColumnDef[] = [ return <> } }, - { - accessorKey: 'payment_method', - header: 'Forma de pag.' - }, - { - accessorKey: 'status', - header: 'Status' - }, - { - accessorKey: 'total', - header: 'Valor total', - cell: ({ row }) => { - const amount = parseFloat(row.getValue('total')) - const formatted = new Intl.NumberFormat('pt-BR', { - style: 'currency', - currency: 'BRL' - }).format(amount) - - return
{formatted}
- } - }, - { - header: 'Comprado em', - cell: ({ row }) => { - const createdAt = new Date(row.original.create_date) - return formatted.format(createdAt) - } - }, - { - header: 'Vencimento em', - cell: ({ row }) => { - try { - const dueDate = new Date(row.original.due_date) - return formatted.format(dueDate) - } catch { - return 'N/A' - } - } - }, - { - header: 'Pago em', - cell: ({ row }) => { - if (row.original.payment_date) { - const createdAt = new Date(row.original.payment_date) - return formatted.format(createdAt) - } - - return <> - } - } + ...columns_ ] diff --git a/apps/insights.saladeaula.digital/app/routes/_app.payments._index/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.payments._index/route.tsx index 2ad7182..86516c5 100644 --- a/apps/insights.saladeaula.digital/app/routes/_app.payments._index/route.tsx +++ b/apps/insights.saladeaula.digital/app/routes/_app.payments._index/route.tsx @@ -1,4 +1,4 @@ -import type { Route } from './+types' +import type { Route } from './+types/route' import { Suspense } from 'react' import { Await } from 'react-router' @@ -16,12 +16,13 @@ export function meta({}: Route.MetaArgs) { export async function loader({ context, request }: Route.LoaderArgs) { const { searchParams } = new URL(request.url) const page = Number(searchParams.get('p')) + 1 + const sort = searchParams.get('sort') || 'create_date:desc' const hitsPerPage = Number(searchParams.get('perPage')) || 25 return { data: createSearch({ index: 'betaeducacao-prod-orders', - sort: ['create_date:desc'], + sort: [sort], page, hitsPerPage, env: context.cloudflare.env diff --git a/apps/insights.saladeaula.digital/app/routes/_app/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app/route.tsx index 0c718c0..ecadd71 100644 --- a/apps/insights.saladeaula.digital/app/routes/_app/route.tsx +++ b/apps/insights.saladeaula.digital/app/routes/_app/route.tsx @@ -40,7 +40,7 @@ export default function Route({ loaderData }: Route.ComponentProps) { px-4 py-2 lg:py-4 sticky top-0 z-5 md:rounded-t-2xl" > -
+
Insights @@ -54,7 +54,7 @@ export default function Route({ loaderData }: Route.ComponentProps) {
-
+
-
{children}
+
+ {children} +
) } diff --git a/apps/saladeaula.digital/app/components/scorm12-player.tsx b/apps/saladeaula.digital/app/components/scorm12-player.tsx deleted file mode 100644 index 60e2ae9..0000000 --- a/apps/saladeaula.digital/app/components/scorm12-player.tsx +++ /dev/null @@ -1,71 +0,0 @@ -'use client' - -import { useEffect, useRef, useState } from 'react' -import { Scorm12API } from 'scorm-again/scorm12' -import { settings, type ScormPlayerProps } from './scorm-player' - -// https://scorm.com/scorm-explained/technical-scorm/run-time/run-time-reference/#section-2 -export function Scorm12Player({ - scormState, - scormContentPath, - className, - onCommit, - setValue -}: ScormPlayerProps) { - const [iframeLoaded, setIframeLoaded] = useState(false) - const scormApiRef = useRef(null) - - useEffect(() => { - const scormApi = new Scorm12API(settings) - scormApi.loadFromFlattenedJSON(scormState) - - scormApi.on('LMSCommit', function () { - onCommit?.(scormApi.renderCommitCMI(true)) - }) - - scormApi.on('LMSSetValue.*', function (element: any, value: any) { - setValue?.(element, value) - }) - - scormApiRef.current = scormApi - window.API = scormApi - setIframeLoaded(true) - - return () => { - scormApiRef.current = null - } - }, []) - - useEffect(() => { - if (!scormApiRef.current) { - return - } - - const scormApi = scormApiRef.current - let unloaded = false - - function unload() { - if (unloaded || scormApi.isTerminated()) { - return false - } - - scormApi.LMSSetValue('cmi.core.exit', 'suspend') - scormApi.LMSCommit() - scormApi.LMSFinish() - - unloaded = true - } - - window.addEventListener('beforeunload', unload) - window.addEventListener('unload', unload) - - return () => { - window.removeEventListener('beforeunload', unload) - window.removeEventListener('unload', unload) - } - }, []) - - if (iframeLoaded) { - return