From 29cfdcbbcdb5076e9b2d17c11184c5c59d9fc024 Mon Sep 17 00:00:00 2001 From: tusooa <tusooa@kazv.moe> Date: Fri, 4 Aug 2023 15:54:04 +0100 Subject: [PATCH] Add load more to blocks/mutes --- src/components/list/list.vue | 6 ++- .../tabs/mutes_and_blocks_tab.js | 11 +++-- src/modules/users.js | 42 ++++++++++++++++--- src/services/api/api.service.js | 17 ++++++-- 4 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/components/list/list.vue b/src/components/list/list.vue index a6223cce..ef66e051 100644 --- a/src/components/list/list.vue +++ b/src/components/list/list.vue @@ -1,9 +1,13 @@ <template> - <div class="list"> + <div + class="list" + role="list" + > <div v-for="item in items" :key="getKey(item)" class="list-item" + role="listitem" > <slot name="item" diff --git a/src/components/settings_modal/tabs/mutes_and_blocks_tab.js b/src/components/settings_modal/tabs/mutes_and_blocks_tab.js index 6cfeea35..73e0b414 100644 --- a/src/components/settings_modal/tabs/mutes_and_blocks_tab.js +++ b/src/components/settings_modal/tabs/mutes_and_blocks_tab.js @@ -10,17 +10,20 @@ import SelectableList from 'src/components/selectable_list/selectable_list.vue' import ProgressButton from 'src/components/progress_button/progress_button.vue' import withSubscription from 'src/components/../hocs/with_subscription/with_subscription' import Checkbox from 'src/components/checkbox/checkbox.vue' +import withLoadMore from 'src/components/../hocs/with_load_more/with_load_more' -const BlockList = withSubscription({ +const BlockList = withLoadMore({ fetch: (props, $store) => $store.dispatch('fetchBlocks'), select: (props, $store) => get($store.state.users.currentUser, 'blockIds', []), - childPropName: 'items' + childPropName: 'items', + destroy: () => {} })(SelectableList) -const MuteList = withSubscription({ +const MuteList = withLoadMore({ fetch: (props, $store) => $store.dispatch('fetchMutes'), select: (props, $store) => get($store.state.users.currentUser, 'muteIds', []), - childPropName: 'items' + childPropName: 'items', + destroy: () => {} })(SelectableList) const DomainMuteList = withSubscription({ diff --git a/src/modules/users.js b/src/modules/users.js index 9d81f9bc..6968ce1e 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -199,21 +199,28 @@ export const mutations = { }) }, saveBlockIds (state, blockIds) { - state.currentUser.blockIds = blockIds + console.log("ADDING BLOCK IDS", blockIds); + state.currentUser.blockIds = uniq(concat(state.currentUser.blockIds || [], blockIds)) }, addBlockId (state, blockId) { if (state.currentUser.blockIds.indexOf(blockId) === -1) { state.currentUser.blockIds.push(blockId) } }, + setBlockIdsMaxId (state, blockIdsMaxId) { + state.currentUser.blockIdsMaxId = blockIdsMaxId + }, saveMuteIds (state, muteIds) { - state.currentUser.muteIds = muteIds + state.currentUser.muteIds = uniq(concat(state.currentUser.muteIds || [], muteIds)) }, addMuteId (state, muteId) { if (state.currentUser.muteIds.indexOf(muteId) === -1) { state.currentUser.muteIds.push(muteId) } }, + setMuteIdsMaxId (state, muteIdsMaxId) { + state.currentUser.muteIdsMaxId = muteIdsMaxId + }, updateMascot (state, mascotUrl) { state.currentUser.mascot = mascotUrl }, @@ -330,10 +337,21 @@ const users = { .then((relationships) => store.commit('updateUserRelationship', relationships)) } }, - fetchBlocks (store) { - return store.rootState.api.backendInteractor.fetchBlocks() + fetchBlocks (store, args) { + const { reset } = args || {} + + const maxId = store.state.currentUser.blockIdsMaxId + return store.rootState.api.backendInteractor.fetchBlocks({ maxId }) .then((blocks) => { store.commit('saveBlockIds', map(blocks, 'id')) + if (reset) { + store.commit('saveBlockIds', map(blocks, 'id')) + } else { + map(blocks, 'id').map(id => store.commit('addBlockId', id)) + } + if (blocks.length) { + store.commit('setBlockIdsMaxId', last(blocks).id) + } store.commit('addNewUsers', blocks) return blocks }) @@ -353,10 +371,22 @@ const users = { unblockUsers (store, ids = []) { return Promise.all(ids.map(id => unblockUser(store, id))) }, - fetchMutes (store) { - return store.rootState.api.backendInteractor.fetchMutes() + fetchMutes (store, args) { + const { reset } = args || {} + + const maxId = store.state.currentUser.muteIdsMaxId + return store.rootState.api.backendInteractor.fetchMutes({ maxId }) .then((mutes) => { store.commit('saveMuteIds', map(mutes, 'id')) + if (reset) { + store.commit('saveMuteIds', map(mutes, 'id')) + } else { + map(mutes, 'id').map(id => store.commit('addMuteId', id)) + } + if (mutes.length) { + store.commit('setMuteIdsMaxId', last(mutes).id) + } + store.commit('addNewUsers', mutes) return mutes }) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 947e9da9..de21ef3b 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -1166,8 +1166,13 @@ const generateMfaBackupCodes = ({ credentials }) => { }).then((data) => data.json()) } -const fetchMutes = ({ credentials }) => { - return promisedRequest({ url: MASTODON_USER_MUTES_URL, credentials }) +const fetchMutes = ({ maxId, credentials }) => { + const query = new URLSearchParams({ with_relationships: true }) + if (maxId) { + query.append('max_id', maxId) + } + + return promisedRequest({ url: `${MASTODON_USER_MUTES_URL}?${query.toString()}`, credentials }) .then((users) => users.map(parseUser)) } @@ -1213,8 +1218,12 @@ const unsubscribeUser = ({ id, credentials }) => { return promisedRequest({ url: MASTODON_UNSUBSCRIBE_USER(id), credentials, method: 'POST' }) } -const fetchBlocks = ({ credentials }) => { - return promisedRequest({ url: MASTODON_USER_BLOCKS_URL, credentials }) +const fetchBlocks = ({ maxId, credentials }) => { + const query = new URLSearchParams({ with_relationships: true }) + if (maxId) { + query.append('max_id', maxId) + } + return promisedRequest({ url: `${MASTODON_USER_BLOCKS_URL}?${query.toString()}`, credentials }) .then((users) => users.map(parseUser)) }