]> git.localhorst.tv Git - alttp.git/blobdiff - resources/js/components/pages/Tournament.js
add helmet
[alttp.git] / resources / js / components / pages / Tournament.js
index 64c890609333608f1701941676849ec8308d28f7..7abd5e437b25bf8454e49810d9a2e12cde88a30a 100644 (file)
@@ -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,7 +8,15 @@ import ErrorMessage from '../common/ErrorMessage';
 import Loading from '../common/Loading';
 import NotFound from '../pages/NotFound';
 import Detail from '../tournament/Detail';
-import { patchResult } from '../../helpers/Tournament';
+import {
+       patchApplication,
+       patchParticipant,
+       patchResult,
+       patchRound,
+       patchUser,
+       removeApplication,
+       sortParticipants,
+} from '../../helpers/Tournament';
 
 const Tournament = () => {
        const params = useParams();
@@ -18,25 +27,49 @@ 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.private(`Tournament.${id}`)
-                       .listen('ResultReported', e => {
+               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));
                                }
@@ -45,15 +78,39 @@ const Tournament = () => {
                                if (e.round) {
                                        setTournament(tournament => ({
                                                ...tournament,
-                                               rounds: [...tournament.rounds, e.round],
+                                               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 <Loading />;
        }
@@ -71,6 +128,9 @@ const Tournament = () => {
        };
 
        return <ErrorBoundary>
+               <Helmet>
+                       <title>{tournament.title}</title>
+               </Helmet>
                <Detail addRound={addRound} tournament={tournament} />
        </ErrorBoundary>;
 };