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