|
|
@@ -22,44 +22,117 @@ class Puzzeltocht {
|
|
|
document.getElementById("unsupported").style.display = "block";
|
|
|
}
|
|
|
|
|
|
+ Puzzeltocht.fetchEvents();
|
|
|
+ document.getElementById("joinForm").addEventListener("submit", (e) => this.joinEvent(e));
|
|
|
+ console.log("puzzeltocht initialised");
|
|
|
+ }
|
|
|
+
|
|
|
+ static fetchEvents() {
|
|
|
+ fetch("/api/event", {method: "GET"})
|
|
|
+ .then(r => r.json())
|
|
|
+ .then(j => Puzzeltocht.showEvents(j))
|
|
|
+ .catch(r => console.log(r));
|
|
|
+ }
|
|
|
+
|
|
|
+ static showEvents(eventJson) {
|
|
|
+ let events = document.getElementById("events");
|
|
|
+ events.innerHTML = "";
|
|
|
+ eventJson.forEach((e) => {
|
|
|
+ events.innerHTML += '<label><input name="eventId" value="' + e.id + '" type="radio">' + e.title + '</label>';
|
|
|
+ });
|
|
|
+ document.getElementById("joinButton").disabled = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ joinEvent(e) {
|
|
|
+ e.preventDefault();
|
|
|
+ let form = document.getElementById("joinForm");
|
|
|
+ this.eventId = form.elements["eventId"].value;
|
|
|
+ this.teamNaam = document.getElementById("teamName").value;
|
|
|
+
|
|
|
+ if (this.eventId === "" || this.teamNaam === "") {
|
|
|
+ console.log("niet gevuld");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ document.getElementById("joinButton").disabled = true;
|
|
|
+
|
|
|
+ fetch("/api/event/" + encodeURIComponent(this.eventId) + "/team", {
|
|
|
+ method: "POST",
|
|
|
+ headers: {"Content-Type": "application/json"},
|
|
|
+ body: JSON.stringify(this.teamNaam)
|
|
|
+ })
|
|
|
+ .then(r => r.json())
|
|
|
+ .then(j => p.startEvent(j))
|
|
|
+ .catch(r => {
|
|
|
+ console.log(r);
|
|
|
+ document.getElementById("joinButton").disabled = false;
|
|
|
+ });
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ startEvent(teamId) {
|
|
|
+ this.teamId = teamId;
|
|
|
+ this.mission = null;
|
|
|
+ document.getElementById("join").style.display = "none";
|
|
|
+ document.getElementById("mission").style.display = "block";
|
|
|
+ document.getElementById("questionMission").style.display = "none";
|
|
|
+ this.enableLocation()
|
|
|
+ }
|
|
|
+
|
|
|
+ updateLocation(pos) {
|
|
|
+ let l = document.getElementById("location");
|
|
|
+ let ts = Date.now() - pos.timestamp;
|
|
|
+ l.innerText = "Locatie (" + Puzzeltocht.lat(pos) + ", " + Puzzeltocht.lon(pos) + ") "
|
|
|
+ + "(+- " + pos.coords.accuracy.toFixed(1) + "m, bijgewerkt " + ts + "s geleden)";
|
|
|
+
|
|
|
+ if (this.lastUpdate === undefined || Date.now() - this.lastUpdate > 5000) {
|
|
|
+ this.sendLocation(pos);
|
|
|
+ this.lastUpdate = Date.now();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sendLocation(pos) {
|
|
|
+ let r = {
|
|
|
+ missionId: this.mission == null ? null : this.mission.id,
|
|
|
+ location: {latitude: Puzzeltocht.lat(pos), longitude: Puzzeltocht.lon(pos)},
|
|
|
+ answer: null,
|
|
|
+ };
|
|
|
+ fetch("/api/event/" + encodeURIComponent(this.eventId) + "/team/" + encodeURIComponent(this.teamId), {
|
|
|
+ method: "PUT",
|
|
|
+ headers: {"Content-Type": "application/json"},
|
|
|
+ body: JSON.stringify(r)
|
|
|
+ })
|
|
|
+ .then(r => r.json())
|
|
|
+ .then(j => p.updateMission(j))
|
|
|
+ .catch(r => console.log(r));
|
|
|
+ }
|
|
|
+
|
|
|
+ updateMission(m) {
|
|
|
+ this.mission = m;
|
|
|
+ document.getElementById("missionTitle").innerText = m.title + " (" + m.distanceToTarget + "m)";
|
|
|
+ document.getElementById("missionDescription").innerText = m.description;
|
|
|
+ }
|
|
|
+
|
|
|
+ enableLocation() {
|
|
|
const geoOpts = {
|
|
|
enableHighAccuracy: true,
|
|
|
- maximumAge : 10000,
|
|
|
- timeout : 9500
|
|
|
+ maximumAge: 10000,
|
|
|
+ timeout: 9500
|
|
|
};
|
|
|
|
|
|
- navigator.geolocation.getCurrentPosition(
|
|
|
- (pos) => p.updateLocation(pos),
|
|
|
- (err) => console.log(err),
|
|
|
- geoOpts);
|
|
|
navigator.geolocation.watchPosition(
|
|
|
(pos) => p.updateLocation(pos),
|
|
|
(err) => console.log(err),
|
|
|
geoOpts);
|
|
|
-
|
|
|
- console.log("puzzeltocht initialised");
|
|
|
}
|
|
|
|
|
|
- updateLocation(pos) {
|
|
|
- let l = document.getElementById("location");
|
|
|
- let lat = pos.coords.latitude;
|
|
|
- let long = pos.coords.longitude;
|
|
|
- let ts = new Date(pos.timestamp);
|
|
|
- l.innerText = "positie: " + lat + ", " + long + ", " + pos.coords.accuracy + " (updated " + ts.toUTCString() + ")";
|
|
|
- if (this.lastUpdate === undefined || this.lastUpdate + 30000 < pos.timestamp) {
|
|
|
- this.lastUpdate = pos.timestamp;
|
|
|
- Puzzeltocht.updateMap(pos);
|
|
|
- }
|
|
|
+ static lat(pos) {
|
|
|
+ return pos.coords.latitude.toFixed(5);
|
|
|
}
|
|
|
|
|
|
- static updateMap(pos) {
|
|
|
- let img = document.getElementById("map");
|
|
|
- let lat = pos.coords.latitude;
|
|
|
- let long = pos.coords.longitude;
|
|
|
- let url = "https://staticmap.openstreetmap.de/staticmap.php?center=";
|
|
|
- url = url + lat + "," + long + "&zoom=18&size=256x256&maptype=mapnik";
|
|
|
- url = url + "&markers=" + lat + "," + long + ",lightblue1";
|
|
|
- img.src = url;
|
|
|
+ static lon(pos) {
|
|
|
+ return pos.coords.longitude.toFixed(5);
|
|
|
}
|
|
|
|
|
|
}
|