import { DataTree } from "entities/DataTree/dataTreeFactory"; import { createSelector } from "reselect"; import WidgetFactory from "utils/WidgetFactory"; import { FlattenedWidgetProps } from "widgets/constants"; import { TJSLibrary } from "workers/common/JSLibrary"; import { getDataTree } from "./dataTreeSelectors"; import { getExistingPageNames, selectInstalledLibraries, } from "./entitiesSelector"; import { getErrorForApiName, getErrorForJSObjectName, getIsSavingForApiName, getIsSavingForJSObjectName, } from "./ui"; import { getParentWidget } from "./widgetSelectors"; /** * Selector to return names that are already taken by other api, js objects, pagenames etc. */ export const getUsedActionNames = createSelector( getExistingPageNames, getDataTree, getParentWidget, selectInstalledLibraries, ( pageNames: Record, dataTree: DataTree, parentWidget: FlattenedWidgetProps | undefined, installedLibraries: TJSLibrary[], ) => { const map: Record = {}; // The logic has been copied from Explorer/Entity/Name.tsx Component. // Todo(abhinav): abstraction leak if ( parentWidget && parentWidget.type === WidgetFactory.widgetTypes.TABS_WIDGET ) { Object.values(parentWidget.tabsObj).forEach((tab: any) => { map[tab.label] = true; }); } else { pageNames.forEach((pageName: string) => { map[pageName] = true; }); Object.keys(dataTree).forEach((treeItem: string) => { map[treeItem] = true; }); const libAccessors = ([] as string[]).concat( ...installedLibraries.map((lib) => lib.accessor), ); for (const accessor of libAccessors) { map[accessor] = true; } } return map; }, ); export const getSavingStatusForActionName = createSelector( getIsSavingForApiName, getErrorForApiName, (isSaving: boolean, error: boolean) => ({ isSaving, error, }), ); export const getSavingStatusForJSObjectName = createSelector( getIsSavingForJSObjectName, getErrorForJSObjectName, (isSaving: boolean, error: boolean) => ({ isSaving, error, }), );