2025-12-11 14:28:02 +09:00
|
|
|
"use client"
|
|
|
|
|
|
2025-12-23 18:36:27 +09:00
|
|
|
import { useCallback } from "react"
|
2025-12-11 14:28:02 +09:00
|
|
|
import { toast } from "sonner"
|
|
|
|
|
import { QuotaLimitToast } from "@/components/quota-limit-toast"
|
2025-12-22 19:30:20 +05:30
|
|
|
import { useDictionary } from "@/hooks/use-dictionary"
|
|
|
|
|
import { formatMessage } from "@/lib/i18n/utils"
|
2025-12-11 14:28:02 +09:00
|
|
|
|
|
|
|
|
export interface QuotaConfig {
|
|
|
|
|
dailyRequestLimit: number
|
|
|
|
|
dailyTokenLimit: number
|
|
|
|
|
tpmLimit: number
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-12-23 18:36:27 +09:00
|
|
|
* Hook for displaying quota limit toasts.
|
|
|
|
|
* Server-side handles actual quota enforcement via DynamoDB.
|
|
|
|
|
* This hook only provides UI feedback when limits are exceeded.
|
2025-12-11 14:28:02 +09:00
|
|
|
*/
|
|
|
|
|
export function useQuotaManager(config: QuotaConfig): {
|
|
|
|
|
showQuotaLimitToast: () => void
|
|
|
|
|
showTokenLimitToast: (used: number) => void
|
|
|
|
|
showTPMLimitToast: () => void
|
|
|
|
|
} {
|
|
|
|
|
const { dailyRequestLimit, dailyTokenLimit, tpmLimit } = config
|
2025-12-22 19:30:20 +05:30
|
|
|
const dict = useDictionary()
|
|
|
|
|
|
2025-12-11 14:28:02 +09:00
|
|
|
// Show quota limit toast (request-based)
|
|
|
|
|
const showQuotaLimitToast = useCallback(() => {
|
|
|
|
|
toast.custom(
|
|
|
|
|
(t) => (
|
|
|
|
|
<QuotaLimitToast
|
|
|
|
|
used={dailyRequestLimit}
|
|
|
|
|
limit={dailyRequestLimit}
|
|
|
|
|
onDismiss={() => toast.dismiss(t)}
|
|
|
|
|
/>
|
|
|
|
|
),
|
|
|
|
|
{ duration: 15000 },
|
|
|
|
|
)
|
|
|
|
|
}, [dailyRequestLimit])
|
|
|
|
|
|
|
|
|
|
// Show token limit toast
|
|
|
|
|
const showTokenLimitToast = useCallback(
|
|
|
|
|
(used: number) => {
|
|
|
|
|
toast.custom(
|
|
|
|
|
(t) => (
|
|
|
|
|
<QuotaLimitToast
|
|
|
|
|
type="token"
|
|
|
|
|
used={used}
|
|
|
|
|
limit={dailyTokenLimit}
|
|
|
|
|
onDismiss={() => toast.dismiss(t)}
|
|
|
|
|
/>
|
|
|
|
|
),
|
|
|
|
|
{ duration: 15000 },
|
|
|
|
|
)
|
|
|
|
|
},
|
|
|
|
|
[dailyTokenLimit],
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Show TPM limit toast
|
|
|
|
|
const showTPMLimitToast = useCallback(() => {
|
|
|
|
|
const limitDisplay =
|
|
|
|
|
tpmLimit >= 1000 ? `${tpmLimit / 1000}k` : String(tpmLimit)
|
2025-12-22 19:30:20 +05:30
|
|
|
const message = formatMessage(dict.quota.tpmMessageDetailed, {
|
|
|
|
|
limit: limitDisplay,
|
|
|
|
|
seconds: 60,
|
|
|
|
|
})
|
|
|
|
|
toast.error(message, { duration: 8000 })
|
|
|
|
|
}, [tpmLimit, dict])
|
2025-12-11 14:28:02 +09:00
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
showQuotaLimitToast,
|
|
|
|
|
showTokenLimitToast,
|
|
|
|
|
showTPMLimitToast,
|
|
|
|
|
}
|
|
|
|
|
}
|