Merge remote-tracking branch 'upstream/develop' into neckbeard
This commit is contained in:
commit
64b247707e
52
CHANGELOG.md
52
CHANGELOG.md
|
@ -3,52 +3,76 @@ All notable changes to this project will be documented in this file.
|
|||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
|
||||
## Unreleased
|
||||
## 2.5.0 - 23.12.2022
|
||||
### Fixed
|
||||
- AdminFE button no longer scrolls page to top when clicked
|
||||
- UI no longer lags when switching between mobile and desktop mode
|
||||
- Popovers no longer constrained by DOM hierarchy, shouldn't be cut off by anything
|
||||
- Emoji autocomplete popover and picker popover stick to the text cursor.
|
||||
- Attachments are ALWAYS in same order as user uploaded, no more "videos first"
|
||||
- Pinned statuses no longer appear at bottom of user timeline (still appear as part of the timeline when fetched deep enough)
|
||||
- Fixed many many bugs related to new mentions, including spacing and alignment issues
|
||||
- Links in profile bios now properly open in new tabs
|
||||
- "Always show mobile button" is working now
|
||||
- Inline images now respect their intended width/height attributes
|
||||
- Links with `&` in them work properly now
|
||||
- Interaction list popovers now properly emojify names
|
||||
- Completely hidden posts still had 1px border
|
||||
- Attachments are ALWAYS in same order as user uploaded, no more "videos first"
|
||||
- Attachment description is prefilled with backend-provided default when uploading
|
||||
- Proper visual feedback that next image is loading when browsing
|
||||
- UI no longer lags when switching between mobile and desktop mode
|
||||
- Popovers no longer constrained by DOM hierarchy, shouldn't be cut off by anything
|
||||
- "Always show mobile button" is working now
|
||||
- Additional HTML sanitization on frontend side in case backend sanitization fails
|
||||
- Interaction list popovers now properly emojify names
|
||||
- AdminFE button no longer scrolls page to top when clicked
|
||||
- User handles with non-ascii domains now have less intrusive indicator for the domain name
|
||||
- Completely hidden posts still no longer have 1px border
|
||||
- A lot of accessibility improvements
|
||||
|
||||
### Changed
|
||||
- Using Vue 3 now
|
||||
- (You)s are optional (opt-in) now, bolding your nickname is also optional (opt-out)
|
||||
- A lot of internal dependencies updated
|
||||
- "(You)s" are optional (opt-in) now, bolding your nickname is also optional (opt-out)
|
||||
- User highlight background now also covers the `@`
|
||||
- Reverted back to textual `@`, svg version is opt-in.
|
||||
- Settings window has been thoroughly rearranged to make more sense and make navigation settings easier.
|
||||
- Uploaded attachments are uniform with displayed attachments
|
||||
- Flash is watchable in media-modal (takes up nearly full screen though due to sizing issues)
|
||||
- Notifications about likes/repeats/emoji reacts are now minimized so they always take up same amount of space irrelevant to size of post.
|
||||
- Notifications about likes/repeats/emoji reacts are now minimized so they always take up same amount of space irrelevant to size of post. (You can expand them to full if need be)
|
||||
- Slight width/spacing adjustments
|
||||
- More sizing stuff is font-size dependent now
|
||||
- Scrollbars are styled/colorized now
|
||||
- Scrollbars are toggleable (for stuff that didn't have visible scrollbars before) (opt-in)
|
||||
- Updated localization files
|
||||
- Top bar is more useful in mobile mode now.
|
||||
- "Show new" button is way more compact in mobile mode
|
||||
- Slightly adjusted placement and spacing of the topbar buttons so it's less easy to accidentally log yourself out
|
||||
|
||||
### Added
|
||||
- 3 column mode: only enables when there's space for it (opt-out, customizable)
|
||||
- Apologetic pleroma-tan
|
||||
- New button on timeline header to change some of the new and often-used settings
|
||||
- Support for lists
|
||||
- Added ability to edit posts and view post edit history etc.
|
||||
- Added ability to add personal note to users
|
||||
- Added initial support for admin announcements
|
||||
- Added ui for account migration
|
||||
- Added ui for backups
|
||||
- Added ability to force-unfollow a user from you
|
||||
- Emoji are now grouped by pack
|
||||
- Ability to pin navigation items and collapse the navigation menu
|
||||
- Ability to rearrange order of attachments when uploading
|
||||
- Ability to scroll column (or page) to top via panel header button
|
||||
- Options to show domains in mentions
|
||||
- Option to show user avatars in mention links (opt-in)
|
||||
- Option to disable the tooltip for mentions
|
||||
- Option to completely hide muted threads
|
||||
- Option to customize what clicking user avatar does in user popover
|
||||
- Notifications for poll results
|
||||
- "Favorites" link in navigation
|
||||
- Very early and somewhat experimental system for automatic settings sync (used only for pinned navigation and apologetic pleroma-tan)
|
||||
- Implemented remote interaction with statuses for anon visitors
|
||||
- Ability to open videos in modal even if you disabled that feature, via an icon button
|
||||
- New button on attachment that indicates that attachment has a description and shows a bar filled with description
|
||||
- Attachments are truncated just like post contents
|
||||
- Media modal now also displays description and counter position in gallery (i.e. 1/5)
|
||||
- Ability to rearrange order of attachments when uploading
|
||||
- Enabled users to zoom and pan images in media viewer with mouse and touch
|
||||
- Timelines/panels and conversations have sticky headers now
|
||||
- Added frontend ui for account migration
|
||||
- Implemented remote interaction with statuses
|
||||
- Timelines/panels and conversations have sticky headers now (a bit glitchy on some browsers like safari) (opt-out)
|
||||
|
||||
|
||||
## [2.4.2] - 2022-01-09
|
||||
|
|
27
README.md
27
README.md
|
@ -1,18 +1,19 @@
|
|||
# Pleroma-FE
|
||||
|
||||
> A single column frontend designed for Pleroma.
|
||||
> Highly-customizable frontend designed for Pleroma.
|
||||
|
||||
![screenshot](/uploads/796c5ecf985ed1e2b0943ee0df131ed0/DJVqSJ0.png)
|
||||
![screenshot](./image-1.png)
|
||||
|
||||
# For Translators
|
||||
|
||||
To translate Pleroma-FE, add your language to [src/i18n/messages.js](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/src/i18n/messages.js). Pleroma-FE will set your language by your browser locale, but you can temporarily force it in the code by changing the locale in main.js.
|
||||
To translate Pleroma-FE, use our weblate server: https://translate.pleroma.social/. If you need to add your language it should be added as a json file in [src/i18n/](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/src/i18n/) folder and added in a list within [src/i18n/languages.js](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/src/i18n/languages.js).
|
||||
|
||||
# FOR ADMINS
|
||||
Pleroma-FE will set your language by your browser locale, but you can change language in settings.
|
||||
|
||||
You don't need to build Pleroma-FE yourself. Those using the Pleroma backend will be able to use it out of the box.
|
||||
# For instance admins
|
||||
You don't need to build Pleroma-FE yourself. Those using the Pleroma backend will be able to use it out of the box. Information of customizing PleromaFE settings/defaults is in our [guide](https://docs-develop.pleroma.social/frontend/CONFIGURATION/) and in case you want to build your own custom version there's [another](https://docs-develop.pleroma.social/frontend/HACKING/)
|
||||
|
||||
## Build Setup
|
||||
# Build Setup
|
||||
|
||||
``` bash
|
||||
# install dependencies
|
||||
|
@ -20,13 +21,13 @@ npm install -g yarn
|
|||
yarn
|
||||
|
||||
# serve with hot reload at localhost:8080
|
||||
npm run dev
|
||||
yarn dev
|
||||
|
||||
# build for production with minification
|
||||
npm run build
|
||||
yarn build
|
||||
|
||||
# run unit tests
|
||||
npm run unit
|
||||
yarn unit
|
||||
```
|
||||
|
||||
# For Contributors:
|
||||
|
@ -40,10 +41,4 @@ FE Build process also leaves current commit hash in global variable `___pleromaf
|
|||
|
||||
# Configuration
|
||||
|
||||
Edit config.json for configuration.
|
||||
|
||||
## Options
|
||||
|
||||
### Login methods
|
||||
|
||||
```loginMethod``` can be set to either ```password``` (the default) or ```token```, which will use the full oauth redirection flow, which is useful for SSO situations.
|
||||
Set configuration settings in AdminFE, additionally you can edit config.json. For more details see [documentation](https://docs-develop.pleroma.social/frontend/CONFIGURATION/).
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 883 KiB |
10
package.json
10
package.json
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"name": "pleroma_fe",
|
||||
"version": "1.0.0",
|
||||
"description": "A Qvitter-style frontend for certain GS servers.",
|
||||
"author": "Roger Braun <roger@rogerbraun.net>",
|
||||
"private": true,
|
||||
"version": "2.5.0",
|
||||
"description": "Pleroma frontend, the default frontend of Pleroma social network server",
|
||||
"author": "Pleroma contributors <https://git.pleroma.social/pleroma/pleroma-fe/-/blob/develop/CONTRIBUTORS.md>",
|
||||
"private": false,
|
||||
"scripts": {
|
||||
"dev": "node build/dev-server.js",
|
||||
"build": "node build/build.js",
|
||||
|
@ -123,7 +123,7 @@
|
|||
"webpack-merge": "0.20.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 4.0.0",
|
||||
"node": ">= 16.0.0",
|
||||
"npm": ">= 3.0.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,9 @@ import {
|
|||
faUserPlus,
|
||||
faEyeSlash,
|
||||
faUser,
|
||||
faSuitcaseRolling
|
||||
faSuitcaseRolling,
|
||||
faExpandAlt,
|
||||
faCompressAlt
|
||||
} from '@fortawesome/free-solid-svg-icons'
|
||||
|
||||
library.add(
|
||||
|
@ -31,13 +33,15 @@ library.add(
|
|||
faUserPlus,
|
||||
faUser,
|
||||
faEyeSlash,
|
||||
faSuitcaseRolling
|
||||
faSuitcaseRolling,
|
||||
faExpandAlt,
|
||||
faCompressAlt
|
||||
)
|
||||
|
||||
const Notification = {
|
||||
data () {
|
||||
return {
|
||||
userExpanded: false,
|
||||
statusExpanded: false,
|
||||
betterShadow: this.$store.state.interface.browserSupport.cssFilter,
|
||||
unmuted: false
|
||||
}
|
||||
|
@ -55,8 +59,8 @@ const Notification = {
|
|||
UserLink
|
||||
},
|
||||
methods: {
|
||||
toggleUserExpanded () {
|
||||
this.userExpanded = !this.userExpanded
|
||||
toggleStatusExpanded () {
|
||||
this.statusExpanded = !this.statusExpanded
|
||||
},
|
||||
generateUserProfileLink (user) {
|
||||
return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)
|
||||
|
|
|
@ -144,13 +144,25 @@
|
|||
<router-link
|
||||
v-if="notification.status"
|
||||
:to="{ name: 'conversation', params: { id: notification.status.id } }"
|
||||
class="faint-link"
|
||||
class="timeago-link faint-link"
|
||||
>
|
||||
<Timeago
|
||||
:time="notification.created_at"
|
||||
:auto-update="240"
|
||||
/>
|
||||
</router-link>
|
||||
<button
|
||||
class="button-unstyled expand-icon"
|
||||
@click.prevent="toggleStatusExpanded"
|
||||
:title="$t('tool_tip.toggle_expand')"
|
||||
:aria-expanded="statusExpanded"
|
||||
>
|
||||
<FAIcon
|
||||
class="fa-scale-110"
|
||||
fixed-width
|
||||
:icon="statusExpanded ? 'compress-alt' : 'expand-alt'"
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
|
@ -166,6 +178,8 @@
|
|||
<button
|
||||
v-if="needMute"
|
||||
class="button-unstyled"
|
||||
:title="$t('tool_tip.toggle_mute')"
|
||||
:aria-expanded="!unmuted"
|
||||
@click.prevent="toggleMute"
|
||||
>
|
||||
<FAIcon
|
||||
|
@ -222,8 +236,8 @@
|
|||
/>
|
||||
<template v-else>
|
||||
<StatusContent
|
||||
class="faint"
|
||||
:compact="true"
|
||||
:class="{ faint: !statusExpanded }"
|
||||
:compact="!statusExpanded"
|
||||
:status="notification.action"
|
||||
/>
|
||||
</template>
|
||||
|
|
|
@ -112,6 +112,16 @@
|
|||
min-width: 3em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.timeago-link {
|
||||
margin-right: 0.2em;
|
||||
}
|
||||
|
||||
.expand-icon {
|
||||
.svg-inline--fa {
|
||||
margin-left: 0.25em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.emoji-reaction-emoji {
|
||||
|
|
|
@ -41,7 +41,13 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
update (e) {
|
||||
const [firstSegment, ...rest] = this.path.split('.')
|
||||
set(this.$parent, this.path, e)
|
||||
// Updating nested properties does not trigger update on its parent.
|
||||
// probably still not as reliable, but works for depth=1 at least
|
||||
if (rest.length > 0) {
|
||||
set(this.$parent, firstSegment, { ...get(this.$parent, firstSegment) })
|
||||
}
|
||||
},
|
||||
reset () {
|
||||
set(this.$parent, this.path, this.defaultState)
|
||||
|
|
|
@ -38,15 +38,6 @@ const FilteringTab = {
|
|||
},
|
||||
// Updating nested properties
|
||||
watch: {
|
||||
notificationVisibility: {
|
||||
handler (value) {
|
||||
this.$store.dispatch('setOption', {
|
||||
name: 'notificationVisibility',
|
||||
value: this.$store.getters.mergedConfig.notificationVisibility
|
||||
})
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
replyVisibility () {
|
||||
this.$store.dispatch('queueFlushAll')
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import ProgressButton from '../progress_button/progress_button.vue'
|
|||
import FollowButton from '../follow_button/follow_button.vue'
|
||||
import ModerationTools from '../moderation_tools/moderation_tools.vue'
|
||||
import AccountActions from '../account_actions/account_actions.vue'
|
||||
import UserNote from '../user_note/user_note.vue'
|
||||
import Select from '../select/select.vue'
|
||||
import UserLink from '../user_link/user_link.vue'
|
||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
||||
|
@ -39,7 +40,8 @@ export default {
|
|||
'rounded',
|
||||
'bordered',
|
||||
'avatarAction', // default - open profile, 'zoom' - zoom, function - call function
|
||||
'onClose'
|
||||
'onClose',
|
||||
'hasNoteEditor'
|
||||
],
|
||||
data () {
|
||||
return {
|
||||
|
@ -129,6 +131,12 @@ export default {
|
|||
const privileges = this.loggedIn.privileges
|
||||
return this.loggedIn.role === 'admin' || privileges.includes('users_manage_activation_state') || privileges.includes('users_delete') || privileges.includes('users_manage_tags')
|
||||
},
|
||||
hasNote () {
|
||||
return this.relationship.note
|
||||
},
|
||||
supportsNote () {
|
||||
return 'note' in this.relationship
|
||||
},
|
||||
...mapGetters(['mergedConfig'])
|
||||
},
|
||||
components: {
|
||||
|
@ -140,7 +148,8 @@ export default {
|
|||
FollowButton,
|
||||
Select,
|
||||
RichContent,
|
||||
UserLink
|
||||
UserLink,
|
||||
UserNote
|
||||
},
|
||||
methods: {
|
||||
muteUser () {
|
||||
|
|
|
@ -315,6 +315,10 @@
|
|||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.user-note {
|
||||
margin: 0 .75em .6em 0;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar .edit-profile-button {
|
||||
|
|
|
@ -268,6 +268,12 @@
|
|||
>
|
||||
<RemoteFollow :user="user" />
|
||||
</div>
|
||||
<UserNote
|
||||
v-if="loggedIn && isOtherUser && (hasNote || (hasNoteEditor && supportsNote))"
|
||||
:user="user"
|
||||
:relationship="relationship"
|
||||
:editable="hasNoteEditor"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
const UserNote = {
|
||||
props: {
|
||||
user: Object,
|
||||
relationship: Object,
|
||||
editable: Boolean
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
localNote: '',
|
||||
editing: false,
|
||||
frozen: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
shouldShow () {
|
||||
return this.relationship.note || this.editing
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
startEditing () {
|
||||
this.localNote = this.relationship.note
|
||||
this.editing = true
|
||||
},
|
||||
cancelEditing () {
|
||||
this.editing = false
|
||||
},
|
||||
finalizeEditing () {
|
||||
this.frozen = true
|
||||
|
||||
this.$store.dispatch('editUserNote', {
|
||||
id: this.user.id,
|
||||
comment: this.localNote
|
||||
})
|
||||
.then(() => {
|
||||
this.frozen = false
|
||||
this.editing = false
|
||||
})
|
||||
.catch(() => {
|
||||
this.frozen = false
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default UserNote
|
|
@ -0,0 +1,88 @@
|
|||
<template>
|
||||
<div
|
||||
class="user-note"
|
||||
>
|
||||
<div class="heading">
|
||||
<span>{{ $t('user_card.note') }}</span>
|
||||
<div class="buttons">
|
||||
<button
|
||||
v-show="!editing && editable"
|
||||
class="button-default btn"
|
||||
@click="startEditing"
|
||||
>
|
||||
{{ $t('user_card.edit_note') }}
|
||||
</button>
|
||||
<button
|
||||
v-show="editing"
|
||||
class="button-default btn"
|
||||
:disabled="frozen"
|
||||
@click="finalizeEditing"
|
||||
>
|
||||
{{ $t('user_card.edit_note_apply') }}
|
||||
</button>
|
||||
<button
|
||||
v-show="editing"
|
||||
class="button-default btn"
|
||||
:disabled="frozen"
|
||||
@click="cancelEditing"
|
||||
>
|
||||
{{ $t('user_card.edit_note_cancel') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<textarea
|
||||
v-show="editing"
|
||||
v-model="localNote"
|
||||
class="note-text"
|
||||
/>
|
||||
<span
|
||||
v-show="!editing"
|
||||
class="note-text"
|
||||
:class="{ '-blank': !relationship.note }"
|
||||
>
|
||||
{{ relationship.note || $t('user_card.note_blank') }}
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script src="./user_note.js"></script>
|
||||
|
||||
<style lang="scss">
|
||||
@import '../../variables';
|
||||
|
||||
.user-note {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.heading {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 0.75em;
|
||||
|
||||
.btn {
|
||||
min-width: 95px;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: right;
|
||||
|
||||
.btn {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.note-text {
|
||||
align-self: stretch;
|
||||
}
|
||||
|
||||
.note-text.-blank {
|
||||
font-style: italic;
|
||||
color: var(--faint, $fallback--faint);
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -10,6 +10,7 @@
|
|||
:selected="timeline.viewing"
|
||||
avatar-action="zoom"
|
||||
rounded="top"
|
||||
:has-note-editor="true"
|
||||
/>
|
||||
<div
|
||||
v-if="user.fields_html && user.fields_html.length > 0"
|
||||
|
|
|
@ -957,7 +957,12 @@
|
|||
"solid": "Solid bg",
|
||||
"striped": "Striped bg",
|
||||
"side": "Side stripe"
|
||||
}
|
||||
},
|
||||
"note": "Note",
|
||||
"note_blank": "(None)",
|
||||
"edit_note": "Edit note",
|
||||
"edit_note_apply": "Apply",
|
||||
"edit_note_cancel": "Cancel"
|
||||
},
|
||||
"user_profile": {
|
||||
"timeline_title": "User timeline",
|
||||
|
@ -986,7 +991,9 @@
|
|||
"user_settings": "User Settings",
|
||||
"accept_follow_request": "Accept follow request",
|
||||
"reject_follow_request": "Reject follow request",
|
||||
"bookmark": "Bookmark"
|
||||
"bookmark": "Bookmark",
|
||||
"toggle_expand": "Expand or collapse notification to show post in full",
|
||||
"toggle_mute": "Expand or collapse notification to reveal muted content"
|
||||
},
|
||||
"upload": {
|
||||
"error": {
|
||||
|
|
|
@ -56,6 +56,11 @@ const removeUserFromFollowers = (store, id) => {
|
|||
.then((relationship) => store.commit('updateUserRelationship', [relationship]))
|
||||
}
|
||||
|
||||
const editUserNote = (store, { id, comment }) => {
|
||||
return store.rootState.api.backendInteractor.editUserNote({ id, comment })
|
||||
.then((relationship) => store.commit('updateUserRelationship', [relationship]))
|
||||
}
|
||||
|
||||
const muteUser = (store, id) => {
|
||||
const predictedRelationship = store.state.relationships[id] || { id }
|
||||
predictedRelationship.muting = true
|
||||
|
@ -335,6 +340,9 @@ const users = {
|
|||
unblockUsers (store, ids = []) {
|
||||
return Promise.all(ids.map(id => unblockUser(store, id)))
|
||||
},
|
||||
editUserNote (store, args) {
|
||||
return editUserNote(store, args)
|
||||
},
|
||||
fetchMutes (store) {
|
||||
return store.rootState.api.backendInteractor.fetchMutes()
|
||||
.then((mutes) => {
|
||||
|
|
|
@ -70,6 +70,7 @@ const MASTODON_UNMUTE_USER_URL = id => `/api/v1/accounts/${id}/unmute`
|
|||
const MASTODON_REMOVE_USER_FROM_FOLLOWERS = id => `/api/v1/accounts/${id}/remove_from_followers`
|
||||
const MASTODON_SUBSCRIBE_USER = id => `/api/v1/pleroma/accounts/${id}/subscribe`
|
||||
const MASTODON_UNSUBSCRIBE_USER = id => `/api/v1/pleroma/accounts/${id}/unsubscribe`
|
||||
const MASTODON_USER_NOTE_URL = id => `/api/v1/accounts/${id}/note`
|
||||
const MASTODON_BOOKMARK_STATUS_URL = id => `/api/v1/statuses/${id}/bookmark`
|
||||
const MASTODON_UNBOOKMARK_STATUS_URL = id => `/api/v1/statuses/${id}/unbookmark`
|
||||
const MASTODON_POST_STATUS_URL = '/api/v1/statuses'
|
||||
|
@ -321,6 +322,17 @@ const removeUserFromFollowers = ({ id, credentials }) => {
|
|||
}).then((data) => data.json())
|
||||
}
|
||||
|
||||
const editUserNote = ({ id, credentials, comment }) => {
|
||||
return promisedRequest({
|
||||
url: MASTODON_USER_NOTE_URL(id),
|
||||
credentials,
|
||||
payload: {
|
||||
comment
|
||||
},
|
||||
method: 'POST'
|
||||
})
|
||||
}
|
||||
|
||||
const approveUser = ({ id, credentials }) => {
|
||||
const url = MASTODON_APPROVE_USER_URL(id)
|
||||
return fetch(url, {
|
||||
|
@ -1667,6 +1679,7 @@ const apiService = {
|
|||
blockUser,
|
||||
unblockUser,
|
||||
removeUserFromFollowers,
|
||||
editUserNote,
|
||||
fetchUser,
|
||||
fetchUserByName,
|
||||
fetchUserRelationship,
|
||||
|
|
Loading…
Reference in New Issue