diff --git a/src/frontend/public/assets/backgrounds/1.jpg b/src/frontend/public/assets/backgrounds/1.jpg
new file mode 100644
index 00000000..7a449257
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/1.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/2.jpg b/src/frontend/public/assets/backgrounds/2.jpg
new file mode 100644
index 00000000..a5afb860
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/2.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/3.jpg b/src/frontend/public/assets/backgrounds/3.jpg
new file mode 100644
index 00000000..ac00c660
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/3.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/4.jpg b/src/frontend/public/assets/backgrounds/4.jpg
new file mode 100644
index 00000000..4fab157a
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/4.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/5.jpg b/src/frontend/public/assets/backgrounds/5.jpg
new file mode 100644
index 00000000..068de06f
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/5.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/6.jpg b/src/frontend/public/assets/backgrounds/6.jpg
new file mode 100644
index 00000000..820dc556
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/6.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/7.jpg b/src/frontend/public/assets/backgrounds/7.jpg
new file mode 100644
index 00000000..aa79b23d
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/7.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/8.jpg b/src/frontend/public/assets/backgrounds/8.jpg
new file mode 100644
index 00000000..e0617e95
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/8.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/thumbnails/1.jpg b/src/frontend/public/assets/backgrounds/thumbnails/1.jpg
new file mode 100644
index 00000000..4b7c8ee9
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/thumbnails/1.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/thumbnails/2.jpg b/src/frontend/public/assets/backgrounds/thumbnails/2.jpg
new file mode 100644
index 00000000..a6dfa075
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/thumbnails/2.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/thumbnails/3.jpg b/src/frontend/public/assets/backgrounds/thumbnails/3.jpg
new file mode 100644
index 00000000..bcb6f813
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/thumbnails/3.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/thumbnails/4.jpg b/src/frontend/public/assets/backgrounds/thumbnails/4.jpg
new file mode 100644
index 00000000..46a8711b
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/thumbnails/4.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/thumbnails/5.jpg b/src/frontend/public/assets/backgrounds/thumbnails/5.jpg
new file mode 100644
index 00000000..bc4ede10
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/thumbnails/5.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/thumbnails/6.jpg b/src/frontend/public/assets/backgrounds/thumbnails/6.jpg
new file mode 100644
index 00000000..8ef981ad
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/thumbnails/6.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/thumbnails/7.jpg b/src/frontend/public/assets/backgrounds/thumbnails/7.jpg
new file mode 100644
index 00000000..cbc06ca3
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/thumbnails/7.jpg differ
diff --git a/src/frontend/public/assets/backgrounds/thumbnails/8.jpg b/src/frontend/public/assets/backgrounds/thumbnails/8.jpg
new file mode 100644
index 00000000..e420b927
Binary files /dev/null and b/src/frontend/public/assets/backgrounds/thumbnails/8.jpg differ
diff --git a/src/frontend/src/components/icons/BlurOn.tsx b/src/frontend/src/components/icons/BlurOn.tsx
new file mode 100644
index 00000000..c4bd4ec0
--- /dev/null
+++ b/src/frontend/src/components/icons/BlurOn.tsx
@@ -0,0 +1,16 @@
+export const BlurOn = () => {
+ return (
+
+ )
+}
diff --git a/src/frontend/src/components/icons/BlurOnStrong.tsx b/src/frontend/src/components/icons/BlurOnStrong.tsx
new file mode 100644
index 00000000..cc42fd33
--- /dev/null
+++ b/src/frontend/src/components/icons/BlurOnStrong.tsx
@@ -0,0 +1,18 @@
+export const BlurOnStrong = () => {
+ return (
+
+ )
+}
diff --git a/src/frontend/src/features/rooms/livekit/components/effects/EffectsConfiguration.tsx b/src/frontend/src/features/rooms/livekit/components/effects/EffectsConfiguration.tsx
index 8003eb11..bf7b6f1d 100644
--- a/src/frontend/src/features/rooms/livekit/components/effects/EffectsConfiguration.tsx
+++ b/src/frontend/src/features/rooms/livekit/components/effects/EffectsConfiguration.tsx
@@ -2,12 +2,16 @@ import { LocalVideoTrack } from 'livekit-client'
import { useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import {
- BackgroundBlurFactory,
- BackgroundBlurProcessorInterface,
+ BackgroundProcessorFactory,
+ BackgroundProcessorInterface,
+ ProcessorType,
} from '../blur'
import { css } from '@/styled-system/css'
import { Text, P, ToggleButton, H } from '@/primitives'
-import { HStack, styled } from '@/styled-system/jsx'
+import { styled } from '@/styled-system/jsx'
+import { BackgroundOptions } from '@livekit/track-processors'
+import { BlurOn } from '@/components/icons/BlurOn'
+import { BlurOnStrong } from '@/components/icons/BlurOnStrong'
enum BlurRadius {
NONE = 0,
@@ -15,21 +19,20 @@ enum BlurRadius {
NORMAL = 10,
}
-const isSupported = BackgroundBlurFactory.isSupported()
+const isSupported = BackgroundProcessorFactory.isSupported()
const Information = styled('div', {
base: {
backgroundColor: 'orange.50',
borderRadius: '4px',
padding: '0.75rem 0.75rem',
- marginTop: '0.8rem',
alignItems: 'start',
},
})
export type EffectsConfigurationProps = {
videoTrack: LocalVideoTrack
- onSubmit?: (processor?: BackgroundBlurProcessorInterface) => void
+ onSubmit?: (processor?: BackgroundProcessorInterface) => void
layout?: 'vertical' | 'horizontal'
}
@@ -55,46 +58,56 @@ export const EffectsConfiguration = ({
}
}, [videoTrack, videoTrack?.isMuted])
- const toggleBlur = async (blurRadius: number) => {
+ const toggleEffect = async (
+ type: ProcessorType,
+ options: BackgroundOptions
+ ) => {
if (!videoTrack) return
setProcessorPending(true)
const processor = getProcessor()
- const currentBlurRadius = getBlurRadius()
try {
- if (blurRadius == currentBlurRadius && processor) {
+ if (isSelected(type, options)) {
+ // Stop processor.
await videoTrack.stopProcessor()
onSubmit?.(undefined)
- } else if (!processor) {
- const newProcessor = BackgroundBlurFactory.getProcessor({ blurRadius })!
+ } else if (!processor || processor.serialize().type !== type) {
+ // Change processor.
+ const newProcessor = BackgroundProcessorFactory.getProcessor(
+ type,
+ options
+ )!
await videoTrack.setProcessor(newProcessor)
onSubmit?.(newProcessor)
} else {
- processor?.update({ blurRadius })
+ // Update processor.
+ processor?.update(options)
// We want to trigger onSubmit when options changes so the parent component is aware of it.
onSubmit?.(processor)
}
} catch (error) {
console.error('Error applying blur:', error)
} finally {
- setProcessorPending(false)
+ // Without setTimeout the DOM is not refreshing when updating the options.
+ setTimeout(() => setProcessorPending(false))
}
}
const getProcessor = () => {
- return videoTrack?.getProcessor() as BackgroundBlurProcessorInterface
+ return videoTrack?.getProcessor() as BackgroundProcessorInterface
}
- const getBlurRadius = (): BlurRadius => {
+ const isSelected = (type: ProcessorType, options: BackgroundOptions) => {
const processor = getProcessor()
- return processor?.options.blurRadius || BlurRadius.NONE
+ const processorSerialized = processor?.serialize()
+ return (
+ !!processor &&
+ processorSerialized.type === type &&
+ JSON.stringify(processorSerialized.options) === JSON.stringify(options)
+ )
}
- const isSelected = (blurRadius: BlurRadius) => {
- return getBlurRadius() == blurRadius
- }
-
- const tooltipLabel = (blurRadius: BlurRadius) => {
- return t(`blur.${isSelected(blurRadius) ? 'clear' : 'apply'}`)
+ const tooltipLabel = (type: ProcessorType, options: BackgroundOptions) => {
+ return t(`${type}.${isSelected(type, options) ? 'clear' : 'apply'}`)
}
return (
@@ -104,7 +117,7 @@ export const EffectsConfiguration = ({
? {
display: 'flex',
flexDirection: 'column',
- gap: '0.5rem',
+ gap: '1.5rem',
}
: {
display: 'flex',
@@ -112,6 +125,7 @@ export const EffectsConfiguration = ({
flexDirection: 'column',
md: {
flexDirection: 'row',
+ overflow: 'hidden',
},
}
)}
@@ -164,49 +178,138 @@ export const EffectsConfiguration = ({
md: {
borderLeft: '1px solid #dadce0',
paddingLeft: '1.5rem',
+ width: '420px',
+ flexShrink: 0,
},
}
: {}
)}
>
-