diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 1ccafb00e..80232f0b6 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -7,6 +7,7 @@ /* global Signal: false */ /* global storage: false */ /* global Whisper: false */ +/* global clipboard: false */ // eslint-disable-next-line func-names (function () { @@ -214,6 +215,14 @@ onClearNickname: async () => { this.model.setNickname(null); }, + onCopyPublicKey: () => { + clipboard.writeText(this.model.id); + const toast = new Whisper.MessageToastView({ + message: i18n('copiedPublicKey'), + }); + toast.$el.appendTo(this.$el); + toast.render(); + }, }; }; this.titleView = new Whisper.ReactWrapperView({ diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 5dfd089ee..9c9132713 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -52,6 +52,8 @@ interface Props { onClearNickname: () => void; onChangeNickname: () => void; + + onCopyPublicKey: () => void; } export class ConversationHeader extends React.Component { @@ -193,6 +195,7 @@ export class ConversationHeader extends React.Component { hasNickname, onClearNickname, onChangeNickname, + onCopyPublicKey, } = this.props; const disappearingTitle = i18n('disappearingMessages') as any; @@ -238,6 +241,7 @@ export class ConversationHeader extends React.Component { {!isMe && hasNickname ? ( {i18n('clearNickname')} ) : null} + {i18n('copyPublicKey')} {i18n('deleteMessages')} );