You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

113 lines
2.9 KiB

import type { FormInstance, Rule } from 'ant-design-vue/lib/form'
import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface'
import type { Ref } from 'vue'
import { computed, ref, unref } from 'vue'
2 years ago
import { useI18n } from '@/hooks/web/useI18n'
export enum LoginStateEnum {
LOGIN,
REGISTER,
RESET_PASSWORD,
MOBILE,
QR_CODE,
2 years ago
}
const currentState = ref(LoginStateEnum.LOGIN)
// 这里也可以优化
// import { createGlobalState } from '@vueuse/core'
export function useLoginState() {
function setLoginState(state: LoginStateEnum) {
currentState.value = state
}
const getLoginState = computed(() => currentState.value)
function handleBackLogin() {
setLoginState(LoginStateEnum.LOGIN)
}
return { setLoginState, getLoginState, handleBackLogin }
}
2 years ago
export function useFormValid<T extends object = any>(formRef: Ref<FormInstance>) {
2 years ago
const validate = computed(() => {
const form = unref(formRef)
return form?.validate ?? ((_nameList?: NamePath) => Promise.resolve())
})
async function validForm() {
const form = unref(formRef)
if (!form)
return
2 years ago
const data = await form.validate()
return data as T
}
return { validate, validForm }
}
export function useFormRules(formData?: Recordable) {
const { t } = useI18n()
const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')))
const getPasswordFormRule = computed(() => createRule(t('sys.login.passwordPlaceholder')))
const validatePolicy = async (_: RuleObject, value: boolean) => {
return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve()
}
const validateConfirmPassword = (password: string) => {
return async (_: RuleObject, value: string) => {
if (!value)
2 years ago
return Promise.reject(t('sys.login.passwordPlaceholder'))
if (value !== password)
2 years ago
return Promise.reject(t('sys.login.diffPwd'))
2 years ago
return Promise.resolve()
}
}
const getFormRules = computed((): { [k: string]: Rule | Rule[] } => {
const accountFormRule = unref(getAccountFormRule)
const passwordFormRule = unref(getPasswordFormRule)
switch (unref(currentState)) {
// register form rules
case LoginStateEnum.REGISTER:
return {
account: accountFormRule,
password: passwordFormRule,
confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }],
policy: [{ validator: validatePolicy, trigger: 'change' }],
}
// reset password form rules
case LoginStateEnum.RESET_PASSWORD:
return {
account: accountFormRule,
}
// login form rules
default:
return {
account: accountFormRule,
password: passwordFormRule,
2 years ago
}
}
})
return { getFormRules }
}
function createRule(message: string): Rule[] {
2 years ago
return [
{
required: true,
message,
trigger: 'change',
},
]
2 years ago
}