Simple browser history support
This commit is contained in:
parent
b7f776593e
commit
7484124533
@ -11,6 +11,7 @@ import { pick } from '../../util/iteratees';
|
|||||||
import InputText from '../ui/InputText';
|
import InputText from '../ui/InputText';
|
||||||
import Loading from '../ui/Loading';
|
import Loading from '../ui/Loading';
|
||||||
import TrackingMonkey from '../common/TrackingMonkey';
|
import TrackingMonkey from '../common/TrackingMonkey';
|
||||||
|
import useHistoryBack from '../../hooks/useHistoryBack';
|
||||||
|
|
||||||
type StateProps = Pick<GlobalState, 'authPhoneNumber' | 'authIsCodeViaApp' | 'authIsLoading' | 'authError'>;
|
type StateProps = Pick<GlobalState, 'authPhoneNumber' | 'authIsCodeViaApp' | 'authIsLoading' | 'authError'>;
|
||||||
type DispatchProps = Pick<GlobalActions, 'setAuthCode' | 'returnToAuthPhoneNumber' | 'clearAuthError'>;
|
type DispatchProps = Pick<GlobalActions, 'setAuthCode' | 'returnToAuthPhoneNumber' | 'clearAuthError'>;
|
||||||
@ -33,6 +34,8 @@ const AuthCode: FC<StateProps & DispatchProps> = ({
|
|||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useHistoryBack(returnToAuthPhoneNumber);
|
||||||
|
|
||||||
const onCodeChange = useCallback((e: FormEvent<HTMLInputElement>) => {
|
const onCodeChange = useCallback((e: FormEvent<HTMLInputElement>) => {
|
||||||
if (authError) {
|
if (authError) {
|
||||||
clearAuthError();
|
clearAuthError();
|
||||||
@ -77,7 +80,7 @@ const AuthCode: FC<StateProps & DispatchProps> = ({
|
|||||||
{authPhoneNumber}
|
{authPhoneNumber}
|
||||||
<div
|
<div
|
||||||
className="auth-number-edit"
|
className="auth-number-edit"
|
||||||
onClick={() => returnToAuthPhoneNumber()}
|
onClick={returnToAuthPhoneNumber}
|
||||||
role="button"
|
role="button"
|
||||||
tabIndex={0}
|
tabIndex={0}
|
||||||
title="Sign In with another phone number"
|
title="Sign In with another phone number"
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import { pick } from '../../util/iteratees';
|
|||||||
import Loading from '../ui/Loading';
|
import Loading from '../ui/Loading';
|
||||||
import Button from '../ui/Button';
|
import Button from '../ui/Button';
|
||||||
import buildClassName from '../../util/buildClassName';
|
import buildClassName from '../../util/buildClassName';
|
||||||
|
import useHistoryBack from '../../hooks/useHistoryBack';
|
||||||
|
|
||||||
type StateProps = Pick<GlobalState, 'connectionState' | 'authQrCode'>;
|
type StateProps = Pick<GlobalState, 'connectionState' | 'authQrCode'>;
|
||||||
type DispatchProps = Pick<GlobalActions, 'returnToAuthPhoneNumber'>;
|
type DispatchProps = Pick<GlobalActions, 'returnToAuthPhoneNumber'>;
|
||||||
@ -40,6 +41,8 @@ const AuthCode: FC<StateProps & DispatchProps> = ({
|
|||||||
}, container);
|
}, container);
|
||||||
}, [connectionState, authQrCode]);
|
}, [connectionState, authQrCode]);
|
||||||
|
|
||||||
|
useHistoryBack(returnToAuthPhoneNumber);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div id="auth-qr-form" className="custom-scroll">
|
<div id="auth-qr-form" className="custom-scroll">
|
||||||
<div className="auth-form">
|
<div className="auth-form">
|
||||||
|
|||||||
@ -3,10 +3,16 @@ import { addReducer } from '../lib/teact/teactn';
|
|||||||
import { INITIAL_STATE } from './initial';
|
import { INITIAL_STATE } from './initial';
|
||||||
import { initCache, loadCache } from './cache';
|
import { initCache, loadCache } from './cache';
|
||||||
import { cloneDeep } from '../util/iteratees';
|
import { cloneDeep } from '../util/iteratees';
|
||||||
|
import { selectCurrentMessageList } from '../modules/selectors';
|
||||||
|
|
||||||
initCache();
|
initCache();
|
||||||
|
|
||||||
addReducer('init', () => {
|
addReducer('init', () => {
|
||||||
const initial = cloneDeep(INITIAL_STATE);
|
const initial = cloneDeep(INITIAL_STATE);
|
||||||
return loadCache(initial) || initial;
|
const newGlobal = loadCache(initial) || initial;
|
||||||
|
|
||||||
|
const currentMessageList = selectCurrentMessageList(newGlobal) || {};
|
||||||
|
window.history.replaceState(currentMessageList, '');
|
||||||
|
|
||||||
|
return newGlobal;
|
||||||
});
|
});
|
||||||
|
|||||||
15
src/hooks/useHistoryBack.ts
Normal file
15
src/hooks/useHistoryBack.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// This is unsafe and can be not chained as `popstate` event is asynchronous
|
||||||
|
|
||||||
|
export default function useHistoryBack(handler: NoneToVoidFunction) {
|
||||||
|
function handlePopState() {
|
||||||
|
handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('popstate', handlePopState);
|
||||||
|
window.history.pushState({}, '');
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener('popstate', handlePopState);
|
||||||
|
window.history.back();
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -1,12 +1,26 @@
|
|||||||
import { addReducer, setGlobal } from '../../../lib/teact/teactn';
|
import { addReducer, getDispatch, setGlobal } from '../../../lib/teact/teactn';
|
||||||
import {
|
import {
|
||||||
exitMessageSelectMode,
|
exitMessageSelectMode,
|
||||||
updateCurrentMessageList,
|
updateCurrentMessageList,
|
||||||
} from '../../reducers';
|
} from '../../reducers';
|
||||||
import { selectCurrentMessageList } from '../../selectors';
|
import { selectCurrentMessageList } from '../../selectors';
|
||||||
|
|
||||||
|
window.addEventListener('popstate', (e) => {
|
||||||
|
if (!e.state) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { chatId: id, threadId, messageListType: type } = e.state;
|
||||||
|
|
||||||
|
getDispatch().openChat({
|
||||||
|
id, threadId, type, noPushState: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
addReducer('openChat', (global, actions, payload) => {
|
addReducer('openChat', (global, actions, payload) => {
|
||||||
const { id, threadId, type } = payload!;
|
const {
|
||||||
|
id, threadId = -1, type = 'thread', noPushState,
|
||||||
|
} = payload!;
|
||||||
|
|
||||||
const currentMessageList = selectCurrentMessageList(global);
|
const currentMessageList = selectCurrentMessageList(global);
|
||||||
|
|
||||||
@ -30,6 +44,10 @@ addReducer('openChat', (global, actions, payload) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
setGlobal(global);
|
setGlobal(global);
|
||||||
|
|
||||||
|
if (!noPushState) {
|
||||||
|
window.history.pushState({ chatId: id, threadId, messageListType: type }, '');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return updateCurrentMessageList(global, id, threadId, type);
|
return updateCurrentMessageList(global, id, threadId, type);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user