import { useState, useEffect, useRef, useCallback } from 'react'; import { useGameStore } from '@/store'; import { formatNumber, formatMoney, formatPercent } from '@ai-tycoon/shared'; import type { ApiTierId } from '@ai-tycoon/shared'; import { Code, Check } from 'lucide-react'; const TIER_ORDER: ApiTierId[] = ['free', 'payg', 'scale', 'enterprise-api']; const TIER_COLORS: Record = { free: 'border-surface-500', payg: 'border-green-500', scale: 'border-blue-500', 'enterprise-api': 'border-purple-500', }; function useAppliedFeedback() { const [show, setShow] = useState(false); const timerRef = useRef>(undefined); const trigger = useCallback(() => { setShow(true); clearTimeout(timerRef.current); timerRef.current = setTimeout(() => setShow(false), 1200); }, []); useEffect(() => () => clearTimeout(timerRef.current), []); return { show, trigger }; } export function ApiTiersPanel() { const apiTiers = useGameStore((s) => s.market.apiTiers); const setApiTierPrice = useGameStore((s) => s.setApiTierPrice); const toggleApiTier = useGameStore((s) => s.toggleApiTier); const feedback = useAppliedFeedback(); return (
API Tiers
Developers: {formatNumber(apiTiers.totalDevelopers)} Tokens/s: {formatNumber(apiTiers.totalTokensPerTick)}
{TIER_ORDER.map(tierId => { const tier = apiTiers.tiers[tierId]; return (

{tier.config.name}

{tierId !== 'free' && ( )} {tierId === 'free' && ( Always On )}
{formatNumber(tier.developerCount)}
developers
{tierId !== 'free' ? (
{ setApiTierPrice(tierId, 'monthlyFee', Number(e.target.value)); feedback.trigger(); }} className="w-full bg-surface-800 border border-surface-600 rounded px-2 py-1 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-accent/50" min={0} step={50} />
{ setApiTierPrice(tierId, 'inputTokenPrice', Number(e.target.value)); feedback.trigger(); }} className="w-full bg-surface-800 border border-surface-600 rounded px-2 py-1 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-accent/50" min={0} step={0.1} />
{ setApiTierPrice(tierId, 'outputTokenPrice', Number(e.target.value)); feedback.trigger(); }} className="w-full bg-surface-800 border border-surface-600 rounded px-2 py-1 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-accent/50" min={0} step={0.1} />
) : (
Free tier attracts developers to your ecosystem
)}
Rate Limit {formatNumber(tier.config.rateLimit)} req/min
Tokens/s {formatNumber(tier.tokensPerTick)}
); })}
); }