src/components/presenters/map-presenter.js
import BasePresenter from './presenter';
import { HomeM, MapM, ProfileM, AlertM } from '../models/export-models';
/**
* Class for the Map Presenter.
* @extends BasePresenter
*/
class MapPresenter extends BasePresenter {
/**
* Creates an instance of the MapPresenter.
* @constructor
*/
constructor(view){
super();
this.view = view;
HomeM.subscribe(this);
MapM.subscribe(this);
}
/**
* @private
* We're cheating here because the map presenter subscribes too late to receive data from the home model
* so we just force a notifyAll and move on. This only happens when the component mounts
*/
forceRequestData() {
HomeM.forceNotifyAll();
}
/**
* Returns the data from the MapModel.
*
* @return {Object} The data from the map model.
*/
getData = () => {
return MapM.get();
}
/**
* If the view or presenter is destroyed, unsubscribe the presenter from the model.
*/
onDestroy = () => {
HomeM.unsubscribe(this);
MapM.unsubscribe(this);
};
/**
* onUpdated only called from HomeModel because MapModel doesn't call it.
* Since data in MapModel should be the same as the from the HomeModel, we don't have to read from the database in the MapModel
* and we can just wait for data to be received.
*/
onUpdated = (data) => {
MapM.update(data);
this.forceRefresh(); // We always want to force a refresh for the model because data only comes from the HomeModel
}
/**
* Force the view/presenter to refresh the view's data
*/
forceRefresh = () => {
this.view.setState({
markers: this.getData()
});
};
/**
* Get the profile picture from the profile model
*
* @param {Function} callback - A callback function that will be called with the resulting data
*/
getProfileImage = (callback) => {
ProfileM.getProfileData(callback);
}
/**
* Get the number of notifications from the Alerts model.
*
* @return {Number} The number of notifications
*/
getNotificationCount = () => {
return AlertM.getNotificationsCount();
}
/**
* Gets the user's current location from the model.
*
* @return {Object} The longitude and latitude of the user's current location
*/
getUserLocation = () => {
return MapM.getCurrentLocation();
}
filterMarkers = (markers, selectedFilter) => {
if (!selectedFilter || selectedFilter.length === 0 || selectedFilter.name === 'None') {
return markers;
}
let newMarkers = markers;
const filter = (selectedFilter.name).replace("< ", "");
newMarkers = newMarkers.filter((el) => {
const timeago = el.data.timeago;
const timeAgoNums = parseInt((timeago).replace(/[^0-9]/g, ''));
switch (filter) {
case "1 min ago":
return timeago.includes('s');
break;
case "1 hour ago":
return timeago.includes('min') || timeago.includes('mins') || timeago.includes('s');
break;
case "12 hours ago":
return timeAgoNums < 12 && (timeago.includes('h') || timeago.includes('min') || timeago.includes('mins') || timeago.includes('s'));
break;
case "1 day ago":
return timeago.includes('h') || timeago.includes('min') || timeago.includes('mins') || timeago.includes('s');;
break;
case "7 days ago":
return timeAgoNums < 7 && (timeago.includes('d') || timeago.includes('h') || timeago.includes('min') || timeago.includes('mins') || timeago.includes('s'));
break;
case "1 month ago":
return (timeago.includes('d') || timeago.includes('h') || timeago.includes('min') || timeago.includes('mins') || timeago.includes('s'));
break;
case "1 year ago":
return timeAgoNums < 365 && (timeago.includes('mo') || timeago.includes('d') || timeago.includes('h') || timeago.includes('min') || timeago.includes('mins') || timeago.includes('s'));
break;
}
});
return newMarkers;
}
}
export default MapPresenter;