c3lf-system-3/web/src/store/index.js

152 lines
5.3 KiB
JavaScript
Raw Normal View History

2019-11-13 21:40:14 +00:00
import Vue from 'vue';
import Vuex from 'vuex';
2019-12-19 23:19:38 +00:00
import AxiosBootstrap from 'axios';
import config from '../config';
2019-12-29 16:04:03 +00:00
import * as _ from 'lodash/fp';
import router from '../router';
2019-11-13 21:40:14 +00:00
2019-12-28 03:05:58 +00:00
import * as base64 from 'base-64';
import * as utf8 from 'utf8';
2019-11-13 21:40:14 +00:00
Vue.use(Vuex);
2019-12-19 23:19:38 +00:00
const axios = AxiosBootstrap.create({
2023-11-27 00:14:52 +00:00
baseURL: config.service.url,
auth: config.service.auth
2019-12-19 23:19:38 +00:00
});
2019-12-05 21:26:45 +00:00
2019-12-19 23:31:28 +00:00
axios.interceptors.response.use(response => response, error => {
2023-11-27 00:14:52 +00:00
console.log('error interceptor fired');
console.error(error); // todo: toast error
console.log(Object.entries(error));
2019-12-27 01:06:04 +00:00
2023-11-27 00:14:52 +00:00
if (error.isAxiosError) {
const message = `
2019-12-27 01:06:04 +00:00
<h3>A HTTP ${error.config.method} request failed.</h3>
2019-12-28 03:24:53 +00:00
<p>
url: ${error.config.url}
<br>
timeout: ${!!error.request.timeout}
<br>
response-body: ${error.response && error.response.body}
</p>
2019-12-27 01:06:04 +00:00
`;
2023-11-27 00:14:52 +00:00
store.commit('createToast', {title: 'Error: HTTP', message, color: 'danger'});
} else {
store.commit('createToast', {title: 'Error: Unknown', message: error.toString(), color: 'danger'});
}
return Promise.reject(error);
2019-12-19 23:31:28 +00:00
});
const store = new Vuex.Store({
2023-11-27 00:14:52 +00:00
state: {
keyIncrement: 0,
events: [],
layout: 'cards',
loadedItems: [],
loadedBoxes: [],
toasts: [],
lastUsed: localStorage.getItem('lf_lastUsed') || {},
},
getters: {
getEventSlug: state => state.route && state.route.params.event ? state.route.params.event : state.events.length ? state.events[0].slug : '36C3',
getActiveView: state => state.route.name || 'items',
getFilters: state => state.route.query,
getBoxes: state => state.loadedBoxes
},
mutations: {
updateLastUsed(state, diff) {
state.lastUsed = _.extend(state.lastUsed, diff);
localStorage.setItem('lf_lastUsed', state.lastUsed);
},
replaceEvents(state, events) {
state.events = events;
},
changeView(state, {view, slug}) {
router.push({path: `/${slug}/${view}`});
},
replaceLoadedItems(state, newItems) {
state.loadedItems = newItems;
},
setLayout(state, layout) {
state.layout = layout;
},
replaceBoxes(state, loadedBoxes) {
state.loadedBoxes = loadedBoxes;
},
updateItem(state, updatedItem) {
const item = state.loadedItems.filter(({uid}) => uid === updatedItem.uid)[0];
Object.assign(item, updatedItem);
},
removeItem(state, item) {
state.loadedItems = state.loadedItems.filter(it => it !== item);
},
appendItem(state, item) {
state.loadedItems.push(item);
},
createToast(state, {title, message, color}) {
2023-11-27 00:38:43 +00:00
var toast = {title, message, color, key: state.keyIncrement}
state.toasts.push(toast);
2023-11-27 00:14:52 +00:00
state.keyIncrement += 1;
2023-11-27 00:38:43 +00:00
return toast;
2023-11-27 00:14:52 +00:00
},
removeToast(state, key) {
state.toasts = state.toasts.filter(toast => toast.key !== key);
}
},
actions: {
async loadEvents({commit}) {
const {data} = await axios.get('/1/events');
commit('replaceEvents', data);
},
changeEvent({dispatch, getters}, eventName) {
router.push({path: `/${eventName.slug}/${getters.getActiveView}`});
dispatch('loadEventItems');
},
changeView({getters}, link) {
router.push({path: `/${getters.getEventSlug}/${link.path}`});
},
showBoxContent({getters}, box) {
router.push({path: `/${getters.getEventSlug}/items`, query: {box}});
},
async loadEventItems({commit, getters}) {
const {data} = await axios.get(`/1/${getters.getEventSlug}/items`);
commit('replaceLoadedItems', data);
},
async searchEventItems({commit, getters}, query) {
const foo = utf8.encode(query);
const bar = base64.encode(foo);
2019-12-28 03:05:58 +00:00
2023-11-27 00:14:52 +00:00
const {data} = await axios.get(`/1/${getters.getEventSlug}/items/${bar}`);
commit('replaceLoadedItems', data);
},
async loadBoxes({commit}) {
const {data} = await axios.get('/1/boxes');
commit('replaceBoxes', data);
},
async updateItem({commit, getters}, item) {
const {data} = await axios.put(`/1/${getters.getEventSlug}/item/${item.uid}`, item);
commit('updateItem', data);
},
async markItemReturned({commit, getters}, item) {
await axios.put(`/1/${getters.getEventSlug}/item/${item.uid}`, {returned: true});
commit('removeItem', item);
},
async deleteItem({commit, getters}, item) {
await axios.delete(`/1/${getters.getEventSlug}/item/${item.uid}`, item);
commit('removeItem', item);
},
async postItem({commit, getters}, item) {
commit('updateLastUsed', {box: item.box, cid: item.cid});
const {data} = await axios.post(`/1/${getters.getEventSlug}/item`, item);
commit('appendItem', data);
}
2019-12-14 22:51:06 +00:00
}
2019-11-13 21:40:14 +00:00
});
export default store;
2023-11-27 00:14:52 +00:00
store.dispatch('loadEvents').then(() => {
store.dispatch('loadEventItems');
store.dispatch('loadBoxes');
2019-12-27 01:06:04 +00:00
});