码桶
发现社区成员的开源项目
panel.ts2.8 KB
import { defineStore } from 'pinia'
import { ref } from 'vue'
export const usePanelStore = defineStore('panel', () => {
let dailyUsageSaveTimer: ReturnType<typeof setTimeout> | null = null
let dailyUsageDate = ''
const isRunning = ref(false)
const isChecking = ref(false)
const bytesUsed = ref(0)
const speed = ref(0)
const speedBit = ref(0)
const runTimeStamp = ref(0)
const runTimeShow = ref('00s')
const lastError = ref('')
const lastWarning = ref('')
const dailyBytesUsed = ref(0)
const dailyLimitReached = ref(false)
const show = ref({
allUsed: '-',
speed: '-',
speedBit: '-',
})
const predict = ref({
min: '-',
hour: '-',
day: '-',
mon: '-',
})
function todayKey() {
const now = new Date()
const month = String(now.getMonth() + 1).padStart(2, '0')
const day = String(now.getDate()).padStart(2, '0')
return `${now.getFullYear()}-${month}-${day}`
}
function persistDailyUsage() {
dailyUsageDate = todayKey()
localStorage.setItem('dailyUsage', JSON.stringify({ date: dailyUsageDate, bytes: dailyBytesUsed.value }))
}
function scheduleDailyUsageSave() {
if (dailyUsageSaveTimer) return
dailyUsageSaveTimer = setTimeout(() => {
dailyUsageSaveTimer = null
persistDailyUsage()
}, 250)
}
function loadDailyUsage() {
const today = todayKey()
dailyUsageDate = today
const stored = localStorage.getItem('dailyUsage')
if (stored) {
try {
const parsed = JSON.parse(stored)
if (parsed.date === today) {
dailyBytesUsed.value = parsed.bytes
return
}
} catch {}
}
dailyBytesUsed.value = 0
dailyLimitReached.value = false
}
function addDailyUsage(bytes: number) {
const today = todayKey()
if (dailyUsageDate !== today) {
dailyUsageDate = today
dailyBytesUsed.value = 0
}
dailyBytesUsed.value += bytes
scheduleDailyUsageSave()
}
function syncDailyUsage(serverBytes: number) {
if (serverBytes > dailyBytesUsed.value) {
dailyBytesUsed.value = serverBytes
persistDailyUsage()
}
}
function reset() {
bytesUsed.value = 0
speed.value = 0
speedBit.value = 0
runTimeStamp.value = 0
runTimeShow.value = '00s'
show.value = { allUsed: '-', speed: '-', speedBit: '-' }
predict.value = { min: '-', hour: '-', day: '-', mon: '-' }
lastError.value = ''
lastWarning.value = ''
}
function resetTraffic() {
bytesUsed.value = 0
show.value = {
...show.value,
allUsed: '-',
}
}
loadDailyUsage()
return { isRunning, isChecking, bytesUsed, speed, speedBit, runTimeStamp, runTimeShow, show, predict, lastError, lastWarning, dailyBytesUsed, dailyLimitReached, addDailyUsage, syncDailyUsage, loadDailyUsage, resetTraffic, reset }
})