1 import Application from './Application';
2 import Participant from './Participant';
3 import Round from './Round';
5 export const compareScore = (a, b) => {
6 const a_score = a && a.score ? a.score : 0;
7 const b_score = b && b.score ? b.score : 0;
8 if (a_score < b_score) return -1;
9 if (b_score < a_score) return 1;
10 return Participant.compareUsername(a.participant, b.participant) * -1;
13 export const findParticipant = (tournament, user) => {
14 if (!tournament || !tournament.participants || !tournament.participants.length) return null;
15 if (!user || !user.id) return null;
16 return tournament.participants.find(p => p.user_id == user.id);
19 export const getPendingApplications = tournament => {
20 if (!tournament || !tournament.applications || !tournament.applications.length) return [];
21 return tournament.applications
22 .filter(Application.isPending)
23 .sort(Application.compareUsername);
26 export const getRunners = tournament => {
27 if (!tournament || !tournament.participants || !tournament.participants.length) return [];
28 return tournament.participants
29 .filter(Participant.isRunner)
30 .sort(Participant.compareUsername);
33 export const getLastRound = tournament => {
34 if (!tournament || !tournament.rounds || !tournament.rounds.length) return null;
35 return tournament.rounds.slice(-1)[0];
38 export const canLoadMoreRounds = tournament => {
39 const last_round = getLastRound(tournament);
40 return last_round && last_round.number > 1;
43 export const hasScoreboard = tournament => !!(tournament && tournament.type === 'signup-async');
45 export const hasSignup = tournament => !!(tournament && tournament.type === 'signup-async');
47 export const getScoreTable = tournament => {
48 if (!tournament || !tournament.rounds || !tournament.rounds.length) return [];
49 const runners = getRunners(tournament);
50 if (!runners.length) return [];
52 runners.forEach(participant => {
53 running[participant.id] = 0;
55 const data = [...tournament.rounds, {}].reverse().map(round => {
56 const entry = { number: round.number ? `#${round.number}` : '' };
57 runners.forEach(participant => {
58 const result = Participant.findResult(participant, round);
59 if (result && result.score) {
60 running[participant.id] += result.score;
62 entry[Participant.getUserName(participant)] = running[participant.id];
69 export const getTournamentAdmins = tournament => {
70 if (!tournament || !tournament.participants || !tournament.participants.length) return [];
71 return tournament.participants
72 .filter(Participant.isTournamentAdmin)
73 .sort(Participant.compareUsername);
76 export const getTournamentCrew = tournament => {
77 if (!tournament || !tournament.participants || !tournament.participants.length) return [];
78 return tournament.participants
79 .filter(Participant.isTournamentCrew)
80 .sort(Participant.compareUsername);
83 export const getTournamentMonitors = tournament => {
84 if (!tournament || !tournament.participants || !tournament.participants.length) return [];
85 return tournament.participants
86 .filter(Participant.isTournamentMonitor)
87 .sort(Participant.compareUsername);
90 export const hasRunners = tournament => {
91 return getRunners(tournament).length > 0;
94 export const hasTournamentAdmins = tournament => {
95 return getTournamentAdmins(tournament).length > 0;
98 export const hasTournamentCrew = tournament => {
99 return getTournamentCrew(tournament).length > 0;
102 export const hasTournamentMonitors = tournament => {
103 return getTournamentMonitors(tournament).length > 0;
106 export const patchApplication = (tournament, application) => {
107 if (!tournament) return tournament;
108 if (!tournament.applications || !tournament.applications.length) {
111 applications: [application],
114 if (!tournament.applications.find(a => a.user_id == application.user_id)) {
117 applications: [...tournament.applications, application],
122 applications: tournament.applications.map(
123 a => a.user_id === application.user_id ? application : a,
128 export const patchParticipant = (tournament, participant) => {
129 if (!tournament) return tournament;
130 if (!tournament.participants || !tournament.participants.length) {
133 participants: [participant],
136 if (!tournament.participants.find(p => p.id === participant.id)) {
139 participants: [...tournament.participants, participant],
144 participants: tournament.participants.map(
145 p => p.id === participant.id ? participant : p,
150 export const patchResult = (tournament, result) => {
151 if (!tournament || !tournament.rounds) return tournament;
154 rounds: tournament.rounds.map(round =>
155 round.id === result.round_id
156 ? Round.patchResult(round, result)
162 export const patchRound = (tournament, round) => {
163 if (!tournament) return tournament;
166 rounds: tournament.rounds.map(r => r.id === round.id ? { ...r, ...round } : r),
170 export const patchUser = (tournament, user) => {
171 if (!tournament || !tournament.participants || !user) return tournament;
172 if (!tournament.participants.find(p => p.user_id == user.id)) return tournament;
175 participants: tournament.participants.map(p => Participant.patchUser(p, user)),
179 export const removeApplication = (tournament, id) => {
180 if (!tournament || !tournament.applications || !tournament.applications.find(a => a.id == id)) {
185 applications: tournament.applications.filter(a => a.id != id),
189 export const sortParticipants = tournament => {
190 if (!tournament || !tournament.participants || !tournament.participants.length) {
195 participants: tournament.participants.sort(Participant.compareUsername),
205 getTournamentMonitors,
211 hasTournamentMonitors,