mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-01-17 22:46:48 +01:00
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import type { AnyModel, Folder, Workspace } from '@yaakapp-internal/models';
|
|
import { foldersAtom, workspacesAtom } from '@yaakapp-internal/models';
|
|
import { useAtomValue } from 'jotai';
|
|
import { useMemo } from 'react';
|
|
|
|
type ModelAncestor = Folder | Workspace;
|
|
|
|
export function useModelAncestors(m: AnyModel | null) {
|
|
const folders = useAtomValue(foldersAtom);
|
|
const workspaces = useAtomValue(workspacesAtom);
|
|
|
|
return useMemo(() => getModelAncestors(folders, workspaces, m), [folders, workspaces, m]);
|
|
}
|
|
|
|
export function getModelAncestors(
|
|
folders: Folder[],
|
|
workspaces: Workspace[],
|
|
currentModel: AnyModel | null,
|
|
): ModelAncestor[] {
|
|
if (currentModel == null) return [];
|
|
|
|
const parentFolder =
|
|
'folderId' in currentModel && currentModel.folderId
|
|
? folders.find((f) => f.id === currentModel.folderId)
|
|
: null;
|
|
|
|
if (parentFolder != null) {
|
|
return [parentFolder, ...getModelAncestors(folders, workspaces, parentFolder)];
|
|
}
|
|
|
|
const parentWorkspace =
|
|
'workspaceId' in currentModel && currentModel.workspaceId
|
|
? workspaces.find((w) => w.id === currentModel.workspaceId)
|
|
: null;
|
|
|
|
if (parentWorkspace != null) {
|
|
return [parentWorkspace, ...getModelAncestors(folders, workspaces, parentWorkspace)];
|
|
}
|
|
|
|
return [];
|
|
}
|