1import React, { FC, useEffect } from 'react';
2import { getNavModel } from 'app/core/selectors/navModel';
3import Page from 'app/core/components/Page/Page';
4import { useSelector } from 'react-redux';
5import { StoreState } from 'app/types/store';
6import { LinkButton } from '@grafana/ui';
7import { getBackendSrv } from '@grafana/runtime';
8import { AdminOrgsTable } from './AdminOrgsTable';
9import useAsyncFn from 'react-use/lib/useAsyncFn';
10import { contextSrv } from 'app/core/services/context_srv';
11import { AccessControlAction } from 'app/types';
12
13const deleteOrg = async (orgId: number) => {
14  return await getBackendSrv().delete('/api/orgs/' + orgId);
15};
16
17const getOrgs = async () => {
18  return await getBackendSrv().get('/api/orgs');
19};
20
21const getErrorMessage = (error: any) => {
22  return error?.data?.message || 'An unexpected error happened.';
23};
24
25export const AdminListOrgsPages: FC = () => {
26  const navIndex = useSelector((state: StoreState) => state.navIndex);
27  const navModel = getNavModel(navIndex, 'global-orgs');
28  const [state, fetchOrgs] = useAsyncFn(async () => await getOrgs(), []);
29  const canCreateOrg = contextSrv.hasPermission(AccessControlAction.OrgsCreate);
30
31  useEffect(() => {
32    fetchOrgs();
33  }, [fetchOrgs]);
34
35  return (
36    <Page navModel={navModel}>
37      <Page.Contents>
38        <>
39          <div className="page-action-bar">
40            <div className="page-action-bar__spacer" />
41            <LinkButton icon="plus" href="org/new" disabled={!canCreateOrg}>
42              New org
43            </LinkButton>
44          </div>
45          {state.error && getErrorMessage(state.error)}
46          {state.loading && 'Fetching organizations'}
47          {state.value && (
48            <AdminOrgsTable
49              orgs={state.value}
50              onDelete={(orgId) => {
51                deleteOrg(orgId).then(() => fetchOrgs());
52              }}
53            />
54          )}
55        </>
56      </Page.Contents>
57    </Page>
58  );
59};
60
61export default AdminListOrgsPages;
62