Merge pull request #2557 from Arron196/fix/issue-2542-daily-card-expiry-mode

fix: 修复日卡跨日重复刷新额度
This commit is contained in:
Wesley Liddick
2026-05-19 14:53:22 +08:00
committed by GitHub
11 changed files with 451 additions and 78 deletions
+42
View File
@@ -0,0 +1,42 @@
import type { UserSubscription } from '@/types'
const ONE_DAY_MS = 24 * 60 * 60 * 1000
export interface RemainingDurationParts {
days: number
hours: number
minutes: number
}
export function isOneTimeDailyQuota(
subscription: Pick<UserSubscription, 'starts_at' | 'expires_at'>
): boolean {
if (!subscription.starts_at || !subscription.expires_at) return false
const startsAt = new Date(subscription.starts_at).getTime()
const expiresAt = new Date(subscription.expires_at).getTime()
if (!Number.isFinite(startsAt) || !Number.isFinite(expiresAt)) return false
return expiresAt <= startsAt + ONE_DAY_MS
}
export function getRemainingDurationParts(
targetAt: Date | string,
now: Date = new Date()
): RemainingDurationParts | null {
const targetTime = targetAt instanceof Date ? targetAt.getTime() : new Date(targetAt).getTime()
const nowTime = now.getTime()
if (!Number.isFinite(targetTime) || !Number.isFinite(nowTime)) return null
const diffMs = targetTime - nowTime
if (diffMs <= 0) return null
const totalMinutes = Math.floor(diffMs / (1000 * 60))
const days = Math.floor(totalMinutes / (24 * 60))
const hours = Math.floor((totalMinutes % (24 * 60)) / 60)
const minutes = totalMinutes % 60
return { days, hours, minutes }
}