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 1c2b486a..2b01119d 100644
--- a/src/frontend/src/features/rooms/livekit/components/effects/EffectsConfiguration.tsx
+++ b/src/frontend/src/features/rooms/livekit/components/effects/EffectsConfiguration.tsx
@@ -25,7 +25,11 @@ import {
} from '@/features/files/api/listFiles.ts'
import { useCreateFile } from '@/features/files/api/createFile.ts'
import { FileTrigger } from 'react-aria-components'
-import { RiDeleteBinLine, RiImageAddFill } from '@remixicon/react'
+import {
+ RiDeleteBinLine,
+ RiImageAddFill,
+ RiProhibitedLine,
+} from '@remixicon/react'
import { useDeleteFile } from '@/features/files/api/deleteFile.ts'
import { useUser } from '@/features/auth/api/useUser'
import { ApiFileItem } from '@/features/files/api/types.ts'
@@ -250,6 +254,24 @@ export const EffectsConfiguration = ({
[enabled, selectedId, toggle, updateEffectStatusMessage, videoTrack]
)
+ const clearEffect = useCallback(async () => {
+ if (selectedId === 'none') return
+ setProcessorPending(true)
+ try {
+ if (videoTrack?.getProcessor()) {
+ await videoTrack.stopProcessor()
+ }
+ saveProcessorConfig(undefined)
+ announceEffectStatusMessage(t('blur.status.none'))
+ } catch (error) {
+ reportError('effects_processor_failure', error, {
+ context: 'Error clearing effect:',
+ })
+ } finally {
+ setTimeout(() => setProcessorPending(false))
+ }
+ }, [announceEffectStatusMessage, selectedId, t, videoTrack])
+
const { data: appConfig } = useConfig()
const { isLoggedIn } = useUser()
const canUploadBackground =
@@ -647,6 +669,17 @@ export const EffectsConfiguration = ({
gap: '1.25rem',
})}
>
+
+
+
{processorOptions.blurBased.map(({ Icon, ...option }) => (