calendar app: do not store events twice in vuex

This commit is contained in:
Julien Fastré 2022-05-17 17:31:17 +02:00
parent b50c51bc2a
commit b89edc29af
3 changed files with 71 additions and 2 deletions

View File

@ -2,15 +2,33 @@ import {USER_CALENDAR_SHOW_RANGES, USER_CALENDAR_SHOW_EVENTS} from './../const';
import {calendarRangeToFullCalendarEvent} from './utils'; import {calendarRangeToFullCalendarEvent} from './utils';
export default { export default {
/**
* get the main user of the event/Calendar
*
* @param state
* @returns {*|null}
*/
getMainUser(state) { getMainUser(state) {
return state.activity.mainUser || null; return state.activity.mainUser || null;
}, },
/**
* return the date of the event/Calendar
*
* @param state
* @returns {Date}
*/
getEventDate(state) { getEventDate(state) {
if (null === state.activity.start) { if (null === state.activity.start) {
return new Date(); return new Date();
} }
throw 'transform date to object ?'; throw 'transform date to object ?';
}, },
/**
* Compute the event sources to show on the FullCalendar
*
* @param state
* @returns {*[]}
*/
getEventSources(state) { getEventSources(state) {
console.log('getEventSources'); console.log('getEventSources');
let sources = []; let sources = [];
@ -50,12 +68,32 @@ export default {
return sources; return sources;
}, },
/**
* get the user data for a specific user
*
* @param state
* @returns {function(*): unknown}
*/
getUserData: (state) => (user) => { getUserData: (state) => (user) => {
return state.usersData.get(user.id); return state.usersData.get(user.id);
}, },
/**
* return true if the user has an entry in userData
*
* @param state
* @returns {function(*): boolean}
*/
hasUserData: (state) => (user) => { hasUserData: (state) => (user) => {
return state.usersData.has(user.id); return state.usersData.has(user.id);
}, },
/**
* return true if there was a fetch query for event between this date (start and end),
* those date are included.
*
* @param state
* @param getters
* @returns {(function({user: *, start: *, end: *}): (boolean))|*}
*/
isCalendarRangeLoadedForUser: (state, getters) => ({user, start, end}) => { isCalendarRangeLoadedForUser: (state, getters) => ({user, start, end}) => {
if (!getters.hasUserData(user)) { if (!getters.hasUserData(user)) {
return false; return false;
@ -69,6 +107,9 @@ export default {
return false; return false;
}, },
suggestedEntities(state, getters) { suggestedEntities(state, getters) {
if (typeof (state.activity.accompanyingPeriod) === 'undefined') { if (typeof (state.activity.accompanyingPeriod) === 'undefined') {
return []; return [];

View File

@ -22,13 +22,25 @@ const store = createStore({
activity: mapEntity(window.entity), // activity is the calendar entity actually activity: mapEntity(window.entity), // activity is the calendar entity actually
currentEvent: null, currentEvent: null,
availableLocations: [], availableLocations: [],
/**
* the current user
*/
me: null, me: null,
initialDate: null, /**
* store information about current view
*/
currentView: { currentView: {
start: null, start: null,
end: null, end: null,
users: new Map(), users: new Map(),
}, },
/**
* store a list of existing event, to avoid storing them twice
*/
existingEvents: new Set(),
/**
* store user data
*/
usersData: new Map(), usersData: new Map(),
}, },
getters, getters,

View File

@ -44,6 +44,15 @@ export default {
} }
; ;
}, },
/**
* Add CalendarRange object for an user
*
* @param state
* @param user
* @param ranges
* @param start
* @param end
*/
addCalendarRangesForUser(state, {user, ranges, start, end}) { addCalendarRangesForUser(state, {user, ranges, start, end}) {
let userData; let userData;
if (state.usersData.has(user.id)) { if (state.usersData.has(user.id)) {
@ -53,7 +62,14 @@ export default {
state.usersData.set(user.id, userData); state.usersData.set(user.id, userData);
} }
const eventRanges = ranges.map(r => calendarRangeToFullCalendarEvent(r)); const eventRanges = ranges
.filter(r => !state.existingEvents.has(`range_${r.id}`))
.map(r => {
// add to existing ids
state.existingEvents.add(`range_${r.id}`);
return r;
})
.map(r => calendarRangeToFullCalendarEvent(r));
userData.calendarRanges = userData.calendarRanges.concat(eventRanges); userData.calendarRanges = userData.calendarRanges.concat(eventRanges);
userData.calendarRangesLoaded.push({start, end}); userData.calendarRangesLoaded.push({start, end});