import type { Folder, GrpcRequest, HttpRequest, WebsocketRequest, Workspace, } from "@yaakapp-internal/models"; import { foldersAtom, workspacesAtom } from "@yaakapp-internal/models"; import { atom, useAtomValue } from "jotai"; const ancestorsAtom = atom((get) => [...get(foldersAtom), ...get(workspacesAtom)]); export type AuthenticatedModel = HttpRequest | GrpcRequest | WebsocketRequest | Folder | Workspace; export function useInheritedAuthentication(baseModel: AuthenticatedModel | null) { const parents = useAtomValue(ancestorsAtom); if (baseModel == null) return null; const next = (child: AuthenticatedModel) => { // We hit the top if (child.model === "workspace") { return child.authenticationType == null ? null : child; } // Has valid auth if (child.authenticationType !== null) { return child; } // Recurse up the tree const parent = parents.find((p) => { if (child.folderId) return p.id === child.folderId; return p.id === child.workspaceId; }); // Failed to find parent (should never happen) if (parent == null) { return null; } return next(parent); }; return next(baseModel); }