|
|
|
@ -10,14 +10,14 @@ import { translate } from '../../base/i18n'; |
|
|
|
|
import { Icon, IconBlurBackground, IconCancelSelection } from '../../base/icons'; |
|
|
|
|
import { connect } from '../../base/redux'; |
|
|
|
|
import { Tooltip } from '../../base/tooltip'; |
|
|
|
|
import { toggleBackgroundEffect, setVirtualBackground } from '../actions'; |
|
|
|
|
import { toggleBackgroundEffect } from '../actions'; |
|
|
|
|
import { resizeImage, toDataURL } from '../functions'; |
|
|
|
|
import logger from '../logger'; |
|
|
|
|
|
|
|
|
|
// The limit of virtual background uploads is 21. When the number
|
|
|
|
|
// of uploads is 22 we trigger the deleteStoredImage function to delete
|
|
|
|
|
// The limit of virtual background uploads is 24. When the number
|
|
|
|
|
// of uploads is 25 we trigger the deleteStoredImage function to delete
|
|
|
|
|
// the first/oldest uploaded background.
|
|
|
|
|
const backgroundsLimit = 22; |
|
|
|
|
const backgroundsLimit = 25; |
|
|
|
|
const images = [ |
|
|
|
|
{ |
|
|
|
|
id: 1, |
|
|
|
@ -67,42 +67,67 @@ function VirtualBackground({ dispatch, t }: Props) { |
|
|
|
|
* Updates stored images on local storage. |
|
|
|
|
*/ |
|
|
|
|
useEffect(() => { |
|
|
|
|
jitsiLocalStorage.setItem('virtualBackgrounds', JSON.stringify(storedImages)); |
|
|
|
|
try { |
|
|
|
|
jitsiLocalStorage.setItem('virtualBackgrounds', JSON.stringify(storedImages)); |
|
|
|
|
} catch (err) { |
|
|
|
|
// Preventing localStorage QUOTA_EXCEEDED_ERR
|
|
|
|
|
err && deleteStoredImage(storedImages[0]); |
|
|
|
|
} |
|
|
|
|
if (storedImages.length === backgroundsLimit) { |
|
|
|
|
deleteStoredImage(storedImages[0]); |
|
|
|
|
} |
|
|
|
|
}, [ storedImages ]); |
|
|
|
|
|
|
|
|
|
const [ selected, setSelected ] = useState(''); |
|
|
|
|
const enableBlur = async () => { |
|
|
|
|
const enableBlur = async (blurValue, selection) => { |
|
|
|
|
isloading(true); |
|
|
|
|
setSelected('blur'); |
|
|
|
|
await dispatch(setVirtualBackground('', false)); |
|
|
|
|
await dispatch(toggleBackgroundEffect(true)); |
|
|
|
|
setSelected(selection); |
|
|
|
|
await dispatch( |
|
|
|
|
toggleBackgroundEffect({ |
|
|
|
|
backgroundType: 'blur', |
|
|
|
|
enabled: true, |
|
|
|
|
blurValue |
|
|
|
|
}) |
|
|
|
|
); |
|
|
|
|
isloading(false); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const removeBackground = async () => { |
|
|
|
|
isloading(true); |
|
|
|
|
setSelected('none'); |
|
|
|
|
await dispatch(setVirtualBackground('', false)); |
|
|
|
|
await dispatch(toggleBackgroundEffect(false)); |
|
|
|
|
await dispatch( |
|
|
|
|
toggleBackgroundEffect({ |
|
|
|
|
enabled: false |
|
|
|
|
}) |
|
|
|
|
); |
|
|
|
|
isloading(false); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const setUploadedImageBackground = async image => { |
|
|
|
|
isloading(true); |
|
|
|
|
setSelected(image.id); |
|
|
|
|
await dispatch(setVirtualBackground(image.src, true)); |
|
|
|
|
await dispatch(toggleBackgroundEffect(true)); |
|
|
|
|
await dispatch( |
|
|
|
|
toggleBackgroundEffect({ |
|
|
|
|
backgroundType: 'image', |
|
|
|
|
enabled: true, |
|
|
|
|
url: image.src |
|
|
|
|
}) |
|
|
|
|
); |
|
|
|
|
isloading(false); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const setImageBackground = async image => { |
|
|
|
|
isloading(true); |
|
|
|
|
setSelected(image.id); |
|
|
|
|
await dispatch(setVirtualBackground(await toDataURL(image.src), true)); |
|
|
|
|
await dispatch(toggleBackgroundEffect(true)); |
|
|
|
|
const url = await toDataURL(image.src); |
|
|
|
|
|
|
|
|
|
await dispatch( |
|
|
|
|
toggleBackgroundEffect({ |
|
|
|
|
backgroundType: 'image', |
|
|
|
|
enabled: true, |
|
|
|
|
url |
|
|
|
|
}) |
|
|
|
|
); |
|
|
|
|
isloading(false); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -111,19 +136,23 @@ function VirtualBackground({ dispatch, t }: Props) { |
|
|
|
|
|
|
|
|
|
reader.readAsDataURL(imageFile[0]); |
|
|
|
|
reader.onload = async () => { |
|
|
|
|
const resizedImage = await resizeImage(reader.result); |
|
|
|
|
const url = await resizeImage(reader.result); |
|
|
|
|
|
|
|
|
|
isloading(true); |
|
|
|
|
setStoredImages([ |
|
|
|
|
...storedImages, |
|
|
|
|
{ |
|
|
|
|
id: uuid.v4(), |
|
|
|
|
src: resizedImage |
|
|
|
|
src: url |
|
|
|
|
} |
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
await dispatch(setVirtualBackground(resizedImage, true)); |
|
|
|
|
await dispatch(toggleBackgroundEffect(true)); |
|
|
|
|
await dispatch( |
|
|
|
|
toggleBackgroundEffect({ |
|
|
|
|
backgroundType: 'image', |
|
|
|
|
enabled: true, |
|
|
|
|
url |
|
|
|
|
}) |
|
|
|
|
); |
|
|
|
|
isloading(false); |
|
|
|
|
}; |
|
|
|
|
reader.onerror = () => { |
|
|
|
@ -137,7 +166,7 @@ function VirtualBackground({ dispatch, t }: Props) { |
|
|
|
|
hideCancelButton = { true } |
|
|
|
|
submitDisabled = { false } |
|
|
|
|
titleKey = { 'virtualBackground.title' } |
|
|
|
|
width = 'small'> |
|
|
|
|
width = '450px'> |
|
|
|
|
{loading ? ( |
|
|
|
|
<div className = 'virtual-background-loading'> |
|
|
|
|
<span className = 'loading-content-text'>{t('virtualBackground.pleaseWait')}</span> |
|
|
|
@ -158,11 +187,20 @@ function VirtualBackground({ dispatch, t }: Props) { |
|
|
|
|
</div> |
|
|
|
|
</Tooltip> |
|
|
|
|
<Tooltip |
|
|
|
|
content = { t('virtualBackground.enableBlur') } |
|
|
|
|
content = { t('virtualBackground.slightBlur') } |
|
|
|
|
position = { 'top' }> |
|
|
|
|
<Icon |
|
|
|
|
className = { selected === 'slight-blur' ? 'blur-selected' : '' } |
|
|
|
|
onClick = { () => enableBlur(8, 'slight-blur') } |
|
|
|
|
size = { 50 } |
|
|
|
|
src = { IconBlurBackground } /> |
|
|
|
|
</Tooltip> |
|
|
|
|
<Tooltip |
|
|
|
|
content = { t('virtualBackground.blur') } |
|
|
|
|
position = { 'top' }> |
|
|
|
|
<Icon |
|
|
|
|
className = { selected === 'blur' ? 'blur-selected' : '' } |
|
|
|
|
onClick = { () => enableBlur() } |
|
|
|
|
onClick = { () => enableBlur(25, 'blur') } |
|
|
|
|
size = { 50 } |
|
|
|
|
src = { IconBlurBackground } /> |
|
|
|
|
</Tooltip> |
|
|
|
|