Add auto reconnect on connection loss (#228)

This commit is contained in:
foxbit19 2019-10-13 16:57:35 +02:00 committed by Jannis Mattheis
parent 7cf5c555f5
commit 4938a4a0ac
2 changed files with 25 additions and 18 deletions

View File

@ -10,6 +10,8 @@ const tokenKey = 'gotify-login-key';
export class CurrentUser { export class CurrentUser {
private tokenCache: string | null = null; private tokenCache: string | null = null;
private reconnectTimeoutId: number | null = null;
private readonly reconnectTime: number = 3000;
@observable @observable
public loggedIn = false; public loggedIn = false;
@observable @observable
@ -90,7 +92,7 @@ export class CurrentUser {
}) })
.catch((error: AxiosError) => { .catch((error: AxiosError) => {
if (!error || !error.response) { if (!error || !error.response) {
this.hasNetwork = false; this.lostNetwork();
return Promise.reject(error); return Promise.reject(error);
} }
@ -124,4 +126,23 @@ export class CurrentUser {
.post(config.get('url') + 'current/user/password', {pass}) .post(config.get('url') + 'current/user/password', {pass})
.then(() => this.snack('Password changed')); .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
);
};
} }

View File

@ -63,8 +63,6 @@ class Layout extends React.Component<
private showSettings = false; private showSettings = false;
@observable @observable
private version = Layout.defaultVersion; private version = Layout.defaultVersion;
@observable
private reconnecting = false;
public componentDidMount() { public componentDidMount() {
if (this.version === Layout.defaultVersion) { 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() { public render() {
const {version, showSettings, currentTheme} = this; const {version, showSettings, currentTheme} = this;
const { const {
@ -104,6 +89,7 @@ class Layout extends React.Component<
user: {name, admin}, user: {name, admin},
logout, logout,
hasNetwork, hasNetwork,
tryReconnect,
}, },
} = this.props; } = this.props;
const theme = themeMap[currentTheme]; const theme = themeMap[currentTheme];
@ -113,7 +99,7 @@ class Layout extends React.Component<
<HashRouter> <HashRouter>
<div> <div>
{hasNetwork ? null : ( {hasNetwork ? null : (
<NetworkLostBanner height={64} retry={this.doReconnect} /> <NetworkLostBanner height={64} retry={() => tryReconnect()} />
)} )}
<div style={{display: 'flex'}}> <div style={{display: 'flex'}}>
<CssBaseline /> <CssBaseline />
@ -131,7 +117,7 @@ class Layout extends React.Component<
<main className={classes.content}> <main className={classes.content}>
<Switch> <Switch>
{authenticating || this.reconnecting ? ( {authenticating ? (
<Route path="/"> <Route path="/">
<LoadingSpinner /> <LoadingSpinner />
</Route> </Route>