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 }
|
||
}
|