stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
56 lines (45 loc) • 1.71 kB
text/typescript
import { useMemo } from 'react';
import type { LocalMessage } from 'stream-chat';
import { usePaginatedMessageListContext } from '../../../contexts/paginatedMessageListContext/PaginatedMessageListContext';
import { useThreadContext } from '../../../contexts/threadContext/ThreadContext';
import { useRAFCoalescedValue } from '../../../hooks';
export type UseMessageListParams = {
threadList?: boolean;
isLiveStreaming?: boolean;
isFlashList?: boolean;
};
/**
* FIXME: To change it to a more specific type.
*/
export type GroupType = string;
export type MessageGroupStyles = {
[key: string]: string[];
};
export const useMessageList = (params: UseMessageListParams) => {
const { threadList, isLiveStreaming, isFlashList = false } = params;
const { messages, viewabilityChangedCallback } = usePaginatedMessageListContext();
const { threadMessages } = useThreadContext();
const messageList = threadList ? threadMessages : messages;
const processedMessageList = useMemo<LocalMessage[]>(() => {
const newMessageList: LocalMessage[] = [];
for (const message of messageList) {
if (isFlashList) {
newMessageList.push(message);
} else {
newMessageList.unshift(message);
}
}
return newMessageList;
}, [messageList, isFlashList]);
const data = useRAFCoalescedValue(processedMessageList, isLiveStreaming);
return useMemo(
() => ({
/** Messages enriched with dates/readby/groups and also reversed in order */
processedMessageList: data,
/** Raw messages from the channel state */
rawMessageList: messageList,
viewabilityChangedCallback,
}),
[data, messageList, viewabilityChangedCallback],
);
};