Files
Aaron Godin 735332570f feat: GroupSync extension UI (#91777)
* feat: supporting code for groupsync extension UI

* Add result of running i18n extraction

* Place the UI behind a feature toggle as well as the license feature

* Also add access checks to route loading of groupsync route with feature toggle

* Add access check on permissions to show External group sync in nav

* fix: New version of multiOrgRoleOptions hook

* Remove OSS route definition

* Apply feedback on nav title
2024-09-19 14:58:11 -05:00

51 lines
1.6 KiB
TypeScript

import { difference } from 'lodash';
import { useState } from 'react';
import { useDeepCompareEffect } from 'react-use';
import useAsync from 'react-use/lib/useAsync';
import { contextSrv } from 'app/core/core';
import { Role, AccessControlAction } from 'app/types';
import { fetchRoleOptions } from './api';
type MultiOrgRoleOptions = Record<number, Role[]>;
export const useRoleOptions = (organizationId: number) => {
const [orgId, setOrgId] = useState(organizationId);
const { value = [] } = useAsync(async () => {
if (contextSrv.licensedAccessControlEnabled() && contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {
return fetchRoleOptions(orgId);
}
return Promise.resolve([]);
}, [orgId]);
return [{ roleOptions: value }, setOrgId] as const;
};
export const useMultiOrgRoleOptions = (orgIDs: number[]): MultiOrgRoleOptions => {
const [orgRoleOptions, setOrgRoleOptions] = useState<MultiOrgRoleOptions>({});
useDeepCompareEffect(() => {
if (!contextSrv.licensedAccessControlEnabled() || !contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {
return;
}
const currentOrgIDs = Object.keys(orgRoleOptions).map((o) => (typeof o === 'number' ? o : parseInt(o, 10)));
const newOrgIDs = difference(orgIDs, currentOrgIDs);
Promise.all(
newOrgIDs.map((orgID) => {
return fetchRoleOptions(orgID).then((roleOptions) => [orgID, roleOptions]);
})
).then((value) => {
setOrgRoleOptions({
...orgRoleOptions,
...Object.fromEntries(value),
});
});
}, [orgIDs]);
return orgRoleOptions;
};