import { reactive, ref } from 'vue' import { adminAPI } from '@/api/admin' import { QUOTA_THRESHOLD_TYPE_FIXED, type QuotaThresholdType } from '@/constants/account' export const QUOTA_NOTIFY_DIMS = ['daily', 'weekly', 'total'] as const export type QuotaNotifyDim = (typeof QUOTA_NOTIFY_DIMS)[number] interface DimState { enabled: boolean | null threshold: number | null thresholdType: QuotaThresholdType | null } export function useQuotaNotifyState() { const globalEnabled = ref(false) const state = reactive>({ daily: { enabled: null, threshold: null, thresholdType: null }, weekly: { enabled: null, threshold: null, thresholdType: null }, total: { enabled: null, threshold: null, thresholdType: null }, }) function loadGlobalState() { adminAPI.settings .getSettings() .then((settings) => { globalEnabled.value = settings.account_quota_notify_enabled === true }) .catch(() => { globalEnabled.value = false }) } function loadFromExtra(extra: Record | null | undefined) { for (const d of QUOTA_NOTIFY_DIMS) { state[d].enabled = (extra?.[`quota_notify_${d}_enabled`] as boolean) ?? null state[d].threshold = (extra?.[`quota_notify_${d}_threshold`] as number) ?? null state[d].thresholdType = (extra?.[`quota_notify_${d}_threshold_type`] as QuotaThresholdType) ?? null } } function writeToExtra(extra: Record, mode: 'create' | 'update') { for (const d of QUOTA_NOTIFY_DIMS) { const s = state[d] if (s.enabled) { extra[`quota_notify_${d}_enabled`] = true if (s.threshold != null) { extra[`quota_notify_${d}_threshold`] = s.threshold } else if (mode === 'update') { delete extra[`quota_notify_${d}_threshold`] } extra[`quota_notify_${d}_threshold_type`] = s.thresholdType || QUOTA_THRESHOLD_TYPE_FIXED } else if (mode === 'update') { delete extra[`quota_notify_${d}_enabled`] delete extra[`quota_notify_${d}_threshold`] delete extra[`quota_notify_${d}_threshold_type`] } } } function reset() { for (const d of QUOTA_NOTIFY_DIMS) { state[d].enabled = null state[d].threshold = null state[d].thresholdType = null } } return { globalEnabled, state, loadGlobalState, loadFromExtra, writeToExtra, reset } }