Files
1000apps/pages/apps/worldcup2026/index.jsx
T

290 lines
18 KiB
React

import { useState, useEffect } from "react"
import { useSession } from "next-auth/react"
import { useRouter } from "next/router"
// Copa do Mundo 2026 - Grupos e Classificação (48 seleções, 12 grupos de 4)
const worldCupGroups = {
A: [
{ team: "Canadá", flag: "🇨🇦", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "México", flag: "🇲🇽", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Estados Unidos", flag: "🇺🇸", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
B: [
{ team: "Argentina", flag: "🇦🇷", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Paraguai", flag: "🇵🇾", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Chile", flag: "🇨🇱", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
C: [
{ team: "Brasil", flag: "🇧🇷", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Colômbia", flag: "🇨🇴", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Uruguai", flag: "🇺🇾", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
D: [
{ team: "França", flag: "🇫🇷", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Portugal", flag: "🇵🇹", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Espanha", flag: "🇪🇸", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
E: [
{ team: "Alemanha", flag: "🇩🇪", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Inglaterra", flag: "🇬🇧", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Itália", flag: "🇮🇹", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
F: [
{ team: "Holanda", flag: "🇳🇱", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Bélgica", flag: "🇧🇪", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Croácia", flag: "🇭🇷", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
G: [
{ team: "Marrocos", flag: "🇲🇦", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Senegal", flag: "🇸🇳", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Tunísia", flag: "🇹🇳", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
H: [
{ team: "Japão", flag: "🇯🇵", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Coreia do Sul", flag: "🇰🇷", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Austrália", flag: "🇦🇺", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
I: [
{ team: "Irã", flag: "🇮🇷", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Arábia Saudita", flag: "🇸🇦", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Catar", flag: "🇶🇦", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
J: [
{ team: "Nigéria", flag: "🇳🇬", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Gana", flag: "🇬🇭", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Camarões", flag: "🇨🇲", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
K: [
{ team: "Equador", flag: "🇪🇨", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Peru", flag: "🇵🇪", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Venezuela", flag: "🇻🇪", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
L: [
{ team: "Polônia", flag: "🇵🇱", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Sérvia", flag: "🇷🇸", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "Suíça", flag: "🇨🇭", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
{ team: "TBD (Repescagem)", flag: "🏳️", played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0, gd: 0, points: 0 },
],
}
// Últimas notícias da Copa 2026 (simuladas - RSS/API pública)
const worldCupNews = [
{ id: 1, category: "PREPARAÇÃO", title: "FIFA Confirma 16 Cidades-Sede para Copa 2026", summary: "Estados Unidos (11), México (3) e Canadá (2) receberão jogos. Final será no MetLife Stadium, Nova Jersey.", date: "2026-06-25", views: "450K", trend: "+120%" },
{ id: 2, category: "BRASIL", title: "Brasil Enfrenta Argentina em Amistoso Preparatório", summary: "Clássico sul-americano marcado para setembro no Morumbi. Dorival Jr. testa nova formação com Endrick e Vini Jr.", date: "2026-06-24", views: "890K", trend: "+340%" },
{ id: 3, category: "SEDES", title: "Estadio Azteca Passará por Reforma de $200M", summary: "Único estádio a sediar 3 Copas do Mundo (1970, 1986, 2026). Modernização inclui nova tecnologia de gramado híbrido.", date: "2026-06-23", views: "234K", trend: "+87%" },
{ id: 4, category: "FORMATO", title: "Novo Formato: 48 Seleções, 12 Grupos, 104 Jogos", summary: "Fase de grupos com 3 times classificados por grupo + 8 melhores terceiros. Oitavas de final expandidas.", date: "2026-06-22", views: "567K", trend: "+156%" },
{ id: 5, category: "BRASIL", title: "Neymar Recupera-se de Lesão e Treina com Bola", summary: "Craque do Al-Hilal evolui bem na reabilitação. Médicos otimistas para disputa da Copa 2026 aos 34 anos.", date: "2026-06-21", views: "723K", trend: "+234%" },
{ id: 6, category: "INGRESSOS", title: "Venda de Ingressos Inicia em Janeiro 2026", summary: "Fase 1: sorteio para residentes dos países-sede. Preços variam de $50 a $1.600. Demanda prevista: 5M ingressos.", date: "2026-06-20", views: "389K", trend: "+98%" },
{ id: 7, category: "TECNOLOGIA", title: "VAR 2.0 com IA em Tempo Real Estreia na Copa", summary: "Novo sistema reduz tempo de decisão para 15 segundos. Câmeras 4K + sensores na bola detectam impedimento milimétrico.", date: "2026-06-19", views: "278K", trend: "+112%" },
{ id: 8, category: "SUSTENTABILIDADE", title: "Copa 2026 Será Carbono Neutro", summary: "FIFA compromete-se com compensação total. Transporte público gratuito para torcedores com ingresso nos dias de jogo.", date: "2026-06-18", views: "189K", trend: "+78%" },
{ id: 9, category: "ELIMINATÓRIAS", title: "Brasil Lidera Eliminatórias Sul-Americanas", summary: "Seleção tem 30 pontos em 14 jogos. Argentina e Uruguai completam top 3. Próximos jogos: Bolívia (casa) e Peru (fora).", date: "2026-06-17", views: "456K", trend: "+134%" },
{ id: 10, category: "ESTRELAS", title: "Mbappé, Haaland e Bellingham: A Nova Geração", summary: "França, Noruega e Inglaterra apostam em astros sub-25. Copa 2026 pode ser última de Messi e Cristiano Ronaldo.", date: "2026-06-26", views: "612K", trend: "+189%" },
{ id: 11, category: "HISTÓRIA", title: "Primeira Copa com 3 Países-Sede na História", summary: "Inédito: EUA, México e Canadá dividem organização. México será único a sediar 3 Copas (1970, 1986, 2026).", date: "2026-06-16", views: "345K", trend: "+95%" },
{ id: 12, category: "BRASIL", title: "CBF Anuncia Concentração em Orlando Para em Miami para Fase de Grupos", summary: "Estrutura de 5 estrelas com campos oficiais FIFA. Climas similares aos das cidades-sede americanas.", date: "2026-06-15", views: "298K", trend: "+103%" },
]
export default function WorldCup2026() {
const { data: session } = useSession()
const router = useRouter()
const [selectedGroup, setSelectedGroup] = useState("TODOS")
const [selectedCategory, setSelectedCategory] = useState("TODAS")
const [filteredNews, setFilteredNews] = useState(worldCupNews)
useEffect(() => {
if (selectedCategory === "TODAS") {
setFilteredNews(worldCupNews)
} else {
setFilteredNews(worldCupNews.filter(n => n.category === selectedCategory))
}
}, [selectedCategory])
const groups = ["TODOS", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
const newsCategories = ["TODAS", "PREPARAÇÃO", "BRASIL", "SEDES", "FORMATO", "INGRESSOS", "TECNOLOGIA", "SUSTENTABILIDADE", "ELIMINATÓRIAS", "ESTRELAS", "HISTÓRIA"]
// Ordenar times por pontos, saldo, gols pró
const sortStandings = (teams) => {
return [...teams].sort((a, b) => {
if (b.points !== a.points) return b.points - a.points
if (b.gd !== a.gd) return b.gd - a.gd
return b.gf - a.gf
})
}
const getGroupsToShow = () => {
if (selectedGroup === "TODOS") return Object.keys(worldCupGroups)
return [selectedGroup]
}
return (
<div className="min-h-screen bg-gray-50">
{/* Header */}
<nav className="bg-white shadow-lg p-4 sticky top-0 z-10 flex items-center justify-between">
<button
onClick={() => router.push("/dashboard")}
className="text-blue-600 hover:text-blue-800 font-medium"
>
Voltar
</button>
<div>
<h1 className="text-2xl font-bold text-center bg-gradient-to-r from-green-600 to-blue-600 bg-clip-text text-transparent">
Copa do Mundo 2026
</h1>
<p className="text-center text-sm text-gray-500 mt-1">48 Seleções 12 Grupos 104 Jogos EUA/México/Canadá</p>
</div>
<div className="w-16"></div>
</nav>
<div className="max-w-4xl mx-auto p-4">
{/* Filtros de Grupo */}
<div className="flex flex-wrap gap-2 justify-center mb-6">
{groups.map(grp => (
<button
key={grp}
onClick={() => setSelectedGroup(grp)}
className={`px-3 py-1 rounded-full text-xs font-medium transition-all ${
selectedGroup === grp
? "bg-green-600 text-white"
: "bg-gray-200 text-gray-700 hover:bg-gray-300"
}`}
>
{grp === "TODOS" ? "TODOS" : `Grupo ${grp}`}
</button>
))}
</div>
{/* Tabelas de Classificação por Grupo */}
<div className="space-y-6 mb-8">
{getGroupsToShow().map(groupKey => {
const teams = sortStandings(worldCupGroups[groupKey])
return (
<div key={groupKey} className="bg-white rounded-lg shadow-md overflow-hidden">
<div className="bg-gradient-to-r from-green-600 to-green-800 text-white p-4">
<h2 className="text-xl font-bold">Grupo {groupKey}</h2>
</div>
<div className="overflow-x-auto">
<table className="w-full text-sm">
<thead className="bg-gray-100">
<tr>
<th className="p-3 text-left font-semibold text-gray-700 w-8">#</th>
<th className="p-3 text-left font-semibold text-gray-700 w-40">Seleção</th>
<th className="p-3 text-center font-semibold text-gray-700 w-16">J</th>
<th className="p-3 text-center font-semibold text-gray-700 w-16">V</th>
<th className="p-3 text-center font-semibold text-gray-700 w-16">E</th>
<th className="p-3 text-center font-semibold text-gray-700 w-16">D</th>
<th className="p-3 text-center font-semibold text-gray-700 w-16">GP</th>
<th className="p-3 text-center font-semibold text-gray-700 w-16">GC</th>
<th className="p-3 text-center font-semibold text-gray-700 w-16">SG</th>
<th className="p-3 text-center font-semibold text-gray-700 w-16">Pts</th>
</tr>
</thead>
<tbody>
{teams.map((team, idx) => (
<tr key={`${groupKey}-${team.team}`} className={`${idx < 2 ? "bg-green-50" : ""} border-t border-gray-100 hover:bg-gray-50`}>
<td className="p-3 font-bold text-gray-800">{idx + 1}</td>
<td className="p-3 font-medium">
<span className="text-lg mr-2">{team.flag}</span>
{team.team}
</td>
<td className="p-3 text-center text-gray-600">{team.played}</td>
<td className="p-3 text-center text-green-600 font-medium">{team.won}</td>
<td className="p-3 text-center text-yellow-600 font-medium">{team.drawn}</td>
<td className="p-3 text-center text-red-600 font-medium">{team.lost}</td>
<td className="p-3 text-center text-gray-600">{team.gf}</td>
<td className="p-3 text-center text-gray-600">{team.ga}</td>
<td className="p-3 text-center font-bold text-blue-600">{team.gd >= 0 ? "+" : ""}{team.gd}</td>
<td className="p-3 text-center font-bold text-green-700">{team.points}</td>
</tr>
))}
</tbody>
</table>
</div>
<div className="p-3 text-xs text-gray-500 bg-gray-50 border-t border-gray-100">
Top 2 classificam direto 8 melhores terceiros avançam J = Jogos, V = Vitórias, E = Empates, D = Derrotas, GP = Gols Pró, GC = Gols Contra, SG = Saldo, Pts = Pontos
</div>
</div>
)
})}
</div>
{/* Separador Notícias */}
<div className="my-8">
<h2 className="text-xl font-bold text-center text-gray-800 mb-4">Últimas Notícias da Copa 2026</h2>
</div>
{/* Filtros de Categoria Notícias */}
<div className="flex flex-wrap gap-2 justify-center mb-6">
{newsCategories.map(cat => (
<button
key={cat}
onClick={() => setSelectedCategory(cat)}
className={`px-3 py-1 rounded-full text-xs font-medium transition-all ${
selectedCategory === cat
? "bg-blue-600 text-white"
: "bg-gray-200 text-gray-700 hover:bg-gray-300"
}`}
>
{cat}
</button>
))}
</div>
{/* Grid de Notícias - 2 colunas */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{filteredNews.length > 0 ? (
filteredNews.map((news, idx) => (
<div key={news.id} className="bg-white rounded-lg p-4 shadow-md hover:shadow-lg transition-shadow">
<div className="flex items-start justify-between mb-2">
<span className="text-xs bg-green-100 text-green-800 px-2 py-1 rounded-full font-semibold">
{news.category}
</span>
<div className="flex items-center gap-2 text-xs">
<span className="text-green-600 font-bold">{news.trend}</span>
<span className="text-gray-500">{news.views} views</span>
</div>
</div>
<h2 className="text-lg font-bold text-gray-800 mb-2">
#{idx + 1} {news.title}
</h2>
<p className="text-gray-600 text-sm leading-relaxed">
{news.summary}
</p>
<div className="mt-3 text-xs text-gray-500">
{new Date(news.date).toLocaleDateString('pt-BR', {
weekday: 'short',
month: 'short',
day: 'numeric'
})}
</div>
</div>
))
) : (
<div className="text-center py-12">
<p className="text-gray-500">Nenhuma notícia nesta categoria</p>
</div>
)}
</div>
{/* Footer */}
<div className="mt-8 text-center text-xs text-gray-400">
<p>Copa do Mundo FIFA 2026 48 Seleções 12 Grupos 104 Jogos</p>
<p className="mt-1">Sedes: EUA (11), México (3), Canadá (2) Junho/Julho 2026</p>
<p className="mt-1">Mostrando {filteredNews.length} de {worldCupNews.length} notícias Grupos: fase inicial (0 jogos)</p>
</div>
</div>
</div>
)
}