mobile-code-fields.vue 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <template>
  2. <mx-form-item v-model="model[propMobile]" :prop="propMobile" :label="labelMobile"/>
  3. <mx-form-item v-model="model[propCode]" :prop="propCode" :label="labelCode">
  4. <template #suffix>
  5. <mx-count-down :text="labelSend" :validate-block="validateMobile" @click="handleSend"/>
  6. </template>
  7. </mx-form-item>
  8. <code-input-popup ref="popup" @complete="handleComplete"/>
  9. </template>
  10. <script setup>
  11. import {ref} from 'vue';
  12. import {useInjectFormData} from "@/pages/login/components/hooks/useFormDataInjection";
  13. import {useInjectFormRef} from "@/pages/login/components/hooks/useFormRefInjection";
  14. import {useInjectSendSmsFn} from "@/pages/login/components/hooks/useSmsInjection";
  15. import {useUserStore} from "@/hooks/useUserStore";
  16. import {toast} from "@/uni_modules/uv-ui-tools/libs/function";
  17. import {createPropDefine} from "@/utils";
  18. import CodeInputPopup from "@/pages/login/components/code-input-popup.vue";
  19. const props = defineProps({
  20. propMobile: createPropDefine('mobile'),
  21. propCode: createPropDefine('smsCode'),
  22. labelMobile: createPropDefine('手机号码'),
  23. labelCode: createPropDefine('验证码'),
  24. labelSend: createPropDefine('获取')
  25. })
  26. const [model] = useInjectFormData()
  27. const {form} = useInjectFormRef()
  28. const {sendSmsFn} = useInjectSendSmsFn()
  29. // code input
  30. const popup = ref(null)
  31. const {isLogin} = useUserStore()
  32. let codeInputResolve = null, codeInputReject = null
  33. const validateMobile = async () => {
  34. form.value.clearValidate()
  35. await form.value.validate([props.propMobile])
  36. if (!isLogin.value) {
  37. popup.value.open()
  38. return new Promise((resolve, reject) => {
  39. codeInputResolve = resolve
  40. codeInputReject = reject
  41. })
  42. } else {
  43. // login state - send directly
  44. handleComplete({})
  45. }
  46. }
  47. const handleSend = async () => {
  48. // sendSmsFn() // sendSmsFn move into validateBlock caused by code input
  49. toast(`${props.labelCode}已发送`)
  50. }
  51. const handleComplete = (events) => {
  52. sendSmsFn(events).then(codeInputResolve).catch(codeInputReject)
  53. }
  54. </script>
  55. <style scoped>
  56. </style>