fix worksapce

This commit is contained in:
2026-01-20 15:11:05 -03:00
parent 9aca2bb223
commit 0e036d0d4f
2 changed files with 27 additions and 44 deletions

View File

@@ -14,7 +14,6 @@ export type Workspace = {
id: string id: string
name: string name: string
cnpj: string cnpj: string
email: string
} }
export type WorkspaceContextProps = { export type WorkspaceContextProps = {
@@ -25,6 +24,15 @@ export type WorkspaceContextProps = {
test_mode: boolean test_mode: boolean
} }
type HttpResponse = {
items: {
sk: string
name: string
cnpj: string
}[]
preferred_org_id?: string
}
export const workspaceContext = createContext< export const workspaceContext = createContext<
WorkspaceContextProps & { blocked: boolean } WorkspaceContextProps & { blocked: boolean }
>() >()
@@ -33,7 +41,6 @@ export const workspaceMiddleware = async (
{ params, request, context }: LoaderFunctionArgs, { params, request, context }: LoaderFunctionArgs,
next: () => Promise<Response> next: () => Promise<Response>
): Promise<Response> => { ): Promise<Response> => {
const org_id = params.orgid
const user = context.get(userContext)! const user = context.get(userContext)!
const r = await req({ const r = await req({
@@ -46,17 +53,20 @@ export const workspaceMiddleware = async (
throw new Response(await r.text(), { status: r.status }) throw new Response(await r.text(), { status: r.status })
} }
const { items } = (await r.json()) as { items: { sk: string }[] } const { items, preferred_org_id } = (await r.json()) as HttpResponse
const workspaces = items.map(({ sk, ...props }) => { const workspaces: Workspace[] = items.map(({ sk, name, cnpj }) => {
const [, id] = sk?.split('#') const [, id] = sk.split('#')
return { ...props, id } return { id, name, cnpj }
}) as Workspace[] })
const activeWorkspace = workspaces.find(({ id }) => id === org_id) const activeWorkspace = workspaces.find(({ id }) => id === params.orgid)
if (!activeWorkspace) { if (!activeWorkspace) {
const { id } = workspaces[0] const fallback = preferred_org_id
throw redirect(`/${id}/main`) ? (workspaces.find(({ id }) => id === preferred_org_id) ?? workspaces[0])
: workspaces[0]
throw redirect(`/${fallback.id}/main`)
} }
const org = (await req({ const org = (await req({

View File

@@ -1,40 +1,13 @@
import type { Route } from './+types/route' import type { Route } from './+types/route'
import { redirect } from 'react-router' import { workspaceMiddleware } from '@/middleware/workspace'
import { userContext } from '@repo/auth/context'
import { authMiddleware } from '@repo/auth/middleware/auth' import { authMiddleware } from '@repo/auth/middleware/auth'
import { request as req } from '@repo/util/request'
export const middleware: Route.MiddlewareFunction[] = [authMiddleware] export const middleware: Route.MiddlewareFunction[] = [
authMiddleware,
workspaceMiddleware
]
type Response = { export async function loader({}: Route.ActionArgs) {
items: { sk: string }[] return {}
preferred_org_id?: string
}
export async function loader({ context, request }: Route.ActionArgs) {
const user = context.get(userContext)!
const r = await req({
url: `/users/${user.sub}/orgs`,
request,
context
})
if (!r.ok) {
throw new Response(await r.text(), { status: r.status })
}
const { items = [], preferred_org_id } = (await r.json()) as Response
const { sk } = preferred_org_id
? (items.find((item) => item.sk === `ORG#${preferred_org_id}`) ?? items[0])
: items[0]
if (sk) {
const [_, id] = sk.split('#')
throw redirect(`/${id}/main`)
}
throw new Response(null, { status: 401 })
} }