-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
126 lines (106 loc) · 4.06 KB
/
Copy pathindex.js
File metadata and controls
126 lines (106 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// all teams are saved in localStorage
// localStorage doesn't support arrays, so we have to convert the teams array to a string and back
const getTeams = () => JSON.parse(localStorage.getItem("teams"));
const hasTeam = (name) => getTeams().map(team => team.name).indexOf(name) !== -1;
// this makes it easy to validate a team
const teamFields = ["name", "notes", "autonPoints", "auton"];
const isValidTeam = (team) => teamFields
.map(property => team.hasOwnProperty(property))
.reduce((isValidSoFar, hasProp) => isValidSoFar && hasProp);
// only adds the team if the team is valid and is not already in localStorage
const addTeam = (team) => {
// add the team
if (isValidTeam(team) && !hasTeam(team.name)) {
localStorage.setItem("teams", JSON.stringify(getTeams().concat(team)));
}
};
const removeTeam = (name) => {
const teamsWithoutTeam = getTeams().filter(t => t.name !== name);
localStorage.setItem("teams", JSON.stringify(teamsWithoutTeam));
// try to sync to firebase
// if it can't sync, just fail silently
if (firebase) {
try {
firebase.database().ref(`team/${name}`).set(null);
} catch (error) {}
}
};
const uploadTeamToFirebase = (team) => firebase.database().ref(`team/${team.name}`).set(team);
const uploadToFirebase = () => getTeams.forEach(uploadTeamToFirebase);
// initialize the teams value by making sure that it is set to an array
localStorage.setItem("teams", localStorage.getItem("teams") || "[]");
// remove any invalid teams before displaying them
getTeams().filter(team => !isValidTeam(team)).forEach(team => removeTeam(team.name));
const renderTeams = () => {
document.getElementById("teams").innerHTML = ""; // clear the teams
for (let team of getTeams()) {
const teamNode = document.createElement("div");
teamNode.innerHTML = `
<h3>${team.name}</h3>
<p>${team.notes}</p>
<p>Autonomous Points: <b>${team.autonPoints}</b></p>
<p>Has auton: <b>${team.auton}</b></p>
<button team="${team.name}" class="remove-team">Remove</button>
`;
document.getElementById("teams").appendChild(teamNode);
}
for (let button of document.getElementsByClassName("remove-team")) {
button.addEventListener("click", (event) => {
const teamName = event.target.outerHTML.match(/team=\"(.*?)\"/)[1];
removeTeam(teamName);
renderTeams();
});
}
};
renderTeams();
// save the team entered when save button is pressed
document.getElementById("save").addEventListener("click", (event) => {
event.preventDefault();
const team = {};
for (let field of teamFields) {
team[field] = document.getElementById(field).value;
}
if (isValidTeam(team)) {
addTeam(team);
uploadTeamToFirebase(team);
renderTeams();
}
});
const sync = () => {
const firebaseAPIKey = localStorage.getItem("firebase-api-key");
const firebaseProjectName = localStorage.getItem("firebase-project-name").toLowerCase();
if (!firebase || !firebaseAPIKey || !firebaseProjectName) {
return;
}
firebase.initializeApp({
apiKey: firebaseAPIKey,
authDomain: `${firebaseProjectName}.firebaseapp.com`,
databaseURL: `https://${firebaseProjectName}.firebaseio.com`,
storageBucket: `${firebaseProjectName}.appspot.com`,
messagingSenderId: "805247801529"
});
// download any new teams and display them
const teams = firebase.database().ref("team").on("value", (teams) => {
document.getElementById("firebase-sync-message").innerHTML =
`<strong>Firebase connected to ${firebaseProjectName}</strong>`;
for (let teamName in teams.val()) {
const team = teams.val()[teamName];
if (!hasTeam(team.name) && isValidTeam(team)) {
addTeam(team);
}
}
renderTeams();
});
// upload new teams
getTeams().forEach(team => firebase.database().ref(`team/${team.name}`).set(team));
}
if (firebase) {
sync();
}
document.getElementById("firebase-sync-save").addEventListener("click", (event) => {
event.preventDefault();
for (let key of ["firebase-api-key", "firebase-project-name"]) {
localStorage.setItem(key, document.getElementById(key).value);
}
sync();
});