Skip to content
Snippets Groups Projects
ReplayMap.js 2.63 KiB
Newer Older
L4168's avatar
L4168 committed
// https://github.com/linghuam/Leaflet.TrackPlayBack

import React from "react";
Ronnie Friman's avatar
Ronnie Friman committed
import { Link } from "react-router-dom";
L4168's avatar
L4168 committed
import L from "leaflet";
import "../track-playback/src/leaflet.trackplayback/clock";
import "../track-playback/src/leaflet.trackplayback/index";
import "../track-playback/src/control.trackplayback/control.playback";
import "../track-playback/src/control.trackplayback/index";
L4168's avatar
L4168 committed
import options from "./ReplayConfig";
L4168's avatar
L4168 committed

export default class ReplayMap extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
L4168's avatar
L4168 committed
      // stores game's initial location
      location: [62.3, 25.7],
L4168's avatar
L4168 committed
      // stores player locations from backend
L4168's avatar
L4168 committed
      players: [],
      // stores all factions from the game
      factions: [],
L4168's avatar
L4168 committed
      // stores all scores from the game
      scores: [],
L4168's avatar
L4168 committed
      // stores all drawings from backend
L4168's avatar
L4168 committed
      drawings: []
L4168's avatar
L4168 committed
    };
  }

  async componentDidMount() {
Ronnie Friman's avatar
Ronnie Friman committed
    // set gameId to state from URL
Ronnie Friman's avatar
Ronnie Friman committed
    await this.setState({
      gameId: await new URL(window.location.href).searchParams.get("id")
    });
L4168's avatar
L4168 committed
    // fetch all data and set it to state
    let replaydata = await this.fetchReplayData();
Ronnie Friman's avatar
Ronnie Friman committed
    await this.setState({
L4168's avatar
L4168 committed
      location: replaydata.location,
L4168's avatar
L4168 committed
      players: replaydata.players,
      factions: replaydata.factions,
L4168's avatar
L4168 committed
      scores: replaydata.scores,
      drawings: replaydata.drawings
Ronnie Friman's avatar
Ronnie Friman committed
    });
L4168's avatar
L4168 committed
    replaydata ? this.replay() : alert("No replay data was found");
L4168's avatar
L4168 committed
  fetchReplayData = async () => {
Ronnie Friman's avatar
Ronnie Friman committed
    let res = await fetch(
L4168's avatar
L4168 committed
      `${process.env.REACT_APP_API_URL}/replay/${this.state.gameId}`
Ronnie Friman's avatar
Ronnie Friman committed
    );
Ronnie Friman's avatar
Ronnie Friman committed
    if (await res.ok) {
      return await res.json();
Ronnie Friman's avatar
Ronnie Friman committed
    } else {
      alert("Game not found");
      window.document.location.href = "/";
    }
L4168's avatar
L4168 committed
  };

  tickDrawings = () => {
Ronnie Friman's avatar
Ronnie Friman committed
    return this.state.allGeoJSON.map(drawing => {
      return drawing[0];
L4168's avatar
L4168 committed
    });
  };

  replay = () => {
L4168's avatar
L4168 committed
    // create a map for the replay, setView to game's center cords
    this.map = L.map(this.refs.map).setView(
      this.state.location || [62.3, 25.7],
      14
    );
L4168's avatar
L4168 committed
    L.tileLayer("https://tiles.kartat.kapsi.fi/taustakartta/{z}/{x}/{y}.jpg", {
      attribution:
        '&copy; <a href="https://www.maanmittauslaitos.fi/">Maanmittauslaitos</a>'
    }).addTo(this.map);
L4168's avatar
L4168 committed
    // import options from ReplayConfig.js
    this.trackplayback = new L.TrackPlayBack(this.state, this.map, options);
L4168's avatar
L4168 committed
    this.trackplaybackControl = L.trackplaybackcontrol(this.trackplayback);
    this.trackplaybackControl.addTo(this.map);
  };

  render() {
    return (
L4168's avatar
L4168 committed
      <React.Fragment>
Ronnie Friman's avatar
Ronnie Friman committed
        <Link to="/">
          <button>Game selection</button>
        </Link>
L4168's avatar
L4168 committed
        <div className="map" ref="map" />
      </React.Fragment>
L4168's avatar
L4168 committed
    );
  }
}