fix: add checks to draft auto save (#5639)
* fix: disable auto save draft on ShareView screen * fix: remove unnecessary logic for draft saving * fix: checks if any text has been changed before saving the draft on return * chore: fix React warn (dont call state on unmonted component) * chore: remove unnecessary console.log * unmount hack * wip
This commit is contained in:
parent
18ad40a82a
commit
e98ce32787
|
@ -1,24 +1,28 @@
|
||||||
|
import { useRoute } from '@react-navigation/native';
|
||||||
import { useCallback, useEffect, useRef } from 'react';
|
import { useCallback, useEffect, useRef } from 'react';
|
||||||
|
|
||||||
|
import { saveDraftMessage } from '../../../lib/methods/draftMessage';
|
||||||
import { useRoomContext } from '../../../views/RoomView/context';
|
import { useRoomContext } from '../../../views/RoomView/context';
|
||||||
import { useFocused } from '../context';
|
import { useFocused } from '../context';
|
||||||
import { saveDraftMessage } from '../../../lib/methods/draftMessage';
|
|
||||||
|
|
||||||
export const useAutoSaveDraft = (text = '') => {
|
export const useAutoSaveDraft = (text = '') => {
|
||||||
|
const route = useRoute();
|
||||||
const { rid, tmid, action, selectedMessages } = useRoomContext();
|
const { rid, tmid, action, selectedMessages } = useRoomContext();
|
||||||
const focused = useFocused();
|
const focused = useFocused();
|
||||||
const oldText = useRef('');
|
const oldText = useRef('');
|
||||||
const intervalRef = useRef();
|
const intervalRef = useRef();
|
||||||
|
|
||||||
const saveMessageDraft = useCallback(() => {
|
const mounted = useRef(true);
|
||||||
if (action === 'edit') return;
|
|
||||||
|
|
||||||
|
const saveMessageDraft = useCallback(() => {
|
||||||
|
if (route.name === 'ShareView') return;
|
||||||
|
if (action === 'edit') return;
|
||||||
const draftMessage = selectedMessages?.length ? JSON.stringify({ quotes: selectedMessages, msg: text }) : text;
|
const draftMessage = selectedMessages?.length ? JSON.stringify({ quotes: selectedMessages, msg: text }) : text;
|
||||||
if (oldText.current !== draftMessage) {
|
if (oldText.current !== draftMessage || (oldText.current === '' && draftMessage === '')) {
|
||||||
oldText.current = draftMessage;
|
oldText.current = draftMessage;
|
||||||
saveDraftMessage({ rid, tmid, draftMessage });
|
saveDraftMessage({ rid, tmid, draftMessage });
|
||||||
}
|
}
|
||||||
}, [action, rid, tmid, text, selectedMessages?.length]);
|
}, [action, rid, tmid, text, selectedMessages?.length, route.name]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (focused) {
|
if (focused) {
|
||||||
|
@ -29,7 +33,23 @@ export const useAutoSaveDraft = (text = '') => {
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
clearInterval(intervalRef.current);
|
clearInterval(intervalRef.current);
|
||||||
saveMessageDraft();
|
|
||||||
};
|
};
|
||||||
}, [focused, saveMessageDraft]);
|
}, [focused, saveMessageDraft]);
|
||||||
|
|
||||||
|
// hack to call saveMessageDraft when component is unmounted
|
||||||
|
useEffect(() => {
|
||||||
|
() => {};
|
||||||
|
return () => {
|
||||||
|
mounted.current = false;
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => () => {
|
||||||
|
if (!mounted.current) {
|
||||||
|
saveMessageDraft();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[saveMessageDraft]
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,4 +18,5 @@ export type TKeyEmitterEvent = keyof TEmitterEvents;
|
||||||
|
|
||||||
export const emitter = mitt<TEmitterEvents>();
|
export const emitter = mitt<TEmitterEvents>();
|
||||||
|
|
||||||
emitter.on('*', (type, e) => console.log(type, e));
|
// uncomment the line below to log all events
|
||||||
|
// emitter.on('*', (type, e) => console.log(type, e));
|
||||||
|
|
|
@ -8,7 +8,6 @@ import { Encryption } from '../encryption';
|
||||||
import { E2EType, IMessage, IUser, TMessageModel } from '../../definitions';
|
import { E2EType, IMessage, IUser, TMessageModel } from '../../definitions';
|
||||||
import sdk from '../services/sdk';
|
import sdk from '../services/sdk';
|
||||||
import { E2E_MESSAGE_TYPE, E2E_STATUS, messagesStatus } from '../constants';
|
import { E2E_MESSAGE_TYPE, E2E_STATUS, messagesStatus } from '../constants';
|
||||||
import { saveDraftMessage } from './draftMessage';
|
|
||||||
|
|
||||||
const changeMessageStatus = async (id: string, status: number, tmid?: string, message?: IMessage) => {
|
const changeMessageStatus = async (id: string, status: number, tmid?: string, message?: IMessage) => {
|
||||||
const db = database.active;
|
const db = database.active;
|
||||||
|
@ -232,9 +231,6 @@ export async function sendMessage(
|
||||||
}
|
}
|
||||||
|
|
||||||
await sendMessageCall(message);
|
await sendMessageCall(message);
|
||||||
// clear draft message when message is sent and app is in background or closed
|
|
||||||
// do not affect the user experience when the app is in the foreground because the hook useAutoSaveDraft will handle it
|
|
||||||
saveDraftMessage({ rid, tmid, draftMessage: '' });
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log(e);
|
log(e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -985,7 +985,9 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> {
|
||||||
const { rid } = this.state.room;
|
const { rid } = this.state.room;
|
||||||
const { user } = this.props;
|
const { user } = this.props;
|
||||||
sendMessage(rid, message, this.tmid, user, tshow).then(() => {
|
sendMessage(rid, message, this.tmid, user, tshow).then(() => {
|
||||||
this.setLastOpen(null);
|
if (this.mounted) {
|
||||||
|
this.setLastOpen(null);
|
||||||
|
}
|
||||||
Review.pushPositiveEvent();
|
Review.pushPositiveEvent();
|
||||||
});
|
});
|
||||||
this.resetAction();
|
this.resetAction();
|
||||||
|
|
Loading…
Reference in New Issue