UNPKG

@uimkit/uikit-react

Version:

<img style="width:64px" src="https://mgmt.uimkit.chat/media/img/avatar.png"/>

62 lines (59 loc) 2.85 kB
import { useRef, useEffect } from 'react'; import '../../../types/models.js'; import '../../../types/events.js'; import '../../../context/TranslationContext.js'; import { useUIKit } from '../../../context/UIKitContext.js'; import '../../../context/ComponentContext.js'; import '../../../context/ChatActionContext.js'; import '../../../context/MessageInputContext.js'; import '../../../context/UIMessageContext.js'; import '../../../context/ChatStateContext.js'; function useMessageListScrollManager(params) { var onScrollBy = params.onScrollBy, scrollContainerMeasures = params.scrollContainerMeasures, scrolledUpThreshold = params.scrolledUpThreshold, scrollToBottom = params.scrollToBottom, showNewMessages = params.showNewMessages; var activeProfile = useUIKit('useMessageListScrollManager').activeProfile; var measures = useRef({ offsetHeight: 0, scrollHeight: 0, }); var messages = useRef(); var scrollTop = useRef(0); useEffect(function () { var _a; var prevMeasures = measures.current; var prevMessages = messages.current; var newMessages = params.messages; var lastNewMessage = (_a = newMessages[newMessages.length - 1]) !== null && _a !== void 0 ? _a : {}; var lastPrevMessage = prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages[prevMessages.length - 1]; var newMeasures = scrollContainerMeasures(); var wasAtBottom = prevMeasures.scrollHeight - prevMeasures.offsetHeight - scrollTop.current < scrolledUpThreshold; if (typeof prevMessages !== 'undefined') { if (prevMessages.length < newMessages.length) { // messages added to the top if ((lastPrevMessage === null || lastPrevMessage === void 0 ? void 0 : lastPrevMessage.id) === lastNewMessage.id) { var listHeightDelta = newMeasures.scrollHeight - prevMeasures.scrollHeight; if (scrollTop.current === 0) { onScrollBy(listHeightDelta); } } // messages added to the bottom else { var lastMessageIsFromCurrentUser = lastNewMessage.from === activeProfile.id; if (lastMessageIsFromCurrentUser || wasAtBottom) { scrollToBottom(); } else { showNewMessages(); } } } } messages.current = newMessages; measures.current = newMeasures; }, [measures, messages, params.messages]); return function (scrollTopValue) { scrollTop.current = scrollTopValue; }; } export { useMessageListScrollManager }; //# sourceMappingURL=useMessageListScrollManager.js.map