'use client'; import { useAuthRateLimit, formatCharCount } from '@/contexts/AuthRateLimitContext'; import { useFeatureFlag } from '@/contexts/RuntimeConfigContext'; import Link from 'next/link'; interface RateLimitBannerProps { className?: string; } export function RateLimitBanner({ className = '' }: RateLimitBannerProps) { const { status, isAtLimit, timeUntilReset } = useAuthRateLimit(); const enableUserSignups = useFeatureFlag('enableUserSignups'); if (!status || !isAtLimit) { return null; } const isAnonymous = status.userType === 'anonymous'; return (
Daily TTS limit reached. {`Used ${formatCharCount(status.currentCount)} / ${formatCharCount(status.limit)} characters.`} {' Resets in '}{timeUntilReset}.
{isAnonymous && enableUserSignups && ( Sign up for a higher limit )}
); } /** * Compact version for inline display */ export function RateLimitIndicator({ className = '' }: RateLimitBannerProps) { const { status, isAtLimit } = useAuthRateLimit(); if (!status) { return null; } const percentage = status.limit > 0 ? Math.min(100, (status.currentCount / status.limit) * 100) : 0; const isWarning = percentage >= 80; if (isAtLimit) { return ( Limit reached ); } if (isWarning) { return ( {formatCharCount(status.remainingChars)} chars left ); } return null; }