From 3f0f7ec1e116b936686d106f73a711e44052234a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Sat, 17 Jan 2026 23:45:25 -0300 Subject: [PATCH] add subscription to org --- .../app/routes/_.$orgid.scheduled/route.tsx | 77 ++++--- .../_.$orgid.users.$id._index/route.tsx | 190 ++++++++--------- .../_.$orgid.users.$id.emails/route.tsx | 2 +- .../app/routes/_.$orgid.users.add/route.tsx | 149 ++++++------- .../app/routes/_app.orgs.$id._index/route.tsx | 198 ++++++------------ .../routes/_app.orgs.$id.address/route.tsx | 11 + .../_app.orgs.$id.subscription/route.tsx | 123 +++++++++++ .../app/routes/_app.orgs.$id/route.tsx | 123 +++++++++++ .../app/routes/edit.tsx | 34 +-- enrollments-events/template.yaml | 2 +- id.saladeaula.digital/template.yaml | 2 +- orders-events/template.yaml | 2 +- streams-events/template.yaml | 2 +- users-events/template.yaml | 2 +- 14 files changed, 550 insertions(+), 367 deletions(-) create mode 100644 apps/insights.saladeaula.digital/app/routes/_app.orgs.$id.address/route.tsx create mode 100644 apps/insights.saladeaula.digital/app/routes/_app.orgs.$id.subscription/route.tsx create mode 100644 apps/insights.saladeaula.digital/app/routes/_app.orgs.$id/route.tsx diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.scheduled/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.scheduled/route.tsx index 0c0a521..7dd32c3 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.scheduled/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.scheduled/route.tsx @@ -1,6 +1,5 @@ import type { Route } from './+types/route' -import type { MouseEvent, ReactNode } from 'react' import { useRequest, useToggle } from 'ahooks' import { AlertTriangleIcon, @@ -15,44 +14,15 @@ import { RocketIcon, UserIcon } from 'lucide-react' -import { toast } from 'sonner' import { DateTime as LuxonDateTime } from 'luxon' +import type { MouseEvent, ReactNode } from 'react' import { Fragment, Suspense } from 'react' import { Await } from 'react-router' +import { toast } from 'sonner' -import { request as req } from '@repo/util/request' -import { Button } from '@repo/ui/components/ui/button' -import { - Empty, - EmptyContent, - EmptyDescription, - EmptyHeader, - EmptyMedia, - EmptyTitle -} from '@repo/ui/components/ui/empty' -import { Skeleton } from '@repo/ui/components/skeleton' -import { Card, CardContent } from '@repo/ui/components/ui/card' -import { - Item, - ItemActions, - ItemContent, - ItemDescription, - ItemGroup, - ItemMedia, - ItemSeparator, - ItemTitle -} from '@repo/ui/components/ui/item' -import { Link } from 'react-router' -import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar' -import { initials } from '@repo/ui/lib/utils' import { Abbr } from '@repo/ui/components/abbr' -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger -} from '@repo/ui/components/ui/dropdown-menu' +import { DateTime } from '@repo/ui/components/datetime' +import { Skeleton } from '@repo/ui/components/skeleton' import { AlertDialog, AlertDialogAction, @@ -64,17 +34,44 @@ import { AlertDialogTitle, AlertDialogTrigger } from '@repo/ui/components/ui/alert-dialog' +import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar' +import { Button } from '@repo/ui/components/ui/button' +import { Card, CardContent } from '@repo/ui/components/ui/card' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger +} from '@repo/ui/components/ui/dropdown-menu' +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle +} from '@repo/ui/components/ui/empty' +import { + Item, + ItemActions, + ItemContent, + ItemDescription, + ItemGroup, + ItemMedia, + ItemSeparator, + ItemTitle +} from '@repo/ui/components/ui/item' import { Spinner } from '@repo/ui/components/ui/spinner' -import { useParams } from 'react-router' -import { useRevalidator } from 'react-router' -import { DateTime } from '@repo/ui/components/datetime' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@repo/ui/components/ui/tabs' -import { useSearchParams } from 'react-router' +import { initials } from '@repo/ui/lib/utils' +import { request as req } from '@repo/util/request' +import { Link, useParams, useRevalidator, useSearchParams } from 'react-router' export function meta({}: Route.MetaArgs) { return [{ title: 'Matrículas agendadas' }] @@ -442,8 +439,8 @@ function ActionMenu({ sk }: { sk: string }) { - - + {/* + */} diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id._index/route.tsx index cbe1f69..17b99d3 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id._index/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id._index/route.tsx @@ -89,108 +89,104 @@ export default function Route({}: Route.ComponentProps) { return (
- -
- {user?.rate_limit_exceeded && ( - - - Limite diário de atualizações atingido. - - Tente novamente a partir de{' '} - {getDaysRemaining(user.rate_limit_exceeded.ttl)} - - - )} + + {user?.rate_limit_exceeded && ( + + + Limite diário de atualizações atingido. + + Tente novamente a partir de{' '} + {getDaysRemaining(user.rate_limit_exceeded.ttl)} + + + )} - - - Editar colaborador - - Configurar as informações gerais para este colaborador. - - + + + Editar colaborador + + Configurar as informações gerais para este colaborador. + + - -
- ( - - Nome - - - - - - )} - /> + +
+ ( + + Nome + + + + + + )} + /> - ( - - Email - - - - - - Para gerenciar os emails ou trocar o email principal, - use as{' '} - - configurações de emails - - - - - - )} - /> + ( + + Email + + + + + + Para gerenciar os emails ou trocar o email principal, + use as{' '} + + configurações de emails + + + + + + )} + /> - ( - - CPF - - { - onChange(value) - }} - {...props} - /> - - - - )} - /> + ( + + CPF + + { + onChange(value) + }} + {...props} + /> + + + + )} + /> +
-
- -
-
-
-
-
+ + +
) diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.emails/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.emails/route.tsx index a9f932d..4315c36 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.emails/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.emails/route.tsx @@ -83,7 +83,7 @@ export default function Route({ loaderData: { data } }: Route.ComponentProps) { ) })} - + 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 f3e511d..f5ce249 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 @@ -1,7 +1,7 @@ import type { Route } from './+types/route' -import { useEffect } from 'react' import { zodResolver } from '@hookform/resolvers/zod' +import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { PatternFormat } from 'react-number-format' import { Link, useFetcher } from 'react-router' @@ -37,6 +37,7 @@ import { Spinner } from '@repo/ui/components/ui/spinner' import { HttpMethod, request as req } from '@repo/util/request' import { useWorksapce } from '@/components/workspace-switcher' +import { FieldSet } from '@repo/ui/components/ui/field' import { formSchema, type Schema } from './data' export function meta({}: Route.MetaArgs) { @@ -115,7 +116,7 @@ export default function Route({}: Route.ComponentProps) {
- + @@ -126,99 +127,99 @@ export default function Route({}: Route.ComponentProps) { - - ( - - Nome - - - - - - )} - /> - -
+ +
( - Email + Nome - + )} /> +
+ ( + + Email + + + + + + )} + /> + + ( + + + + + + Usar email gerado pela plataforma + + + )} + /> +
+ ( - + name="cpf" + defaultValue="" + render={({ field: { onChange, ref, ...props } }) => ( + + CPF - { + onChange(value) + }} + {...props} /> - - Usar email gerado pela plataforma - + )} /> -
+ - ( - - CPF - - { - onChange(value) - }} - {...props} - /> - - - - )} - /> - -
- -
+
diff --git a/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id._index/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id._index/route.tsx index 719ffc3..de2c102 100644 --- a/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id._index/route.tsx +++ b/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id._index/route.tsx @@ -1,17 +1,8 @@ import type { Route } from './+types/route' import { useForm } from 'react-hook-form' -import { Link } from 'react-router' +import { useOutletContext } from 'react-router' -import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar' -import { - Breadcrumb, - BreadcrumbItem, - BreadcrumbLink, - BreadcrumbList, - BreadcrumbPage, - BreadcrumbSeparator -} from '@repo/ui/components/ui/breadcrumb' import { Button } from '@repo/ui/components/ui/button' import { Card, @@ -30,139 +21,78 @@ import { FormMessage } from '@repo/ui/components/ui/form' import { Input } from '@repo/ui/components/ui/input' -import { initials } from '@repo/ui/lib/utils' -import { request as req } from '@repo/util/request' -import { BadgeCheckIcon } from 'lucide-react' -export function meta() { - return [ - { - title: 'Editar empresa' - } - ] -} - -export async function loader({ params, request, context }: Route.LoaderArgs) { - const r = await req({ - url: `/orgs/${params.id}`, - request, - context - }) - - if (!r.ok) { - throw new Response(null, { status: r.status }) - } - - return { org: await r.json() } as { org: any } -} - -export default function Route({ loaderData: { org } }: Route.ComponentProps) { +export default function Route({}: Route.ComponentProps) { + const { org } = useOutletContext() const form = useForm({ defaultValues: org }) - const { handleSubmit } = form + const { handleSubmit, formState } = form const onSubmit = async () => {} return ( -
- - - - - Empresas - - - - - Editar empresa - - - +
+ + + + + Editar empresa + + + Configurar as informações gerais para esta empresa. + + -
-
-
- {org?.subscription ? ( - - ) : null} + +
+ ( + + Nome + + + + + + )} + /> - - {initials(org.name)} - -
+ ( + + Email + + + + + + )} + /> -
    -
  • {org.name}
  • -
  • - {org.email} -
  • -
