diff --git a/src/modules/users.js b/src/modules/users.js index 199799b8..46a2e087 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -1,23 +1,50 @@ import timelineFetcher from '../services/timeline_fetcher/timeline_fetcher.service.js' import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' +import { map, each, find, merge } from 'lodash' + +// TODO: Unify with mergeOrAdd in statuses.js +export const mergeOrAdd = (arr, item) => { + const oldItem = find(arr, {id: item.id}) + if (oldItem) { + // We already have this, so only merge the new info. + merge(oldItem, item) + return {item: oldItem, new: false} + } else { + // This is a new item, prepare it + arr.push(item) + return {item, new: true} + } +} + +export const mutations = { + setCurrentUser (state, user) { + state.currentUser = user + }, + beginLogin (state) { + state.loggingIn = true + }, + endLogin (state) { + state.loggingIn = false + }, + addNewUsers (state, users) { + each(users, (user) => mergeOrAdd(state.users, user)) + } +} + +export const defaultState = { + currentUser: false, + loggingIn: false, + users: [] +} const users = { - state: { - currentUser: false, - loggingIn: false - }, - mutations: { - setCurrentUser (state, user) { - state.currentUser = user - }, - beginLogin (state) { - state.loggingIn = true - }, - endLogin (state) { - state.loggingIn = false - } - }, + state: defaultState, + mutations, actions: { + addNewStatuses (store, { statuses }) { + const users = map(statuses, 'user') + store.commit('addNewUsers', users) + }, loginUser (store, userCredentials) { const commit = store.commit commit('beginLogin') diff --git a/test/unit/specs/modules/users.spec.js b/test/unit/specs/modules/users.spec.js new file mode 100644 index 00000000..07c71e32 --- /dev/null +++ b/test/unit/specs/modules/users.spec.js @@ -0,0 +1,20 @@ +import { cloneDeep } from 'lodash' + +import { defaultState, mutations } from '../../../../src/modules/users.js' + +describe('The users module', () => { + it('adds new users to the set, merging in new information for old users', () => { + const state = cloneDeep(defaultState) + const user = { id: 1, name: 'Guy' } + const modUser = { id: 1, name: 'Dude' } + + mutations.addNewUsers(state, [user]) + expect(state.users).to.have.length(1) + expect(state.users).to.eql([user]) + + mutations.addNewUsers(state, [modUser]) + expect(state.users).to.have.length(1) + expect(state.users).to.eql([user]) + expect(state.users[0].name).to.eql('Dude') + }) +})