122 lines
3.8 KiB
JavaScript
122 lines
3.8 KiB
JavaScript
import Vue from 'vue';
|
|
import localforage from 'localforage';
|
|
|
|
import {
|
|
DEFAULT_TILE_CACHING_DURATION,
|
|
DEFAULT_TILE_SERVER,
|
|
} from '@/constants';
|
|
import * as types from './mutations-types';
|
|
|
|
// Handle the required migrations
|
|
export const initialState = {
|
|
hasGoneThroughIntro: false,
|
|
hasVibratedOnce: false,
|
|
isLoading: false,
|
|
location: {
|
|
error: null,
|
|
gpx: [],
|
|
watcherID: null,
|
|
},
|
|
lastReportFetchingLocation: [null, null],
|
|
map: {
|
|
center: [null, null],
|
|
zoom: null,
|
|
},
|
|
reportDetails: {
|
|
id: null,
|
|
previousId: null,
|
|
userAsked: null,
|
|
},
|
|
reports: [],
|
|
unsentReports: [],
|
|
settings: {
|
|
locale: 'en',
|
|
hasGeolocationPermission: true,
|
|
hasPermanentNotificationPermission: true,
|
|
hasPlaySoundPermission: true,
|
|
hasPreventSuspendPermission: true,
|
|
hasVibratePermission: true,
|
|
shouldAutorotateMap: false,
|
|
skipOnboarding: false,
|
|
tileCachingDuration: DEFAULT_TILE_CACHING_DURATION,
|
|
tileServer: DEFAULT_TILE_SERVER,
|
|
},
|
|
};
|
|
|
|
export const mutations = {
|
|
[types.DELETE_REPORT](state, { report }) {
|
|
const reportIndex = state.reports.findIndex(item => item.id === report.id);
|
|
if (reportIndex !== -1) {
|
|
Vue.delete(state.reports, reportIndex);
|
|
}
|
|
},
|
|
[types.HAS_VIBRATED_ONCE](state) {
|
|
state.hasVibratedOnce = true;
|
|
},
|
|
[types.INTRO_WAS_SEEN](state) {
|
|
state.hasGoneThroughIntro = true;
|
|
},
|
|
[types.INTRO_WAS_UNSEEN](state) {
|
|
state.hasGoneThroughIntro = false;
|
|
},
|
|
[types.IS_DONE_LOADING](state) {
|
|
state.isLoading = false;
|
|
},
|
|
[types.IS_LOADING](state) {
|
|
state.isLoading = true;
|
|
},
|
|
[types.LOAD_UNSENT_REPORTS](state, { unsentReports }) {
|
|
state.unsentReports = unsentReports;
|
|
},
|
|
[types.PUSH_REPORT](state, { report }) {
|
|
const reportIndex = state.reports.findIndex(item => item.id === report.id);
|
|
if (reportIndex === -1) {
|
|
state.reports.push(report);
|
|
} else {
|
|
Vue.set(state.reports, reportIndex, report);
|
|
}
|
|
},
|
|
[types.PUSH_UNSENT_REPORT](state, { report }) {
|
|
state.unsentReports.push(report);
|
|
localforage.setItem('unsentReports.items', state.unsentReports);
|
|
},
|
|
[types.REMOVE_UNSENT_REPORT](state, { index }) {
|
|
state.unsentReports.splice(index, 1);
|
|
localforage.setItem('unsentReports.items', state.unsentReports);
|
|
},
|
|
[types.SET_CURRENT_MAP_CENTER](state, { center }) {
|
|
Vue.set(state.map, 'center', center);
|
|
},
|
|
[types.SET_CURRENT_MAP_ZOOM](state, { zoom }) {
|
|
Vue.set(state.map, 'zoom', zoom);
|
|
},
|
|
[types.SET_CURRENT_POSITION](state, { currentLocation }) {
|
|
state.location.gpx.push(currentLocation);
|
|
},
|
|
[types.SET_LAST_REPORT_FETCHING_LOCATION](state, { locationLatLng }) {
|
|
state.lastReportFetchingLocation = locationLatLng;
|
|
},
|
|
[types.SET_LOCATION_ERROR](state, { error }) {
|
|
Vue.set(state.location, 'error', error);
|
|
},
|
|
[types.SET_LOCATION_WATCHER_ID](state, { id }) {
|
|
Vue.set(state.location, 'watcherID', id);
|
|
},
|
|
[types.SET_SETTING](state, { setting, value }) {
|
|
localforage.setItem(`settings.${setting}`, value);
|
|
state.settings[setting] = value;
|
|
},
|
|
[types.SHOW_REPORT_DETAILS](state, { id, userAsked }) {
|
|
if (id === null) {
|
|
// If closing the details, keep track of what the id was to prevent
|
|
// reopening the details immediately.
|
|
Vue.set(state.reportDetails, 'previousId', state.reportDetails.id);
|
|
}
|
|
Vue.set(state.reportDetails, 'id', id);
|
|
Vue.set(state.reportDetails, 'userAsked', userAsked);
|
|
},
|
|
[types.STORE_REPORTS](state, { reports }) {
|
|
state.reports = reports;
|
|
},
|
|
};
|