Changeset View
Changeset View
Standalone View
Standalone View
native/chat/chat-context-provider.react.js
// @flow | // @flow | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import type { ChatMessageItem } from 'lib/selectors/chat-selectors.js'; | |||||
import type { ThreadInfo } from 'lib/types/thread-types.js'; | import type { ThreadInfo } from 'lib/types/thread-types.js'; | ||||
import { ChatContext } from './chat-context.js'; | import { ChatContext } from './chat-context.js'; | ||||
import type { SidebarAnimationType } from './chat-context.js'; | import type { SidebarAnimationType } from './chat-context.js'; | ||||
import ChatItemHeightMeasurer from './chat-item-height-measurer.react.js'; | import ChatItemHeightMeasurer from './chat-item-height-measurer.react.js'; | ||||
import type { NativeChatMessageItem } from './message-data.react.js'; | |||||
import type { ChatMessageItemWithHeight } from '../types/chat-types.js'; | import type { ChatMessageItemWithHeight } from '../types/chat-types.js'; | ||||
type Props = { | type Props = { | ||||
+children: React.Node, | +children: React.Node, | ||||
}; | }; | ||||
export type MeasurementTask = { | export type MeasurementTask = { | ||||
+messages: $ReadOnlyArray<ChatMessageItem>, | +messages: $ReadOnlyArray<NativeChatMessageItem>, | ||||
+threadInfo: ThreadInfo, | +threadInfo: ThreadInfo, | ||||
+onMessagesMeasured: ( | +onMessagesMeasured: ( | ||||
messagesWithHeight: $ReadOnlyArray<ChatMessageItemWithHeight>, | messagesWithHeight: $ReadOnlyArray<ChatMessageItemWithHeight>, | ||||
measuredHeights: $ReadOnlyMap<string, number>, | measuredHeights: $ReadOnlyMap<string, number>, | ||||
) => mixed, | ) => mixed, | ||||
+measurerID: number, | +measurerID: number, | ||||
+initialMeasuredHeights: ?$ReadOnlyMap<string, number>, | +initialMeasuredHeights: ?$ReadOnlyMap<string, number>, | ||||
}; | }; | ||||
function ChatContextProvider(props: Props): React.Node { | function ChatContextProvider(props: Props): React.Node { | ||||
const [measurements, setMeasurements] = React.useState< | const [measurements, setMeasurements] = React.useState< | ||||
$ReadOnlyArray<MeasurementTask>, | $ReadOnlyArray<MeasurementTask>, | ||||
>([]); | >([]); | ||||
const nextMeasurerID = React.useRef(0); | const nextMeasurerID = React.useRef(0); | ||||
const measuredHeights = React.useRef< | const measuredHeights = React.useRef< | ||||
Map<number, $ReadOnlyMap<string, number>>, | Map<number, $ReadOnlyMap<string, number>>, | ||||
>(new Map()); | >(new Map()); | ||||
const measureMessages = React.useCallback( | const measureMessages = React.useCallback( | ||||
( | ( | ||||
messages: ?$ReadOnlyArray<ChatMessageItem>, | messages: ?$ReadOnlyArray<NativeChatMessageItem>, | ||||
threadInfo: ?ThreadInfo, | threadInfo: ?ThreadInfo, | ||||
onMessagesMeasured: ($ReadOnlyArray<ChatMessageItemWithHeight>) => mixed, | onMessagesMeasured: ($ReadOnlyArray<ChatMessageItemWithHeight>) => mixed, | ||||
measurerID: number, | measurerID: number, | ||||
) => { | ) => { | ||||
if (!threadInfo) { | if (!threadInfo) { | ||||
// When threadInfo is not present, we can't measure the messages: we can | // When threadInfo is not present, we can't measure the messages: we can | ||||
// determine the height, but we can't merge the result as it requires | // determine the height, but we can't merge the result as it requires | ||||
// threadInfo to be present. | // threadInfo to be present. | ||||
Show All 39 Lines | const measureMessages = React.useCallback( | ||||
}, | }, | ||||
[measurements], | [measurements], | ||||
); | ); | ||||
const registerMeasurer = React.useCallback(() => { | const registerMeasurer = React.useCallback(() => { | ||||
const measurerID = nextMeasurerID.current++; | const measurerID = nextMeasurerID.current++; | ||||
return { | return { | ||||
measure: ( | measure: ( | ||||
messages: ?$ReadOnlyArray<ChatMessageItem>, | messages: ?$ReadOnlyArray<NativeChatMessageItem>, | ||||
threadInfo: ?ThreadInfo, | threadInfo: ?ThreadInfo, | ||||
onMessagesMeasured: ( | onMessagesMeasured: ( | ||||
$ReadOnlyArray<ChatMessageItemWithHeight>, | $ReadOnlyArray<ChatMessageItemWithHeight>, | ||||
) => mixed, | ) => mixed, | ||||
) => | ) => | ||||
measureMessages(messages, threadInfo, onMessagesMeasured, measurerID), | measureMessages(messages, threadInfo, onMessagesMeasured, measurerID), | ||||
unregister: () => { | unregister: () => { | ||||
setMeasurements(prevMeasurements => | setMeasurements(prevMeasurements => | ||||
▲ Show 20 Lines • Show All 67 Lines • Show Last 20 Lines |