50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
import {NetInfo} from 'react-native';
|
|
|
|
import RNFetchBlob from 'react-native-fetch-blob';
|
|
|
|
import {Client4} from 'mattermost-redux/client';
|
|
|
|
const PING_TIMEOUT = 10000;
|
|
|
|
export async function checkConnection(isConnected) {
|
|
if (Client4.getBaseRoute() === '/api/v4') {
|
|
// If we don't have a server yet, return the default implementation
|
|
return isConnected;
|
|
}
|
|
|
|
// Ping the Mattermost server to detect if the we have network connection even if the websocket cannot connect
|
|
const server = `${Client4.getBaseRoute()}/system/ping?time=${Date.now()}`;
|
|
|
|
try {
|
|
await RNFetchBlob.config({timeout: PING_TIMEOUT}).fetch('GET', server);
|
|
return true;
|
|
} catch (error) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function handleConnectionChange(onChange) {
|
|
return async (isConnected) => {
|
|
// Set device internet connectivity immediately
|
|
onChange(isConnected);
|
|
|
|
// Check if connected to server
|
|
const result = await checkConnection(isConnected);
|
|
onChange(result);
|
|
};
|
|
}
|
|
|
|
export default function networkConnectionListener(onChange) {
|
|
const connectionChanged = handleConnectionChange(onChange);
|
|
|
|
NetInfo.isConnected.addEventListener('connectionChange', connectionChanged);
|
|
NetInfo.isConnected.fetch().then(connectionChanged);
|
|
|
|
const removeEventListener = () => NetInfo.isConnected.removeEventListener('connectionChange', connectionChanged); // eslint-disable-line
|
|
|
|
return {
|
|
removeEventListener,
|
|
};
|
|
}
|