diff --git a/app/javascript/flavours/glitch/components/status_action_bar.jsx b/app/javascript/flavours/glitch/components/status_action_bar.jsx
index 8a291671e3..1a8ea1ebff 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.jsx
+++ b/app/javascript/flavours/glitch/components/status_action_bar.jsx
@@ -119,7 +119,7 @@ class StatusActionBar extends ImmutablePureComponent {
 
   handleEmojiPick = data => {
     this.props.onReactionAdd(this.props.status.get('id'), data.native.replace(/:/g, ''), data.imageUrl);
-  }
+  };
 
   handleReblogClick = e => {
     const { signedIn } = this.context.identity;
@@ -202,7 +202,7 @@ class StatusActionBar extends ImmutablePureComponent {
     this.props.onAddFilter(this.props.status);
   };
 
-  handleNoOp = () => {} // hack for reaction add button
+  handleNoOp = () => {}; // hack for reaction add button
 
   render () {
     const { status, intl, withDismiss, withCounters, showReplyCount, scrollKey } = this.props;
diff --git a/app/javascript/flavours/glitch/features/status/index.jsx b/app/javascript/flavours/glitch/features/status/index.jsx
index ee30fd2355..7eabfe44fa 100644
--- a/app/javascript/flavours/glitch/features/status/index.jsx
+++ b/app/javascript/flavours/glitch/features/status/index.jsx
@@ -42,7 +42,7 @@ import { initMuteModal } from 'flavours/glitch/actions/mutes';
 import { initBlockModal } from 'flavours/glitch/actions/blocks';
 import { initReport } from 'flavours/glitch/actions/reports';
 import { initBoostModal } from 'flavours/glitch/actions/boosts';
-import { makeCustomEmojiMap, makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
+import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
 import ScrollContainer from 'flavours/glitch/containers/scroll_container';
 import ColumnHeader from '../../components/column_header';
 import StatusContainer from 'flavours/glitch/containers/status_container';
@@ -57,7 +57,6 @@ import { textForScreenReader, defaultMediaVisibility } from 'flavours/glitch/com
 import Icon from 'flavours/glitch/components/icon';
 import { Helmet } from 'react-helmet';
 import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
-import { makeCustomEmojiMap } from '../../selectors';
 
 const messages = defineMessages({
   deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
@@ -305,11 +304,11 @@ class Status extends ImmutablePureComponent {
     if (signedIn) {
       dispatch(addReaction(statusId, name, url));
     }
-  }
+  };
 
   handleReactionRemove = (statusId, name) => {
     this.props.dispatch(removeReaction(statusId, name));
-  }
+  };
 
   handlePin = (status) => {
     if (status.get('pinned')) {
diff --git a/app/services/unreact_service.rb b/app/services/unreact_service.rb
index d449570c7a..37dc1d7c53 100644
--- a/app/services/unreact_service.rb
+++ b/app/services/unreact_service.rb
@@ -3,21 +3,21 @@
 class UnreactService < BaseService
   include Payloadable
 
-def call(account, status, emoji)
-    name, domain = emoji.split('@')
-    custom_emoji = CustomEmoji.find_by(shortcode: name, domain: domain)
-    reaction = StatusReaction.find_by(account: account, status: status, name: name, custom_emoji: custom_emoji)
-    return if reaction.nil?
+  def call(account, status, emoji)
+      name, domain = emoji.split('@')
+      custom_emoji = CustomEmoji.find_by(shortcode: name, domain: domain)
+      reaction = StatusReaction.find_by(account: account, status: status, name: name, custom_emoji: custom_emoji)
+      return if reaction.nil?
 
-    reaction.destroy!
+      reaction.destroy!
 
-    json = Oj.dump(serialize_payload(reaction, ActivityPub::UndoEmojiReactionSerializer))
-    if status.account.local?
-      ActivityPub::RawDistributionWorker.perform_async(json, status.account.id)
-    else
-      ActivityPub::DeliveryWorker.perform_async(json, reaction.account_id, status.account.inbox_url)
+      json = Oj.dump(serialize_payload(reaction, ActivityPub::UndoEmojiReactionSerializer))
+      if status.account.local?
+        ActivityPub::RawDistributionWorker.perform_async(json, status.account.id)
+      else
+        ActivityPub::DeliveryWorker.perform_async(json, reaction.account_id, status.account.inbox_url)
+      end
+
+      reaction
     end
-
-    reaction
-  end
 end
diff --git a/config/locales-glitch/en.yml b/config/locales-glitch/en.yml
index 9f20402570..c35adc100d 100644
--- a/config/locales-glitch/en.yml
+++ b/config/locales-glitch/en.yml
@@ -45,3 +45,8 @@ en:
       body: "%{name} reacted to your post:"
       subject: "%{name} reacted to your post"
       title: New reaction
+  notification_mailer:
+    reaction:
+      body: "%{name} reacted to your post:"
+      subject: "%{name} reacted to your post"
+      title: New reaction
diff --git a/db/migrate/20221218015350_fix_foreign_keys_status_reactions.rb b/db/migrate/20221218015350_fix_foreign_keys_status_reactions.rb
index 83d2f85b49..3c0d1e8c13 100644
--- a/db/migrate/20221218015350_fix_foreign_keys_status_reactions.rb
+++ b/db/migrate/20221218015350_fix_foreign_keys_status_reactions.rb
@@ -2,6 +2,7 @@ class FixForeignKeysStatusReactions < ActiveRecord::Migration[6.1]
   disable_ddl_transaction!
 
   def change
+    # Fixes an oversight in a previous version of the CreateStatusReactions migration
     remove_foreign_key :status_reactions, :accounts
     add_foreign_key :status_reactions, :accounts, on_delete: :cascade, validate: false
     validate_foreign_key :status_reactions, :accounts