Changeset View
Changeset View
Standalone View
Standalone View
native/chat/chat-item-height-measurer.react.js
// @flow | // @flow | ||||
import invariant from 'invariant'; | import invariant from 'invariant'; | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import type { ChatMessageItem } from 'lib/selectors/chat-selectors.js'; | |||||
import { messageID } from 'lib/shared/message-utils.js'; | import { messageID } from 'lib/shared/message-utils.js'; | ||||
import { messageTypes, type MessageType } from 'lib/types/message-types.js'; | import { messageTypes, type MessageType } from 'lib/types/message-types.js'; | ||||
import { entityTextToRawString } from 'lib/utils/entity-text.js'; | import { entityTextToRawString } from 'lib/utils/entity-text.js'; | ||||
import type { MeasurementTask } from './chat-context-provider.react.js'; | import type { MeasurementTask } from './chat-context-provider.react.js'; | ||||
import { useComposedMessageMaxWidth } from './composed-message-width.js'; | import { useComposedMessageMaxWidth } from './composed-message-width.js'; | ||||
import { dummyNodeForRobotextMessageHeightMeasurement } from './inner-robotext-message.react.js'; | import { dummyNodeForRobotextMessageHeightMeasurement } from './inner-robotext-message.react.js'; | ||||
import { dummyNodeForTextMessageHeightMeasurement } from './inner-text-message.react.js'; | import { dummyNodeForTextMessageHeightMeasurement } from './inner-text-message.react.js'; | ||||
import type { NativeChatMessageItem } from './message-data.react.js'; | |||||
import { MessageListContextProvider } from './message-list-types.js'; | import { MessageListContextProvider } from './message-list-types.js'; | ||||
import { multimediaMessageContentSizes } from './multimedia-message-utils.js'; | import { multimediaMessageContentSizes } from './multimedia-message-utils.js'; | ||||
import { chatMessageItemKey } from './utils.js'; | import { chatMessageItemKey } from './utils.js'; | ||||
import NodeHeightMeasurer from '../components/node-height-measurer.react.js'; | import NodeHeightMeasurer from '../components/node-height-measurer.react.js'; | ||||
import { InputStateContext } from '../input/input-state.js'; | import { InputStateContext } from '../input/input-state.js'; | ||||
type Props = { | type Props = { | ||||
+measurement: MeasurementTask, | +measurement: MeasurementTask, | ||||
}; | }; | ||||
const heightMeasurerKey = (item: ChatMessageItem) => { | const heightMeasurerKey = (item: NativeChatMessageItem) => { | ||||
if (item.itemType !== 'message') { | if (item.itemType !== 'message') { | ||||
return null; | return null; | ||||
} | } | ||||
const { messageInfo } = item; | const { messageInfo } = item; | ||||
if (messageInfo.type === messageTypes.TEXT) { | if (messageInfo.type === messageTypes.TEXT) { | ||||
return JSON.stringify({ text: messageInfo.text }); | return JSON.stringify({ text: messageInfo.text }); | ||||
} else if (item.robotext) { | } else if (item.robotext) { | ||||
const { threadID } = item.messageInfo; | const { threadID } = item.messageInfo; | ||||
return JSON.stringify({ | return JSON.stringify({ | ||||
robotext: entityTextToRawString(item.robotext, { threadID }), | robotext: entityTextToRawString(item.robotext, { threadID }), | ||||
}); | }); | ||||
} | } | ||||
return null; | return null; | ||||
}; | }; | ||||
const heightMeasurerDummy = (item: ChatMessageItem) => { | const heightMeasurerDummy = (item: NativeChatMessageItem) => { | ||||
invariant( | invariant( | ||||
item.itemType === 'message', | item.itemType === 'message', | ||||
'NodeHeightMeasurer asked for dummy for non-message item', | 'NodeHeightMeasurer asked for dummy for non-message item', | ||||
); | ); | ||||
const { messageInfo } = item; | const { messageInfo } = item; | ||||
if (messageInfo.type === messageTypes.TEXT) { | if (messageInfo.type === messageTypes.TEXT) { | ||||
return dummyNodeForTextMessageHeightMeasurement(messageInfo.text); | return dummyNodeForTextMessageHeightMeasurement(messageInfo.text); | ||||
} else if (item.robotext) { | } else if (item.robotext) { | ||||
return dummyNodeForRobotextMessageHeightMeasurement( | return dummyNodeForRobotextMessageHeightMeasurement( | ||||
item.robotext, | item.robotext, | ||||
item.messageInfo.threadID, | item.messageInfo.threadID, | ||||
); | ); | ||||
} | } | ||||
invariant(false, 'NodeHeightMeasurer asked for dummy for non-text message'); | invariant(false, 'NodeHeightMeasurer asked for dummy for non-text message'); | ||||
}; | }; | ||||
function ChatItemHeightMeasurer(props: Props) { | function ChatItemHeightMeasurer(props: Props) { | ||||
const composedMessageMaxWidth = useComposedMessageMaxWidth(); | const composedMessageMaxWidth = useComposedMessageMaxWidth(); | ||||
const inputState = React.useContext(InputStateContext); | const inputState = React.useContext(InputStateContext); | ||||
const inputStatePendingUploads = inputState?.pendingUploads; | const inputStatePendingUploads = inputState?.pendingUploads; | ||||
const { measurement } = props; | const { measurement } = props; | ||||
const { threadInfo } = measurement; | const { threadInfo } = measurement; | ||||
const heightMeasurerMergeItem = React.useCallback( | const heightMeasurerMergeItem = React.useCallback( | ||||
(item: ChatMessageItem, height: ?number) => { | (item: NativeChatMessageItem, height: ?number) => { | ||||
if (item.itemType !== 'message') { | if (item.itemType !== 'message') { | ||||
return item; | return item; | ||||
} | } | ||||
const { messageInfo } = item; | const { messageInfo } = item; | ||||
const messageType: MessageType = messageInfo.type; | const messageType: MessageType = messageInfo.type; | ||||
invariant( | invariant( | ||||
messageType !== messageTypes.SIDEBAR_SOURCE, | messageType !== messageTypes.SIDEBAR_SOURCE, | ||||
▲ Show 20 Lines • Show All 107 Lines • Show Last 20 Lines |