import React, { FC, useEffect } from 'react'; import { useAsyncFn } from 'react-use'; import { contextSrv } from 'app/core/core'; import { Role, OrgRole, AccessControlAction } from 'app/types'; import { RolePicker } from './RolePicker'; import { fetchUserRoles, updateUserRoles } from './api'; export interface Props { basicRole: OrgRole; userId: number; orgId?: number; onBasicRoleChange: (newRole: OrgRole) => void; roleOptions: Role[]; disabled?: boolean; basicRoleDisabled?: boolean; apply?: boolean; onApplyRoles?: (newRoles: Role[], userId: number, orgId: number | undefined) => void; pendingRoles?: Role[]; } export const UserRolePicker: FC = ({ basicRole, userId, orgId, onBasicRoleChange, roleOptions, disabled, basicRoleDisabled, apply = false, onApplyRoles, pendingRoles, }) => { const [{ loading, value: appliedRoles = [] }, getUserRoles] = useAsyncFn(async () => { try { if (apply) { if (pendingRoles?.length! > 0) { return pendingRoles; } } if (contextSrv.hasPermission(AccessControlAction.ActionUserRolesList)) { return await fetchUserRoles(userId, orgId); } } catch (e) { // TODO handle error console.error('Error loading options'); } return []; }, [orgId, userId, pendingRoles]); useEffect(() => { // only load roles when there is an Org selected if (orgId) { getUserRoles(); } }, [orgId, getUserRoles, pendingRoles]); const onRolesChange = async (roles: Role[]) => { if (!apply) { await updateUserRoles(roles, userId, orgId); await getUserRoles(); } else if (onApplyRoles) { onApplyRoles(roles, userId, orgId); } }; const canUpdateRoles = contextSrv.hasPermission(AccessControlAction.ActionUserRolesAdd) && contextSrv.hasPermission(AccessControlAction.ActionUserRolesRemove); return ( ); };