Whalebird-desktop-client-ma.../src/renderer/store/TimelineSpace/Modals/ListMembership.ts

108 lines
3.5 KiB
TypeScript

import generator, { Entity } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export type ListMembershipState = {
modalOpen: boolean
account: Entity.Account | null
lists: Array<Entity.List>
belongToLists: Array<Entity.List>
}
const state = (): ListMembershipState => ({
modalOpen: false,
account: null,
lists: [],
belongToLists: []
})
export const MUTATION_TYPES = {
CHANGE_MODAL: 'changeModal',
CHANGE_ACCOUNT: 'changeAccount',
CHANGE_BELONG_TO_LISTS: 'changeBelongToLists',
CHANGE_LISTS: 'changeLists'
}
const mutations: MutationTree<ListMembershipState> = {
[MUTATION_TYPES.CHANGE_MODAL]: (state, value: boolean) => {
state.modalOpen = value
},
[MUTATION_TYPES.CHANGE_ACCOUNT]: (state, account: Entity.Account) => {
state.account = account
},
[MUTATION_TYPES.CHANGE_BELONG_TO_LISTS]: (state, lists: Array<Entity.List>) => {
state.belongToLists = lists
},
[MUTATION_TYPES.CHANGE_LISTS]: (state, lists: Array<Entity.List>) => {
state.lists = lists
}
}
export const ACTION_TYPES = {
CHANGE_MODAL: 'changeModal',
SET_ACCOUNT: 'setAccount',
FETCH_LIST_MEMBERSHIP: 'fetchListMembership',
FETCH_LISTS: 'fetchLists',
CHANGE_BELONG_TO_LISTS: 'changeBelongToLists'
}
const actions: ActionTree<ListMembershipState, RootState> = {
[ACTION_TYPES.CHANGE_MODAL]: ({ commit }, value: boolean) => {
commit(MUTATION_TYPES.CHANGE_MODAL, value)
},
[ACTION_TYPES.SET_ACCOUNT]: ({ commit }, account: Entity.Account) => {
commit(MUTATION_TYPES.CHANGE_ACCOUNT, account)
},
[ACTION_TYPES.FETCH_LIST_MEMBERSHIP]: async ({ commit, rootState }, account: Entity.Account) => {
const client = generator(
rootState.TimelineSpace.sns,
rootState.TimelineSpace.account.baseURL,
rootState.TimelineSpace.account.accessToken,
rootState.App.userAgent
)
const res = await client.getAccountLists(account.id)
commit(MUTATION_TYPES.CHANGE_BELONG_TO_LISTS, res.data)
return res.data
},
[ACTION_TYPES.FETCH_LISTS]: async ({ commit, rootState }) => {
const client = generator(
rootState.TimelineSpace.sns,
rootState.TimelineSpace.account.baseURL,
rootState.TimelineSpace.account.accessToken,
rootState.App.userAgent
)
const res = await client.getLists()
commit(MUTATION_TYPES.CHANGE_LISTS, res.data)
return res.data
},
[ACTION_TYPES.CHANGE_BELONG_TO_LISTS]: async ({ rootState, dispatch, state }, belongToLists: Array<string>) => {
// Calcurate diff
const removedLists = state.belongToLists.map(l => l.id).filter(i => belongToLists.indexOf(i) === -1)
const addedLists = belongToLists.filter(i => state.belongToLists.map(l => l.id).indexOf(i) === -1)
const client = generator(
rootState.TimelineSpace.sns,
rootState.TimelineSpace.account.baseURL,
rootState.TimelineSpace.account.accessToken,
rootState.App.userAgent
)
const removedPromise = removedLists.map(id => {
return client.deleteAccountsFromList(id, [state.account!.id])
})
const addedPromise = addedLists.map(id => {
return client.addAccountsToList(id, [state.account!.id])
})
const res = await Promise.all(removedPromise.concat(addedPromise))
await dispatch('fetchListMembership', state.account!)
return res
}
}
const ListMembership: Module<ListMembershipState, RootState> = {
namespaced: true,
state: state,
mutations: mutations,
actions: actions
}
export default ListMembership