feat(frontend): 增加订阅配额时间判断工具
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
parent
a4884b4e75
commit
af6cdfabcc
@ -1480,6 +1480,7 @@ export interface UserSubscription {
|
|||||||
user_id: number
|
user_id: number
|
||||||
group_id: number
|
group_id: number
|
||||||
status: 'active' | 'expired' | 'revoked'
|
status: 'active' | 'expired' | 'revoked'
|
||||||
|
starts_at: string
|
||||||
daily_usage_usd: number
|
daily_usage_usd: number
|
||||||
weekly_usage_usd: number
|
weekly_usage_usd: number
|
||||||
monthly_usage_usd: number
|
monthly_usage_usd: number
|
||||||
|
|||||||
42
frontend/src/utils/subscriptionQuota.ts
Normal file
42
frontend/src/utils/subscriptionQuota.ts
Normal 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 }
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user