import { jugglService } from "@/services/juggl.service.js"; export const juggl = { state: { apiUrl: "https://juggl.giller.dev/api", projects: [], records: [], tags: [], user: undefined, auth: undefined, recordsLimit: 0 }, mutations: { setProjects(state, projects) { state.projects = projects; }, setRecords(state, records) { state.records = records; }, setTags(state, tags) { state.tags = tags; }, setRecordsLimit(state, limit) { state.recordsLimit = limit; }, setUser(state, user) { state.user = user; }, logout(state) { state.auth = undefined; localStorage.removeItem("apiKey"); localStorage.removeItem("userId"); }, login(state, { apiKey, userId }) { state.auth = { apiKey: apiKey, userId: userId }; localStorage.setItem("apiKey", apiKey); localStorage.setItem("userId", userId); } }, getters: { runningRecords: state => { return Object.values(state.records).filter(record => record.running); }, finishedRecords: state => { return Object.values(state.records).filter(record => !record.running); }, auth: state => state.auth, apiUrl: state => state.apiUrl, user: state => state.user, isLoggedIn: state => !!state.auth, records: state => state.records, projects: state => state.projects, tags: state => state.tags, projectIds: state => { var projectIds = []; Object.values(state.projects).forEach(project => { projectIds.push(project.project_id); }); return projectIds; }, runningProjectIds: (state, getters) => { var runningProjectIds = []; Object.values(getters.runningRecords).forEach(record => { var projectId = record.project_id; if (runningProjectIds.includes(runningProjectIds) === false) { runningProjectIds.push(projectId); } }); return runningProjectIds; }, finishedProjectIds: (state, getters) => { var runningProjectIds = getters.runningProjectIds; return getters.projectIds.filter(id => !runningProjectIds.includes(id)); }, finishedProjects: (state, getters) => { var ids = getters.finishedProjectIds; return Object.values(state.projects).filter(project => ids.includes(project.project_id) ); }, runningProjects: (state, getters) => { var ids = getters.runningProjectIds; return Object.values(state.projects).filter(project => ids.includes(project.project_id) ); }, getProjectById: (state, getters) => id => { return Object.values(getters.projects).find( project => project.project_id === id ); }, getTagById: (state, getters) => id => { return Object.values(getters.tags).find(tag => tag.record_tag_id === id); }, getRecordById: (state, getters) => id => { return Object.values(getters.records).find( record => record.record_id === id ); }, getRecordsExceptId: (state, getters) => id => { return Object.values(getters.records).filter( record => record.record_id !== id ); }, getProjectsExceptId: (state, getters) => id => { return Object.values(getters.projects).filter( project => project.project_id !== id ); }, getTagsExceptId: (state, getters) => id => { return Object.values(getters.tags).filter( tag => tag.record_tag_id !== id ); } }, actions: { loadProjects({ commit }) { return jugglService.getProjects().then(r => { commit("setProjects", r.data.projects); }); }, loadTags({ commit }) { return jugglService.getTags().then(r => { commit("setTags", r.data.record_tags); }); }, loadUser({ commit }) { return jugglService .getUser() .catch(() => { return false; }) .then(r => { commit("setUser", r.data.users[0]); return true; }); }, loadRecords({ commit, state, getters }, { limit, finished }) { if (limit !== undefined) { commit("setRecordsLimit", limit); } var payload = { limit: state.recordsLimit, finished: finished }; return jugglService.getRecords(payload).then(r => { var allRecords = Object.values(r.data.records); if (finished === true) { allRecords = [...allRecords, ...getters.runningRecords]; } else if (finished === false) { allRecords = [...allRecords, ...getters.finishedRecords]; } commit("setRecords", allRecords); }); }, loadRunningRecords({ commit, getters }) { return jugglService.getRunningRecords().then(r => { var allRecords = { ...getters.finishedRecords, ...r.data.records }; commit("setRecords", allRecords); }); }, login({ commit, getters }, { userId, apiKey }) { // Is already logged in? if (getters.isLoggedIn) { this.dispatch("logout"); } commit("login", { apiKey: apiKey, userId: userId }); return this.dispatch("loadUser") .catch(() => { this.dispatch("logout"); return false; }) .then(r => { if (r === false) { this.dispatch("logout"); return false; } else { return true; } }); }, logout({ commit }) { commit("setUser", undefined); commit("setProjects", []); commit("setRecords", []); commit("logout"); }, endRecord({ getters }, recordId) { if (recordId === undefined) { return false; } return jugglService .endRecord(recordId) .catch(() => { return false; }) .then(() => { // TODO: Return ended record from API var record = getters.getRecordById(recordId); record.running = false; return true; }); }, addProject(context, { name }) { return jugglService .addProject(name) .catch(() => { return false; }) .then(() => { this.dispatch("loadProjects"); return true; }); }, addTag(context, { name }) { return jugglService .addTag(name) .catch(() => { return false; }) .then(() => { this.dispatch("loadTags"); return true; }); }, addTagToRecord(context, { tagId, recordId }) { return jugglService .addTagToRecord(tagId, recordId) .catch(() => { return false; }) .then(() => { // TODO: Manualy add tag return true; }); }, removeTagFromRecord(context, { tagId, recordId }) { return jugglService .removeTagFromRecord(tagId, recordId) .catch(() => { return false; }) .then(() => { // TODO: Manualy remove tag return true; }); }, startRecord(context, projectId) { if (projectId === undefined) { return false; } return jugglService .startRecord(projectId) .catch(() => { return false; }) .then(() => { this.dispatch("loadRunningRecords"); return true; }); }, removeRecord({ commit, getters }, recordId) { if (recordId === undefined) { return false; } return jugglService .removeRecord(recordId) .catch(() => { return false; }) .then(() => { commit("setRecords", getters.getRecordsExceptId(recordId)); return true; }); }, removeProject({ commit, getters }, projectId) { if (projectId === undefined) { return false; } return jugglService .removeProject(projectId) .catch(() => { return false; }) .then(() => { commit("setProjects", getters.getProjectsExceptId(projectId)); return true; }); }, removeTag({ commit, getters }, tagId) { if (tagId === undefined) { return false; } return jugglService .removeRecordTag(tagId) .catch(() => { return false; }) .then(() => { commit("setTags", getters.getTagsExceptId(tagId)); return true; }); }, loadSavedLogin() { var userId = localStorage.getItem("userId"); var apiKey = localStorage.getItem("apiKey"); if (userId == undefined || apiKey == undefined) { return; } this.dispatch("login", { apiKey: apiKey, userId: userId }); }, removeLocalRecords({ commit }) { commit("setRecords", []); }, updateRecord({ commit, getters }, record) { if (record.record_id === undefined) { return; } return jugglService .updateRecord(record) .catch(() => { return false; }) .then(() => { // TODO: Return updated record from API var records = getters.getRecordsExceptId(record.record_id); records.push(record); commit("setRecords", records); return true; }); }, updateTag({ commit, getters }, tag) { if (tag.record_tag_id === undefined) { return; } return jugglService .updateRecordTag(tag) .catch(() => { return false; }) .then(() => { // TODO: Return updated tag from API var tags = getters.getTagsExceptId(tag.record_tag_id); tags.push(tag); commit("setTags", tags); return true; }); }, updateProject({ commit, getters }, project) { if (project.project_id === undefined) { return; } return jugglService .updateProject(project) .catch(() => { return false; }) .then(() => { // TODO: Return updated project from API var projects = getters.getProjectsExceptId(project.project_id); projects.push(project); commit("setProjects", projects); return true; }); } } };