import type { ComputedRef, Ref } from 'vue';
|
import { nextTick, onActivated, onMounted, onUnmounted, ref, watch } from 'vue';
|
import type { ChatMessage } from '../model/types';
|
import emitter from '/@/utils/mitt';
|
import { debounce } from '/@/utils/util';
|
|
export type UseScrollToBottomOption = {
|
chatListDom: Ref<HTMLDivElement>;
|
};
|
|
export const useScrollToBottom = (option: UseScrollToBottomOption) => {
|
const { chatListDom } = option;
|
|
const scrollToBottom = () => {
|
nextTick(() => {
|
if (chatListDom.value.scrollHeight > chatListDom.value.clientHeight) {
|
chatListDom.value.scrollTop = chatListDom.value.scrollHeight - chatListDom.value.clientHeight;
|
}
|
});
|
};
|
|
const scrollToTop = () => {
|
nextTick(() => {
|
chatListDom.value.scrollTop = 0;
|
});
|
};
|
const debounceAmisScroll = debounce(({ instance }) => {
|
scrollToBottom();
|
}, 500);
|
|
const checkIsBottom = () => {
|
// 误差 2像素
|
isBottom.value = Math.abs(chatListDom.value.scrollTop + chatListDom.value.clientHeight - chatListDom.value.scrollHeight) < 2;
|
};
|
const isBottom = ref(false);
|
onMounted(() => {
|
chatListDom.value.addEventListener('scrollend', checkIsBottom);
|
});
|
|
onUnmounted(() => {
|
chatListDom.value.removeEventListener('scrollend', checkIsBottom);
|
});
|
|
// emitter.on('amis.page.ready', debounceAmisScroll);
|
|
// onUnmounted(() => {
|
// emitter.off('amis.page.ready');
|
// });
|
|
onActivated(() => {
|
scrollToBottom();
|
});
|
|
return {
|
scrollToBottom,
|
scrollToTop,
|
isBottom,
|
};
|
};
|