From bde12418433f3ae9d2ad3781343f334caf58cc95 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Wed, 8 Mar 2017 17:58:49 +0100 Subject: [PATCH 1/4] eslint fixes. --- src/components/conversation/conversation.js | 2 +- test/unit/specs/modules/statuses.spec.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/conversation/conversation.js b/src/components/conversation/conversation.js index 769893d3..281b0183 100644 --- a/src/components/conversation/conversation.js +++ b/src/components/conversation/conversation.js @@ -49,7 +49,7 @@ const conversation = { } }, focused: function (id) { - if (!!this.statusoid.retweeted_status) { + if (this.statusoid.retweeted_status) { return (id === this.statusoid.retweeted_status.id) } else { return (id === this.statusoid.id) diff --git a/test/unit/specs/modules/statuses.spec.js b/test/unit/specs/modules/statuses.spec.js index b1581e03..891423ca 100644 --- a/test/unit/specs/modules/statuses.spec.js +++ b/test/unit/specs/modules/statuses.spec.js @@ -1,6 +1,7 @@ import { cloneDeep } from 'lodash' import { defaultState, mutations, findMaxId, prepareStatus, statusType } from '../../../../src/modules/statuses.js' +// eslint-disable-next-line camelcase const makeMockStatus = ({id, text, is_post_verb = true}) => { return { id, From 480a1ba253d49d4df36fbc64192e1260fc51a181 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Wed, 8 Mar 2017 17:59:12 +0100 Subject: [PATCH 2/4] Use cache to quickly access users. --- src/lib/persisted_state.js | 9 ++++++++- src/modules/users.js | 10 ++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/lib/persisted_state.js b/src/lib/persisted_state.js index a518cb51..a47ad7d5 100644 --- a/src/lib/persisted_state.js +++ b/src/lib/persisted_state.js @@ -1,7 +1,7 @@ import merge from 'lodash.merge' import objectPath from 'object-path' import localforage from 'localforage' -import { throttle } from 'lodash' +import { throttle, each } from 'lodash' const defaultReducer = (state, paths) => ( paths.length === 0 ? state : paths.reduce((substate, path) => { @@ -33,6 +33,13 @@ export default function createPersistedState ({ return store => { getState(key, storage).then((savedState) => { if (typeof savedState === 'object') { + // build user cache + const usersState = savedState.users || {} + usersState.usersObject = {} + const users = usersState.users || [] + each(users, (user) => { usersState.usersObject[user.id] = user }) + savedState.users = usersState + store.replaceState( merge({}, store.state, savedState) ) diff --git a/src/modules/users.js b/src/modules/users.js index 31731880..dc910c91 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -3,9 +3,9 @@ import { compact, map, each, find, merge } from 'lodash' import { set } from 'vue' // TODO: Unify with mergeOrAdd in statuses.js -export const mergeOrAdd = (arr, item) => { +export const mergeOrAdd = (arr, obj, item) => { if (!item) { return false } - const oldItem = find(arr, {id: item.id}) + const oldItem = obj[item.id] if (oldItem) { // We already have this, so only merge the new info. merge(oldItem, item) @@ -13,6 +13,7 @@ export const mergeOrAdd = (arr, item) => { } else { // This is a new item, prepare it arr.push(item) + obj[item.id] = item return {item, new: true} } } @@ -32,7 +33,7 @@ export const mutations = { state.loggingIn = false }, addNewUsers (state, users) { - each(users, (user) => mergeOrAdd(state.users, user)) + each(users, (user) => mergeOrAdd(state.users, state.usersObject, user)) }, setUserForStatus (state, status) { status.user = find(state.users, status.user) @@ -42,7 +43,8 @@ export const mutations = { export const defaultState = { currentUser: false, loggingIn: false, - users: [] + users: [], + usersObject: {} } const users = { From 5699872bb5e05b5dc576c75cac2c79b7ece3f2ac Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Wed, 8 Mar 2017 18:04:21 +0100 Subject: [PATCH 3/4] Use user cache in users module. --- src/modules/users.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/users.js b/src/modules/users.js index dc910c91..9367ec68 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -1,5 +1,5 @@ import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' -import { compact, map, each, find, merge } from 'lodash' +import { compact, map, each, merge } from 'lodash' import { set } from 'vue' // TODO: Unify with mergeOrAdd in statuses.js @@ -20,7 +20,7 @@ export const mergeOrAdd = (arr, obj, item) => { export const mutations = { setMuted (state, { user: {id}, muted }) { - const user = find(state.users, {id}) + const user = state.usersObject[id] set(user, 'muted', muted) }, setCurrentUser (state, user) { @@ -36,7 +36,7 @@ export const mutations = { each(users, (user) => mergeOrAdd(state.users, state.usersObject, user)) }, setUserForStatus (state, status) { - status.user = find(state.users, status.user) + status.user = state.usersObject[status.user.id] } } From 0d39ed809b17dc7a3304f9a659c3d5e99d960f26 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Wed, 8 Mar 2017 21:04:48 +0100 Subject: [PATCH 4/4] Add caching system to statuses. --- src/modules/statuses.js | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/modules/statuses.js b/src/modules/statuses.js index b19109b2..e4528520 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -4,14 +4,17 @@ import apiService from '../services/api/api.service.js' export const defaultState = { allStatuses: [], + allStatusesObject: {}, maxId: 0, notifications: [], favorites: new Set(), timelines: { mentions: { statuses: [], + statusesObject: {}, faves: [], visibleStatuses: [], + visibleStatusesObject: {}, newStatusCount: 0, maxId: 0, minVisibleId: 0, @@ -20,8 +23,10 @@ export const defaultState = { }, public: { statuses: [], + statusesObject: {}, faves: [], visibleStatuses: [], + visibleStatusesObject: {}, newStatusCount: 0, maxId: 0, minVisibleId: 0, @@ -30,8 +35,10 @@ export const defaultState = { }, publicAndExternal: { statuses: [], + statusesObject: {}, faves: [], visibleStatuses: [], + visibleStatusesObject: {}, newStatusCount: 0, maxId: 0, minVisibleId: 0, @@ -40,8 +47,10 @@ export const defaultState = { }, friends: { statuses: [], + statusesObject: {}, faves: [], visibleStatuses: [], + visibleStatusesObject: {}, newStatusCount: 0, maxId: 0, minVisibleId: 0, @@ -91,8 +100,9 @@ export const findMaxId = (...args) => { return (maxBy(flatten(args), 'id') || {}).id } -const mergeOrAdd = (arr, item) => { - const oldItem = find(arr, {id: item.id}) +const mergeOrAdd = (arr, obj, item) => { + const oldItem = obj[item.id] + if (oldItem) { // We already have this, so only merge the new info. merge(oldItem, item) @@ -103,6 +113,7 @@ const mergeOrAdd = (arr, item) => { // This is a new item, prepare it prepareStatus(item) arr.push(item) + obj[item.id] = item return {item, new: true} } } @@ -122,6 +133,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us } const allStatuses = state.allStatuses + const allStatusesObject = state.allStatusesObject const timelineObject = state.timelines[timeline] // Set the maxId to the new id if it's larger. @@ -131,7 +143,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us } const addStatus = (status, showImmediately, addToTimeline = true) => { - const result = mergeOrAdd(allStatuses, status) + const result = mergeOrAdd(allStatuses, allStatusesObject, status) status = result.item if (result.new) { @@ -147,7 +159,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us // Add the mention to the mentions timeline if (timelineObject !== mentions) { - mergeOrAdd(mentions.statuses, status) + mergeOrAdd(mentions.statuses, mentions.statusesObject, status) mentions.newStatusCount += 1 sortTimeline(mentions) @@ -161,13 +173,13 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us let resultForCurrentTimeline // Some statuses should only be added to the global status repository. if (timeline && addToTimeline) { - resultForCurrentTimeline = mergeOrAdd(timelineObject.statuses, status) + resultForCurrentTimeline = mergeOrAdd(timelineObject.statuses, timelineObject.statusesObject, status) } if (timeline && showImmediately) { // Add it directly to the visibleStatuses, don't change // newStatusCount - mergeOrAdd(timelineObject.visibleStatuses, status) + mergeOrAdd(timelineObject.visibleStatuses, timelineObject.visibleStatusesObject, status) } else if (timeline && addToTimeline && resultForCurrentTimeline.new) { // Just change newStatuscount timelineObject.newStatusCount += 1 @@ -264,24 +276,26 @@ export const mutations = { oldTimeline.newStatusCount = 0 oldTimeline.visibleStatuses = slice(oldTimeline.statuses, 0, 50) + oldTimeline.visibleStatusesObject = {} + each(oldTimeline.visibleStatuses, (status) => { oldTimeline.visibleStatusesObject[status.id] = status }) }, setFavorited (state, { status, value }) { - const newStatus = find(state.allStatuses, status) + const newStatus = state.allStatusesObject[status.id] newStatus.favorited = value }, setRetweeted (state, { status, value }) { - const newStatus = find(state.allStatuses, status) + const newStatus = state.allStatusesObject[status.id] newStatus.repeated = value }, setDeleted (state, { status }) { - const newStatus = find(state.allStatuses, status) + const newStatus = state.allStatusesObject[status.id] newStatus.deleted = true }, setLoading (state, { timeline, value }) { state.timelines[timeline].loading = value }, setNsfw (state, { id, nsfw }) { - const newStatus = find(state.allStatuses, { id }) + const newStatus = state.allStatusesObject[id] newStatus.nsfw = nsfw }, setError (state, { timeline, value }) {