add shared-state-plugin
This commit is contained in:
parent
e91b64ca97
commit
67375bd281
7 changed files with 455 additions and 24 deletions
|
@ -4,8 +4,9 @@ import router from './router';
|
|||
import * as base64 from 'base-64';
|
||||
import * as utf8 from 'utf8';
|
||||
import {ticketStateColorLookup, ticketStateIconLookup, http} from "@/utils";
|
||||
|
||||
import sharedStatePlugin from "@/shared-state-plugin";
|
||||
import persistentStatePlugin from "@/persistent-state-plugin";
|
||||
import {triggerRef} from "vue";
|
||||
|
||||
const store = createStore({
|
||||
state: {
|
||||
|
@ -20,6 +21,7 @@ const store = createStore({
|
|||
groups: [],
|
||||
state_options: [],
|
||||
lastEvent: '37C3',
|
||||
lastUsed: {},
|
||||
remember: false,
|
||||
user: {
|
||||
username: null,
|
||||
|
@ -30,7 +32,19 @@ const store = createStore({
|
|||
},
|
||||
|
||||
thumbnailCache: {},
|
||||
fetchedData: {
|
||||
events: 0,
|
||||
items: 0,
|
||||
boxes: 0,
|
||||
tickets: 0,
|
||||
users: 0,
|
||||
groups: 0,
|
||||
states: 0,
|
||||
},
|
||||
persistent_loaded: false,
|
||||
shared_loaded: false,
|
||||
afterInitHandlers: [],
|
||||
|
||||
showAddBoxModal: false,
|
||||
},
|
||||
getters: {
|
||||
|
@ -80,26 +94,33 @@ const store = createStore({
|
|||
},
|
||||
},
|
||||
mutations: {
|
||||
updateLastUsed(state, diff) {
|
||||
state.lastUsed = {...state.lastUsed, ...diff};
|
||||
},
|
||||
updateLastEvent(state, slug) {
|
||||
state.lastEvent = slug;
|
||||
},
|
||||
replaceEvents(state, events) {
|
||||
state.events = events;
|
||||
state.fetchedData = {...state.fetchedData, events: Date.now()};
|
||||
},
|
||||
replaceTicketStates(state, states) {
|
||||
state.state_options = states;
|
||||
state.fetchedData = {...state.fetchedData, states: Date.now()};
|
||||
},
|
||||
changeView(state, {view, slug}) {
|
||||
router.push({path: `/${slug}/${view}`});
|
||||
},
|
||||
replaceLoadedItems(state, newItems) {
|
||||
state.loadedItems = newItems;
|
||||
state.fetchedData = {...state.fetchedData, items: Date.now()}; // TODO: manage caching items for different events and search results correctly
|
||||
},
|
||||
setItemCache(state, {slug, items}) {
|
||||
state.itemCache[slug] = items;
|
||||
},
|
||||
replaceBoxes(state, loadedBoxes) {
|
||||
state.loadedBoxes = loadedBoxes;
|
||||
state.fetchedData = {...state.fetchedData, boxes: Date.now()};
|
||||
},
|
||||
updateItem(state, updatedItem) {
|
||||
const item = state.loadedItems.filter(({uid}) => uid === updatedItem.uid)[0];
|
||||
|
@ -113,16 +134,21 @@ const store = createStore({
|
|||
},
|
||||
replaceTickets(state, tickets) {
|
||||
state.tickets = tickets;
|
||||
},
|
||||
replaceUsers(state, users) {
|
||||
state.users = users;
|
||||
},
|
||||
replaceGroups(state, groups) {
|
||||
state.groups = groups;
|
||||
state.fetchedData = {...state.fetchedData, tickets: Date.now()};
|
||||
},
|
||||
updateTicket(state, updatedTicket) {
|
||||
const ticket = state.tickets.filter(({id}) => id === updatedTicket.id)[0];
|
||||
Object.assign(ticket, updatedTicket);
|
||||
//triggerRef(state.tickets);
|
||||
state.tickets = [...state.tickets];
|
||||
},
|
||||
replaceUsers(state, users) {
|
||||
state.users = users;
|
||||
state.fetchedData = {...state.fetchedData, users: Date.now()};
|
||||
},
|
||||
replaceGroups(state, groups) {
|
||||
state.groups = groups;
|
||||
state.fetchedData = {...state.fetchedData, groups: Date.now()};
|
||||
},
|
||||
openAddBoxModal(state) {
|
||||
state.showAddBoxModal = true;
|
||||
|
@ -227,6 +253,19 @@ const store = createStore({
|
|||
}
|
||||
await Promise.all(promises);
|
||||
},
|
||||
async afterSharedInit({dispatch, state}) {
|
||||
const handlers = state.afterInitHandlers;
|
||||
state.afterInitHandlers = [];
|
||||
await Promise.all(handlers.map(h => h()).flat());
|
||||
},
|
||||
scheduleAfterInit({dispatch, state}, handler) {
|
||||
if (state.shared_loaded) {
|
||||
Promise.all(handler()).then(() => {
|
||||
});
|
||||
} else {
|
||||
state.afterInitHandlers.push(handler);
|
||||
}
|
||||
},
|
||||
async fetchImage({state}, url) {
|
||||
return await fetch(url, {headers: {'Authorization': `Token ${state.user.token}`}});
|
||||
},
|
||||
|
@ -235,11 +274,15 @@ const store = createStore({
|
|||
commit('setPermissions', data.permissions);
|
||||
},
|
||||
async loadEvents({commit, state}) {
|
||||
if (!state.user.token) return;
|
||||
if (state.fetchedData.events > Date.now() - 1000 * 60 * 60 * 24) return;
|
||||
const {data, success} = await http.get('/2/events/', state.user.token);
|
||||
if (data && success)
|
||||
commit('replaceEvents', data);
|
||||
},
|
||||
async fetchTicketStates({commit, state}) {
|
||||
if (!state.user.token) return;
|
||||
if (state.fetchedData.states > Date.now() - 1000 * 60 * 60 * 24) return;
|
||||
const {data, success} = await http.get('/2/tickets/states/', state.user.token);
|
||||
if (data && success)
|
||||
commit('replaceTicketStates', data);
|
||||
|
@ -255,6 +298,8 @@ const store = createStore({
|
|||
router.push({path: `/${getters.getEventSlug}/items/`, query: {box}});
|
||||
},
|
||||
async loadEventItems({commit, getters, state}) {
|
||||
if (!state.user.token) return;
|
||||
if (state.fetchedData.items > Date.now() - 1000 * 60 * 60 * 24) return;
|
||||
try {
|
||||
commit('replaceLoadedItems', []);
|
||||
const slug = getters.getEventSlug;
|
||||
|
@ -279,6 +324,8 @@ const store = createStore({
|
|||
commit('replaceLoadedItems', data);
|
||||
},
|
||||
async loadBoxes({commit, state}) {
|
||||
if (!state.user.token) return;
|
||||
if (state.fetchedData.boxes > Date.now() - 1000 * 60 * 60 * 24) return;
|
||||
const {data, success} = await http.get('/2/boxes/', state.user.token);
|
||||
if (data && success)
|
||||
commit('replaceBoxes', data);
|
||||
|
@ -315,6 +362,8 @@ const store = createStore({
|
|||
commit('appendItem', data);
|
||||
},
|
||||
async loadTickets({commit, state}) {
|
||||
if (!state.user.token) return;
|
||||
if (state.fetchedData.tickets > Date.now() - 1000 * 60 * 60 * 24) return;
|
||||
const {data, success} = await http.get('/2/tickets/', state.user.token);
|
||||
if (data && success)
|
||||
commit('replaceTickets', data);
|
||||
|
@ -322,6 +371,7 @@ const store = createStore({
|
|||
async sendMail({commit, dispatch, state}, {id, message}) {
|
||||
const {data, success} = await http.post(`/2/tickets/${id}/reply/`, {message}, state.user.token);
|
||||
if (data && success) {
|
||||
state.fetchedData.tickets = 0;
|
||||
await dispatch('loadTickets');
|
||||
}
|
||||
},
|
||||
|
@ -337,15 +387,20 @@ const store = createStore({
|
|||
async postComment({commit, dispatch, state}, {id, message}) {
|
||||
const {data, success} = await http.post(`/2/tickets/${id}/comment/`, {comment: message}, state.user.token);
|
||||
if (data && success) {
|
||||
state.fetchedData.tickets = 0;
|
||||
await dispatch('loadTickets');
|
||||
}
|
||||
},
|
||||
async loadUsers({commit, state}) {
|
||||
if (!state.user.token) return;
|
||||
if (state.fetchedData.users > Date.now() - 1000 * 60 * 60 * 24) return;
|
||||
const {data, success} = await http.get('/2/users/', state.user.token);
|
||||
if (data && success)
|
||||
commit('replaceUsers', data);
|
||||
},
|
||||
async loadGroups({commit, state}) {
|
||||
if (!state.user.token) return;
|
||||
if (state.fetchedData.groups > Date.now() - 1000 * 60 * 60 * 24) return;
|
||||
const {data, success} = await http.get('/2/groups/', state.user.token);
|
||||
if (data && success)
|
||||
commit('replaceGroups', data);
|
||||
|
@ -368,8 +423,38 @@ const store = createStore({
|
|||
"remember",
|
||||
"user",
|
||||
"events",
|
||||
"lastUsed",
|
||||
]
|
||||
}),
|
||||
sharedStatePlugin({
|
||||
debug: true,
|
||||
isLoadedKey: "shared_loaded",
|
||||
clearingMutation: "logout",
|
||||
afterInit: "afterSharedInit",
|
||||
state: [
|
||||
"test",
|
||||
"state_options",
|
||||
"fetchedData",
|
||||
"tickets",
|
||||
"users",
|
||||
"groups",
|
||||
"loadedBoxes",
|
||||
"loadedItems",
|
||||
],
|
||||
watch: [
|
||||
"test",
|
||||
"state_options",
|
||||
"fetchedData",
|
||||
"tickets",
|
||||
"users",
|
||||
"groups",
|
||||
"loadedBoxes",
|
||||
"loadedItems",
|
||||
],
|
||||
mutations: [
|
||||
//"replaceTickets",
|
||||
],
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue