diff --git a/app/javascript/mastodon/containers/timeline_container.js b/app/javascript/mastodon/containers/timeline_container.js index ed8095f90..768169458 100644 --- a/app/javascript/mastodon/containers/timeline_container.js +++ b/app/javascript/mastodon/containers/timeline_container.js @@ -47,7 +47,9 @@ export default class TimelineContainer extends React.PureComponent { - {timeline} +
+ {timeline} +
{ReactDOM.createPortal( , diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js index d97190698..35f09b90b 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.js +++ b/app/javascript/mastodon/features/status/components/detailed_status.js @@ -197,7 +197,7 @@ class DetailedStatus extends ImmutablePureComponent { } else { quote = (
- +
diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js index bfed16620..8238f654d 100644 --- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js +++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js @@ -20,6 +20,8 @@ import { deleteStatus, hideStatus, revealStatus, + hideQuote, + revealQuote, } from '../../../actions/statuses'; import { initMuteModal } from '../../../actions/mutes'; import { initBlockModal } from '../../../actions/blocks'; @@ -136,6 +138,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ dispatch(openModal('VIDEO', { media, options })); }, + onOpenMediaQuote (media, index) { + dispatch(openModal('MEDIA', { media, index })); + }, + + onOpenVideoQuote (media, options) { + dispatch(openModal('VIDEO', { media, options })); + }, + onBlock (status) { const account = status.get('account'); dispatch(initBlockModal(account)); @@ -165,6 +175,13 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ } }, + onQuoteToggleHidden (status) { + if (status.get('quote_hidden')) { + dispatch(revealQuote(status.get('id'))); + } else { + dispatch(hideQuote(status.get('id'))); + } + }, }); export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(DetailedStatus)); diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 8c5c15b8f..3a92d891a 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -291,6 +291,31 @@ function main() { } }); }); + + delegate(document, '.quote-status', 'click', ({ target }) => { + if (target.closest('.status__content__spoiler-link') || + target.closest('.media-gallery') || + target.closest('.video-player') || + target.closest('.audio-player')) { + return false; + } + + let url = target.closest('.quote-status').getAttribute('dataurl'); + if (target.closest('.status__display-name')) { + url = target.closest('.status__display-name').getAttribute('href'); + } else if (target.closest('.detailed-status__display-name')) { + url = target.closest('.detailed-status__display-name').getAttribute('href'); + } else if (target.closest('.status-card')) { + url = target.closest('.status-card').getAttribute('href'); + } + + if (window.location.hostname === url.split('/')[2].split(':')[0]) { + window.location.href = url; + } else { + window.open(url, 'blank'); + } + return false; + }); } loadPolyfills() diff --git a/app/javascript/styles/mastodon/statuses.scss b/app/javascript/styles/mastodon/statuses.scss index 078714325..7e915dd6e 100644 --- a/app/javascript/styles/mastodon/statuses.scss +++ b/app/javascript/styles/mastodon/statuses.scss @@ -77,6 +77,10 @@ } } +.standalone-timeline .quote-status { + cursor: pointer; +} + .button.logo-button { flex: 0 auto; font-size: 14px;