diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 4da4d87e9..a06865576 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useCallback, useState } from 'react'; import classNames from 'classnames'; import { AvatarPlaceHolder, ClosedGroupAvatar } from './AvatarPlaceHolder'; @@ -71,6 +71,11 @@ const AvatarImage = (props: { }) => { const { avatarPath, base64Data, name, imageBroken, handleImageError } = props; + const onDragStart = useCallback((e: any) => { + e.preventDefault(); + return false; + }, []); + if ((!avatarPath && !base64Data) || imageBroken) { return null; } @@ -79,6 +84,7 @@ const AvatarImage = (props: { return ( {window.i18n('contactAvatarAlt', diff --git a/ts/components/Lightbox.tsx b/ts/components/Lightbox.tsx index c022cd58a..542c436d5 100644 --- a/ts/components/Lightbox.tsx +++ b/ts/components/Lightbox.tsx @@ -1,6 +1,6 @@ // tslint:disable:react-a11y-anchors -import React, { useEffect, useRef } from 'react'; +import React, { useCallback, useEffect, useRef } from 'react'; import is from '@sindresorhus/is'; @@ -211,6 +211,10 @@ export const LightboxObject = ({ const isImageTypeSupported = GoogleChrome.isImageTypeSupported(contentType); + const onDragStart = useCallback((e:any) => { + e.preventDefault(); + return false; }, []); + const playVideo = () => { if (!videoRef) { return; @@ -246,7 +250,12 @@ export const LightboxObject = ({ if (isImageTypeSupported) { return ( - {window.i18n('lightboxImageAlt')} + {window.i18n('lightboxImageAlt')} ); } diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 115d7eb2b..8063c76a6 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -219,6 +219,8 @@ export type ConversationHeaderTitleProps = { const ConversationHeaderTitle = () => { const headerTitleProps = useSelector(getConversationHeaderTitleProps); + const notificationSetting = useSelector(getCurrentNotificationSettingText); + const marginXS = useTheme().common.margins.xs; if (!headerTitleProps) { return null; } @@ -256,12 +258,10 @@ const ConversationHeaderTitle = () => { memberCountText = i18n('members', [count]); } - const notificationSetting = useSelector(getCurrentNotificationSettingText); const notificationSubtitle = notificationSetting ? window.i18n('notificationSubtitle', notificationSetting) : null; const title = profileName || name || phoneNumber; - const marginXS = useTheme().common.margins.xs; return (
diff --git a/ts/components/conversation/Image.tsx b/ts/components/conversation/Image.tsx index 1dd4f9a0e..e1c59b736 100644 --- a/ts/components/conversation/Image.tsx +++ b/ts/components/conversation/Image.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useCallback } from 'react'; import classNames from 'classnames'; import { Spinner } from '../basic/Spinner'; @@ -57,6 +57,11 @@ export const Image = (props: Props) => { width, } = props; + const onDragStart = useCallback((e: any) => { + e.preventDefault(); + return false; + }, []); + const { caption, pending } = attachment || { caption: null, pending: true }; const canClick = onClick && !pending; const role = canClick ? 'button' : undefined; @@ -106,6 +111,7 @@ export const Image = (props: Props) => { height={height} width={width} src={srcData} + onDragStart={onDragStart} /> )} {caption ? ( @@ -113,6 +119,7 @@ export const Image = (props: Props) => { className="module-image__caption-icon" src="images/caption-shadow.svg" alt={window.i18n('imageCaptionIconAlt')} + onDragStart={onDragStart} /> ) : null}
{ const { loading, urlToLoad } = useEncryptedFileFetch(url, contentType); const srcData = !loading ? urlToLoad : ''; + const onDragStart = useCallback((e:any) => { + e.preventDefault(); + return false; + }, []); + const iconElement = icon ? (
@@ -128,7 +133,12 @@ export const QuoteImage = (props: any) => { return (
- {window.i18n('quoteThumbnailAlt')} + {window.i18n('quoteThumbnailAlt')} {iconElement}
); diff --git a/ts/components/conversation/media-gallery/MediaGridItem.tsx b/ts/components/conversation/media-gallery/MediaGridItem.tsx index 49f722445..9383a3467 100644 --- a/ts/components/conversation/media-gallery/MediaGridItem.tsx +++ b/ts/components/conversation/media-gallery/MediaGridItem.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useCallback, useState } from 'react'; import classNames from 'classnames'; import { isImageTypeSupported, isVideoTypeSupported } from '../../../util/GoogleChrome'; @@ -21,6 +21,11 @@ const MediaGridItemContent = (props: Props) => { const [imageBroken, setImageBroken] = useState(false); const { loading, urlToLoad } = useEncryptedFileFetch(urlToDecrypt, contentType); + + const onDragStart = useCallback((e: any) => { + e.preventDefault(); + return false; + }, []); // data will be url if loading is finished and '' if not const srcData = !loading ? urlToLoad : ''; @@ -52,6 +57,7 @@ const MediaGridItemContent = (props: Props) => { className="module-media-grid-item__image" src={srcData} onError={onImageError} + onDragStart={onDragStart} /> ); } else if (contentType && isVideoTypeSupported(contentType)) { @@ -73,6 +79,7 @@ const MediaGridItemContent = (props: Props) => { className="module-media-grid-item__image" src={srcData} onError={onImageError} + onDragStart={onDragStart} />