-
+ ( + + CNPJ + + + + + + )} + /> + - - - - - - Editar empresa - - - Configurar as informações gerais para esta empresa. - - - - -
- ( - - Nome - - - - - - )} - /> - - ( - - Email - - - - - - )} - /> - - ( - - CNPJ - - - - - - )} - /> - -
- -
-
-
-
- - -
-
+ + + + + ) } diff --git a/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id.address/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id.address/route.tsx new file mode 100644 index 0000000..05c7eef --- /dev/null +++ b/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id.address/route.tsx @@ -0,0 +1,11 @@ +import type { Route } from './+types/route' + +import { Card, CardContent } from '@repo/ui/components/ui/card' + +export default function Route({}: Route.ComponentProps) { + return ( + + address + + ) +} diff --git a/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id.subscription/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id.subscription/route.tsx new file mode 100644 index 0000000..f9c57d6 --- /dev/null +++ b/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id.subscription/route.tsx @@ -0,0 +1,123 @@ +import type { Route } from './+types/route' + +import { useForm } from 'react-hook-form' +import { useOutletContext } from 'react-router' + +import { Button } from '@repo/ui/components/ui/button' +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle +} from '@repo/ui/components/ui/card' +import { FieldGroup, FieldLegend, FieldSet } from '@repo/ui/components/ui/field' +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage +} from '@repo/ui/components/ui/form' +import { Input } from '@repo/ui/components/ui/input' +import { Label } from '@repo/ui/components/ui/label' +import { + NativeSelect, + NativeSelectOption +} from '@repo/ui/components/ui/native-select' +import { RadioGroup, RadioGroupItem } from '@repo/ui/components/ui/radio-group' + +export default function Route({}: Route.ComponentProps) { + const { org } = useOutletContext() + const form = useForm({ defaultValues: org?.subscription }) + const { handleSubmit, formState } = form + + const onSubmit = async (data) => { + console.log(data) + } + + return ( +
+ + + + + Escolha seu plano + + + Escolha o plano que será utilizado para configurar o funcionamento + e os recursos da empresa. + + + + + + + + + +
+ Configurações do plano + + + ( + + Dia para faturar + + + + + + )} + /> + + ( + + Forma de pagamento + + + + Boleto bancário + + + Depósito bancário + + + + + + )} + /> + +
+ + +
+
+
+ + ) +} diff --git a/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id/route.tsx new file mode 100644 index 0000000..a88bc2e --- /dev/null +++ b/apps/insights.saladeaula.digital/app/routes/_app.orgs.$id/route.tsx @@ -0,0 +1,123 @@ +import type { Route } from './+types/route' + +import { + Link, + NavLink, + Outlet, + type ShouldRevalidateFunctionArgs +} from 'react-router' + +import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar' +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator +} from '@repo/ui/components/ui/breadcrumb' +import { Tabs, TabsList, TabsTrigger } from '@repo/ui/components/ui/tabs' +import { initials } from '@repo/ui/lib/utils' +import { request as req } from '@repo/util/request' +import { BadgeCheckIcon } from 'lucide-react' + +const links = [ + { to: '', title: 'Perfil', end: true }, + { to: 'subscription', title: 'Plano' }, + { to: 'address', title: 'Endereço' } +] + +export function meta() { + return [ + { + title: 'Editar empresa' + } + ] +} + +export async function loader({ params, request, context }: Route.LoaderArgs) { + const r = await req({ + url: `/orgs/${params.id}`, + request, + context + }) + + if (!r.ok) { + throw new Response(null, { status: r.status }) + } + + return { org: await r.json() } as { org: any } +} + +export function shouldRevalidate({ + currentParams, + nextParams +}: ShouldRevalidateFunctionArgs) { + return currentParams.id !== nextParams.id +} + +export default function Route({ loaderData: { org } }: Route.ComponentProps) { + return ( +
+ + + + + Empresas + + + + + Editar empresa + + + + +
+
+
+ {org?.subscription ? ( + + ) : null} + + + {initials(org.name)} + +
+ +
    +
  • {org.name}
  • +
  • + {org.email} +
  • +
