aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/components/interactions/interactions.js2
-rw-r--r--src/components/interactions/interactions.vue9
-rw-r--r--src/components/notification/notification.js7
-rw-r--r--src/components/notification/notification.vue7
-rw-r--r--src/components/notifications/notifications.js1
-rw-r--r--src/components/notifications/notifications.scss6
-rw-r--r--src/components/report/report.js23
-rw-r--r--src/components/report/report.scss39
-rw-r--r--src/components/report/report.vue63
-rw-r--r--src/i18n/en.json13
-rw-r--r--src/modules/config.js3
-rw-r--r--src/services/api/api.service.js321
-rw-r--r--src/services/entity_normalizer/entity_normalizer.service.js7
-rw-r--r--src/services/notification_utils/notification_utils.js6
-rw-r--r--src/services/notifications_fetcher/notifications_fetcher.service.js1
15 files changed, 501 insertions, 7 deletions
diff --git a/src/components/interactions/interactions.js b/src/components/interactions/interactions.js
index 7fe5e76d..54275a7b 100644
--- a/src/components/interactions/interactions.js
+++ b/src/components/interactions/interactions.js
@@ -4,6 +4,8 @@ const tabModeDict = {
mentions: ['mention'],
'likes+repeats': ['repeat', 'like'],
follows: ['follow'],
+ reactions: ['pleroma:emoji_reaction'],
+ reports: ['pleroma:report'],
moves: ['move']
}
diff --git a/src/components/interactions/interactions.vue b/src/components/interactions/interactions.vue
index 57d5d87c..b7291c02 100644
--- a/src/components/interactions/interactions.vue
+++ b/src/components/interactions/interactions.vue
@@ -22,6 +22,15 @@
:label="$t('interactions.follows')"
/>
<span
+ key="reactions"
+ :label="$t('interactions.emoji_reactions')"
+ />
+ <span
+ v-if="canSeeReports"
+ key="reports"
+ :label="$t('interactions.reports')"
+ />
+ <span
v-if="!allowFollowingMove"
key="moves"
:label="$t('interactions.moves')"
diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js
index 4aa9affd..38211bb3 100644
--- a/src/components/notification/notification.js
+++ b/src/components/notification/notification.js
@@ -4,6 +4,7 @@ import Status from '../status/status.vue'
import UserAvatar from '../user_avatar/user_avatar.vue'
import UserCard from '../user_card/user_card.vue'
import Timeago from '../timeago/timeago.vue'
+import Report from '../report/report.vue'
import { isStatusNotification } from '../../services/notification_utils/notification_utils.js'
import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
@@ -44,7 +45,8 @@ const Notification = {
UserAvatar,
UserCard,
Timeago,
- Status
+ Status,
+ Report
},
methods: {
toggleUserExpanded () {
@@ -76,6 +78,9 @@ const Notification = {
this.$store.dispatch('dismissNotificationLocal', { id: this.notification.id })
this.$store.dispatch('removeFollowRequest', this.user)
})
+ },
+ testlog (a) {
+ console.log(a)
}
},
computed: {
diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index f56aa977..3b74249d 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -106,6 +106,9 @@
</i18n>
</small>
</span>
+ <span v-if="notification.type === 'pleroma:report'">
+ <small>{{ $t('notifications.submitted_report') }}</small>
+ </span>
</div>
<div
v-if="isStatusNotification"
@@ -180,6 +183,10 @@
@{{ notification.target.screen_name }}
</router-link>
</div>
+ <Report
+ v-else-if="notification.type === 'pleroma:report'"
+ :report="notification.report"
+ />
<template v-else>
<status-content
class="faint"
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index 49258563..25773fe0 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -66,6 +66,7 @@ const Notifications = {
return this.$store.state.statuses.notifications.loading
},
notificationsToDisplay () {
+ console.log(this.notifications)
return this.filteredNotifications.slice(0, this.unseenCount + this.seenToDisplayCount)
},
...mapGetters(['unreadChatCount'])
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index 682ae127..58a86fb0 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -60,8 +60,10 @@
height: 32px;
}
- --link: var(--faintLink);
- --text: var(--faint);
+ .faint {
+ --link: var(--faintLink);
+ --text: var(--faint);
+ }
}
.follow-request-accept {
diff --git a/src/components/report/report.js b/src/components/report/report.js
new file mode 100644
index 00000000..e81417a8
--- /dev/null
+++ b/src/components/report/report.js
@@ -0,0 +1,23 @@
+import StatusContent from '../status_content/status_content.vue'
+import Timeago from '../timeago/timeago.vue'
+import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
+
+const Report = {
+ props: [
+ 'report'
+ ],
+ components: {
+ StatusContent,
+ Timeago
+ },
+ methods: {
+ generateUserProfileLink (user) {
+ return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)
+ },
+ setReportState (id, state) {
+ return this.$store.state.api.backendInteractor.setReportState({ id, state })
+ }
+ }
+}
+
+export default Report
diff --git a/src/components/report/report.scss b/src/components/report/report.scss
new file mode 100644
index 00000000..7e9cc2b6
--- /dev/null
+++ b/src/components/report/report.scss
@@ -0,0 +1,39 @@
+@import '../../_variables.scss';
+
+.Report {
+ .report-content {
+ margin: 0.5em 0;
+ }
+
+ .reported-status {
+ border: 1px solid $fallback--faint;
+ border-color: var(--faint, $fallback--faint);
+ border-radius: $fallback--inputRadius;
+ border-radius: var(--inputRadius, $fallback--inputRadius);
+ color: $fallback--text;
+ color: var(--text, $fallback--text);
+ display: block;
+ padding: 0.5em;
+ margin: 0.5em 0;
+
+ .status-content {
+ pointer-events: none;
+ }
+
+ .reported-status-heading {
+ display: flex;
+ width: 100%;
+ justify-content: space-between;
+ margin-bottom: 0.2em;
+ }
+
+ .reported-status-name {
+ font-weight: bold;
+ }
+ }
+
+ .note {
+ width: 100%;
+ margin-bottom: 0.5em;
+ }
+}
diff --git a/src/components/report/report.vue b/src/components/report/report.vue
new file mode 100644
index 00000000..20fe1bfe
--- /dev/null
+++ b/src/components/report/report.vue
@@ -0,0 +1,63 @@
+<template>
+ <div class="Report">
+ <div class="reported-user">
+ <span>{{ $t('report.reported_user') }}</span>
+ <router-link :to="generateUserProfileLink(report.acct)">
+ @{{ report.acct.screen_name }}
+ </router-link>
+ </div>
+ <div class="reporter">
+ <span>{{ $t('report.reporter') }}</span>
+ <router-link :to="generateUserProfileLink(report.actor)">
+ @{{ report.actor.screen_name }}
+ </router-link>
+ </div>
+ <div class="report-state">
+ <span>{{ $t('report.state') }}</span>
+ <b>{{ $t('report.state_' + report.state) }}</b>
+ </div>
+ <!-- eslint-disable vue/no-v-html -->
+ <div
+ class="report-content"
+ v-html="report.content"
+ />
+ <div v-if="report.statuses.length">
+ <small>{{ $t('report.reported_statuses') }}</small>
+ <!-- eslint-enable vue/no-v-html -->
+ <router-link
+ v-for="status in report.statuses"
+ :key="status.id"
+ :to="{ name: 'conversation', params: { id: status.id } }"
+ class="reported-status"
+ >
+ <div class="reported-status-heading">
+ <span class="reported-status-name">{{ status.user.name }}</span>
+ <Timeago
+ :time="status.created_at"
+ :auto-update="240"
+ class="faint"
+ />
+ </div>
+ <status-content :status="status" />
+ </router-link>
+ </div>
+ <div v-if="report.notes.length">
+ <small>{{ $t('report.notes') }}</small>
+ <div
+ v-for="note in report.notes"
+ :key="note.id"
+ class="note"
+ >
+ <span>{{ note.content }}</span>
+ <Timeago
+ :time="note.created_at"
+ :auto-update="240"
+ class="faint"
+ />
+ </div>
+ </div>
+ </div>
+</template>
+
+<script src="./report.js"></script>
+<style src="./report.scss" lang="scss"></style>
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 26dd6144..3251de2a 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -141,7 +141,8 @@
"repeated_you": "repeated your status",
"no_more_notifications": "No more notifications",
"migrated_to": "migrated to",
- "reacted_with": "reacted with {0}"
+ "reacted_with": "reacted with {0}",
+ "submitted_report": "submitted a report"
},
"polls": {
"add_poll": "Add Poll",
@@ -236,6 +237,16 @@
"searching_for": "Searching for",
"error": "Not found."
},
+ "report": {
+ "reporter": "Reporter:",
+ "reported_user": "Reported user:",
+ "reported_statuses": "Reported statuses:",
+ "notes": "Notes:",
+ "state": "State:",
+ "state_open": "Open",
+ "state_closed": "Closed",
+ "state_resolved": "Resolved"
+ },
"selectable_list": {
"select_all": "Select all"
},
diff --git a/src/modules/config.js b/src/modules/config.js
index cd088737..e591a506 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -44,8 +44,9 @@ export const defaultState = {
likes: true,
repeats: true,
moves: true,
- emojiReactions: false,
+ emojiReactions: true,
followRequest: true,
+ reports: true,
chatMention: true
},
webPushNotifications: false,
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index f4483149..e1e26151 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -87,6 +87,7 @@ const PLEROMA_CHAT_URL = id => `/api/v1/pleroma/chats/by-account-id/${id}`
const PLEROMA_CHAT_MESSAGES_URL = id => `/api/v1/pleroma/chats/${id}/messages`
const PLEROMA_CHAT_READ_URL = id => `/api/v1/pleroma/chats/${id}/read`
const PLEROMA_DELETE_CHAT_MESSAGE_URL = (chatId, messageId) => `/api/v1/pleroma/chats/${chatId}/messages/${messageId}`
+const PLEROMA_ADMIN_REPORTS = '/api/pleroma/admin/reports'
const oldfetch = window.fetch
@@ -488,6 +489,304 @@ const deleteUser = ({ credentials, user }) => {
headers: headers
})
}
+/* eslint-disable */
+const mockStatus = {
+ "account": {
+ "acct": "reported_account",
+ "avatar": "https://develop.ilja.space/images/avi.png",
+ "avatar_static": "https://develop.ilja.space/images/avi.png",
+ "bot": false,
+ "created_at": "2020-09-03T14:18:21.000Z",
+ "display_name": "Reported Account",
+ "emojis": [],
+ "fields": [],
+ "followers_count": 0,
+ "following_count": 0,
+ "header": "https://develop.ilja.space/images/banner.png",
+ "header_static": "https://develop.ilja.space/images/banner.png",
+ "id": "A2xvLMMFLmqUQiZSqG",
+ "locked": false,
+ "note": "I&#39;m an account made for an example report notification. I&#39;m the one that will be reported.",
+ "pleroma": {
+ "accepts_chat_messages": true,
+ "ap_id": "https://develop.ilja.space/users/reported_account",
+ "background_image": null,
+ "confirmation_pending": false,
+ "favicon": null,
+ "hide_favorites": true,
+ "hide_followers": false,
+ "hide_followers_count": false,
+ "hide_follows": false,
+ "hide_follows_count": false,
+ "is_admin": false,
+ "is_moderator": false,
+ "relationship": {},
+ "skip_thread_containment": false,
+ "tags": []
+ },
+ "source": {
+ "fields": [],
+ "note": "",
+ "pleroma": {
+ "actor_type": "Person",
+ "discoverable": false
+ },
+ "sensitive": false
+ },
+ "statuses_count": 1,
+ "url": "https://develop.ilja.space/users/reported_account",
+ "username": "reported_account"
+ },
+ "application": {
+ "name": "Web",
+ "website": null
+ },
+ "bookmarked": false,
+ "card": null,
+ "content": "A post I made that will be included in the report",
+ "created_at": "2020-09-03T14:18:51.000Z",
+ "emojis": [],
+ "favourited": false,
+ "favourites_count": 0,
+ "id": "A2xvLMMFLmqUQiZSqG",
+ "in_reply_to_account_id": null,
+ "in_reply_to_id": null,
+ "language": null,
+ "media_attachments": [],
+ "mentions": [],
+ "muted": false,
+ "pinned": false,
+ "pleroma": {
+ "content": {
+ "text/plain": "A post I made that will be included in the report"
+ },
+ "conversation_id": 7,
+ "direct_conversation_id": null,
+ "emoji_reactions": [],
+ "expires_at": null,
+ "in_reply_to_account_acct": null,
+ "local": true,
+ "parent_visible": false,
+ "spoiler_text": {
+ "text/plain": ""
+ },
+ "thread_muted": false
+ },
+ "poll": null,
+ "reblog": null,
+ "reblogged": false,
+ "reblogs_count": 0,
+ "replies_count": 0,
+ "sensitive": false,
+ "spoiler_text": "",
+ "tags": [],
+ "text": null,
+ "uri": "https://develop.ilja.space/objects/8fe7611a-07e7-403a-ae08-f74580b6cc53",
+ "url": "https://develop.ilja.space/notice/9ymgJaQxAbTzDDZMJs",
+ "visibility": "public"
+}
+
+const report = {
+ "account": {
+ "acct": "reporting_account",
+ "avatar": "https://develop.ilja.space/images/avi.png",
+ "avatar_static": "https://develop.ilja.space/images/avi.png",
+ "bot": false,
+ "created_at": "2020-09-03T14:17:00.000Z",
+ "display_name": "Reporting Account",
+ "emojis": [],
+ "fields": [],
+ "followers_count": 0,
+ "following_count": 0,
+ "header": "https://develop.ilja.space/images/banner.png",
+ "header_static": "https://develop.ilja.space/images/banner.png",
+ "id": "9ymg9LnKk74wuk9lXk",
+ "locked": false,
+ "note": "I&#39;m an account made for an example report notification. I&#39;m the one that will do the reporting.",
+ "pleroma": {
+ "accepts_chat_messages": true,
+ "ap_id": "https://develop.ilja.space/users/reporting_account",
+ "background_image": null,
+ "confirmation_pending": false,
+ "deactivated": false,
+ "favicon": null,
+ "hide_favorites": true,
+ "hide_followers": false,
+ "hide_followers_count": false,
+ "hide_follows": false,
+ "hide_follows_count": false,
+ "is_admin": false,
+ "is_moderator": false,
+ "relationship": {},
+ "skip_thread_containment": false,
+ "tags": []
+ },
+ "source": {
+ "fields": [],
+ "note": "",
+ "pleroma": {
+ "actor_type": "Person",
+ "discoverable": false
+ },
+ "sensitive": false
+ },
+ "statuses_count": 0,
+ "url": "https://develop.ilja.space/users/reporting_account",
+ "username": "reporting_account"
+ },
+ "created_at": "2020-09-03T14:22:59.000Z",
+ "id": "5",
+ "pleroma": {
+ "is_muted": false,
+ "is_seen": false
+ },
+ "report": {
+ "account": {
+ "local": true,
+ "locked": false,
+ "acct": "reported_account",
+ "followers_count": 0,
+ "fields": [],
+ "avatar": "https://develop.ilja.space/images/avi.png",
+ "actor_type": "Person",
+ "url": "https://develop.ilja.space/users/reported_account",
+ "deactivated": false,
+ "id": "9ymgGklmHjZ2OpxVLM",
+ "bot": false,
+ "roles": {
+ "admin": false,
+ "moderator": false
+ },
+ "statuses_count": 1,
+ "nickname": "reported_account",
+ "display_name": "Reported Account",
+ "source": {
+ "fields": [],
+ "note": "",
+ "pleroma": {
+ "actor_type": "Person",
+ "discoverable": false
+ },
+ "sensitive": false
+ },
+ "pleroma": {
+ "accepts_chat_messages": true,
+ "ap_id": "https://develop.ilja.space/users/reported_account",
+ "background_image": null,
+ "confirmation_pending": false,
+ "favicon": null,
+ "hide_favorites": true,
+ "hide_followers": false,
+ "hide_followers_count": false,
+ "hide_follows": false,
+ "hide_follows_count": false,
+ "is_admin": false,
+ "is_moderator": false,
+ "relationship": {},
+ "skip_thread_containment": false,
+ "tags": []
+ },
+ "emojis": [],
+ "created_at": "2020-09-03T14:18:21.000Z",
+ "username": "reported_account",
+ "note": "I&#39;m an account made for an example report notification. I&#39;m the one that will be reported.",
+ "approval_pending": false,
+ "avatar_static": "https://develop.ilja.space/images/avi.png",
+ "header": "https://develop.ilja.space/images/banner.png",
+ "registration_reason": null,
+ "confirmation_pending": false,
+ "header_static": "https://develop.ilja.space/images/banner.png",
+ "following_count": 0,
+ "tags": []
+ },
+ "actor": {
+ "local": true,
+ "locked": false,
+ "acct": "reporting_account",
+ "followers_count": 0,
+ "fields": [],
+ "avatar": "https://develop.ilja.space/images/avi.png",
+ "actor_type": "Person",
+ "url": "https://develop.ilja.space/users/reporting_account",
+ "deactivated": false,
+ "id": "9ymg9LnKk74wuk9lXk",
+ "bot": false,
+ "roles": {
+ "admin": false,
+ "moderator": false
+ },
+ "statuses_count": 0,
+ "nickname": "reporting_account",
+ "display_name": "Reporting Account",
+ "source": {
+ "fields": [],
+ "note": "",
+ "pleroma": {
+ "actor_type": "Person",
+ "discoverable": false
+ },
+ "sensitive": false
+ },
+ "pleroma": {
+ "accepts_chat_messages": true,
+ "ap_id": "https://develop.ilja.space/users/reporting_account",
+ "background_image": null,
+ "confirmation_pending": false,
+ "favicon": null,
+ "hide_favorites": true,
+ "hide_followers": false,
+ "hide_followers_count": false,
+ "hide_follows": false,
+ "hide_follows_count": false,
+ "is_admin": false,
+ "is_moderator": false,
+ "relationship": {},
+ "skip_thread_containment": false,
+ "tags": []
+ },
+ "emojis": [],
+ "created_at": "2020-09-03T14:17:00.000Z",
+ "username": "reporting_account",
+ "note": "I&#39;m an account made for an example report notification. I&#39;m the one that will do the reporting.",
+ "approval_pending": false,
+ "avatar_static": "https://develop.ilja.space/images/avi.png",
+ "header": "https://develop.ilja.space/images/banner.png",
+ "registration_reason": null,
+ "confirmation_pending": false,
+ "header_static": "https://develop.ilja.space/images/banner.png",
+ "following_count": 0,
+ "tags": []
+ },
+ "content": "This is the report created by &quot;reporting_account&quot;. It reports &quot;reported_account&quot;.",
+ "created_at": "2020-09-03T14:22:59.000Z",
+ "id": "9ymggNcUyfIW8Cq1zM",
+ "notes": [
+ {
+ "content": "Some note left here.",
+ "created_at": "2020-09-03T14:22:59.000Z",
+ "id": "1"
+ },
+ {
+ "content": "Some other note that is much much much longer than the previous note left here.",
+ "created_at": "2020-09-03T14:23:59.000Z",
+ "id": "2"
+ }
+ ],
+ "state": "open",
+ "statuses": [
+ {
+ ...mockStatus,
+ },
+ {
+ ...mockStatus,
+ content: 'This is another status that I created to be included in the report to test multiple statuses.',
+ id: '123'
+ }
+ ]
+ },
+ "type": "pleroma:report"
+}
+/* eslint-enable */
const fetchTimeline = ({
timeline,
@@ -566,6 +865,10 @@ const fetchTimeline = ({
.then((data) => data.json())
.then((data) => {
if (!data.errors) {
+ if (isNotifications) {
+ return { data: [parseNotification(report)], pagination }
+ }
+
return { data: data.map(isNotifications ? parseNotification : parseStatus), pagination }
} else {
data.status = status
@@ -1262,6 +1565,21 @@ const deleteChatMessage = ({ chatId, messageId, credentials }) => {
})
}
+const setReportState = ({ id, state, credentials }) => {
+ return promisedRequest({
+ url: PLEROMA_ADMIN_REPORTS,
+ method: 'PATCH',
+ payload: {
+ 'reports': [
+ {
+ id,
+ state
+ }
+ ]
+ }
+ })
+}
+
const apiService = {
verifyCredentials,
fetchTimeline,
@@ -1347,7 +1665,8 @@ const apiService = {
chatMessages,
sendChatMessage,
readChat,
- deleteChatMessage
+ deleteChatMessage,
+ setReportState
}
export default apiService
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 625f593e..53a3562a 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -386,6 +386,13 @@ export const parseNotification = (data) => {
: parseUser(data.target)
output.from_profile = parseUser(data.account)
output.emoji = data.emoji
+ if (data.report) {
+ output.report = data.report
+ output.report.content = data.report.content
+ output.report.acct = parseUser(data.report.account)
+ output.report.actor = parseUser(data.report.actor)
+ output.report.statuses = data.report.statuses.map(parseStatus)
+ }
} else {
const parsedNotice = parseStatus(data.notice)
output.type = data.ntype
diff --git a/src/services/notification_utils/notification_utils.js b/src/services/notification_utils/notification_utils.js
index d912d19f..dff97aa2 100644
--- a/src/services/notification_utils/notification_utils.js
+++ b/src/services/notification_utils/notification_utils.js
@@ -14,7 +14,8 @@ export const visibleTypes = store => {
rootState.config.notificationVisibility.follows && 'follow',
rootState.config.notificationVisibility.followRequest && 'follow_request',
rootState.config.notificationVisibility.moves && 'move',
- rootState.config.notificationVisibility.emojiReactions && 'pleroma:emoji_reaction'
+ rootState.config.notificationVisibility.emojiReactions && 'pleroma:emoji_reaction',
+ rootState.config.notificationVisibility.reports && 'pleroma:report'
].filter(_ => _))
}
@@ -91,6 +92,9 @@ export const prepareNotificationObject = (notification, i18n) => {
case 'follow_request':
i18nString = 'follow_request'
break
+ case 'pleroma:report':
+ i18nString = 'reported'
+ break
}
if (notification.type === 'pleroma:emoji_reaction') {
diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js
index beeb167c..91861b21 100644
--- a/src/services/notifications_fetcher/notifications_fetcher.service.js
+++ b/src/services/notifications_fetcher/notifications_fetcher.service.js
@@ -61,6 +61,7 @@ const fetchNotifications = ({ store, args, older }) => {
messageArgs: [error.message],
timeout: 5000
})
+ console.error(error)
})
}