From a68b34c2527b00e7c2adb566a99564c2d6cbe1dc Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Wed, 13 Nov 2019 23:29:37 +0900 Subject: [PATCH] refs #1096 Reject duplicated status when append statuses in Public --- .../TimelineSpace/Contents/Public.spec.ts | 137 ++++++++++++++---- .../store/TimelineSpace/Contents/Public.ts | 11 +- 2 files changed, 113 insertions(+), 35 deletions(-) diff --git a/spec/renderer/unit/store/TimelineSpace/Contents/Public.spec.ts b/spec/renderer/unit/store/TimelineSpace/Contents/Public.spec.ts index 33a3b19b..183cbb4e 100644 --- a/spec/renderer/unit/store/TimelineSpace/Contents/Public.spec.ts +++ b/spec/renderer/unit/store/TimelineSpace/Contents/Public.spec.ts @@ -85,6 +85,38 @@ const status2: Status = { pinned: null } +const rebloggedStatus: Status = { + id: '3', + uri: 'http://example.com', + url: 'http://example.com', + account: account, + in_reply_to_id: null, + in_reply_to_account_id: null, + reblog: status1, + content: '', + created_at: '2019-03-31T21:40:32', + emojis: [], + replies_count: 0, + reblogs_count: 0, + favourites_count: 0, + reblogged: null, + favourited: null, + muted: null, + sensitive: false, + spoiler_text: '', + visibility: 'public', + media_attachments: [], + mentions: [], + tags: [], + card: null, + poll: null, + application: { + name: 'Web' + } as Application, + language: null, + pinned: null +} + describe('TimelineSpace/Contents/Local', () => { describe('mutations', () => { let state: PublicState @@ -108,37 +140,6 @@ describe('TimelineSpace/Contents/Local', () => { describe('message is reblogged', () => { beforeEach(() => { - const rebloggedStatus: Status = { - id: '3', - uri: 'http://example.com', - url: 'http://example.com', - account: account, - in_reply_to_id: null, - in_reply_to_account_id: null, - reblog: status1, - content: '', - created_at: '2019-03-31T21:40:32', - emojis: [], - replies_count: 0, - reblogs_count: 0, - favourites_count: 0, - reblogged: null, - favourited: null, - muted: null, - sensitive: false, - spoiler_text: '', - visibility: 'public', - media_attachments: [], - mentions: [], - tags: [], - card: null, - poll: null, - application: { - name: 'Web' - } as Application, - language: null, - pinned: null - } state = { lazyLoading: false, heading: true, @@ -153,5 +154,79 @@ describe('TimelineSpace/Contents/Local', () => { }) }) }) + + describe('appendTimeline', () => { + describe('heading', () => { + describe('normal', () => { + beforeEach(() => { + state = { + lazyLoading: false, + heading: true, + timeline: [status2, status1], + unreadTimeline: [], + filter: '' + } + }) + it('should be updated timeline', () => { + Public.mutations![MUTATION_TYPES.APPEND_TIMELINE](state, rebloggedStatus) + expect(state.timeline).toEqual([rebloggedStatus, status2, status1]) + expect(state.unreadTimeline).toEqual([]) + }) + }) + + describe('duplicated status', () => { + beforeEach(() => { + state = { + lazyLoading: false, + heading: true, + timeline: [rebloggedStatus, status2, status1], + unreadTimeline: [], + filter: '' + } + }) + it('should not be updated timeline', () => { + Public.mutations![MUTATION_TYPES.APPEND_TIMELINE](state, rebloggedStatus) + expect(state.timeline).toEqual([rebloggedStatus, status2, status1]) + expect(state.unreadTimeline).toEqual([]) + }) + }) + }) + + describe('not heading', () => { + describe('normal', () => { + beforeEach(() => { + state = { + lazyLoading: false, + heading: false, + timeline: [status2, status1], + unreadTimeline: [], + filter: '' + } + }) + it('should be updated timeline', () => { + Public.mutations![MUTATION_TYPES.APPEND_TIMELINE](state, rebloggedStatus) + expect(state.timeline).toEqual([status2, status1]) + expect(state.unreadTimeline).toEqual([rebloggedStatus]) + }) + }) + + describe('duplicated status', () => { + beforeEach(() => { + state = { + lazyLoading: false, + heading: false, + timeline: [rebloggedStatus, status2, status1], + unreadTimeline: [], + filter: '' + } + }) + it('should not be updated timeline', () => { + Public.mutations![MUTATION_TYPES.APPEND_TIMELINE](state, rebloggedStatus) + expect(state.timeline).toEqual([rebloggedStatus, status2, status1]) + expect(state.unreadTimeline).toEqual([]) + }) + }) + }) + }) }) }) diff --git a/src/renderer/store/TimelineSpace/Contents/Public.ts b/src/renderer/store/TimelineSpace/Contents/Public.ts index db6ece74..92931056 100644 --- a/src/renderer/store/TimelineSpace/Contents/Public.ts +++ b/src/renderer/store/TimelineSpace/Contents/Public.ts @@ -37,10 +37,13 @@ const mutations: MutationTree = { state.heading = value }, [MUTATION_TYPES.APPEND_TIMELINE]: (state, update: Status) => { - if (state.heading) { - state.timeline = [update].concat(state.timeline) - } else { - state.unreadTimeline = [update].concat(state.unreadTimeline) + // Reject duplicated status in timeline + if (!state.timeline.find(item => item.id === update.id) && !state.unreadTimeline.find(item => item.id === update.id)) { + if (state.heading) { + state.timeline = [update].concat(state.timeline) + } else { + state.unreadTimeline = [update].concat(state.unreadTimeline) + } } }, [MUTATION_TYPES.UPDATE_TIMELINE]: (state, messages: Array) => {