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=' '
/>