From 4938a4a0acd999c254082bec9696006f12061c3e Mon Sep 17 00:00:00 2001 From: foxbit19 Date: Sun, 13 Oct 2019 16:57:35 +0200 Subject: [PATCH] Add auto reconnect on connection loss (#228) --- ui/src/CurrentUser.ts | 23 ++++++++++++++++++++++- ui/src/layout/Layout.tsx | 20 +++----------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/ui/src/CurrentUser.ts b/ui/src/CurrentUser.ts index 9963016..6eeea03 100644 --- a/ui/src/CurrentUser.ts +++ b/ui/src/CurrentUser.ts @@ -10,6 +10,8 @@ const tokenKey = 'gotify-login-key'; export class CurrentUser { private tokenCache: string | null = null; + private reconnectTimeoutId: number | null = null; + private readonly reconnectTime: number = 3000; @observable public loggedIn = false; @observable @@ -90,7 +92,7 @@ export class CurrentUser { }) .catch((error: AxiosError) => { if (!error || !error.response) { - this.hasNetwork = false; + this.lostNetwork(); return Promise.reject(error); } @@ -124,4 +126,23 @@ export class CurrentUser { .post(config.get('url') + 'current/user/password', {pass}) .then(() => this.snack('Password changed')); }; + + public tryReconnect = (quiet = false) => { + this.tryAuthenticate().catch(() => { + if (!quiet) { + this.snack('Reconnect failed'); + } + }); + }; + + private lostNetwork = () => { + this.hasNetwork = false; + if (this.reconnectTimeoutId !== null) { + window.clearTimeout(this.reconnectTimeoutId); + } + this.reconnectTimeoutId = window.setTimeout( + () => this.tryReconnect(true), + this.reconnectTime + ); + }; } diff --git a/ui/src/layout/Layout.tsx b/ui/src/layout/Layout.tsx index 0ec127a..98765eb 100644 --- a/ui/src/layout/Layout.tsx +++ b/ui/src/layout/Layout.tsx @@ -63,8 +63,6 @@ class Layout extends React.Component< private showSettings = false; @observable private version = Layout.defaultVersion; - @observable - private reconnecting = false; public componentDidMount() { if (this.version === Layout.defaultVersion) { @@ -81,19 +79,6 @@ class Layout extends React.Component< } } - private doReconnect = () => { - this.reconnecting = true; - this.props.currentUser - .tryAuthenticate() - .then(() => { - this.reconnecting = false; - }) - .catch(() => { - this.reconnecting = false; - this.props.snackManager.snack('Reconnect failed'); - }); - }; - public render() { const {version, showSettings, currentTheme} = this; const { @@ -104,6 +89,7 @@ class Layout extends React.Component< user: {name, admin}, logout, hasNetwork, + tryReconnect, }, } = this.props; const theme = themeMap[currentTheme]; @@ -113,7 +99,7 @@ class Layout extends React.Component<
{hasNetwork ? null : ( - + tryReconnect()} /> )}
@@ -131,7 +117,7 @@ class Layout extends React.Component<
- {authenticating || this.reconnecting ? ( + {authenticating ? (