Files
czzj-app/src/pages/mine/change-phone/use-change-phone-verify.ts
2026-10-13 16:23:43 +08:00

100 lines
2.8 KiB
TypeScript

import { onShow } from '@dcloudio/uni-app'
import { computed, ref } from 'vue'
import { fetchProfile } from '@/api/profile'
import { useSmsCode } from '@/hooks/use-sms-code'
import { SMS_CODE_SCENE } from '@/types/api'
import { getErrorMessage } from '@/utils/api-error'
import { isValidPhone, isValidSmsCode } from '@/utils/validate'
import { verifyOldPhone } from './change-phone.api'
function maskPhone(phone: string): string {
const digits = phone.replace(/\D/g, '')
if (digits.length < 7) return phone
return digits.replace(/(\d{3})\d{4}(\d+)/, '$1****$2')
}
export function useChangePhoneVerify() {
const phone = ref('')
const code = ref('')
const boundPhone = ref('')
const loading = ref(false)
const { counting, seconds, sendCode } = useSmsCode(SMS_CODE_SCENE.changePhoneOld)
const maskedBoundPhone = computed(() => maskPhone(boundPhone.value))
const subtitle = computed(() => {
const masked = maskedBoundPhone.value
if (!masked) return '请输入该账号绑定的原手机号,完成手机验证'
return `请输入该账号绑定的原手机号${masked},完成手机验证`
})
async function loadBoundPhone() {
try {
const profile = await fetchProfile()
boundPhone.value = profile?.phonenumber || profile?.userName || ''
} catch (err) {
uni.showToast({ title: getErrorMessage(err, '加载账号信息失败'), icon: 'none' })
}
}
function onSendCode() {
sendCode(phone.value)
}
function onUnavailablePhone() {
uni.showModal({
title: '原手机号不可用',
content: '如原手机号已停用,请联系在线客服协助处理。',
confirmText: '联系客服',
success: (res) => {
if (!res.confirm) return
uni.navigateTo({ url: '/pages/mine/support/index' })
},
})
}
async function nextStep() {
if (!isValidPhone(phone.value)) {
uni.showToast({ title: '请输入正确手机号', icon: 'none' })
return
}
if (!isValidSmsCode(code.value)) {
uni.showToast({ title: '请输入验证码', icon: 'none' })
return
}
if (loading.value) return
loading.value = true
try {
const changeToken = await verifyOldPhone({ phone: phone.value, code: code.value })
if (!changeToken) {
uni.showToast({ title: '验证失败,未获取换绑令牌', icon: 'none' })
return
}
uni.navigateTo({
url: `/pages/mine/change-phone/bind/index?changeToken=${encodeURIComponent(changeToken)}`,
})
} catch (err) {
uni.showToast({ title: getErrorMessage(err, '验证失败,请重试'), icon: 'none' })
} finally {
loading.value = false
}
}
onShow(() => {
void loadBoundPhone()
})
return {
phone,
code,
counting,
seconds,
subtitle,
onSendCode,
onUnavailablePhone,
nextStep,
}
}