refs #630 Handle delete event for local streaming

This commit is contained in:
AkiraFukushima 2019-05-29 23:53:16 +09:00
parent a1a4f581b1
commit b99cb3b81f
4 changed files with 174 additions and 22 deletions

View File

@ -0,0 +1,154 @@
import { Account, Status, Application } from 'megalodon'
import Local, { LocalState, MUTATION_TYPES } from '@/store/TimelineSpace/Contents/Local'
const account: Account = {
id: '1',
username: 'h3poteto',
acct: 'h3poteto@pleroma.io',
display_name: 'h3poteto',
locked: false,
created_at: '2019-03-26T21:30:32',
followers_count: 10,
following_count: 10,
statuses_count: 100,
note: 'engineer',
url: 'https://pleroma.io',
avatar: '',
avatar_static: '',
header: '',
header_static: '',
emojis: [],
moved: null,
fields: null,
bot: false
}
const status1: Status = {
id: '1',
uri: 'http://example.com',
url: 'http://example.com',
account: account,
in_reply_to_id: null,
in_reply_to_account_id: null,
reblog: null,
content: 'hoge',
created_at: '2019-03-26T21: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,
application: {
name: 'Web'
} as Application,
language: null,
pinned: null
}
const status2: Status = {
id: '2',
uri: 'http://example.com',
url: 'http://example.com',
account: account,
in_reply_to_id: null,
in_reply_to_account_id: null,
reblog: null,
content: 'fuga',
created_at: '2019-03-26T21: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,
application: {
name: 'Web'
} as Application,
language: null,
pinned: null
}
describe('TimelineSpace/Contents/Local', () => {
describe('mutations', () => {
let state: LocalState
describe('deleteToot', () => {
describe('message is not reblogged', () => {
beforeEach(() => {
state = {
lazyLoading: false,
heading: true,
timeline: [status2, status1],
unreadTimeline: [],
filter: ''
}
})
it('should be deleted', () => {
Local.mutations![MUTATION_TYPES.DELETE_TOOT](state, status1.id)
expect(state.timeline).toEqual([status2])
})
})
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,
application: {
name: 'Web'
} as Application,
language: null,
pinned: null
}
state = {
lazyLoading: false,
heading: true,
timeline: [status2, rebloggedStatus],
unreadTimeline: [],
filter: ''
}
})
it('should be deleted', () => {
Local.mutations![MUTATION_TYPES.DELETE_TOOT](state, status1.id)
expect(state.timeline).toEqual([status2])
})
})
})
})
})

View File

