1import { useMemo } from 'react'; 2import { useLocation } from 'react-router-dom'; 3import { PluginIncludeType, PluginType } from '@grafana/data'; 4import { CatalogPlugin, PluginDetailsTab, PluginTabIds, PluginTabLabels } from '../types'; 5import { usePluginConfig } from '../hooks/usePluginConfig'; 6import { isOrgAdmin } from '../permissions'; 7 8type ReturnType = { 9 error: Error | undefined; 10 loading: boolean; 11 tabs: PluginDetailsTab[]; 12 defaultTab: string; 13}; 14 15export const usePluginDetailsTabs = (plugin?: CatalogPlugin, defaultTabs: PluginDetailsTab[] = []): ReturnType => { 16 const { loading, error, value: pluginConfig } = usePluginConfig(plugin); 17 const isPublished = Boolean(plugin?.isPublished); 18 const { pathname } = useLocation(); 19 20 const [tabs, defaultTab] = useMemo(() => { 21 const canConfigurePlugins = isOrgAdmin(); 22 const tabs: PluginDetailsTab[] = [...defaultTabs]; 23 let defaultTab; 24 25 if (isPublished) { 26 tabs.push({ 27 label: PluginTabLabels.VERSIONS, 28 icon: 'history', 29 id: PluginTabIds.VERSIONS, 30 href: `${pathname}?page=${PluginTabIds.VERSIONS}`, 31 }); 32 } 33 34 // Not extending the tabs with the config pages if the plugin is not installed 35 if (!pluginConfig) { 36 defaultTab = PluginTabIds.OVERVIEW; 37 return [tabs, defaultTab]; 38 } 39 40 if (canConfigurePlugins) { 41 if (pluginConfig.meta.type === PluginType.app) { 42 if (pluginConfig.angularConfigCtrl) { 43 tabs.push({ 44 label: 'Config', 45 icon: 'cog', 46 id: PluginTabIds.CONFIG, 47 href: `${pathname}?page=${PluginTabIds.CONFIG}`, 48 }); 49 defaultTab = PluginTabIds.CONFIG; 50 } 51 52 if (pluginConfig.configPages) { 53 for (const page of pluginConfig.configPages) { 54 tabs.push({ 55 label: page.title, 56 icon: page.icon, 57 id: page.id, 58 href: `${pathname}?page=${page.id}`, 59 }); 60 if (!defaultTab) { 61 defaultTab = page.id; 62 } 63 } 64 } 65 66 if (pluginConfig.meta.includes?.find((include) => include.type === PluginIncludeType.dashboard)) { 67 tabs.push({ 68 label: 'Dashboards', 69 icon: 'apps', 70 id: PluginTabIds.DASHBOARDS, 71 href: `${pathname}?page=${PluginTabIds.DASHBOARDS}`, 72 }); 73 } 74 } 75 } 76 77 if (!defaultTab) { 78 defaultTab = PluginTabIds.OVERVIEW; 79 } 80 81 return [tabs, defaultTab]; 82 }, [pluginConfig, defaultTabs, pathname, isPublished]); 83 84 return { 85 error, 86 loading, 87 tabs, 88 defaultTab, 89 }; 90}; 91