Skip to content
This repository has been archived by the owner on Apr 17, 2023. It is now read-only.

breaking: refactor network status interface #368

Merged
merged 5 commits into from
Mar 3, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
27 changes: 23 additions & 4 deletions packages/offix-offline/src/network/CordovaNetworkStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,22 @@ declare let document: any;
* See: https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-network-information
*/
export class CordovaNetworkStatus implements NetworkStatus {
public onStatusChangeListener(callback: NetworkStatusChangeCallback): void {
if (document) {
document.addEventListener("online", () => callback.onStatusChange({online: true}), false);
document.addEventListener("offline", () => callback.onStatusChange({online: false}), false);

listeners: NetworkStatusChangeCallback[] = [];

constructor() {
document.addEventListener("online", this.handleNetworkStatusChange.bind(this), false);
document.addEventListener("offline", this.handleNetworkStatusChange.bind(this), false);
}

public onStatusChangeListener(listener: NetworkStatusChangeCallback): void {
this.listeners.push(listener);
}

public removeListener(listener: NetworkStatusChangeCallback): void {
const index = this.listeners.indexOf(listener);
if (index > 0) {
this.listeners.splice(index, 1);
}
}

Expand All @@ -22,4 +34,11 @@ export class CordovaNetworkStatus implements NetworkStatus {
});
}

private handleNetworkStatusChange() {
const online = window.navigator.onLine;
this.listeners.forEach((listener) => {
listener.onStatusChange({ online });
});
}

}
13 changes: 10 additions & 3 deletions packages/offix-offline/src/network/NetworkStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,18 @@ export interface NetworkStatusChangeCallback {
*/
export interface NetworkStatus {
/**
* Trigger callback whenever the network status change
* Register callback whenever the network status change
*
* @param callback Callback to be called when network status change
* @param callback Callback to be added when network status change
*/
onStatusChangeListener(callback: NetworkStatusChangeCallback): void;
onStatusChangeListener(listener: NetworkStatusChangeCallback): void;

/**
* Remove callback whenever the network status change
*
* @param callback Callback to be removed when network status change
*/
removeListener(listener: NetworkStatusChangeCallback): void;

/**
* Check if device is offline
Expand Down
27 changes: 23 additions & 4 deletions packages/offix-offline/src/network/WebNetworkStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,22 @@ declare let window: any;
* See: https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine
*/
export class WebNetworkStatus implements NetworkStatus {
public onStatusChangeListener(callback: NetworkStatusChangeCallback): void {
if (window) {
window.addEventListener("online", () => callback.onStatusChange({online: true}), false);
window.addEventListener("offline", () => callback.onStatusChange({online: false}), false);

listeners: NetworkStatusChangeCallback[] = [];

constructor() {
window.addEventListener("online", this.handleNetworkStatusChange.bind(this), false);
window.addEventListener("offline", this.handleNetworkStatusChange.bind(this), false);
}

public onStatusChangeListener(listener: NetworkStatusChangeCallback): void {
this.listeners.push(listener);
}

public removeListener(listener: NetworkStatusChangeCallback): void {
const index = this.listeners.indexOf(listener);
if (index > 0) {
this.listeners.splice(index, 1);
}
}

Expand All @@ -19,4 +31,11 @@ export class WebNetworkStatus implements NetworkStatus {
resolve(!window.navigator.onLine);
});
}

private handleNetworkStatusChange() {
const online = window.navigator.onLine;
this.listeners.forEach((listener) => {
listener.onStatusChange({ online });
});
}
}
8 changes: 6 additions & 2 deletions packages/offix-scheduler/src/OffixScheduler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,17 @@ export class OffixScheduler<T> {
if (this.online) {
queue.forwardOperations();
}
this.networkStatus.onStatusChangeListener({

const listener = {
onStatusChange(networkInfo: NetworkInfo) {
self.online = networkInfo.online;
if (self.online) {
queue.forwardOperations();
}
}
});
};

this.networkStatus.onStatusChangeListener(listener);

}
}
18 changes: 13 additions & 5 deletions packages/react-offix-hooks/src/useNetworkStatus.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { useEffect, useState } from "react";
import { useApolloOfflineClient } from "./ApolloOfflineProvider";
import { NetworkStatusChangeCallback } from "offix-client";

/**
* React hook to detect network changes
Expand All @@ -13,7 +14,7 @@ export function useNetworkStatus(){
const [isOnline, setIsOnline] = useState();

useEffect(() => {
const setOnlineStatus = async () => {
async function setOnlineStatus() {
// check if app is offline and return result
const offline = await client.networkStatus.isOffline();
// set network state with result of offline check
Expand All @@ -22,12 +23,19 @@ export function useNetworkStatus(){

setOnlineStatus();

// set up network listener to
client.networkStatus.onStatusChangeListener({
const listener: NetworkStatusChangeCallback = {
// get result and set online state to result
onStatusChange: ({ online }) => setIsOnline(online)
});
}, []);
};

// set up network listener to
client.networkStatus.onStatusChangeListener(listener);

return function cleanup() {
// @ts-ignore
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment can probably be removed

client.networkStatus.removeListener(listener);
};
}, [client]);

return isOnline;
};