Marat Dyatko d10777a33b fix(network): bind listener to document instead of window (#2622)
We noticed that in some cases network state listeners are stopped triggering, but `navigator.onLine` still reflects the state correctly. I used the following code to debug and found out an issue with `window` and `document` difference:

```js
window.addEventListener("online", ()=>console.warn('WINDOW ONLINE'), false); // won't be triggered
window.addEventListener("online", ()=>console.warn('WINDOW ONLINE'), false); // won't be triggered
document.addEventListener("online", ()=>console.warn('DOCUMENT ONLINE'), false); // triggered
document.addEventListener("online", ()=>console.warn('DOCUMENT ONLINE'), false); // triggered
```

Also, according to plugin documentation, listeners should be bound to `document`: https://github.com/apache/cordova-plugin-network-information#offline
2018-08-01 04:41:51 -04:00

112 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Injectable } from '@angular/core';
import {
Cordova,
CordovaProperty,
Plugin,
CordovaCheck,
IonicNativePlugin
} from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
import { merge } from 'rxjs/observable/merge';
declare const navigator: any;
/**
* @name Network
* @description
* Requires Cordova plugin: cordova-plugin-network-information. For more info, please see the [Network plugin docs](https://github.com/apache/cordova-plugin-network-information).
*
* @usage
* ```typescript
* import { Network } from '@ionic-native/network';
*
* constructor(private network: Network) { }
*
* ...
*
* // watch network for a disconnect
* let disconnectSubscription = this.network.onDisconnect().subscribe(() => {
* console.log('network was disconnected :-(');
* });
*
* // stop disconnect watch
* disconnectSubscription.unsubscribe();
*
*
* // watch network for a connection
* let connectSubscription = this.network.onConnect().subscribe(() => {
* console.log('network connected!');
* // We just got a connection but we need to wait briefly
* // before we determine the connection type. Might need to wait.
* // prior to doing any api requests as well.
* setTimeout(() => {
* if (this.network.type === 'wifi') {
* console.log('we got a wifi connection, woohoo!');
* }
* }, 3000);
* });
*
* // stop connect watch
* connectSubscription.unsubscribe();
*
* ```
* @advanced
* The `type` property will return one of the following connection types: `unknown`, `ethernet`, `wifi`, `2g`, `3g`, `4g`, `cellular`, `none`
*/
@Plugin({
pluginName: 'Network',
plugin: 'cordova-plugin-network-information',
pluginRef: 'navigator.connection',
repo: 'https://github.com/apache/cordova-plugin-network-information',
platforms: ['Amazon Fire OS', 'Android', 'Browser', 'iOS', 'Windows']
})
@Injectable()
export class Network extends IonicNativePlugin {
/**
* Connection type
* @return {string}
*/
@CordovaProperty type: string;
/**
* Downlink Max Speed
* @return {string}
*/
@CordovaProperty downlinkMax: string;
/**
* Returns an observable to watch connection changes
* @return {Observable<any>}
*/
@CordovaCheck()
onchange(): Observable<any> {
return merge(this.onConnect(), this.onDisconnect());
}
/**
* Get notified when the device goes offline
* @returns {Observable<any>} Returns an observable.
*/
@Cordova({
eventObservable: true,
event: 'offline',
element: document
})
onDisconnect(): Observable<any> {
return;
}
/**
* Get notified when the device goes online
* @returns {Observable<any>} Returns an observable.
*/
@Cordova({
eventObservable: true,
event: 'online',
element: document
})
onConnect(): Observable<any> {
return;
}
}