@ -144,7 +144,7 @@ export default {
this.$store.commit('TimelineSpace/Contents/Local/updateToot', message) this.$store.commit('TimelineSpace/Contents/Local/updateToot', message)
}, },
deleteToot(message) { deleteToot(message) {
this.$store.commit('TimelineSpace/Contents/Local/deleteToot', message) this.$store.commit('TimelineSpace/Contents/Local/deleteToot', message.id)
}, },
onScroll(event) { onScroll(event) {
if (event.target.clientHeight + event.target.scrollTop >= document.getElementById('local').clientHeight - 10 && !this.lazyloading) { if (event.target.clientHeight + event.target.scrollTop >= document.getElementById('local').clientHeight - 10 && !this.lazyloading) {

View File

@ -361,6 +361,9 @@ const actions: ActionTree<TimelineSpaceState, RootState> = {
} }
commit('TimelineSpace/SideMenu/changeUnreadLocalTimeline', true, { root: true }) commit('TimelineSpace/SideMenu/changeUnreadLocalTimeline', true, { root: true })
}) })
ipcRenderer.on('delete-start-local-streaming', (_, id: string) => {
commit('TimelineSpace/Contents/Local/deleteToot', id, { root: true })
})
}, },
startLocalStreaming: ({ state }) => { startLocalStreaming: ({ state }) => {
// @ts-ignore // @ts-ignore

View File

@ -3,10 +3,10 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store' import { RootState } from '@/store'
export interface LocalState { export interface LocalState {
timeline: Array<Status>, timeline: Array<Status>
unreadTimeline: Array<Status>, unreadTimeline: Array<Status>
lazyLoading: boolean, lazyLoading: boolean
heading: boolean, heading: boolean
filter: string filter: string
} }
@ -46,22 +46,22 @@ const mutations: MutationTree<LocalState> = {
[MUTATION_TYPES.UPDATE_TIMELINE]: (state, messages: Array<Status>) => { [MUTATION_TYPES.UPDATE_TIMELINE]: (state, messages: Array<Status>) => {
state.timeline = messages state.timeline = messages
}, },
[MUTATION_TYPES.MERGE_TIMELINE]: (state) => { [MUTATION_TYPES.MERGE_TIMELINE]: state => {
state.timeline = state.unreadTimeline.slice(0, 80).concat(state.timeline) state.timeline = state.unreadTimeline.slice(0, 80).concat(state.timeline)
state.unreadTimeline = [] state.unreadTimeline = []
}, },
[MUTATION_TYPES.INSERT_TIMELINE]: (state, messages: Array<Status>) => { [MUTATION_TYPES.INSERT_TIMELINE]: (state, messages: Array<Status>) => {
state.timeline = state.timeline.concat(messages) state.timeline = state.timeline.concat(messages)
}, },
[MUTATION_TYPES.ARCHIVE_TIMELINE]: (state) => { [MUTATION_TYPES.ARCHIVE_TIMELINE]: state => {
state.timeline = state.timeline.slice(0, 40) state.timeline = state.timeline.slice(0, 40)
}, },
[MUTATION_TYPES.CLEAR_TIMELINE]: (state) => { [MUTATION_TYPES.CLEAR_TIMELINE]: state => {
state.timeline = [] state.timeline = []
state.unreadTimeline = [] state.unreadTimeline = []
}, },
[MUTATION_TYPES.UPDATE_TOOT]: (state, message: Status) => { [MUTATION_TYPES.UPDATE_TOOT]: (state, message: Status) => {
state.timeline = state.timeline.map((toot) => { state.timeline = state.timeline.map(toot => {
if (toot.id === message.id) { if (toot.id === message.id) {
return message return message
} else if (toot.reblog !== null && toot.reblog.id === message.id) { } else if (toot.reblog !== null && toot.reblog.id === message.id) {
@ -76,12 +76,12 @@ const mutations: MutationTree<LocalState> = {
} }
}) })
}, },
[MUTATION_TYPES.DELETE_TOOT]: (state, message: Status) => { [MUTATION_TYPES.DELETE_TOOT]: (state, id: string) => {
state.timeline = state.timeline.filter((toot) => { state.timeline = state.timeline.filter(toot => {
if (toot.reblog !== null && toot.reblog.id === message.id) { if (toot.reblog !== null && toot.reblog.id === id) {
return false return false
} else { } else {
return toot.id !== message.id return toot.id !== id
} }
}) })
}, },
@ -95,10 +95,7 @@ const mutations: MutationTree<LocalState> = {
const actions: ActionTree<LocalState, RootState> = { const actions: ActionTree<LocalState, RootState> = {
fetchLocalTimeline: async ({ commit, rootState }) => { fetchLocalTimeline: async ({ commit, rootState }) => {
const client = new Mastodon( const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const res: Response<Array<Status>> = await client.get<Array<Status>>('/timelines/public', { limit: 40, local: true }) const res: Response<Array<Status>> = await client.get<Array<Status>>('/timelines/public', { limit: 40, local: true })
commit(MUTATION_TYPES.UPDATE_TIMELINE, res.data) commit(MUTATION_TYPES.UPDATE_TIMELINE, res.data)
return res.data return res.data
@ -108,11 +105,9 @@ const actions: ActionTree<LocalState, RootState> = {
return Promise.resolve(null) return Promise.resolve(null)
} }
commit(MUTATION_TYPES.CHANGE_LAZY_LOADING, true) commit(MUTATION_TYPES.CHANGE_LAZY_LOADING, true)
const client = new Mastodon( const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
rootState.TimelineSpace.account.accessToken!, return client
rootState.TimelineSpace.account.baseURL + '/api/v1' .get<Array<Status>>('/timelines/public', { max_id: lastStatus.id, limit: 40, local: true })
)
return client.get<Array<Status>>('/timelines/public', { max_id: lastStatus.id, limit: 40, local: true })
.then(res => { .then(res => {
commit(MUTATION_TYPES.INSERT_TIMELINE, res.data) commit(MUTATION_TYPES.INSERT_TIMELINE, res.data)
return res.data return res.data