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 ): Promise => { 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] throw redirect(`/${fallback.id}/main`) } 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() }