diff --git a/CHANGELOG.md b/CHANGELOG.md index fee1cf9d..d6b547f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - Emoji pack configuration +- Statuses page: fetch all statuses from a given instance - Ability to require user's password reset – Ability to track admin/moderator actions, a.k.a. "the moderation log" diff --git a/src/api/peers.js b/src/api/peers.js new file mode 100644 index 00000000..4b80d7ab --- /dev/null +++ b/src/api/peers.js @@ -0,0 +1,14 @@ +import request from '@/utils/request' +import { getToken } from '@/utils/auth' +import { baseName } from './utils' + +export async function fetchPeers(authHost, token) { + return await request({ + baseURL: baseName(authHost), + url: `/api/v1/instance/peers`, + method: 'get', + headers: authHeaders(token) + }) +} + +const authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {} diff --git a/src/api/status.js b/src/api/status.js index 7d931ae0..ab9334e5 100644 --- a/src/api/status.js +++ b/src/api/status.js @@ -21,4 +21,13 @@ export async function deleteStatus(id, authHost, token) { }) } +export async function fetchStatusesByInstance(instance, authHost, token, pageSize, page = 1) { + return await request({ + baseURL: baseName(authHost), + url: `/api/pleroma/admin/instances/${instance}/statuses?page=${page}&page_size=${pageSize}`, + method: 'get', + headers: authHeaders(token) + }) +} + const authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {} diff --git a/src/lang/en.js b/src/lang/en.js index 13c30906..2bedf5a4 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -232,6 +232,11 @@ export default { passwordResetTokenCreated: 'Password reset token was created', accountCreated: 'New account was created!' }, + statuses: { + statuses: 'Statuses', + instanceFilter: 'Instance filter', + loadMore: 'Load more' + }, userProfile: { tags: 'Tags', moderator: 'Moderator', diff --git a/src/router/index.js b/src/router/index.js index 53dbf8ec..8a7f9e36 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -21,6 +21,20 @@ const settings = { ] } +const statusesDisabled = disabledFeatures.includes('statuses') +const statuses = { + path: '/statuses', + component: Layout, + children: [ + { + path: 'index', + component: () => import('@/views/statuses/index'), + name: 'Statuses', + meta: { title: 'Statuses', icon: 'form', noCache: true } + } + ] +} + const reportsDisabled = disabledFeatures.includes('reports') const reports = { path: '/reports', @@ -126,6 +140,7 @@ export const asyncRouterMap = [ } ] }, + ...(statusesDisabled ? [] : [statuses]), ...(reportsDisabled ? [] : [reports]), ...(invitesDisabled ? [] : [invites]), ...(moderationLogDisabled ? [] : [moderationLog]), diff --git a/src/store/getters.js b/src/store/getters.js index 03899ea7..159fb48c 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -49,6 +49,7 @@ const getters = { http: state => state.settings.settings['http'], httpSecurity: state => state.settings.settings['http_security'], instance: state => state.settings.settings['instance'], + instances: state => state.peers.fetchedPeers, kocaptcha: state => state.settings.settings['Pleroma.Captcha.Kocaptcha'], level: state => state.settings.settings['level'], ldap: state => state.settings.settings['ldap'], @@ -82,6 +83,7 @@ const getters = { richMedia: state => state.settings.settings['rich_media'], suggestions: state => state.settings.settings['suggestions'], scheduledActivity: state => state.settings.settings['Pleroma.ScheduledActivity'], + statuses: state => state.status.fetchedStatuses, teslaAdapter: state => state.settings.settings['adapter'], twitter: state => state.settings.settings['Ueberauth.Strategy.Twitter.OAuth'], ueberauth: state => state.settings.settings['Ueberauth'], diff --git a/src/store/index.js b/src/store/index.js index 87301b69..586f2b07 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -4,6 +4,7 @@ import app from './modules/app' import errorLog from './modules/errorLog' import moderationLog from './modules/moderationLog' import invites from './modules/invites' +import peers from './modules/peers' import permission from './modules/permission' import relays from './modules/relays' import reports from './modules/reports' @@ -24,6 +25,7 @@ const store = new Vuex.Store({ errorLog, moderationLog, invites, + peers, permission, relays, reports, diff --git a/src/store/modules/peers.js b/src/store/modules/peers.js new file mode 100644 index 00000000..fa37a1d0 --- /dev/null +++ b/src/store/modules/peers.js @@ -0,0 +1,28 @@ +import { fetchPeers } from '@/api/peers' + +const peers = { + state: { + fetchedPeers: [], + loading: true + }, + + mutations: { + SET_PEERS: (state, peers) => { + state.fetchedPeers = peers + }, + SET_LOADING: (state, status) => { + state.loading = status + } + }, + + actions: { + async FetchPeers({ commit, getters }) { + const peers = await fetchPeers(getters.authHost, getters.token) + + commit('SET_PEERS', peers.data) + commit('SET_LOADING', false) + } + } +} + +export default peers diff --git a/src/store/modules/status.js b/src/store/modules/status.js index 7d19d895..e937ed5c 100644 --- a/src/store/modules/status.js +++ b/src/store/modules/status.js @@ -1,6 +1,21 @@ -import { changeStatusScope, deleteStatus } from '@/api/status' +import { changeStatusScope, deleteStatus, fetchStatusesByInstance } from '@/api/status' const status = { + state: { + fetchedStatuses: [], + loading: false + }, + mutations: { + SET_STATUSES: (state, statuses) => { + state.fetchedStatuses = statuses + }, + PUSH_STATUSES: (state, statuses) => { + state.fetchedStatuses = [...state.fetchedStatuses, ...statuses] + }, + SET_LOADING: (state, status) => { + state.loading = status + } + }, actions: { async ChangeStatusScope({ dispatch, getters }, { statusId, isSensitive, visibility, reportCurrentPage, userId, godmode }) { await changeStatusScope(statusId, isSensitive, visibility, getters.authHost, getters.token) @@ -14,13 +29,27 @@ const status = { }, async DeleteStatus({ dispatch, getters }, { statusId, reportCurrentPage, userId, godmode }) { await deleteStatus(statusId, getters.authHost, getters.token) - if (reportCurrentPage !== 0) { + if (reportCurrentPage !== 0) { // called from Reports dispatch('FetchReports', reportCurrentPage) - } else if (userId.length > 0) { + } else if (userId.length > 0) { // called from User profile dispatch('FetchUserStatuses', { userId, godmode }) - } else { + } else { // called from GroupedReports dispatch('FetchGroupedReports') } + }, + async FetchStatusesByInstance({ commit, getters }, { instance, page, pageSize }) { + commit('SET_LOADING', true) + const statuses = await fetchStatusesByInstance(instance, getters.authHost, getters.token, pageSize, page) + + commit('SET_STATUSES', statuses.data) + commit('SET_LOADING', false) + }, + async FetchStatusesPageByInstance({ commit, getters }, { instance, page, pageSize }) { + commit('SET_LOADING', true) + const statuses = await fetchStatusesByInstance(instance, getters.authHost, getters.token, pageSize, page) + + commit('PUSH_STATUSES', statuses.data) + commit('SET_LOADING', false) } } } diff --git a/src/views/statuses/index.vue b/src/views/statuses/index.vue new file mode 100644 index 00000000..bcc98ac4 --- /dev/null +++ b/src/views/statuses/index.vue @@ -0,0 +1,85 @@ + + + + +