+
+ + + + {links.map(({ to, title, ...props }, idx) => ( + + {({ isActive }) => ( + + {title} + + )} + + ))} + + + + +
+
+ ) +} diff --git a/apps/studio.saladeaula.digital/app/routes/edit.tsx b/apps/studio.saladeaula.digital/app/routes/edit.tsx index 96bbe9f..30960a4 100644 --- a/apps/studio.saladeaula.digital/app/routes/edit.tsx +++ b/apps/studio.saladeaula.digital/app/routes/edit.tsx @@ -8,7 +8,6 @@ import { Await, useAsyncValue, useFetcher } from 'react-router' import { toast } from 'sonner' import { z } from 'zod' -import { request as req, HttpMethod } from '@repo/util/request' import { Skeleton } from '@repo/ui/components/skeleton' import { Breadcrumb, @@ -33,6 +32,7 @@ import { DropdownMenuItem, DropdownMenuTrigger } from '@repo/ui/components/ui/dropdown-menu' +import { FieldGroup, FieldLegend, FieldSet } from '@repo/ui/components/ui/field' import { Form, FormControl, @@ -51,6 +51,7 @@ import { } from '@repo/ui/components/ui/input-group' import { Spinner } from '@repo/ui/components/ui/spinner' import { Switch } from '@repo/ui/components/ui/switch' +import { HttpMethod, request as req } from '@repo/util/request' const formSchema = z .object({ @@ -211,7 +212,8 @@ function Editing() { Configurar as informações gerais para este curso - + + {givenCert ? ( -
-

Configurações do certificado

+
+ + Configurações do certificado +
)} /> -
+
) : null} )} /> + + - -
- -
) diff --git a/enrollments-events/template.yaml b/enrollments-events/template.yaml index 494547a..ea2b54e 100644 --- a/enrollments-events/template.yaml +++ b/enrollments-events/template.yaml @@ -25,7 +25,7 @@ Globals: Architectures: - x86_64 Layers: - - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:104 + - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:layercake:104 Environment: Variables: TZ: America/Sao_Paulo diff --git a/id.saladeaula.digital/template.yaml b/id.saladeaula.digital/template.yaml index 1059180..212af0f 100644 --- a/id.saladeaula.digital/template.yaml +++ b/id.saladeaula.digital/template.yaml @@ -14,7 +14,7 @@ Globals: Architectures: - x86_64 Layers: - - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:104 + - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:layercake:104 Environment: Variables: TZ: America/Sao_Paulo diff --git a/orders-events/template.yaml b/orders-events/template.yaml index dd1cab8..7bbeaeb 100644 --- a/orders-events/template.yaml +++ b/orders-events/template.yaml @@ -26,7 +26,7 @@ Globals: Architectures: - x86_64 Layers: - - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:104 + - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:layercake:104 Environment: Variables: TZ: America/Sao_Paulo diff --git a/streams-events/template.yaml b/streams-events/template.yaml index 8a9679c..5204fac 100644 --- a/streams-events/template.yaml +++ b/streams-events/template.yaml @@ -8,7 +8,7 @@ Globals: Architectures: - x86_64 Layers: - - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:104 + - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:layercake:104 Environment: Variables: LOG_LEVEL: DEBUG diff --git a/users-events/template.yaml b/users-events/template.yaml index 03db8e2..755f727 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:104 + - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:layercake:104 Environment: Variables: TZ: America/Sao_Paulo