diff --git a/app/javascript/dashboard/api/mfa.js b/app/javascript/dashboard/api/mfa.js
new file mode 100644
index 000000000..c18bea3e9
--- /dev/null
+++ b/app/javascript/dashboard/api/mfa.js
@@ -0,0 +1,28 @@
+/* global axios */
+import ApiClient from './ApiClient';
+
+class MfaAPI extends ApiClient {
+ constructor() {
+ super('profile/mfa', { accountScoped: false });
+ }
+
+ enable() {
+ return axios.post(`${this.url}`);
+ }
+
+ verify(otpCode) {
+ return axios.post(`${this.url}/verify`, { otp_code: otpCode });
+ }
+
+ disable(password, otpCode) {
+ return axios.delete(this.url, {
+ data: { password, otp_code: otpCode },
+ });
+ }
+
+ regenerateBackupCodes(otpCode) {
+ return axios.post(`${this.url}/backup_codes`, { otp_code: otpCode });
+ }
+}
+
+export default new MfaAPI();
diff --git a/app/javascript/dashboard/components-next/input/Input.vue b/app/javascript/dashboard/components-next/input/Input.vue
index 71964b4f8..561f98ffe 100644
--- a/app/javascript/dashboard/components-next/input/Input.vue
+++ b/app/javascript/dashboard/components-next/input/Input.vue
@@ -116,6 +116,7 @@ onMounted(() => {
+ {{ $t('MFA_VERIFICATION.DESCRIPTION') }} +
++ {{ $t('MFA_VERIFICATION.HELP_TEXT') }} +
++ {{ $t('MFA_SETTINGS.MANAGEMENT.BACKUP_CODES_DESC') }} +
+ ++ {{ $t('MFA_SETTINGS.MANAGEMENT.DISABLE_MFA_DESC') }} +
+ ++ {{ $t('MFA_SETTINGS.SUBTITLE') }} +
++ {{ $t('MFA_SETTINGS.DESCRIPTION') }} +
++ {{ $t('MFA_SETTINGS.SETUP.STEP1_DESCRIPTION') }} +
++ {{ $t('MFA_SETTINGS.BACKUP.DESCRIPTION') }} +
++ {{ $t('MFA_SETTINGS.BACKUP.IMPORTANT') }} + {{ $t('MFA_SETTINGS.BACKUP.IMPORTANT_NOTE') }} +
++ {{ $t('MFA_SETTINGS.ENHANCE_SECURITY_DESC') }} +
+ ++ {{ $t('MFA_SETTINGS.STATUS_ENABLED_DESC') }} +
+