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 }) => (