import { createContext, 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 email: string } export type WorkspaceContextProps = { activeWorkspace: Workspace workspaces: Workspace[] subscription: Subscription | null address: Address | null } export const workspaceContext = createContext< WorkspaceContextProps & { blocked: boolean } >() export const workspaceMiddleware = async ( { params, request, context }: LoaderFunctionArgs, next: () => Promise ): Promise => { const org_id = params.orgid 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 } = (await r.json()) as { items: { sk: string }[] } const workspaces = items.map(({ sk, ...props }) => { const [, id] = sk?.split('#') return { ...props, id } }) as Workspace[] const activeWorkspace = workspaces.find( ({ id }) => id === org_id ) as Workspace 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, blocked: 'subscription_freeze' in org }) return await next() }