AccessTokenScopeSelect.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import React, { useEffect, useState, useMemo } from 'react';
  2. import type { Scope } from '@growi/core/dist/interfaces';
  3. import { SCOPE } from '@growi/core/dist/interfaces';
  4. import type { UseFormRegisterReturn } from 'react-hook-form';
  5. import { extractScopes, getDisabledScopes, parseScopes } from '~/client/util/scope-util';
  6. import { useIsAdmin } from '~/states/context';
  7. import { AccessTokenScopeList } from './AccessTokenScopeList';
  8. /**
  9. * Props for AccessTokenScopeSelect
  10. */
  11. type AccessTokenScopeSelectProps = {
  12. /** React Hook Form's register function for a field named "scopes" */
  13. register: UseFormRegisterReturn<'scopes'>;
  14. selectedScopes: Scope[];
  15. };
  16. /**
  17. * Displays a list of permissions in a recursive, nested checkbox interface.
  18. */
  19. export const AccessTokenScopeSelect: React.FC<AccessTokenScopeSelectProps> = ({ register, selectedScopes }) => {
  20. const [disabledScopes, setDisabledScopes] = useState<Set<Scope>>(new Set());
  21. const isAdmin = useIsAdmin();
  22. const ScopesMap = useMemo(() => parseScopes({ scopes: SCOPE, isAdmin }), [isAdmin]);
  23. const extractedScopes = useMemo(() => extractScopes(ScopesMap), [ScopesMap]);
  24. useEffect(() => {
  25. const disabledSet = getDisabledScopes(selectedScopes, extractedScopes);
  26. setDisabledScopes(disabledSet);
  27. }, [selectedScopes, extractedScopes]);
  28. return (
  29. <div className="border rounded">
  30. <AccessTokenScopeList scopeObject={ScopesMap} register={register} disabledScopes={disabledScopes} />
  31. </div>
  32. );
  33. };