diff --git a/src/_variables.scss b/src/_variables.scss index e51c0b5..54fd29b 100644 --- a/src/_variables.scss +++ b/src/_variables.scss @@ -2,4 +2,7 @@ --mind-brand-color: #e455df; --mind-brand-darken-color: #bb56df; --mind-brand-color-2: #4376ec; + + --mind-error-color: #e74f4f; + --mind-error-light-color: #faf4f4; } diff --git a/src/admin/page-settings/index.js b/src/admin/page-settings/index.js index 758be45..3950074 100644 --- a/src/admin/page-settings/index.js +++ b/src/admin/page-settings/index.js @@ -3,6 +3,11 @@ */ import './style.scss'; +/** + * External dependencies + */ +import clsx from 'clsx'; + /** * WordPress dependencies */ @@ -15,11 +20,13 @@ import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import isValidOpenAIApiKey from '../../utils/is-valid-openai-api-key'; import { ReactComponent as LoadingIcon } from '../../icons/loading.svg'; export default function PageSettings() { const [pendingSettings, setPendingSettings] = useState({}); const [settingsChanged, setSettingsChanged] = useState(false); + const [isInvalidAPIKey, setIsInvalidAPIKey] = useState(false); const { updateSettings } = useDispatch('mind/settings'); @@ -64,7 +71,13 @@ export default function PageSettings() { -
+
+ {isInvalidAPIKey && ( +
+ {__('Please enter a valid API key', 'mind')} +
+ )}
{error &&
{error}
} @@ -87,7 +105,14 @@ export default function PageSettings() { onClick={(e) => { e.preventDefault(); - updateSettings(pendingSettings); + if ( + isValidOpenAIApiKey(pendingSettings.openai_api_key) + ) { + setIsInvalidAPIKey(false); + updateSettings(pendingSettings); + } else { + setIsInvalidAPIKey(true); + } }} > {__('Save Changes', 'mind')} diff --git a/src/admin/page-settings/style.scss b/src/admin/page-settings/style.scss index 883bf76..7108f01 100644 --- a/src/admin/page-settings/style.scss +++ b/src/admin/page-settings/style.scss @@ -39,15 +39,23 @@ } } } + .mind-admin-settings-card-input-error input { + border-color: var(--mind-error-color); + } } .mind-admin-settings-error { padding: 20px; margin-top: 20px; margin-bottom: -20px; - background-color: #faf4f4; - color: #e74f4f; - border-left: 3px solid #e74f4f; + background-color: var(--mind-error-light-color); + color: var(--mind-error-color); + border-left: 3px solid var(--mind-error-color); +} +.mind-admin-setting-error { + font-size: 12px; + margin-top: 2px; + color: var(--mind-error-color); } .mind-admin-settings-actions { diff --git a/src/utils/is-valid-openai-api-key/index.js b/src/utils/is-valid-openai-api-key/index.js new file mode 100644 index 0000000..13e267e --- /dev/null +++ b/src/utils/is-valid-openai-api-key/index.js @@ -0,0 +1,4 @@ +export default function isValidOpenAIApiKey(apiKey) { + const regex = /^sk-[a-zA-Z0-9]{32,}/; + return regex.test(apiKey); +}