Changeset View
Changeset View
Standalone View
Standalone View
native/chat/message-list-container.react.js
// @flow | // @flow | ||||
import { useNavigationState } from '@react-navigation/native'; | |||||
import invariant from 'invariant'; | import invariant from 'invariant'; | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import { View } from 'react-native'; | import { View } from 'react-native'; | ||||
import genesis from 'lib/facts/genesis'; | import genesis from 'lib/facts/genesis'; | ||||
import { | import { | ||||
type ChatMessageItem, | type ChatMessageItem, | ||||
useMessageListData, | useMessageListData, | ||||
Show All 13 Lines | |||||
import ContentLoading from '../components/content-loading.react'; | import ContentLoading from '../components/content-loading.react'; | ||||
import { InputStateContext } from '../input/input-state'; | import { InputStateContext } from '../input/input-state'; | ||||
import { | import { | ||||
OverlayContext, | OverlayContext, | ||||
type OverlayContextType, | type OverlayContextType, | ||||
} from '../navigation/overlay-context'; | } from '../navigation/overlay-context'; | ||||
import type { NavigationRoute } from '../navigation/route-names'; | import type { NavigationRoute } from '../navigation/route-names'; | ||||
import { ThreadSettingsRouteName } from '../navigation/route-names'; | |||||
import { useSelector } from '../redux/redux-utils'; | import { useSelector } from '../redux/redux-utils'; | ||||
import { type Colors, useColors, useStyles } from '../themes/colors'; | import { type Colors, useColors, useStyles } from '../themes/colors'; | ||||
import type { ChatMessageItemWithHeight } from '../types/chat-types'; | import type { ChatMessageItemWithHeight } from '../types/chat-types'; | ||||
import { type MessagesMeasurer, useHeightMeasurer } from './chat-context'; | import { type MessagesMeasurer, useHeightMeasurer } from './chat-context'; | ||||
import { ChatInputBar } from './chat-input-bar.react'; | import { ChatInputBar } from './chat-input-bar.react'; | ||||
import type { ChatNavigationProp } from './chat.react'; | import type { ChatNavigationProp } from './chat.react'; | ||||
import MessageListThreadSearch from './message-list-thread-search.react'; | import MessageListThreadSearch from './message-list-thread-search.react'; | ||||
import { MessageListContextProvider } from './message-list-types'; | import { MessageListContextProvider } from './message-list-types'; | ||||
▲ Show 20 Lines • Show All 217 Lines • ▼ Show 20 Lines | const threadInfo = React.useMemo( | ||||
}), | }), | ||||
[existingThreadInfoFinder, isSearching, userInfoInputArray], | [existingThreadInfoFinder, isSearching, userInfoInputArray], | ||||
); | ); | ||||
invariant( | invariant( | ||||
threadInfo, | threadInfo, | ||||
'threadInfo must be specified in messageListContainer', | 'threadInfo must be specified in messageListContainer', | ||||
); | ); | ||||
const { setParams } = props.navigation; | |||||
const navigationStack = useNavigationState(state => state.routes); | |||||
React.useEffect(() => { | |||||
const topRoute = navigationStack[navigationStack.length - 1]; | |||||
if (topRoute?.name !== ThreadSettingsRouteName) { | |||||
return; | |||||
} | |||||
setBaseThreadInfo(threadInfo); | |||||
if (isSearching) { | |||||
setParams({ searching: false }); | |||||
} | |||||
}, [isSearching, navigationStack, setParams, threadInfo]); | |||||
const inputState = React.useContext(InputStateContext); | const inputState = React.useContext(InputStateContext); | ||||
invariant(inputState, 'inputState should be set in MessageListContainer'); | invariant(inputState, 'inputState should be set in MessageListContainer'); | ||||
const hideSearch = React.useCallback(() => { | const hideSearch = React.useCallback(() => { | ||||
setBaseThreadInfo(threadInfo); | setBaseThreadInfo(threadInfo); | ||||
props.navigation.setParams({ | setParams({ searching: false }); | ||||
searching: false, | }, [setParams, threadInfo]); | ||||
}); | |||||
}, [props.navigation, threadInfo]); | |||||
React.useEffect(() => { | React.useEffect(() => { | ||||
if (!isSearching) { | if (!isSearching) { | ||||
return; | return; | ||||
} | } | ||||
inputState.registerSendCallback(hideSearch); | inputState.registerSendCallback(hideSearch); | ||||
return () => inputState.unregisterSendCallback(hideSearch); | return () => inputState.unregisterSendCallback(hideSearch); | ||||
}, [hideSearch, inputState, isSearching]); | }, [hideSearch, inputState, isSearching]); | ||||
const { setParams } = props.navigation; | |||||
React.useEffect(() => { | React.useEffect(() => { | ||||
setParams({ threadInfo }); | setParams({ threadInfo }); | ||||
}, [setParams, threadInfo]); | }, [setParams, threadInfo]); | ||||
const updateTagInput = React.useCallback( | const updateTagInput = React.useCallback( | ||||
(input: $ReadOnlyArray<AccountUserInfo>) => setUserInfoInputArray(input), | (input: $ReadOnlyArray<AccountUserInfo>) => setUserInfoInputArray(input), | ||||
[], | [], | ||||
); | ); | ||||
▲ Show 20 Lines • Show All 66 Lines • Show Last 20 Lines |