import debounce from 'lodash/debounce' import { useCallback, useEffect, useMemo, useRef } from 'react' import { Alert } from 'react-native' import type { CurrentPersonResource } from '../types' import type { AttachmentFlaggedEvent } from '../types/jolt_events/attachment_events' import { useApiGet } from './use_api' import { currentPersonRequestArgs } from './use_current_person' import { useJoltChannel, useJoltEvent } from './use_jolt' const DEBOUNCE_MS = 500 export function useVideoModerationJoltEvents() { const { data: currentPerson } = useApiGet(currentPersonRequestArgs) const joltChannel = useJoltChannel(`chat.people.${currentPerson?.id}`, Boolean(currentPerson?.id)) const pendingIdsRef = useRef>(new Set()) const flushAlert = useMemo( () => debounce(() => { const count = pendingIdsRef.current.size if (count === 0) return pendingIdsRef.current.clear() Alert.alert( 'Video removed', count === 1 ? "A video you uploaded was flagged because it doesn't meet our content guidelines." : "Some videos you uploaded were flagged because they don't meet our content guidelines." ) }, DEBOUNCE_MS), [] ) useEffect(() => () => flushAlert.cancel(), [flushAlert]) const markHandledByMessageForm = useCallback((id: string) => { pendingIdsRef.current.delete(id) }, []) useJoltEvent(joltChannel, 'attachment.flagged', (e: AttachmentFlaggedEvent) => { if (!e.data.data.content_type.startsWith('video/')) return pendingIdsRef.current.add(e.data.data.attachment_id) flushAlert() }) return { markHandledByMessageForm } }