'use client'; import { useState, useEffect } from 'react'; import Dropdown from '@/components/Dropdown'; import { Team } from '@/types'; interface Stream { id: number; name: string; obs_source_name: string; url: string; team_id: number; } export default function AddStream() { const [formData, setFormData] = useState({ name: '', obs_source_name: '', url: '', team_id: null, }); const [teams, setTeams] = useState<{id: number; name: string}[]>([]); const [streams, setStreams] = useState([]); const [isLoading, setIsLoading] = useState(true); const [message, setMessage] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); // Fetch teams and streams on component mount useEffect(() => { fetchData(); }, []); const fetchData = async () => { setIsLoading(true); try { const [teamsResponse, streamsResponse] = await Promise.all([ fetch('/api/teams'), fetch('/api/streams') ]); const teamsData = await teamsResponse.json(); const streamsData = await streamsResponse.json(); // Map the API data to the format required by the Dropdown setTeams( teamsData.map((team: Team) => ({ id: team.team_id, name: team.team_name, })) ); setStreams(streamsData); } catch (error) { console.error('Failed to fetch data:', error); } finally { setIsLoading(false); } }; const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; const handleTeamSelect = (teamId: number) => { // @ts-expect-error - team_id can be null or number in formData, but TypeScript expects only number setFormData((prev) => ({ ...prev, team_id: teamId })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setMessage(''); setIsSubmitting(true); try { const response = await fetch('/api/addStream', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData), }); const data = await response.json(); if (response.ok) { setMessage(data.message); setFormData({ name: '', obs_source_name: '', url: '', team_id: null }); // Reset form fetchData(); // Refresh the streams list } else { setMessage(data.error || 'Something went wrong.'); } } catch (error) { console.error('Error adding stream:', error); setMessage('Failed to add stream.'); } finally { setIsSubmitting(false); } }; return (
{/* Title */}

Streams

Organize your content by creating and managing stream sources

{/* Add New Stream */}

Add Stream

{/* Stream Name */}
{/* OBS Source Name */}
{/* URL */}
{/* Team Selection and Submit Button */}
{/* Success/Error Message */} {message && (
{message.includes('successfully') ? ( ) : ( )}
{message}
)} {/* Streams List */}

Existing Streams

{isLoading ? (
Loading streams...
) : streams.length === 0 ? (
No streams found
Create your first stream above!
) : (
{streams.map((stream) => { const team = teams.find(t => t.id === stream.team_id); return (
{stream.name.charAt(0).toUpperCase()}
{stream.name}
OBS: {stream.obs_source_name}
Team: {team?.name || 'Unknown'}
ID: {stream.id}
View Stream
); })}
)}
); }