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 74301c7..6e1e8f4 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 @@ -59,7 +59,7 @@ export async function loader({ context, request, params }: Route.LoaderArgs) { export default function Route({ loaderData: { data } }) { return ( - <> + }>

Gestores

@@ -67,52 +67,50 @@ export default function Route({ loaderData: { data } }) {

- }> - - {({ items }) => { - return ( -
- {items.map(({ sk, name, email }: Admin) => { - const [_, id] = sk.split('#') + + {({ items }) => { + return ( +
+ {items.map(({ sk, name, email }: Admin) => { + const [_, id] = sk.split('#') - return ( -
- -
-
-
- - - {initials(name)} - - -
- -
-

- {name} -

-

- {email} -

-
+ /> +
+
+ + + {initials(name)} + +
-
- ) - })} -
- ) - }} -
- - + +
+

+ {name} +

+

+ {email} +

+
+
+ + ) + })} + + ) + }} +
+
) } diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.batch._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.batch._index/route.tsx index c5d0f28..7b03b91 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.batch._index/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.batch._index/route.tsx @@ -34,7 +34,7 @@ export async function loader({ context, request, params }: Route.LoaderArgs) { export default function Route({ loaderData: { data } }) { return ( - <> + }>

Importações de colaboradores @@ -45,31 +45,29 @@ export default function Route({ loaderData: { data } }) {

- }> - - {(resolved) => ( - <> - - - - - - Nenhum importação ainda - - Importe seus colaboradores para gerenciar, segmentar e - facilitar sua gestão. - - - - - - - - )} - - - + + {(resolved) => ( + <> + + + + + + Nenhum importação ainda + + Importe seus colaboradores para gerenciar, segmentar e + facilitar sua gestão. + + + + + + + + )} + +
) } diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.$id._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.$id._index/route.tsx index f007985..5674605 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.$id._index/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.$id._index/route.tsx @@ -27,9 +27,8 @@ export async function loader({ params, request, context }: Route.LoaderArgs) { return { data: enrollment } } -export default function UserModal({ loaderData }: Route.ComponentProps) { +export default function UserModal({}: Route.ComponentProps) { const navigate = useNavigate() - const { enrollment } = loaderData return ( > { + const headers = new Headers({ + Authorization: `KONVIVA ${secretKey}`, + 'Content-Type': 'application/json' + }) + const url = new URL(`/action/api/usuarios/token`, konvivaApi) + url.search = new URLSearchParams({ login: email }).toString() + + const r = await fetch(url.toString(), { method: 'GET', headers }) + + if (!r.ok) { + throw new Error(await r.text()) + } + + return await r.json() } diff --git a/apps/saladeaula.digital/app/routes/payments.tsx b/apps/saladeaula.digital/app/routes/payments.tsx deleted file mode 100644 index 70452e0..0000000 --- a/apps/saladeaula.digital/app/routes/payments.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import type { Route } from './+types' - -import { MeiliSearchFilterBuilder } from 'meilisearch-helper' -import { Await, Link } from 'react-router' - -import { type User } from '@repo/auth/auth' -import { userContext } from '@repo/auth/context' -import { - Breadcrumb, - BreadcrumbItem, - BreadcrumbLink, - BreadcrumbList, - BreadcrumbPage, - BreadcrumbSeparator -} from '@repo/ui/components/ui/breadcrumb' -import { createSearch } from '@repo/util/meili' - -import { Container } from '@/components/container' -import { Skeleton } from '@repo/ui/components/skeleton' -import { Card, CardContent } from '@repo/ui/components/ui/card' -import { Suspense } from 'react' - -export function meta({}: Route.MetaArgs) { - return [{ title: 'Histórico de compras' }] -} - -export const loader = async ({ request, context }: Route.ActionArgs) => { - const user = context.get(userContext) as User - const { searchParams } = new URL(request.url) - const status = searchParams.getAll('status') || [] - let builder = new MeiliSearchFilterBuilder().where('user_id', '=', user.sub) - - if (status.length) { - builder = builder.where('status', 'in', status) - } - - const payments = createSearch({ - index: 'betaeducacao-prod-orders', - filter: builder.build(), - sort: ['create_date:desc'], - env: context.cloudflare.env - }) - - return { - data: payments - } -} - -export default function Component({ loaderData: { data } }) { - return ( - - }> - - {({ hits }) => ( - <> - - - - - Meus cursos - - - - - Histórico de compras - - - - -
-

- Histórico de compras -

-

- Acompanhe todos as compras realizadas, visualize pagamentos e - mantenha o controle financeiro. -

-
- - - - - - - - - - - - - {hits.map(({ payment_method, status }) => { - return ( - - - - - ) - })} - -
Forma de pag.StatusTotalComprador emVencimento em
{payment_method}{status}
-
-
- - )} -
-
-
- ) -} diff --git a/apps/saladeaula.digital/app/routes/payments/columns.tsx b/apps/saladeaula.digital/app/routes/payments/columns.tsx new file mode 100644 index 0000000..8aaa089 --- /dev/null +++ b/apps/saladeaula.digital/app/routes/payments/columns.tsx @@ -0,0 +1,63 @@ +'use client' + +import { + DataTableColumnDatetime, + DataTableColumnCurrency, + DataTableColumnHeader +} from '@repo/ui/components/data-table' +import { type ColumnDef } from '@tanstack/react-table' + +// 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 +} + +export const columns: ColumnDef[] = [ + { + accessorKey: 'payment_method', + header: 'Forma de pag.' + }, + { + accessorKey: 'status', + header: 'Status' + }, + { + accessorKey: 'total', + header: 'Valor total', + cell: ({ row, column }) => ( + + ) + }, + { + accessorKey: 'create_date', + enableSorting: true, + meta: { title: 'Comprado em' }, + header: ({ column }) => , + cell: ({ row, column }) => ( + + ) + }, + { + accessorKey: 'due_date', + enableSorting: true, + meta: { title: 'Vencimento em' }, + header: ({ column }) => , + cell: ({ row, column }) => ( + + ) + }, + { + accessorKey: 'payment_date', + enableSorting: true, + meta: { title: 'Pago em' }, + header: ({ column }) => , + cell: ({ row, column }) => ( + + ) + } +] diff --git a/apps/saladeaula.digital/app/routes/payments/route.tsx b/apps/saladeaula.digital/app/routes/payments/route.tsx new file mode 100644 index 0000000..d8d4fce --- /dev/null +++ b/apps/saladeaula.digital/app/routes/payments/route.tsx @@ -0,0 +1,101 @@ +import type { Route } from '../+types' + +import { MeiliSearchFilterBuilder } from 'meilisearch-helper' +import { Await, Link } from 'react-router' +import { Suspense } from 'react' + +import { type User } from '@repo/auth/auth' +import { userContext } from '@repo/auth/context' +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator +} from '@repo/ui/components/ui/breadcrumb' +import { createSearch } from '@repo/util/meili' +import { Skeleton } from '@repo/ui/components/skeleton' +import { DataTable } from '@repo/ui/components/data-table' + +import { Container } from '@/components/container' +import { columns, type Order } from './columns' + +export function meta({}: Route.MetaArgs) { + return [{ title: 'Histórico de compras' }] +} + +export const loader = async ({ request, context }: Route.ActionArgs) => { + const user = context.get(userContext) as User + const { searchParams } = new URL(request.url) + const status = searchParams.getAll('status') || [] + const sort = searchParams.get('sort') || 'create_date:desc' + const page = Number(searchParams.get('p')) + 1 + const hitsPerPage = Number(searchParams.get('perPage')) || 25 + + let builder = new MeiliSearchFilterBuilder().where('user_id', '=', user.sub) + + if (status.length) { + builder = builder.where('status', 'in', status) + } + + const payments = createSearch({ + index: 'betaeducacao-prod-orders', + filter: builder.build(), + sort: [sort], + page, + hitsPerPage, + env: context.cloudflare.env + }) + + return { + data: payments + } +} + +export default function Component({ loaderData: { data } }) { + return ( + }> + + + + + + Meus cursos + + + + + Histórico de compras + + + + +
+

+ Histórico de compras +

+

+ Acompanhe todos as compras realizadas, visualize pagamentos e + mantenha o controle financeiro. +

+
+ + + {({ hits, page, hitsPerPage, totalHits }) => { + return ( + + ) + }} + +
+
+ ) +} diff --git a/apps/saladeaula.digital/worker-configuration.d.ts b/apps/saladeaula.digital/worker-configuration.d.ts index 7d47a73..5e218b5 100644 --- a/apps/saladeaula.digital/worker-configuration.d.ts +++ b/apps/saladeaula.digital/worker-configuration.d.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// Generated by Wrangler by running `wrangler types` (hash: a901705264ceb3e725e174d55b20e764) +// Generated by Wrangler by running `wrangler types` (hash: 46c0a3878ceeb71c97bee6d456de6815) // Runtime types generated with workerd@1.20251113.0 2025-04-04 nodejs_compat declare namespace Cloudflare { interface GlobalProps { @@ -17,6 +17,7 @@ declare namespace Cloudflare { REDIRECT_URI: string; SESSION_SECRET: string; MEILI_API_KEY: string; + KONVIVA_SECRET_KEY: string; } } interface Env extends Cloudflare.Env {} @@ -24,7 +25,7 @@ type StringifyValues> = { [Binding in keyof EnvType]: EnvType[Binding] extends string ? EnvType[Binding] : string; }; declare namespace NodeJS { - interface ProcessEnv extends StringifyValues> {} + interface ProcessEnv extends StringifyValues> {} } // Begin runtime types