stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
99 lines • 3.79 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useIsOnline = void 0;
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _netinfo = _interopRequireDefault(require("@react-native-community/netinfo"));
var _useAppStateListener = require("../../../hooks/useAppStateListener");
var _useIsMountedRef = require("../../../hooks/useIsMountedRef");
var useIsOnline = (client, closeConnectionOnBackground = true) => {
var _useState = (0, _react.useState)(null),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
isOnline = _useState2[0],
setIsOnline = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
connectionRecovering = _useState4[0],
setConnectionRecovering = _useState4[1];
var isMounted = (0, _useIsMountedRef.useIsMountedRef)();
var clientExists = !!client;
var onBackground = (0, _react.useCallback)(() => {
if (!closeConnectionOnBackground || !clientExists) {
return;
}
client.closeConnection();
setIsOnline(false);
}, [closeConnectionOnBackground, client, clientExists]);
var onForeground = (0, _react.useCallback)(() => {
if (!clientExists || !client.userID) {
return;
}
client.openConnection();
}, [client, clientExists]);
(0, _useAppStateListener.useAppStateListener)(onForeground, onBackground);
(0, _react.useEffect)(() => {
var handleChangedEvent = event => {
setConnectionRecovering(!event.online);
setIsOnline(event.online || false);
};
var handleRecoveredEvent = () => setConnectionRecovering(false);
var notifyChatClient = isConnected => {
if (client?.wsConnection && isConnected) {
if (isConnected) {
client.wsConnection.onlineStatusChanged({
type: 'online'
});
} else {
client.wsConnection.onlineStatusChanged({
type: 'offline'
});
}
}
};
var unsubscribeNetInfo;
var setNetInfoListener = () => {
unsubscribeNetInfo = _netinfo.default.addEventListener(netInfoState => {
if (!netInfoState && !client.wsConnection?.isHealthy) {
setConnectionRecovering(true);
setIsOnline(false);
}
var isConnected = netInfoState.isConnected,
isInternetReachable = netInfoState.isInternetReachable;
notifyChatClient(isInternetReachable !== null ? isInternetReachable && isConnected : isConnected);
});
};
var setInitialOnlineState = function () {
var _ref = (0, _asyncToGenerator2.default)(function* () {
var _yield$NetInfo$fetch = yield _netinfo.default.fetch(),
isConnected = _yield$NetInfo$fetch.isConnected;
if (isMounted.current) {
setIsOnline(isConnected);
notifyChatClient(isConnected);
}
});
return function setInitialOnlineState() {
return _ref.apply(this, arguments);
};
}();
setInitialOnlineState();
var chatListeners = [];
if (client) {
chatListeners.push(client.on('connection.changed', handleChangedEvent));
chatListeners.push(client.on('connection.recovered', handleRecoveredEvent));
setNetInfoListener();
}
return () => {
chatListeners.forEach(listener => listener.unsubscribe?.());
unsubscribeNetInfo?.();
};
}, [clientExists]);
return {
connectionRecovering,
isOnline
};
};
exports.useIsOnline = useIsOnline;
//# sourceMappingURL=useIsOnline.js.map