Skip to content

Commit d482183

Browse files
Refactor
1 parent 84ff72a commit d482183

22 files changed

+389
-318
lines changed

.babelrc

+4-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
{ "presets": ["react"] }
1+
{
2+
"presets": ["react"],
3+
"plugins": ["transform-object-rest-spread"]
4+
}

app/Contest.js

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
const store = require('./store');
2+
3+
class Contest {
4+
constructor({
5+
Name, StartTime, EndTime, Platform, url, Duration,
6+
}) {
7+
this.Name = Name;
8+
this.StartTime = StartTime;
9+
this.EndTime = EndTime;
10+
this.Platform = Platform;
11+
this.url = url;
12+
this.Duration = Duration;
13+
}
14+
15+
getID() {
16+
return this.Name + this.EndTime;
17+
}
18+
19+
isHidden() {
20+
return store.isHidden(this.getID());
21+
}
22+
23+
shouldBeDisplayed() {
24+
return !store.isHidden(this.getID())
25+
&& store.isPlatformEnabled(this.Platform);
26+
}
27+
28+
hide() {
29+
store.addToHiddenList(this.getID());
30+
}
31+
32+
show() {
33+
store.removeFromHiddenList(this.getID());
34+
}
35+
36+
createGoogleAddToCalendarUrl() {
37+
const curTime = new Date();
38+
const startTime = Date.parse(this.StartTime);
39+
const endTime = Date.parse(this.EndTime);
40+
41+
const s = new Date(startTime - ((curTime).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/-/g, '')
42+
.replace(/:/g, '');
43+
const e = new Date(endTime - ((curTime).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/-/g, '')
44+
.replace(/:/g, '');
45+
const calendarTime = `${s}/${e}`;
46+
47+
return `https://www.google.com/calendar/render?action=TEMPLATE&text=${encodeURIComponent(this.Name)
48+
}&dates=${calendarTime}&location=${this.url}&pli=1&uid=&sf=true&output=xml#eventpage_6`;
49+
}
50+
}
51+
52+
module.exports = Contest;

app/appCache.js

-41
This file was deleted.

app/components/App.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ const React = require('react');
33
const $ = require('jquery');
44
const Router = require('./Router');
55
const Header = require('./Header');
6-
const Cache = require('../appCache');
7-
const Settings = require('../settings');
6+
const store = require('../store');
7+
const { SUPPORTED_PLATFORMS } = require('../constants');
88

99
const App = React.createClass({
1010
getInitialState() {
@@ -24,7 +24,7 @@ const App = React.createClass({
2424
$.when($.ajax('https://contesttrackerapi.herokuapp.com/')).then((data) => {
2525
const contests = data.result;
2626

27-
Cache.store(contests);
27+
store.setContests(contests);
2828

2929
component.setState({
3030
isLoading: false,
@@ -57,8 +57,17 @@ const App = React.createClass({
5757
},
5858

5959
componentDidMount() {
60-
Settings.initializeSettings();
61-
if (Cache.empty() || Cache.dataOlderThan(5)) {
60+
// Initialize Platform settings
61+
SUPPORTED_PLATFORMS
62+
.filter(p => !store.isPlatformInitialized(p))
63+
.forEach(p => store.enablePlatform(p));
64+
65+
// Initialize Hidden Contest List
66+
if (!store.isHiddenListInitialized()) {
67+
store.initializeHiddenList();
68+
}
69+
70+
if (store.isContestsDataEmpty() || store.isContestsDataStale(5)) {
6271
this.getContestList();
6372
}
6473
},

app/components/Containers/ArchiveContainer.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
const React = require('react');
22
const ContestTypeHeader = require('./../ContestTypeHeader');
33
const ContestList = require('./../ContestList');
4-
const Cache = require('../../appCache');
5-
const Hide = require('../../hide');
4+
const store = require('../../store');
5+
const Contest = require('../../Contest');
66

77
const Archive = React.createClass({
88
render() {
99
const hiddenContests = {
10-
ongoing: Cache.fetch().data.ongoing.filter(contest => Hide.isHidden(contest)),
11-
upcoming: Cache.fetch().data.upcoming.filter(contest => Hide.isHidden(contest)),
10+
ongoing: store.getContests().data.ongoing
11+
.map(contestJson => new Contest(contestJson))
12+
.filter(contest => contest.isHidden()),
13+
upcoming: store.getContests().data.upcoming
14+
.map(contestJson => new Contest(contestJson))
15+
.filter(contest => contest.isHidden()),
1216
};
1317

1418
if ((hiddenContests.ongoing.length + hiddenContests.upcoming.length) > 0) {

app/components/Containers/DonationsContainer.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ Buy me a Beer!
2828
</div>
2929
</div>
3030
<div className="message">
31-
<img src="https://github.com/nishanthvijayan.png" className="circle-image" style={{ height: 80 }} onClick={this.onClickImageHandler} />
31+
<img
32+
src="https://github.com/nishanthvijayan.png"
33+
className="circle-image"
34+
style={{ height: 80 }}
35+
alt="nishanth"
36+
onClick={this.onClickImageHandler}
37+
/>
3238
<br />
3339
<br />
3440
<p>

app/components/Containers/ListingsContainer.js

+13-18
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
const React = require('react');
22
const ContestTypeHeader = require('../ContestTypeHeader');
33
const ContestList = require('../ContestList');
4-
const Cache = require('../../appCache');
5-
const Settings = require('../../settings');
6-
const Hide = require('../../hide');
4+
const store = require('../../store');
5+
const Contest = require('../../Contest');
76

87
const Listings = React.createClass({
98

10-
filterContestsBySettings(contests) {
11-
return contests
12-
.filter(contest => Settings.isPlatformEnabled(contest.Platform))
13-
.filter(contest => !Hide.isHidden(contest));
14-
},
15-
169
filterContestsByTime(allContests) {
1710
const currentTime = new Date().getTime();
1811
const filteredContests = {};
@@ -46,20 +39,22 @@ const Listings = React.createClass({
4639
sortByEndTime: (a, b) => Date.parse(a.EndTime) - Date.parse(b.EndTime),
4740

4841
processContestList(contests) {
49-
let contestsFilteredBySettings = {
50-
ongoing: this.filterContestsBySettings(contests.ongoing),
51-
upcoming: this.filterContestsBySettings(contests.upcoming),
52-
};
53-
54-
contestsFilteredBySettings = this.filterContestsByTime(contestsFilteredBySettings);
42+
const contestsFilteredBySettings = this.filterContestsByTime(contests);
5543

5644
return {
57-
ongoing: contestsFilteredBySettings.ongoing.sort(this.sortByEndTime),
58-
upcoming: contestsFilteredBySettings.upcoming.sort(this.sortByStartTime),
45+
ongoing: contestsFilteredBySettings.ongoing
46+
.map(contestJson => new Contest(contestJson))
47+
.filter(contest => contest.shouldBeDisplayed())
48+
.sort(this.sortByEndTime),
49+
50+
upcoming: contestsFilteredBySettings.upcoming
51+
.map(contestJson => new Contest(contestJson))
52+
.filter(contest => contest.shouldBeDisplayed())
53+
.sort(this.sortByStartTime),
5954
};
6055
},
6156
render() {
62-
const contests = this.processContestList(Cache.fetch().data);
57+
const contests = this.processContestList(store.getContests().data);
6358
return (
6459
<div className="listings-container">
6560
<div id="ongoing" className="top-title">
+16-21
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,25 @@
11
const React = require('react');
22
const PlatformSetting = require('../PlatformSetting');
3-
const Settings = require('../../settings');
43
const { SUPPORTED_PLATFORMS } = require('../../constants');
54

6-
const SettingsContainer = React.createClass({
7-
render() {
8-
return (
9-
<div className="settings-container">
10-
<div id="subscribe" className="top-title">
11-
<div className="title">
12-
<h3>
5+
const SettingsContainer = () => (
6+
<div className="settings-container">
7+
<div id="subscribe" className="top-title">
8+
<div className="title">
9+
<h3>
1310
Subscribe
14-
</h3>
15-
</div>
16-
<div className="subscribeContent">
17-
{SUPPORTED_PLATFORMS.map(platform => (
18-
<div>
19-
<PlatformSetting platform={platform} />
20-
<hr />
21-
</div>
22-
))}
11+
</h3>
12+
</div>
13+
<div className="subscribeContent">
14+
{SUPPORTED_PLATFORMS.map(platform => (
15+
<div>
16+
<PlatformSetting platform={platform} />
17+
<hr />
2318
</div>
24-
</div>
19+
))}
2520
</div>
26-
);
27-
},
28-
});
21+
</div>
22+
</div>
23+
);
2924

3025
module.exports = SettingsContainer;

app/components/Contest.js

+34-17
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@ const ContestImage = require('./Contest/ContestImage');
44
const ContestDuration = require('./Contest/ContestDuration');
55
const HideContestButton = require('./Contest/HideContestButton');
66
const AddToCalendarButton = require('./Contest/AddToCalendarButton');
7-
const Hide = require('../hide');
87

98
const Contest = React.createClass({
109
getInitialState() {
1110
return {
1211
isSelected: false,
1312
visible: true,
14-
archived: Hide.isHidden(this.props.details),
13+
archived: this.props.contest.isHidden(),
1514
};
1615
},
1716
onClickContestTitle() {
1817
ga('send', 'event', 'Open Contest');
19-
chrome.tabs.create({ url: this.props.details.url });
18+
chrome.tabs.create({ url: this.props.contest.url });
2019
},
2120
onMouseEnterHandler() {
2221
this.setState({
@@ -35,21 +34,21 @@ const Contest = React.createClass({
3534
});
3635
}
3736
},
38-
archive() {
37+
hide() {
3938
ga('send', 'event', 'Hide');
40-
Hide.hideContest(this.props.details);
39+
this.props.contest.hide();
4140
this.setState({ visible: false, archived: true });
4241
},
43-
unArchive() {
42+
show() {
4443
ga('send', 'event', 'Unhide');
45-
Hide.showContest(this.props.details);
44+
this.props.contest.show();
4645
this.setState({ visible: false, archived: false });
4746
},
48-
hide() {
47+
toggleVisiblity() {
4948
if (this.state.archived) {
50-
this.unArchive();
49+
this.hide();
5150
} else {
52-
this.archive();
51+
this.show();
5352
}
5453
},
5554
render() {
@@ -59,17 +58,35 @@ const Contest = React.createClass({
5958

6059
return (
6160
<a>
62-
<li onMouseMove={this.onMouseMoveHandler} onMouseEnter={this.onMouseEnterHandler} onMouseLeave={this.onMouseLeaveHandler}>
63-
<ContestImage platform={this.props.details.Platform} />
61+
<li
62+
onMouseMove={this.onMouseMoveHandler}
63+
onMouseEnter={this.onMouseEnterHandler}
64+
onMouseLeave={this.onMouseLeaveHandler}
65+
>
66+
<ContestImage platform={this.props.contest.Platform} />
6467
<div className="details-container">
68+
6569
<h2 className="contest-title" onClick={this.onClickContestTitle}>
66-
{this.props.details.Name}
70+
{this.props.contest.Name}
6771
</h2>
68-
<HideContestButton visible={this.state.isSelected} details={this.props.details} hideHandler={this.hide} />
69-
<AddToCalendarButton visible={this.state.isSelected} type={this.props.type} details={this.props.details} />
72+
73+
<HideContestButton
74+
visible={this.state.isSelected}
75+
contest={this.props.contest}
76+
hideHandler={this.toggleVisiblity}
77+
/>
78+
79+
<AddToCalendarButton
80+
visible={this.state.isSelected}
81+
type={this.props.type}
82+
contest={this.props.contest}
83+
/>
84+
7085
<br />
71-
<ContestTime type={this.props.type} details={this.props.details} />
72-
<ContestDuration type={this.props.type} details={this.props.details} />
86+
87+
<ContestTime type={this.props.type} contest={this.props.contest} />
88+
89+
<ContestDuration type={this.props.type} contest={this.props.contest} />
7390
{' '}
7491
<br />
7592
</div>

0 commit comments

Comments
 (0)