diff --git a/native/chat/multimedia-tooltip-modal.react.js b/native/chat/multimedia-tooltip-modal.react.js index 85a15b0ec..26e7781c3 100644 --- a/native/chat/multimedia-tooltip-modal.react.js +++ b/native/chat/multimedia-tooltip-modal.react.js @@ -1,94 +1,53 @@ // @flow -import invariant from 'invariant'; - -import { createPendingSidebar } from 'lib/shared/thread-utils'; import type { MediaInfo } from 'lib/types/media-types'; -import type { - DispatchFunctions, - ActionFunc, - BoundServerCall, -} from 'lib/utils/action-utils'; -import type { InputState } from '../input/input-state'; import { intentionalSaveMedia } from '../media/save-media'; -import type { AppNavigationProp } from '../navigation/app-navigator.react'; -import { MessageListRouteName } from '../navigation/route-names'; import { createTooltip, tooltipHeight, type TooltipParams, type TooltipRoute, } from '../navigation/tooltip.react'; import type { ChatMultimediaMessageInfoItem } from './multimedia-message.react'; import MultimediaTooltipButton from './multimedia-tooltip-button.react'; -import { onPressGoToSidebar } from './sidebar-navigation'; +import { onPressGoToSidebar, onPressCreateSidebar } from './sidebar-navigation'; export type MultimediaTooltipModalParams = TooltipParams<{| +item: ChatMultimediaMessageInfoItem, +mediaInfo: MediaInfo, +verticalOffset: number, |}>; function onPressSave(route: TooltipRoute<'MultimediaTooltipModal'>) { const { mediaInfo, item } = route.params; const { id: uploadID, uri } = mediaInfo; const { id: messageServerID, localID: messageLocalID } = item.messageInfo; const ids = { uploadID, messageServerID, messageLocalID }; return intentionalSaveMedia(uri, ids); } -function onPressCreateSidebar( - route: TooltipRoute<'MultimediaTooltipModal'>, - dispatchFunctions: DispatchFunctions, - bindServerCall: (serverCall: ActionFunc) => BoundServerCall, - inputState: ?InputState, - navigation: AppNavigationProp<'MultimediaTooltipModal'>, - viewerID: ?string, -) { - invariant( - viewerID, - 'viewerID should be set in MultimediaTooltipModal.onPressCreateSidebar', - ); - const { messageInfo, threadInfo } = route.params.item; - const pendingSidebarInfo = createPendingSidebar( - messageInfo, - threadInfo, - viewerID, - ); - const initialMessageID = messageInfo.id; - - navigation.navigate({ - name: MessageListRouteName, - params: { - threadInfo: pendingSidebarInfo, - sidebarSourceMessageID: initialMessageID, - }, - key: `${MessageListRouteName}${pendingSidebarInfo.id}`, - }); -} - const spec = { entries: [ { id: 'save', text: 'Save', onPress: onPressSave }, { id: 'create_sidebar', text: 'Create sidebar', onPress: onPressCreateSidebar, }, { id: 'open_sidebar', text: 'Go to sidebar', onPress: onPressGoToSidebar, }, ], }; const MultimediaTooltipModal = createTooltip<'MultimediaTooltipModal'>( MultimediaTooltipButton, spec, ); const multimediaTooltipHeight = tooltipHeight(spec.entries.length); export { MultimediaTooltipModal, multimediaTooltipHeight }; diff --git a/native/chat/robotext-message-tooltip-modal.react.js b/native/chat/robotext-message-tooltip-modal.react.js index 9bea86dff..6fc3f2ec0 100644 --- a/native/chat/robotext-message-tooltip-modal.react.js +++ b/native/chat/robotext-message-tooltip-modal.react.js @@ -1,81 +1,38 @@ // @flow -import invariant from 'invariant'; - -import { createPendingSidebar } from 'lib/shared/thread-utils'; -import type { - DispatchFunctions, - ActionFunc, - BoundServerCall, -} from 'lib/utils/action-utils'; - -import type { InputState } from '../input/input-state'; -import type { AppNavigationProp } from '../navigation/app-navigator.react'; -import { MessageListRouteName } from '../navigation/route-names'; import { createTooltip, tooltipHeight, type TooltipParams, - type TooltipRoute, } from '../navigation/tooltip.react'; import RobotextMessageTooltipButton from './robotext-message-tooltip-button.react'; import type { ChatRobotextMessageInfoItemWithHeight } from './robotext-message.react'; -import { onPressGoToSidebar } from './sidebar-navigation'; +import { onPressGoToSidebar, onPressCreateSidebar } from './sidebar-navigation'; export type RobotextMessageTooltipModalParams = TooltipParams<{| +item: ChatRobotextMessageInfoItemWithHeight, +robotext: string, |}>; -function onPressCreateSidebar( - route: TooltipRoute<'RobotextMessageTooltipModal'>, - dispatchFunctions: DispatchFunctions, - bindServerCall: (serverCall: ActionFunc) => BoundServerCall, - inputState: ?InputState, - navigation: AppNavigationProp<'RobotextMessageTooltipModal'>, - viewerID: ?string, -) { - invariant( - viewerID, - 'viewerID should be set in RobotextMessageTooltipModal.onPressCreateSidebar', - ); - const { messageInfo, threadInfo } = route.params.item; - const pendingSidebarInfo = createPendingSidebar( - messageInfo, - threadInfo, - viewerID, - ); - const initialMessageID = messageInfo.id; - - navigation.navigate({ - name: MessageListRouteName, - params: { - threadInfo: pendingSidebarInfo, - sidebarSourceMessageID: initialMessageID, - }, - key: `${MessageListRouteName}${pendingSidebarInfo.id}`, - }); -} - const spec = { entries: [ { id: 'create_sidebar', text: 'Create sidebar', onPress: onPressCreateSidebar, }, { id: 'open_sidebar', text: 'Go to sidebar', onPress: onPressGoToSidebar, }, ], }; const RobotextMessageTooltipModal = createTooltip< 'RobotextMessageTooltipModal', >(RobotextMessageTooltipButton, spec); const robotextMessageTooltipHeight = tooltipHeight(spec.entries.length); export { RobotextMessageTooltipModal, robotextMessageTooltipHeight }; diff --git a/native/chat/sidebar-navigation.js b/native/chat/sidebar-navigation.js index 85b527fd7..7e3216508 100644 --- a/native/chat/sidebar-navigation.js +++ b/native/chat/sidebar-navigation.js @@ -1,51 +1,96 @@ // @flow import invariant from 'invariant'; +import { createPendingSidebar } from 'lib/shared/thread-utils'; import type { DispatchFunctions, ActionFunc, BoundServerCall, } from 'lib/utils/action-utils'; import type { InputState } from '../input/input-state'; import type { AppNavigationProp } from '../navigation/app-navigator.react'; import { MessageListRouteName } from '../navigation/route-names'; import type { TooltipRoute } from '../navigation/tooltip.react'; function onPressGoToSidebar( route: | TooltipRoute<'RobotextMessageTooltipModal'> | TooltipRoute<'TextMessageTooltipModal'> | TooltipRoute<'MultimediaTooltipModal'>, dispatchFunctions: DispatchFunctions, bindServerCall: (serverCall: ActionFunc) => BoundServerCall, inputState: ?InputState, navigation: | AppNavigationProp<'RobotextMessageTooltipModal'> | AppNavigationProp<'TextMessageTooltipModal'> | AppNavigationProp<'MultimediaTooltipModal'>, ) { let threadCreatedFromMessage; // Necessary for Flow... if (route.name === 'RobotextMessageTooltipModal') { threadCreatedFromMessage = route.params.item.threadCreatedFromMessage; } else { threadCreatedFromMessage = route.params.item.threadCreatedFromMessage; } invariant( threadCreatedFromMessage, 'threadCreatedFromMessage should be set in onPressGoToSidebar', ); navigation.navigate({ name: MessageListRouteName, params: { threadInfo: threadCreatedFromMessage, }, key: `${MessageListRouteName}${threadCreatedFromMessage.id}`, }); } -export { onPressGoToSidebar }; +function onPressCreateSidebar( + route: + | TooltipRoute<'RobotextMessageTooltipModal'> + | TooltipRoute<'TextMessageTooltipModal'> + | TooltipRoute<'MultimediaTooltipModal'>, + dispatchFunctions: DispatchFunctions, + bindServerCall: (serverCall: ActionFunc) => BoundServerCall, + inputState: ?InputState, + navigation: + | AppNavigationProp<'RobotextMessageTooltipModal'> + | AppNavigationProp<'TextMessageTooltipModal'> + | AppNavigationProp<'MultimediaTooltipModal'>, + viewerID: ?string, +) { + invariant( + viewerID, + 'viewerID should be set in TextMessageTooltipModal.onPressCreateSidebar', + ); + let itemFromParams; + // Necessary for Flow... + if (route.name === 'RobotextMessageTooltipModal') { + itemFromParams = route.params.item; + } else { + itemFromParams = route.params.item; + } + + const { messageInfo, threadInfo } = itemFromParams; + const pendingSidebarInfo = createPendingSidebar( + messageInfo, + threadInfo, + viewerID, + ); + const sourceMessageID = messageInfo.id; + + navigation.navigate({ + name: MessageListRouteName, + params: { + threadInfo: pendingSidebarInfo, + sidebarSourceMessageID: sourceMessageID, + }, + key: `${MessageListRouteName}${pendingSidebarInfo.id}`, + }); +} + +export { onPressGoToSidebar, onPressCreateSidebar }; diff --git a/native/chat/text-message-tooltip-modal.react.js b/native/chat/text-message-tooltip-modal.react.js index 43632e4d9..6656eca64 100644 --- a/native/chat/text-message-tooltip-modal.react.js +++ b/native/chat/text-message-tooltip-modal.react.js @@ -1,106 +1,73 @@ // @flow import Clipboard from '@react-native-community/clipboard'; import invariant from 'invariant'; import { createMessageReply } from 'lib/shared/message-utils'; -import { createPendingSidebar } from 'lib/shared/thread-utils'; import type { DispatchFunctions, ActionFunc, BoundServerCall, } from 'lib/utils/action-utils'; import type { InputState } from '../input/input-state'; import { displayActionResultModal } from '../navigation/action-result-modal'; -import type { AppNavigationProp } from '../navigation/app-navigator.react'; -import { MessageListRouteName } from '../navigation/route-names'; import { createTooltip, tooltipHeight, type TooltipParams, type TooltipRoute, } from '../navigation/tooltip.react'; -import { onPressGoToSidebar } from './sidebar-navigation'; +import { onPressGoToSidebar, onPressCreateSidebar } from './sidebar-navigation'; import TextMessageTooltipButton from './text-message-tooltip-button.react'; import type { ChatTextMessageInfoItemWithHeight } from './text-message.react'; export type TextMessageTooltipModalParams = TooltipParams<{| +item: ChatTextMessageInfoItemWithHeight, |}>; const confirmCopy = () => displayActionResultModal('copied!'); function onPressCopy(route: TooltipRoute<'TextMessageTooltipModal'>) { Clipboard.setString(route.params.item.messageInfo.text); setTimeout(confirmCopy); } function onPressReply( route: TooltipRoute<'TextMessageTooltipModal'>, dispatchFunctions: DispatchFunctions, bindServerCall: (serverCall: ActionFunc) => BoundServerCall, inputState: ?InputState, ) { invariant( inputState, 'inputState should be set in TextMessageTooltipModal.onPressReply', ); inputState.addReply(createMessageReply(route.params.item.messageInfo.text)); } -function onPressCreateSidebar( - route: TooltipRoute<'TextMessageTooltipModal'>, - dispatchFunctions: DispatchFunctions, - bindServerCall: (serverCall: ActionFunc) => BoundServerCall, - inputState: ?InputState, - navigation: AppNavigationProp<'TextMessageTooltipModal'>, - viewerID: ?string, -) { - invariant( - viewerID, - 'viewerID should be set in TextMessageTooltipModal.onPressCreateSidebar', - ); - const { messageInfo, threadInfo } = route.params.item; - const pendingSidebarInfo = createPendingSidebar( - messageInfo, - threadInfo, - viewerID, - ); - const sourceMessageID = messageInfo.id; - - navigation.navigate({ - name: MessageListRouteName, - params: { - threadInfo: pendingSidebarInfo, - sidebarSourceMessageID: sourceMessageID, - }, - key: `${MessageListRouteName}${pendingSidebarInfo.id}`, - }); -} - const spec = { entries: [ { id: 'copy', text: 'Copy', onPress: onPressCopy }, { id: 'reply', text: 'Reply', onPress: onPressReply }, { id: 'create_sidebar', text: 'Create sidebar', onPress: onPressCreateSidebar, }, { id: 'open_sidebar', text: 'Go to sidebar', onPress: onPressGoToSidebar, }, ], }; const TextMessageTooltipModal = createTooltip<'TextMessageTooltipModal'>( TextMessageTooltipButton, spec, ); const textMessageTooltipHeight = tooltipHeight(spec.entries.length); export { TextMessageTooltipModal, textMessageTooltipHeight };