diff --git a/src/modules/statuses.js b/src/modules/statuses.js index 510f9dbb..4f848e32 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -6,6 +6,7 @@ import apiService from '../services/api/api.service.js' export const defaultState = { allStatuses: [], maxId: 0, + notifications: [], timelines: { public: { statuses: [], @@ -99,7 +100,7 @@ const mergeOrAdd = (arr, item) => { } export const mutations = { - addNewStatuses (state, { statuses, showImmediately = false, timeline }) { + addNewStatuses (state, { statuses, showImmediately = false, timeline, user = {} }) { const allStatuses = state.allStatuses const timelineObject = state.timelines[timeline] @@ -134,10 +135,17 @@ export const mutations = { return status } - const favoriteStatus = (favorite) => { + const addNotification = (type, status) => { + state.notifications.push({type, status}) + } + + const favoriteStatus = (favorite, user) => { const status = find(allStatuses, { id: toInteger(favorite.in_reply_to_status_id) }) if (status) { status.fave_num += 1 + if (status.user.id === user.id) { + addNotification('favorite', status) + } } return status } @@ -164,7 +172,7 @@ export const mutations = { }, 'favorite': (favorite) => { updateMaxId(favorite) - favoriteStatus(favorite) + favoriteStatus(favorite, user) }, 'deletion': ({uri}) => { remove(allStatuses, { tag: uri }) @@ -216,6 +224,9 @@ export const mutations = { const statuses = { state: defaultState, actions: { + addNewStatuses ({ rootState, commit }, { statuses, showImmediately = false, timeline }) { + commit('addNewStatuses', { statuses, showImmediately, timeline, user: rootState.users.currentUser }) + }, favorite ({ rootState, commit }, status) { // Optimistic favoriting... commit('setFavorited', { status, value: true }) diff --git a/test/unit/specs/modules/statuses.spec.js b/test/unit/specs/modules/statuses.spec.js index d6e1dc20..871de491 100644 --- a/test/unit/specs/modules/statuses.spec.js +++ b/test/unit/specs/modules/statuses.spec.js @@ -4,6 +4,7 @@ import { defaultState, mutations, findMaxId, prepareStatus } from '../../../../s const makeMockStatus = ({id, text, is_post_verb = true}) => { return { id, + user: {id: 0}, name: 'status', text: text || `Text number ${id}`, fave_num: 0, @@ -193,4 +194,26 @@ describe('The Statuses module', () => { expect(state.timelines.public.visibleStatuses[0].fave_num).to.eql(1) expect(state.timelines.public.maxId).to.eq(favorite.id) }) + + describe('notifications', () => { + it('adds a notfication when one of the user\'s status is favorited', () => { + const state = cloneDeep(defaultState) + const status = makeMockStatus({id: 1}) + const user = {id: 1} + status.user = user + + const favorite = { + id: 2, + is_post_verb: false, + in_reply_to_status_id: '1', // The API uses strings here... + uri: 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00', + text: 'a favorited something by b' + } + + mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public', user }) + mutations.addNewStatuses(state, { statuses: [favorite], showImmediately: true, timeline: 'public', user }) + + expect(state.notifications).to.have.length(1) + }) + }) })