'use client'; import { useState, useEffect, useCallback } from 'react'; import { ImageStudio, VideoStudio, LipSyncStudio, CinemaStudio, getUserBalance } from 'studio'; import ApiKeyModal from './ApiKeyModal'; const TABS = [ { id: 'image', label: 'Image Studio' }, { id: 'video', label: 'Video Studio' }, { id: 'lipsync', label: 'Lip Sync' }, { id: 'cinema', label: 'Cinema Studio' }, ]; const STORAGE_KEY = 'muapi_key'; export default function StandaloneShell() { const [apiKey, setApiKey] = useState(null); const [activeTab, setActiveTab] = useState('image'); const [balance, setBalance] = useState(null); const [showSettings, setShowSettings] = useState(false); const [hasMounted, setHasMounted] = useState(false); const fetchBalance = useCallback(async (key) => { try { const data = await getUserBalance(key); setBalance(data.balance); } catch (err) { console.error('Balance fetch failed:', err); } }, []); useEffect(() => { setHasMounted(true); const stored = localStorage.getItem(STORAGE_KEY); if (stored) { setApiKey(stored); fetchBalance(stored); } }, [fetchBalance]); const handleKeySave = useCallback((key) => { localStorage.setItem(STORAGE_KEY, key); setApiKey(key); fetchBalance(key); }, [fetchBalance]); const handleKeyChange = useCallback(() => { localStorage.removeItem(STORAGE_KEY); setApiKey(null); setBalance(null); }, []); // Poll for balance every 30 seconds if key is present useEffect(() => { if (!apiKey) return; const interval = setInterval(() => fetchBalance(apiKey), 30000); return () => clearInterval(interval); }, [apiKey, fetchBalance]); if (!hasMounted) return (
Manage your AI studio preferences and authentication.