Page MenuHomePhabricator

D14013.id45954.diff
No OneTemporary

D14013.id45954.diff

diff --git a/native/chat/chat-input-bar.react.js b/native/chat/chat-input-bar.react.js
--- a/native/chat/chat-input-bar.react.js
+++ b/native/chat/chat-input-bar.react.js
@@ -315,7 +315,6 @@
+setText: (text: string) => void,
+textEdited: boolean,
+buttonsExpanded: boolean,
- +isExitingDuringEditModeRef: { current: boolean },
+expandoButtonsStyle: AnimatedViewStyle,
+cameraRollIconStyle: AnimatedViewStyle,
+cameraIconStyle: AnimatedViewStyle,
@@ -343,16 +342,11 @@
+onPressExitEditMode: () => void,
+updateText: (newText: string) => void,
+onSend: () => Promise<void>,
- +removeEditMode: RemoveEditMode,
- +exitEditMode: () => void,
+isMessageEdited: (newText?: string) => boolean,
+ +blockNavigation: () => void,
};
class ChatInputBar extends React.PureComponent<Props> {
- clearBeforeRemoveListener: () => void;
- clearFocusListener: () => void;
- clearBlurListener: () => void;
-
static mediaGalleryOpen(props: Props): boolean {
const { keyboardState } = props;
return !!(keyboardState && keyboardState.mediaGalleryOpen);
@@ -368,40 +362,16 @@
}
componentDidMount() {
- const { isActive, navigation } = this.props;
+ const { isActive } = this.props;
if (isActive) {
this.props.addEditInputMessageListener();
}
- if (!navigation) {
- return;
- }
- this.clearBeforeRemoveListener = navigation.addListener(
- 'beforeRemove',
- this.onNavigationBeforeRemove,
- );
- this.clearFocusListener = navigation.addListener(
- 'focus',
- this.onNavigationFocus,
- );
- this.clearBlurListener = navigation.addListener(
- 'blur',
- this.onNavigationBlur,
- );
}
componentWillUnmount() {
if (this.props.isActive) {
this.props.removeEditInputMessageListener();
}
- if (this.clearBeforeRemoveListener) {
- this.clearBeforeRemoveListener();
- }
- if (this.clearFocusListener) {
- this.clearFocusListener();
- }
- if (this.clearBlurListener) {
- this.clearBlurListener();
- }
}
componentDidUpdate(prevProps: Props) {
@@ -460,7 +430,7 @@
this.props.messageEditingContext?.editState.editedMessage &&
!prevProps.messageEditingContext?.editState.editedMessage
) {
- this.blockNavigation();
+ this.props.blockNavigation();
}
}
@@ -723,54 +693,6 @@
);
}
- blockNavigation = () => {
- const { navigation } = this.props;
- if (!navigation || !navigation.isFocused()) {
- return;
- }
- navigation.setParams({
- removeEditMode: this.props.removeEditMode,
- });
- };
-
- onNavigationFocus = () => {
- this.props.isExitingDuringEditModeRef.current = false;
- };
-
- onNavigationBlur = () => {
- if (!this.props.isEditMode()) {
- return;
- }
- this.props.setText(this.props.draft);
- this.props.isExitingDuringEditModeRef.current = true;
- this.props.exitEditMode();
- };
-
- onNavigationBeforeRemove = (e: {
- +data: { +action: GenericNavigationAction },
- +preventDefault: () => void,
- ...
- }) => {
- if (!this.props.isEditMode()) {
- return;
- }
- const { action } = e.data;
- e.preventDefault();
- const saveExit = () => {
- this.props.messageEditingContext?.setEditedMessage(null, () => {
- this.props.isExitingDuringEditModeRef.current = true;
- this.props.navigation?.dispatch(action);
- });
- };
- if (!this.props.isMessageEdited()) {
- saveExit();
- return;
- }
- exitEditAlert({
- onDiscard: saveExit,
- });
- };
-
onPressJoin = () => {
void this.props.dispatchActionPromise(
joinThreadActionTypes,
@@ -1241,6 +1163,42 @@
navigation.setParams({ removeEditMode: null });
}, [props]);
+ const removeEditMode: RemoveEditMode = React.useCallback(
+ action => {
+ const { navigation } = props;
+ if (!navigation || isExitingDuringEditModeRef.current) {
+ return 'ignore_action';
+ }
+ if (!isMessageEdited()) {
+ unblockNavigation();
+ return 'reduce_action';
+ }
+ const unblockAndDispatch = () => {
+ unblockNavigation();
+ navigation.dispatch(action);
+ };
+ const onContinueEditing = () => {
+ overlayContext?.resetScrollBlockingModalStatus();
+ };
+ exitEditAlert({
+ onDiscard: unblockAndDispatch,
+ onContinueEditing,
+ });
+ return 'ignore_action';
+ },
+ [isMessageEdited, overlayContext, props, unblockNavigation],
+ );
+
+ const blockNavigation = React.useCallback(() => {
+ const { navigation } = props;
+ if (!navigation || !navigation.isFocused()) {
+ return;
+ }
+ navigation.setParams({
+ removeEditMode: removeEditMode,
+ });
+ }, [props, removeEditMode]);
+
const exitEditMode = React.useCallback(() => {
messageEditingContext?.setEditedMessage(null, () => {
unblockNavigation();
@@ -1386,32 +1344,6 @@
viewerID,
]);
- const removeEditMode: RemoveEditMode = React.useCallback(
- action => {
- const { navigation } = props;
- if (!navigation || isExitingDuringEditModeRef.current) {
- return 'ignore_action';
- }
- if (!isMessageEdited()) {
- unblockNavigation();
- return 'reduce_action';
- }
- const unblockAndDispatch = () => {
- unblockNavigation();
- navigation.dispatch(action);
- };
- const onContinueEditing = () => {
- overlayContext?.resetScrollBlockingModalStatus();
- };
- exitEditAlert({
- onDiscard: unblockAndDispatch,
- onContinueEditing,
- });
- return 'ignore_action';
- },
- [isMessageEdited, overlayContext, props, unblockNavigation],
- );
-
const onPressExitEditMode = React.useCallback(() => {
if (!isMessageEdited()) {
exitEditMode();
@@ -1431,6 +1363,69 @@
inputState?.scrollToMessage(editedMessageKey);
}, [getEditedMessage, inputState]);
+ const onNavigationFocus = React.useCallback(() => {
+ isExitingDuringEditModeRef.current = false;
+ }, []);
+
+ const onNavigationBlur = React.useCallback(() => {
+ if (!isEditMode()) {
+ return;
+ }
+ setText(draft);
+ isExitingDuringEditModeRef.current = true;
+ exitEditMode();
+ }, [draft, exitEditMode, isEditMode]);
+
+ const onNavigationBeforeRemove = React.useCallback(
+ (e: {
+ +data: { +action: GenericNavigationAction },
+ +preventDefault: () => void,
+ ...
+ }) => {
+ if (!isEditMode()) {
+ return;
+ }
+ const { action } = e.data;
+ e.preventDefault();
+ const saveExit = () => {
+ messageEditingContext?.setEditedMessage(null, () => {
+ isExitingDuringEditModeRef.current = true;
+ props.navigation?.dispatch(action);
+ });
+ };
+ if (!isMessageEdited()) {
+ saveExit();
+ return;
+ }
+ exitEditAlert({
+ onDiscard: saveExit,
+ });
+ },
+ [isEditMode, isMessageEdited, messageEditingContext, props.navigation],
+ );
+
+ React.useEffect(() => {
+ const { navigation } = props;
+ if (!navigation) {
+ return undefined;
+ }
+
+ const clearBeforeRemoveListener = navigation.addListener(
+ 'beforeRemove',
+ onNavigationBeforeRemove,
+ );
+ const clearFocusListener = navigation.addListener(
+ 'focus',
+ onNavigationFocus,
+ );
+ const clearBlurListener = navigation.addListener('blur', onNavigationBlur);
+ return () => {
+ clearBeforeRemoveListener();
+ clearFocusListener();
+ clearBlurListener();
+ };
+ }, [onNavigationBeforeRemove, onNavigationBlur, onNavigationFocus, props]);
+
return (
<ChatInputBar
{...props}
@@ -1463,7 +1458,6 @@
setText={setText}
textEdited={textEdited}
buttonsExpanded={buttonsExpanded}
- isExitingDuringEditModeRef={isExitingDuringEditModeRef}
cameraRollIconStyle={cameraRollIconStyle}
cameraIconStyle={cameraIconStyle}
expandoButtonsStyle={expandoButtonsStyle}
@@ -1486,9 +1480,8 @@
onPressExitEditMode={onPressExitEditMode}
updateText={updateText}
onSend={onSend}
- removeEditMode={removeEditMode}
- exitEditMode={exitEditMode}
isMessageEdited={isMessageEdited}
+ blockNavigation={blockNavigation}
/>
);
}

File Metadata

Mime Type
text/plain
Expires
Sat, Nov 30, 4:42 PM (13 h, 49 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2600400
Default Alt Text
D14013.id45954.diff (8 KB)

Event Timeline