@uimkit/uikit-react
Version:
<img style="width:64px" src="https://mgmt.uimkit.chat/media/img/avatar.png"/>
62 lines (59 loc) • 2.85 kB
JavaScript
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