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)
|
|
|
|
);
|
|
|
|
},
|
|
|
|
}));
|