Files
yaak/src-web/hooks/useEnvironmentVariables.ts
Gregory Schier b4a1c418bb Run oxfmt across repo, add format script and docs
Add .oxfmtignore to skip generated bindings and wasm-pack output.
Add npm format script, update DEVELOPMENT.md for Vite+ toolchain,
and format all non-generated files with oxfmt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:15:49 -07:00

67 lines
2.7 KiB
TypeScript

import type { Environment, EnvironmentVariable } from "@yaakapp-internal/models";
import { foldersAtom } from "@yaakapp-internal/models";
import { useAtomValue } from "jotai";
import { useMemo } from "react";
import { jotaiStore } from "../lib/jotai";
import { isBaseEnvironment, isFolderEnvironment } from "../lib/model_util";
import { useActiveEnvironment } from "./useActiveEnvironment";
import { useActiveRequest } from "./useActiveRequest";
import { useEnvironmentsBreakdown } from "./useEnvironmentsBreakdown";
import { useParentFolders } from "./useParentFolders";
export function useEnvironmentVariables(targetEnvironmentId: string | null) {
const { baseEnvironment, folderEnvironments, allEnvironments } = useEnvironmentsBreakdown();
const activeEnvironment = useActiveEnvironment();
const targetEnvironment = allEnvironments.find((e) => e.id === targetEnvironmentId) ?? null;
const activeRequest = useActiveRequest();
const folders = useAtomValue(foldersAtom);
const activeFolder = folders.find((f) => f.id === targetEnvironment?.parentId) ?? null;
const parentFolders = useParentFolders(activeFolder ?? activeRequest);
return useMemo(() => {
const varMap: Record<string, WrappedEnvironmentVariable> = {};
const folderVariables = parentFolders.flatMap((f) =>
wrapVariables(folderEnvironments.find((fe) => fe.parentId === f.id) ?? null),
);
// Add active environment variables to everything except sub environments
const activeEnvironmentVariables =
targetEnvironment == null || // Editing request
isFolderEnvironment(targetEnvironment) || // Editing folder variables
isBaseEnvironment(targetEnvironment) // Editing global variables
? wrapVariables(activeEnvironment)
: wrapVariables(targetEnvironment); // Add own variables for sub environments
const allVariables = [
...folderVariables,
...activeEnvironmentVariables,
...wrapVariables(baseEnvironment),
];
for (const v of allVariables) {
if (!v.variable.enabled || !v.variable.name || v.variable.name in varMap) {
continue;
}
varMap[v.variable.name] = v;
}
return Object.values(varMap);
}, [activeEnvironment, baseEnvironment, folderEnvironments, parentFolders, targetEnvironment]);
}
export interface WrappedEnvironmentVariable {
variable: EnvironmentVariable;
environment: Environment;
source: string;
}
function wrapVariables(e: Environment | null): WrappedEnvironmentVariable[] {
if (e == null) return [];
const folders = jotaiStore.get(foldersAtom);
return e.variables.map((v) => {
const folder = e.parentModel === "folder" ? folders.find((f) => f.id === e.parentId) : null;
const source = folder?.name ?? e.name;
return { variable: v, environment: e, source };
});
}