diff --git a/src/features/dashboard/components/ApiTokenCard/api-token.card.module.scss b/src/features/dashboard/components/ApiTokenCard/api-token.card.module.scss index dd0b38815..cc65cea86 100644 --- a/src/features/dashboard/components/ApiTokenCard/api-token.card.module.scss +++ b/src/features/dashboard/components/ApiTokenCard/api-token.card.module.scss @@ -8,7 +8,7 @@ flex-direction: column; gap: rem(1); border: 1px solid var(--ifm-color-emphasis-400); - border-radius: rem(0.4); + border-radius: rem(2); padding: rem(1.6); label { diff --git a/src/features/dashboard/components/ApiTokenForm/CreateTokenField/CustomErrors/index.tsx b/src/features/dashboard/components/ApiTokenForm/CreateTokenField/CustomErrors/index.tsx new file mode 100644 index 000000000..17c199260 --- /dev/null +++ b/src/features/dashboard/components/ApiTokenForm/CreateTokenField/CustomErrors/index.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +type TCustomErrors = { + token_name_exists: boolean; + tokens_limit_reached: boolean; + input_value: string; +}; + +const CustomErrors = ({ token_name_exists, tokens_limit_reached, input_value }: TCustomErrors) => { + if (token_name_exists) { + return ( +
+

That name is taken. Choose another.

+
+ ); + } + if (tokens_limit_reached && input_value !== '') { + return ( +
+

You've created the maximum number of tokens.

+
+ ); + } + + return <>; +}; + +export default CustomErrors; diff --git a/src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx b/src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx index bc727ebeb..dfc6ba3b7 100644 --- a/src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx +++ b/src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx @@ -3,6 +3,7 @@ import { Text, Button } from '@deriv/ui'; import styles from '../api-token.form.module.scss'; import useApiToken from '@site/src/hooks/useApiToken'; import { FieldErrorsImpl, UseFormRegisterReturn } from 'react-hook-form'; +import CustomErrors from './CustomErrors'; import TokenCreationDialogSuccess from '../../Dialogs/TokenCreationDialogSuccess'; type TCreateTokenField = { @@ -52,9 +53,13 @@ const CreateTokenField = ({ return token_names; }, [tokens]); - const token_name_exists = getTokenNames.includes(input_value.toLowerCase()); - const disable_button = token_name_exists || Object.keys(errors).length > 0 || input_value === ''; - const error_border_active = token_name_exists || errors.name; + const tokens_limit_reached = tokens.length === 30 && Object.keys(errors).length === 0; + const token_name_exists = + getTokenNames.includes(input_value.toLowerCase()) && Object.keys(errors).length === 0; + const has_custom_errors = token_name_exists || (tokens_limit_reached && input_value !== ''); + const disable_button = + token_name_exists || Object.keys(errors).length > 0 || input_value === '' || has_custom_errors; + const error_border_active = token_name_exists || errors.name || has_custom_errors; useEffect(() => { if (error_border_active) { @@ -79,7 +84,7 @@ const CreateTokenField = ({ type='text' name='name' {...register} - placeholder='Token name' + placeholder=' ' />