| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- <template>
- <mx-form-item v-model="model[propMobile]" :prop="propMobile" :label="labelMobile"/>
- <mx-form-item v-model="model[propCode]" :prop="propCode" :label="labelCode">
- <template #suffix>
- <mx-count-down :text="labelSend" :validate-block="validateMobile" @click="handleSend"/>
- </template>
- </mx-form-item>
- <code-input-popup ref="popup" @complete="handleComplete"/>
- </template>
- <script setup>
- import {ref} from 'vue';
- import {useInjectFormData} from "@/pages/login/components/hooks/useFormDataInjection";
- import {useInjectFormRef} from "@/pages/login/components/hooks/useFormRefInjection";
- import {useInjectSendSmsFn} from "@/pages/login/components/hooks/useSmsInjection";
- import {useUserStore} from "@/hooks/useUserStore";
- import {toast} from "@/uni_modules/uv-ui-tools/libs/function";
- import {createPropDefine} from "@/utils";
- import CodeInputPopup from "@/pages/login/components/code-input-popup.vue";
- const props = defineProps({
- propMobile: createPropDefine('mobile'),
- propCode: createPropDefine('smsCode'),
- labelMobile: createPropDefine('手机号码'),
- labelCode: createPropDefine('验证码'),
- labelSend: createPropDefine('获取')
- })
- const [model] = useInjectFormData()
- const {form} = useInjectFormRef()
- const {sendSmsFn} = useInjectSendSmsFn()
- // code input
- const popup = ref(null)
- const {isLogin} = useUserStore()
- let codeInputResolve = null, codeInputReject = null
- const validateMobile = async () => {
- form.value.clearValidate()
- await form.value.validate([props.propMobile])
- if (!isLogin.value) {
- popup.value.open()
- return new Promise((resolve, reject) => {
- codeInputResolve = resolve
- codeInputReject = reject
- })
- } else {
- // login state - send directly
- handleComplete({})
- }
- }
- const handleSend = async () => {
- // sendSmsFn() // sendSmsFn move into validateBlock caused by code input
- toast(`${props.labelCode}已发送`)
- }
- const handleComplete = (events) => {
- sendSmsFn(events).then(codeInputResolve).catch(codeInputReject)
- }
- </script>
- <style scoped>
- </style>
|