diff --git a/app/controllers/api/v1/statuses/emoji_reactions_controller.rb b/app/controllers/api/v1/statuses/emoji_reactions_controller.rb
index efeb8e9929..790ea0adcc 100644
--- a/app/controllers/api/v1/statuses/emoji_reactions_controller.rb
+++ b/app/controllers/api/v1/statuses/emoji_reactions_controller.rb
@@ -6,26 +6,30 @@ class Api::V1::Statuses::EmojiReactionsController < Api::BaseController
before_action -> { doorkeeper_authorize! :write, :'write:emoji_reactions' }
before_action :require_user!
before_action :set_status, only: [:update]
+ before_action :set_status_without_authorize, only: [:destroy]
# For compatible with Fedibird API
def update
create_private
end
- # TODO: destroy emoji reaction api
def destroy
- # fav = current_account.favourites.find_by(status_id: params[:status_id])
+ emoji = params[:emoji]
- # if fav
- # @status = fav.status
- # UnfavouriteWorker.perform_async(current_account.id, @status.id)
- # else
- # @status = Status.find(params[:status_id])
- # authorize @status, :show?
- # end
+ if emoji
+ shortcode, domain = emoji.split('@')
+ emoji_reaction = EmojiReaction.where(account_id: current_account.id).where(status_id: @status.id).where(name: shortcode)
+ .find { |reaction| domain == '' ? reaction.custom_emoji.nil? : reaction.custom_emoji&.domain == domain }
- # render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, favourites_map: { @status.id => false })
- # rescue Mastodon::NotPermittedError
+ authorize @status, :show? if emoji_reaction.nil?
+ end
+
+ UnEmojiReactWorker.perform_async(current_account.id, @status.id, emoji)
+
+ render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(
+ [@status], current_account.id, emoji_reactions_map: { @status.id => false }
+ )
+ rescue Mastodon::NotPermittedError
not_found
end
@@ -37,9 +41,13 @@ class Api::V1::Statuses::EmojiReactionsController < Api::BaseController
end
def set_status
- @status = Status.find(params[:status_id])
+ set_status_without_authorize
authorize @status, :show?
rescue Mastodon::NotPermittedError
not_found
end
+
+ def set_status_without_authorize
+ @status = Status.find(params[:status_id])
+ end
end
diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js
index 15b466141c..8669484602 100644
--- a/app/javascript/mastodon/actions/interactions.js
+++ b/app/javascript/mastodon/actions/interactions.js
@@ -206,7 +206,6 @@ export function unfavouriteFail(status, error) {
export function emojiReact(status, emoji) {
return function (dispatch, getState) {
dispatch(emojiReactRequest(status, emoji));
- console.dir(emoji.custom ? (emoji.name + (emoji.domain || '')) : emoji.native);
api(getState).put(`/api/v1/statuses/${status.get('id')}/emoji_reactions/${emoji.custom ? (emoji.name + (emoji.domain || '')) : emoji.native}`).then(function (response) {
dispatch(importFetchedStatus(response.data));
@@ -221,7 +220,7 @@ export function unEmojiReact(status, emoji) {
return (dispatch, getState) => {
dispatch(unEmojiReactRequest(status, emoji));
- api(getState).post(`/api/v1/statuses/${status.get('id')}/emoji_unreactions/${emoji.native}`).then(response => {
+ api(getState).post(`/api/v1/statuses/${status.get('id')}/emoji_unreaction`, { emoji }).then(response => {
dispatch(importFetchedStatus(response.data));
dispatch(unEmojiReactSuccess(status, emoji));
}).catch(error => {
diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx
index ceda971feb..c3feb7efdb 100644
--- a/app/javascript/mastodon/components/status.jsx
+++ b/app/javascript/mastodon/components/status.jsx
@@ -511,7 +511,7 @@ class Status extends ImmutablePureComponent {
let emojiReactionsBar = null;
if (status.get('emoji_reactions')) {
const emojiReactions = status.get('emoji_reactions');
- emojiReactionsBar = ;
+ emojiReactionsBar = ;
}
return (
diff --git a/app/javascript/mastodon/components/status_emoji_reactions_bar.jsx b/app/javascript/mastodon/components/status_emoji_reactions_bar.jsx
index d91525430d..7fd99bf312 100644
--- a/app/javascript/mastodon/components/status_emoji_reactions_bar.jsx
+++ b/app/javascript/mastodon/components/status_emoji_reactions_bar.jsx
@@ -1,7 +1,7 @@
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import { FormattedMessage, injectIntl } from 'react-intl';
+import { injectIntl } from 'react-intl';
import emojify from '../features/emoji/emoji';
import classNames from 'classnames';
@@ -9,11 +9,25 @@ class EmojiReactionButton extends React.PureComponent {
static propTypes = {
name: PropTypes.string,
+ domain: PropTypes.string,
url: PropTypes.string,
staticUrl: PropTypes.string,
count: PropTypes.number.isRequired,
me: PropTypes.bool,
- onClick: PropTypes.func,
+ status: PropTypes.map,
+ onEmojiReact: PropTypes.func,
+ onUnEmojiReact: PropTypes.func,
+ };
+
+ onClick = () => {
+ const { name, domain, me } = this.props;
+
+ const nameParameter = domain ? `${name}@${domain}` : name;
+ if (me) {
+ if (this.props.onUnEmojiReact) this.props.onUnEmojiReact(nameParameter);
+ } else {
+ if (this.props.onEmojiReact) this.props.onEmojiReact(nameParameter);
+ }
};
render () {
@@ -34,7 +48,7 @@ class EmojiReactionButton extends React.PureComponent {
};
return (
-