import React, { useState, useMemo } from 'react';
import Navbar from './components/Navbar';
import Hero from './components/Hero';
import ContentRow from './components/ContentRow';
import VideoPlayer from './components/VideoPlayer';
import NewsBanner from './components/NewsBanner';
import { MOCK_VIDEOS, CATEGORIES_BASE } from './constants';
import { Content } from './types';
import { getSmartRecommendation } from './services/gemini';
import { Sparkles, ArrowLeft, Play } from 'lucide-react';
type View = 'home' | 'filmes' | 'series' | 'minha-lista' | 'agora-na-tv';
const App: React.FC = () => {
// Alterado para MOCK_VIDEOS[1] que é o CanalTVRio (Live) para iniciar no banner
const [heroContent, setHeroContent] = useState(MOCK_VIDEOS[1]);
const [fullscreenVideo, setFullscreenVideo] = useState(null);
const [currentView, setCurrentView] = useState('home');
const [favorites, setFavorites] = useState([]);
const [recommendation, setRecommendation] = useState('');
const [isLoadingRec, setIsLoadingRec] = useState(false);
const [isAiPanelOpen, setIsAiPanelOpen] = useState(false);
const handleAiRecommendation = async (mood: string) => {
setIsLoadingRec(true);
const rec = await getSmartRecommendation(mood);
setRecommendation(rec);
setIsLoadingRec(false);
setIsAiPanelOpen(true);
};
const handleVideoSelectFromRow = (video: Content) => {
setHeroContent(video);
window.scrollTo({ top: 0, behavior: 'smooth' });
};
const toggleFavorite = (content: Content) => {
setFavorites(prev =>
prev.includes(content.id)
? prev.filter(id => id !== content.id)
: [...prev, content.id]
);
};
const isFavorite = (id: string) => favorites.includes(id);
const favoriteItems = useMemo(() =>
MOCK_VIDEOS.filter(v => favorites.includes(v.id)),
[favorites]
);
const categories = useMemo(() => {
return CATEGORIES_BASE.map(cat => {
if (cat.title === 'Minha Lista') {
return { ...cat, items: favoriteItems };
}
return cat;
});
}, [favoriteItems]);
const filteredContent = useMemo(() => {
if (currentView === 'home') return null;
if (currentView === 'minha-lista') return favoriteItems;
const categoryKey = currentView === 'filmes' ? 'filme' : 'serie';
return MOCK_VIDEOS.filter(v => v.category === categoryKey);
}, [currentView, favoriteItems]);
const navigateTo = (view: View) => {
if (view === 'agora-na-tv') {
const liveStream = MOCK_VIDEOS.find(v => v.isLive);
if (liveStream) setFullscreenVideo(liveStream);
setCurrentView('home');
return;
}
setCurrentView(view);
window.scrollTo({ top: 0, behavior: 'smooth' });
};
return (
{currentView === 'home' ? (
<>
{categories.map((cat) => (
(cat.title !== 'Minha Lista' || cat.items.length > 0) && (
)
))}
{/* News Banner Section */}
>
) : (
{currentView === 'filmes' && 'Filmes'}
{currentView === 'series' && 'Séries'}
{currentView === 'minha-lista' && 'Minha Lista'}
{filteredContent && filteredContent.length > 0 ? (
{filteredContent.map(item => (
{
setHeroContent(item);
setCurrentView('home');
window.scrollTo({ top: 0, behavior: 'smooth' });
}}
className="group cursor-pointer transition-all duration-300 hover:scale-105"
>
{item.title}
{item.genre.join(', ')} • {item.year}
))}
) : (
Nenhum conteúdo encontrado nesta categoria.
)}
)}
{/* AI Smart Recommendation Trigger */}
{isAiPanelOpen && (
Como você está hoje?
{['Animado', 'Relaxado', 'Curioso', 'Praia'].map(mood => (
))}
{isLoadingRec && (
Consultando o oráculo do Rio...
)}
{recommendation && !isLoadingRec && (
"{recommendation}"
)}
)}
{fullscreenVideo && (
setFullscreenVideo(null)}
/>
)}
);
};
export default App;
top of page
bottom of page