]> git.localhorst.tv Git - alttp.git/blob - resources/js/helpers/Result.js
respond to whispers
[alttp.git] / resources / js / helpers / Result.js
1 import React from 'react';
2 import Icon from '../components/common/Icon';
3
4 export const compareResult = (a, b) => {
5         const a_placement = a && a.placement ? a.placement : 0;
6         const b_placement = b && b.placement ? b.placement : 0;
7         if (a_placement) {
8                 if (b_placement) {
9                         if (a_placement < b_placement) return -1;
10                         if (b_placement < a_placement) return 1;
11                         return compareUsername(a, b);
12                 }
13                 return -1;
14         }
15         if (b_placement) {
16                 return 1;
17         }
18         return compareUsername(a, b);
19 };
20
21 export const compareUsername = (a, b) => {
22         const a_name = (a && a.user && a.user.username) || '';
23         const b_name = (b && b.user && b.user.username) || '';
24         return a_name.localeCompare(b_name);
25 };
26
27 export const formatTime = result => {
28         const hours = `${Math.floor(result.time / 60 / 60)}`;
29         let minutes = `${Math.floor((result.time / 60) % 60)}`;
30         let seconds = `${Math.floor(result.time % 60)}`;
31         while (minutes.length < 2) {
32                 minutes = `0${minutes}`;
33         }
34         while (seconds.length < 2) {
35                 seconds = `0${seconds}`;
36         }
37         return `${hours}:${minutes}:${seconds}`;
38 };
39
40 export const getIcon = (result, maySee) => {
41         if (!result || !result.has_finished) {
42                 return <Icon.PENDING className="text-muted" size="lg" />;
43         }
44         if (result.forfeit && maySee) {
45                 return <Icon.FORFEIT className="text-danger" size="lg" />;
46         }
47         if (result.placement === 1 && maySee) {
48                 return <Icon.FIRST_PLACE className="text-gold" size="lg" />;
49         }
50         if (result.placement === 2 && maySee) {
51                 return <Icon.SECOND_PLACE className="text-silver" size="lg" />;
52         }
53         if (result.placement === 3 && maySee) {
54                 return <Icon.THIRD_PLACE className="text-bronze" size="lg" />;
55         }
56         return <Icon.FINISHED className="text-success" size="lg" />;
57 };
58
59 export const getTime = (result, maySee) => {
60         if (!result || !maySee) {
61                 return null;
62         }
63         if (result.time) {
64                 return formatTime(result);
65         }
66         if (result.forfeit) {
67                 return 'DNF';
68         }
69         return '?';
70 };
71
72 export const parseTime = str => {
73         if (!str) return null;
74         return `${str}`.trim().split(/[-.: ]+/).reduce((acc,time) => (60 * acc) + +time, 0);
75 };
76
77 export default {
78         compareResult,
79         compareUsername,
80         formatTime,
81         getIcon,
82         getTime,
83         parseTime,
84 };