Files
PicHost/app/composables/useUserAutoDeleteSettings.ts
O96u 22cb2ca8bc release: v1.0.2
Add i18n (zh-CN/en), mobile navigation menus, stats and upload UI
improvements, and Docker reset-password CLI for emergency recovery.
2026-08-23 17:43:42 +08:00

83 lines
2.1 KiB
TypeScript

export function useUserAutoDeleteSettings() {
const { isAuthenticated, handleAuthError } = useAuth()
const toast = useToast()
const { t } = useI18n()
const userSettings = ref<{ autoDeleteDays: number } | null>(null)
const enabled = ref(false)
const daysDraft = ref(30)
const hydrated = ref(false)
const saving = ref(false)
let daysSaveTimer: ReturnType<typeof setTimeout> | null = null
function apply(data: { autoDeleteDays: number }) {
hydrated.value = false
userSettings.value = data
enabled.value = data.autoDeleteDays > 0
daysDraft.value = data.autoDeleteDays > 0 ? data.autoDeleteDays : 30
nextTick(() => {
hydrated.value = true
})
}
async function load() {
try {
const data = await $fetch<{ autoDeleteDays: number }>('/api/user/settings', {
credentials: 'include'
})
apply(data)
} catch (error: unknown) {
handleAuthError(error)
if (isAuthenticated.value) {
toast.add({ title: t('userSettings.loadFailed'), color: 'error' })
}
}
}
async function save() {
if (!isAuthenticated.value || !userSettings.value) return
const days = enabled.value ? daysDraft.value : 0
if (enabled.value && (days < 1 || days > 3650)) return
saving.value = true
try {
const data = await $fetch<{ autoDeleteDays: number }>('/api/user/settings', {
method: 'PATCH',
credentials: 'include',
body: { autoDeleteDays: days }
})
apply(data)
} catch (error: unknown) {
handleAuthError(error)
if (isAuthenticated.value) {
toast.add({ title: t('userSettings.saveFailed'), color: 'error' })
}
} finally {
saving.value = false
}
}
watch(enabled, () => {
if (!hydrated.value) return
void save()
})
watch(daysDraft, () => {
if (!hydrated.value || !enabled.value) return
if (daysSaveTimer) clearTimeout(daysSaveTimer)
daysSaveTimer = setTimeout(() => {
void save()
}, 500)
})
return {
userSettings,
enabled,
daysDraft,
saving,
load
}
}