import React, { useState, useEffect } from 'react'; import { BrowserRouter as Router, Route, Routes, Navigate, Link } from 'react-router-dom'; import './App.css'; import { useParams,useNavigate,useLocation } from 'react-router-dom'; import Home from './pages/Home'; import TeamResults from './pages/TeamResult'; // Auth Context const AuthContext = React.createContext(); const AuthProvider = ({ children }) => { const [token, setToken] = useState(localStorage.getItem('token')); const login = (newToken) => { localStorage.setItem('token', newToken); setToken(newToken); }; const logout = () => { localStorage.removeItem('token'); setToken(null); }; return ( {children} ); }; // API Service const API_URL = 'http://localhost:5500'; const apiService = { login: async (accessKey, password) => { const response = await fetch(`${API_URL}/admin/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ accessKey, password }) }); console.log(accessKey); if (!response.ok) { throw new Error('Login failed'); } return response.json(); }, getTeams: async (token) => { const response = await fetch(`${API_URL}/api/teams`, { headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error('Failed to fetch teams'); } return response.json(); }, createTeam: async (teamData, token) => { const response = await fetch(`${API_URL}/api/teams`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify(teamData) }); if (!response.ok) { throw new Error('Failed to create team'); } return response.json(); }, updateTeam: async (id, teamData, token) => { const response = await fetch(`${API_URL}/api/teams/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify(teamData) }); if (!response.ok) { throw new Error('Failed to update team'); } return response.json(); }, deleteTeam: async (id, token) => { const response = await fetch(`${API_URL}/api/teams/${id}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error('Failed to delete team'); } return response.json(); }, publishResult: async (resultData, token) => { const response = await fetch(`${API_URL}/admin/results`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify(resultData) }); if (!response.ok) { throw new Error('Failed to publish result'); } return response.json(); }, getDailyResults: async (date, token) => { const response = await fetch(`${API_URL}/api/results/daily?date=${date}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error('Failed to fetch daily results'); } return response.json(); } }; // Components const Login = () => { const [accessKey, setAccessKey] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const { login } = React.useContext(AuthContext); const handleSubmit = async (e) => { e.preventDefault(); try { const data = await apiService.login(accessKey, password); login(data.token); // redirection } catch (err) { setError('Invalid credentials'); } }; return (

Admin Login

{error &&
{error}
}
setAccessKey(e.target.value)} required />
setPassword(e.target.value)} required />
); }; const TeamList = () => { const [teams, setTeams] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const { token } = React.useContext(AuthContext); useEffect(() => { const fetchTeams = async () => { try { const data = await apiService.getTeams(token); setTeams(data); setLoading(false); } catch (err) { setError('Failed to fetch teams'); setLoading(false); } }; fetchTeams(); }, [token]); const handleDelete = async (id) => { if (window.confirm('Are you sure you want to delete this team?')) { try { await apiService.deleteTeam(id, token); setTeams(teams.filter(team => team.id !== id)); } catch (err) { setError('Failed to delete team'); } } }; if (loading) return
Loading...
; if (error) return
{error}
; return (

Team Management

Add New Team {teams.map(team => ( ))}
ID Name Actions
{team.id} {team.name} Edit
); }; const TeamForm = ({ isEdit = false }) => { const [name, setName] = useState(''); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); const { token } = React.useContext(AuthContext); const { id } = useParams(); const navigate = useNavigate(); useEffect(() => { if (isEdit && id) { const fetchTeam = async () => { try { const teams = await apiService.getTeams(token); const team = teams.find(t => t.id === parseInt(id)); if (team) { setName(team.name); } } catch (err) { setError('Failed to fetch team details'); } }; fetchTeam(); } }, [isEdit, id, token]); const handleSubmit = async (e) => { e.preventDefault(); setSubmitting(true); try { if (isEdit) { await apiService.updateTeam(id, { name }, token); } else { await apiService.createTeam({ name }, token); } navigate('/teams'); } catch (err) { setError(isEdit ? 'Failed to update team' : 'Failed to create team'); setSubmitting(false); } }; return (

{isEdit ? 'Edit Team' : 'Add New Team'}

{error &&
{error}
}
setName(e.target.value)} required />
Cancel
); }; const ResultCalendar = () => { const [date, setDate] = useState(new Date().toISOString().split('T')[0]); const [results, setResults] = useState([]); const [teams, setTeams] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const { token } = React.useContext(AuthContext); useEffect(() => { const fetchData = async () => { try { const [teamsData, resultsData] = await Promise.all([ apiService.getTeams(token), apiService.getDailyResults(date, token) ]); setTeams(teamsData); setResults(resultsData); setLoading(false); } catch (err) { setError('Failed to fetch data'); setLoading(false); } }; fetchData(); }, [date, token]); const handleDateChange = (e) => { setDate(e.target.value); }; if (loading) return
Loading...
; if (error) return
{error}
; return (

Results Calendar

Results for {date}

Add New Result {results.length === 0 ? (

No results for this date.

) : ( {results.map(result => ( ))}
Team Result Actions
{result.team} {result.visible_result} Edit
)}
); }; const ResultForm = ({ isEdit = false }) => { const [formData, setFormData] = useState({ team: '', result: '', date: new Date().toISOString().split('T')[0] }); const [teams, setTeams] = useState([]); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); const { token } = React.useContext(AuthContext); const { id } = useParams(); const navigate = useNavigate(); const location = useLocation(); useEffect(() => { const fetchTeams = async () => { try { const teamsData = await apiService.getTeams(token); setTeams(teamsData); // Set date from query params if available const params = new URLSearchParams(location.search); const dateParam = params.get('date'); if (dateParam) { setFormData(prev => ({ ...prev, date: dateParam })); } // If editing, fetch the result details if (isEdit && id) { // This is a simplified approach. In a real app, you'd have an API endpoint to fetch a specific result const results = await apiService.getDailyResults(dateParam, token); const result = results.find(r => r.id === parseInt(id)); console.log(result.team); if (result) { console.log(result) setFormData({ team: result.team, result: result.visible_result, date: result.date }); } } } catch (err) { setError('Failed to fetch data'); } }; fetchTeams(); }, [isEdit, id, token, location.search]); const handleChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; const handleSubmit = async (e) => { e.preventDefault(); setSubmitting(true); try { await apiService.publishResult(formData, token); navigate(`/results?date=${formData.date}`); } catch (err) { setError('Failed to publish result'); setSubmitting(false); } }; return (

{isEdit ? 'Edit Result' : 'Add New Result'}

{error &&
{error}
}
Cancel
); }; const Dashboard = () => { const { logout } = React.useContext(AuthContext); return (

Admin Dashboard

} /> } /> } /> } /> } /> } /> } />
); }; // Protected Route const ProtectedRoute = ({ children }) => { const { isAuthenticated } = React.useContext(AuthContext); if (!isAuthenticated) { return ; } return children; }; // App const App = () => { return ( } /> } /> } /> } /> ); }; export default App;