|
@@ -22,13 +22,20 @@ type Props = {
|
|
|
onClose: () => void,
|
|
onClose: () => void,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-const AssociateModal = (props: Props): JSX.Element => {
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * AssociateModalSubstance - Presentation component (heavy logic, rendered only when isOpen)
|
|
|
|
|
+ */
|
|
|
|
|
+type AssociateModalSubstanceProps = {
|
|
|
|
|
+ onClose: () => void;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const AssociateModalSubstance = (props: AssociateModalSubstanceProps): JSX.Element => {
|
|
|
|
|
+ const { onClose } = props;
|
|
|
const { t } = useTranslation();
|
|
const { t } = useTranslation();
|
|
|
const { mutate: mutatePersonalExternalAccounts } = useSWRxPersonalExternalAccounts();
|
|
const { mutate: mutatePersonalExternalAccounts } = useSWRxPersonalExternalAccounts();
|
|
|
- const { trigger: associateLdapAccount, isMutating } = useAssociateLdapAccount();
|
|
|
|
|
- const [activeTab, setActiveTab] = useState(1);
|
|
|
|
|
- const { isOpen, onClose } = props;
|
|
|
|
|
|
|
+ const { trigger: associateLdapAccount } = useAssociateLdapAccount();
|
|
|
|
|
|
|
|
|
|
+ const [activeTab, setActiveTab] = useState(1);
|
|
|
const [username, setUsername] = useState('');
|
|
const [username, setUsername] = useState('');
|
|
|
const [password, setPassword] = useState('');
|
|
const [password, setPassword] = useState('');
|
|
|
|
|
|
|
@@ -38,7 +45,6 @@ const AssociateModal = (props: Props): JSX.Element => {
|
|
|
setPassword('');
|
|
setPassword('');
|
|
|
}, [onClose]);
|
|
}, [onClose]);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
const clickAddLdapAccountHandler = useCallback(async() => {
|
|
const clickAddLdapAccountHandler = useCallback(async() => {
|
|
|
try {
|
|
try {
|
|
|
await associateLdapAccount({ username, password });
|
|
await associateLdapAccount({ username, password });
|
|
@@ -50,23 +56,16 @@ const AssociateModal = (props: Props): JSX.Element => {
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
toastError(err);
|
|
toastError(err);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
}, [associateLdapAccount, closeModalHandler, mutatePersonalExternalAccounts, password, t, username]);
|
|
}, [associateLdapAccount, closeModalHandler, mutatePersonalExternalAccounts, password, t, username]);
|
|
|
|
|
|
|
|
- // Memoize event handlers
|
|
|
|
|
const setTabToLdap = useCallback(() => setActiveTab(1), []);
|
|
const setTabToLdap = useCallback(() => setActiveTab(1), []);
|
|
|
const setTabToGithub = useCallback(() => setActiveTab(2), []);
|
|
const setTabToGithub = useCallback(() => setActiveTab(2), []);
|
|
|
const setTabToGoogle = useCallback(() => setActiveTab(3), []);
|
|
const setTabToGoogle = useCallback(() => setActiveTab(3), []);
|
|
|
const handleUsernameChange = useCallback((username: string) => setUsername(username), []);
|
|
const handleUsernameChange = useCallback((username: string) => setUsername(username), []);
|
|
|
const handlePasswordChange = useCallback((password: string) => setPassword(password), []);
|
|
const handlePasswordChange = useCallback((password: string) => setPassword(password), []);
|
|
|
|
|
|
|
|
- // Early return optimization
|
|
|
|
|
- if (!isOpen) {
|
|
|
|
|
- return <></>;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
return (
|
|
return (
|
|
|
- <Modal isOpen={isOpen} toggle={closeModalHandler} size="lg" data-testid="grw-associate-modal">
|
|
|
|
|
|
|
+ <>
|
|
|
<ModalHeader toggle={onClose}>
|
|
<ModalHeader toggle={onClose}>
|
|
|
{ t('admin:user_management.create_external_account') }
|
|
{ t('admin:user_management.create_external_account') }
|
|
|
</ModalHeader>
|
|
</ModalHeader>
|
|
@@ -122,6 +121,19 @@ const AssociateModal = (props: Props): JSX.Element => {
|
|
|
{t('add')}
|
|
{t('add')}
|
|
|
</button>
|
|
</button>
|
|
|
</ModalFooter>
|
|
</ModalFooter>
|
|
|
|
|
+ </>
|
|
|
|
|
+ );
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * AssociateModal - Container component (lightweight, always rendered)
|
|
|
|
|
+ */
|
|
|
|
|
+const AssociateModal = (props: Props): JSX.Element => {
|
|
|
|
|
+ const { isOpen, onClose } = props;
|
|
|
|
|
+
|
|
|
|
|
+ return (
|
|
|
|
|
+ <Modal isOpen={isOpen} toggle={onClose} size="lg" data-testid="grw-associate-modal">
|
|
|
|
|
+ {isOpen && <AssociateModalSubstance onClose={onClose} />}
|
|
|
</Modal>
|
|
</Modal>
|
|
|
);
|
|
);
|
|
|
};
|
|
};
|