Files
saladeaula.digital/apps/admin.saladeaula.digital/app/middleware/workspace.ts
2026-01-20 15:21:42 -03:00

94 lines
2.2 KiB
TypeScript

import { createContext, redirect, type LoaderFunctionArgs } from 'react-router'
import { userContext } from '@repo/auth/context'
import { request as req } from '@repo/util/request'
import type { Address } from '@/routes/_.$orgid.enrollments.buy/review'
export type Subscription = {
billing_day: number
payment_method: 'PIX' | 'BANK_SLIP' | 'MANUAL'
}
export type Workspace = {
id: string
name: string
cnpj: string
}
export type WorkspaceContextProps = {
activeWorkspace: Workspace
workspaces: Workspace[]
subscription: Subscription | null
address: Address | null
test_mode: boolean
}
type HttpResponse = {
items: {
sk: string
name: string
cnpj: string
}[]
preferred_org_id?: string
}
export const workspaceContext = createContext<
WorkspaceContextProps & { blocked: boolean }
>()
export const workspaceMiddleware = async (
{ params, request, context }: LoaderFunctionArgs,
next: () => Promise<Response>
): Promise<Response> => {
const url = new URL(request.url)
const user = context.get(userContext)!
const r = await req({
url: `/users/${user.sub}/orgs?limit=25`,
request,
context
})
if (!r.ok) {
throw new Response(await r.text(), { status: r.status })
}
const { items, preferred_org_id } = (await r.json()) as HttpResponse
const workspaces: Workspace[] = items.map(({ sk, name, cnpj }) => {
const [, id] = sk.split('#')
return { id, name, cnpj }
})
const activeWorkspace = workspaces.find(({ id }) => id === params.orgid)
if (!activeWorkspace) {
const fallback = preferred_org_id
? (workspaces.find(({ id }) => id === preferred_org_id) ?? workspaces[0])
: workspaces[0]
if (!fallback) {
throw new Response(null, { status: 403 })
}
throw redirect(`/${fallback.id}${url.pathname}`)
}
const org = (await req({
url: `/orgs/${activeWorkspace.id}`,
request,
context
}).then((r) => r.json())) as any
context.set(workspaceContext, {
activeWorkspace,
workspaces,
subscription: org?.['subscription'] || null,
address: org?.['address'] || null,
test_mode: 'test_mode' in org,
blocked: 'subscription_frozen' in org
})
return await next()
}