Home Reference Source Test Repository

src/components/map/state.js

import assign from "lodash/object/assign";
import Arkham from "../../core/arkham";
import Events from "../../core/mixins/events";
// TODO: Pull in only delay method
import delay from "lodash/function/delay";
import find from "lodash/collection/find";

let _ = {
  find, delay
};

let CHANGE_EVENT = "change";

let state = {
  isOpen: false,
  isFetching: true,
  fetchingPlace: "",
  isDetail: false,
  activeSetIndex: 0,
  poi: 2,
  currentLocation: {},
  sets: [],
  error: null,
  hoveredPin: 0,
  hoveredItem: null,
  customPanel: "",
  tabDropdownOpen: false,
  placeParent: "",
  topicClicked: ""
};

let MapState = assign({

  getState() {
    return state;
  },

  emitChange() {
    this.trigger(CHANGE_EVENT);
  },

  addChangeListener(cb) {
    this.on(CHANGE_EVENT, cb);
  },

  removeChangeListener(cb) {
    this.stopListening(CHANGE_EVENT, cb);
  },

  sortSets: (sets) => {
    let headings = state.topics.concat([
      "Countries", "Cities", "Sponsored", "About"
    ]);

    return headings.reduce((memo, heading) => {
      let set = find(sets, (set) => set.title === heading);
      if (set) {
        memo.push(set);
      }

      return memo;
    }, []);
  }
}, Events);

Arkham.on("map.opened", () => {
  state.isOpen = true;
  MapState.emitChange();
});

Arkham.on("map.closed", () => {
  state.isOpen = false;
  MapState.emitChange();
});

Arkham.on("view.changed", (data) => {
  state.hoveredItem = data;
  state.activeSetIndex = data.view;
  state.customPanel = "";
  MapState.emitChange();
});

Arkham.on("poi.opened", (data) => {
  state.poiIndex = parseInt(data.index, 10);
  state.poi = data.poi;
  state.isDetail = true;
  MapState.emitChange();
});

Arkham.on("poi.closed", () => {
  state.poi = null;
  state.isDetail = false;
  MapState.emitChange();
});

Arkham.on("place.fetching", (data) => {
  state.isFetching = true;
  state.fetchingPlace = data.placeTitle;
  state.placeParent = data.breadcrumb;
  state.topicClicked = data.topic;
  MapState.emitChange();
});

Arkham.on("place.fetched", (data) => {
  state.currentLocation = data.location;
  state.topics = data.topics;
  state.sets = MapState.sortSets(data.sets.filter((s) => !!s.items.length));
  state.activeSetIndex = 0;
  state.fetchingPlace = "";
  state.isFetching = false;
  state.customPanel = "";
  MapState.emitChange();
});

Arkham.on("place.errorfetching", (data) => {
  state.isFetching = false;
  state.fetchingPlace = "";
  state.error = data;
  MapState.emitChange();
  _.delay(function() {
    state.error = null;
    MapState.emitChange();
  }, 3000);
});

Arkham.on("state.setinitial", (data) => {
  state.isFetching = false;
  state.topics = data.topics;
  state.sets = MapState.sortSets(data.sets.filter((s) => !!s.items.length));
  state.currentLocation = data.location;
  MapState.emitChange();
});

Arkham.on("poi.hover", (data) => {
  state.hoveredPin = data.pin;
  MapState.emitChange();
});

Arkham.on("item.hovered", (data) => {
  state.hoveredItem = data;
  MapState.emitChange();
});

Arkham.on("custompanel.opened", (data) => {
  state.lastActiveSetIndex = state.activeSetIndex;
  state.activeSetIndex = data.view;
  state.customPanel = data.panel;
  MapState.emitChange();
});

Arkham.on("sponsor.fetched", (data) => {
  state.sets.push(data);
  MapState.emitChange();
});

export default MapState;;