UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

104 lines 4.58 kB
Object.defineProperty(exports, "__esModule", { value: true }); exports.useIncomingMessageAnnouncements = void 0; var _react = require("react"); var _AccessibilityContext = require("../../../contexts/accessibilityContext/AccessibilityContext"); var _TranslationContext = require("../../../contexts/translationContext/TranslationContext"); var _useAccessibilityAnnouncer = require("../useAccessibilityAnnouncer"); var MESSAGE_ANNOUNCEMENT_THROTTLE_MS = 1000; var isAnnounceableIncomingMessage = (message, ownUserId) => { var messageUserId = message.user?.id; if (!message.id || !messageUserId || messageUserId === ownUserId) return false; return message.type !== 'deleted' && message.type !== 'ephemeral' && message.type !== 'error' && message.type !== 'system' && message.status !== 'failed' && message.status !== 'sending'; }; var getSenderName = (message, t) => message.user?.name?.trim() || message.user?.id || t('Anonymous'); var useIncomingMessageAnnouncements = ({ activeThreadId, channel, ownUserId, threadList = false }) => { var _useAccessibilityCont = (0, _AccessibilityContext.useAccessibilityContext)(), announceNewMessages = _useAccessibilityCont.announceNewMessages, enabled = _useAccessibilityCont.enabled; var announce = (0, _useAccessibilityAnnouncer.useAccessibilityAnnouncer)(); var _useTranslationContex = (0, _TranslationContext.useTranslationContext)(), t = _useTranslationContex.t; var lastAnnouncementTimestampRef = (0, _react.useRef)(0); var flushTimeoutRef = (0, _react.useRef)(undefined); var announcedMessageIdsRef = (0, _react.useRef)(new Set()); var pendingAnnouncementBatchRef = (0, _react.useRef)({ count: 0, firstSender: null }); var flushPendingAnnouncements = (0, _react.useCallback)(() => { var pending = pendingAnnouncementBatchRef.current; if (pending.count <= 0) return; if (pending.count === 1) { announce(t('a11y/New message from {{user}}', { user: pending.firstSender || t('Anonymous') })); } else { announce(t('a11y/{{count}} new messages', { count: pending.count })); } pending.count = 0; pending.firstSender = null; lastAnnouncementTimestampRef.current = Date.now(); }, [announce, t]); var scheduleFlush = (0, _react.useCallback)(() => { if (flushTimeoutRef.current) return; var now = Date.now(); var elapsed = now - lastAnnouncementTimestampRef.current; if (elapsed >= MESSAGE_ANNOUNCEMENT_THROTTLE_MS) { flushPendingAnnouncements(); return; } flushTimeoutRef.current = setTimeout(() => { flushTimeoutRef.current = undefined; flushPendingAnnouncements(); }, MESSAGE_ANNOUNCEMENT_THROTTLE_MS - elapsed); }, [flushPendingAnnouncements]); (0, _react.useEffect)(() => () => { if (flushTimeoutRef.current) clearTimeout(flushTimeoutRef.current); }, []); (0, _react.useEffect)(() => { if (!enabled || !announceNewMessages || !channel) return; var handleMessageNew = event => { var message = event.message; if (!message) return; if (event.cid && event.cid !== channel.cid || !isAnnounceableIncomingMessage(message, ownUserId)) { return; } var isReply = !!message.parent_id; var belongsToActiveThread = !!activeThreadId && message.parent_id === activeThreadId; var shouldAnnounceInThreadList = threadList && belongsToActiveThread; var shouldAnnounceInMainList = !threadList && !isReply; if (!shouldAnnounceInThreadList && !shouldAnnounceInMainList) return; if (announcedMessageIdsRef.current.has(message.id || '')) return; if (message.id) { if (announcedMessageIdsRef.current.size > 500) { announcedMessageIdsRef.current.clear(); } announcedMessageIdsRef.current.add(message.id); } pendingAnnouncementBatchRef.current.count += 1; if (!pendingAnnouncementBatchRef.current.firstSender) { pendingAnnouncementBatchRef.current.firstSender = getSenderName(message, t); } scheduleFlush(); }; var subscription = channel.on('message.new', handleMessageNew); return () => { subscription.unsubscribe(); if (flushTimeoutRef.current) { clearTimeout(flushTimeoutRef.current); flushTimeoutRef.current = undefined; } }; }, [activeThreadId, announceNewMessages, channel, enabled, ownUserId, scheduleFlush, t, threadList]); }; exports.useIncomingMessageAnnouncements = useIncomingMessageAnnouncements; //# sourceMappingURL=useIncomingMessageAnnouncements.js.map