diff --git a/src/lib/server_settings.ts b/src/lib/server_settings.ts index 9b272de2..559e1cb1 100644 --- a/src/lib/server_settings.ts +++ b/src/lib/server_settings.ts @@ -1,4 +1,4 @@ -function getServerSetting(key: string): string | number | boolean | undefined | null { +function getServerSetting(key: string): string | number | boolean | Record | undefined | null { const settings = window.EZBOOKKEEPING_SERVER_SETTINGS || {}; return settings[key]; } @@ -31,8 +31,8 @@ export function isDataImportingEnabled(): boolean { return getServerSetting('i') === 1; } -export function getLoginPageTips(): string { - return getServerSetting('lpt') as string; +export function getLoginPageTips(): Record{ + return getServerSetting('lpt') as Record; } export function getMapProvider(): string { diff --git a/src/locales/helpers.ts b/src/locales/helpers.ts index 146ed6e6..fd75a0e6 100644 --- a/src/locales/helpers.ts +++ b/src/locales/helpers.ts @@ -528,6 +528,20 @@ export function useI18n() { return textArray.join(separator); } + function getServerTipContent(tipConfig: Record): string { + if (!tipConfig) { + return ''; + } + + const currentLanguage = getCurrentLanguageTag(); + + if (isString(tipConfig[currentLanguage])) { + return tipConfig[currentLanguage]; + } + + return tipConfig['default'] || ''; + } + function getCurrentLanguageTag(): string { return locale.value; } @@ -1298,6 +1312,7 @@ export function useI18n() { ti: translateIf, te: translateError, joinMultiText, + getServerTipContent, // get current language info getCurrentLanguageTag, getCurrentLanguageInfo, diff --git a/src/views/base/LoginPageBase.ts b/src/views/base/LoginPageBase.ts new file mode 100644 index 00000000..4dc627d0 --- /dev/null +++ b/src/views/base/LoginPageBase.ts @@ -0,0 +1,87 @@ +import { ref, computed } from 'vue'; + +import { useI18n } from '@/locales/helpers.ts'; + +// @ts-expect-error the above file is migrating to ts +import { useRootStore } from '@/stores/index.js'; +import { useSettingsStore } from '@/stores/setting.ts'; +import { useExchangeRatesStore } from '@/stores/exchangeRates.ts'; + +import type { AuthResponse } from '@/models/auth_response.ts'; + +import { getLoginPageTips } from '@/lib/server_settings.ts'; +import { getVersion } from '@/lib/version.ts'; +import { setExpenseAndIncomeAmountColor } from '@/lib/ui/common.ts'; + +export function useLoginPageBase() { + const { getServerTipContent, setLanguage } = useI18n(); + + const rootStore = useRootStore(); + const settingsStore = useSettingsStore(); + const exchangeRatesStore = useExchangeRatesStore(); + + const version = `v${getVersion()}`; + + const username = ref(''); + const password = ref(''); + const passcode = ref(''); + const backupCode = ref(''); + const tempToken = ref(''); + const twoFAVerifyType = ref('passcode'); + + const logining = ref(false); + const verifying = ref(false); + + const inputIsEmpty = computed(() => !username.value || !password.value); + const twoFAInputIsEmpty = computed(() => { + if (twoFAVerifyType.value === 'backupcode') { + return !backupCode.value; + } else { + return !passcode.value; + } + }); + + const tips = computed(() => getServerTipContent(getLoginPageTips())); + + function changeLanguage(locale: string): void { + const localeDefaultSettings = setLanguage(locale); + settingsStore.updateLocalizedDefaultSettings(localeDefaultSettings); + } + + function doAfterLogin(authResponse: AuthResponse): void { + if (authResponse.user) { + const localeDefaultSettings = setLanguage(authResponse.user.language); + settingsStore.updateLocalizedDefaultSettings(localeDefaultSettings); + + setExpenseAndIncomeAmountColor(authResponse.user.expenseAmountColor, authResponse.user.incomeAmountColor); + } + + if (settingsStore.appSettings.autoUpdateExchangeRatesData) { + exchangeRatesStore.getLatestExchangeRates({ silent: true, force: false }); + } + + if (authResponse.notificationContent) { + rootStore.setNotificationContent(authResponse.notificationContent); + } + } + + return { + // constants + version, + // states + username, + password, + passcode, + backupCode, + tempToken, + twoFAVerifyType, + logining, + verifying, + inputIsEmpty, + twoFAInputIsEmpty, + tips, + // functions + changeLanguage, + doAfterLogin + } +} diff --git a/src/views/desktop/LoginPage.vue b/src/views/desktop/LoginPage.vue index e02a3acf..30585441 100644 --- a/src/views/desktop/LoginPage.vue +++ b/src/views/desktop/LoginPage.vue @@ -2,8 +2,8 @@
@@ -22,8 +22,8 @@
-

{{ $t('Welcome to ezBookkeeping') }}

-

{{ $t('Please log in with your ezBookkeeping account') }}

+

{{ tt('Welcome to ezBookkeeping') }}

+

{{ tt('Please log in with your ezBookkeeping account') }}

{{ tips }}

@@ -36,11 +36,11 @@ autocomplete="username" autofocus="autofocus" :disabled="show2faInput || logining || verifying" - :label="$t('Username')" - :placeholder="$t('Your username or email')" + :label="tt('Username')" + :placeholder="tt('Your username or email')" v-model="username" @input="tempToken = ''" - @keyup.enter="$refs.passwordInput.focus()" + @keyup.enter="passwordInput?.focus()" /> @@ -50,8 +50,8 @@ ref="passwordInput" type="password" :disabled="show2faInput || logining || verifying" - :label="$t('Password')" - :placeholder="$t('Your password')" + :label="tt('Password')" + :placeholder="tt('Your password')" v-model="password" @input="tempToken = ''" @keyup.enter="login" @@ -64,8 +64,8 @@ autocomplete="one-time-code" ref="passcodeInput" :disabled="logining || verifying" - :label="$t('Passcode')" - :placeholder="$t('Passcode')" + :label="tt('Passcode')" + :placeholder="tt('Passcode')" :append-inner-icon="icons.backupCode" v-model="passcode" @click:append-inner="twoFAVerifyType = 'backupcode'" @@ -75,8 +75,8 @@
- {{ $t('Use on Mobile Device') }} + {{ tt('Use on Mobile Device') }} - {{ $t('Forget Password?') }} + :class="{'disabled': !isUserForgetPasswordEnabled()}"> + {{ tt('Forget Password?') }}
@@ -101,21 +101,21 @@ - {{ $t('Log In') }} + {{ tt('Log In') }} - {{ $t('Continue') }} + {{ tt('Continue') }} - {{ $t('Don\'t have an account?') }} + {{ tt('Don\'t have an account?') }} - {{ $t('Create an account') }} + :class="{'disabled': !isUserRegistrationEnabled()}"> + {{ tt('Create an account') }} @@ -167,222 +167,160 @@
- diff --git a/src/views/mobile/LoginPage.vue b/src/views/mobile/LoginPage.vue index 477119d4..d5e16523 100644 --- a/src/views/mobile/LoginPage.vue +++ b/src/views/mobile/LoginPage.vue @@ -1,8 +1,8 @@ -