fix: Display native context menu on image, video preview modals (#6756)

This commit is contained in:
Pranav Raj S 2023-03-26 15:16:56 -07:00 committed by GitHub
parent 4b83bcb5ca
commit 1e8881577a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 34 additions and 9 deletions

View File

@ -47,7 +47,7 @@ export default {
}, },
computed: { computed: {
modalContainerClassName() { modalContainerClassName() {
let className = 'modal-container'; let className = 'modal-container skip-context-menu';
if (this.fullWidth) { if (this.fullWidth) {
return `${className} modal-container--full-width`; return `${className} modal-container--full-width`;
} }
@ -60,7 +60,9 @@ export default {
'right-aligned': 'right-aligned', 'right-aligned': 'right-aligned',
}; };
return `modal-mask ${modalClassNameMap[this.modalType] || ''}`; return `modal-mask skip-context-menu ${modalClassNameMap[
this.modalType
] || ''}`;
}, },
}, },
mounted() { mounted() {

View File

@ -1,7 +1,11 @@
<template> <template>
<li v-if="shouldRenderMessage" :class="alignBubble"> <li v-if="shouldRenderMessage" :class="alignBubble">
<div :class="wrapClass" @contextmenu="openContextMenu($event)"> <div :class="wrapClass">
<div v-tooltip.top-start="messageToolTip" :class="bubbleClass"> <div
v-tooltip.top-start="messageToolTip"
:class="bubbleClass"
@contextmenu="openContextMenu($event)"
>
<bubble-mail-head <bubble-mail-head
:email-attributes="contentAttributes.email" :email-attributes="contentAttributes.email"
:cc="emailHeadAttributes.cc" :cc="emailHeadAttributes.cc"
@ -32,7 +36,11 @@
:url="attachment.data_url" :url="attachment.data_url"
@error="onImageLoadError" @error="onImageLoadError"
/> />
<audio v-else-if="attachment.file_type === 'audio'" controls> <audio
v-else-if="attachment.file_type === 'audio'"
controls
class="skip-context-menu"
>
<source :src="attachment.data_url" /> <source :src="attachment.data_url" />
</audio> </audio>
<bubble-video <bubble-video
@ -429,9 +437,13 @@ export default {
this.hasImageError = true; this.hasImageError = true;
}, },
openContextMenu(e) { openContextMenu(e) {
if (getSelection().toString()) { const shouldSkipContextMenu = e.target?.classList.contains(
'skip-context-menu'
);
if (shouldSkipContextMenu || getSelection().toString()) {
return; return;
} }
e.preventDefault(); e.preventDefault();
if (e.type === 'contextmenu') { if (e.type === 'contextmenu') {
this.$track(ACCOUNT_EVENTS.OPEN_MESSAGE_CONTEXT_MENU); this.$track(ACCOUNT_EVENTS.OPEN_MESSAGE_CONTEXT_MENU);
@ -479,7 +491,8 @@ export default {
} }
} }
&.is-image.is-text > .message-text__wrap { &.is-image.is-text > .message-text__wrap,
&.is-video.is-text > .message-text__wrap {
max-width: 32rem; max-width: 32rem;
padding: var(--space-small) var(--space-normal); padding: var(--space-small) var(--space-normal);
} }

View File

@ -2,7 +2,7 @@
<div class="image message-text__wrap"> <div class="image message-text__wrap">
<img :src="url" @click="onClick" @error="onImgError()" /> <img :src="url" @click="onClick" @error="onImgError()" />
<woot-modal :full-width="true" :show.sync="show" :on-close="onClose"> <woot-modal :full-width="true" :show.sync="show" :on-close="onClose">
<img :src="url" class="modal-image" /> <img :src="url" class="modal-image skip-context-menu" />
</woot-modal> </woot-modal>
</div> </div>
</template> </template>

View File

@ -2,7 +2,12 @@
<div class="video message-text__wrap"> <div class="video message-text__wrap">
<video :src="url" muted playsInline @click="onClick" /> <video :src="url" muted playsInline @click="onClick" />
<woot-modal :show.sync="show" :on-close="onClose"> <woot-modal :show.sync="show" :on-close="onClose">
<video :src="url" controls playsInline class="modal-video" /> <video
:src="url"
controls
playsInline
class="modal-video skip-context-menu"
/>
</woot-modal> </woot-modal>
</div> </div>
</template> </template>

View File

@ -54,6 +54,7 @@
@click="handleCopy" @click="handleCopy"
/> />
<menu-item <menu-item
v-if="enabledOptions['copy']"
:option="{ :option="{
icon: 'translate', icon: 'translate',
label: this.$t('CONVERSATION.CONTEXT_MENU.TRANSLATE'), label: this.$t('CONVERSATION.CONTEXT_MENU.TRANSLATE'),
@ -214,6 +215,10 @@ export default {
box-shadow: var(--shadow-context-menu); box-shadow: var(--shadow-context-menu);
border-radius: var(--border-radius-normal); border-radius: var(--border-radius-normal);
hr:first-child {
display: none;
}
hr { hr {
border-bottom: 1px solid var(--color-border-light); border-bottom: 1px solid var(--color-border-light);
margin: var(--space-smaller); margin: var(--space-smaller);