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 @@
+
+
+
+ {{ $t('statuses.statuses') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+