Skip to content

Commit

Permalink
Add "copy link" item to status action bars (mastodon#9983)
Browse files Browse the repository at this point in the history
  • Loading branch information
Gargron authored and ykzts committed Feb 11, 2019
1 parent f8ed82a commit 0cba8b7
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
22 changes: 22 additions & 0 deletions app/javascript/mastodon/components/status_action_bar.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const messages = defineMessages({
embed: { id: 'status.embed', defaultMessage: 'Embed' },
admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
});

const obfuscatedCount = count => {
Expand Down Expand Up @@ -141,6 +142,25 @@ class StatusActionBar extends ImmutablePureComponent {
this.props.onMuteConversation(this.props.status);
}

handleCopy = () => {
const url = this.props.status.get('url');
const textarea = document.createElement('textarea');

textarea.textContent = url;
textarea.style.position = 'fixed';

document.body.appendChild(textarea);

try {
textarea.select();
document.execCommand('copy');
} catch (e) {

} finally {
document.body.removeChild(textarea);
}
}

render () {
const { status, intl, withDismiss } = this.props;

Expand All @@ -156,6 +176,7 @@ class StatusActionBar extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });

if (publicStatus) {
menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
}

Expand Down Expand Up @@ -184,6 +205,7 @@ class StatusActionBar extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });

if (isStaff) {
menu.push(null);
menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
Expand Down
21 changes: 21 additions & 0 deletions app/javascript/mastodon/features/status/components/action_bar.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ const messages = defineMessages({
embed: { id: 'status.embed', defaultMessage: 'Embed' },
admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
});

export default @injectIntl
Expand Down Expand Up @@ -113,6 +114,25 @@ class ActionBar extends React.PureComponent {
this.props.onEmbed(this.props.status);
}

handleCopy = () => {
const url = this.props.status.get('url');
const textarea = document.createElement('textarea');

textarea.textContent = url;
textarea.style.position = 'fixed';

document.body.appendChild(textarea);

try {
textarea.select();
document.execCommand('copy');
} catch (e) {

} finally {
document.body.removeChild(textarea);
}
}

render () {
const { status, intl } = this.props;

Expand All @@ -122,6 +142,7 @@ class ActionBar extends React.PureComponent {
let menu = [];

if (publicStatus) {
menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
menu.push(null);
}
Expand Down

0 comments on commit 0cba8b7

Please sign in to comment.