diff --git a/app/javascript/flavours/glitch/containers/status_container.js.orig b/app/javascript/flavours/glitch/containers/status_container.js.orig
deleted file mode 100644
index 03714ce05..000000000
--- a/app/javascript/flavours/glitch/containers/status_container.js.orig
+++ /dev/null
@@ -1,303 +0,0 @@
-import { defineMessages, injectIntl } from 'react-intl';
-
-import { connect } from 'react-redux';
-
-import { initBlockModal } from 'flavours/glitch/actions/blocks';
-import { initBoostModal } from 'flavours/glitch/actions/boosts';
-import {
- replyCompose,
- mentionCompose,
- directCompose,
-} from 'flavours/glitch/actions/compose';
-import {
- initAddFilter,
-} from 'flavours/glitch/actions/filters';
-import {
- reblog,
- favourite,
- bookmark,
- unreblog,
- unfavourite,
- unbookmark,
- pin,
- unpin,
-} from 'flavours/glitch/actions/interactions';
-import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
-import { openModal } from 'flavours/glitch/actions/modal';
-import { initMuteModal } from 'flavours/glitch/actions/mutes';
-import { deployPictureInPicture } from 'flavours/glitch/actions/picture_in_picture';
-import { initReport } from 'flavours/glitch/actions/reports';
-import {
- muteStatus,
- unmuteStatus,
- deleteStatus,
- hideStatus,
- revealStatus,
- editStatus,
- translateStatus,
- undoStatusTranslation,
-} from 'flavours/glitch/actions/statuses';
-import Status from 'flavours/glitch/components/status';
-import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/initial_state';
-import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
-
-import { showAlertForError } from '../actions/alerts';
-
-const messages = defineMessages({
- deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
- deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
- redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
- redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },
- replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
- replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
- editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' },
- editMessage: { id: 'confirmations.edit.message', defaultMessage: 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
- unfilterConfirm: { id: 'confirmations.unfilter.confirm', defaultMessage: 'Show' },
- author: { id: 'confirmations.unfilter.author', defaultMessage: 'Author' },
- matchingFilters: { id: 'confirmations.unfilter.filters', defaultMessage: 'Matching {count, plural, one {filter} other {filters}}' },
- editFilter: { id: 'confirmations.unfilter.edit_filter', defaultMessage: 'Edit filter' },
-});
-
-const makeMapStateToProps = () => {
- const getStatus = makeGetStatus();
- const getPictureInPicture = makeGetPictureInPicture();
-
- const mapStateToProps = (state, props) => {
-
- let status = getStatus(state, props);
- let reblogStatus = status ? status.get('reblog', null) : null;
- let account = undefined;
- let prepend = undefined;
-
- if (props.featured && status) {
- account = status.get('account');
- prepend = 'featured';
- } else if (reblogStatus !== null && typeof reblogStatus === 'object') {
- account = status.get('account');
- status = reblogStatus;
- prepend = 'reblogged_by';
- }
-
- return {
- containerId: props.containerId || props.id, // Should match reblogStatus's id for reblogs
- status: status,
- nextInReplyToId: props.nextId ? state.getIn(['statuses', props.nextId, 'in_reply_to_id']) : null,
- account: account || props.account,
- settings: state.get('local_settings'),
- prepend: prepend || props.prepend,
- pictureInPicture: getPictureInPicture(state, props),
- };
- };
-
- return mapStateToProps;
-};
-
-const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
-
- onReply (status, router) {
- dispatch((_, getState) => {
- let state = getState();
-
- if (state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0) {
- dispatch(openModal({
- modalType: 'CONFIRM',
- modalProps: {
- message: intl.formatMessage(messages.replyMessage),
- confirm: intl.formatMessage(messages.replyConfirm),
- onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)),
- onConfirm: () => dispatch(replyCompose(status, router)),
- },
- }));
- } else {
- dispatch(replyCompose(status, router));
- }
- });
- },
-
- onModalReblog (status, privacy) {
- if (status.get('reblogged')) {
- dispatch(unreblog(status));
- } else {
- dispatch(reblog(status, privacy));
- }
- },
-
- onReblog (status, e) {
- dispatch((_, getState) => {
- let state = getState();
- if (state.getIn(['local_settings', 'confirm_boost_missing_media_description']) && status.get('media_attachments').some(item => !item.get('description')) && !status.get('reblogged')) {
- dispatch(initBoostModal({ status, onReblog: this.onModalReblog, missingMediaDescription: true }));
- } else if (e.shiftKey || !boostModal) {
- this.onModalReblog(status);
- } else {
- dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));
- }
- });
- },
-
- onBookmark (status) {
- if (status.get('bookmarked')) {
- dispatch(unbookmark(status));
- } else {
- dispatch(bookmark(status));
- }
- },
-
- onModalFavourite (status) {
- dispatch(favourite(status));
- },
-
- onFavourite (status, e) {
- if (status.get('favourited')) {
- dispatch(unfavourite(status));
- } else {
- if (e.shiftKey || !favouriteModal) {
- this.onModalFavourite(status);
- } else {
- dispatch(openModal({
- modalType: 'FAVOURITE',
- modalProps: {
- status,
- onFavourite: this.onModalFavourite,
- },
- }));
- }
- }
- },
-
- onPin (status) {
- if (status.get('pinned')) {
- dispatch(unpin(status));
- } else {
- dispatch(pin(status));
- }
- },
-
- onEmbed (status) {
- dispatch(openModal({
- modalType: 'EMBED',
- modalProps: {
- id: status.get('id'),
- onError: error => dispatch(showAlertForError(error)),
- },
- }));
- },
-
- onDelete (status, history, withRedraft = false) {
- if (!deleteModal) {
- dispatch(deleteStatus(status.get('id'), history, withRedraft));
- } else {
- dispatch(openModal({
- modalType: 'CONFIRM',
- modalProps: {
- message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
- confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
- onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)),
- },
- }));
- }
- },
-
- onEdit (status, history) {
- dispatch((_, getState) => {
- let state = getState();
- if (state.getIn(['compose', 'text']).trim().length !== 0) {
- dispatch(openModal({
- modalType: 'CONFIRM',
- modalProps: {
- message: intl.formatMessage(messages.editMessage),
- confirm: intl.formatMessage(messages.editConfirm),
- onConfirm: () => dispatch(editStatus(status.get('id'), history)),
- },
- }));
- } else {
- dispatch(editStatus(status.get('id'), history));
- }
- });
- },
-
- onTranslate (status) {
- if (status.get('translation')) {
- dispatch(undoStatusTranslation(status.get('id'), status.get('poll')));
- } else {
- dispatch(translateStatus(status.get('id')));
- }
- },
-
- onDirect (account, router) {
- dispatch(directCompose(account, router));
- },
-
- onMention (account, router) {
- dispatch(mentionCompose(account, router));
- },
-
- onOpenMedia (statusId, media, index, lang) {
- dispatch(openModal({
- modalType: 'MEDIA',
- modalProps: { statusId, media, index, lang },
- }));
- },
-
- onOpenVideo (statusId, media, lang, options) {
- dispatch(openModal({
- modalType: 'VIDEO',
- modalProps: { statusId, media, lang, options },
- }));
- },
-
- onBlock (status) {
- const account = status.get('account');
- dispatch(initBlockModal(account));
- },
-
- onReport (status) {
- dispatch(initReport(status.get('account'), status));
- },
-
- onAddFilter (status) {
- dispatch(initAddFilter(status, { contextType }));
- },
-
- onMute (account) {
- dispatch(initMuteModal(account));
- },
-
- onMuteConversation (status) {
- if (status.get('muted')) {
- dispatch(unmuteStatus(status.get('id')));
- } else {
- dispatch(muteStatus(status.get('id')));
- }
- },
-
- onToggleHidden (status) {
- if (status.get('hidden')) {
- dispatch(revealStatus(status.get('id')));
- } else {
- dispatch(hideStatus(status.get('id')));
- }
- },
-
- deployPictureInPicture (status, type, mediaProps) {
- dispatch((_, getState) => {
- if (getState().getIn(['local_settings', 'media', 'pop_in_player'])) {
- dispatch(deployPictureInPicture(status.get('id'), status.getIn(['account', 'id']), type, mediaProps));
- }
- });
- },
-
- onInteractionModal (type, status) {
- dispatch(openModal({
- modalType: 'INTERACTION',
- modalProps: {
- type,
- accountId: status.getIn(['account', 'id']),
- url: status.get('url'),
- },
- }));
- },
-
-});
-
-export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status));
diff --git a/app/javascript/flavours/glitch/features/picture_in_picture/components/footer.jsx.orig b/app/javascript/flavours/glitch/features/picture_in_picture/components/footer.jsx.orig
deleted file mode 100644
index 720ffb3a7..000000000
--- a/app/javascript/flavours/glitch/features/picture_in_picture/components/footer.jsx.orig
+++ /dev/null
@@ -1,232 +0,0 @@
-import PropTypes from 'prop-types';
-
-import { defineMessages, injectIntl } from 'react-intl';
-
-import classNames from 'classnames';
-
-import ImmutablePropTypes from 'react-immutable-proptypes';
-import ImmutablePureComponent from 'react-immutable-pure-component';
-import { connect } from 'react-redux';
-
-import { initBoostModal } from 'flavours/glitch/actions/boosts';
-import { replyCompose } from 'flavours/glitch/actions/compose';
-import { reblog, favourite, unreblog, unfavourite } from 'flavours/glitch/actions/interactions';
-import { openModal } from 'flavours/glitch/actions/modal';
-import { IconButton } from 'flavours/glitch/components/icon_button';
-import { me, boostModal } from 'flavours/glitch/initial_state';
-import { makeGetStatus } from 'flavours/glitch/selectors';
-
-const messages = defineMessages({
- reply: { id: 'status.reply', defaultMessage: 'Reply' },
- replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
- reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
- reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
- cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
- cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
- favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
- replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
- replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
- open: { id: 'status.open', defaultMessage: 'Expand this status' },
-});
-
-const makeMapStateToProps = () => {
- const getStatus = makeGetStatus();
-
- const mapStateToProps = (state, { statusId }) => ({
- status: getStatus(state, { id: statusId }),
- askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0,
- showReplyCount: state.getIn(['local_settings', 'show_reply_count']),
- });
-
- return mapStateToProps;
-};
-
-class Footer extends ImmutablePureComponent {
-
- static contextTypes = {
- router: PropTypes.object,
- identity: PropTypes.object,
- };
-
- static propTypes = {
- statusId: PropTypes.string.isRequired,
- status: ImmutablePropTypes.map.isRequired,
- intl: PropTypes.object.isRequired,
- dispatch: PropTypes.func.isRequired,
- askReplyConfirmation: PropTypes.bool,
- showReplyCount: PropTypes.bool,
- withOpenButton: PropTypes.bool,
- onClose: PropTypes.func,
- };
-
- _performReply = () => {
- const { dispatch, status, onClose } = this.props;
- const { router } = this.context;
-
- if (onClose) {
- onClose(true);
- }
-
- dispatch(replyCompose(status, router.history));
- };
-
- handleReplyClick = () => {
- const { dispatch, askReplyConfirmation, status, intl } = this.props;
- const { signedIn } = this.context.identity;
-
- if (signedIn) {
- if (askReplyConfirmation) {
- dispatch(openModal({
- modalType: 'CONFIRM',
- modalProps: {
- message: intl.formatMessage(messages.replyMessage),
- confirm: intl.formatMessage(messages.replyConfirm),
- onConfirm: this._performReply,
- },
- }));
- } else {
- this._performReply();
- }
- } else {
- dispatch(openModal({
- modalType: 'INTERACTION',
- modalProps: {
- type: 'reply',
- accountId: status.getIn(['account', 'id']),
- url: status.get('url'),
- },
- }));
- }
- };
-
- handleFavouriteClick = () => {
- const { dispatch, status } = this.props;
- const { signedIn } = this.context.identity;
-
- if (signedIn) {
- if (status.get('favourited')) {
- dispatch(unfavourite(status));
- } else {
- dispatch(favourite(status));
- }
- } else {
- dispatch(openModal({
- modalType: 'INTERACTION',
- modalProps: {
- type: 'favourite',
- accountId: status.getIn(['account', 'id']),
- url: status.get('url'),
- },
- }));
- }
- };
-
- _performReblog = (privacy) => {
- const { dispatch, status } = this.props;
- dispatch(reblog(status, privacy));
- };
-
- handleReblogClick = e => {
- const { dispatch, status } = this.props;
- const { signedIn } = this.context.identity;
-
- if (signedIn) {
- if (status.get('reblogged')) {
- dispatch(unreblog(status));
- } else if ((e && e.shiftKey) || !boostModal) {
- this._performReblog();
- } else {
- dispatch(initBoostModal({ status, onReblog: this._performReblog }));
- }
- } else {
- dispatch(openModal({
- modalType: 'INTERACTION',
- modalProps: {
- type: 'reblog',
- accountId: status.getIn(['account', 'id']),
- url: status.get('url'),
- },
- }));
- }
- };
-
- handleOpenClick = e => {
- const { router } = this.context;
-
- if (e.button !== 0 || !router) {
- return;
- }
-
- const { status, onClose } = this.props;
-
- if (onClose) {
- onClose();
- }
-
- router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`);
- };
-
- render () {
- const { status, intl, showReplyCount, withOpenButton } = this.props;
-
- const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
- const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
-
- let replyIcon, replyTitle;
-
- if (status.get('in_reply_to_id', null) === null) {
- replyIcon = 'reply';
- replyTitle = intl.formatMessage(messages.reply);
- } else {
- replyIcon = 'reply-all';
- replyTitle = intl.formatMessage(messages.replyAll);
- }
-
- let reblogTitle = '';
-
- if (status.get('reblogged')) {
- reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
- } else if (publicStatus) {
- reblogTitle = intl.formatMessage(messages.reblog);
- } else if (reblogPrivate) {
- reblogTitle = intl.formatMessage(messages.reblog_private);
- } else {
- reblogTitle = intl.formatMessage(messages.cannot_reblog);
- }
-
- let replyButton = null;
- if (showReplyCount) {
- replyButton = (
-