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) => {