47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
|
|
// app/composables/usePasswordReset.js
|
|||
|
|
import { useApi } from './useApi'
|
|||
|
|
import { useFlash } from './useFlash'
|
|||
|
|
|
|||
|
|
export function usePasswordReset() {
|
|||
|
|
const api = useApi()
|
|||
|
|
const flash = useFlash()
|
|||
|
|
|
|||
|
|
const sending = useState('pwreset:sending', () => false)
|
|||
|
|
const resetting = useState('pwreset:resetting', () => false)
|
|||
|
|
|
|||
|
|
async function sendResetEmail(email) {
|
|||
|
|
if (sending.value) return
|
|||
|
|
sending.value = true
|
|||
|
|
try {
|
|||
|
|
await api.post('/auth/password/forgot', { email })
|
|||
|
|
// 后端无论邮箱是否存在都返回 ok:true,这里统一提示
|
|||
|
|
flash.success('如果该邮箱存在,我们已发送重置邮件,请查收。')
|
|||
|
|
} catch (e) {
|
|||
|
|
flash.error(e?.data?.detail || e?.message || '发送失败')
|
|||
|
|
} finally {
|
|||
|
|
sending.value = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function submitNewPassword({ token, password, confirmPassword }) {
|
|||
|
|
if (resetting.value) return
|
|||
|
|
resetting.value = true
|
|||
|
|
try {
|
|||
|
|
await api.post('/auth/password/reset', {
|
|||
|
|
token,
|
|||
|
|
password,
|
|||
|
|
confirm_password: confirmPassword,
|
|||
|
|
})
|
|||
|
|
flash.success('密码已重置,请使用新密码登录。')
|
|||
|
|
return true
|
|||
|
|
} catch (e) {
|
|||
|
|
flash.error(e?.data?.detail || e?.message || '重置失败')
|
|||
|
|
return false
|
|||
|
|
} finally {
|
|||
|
|
resetting.value = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return { sending, resetting, sendResetEmail, submitNewPassword }
|
|||
|
|
}
|