cosmos-explorer/src/Explorer/useSelectedNode.ts

63 lines
2.1 KiB
TypeScript
Raw Normal View History

2021-06-24 19:56:33 +01:00
import create, { UseStore } from "zustand";
import * as ViewModels from "../Contracts/ViewModels";
2021-07-09 05:32:22 +01:00
import { useTabs } from "../hooks/useTabs";
2021-06-24 19:56:33 +01:00
export interface SelectedNodeState {
selectedNode: ViewModels.TreeNode;
setSelectedNode: (node: ViewModels.TreeNode) => void;
isDatabaseNodeOrNoneSelected: () => boolean;
findSelectedCollection: () => ViewModels.Collection;
isDataNodeSelected: (
databaseId: string,
collectionId?: string,
subnodeKinds?: ViewModels.CollectionTabKind[]
) => boolean;
}
export const useSelectedNode: UseStore<SelectedNodeState> = create((set, get) => ({
selectedNode: undefined,
setSelectedNode: (node: ViewModels.TreeNode) => set({ selectedNode: node }),
isDatabaseNodeOrNoneSelected: (): boolean => {
const selectedNode = get().selectedNode;
return !selectedNode || selectedNode.nodeKind === "Database";
},
findSelectedCollection: (): ViewModels.Collection => {
const selectedNode = get().selectedNode;
return (selectedNode.nodeKind === "Collection" ? selectedNode : selectedNode.collection) as ViewModels.Collection;
},
isDataNodeSelected: (
databaseId: string,
collectionId?: string,
subnodeKinds?: ViewModels.CollectionTabKind[]
): boolean => {
const selectedNode = get().selectedNode;
if (!selectedNode) {
return false;
}
const isNodeSelected = collectionId
? (selectedNode as ViewModels.Collection).databaseId === databaseId && selectedNode.id() === collectionId
: selectedNode.id() === databaseId;
if (!isNodeSelected) {
return false;
}
if (subnodeKinds === undefined || !Array.isArray(subnodeKinds)) {
return true;
}
2021-07-09 05:32:22 +01:00
const activeTab = useTabs.getState().activeTab;
2021-06-24 19:56:33 +01:00
const selectedSubnodeKind = collectionId
? (selectedNode as ViewModels.Collection).selectedSubnodeKind()
: (selectedNode as ViewModels.Database).selectedSubnodeKind();
return (
activeTab &&
subnodeKinds.includes(activeTab.tabKind) &&
selectedSubnodeKind !== undefined &&
subnodeKinds.includes(selectedSubnodeKind)
);
},
}));