X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fcomponents%2Fpages%2FTournament.js;h=7abd5e437b25bf8454e49810d9a2e12cde88a30a;hb=18cd02860ba7889360ce3547b44faa0daa807a5e;hp=cdafd69b12c2414140f3dce96d07c87cd2e68bf2;hpb=edd0e97bfdc544114f30bf4c13a929631c44a555;p=alttp.git diff --git a/resources/js/components/pages/Tournament.js b/resources/js/components/pages/Tournament.js index cdafd69..7abd5e4 100644 --- a/resources/js/components/pages/Tournament.js +++ b/resources/js/components/pages/Tournament.js @@ -1,5 +1,6 @@ import axios from 'axios'; import React, { useEffect, useState } from 'react'; +import { Helmet } from 'react-helmet'; import { useParams } from 'react-router-dom'; import ErrorBoundary from '../common/ErrorBoundary'; @@ -7,6 +8,15 @@ import ErrorMessage from '../common/ErrorMessage'; import Loading from '../common/Loading'; import NotFound from '../pages/NotFound'; import Detail from '../tournament/Detail'; +import { + patchApplication, + patchParticipant, + patchResult, + patchRound, + patchUser, + removeApplication, + sortParticipants, +} from '../../helpers/Tournament'; const Tournament = () => { const params = useParams(); @@ -17,21 +27,90 @@ const Tournament = () => { const [tournament, setTournament] = useState(null); useEffect(() => { + const ctrl = new AbortController(); setLoading(true); axios - .get(`/api/tournaments/${id}`) + .get(`/api/tournaments/${id}`, { signal: ctrl.signal }) .then(response => { setError(null); setLoading(false); - setTournament(response.data); + setTournament(sortParticipants(response.data)); }) .catch(error => { setError(error); setLoading(false); setTournament(null); }); + return () => { + ctrl.abort(); + }; }, [id]); + useEffect(() => { + window.Echo.channel(`Tournament.${id}`) + .listen('ApplicationAdded', e => { + if (e.application) { + setTournament(tournament => patchApplication(tournament, e.application)); + } + }) + .listen('ApplicationChanged', e => { + if (e.application) { + setTournament(tournament => patchApplication(tournament, e.application)); + } + }) + .listen('ApplicationRemoved', e => { + if (e.application_id) { + setTournament(tournament => removeApplication(tournament, e.application_id)); + } + }) + .listen('ParticipantChanged', e => { + console.log(e); + if (e.participant) { + setTournament(tournament => patchParticipant(tournament, e.participant)); + } + }) + .listen('ResultChanged', e => { + if (e.result) { + setTournament(tournament => patchResult(tournament, e.result)); + } + }) + .listen('RoundAdded', e => { + if (e.round) { + setTournament(tournament => ({ + ...tournament, + rounds: [e.round, ...tournament.rounds], + })); + } + }) + .listen('RoundChanged', e => { + if (e.round) { + setTournament(tournament => patchRound(tournament, e.round)); + } + }) + .listen('TournamentChanged', e => { + if (e.tournament) { + setTournament(tournament => ({ ...tournament, ...e.tournament })); + } + }); + return () => { + window.Echo.leave(`Tournament.${id}`); + }; + }, [id]); + + useEffect(() => { + const cb = (e) => { + if (e.user) { + setTournament(tournament => patchUser(tournament, e.user)); + } + }; + window.Echo.channel('App.Control') + .listen('UserChanged', cb); + return () => { + window.Echo.channel('App.Control') + .stopListening('UserChanged', cb); + }; + }, []); + if (loading) { return ; } @@ -49,6 +128,9 @@ const Tournament = () => { }; return + + {tournament.title} + ; };