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

Commit

Permalink
breaking: refactor network status interface (#368)
Browse files Browse the repository at this point in the history
* breaking: refactor network status interface

* breaking: change api for NetworkStatus interface

* fix: change api in networkstatus related tests and implement new methods

* fix: lint error from unnecessary import

* fix: network integration tests
  • Loading branch information
kingsleyzissou committed Mar 3, 2020
1 parent 60c745c commit 05625f2
Show file tree
Hide file tree
Showing 12 changed files with 115 additions and 41 deletions.
4 changes: 2 additions & 2 deletions packages/offix-client-boost/integration_test/utils/network.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export class ToggleableNetworkStatus {
this.callbacks = []
}

onStatusChangeListener(callback) {
addListener(callback) {
this.callbacks.push(callback)
}

Expand All @@ -26,7 +26,7 @@ export class ToggleableNetworkStatus {
setOnline(online) {
this.online = online;
for (const callback of this.callbacks) {
callback.onStatusChange({ online })
callback({ online })
}
}
};
4 changes: 2 additions & 2 deletions packages/offix-client/integration_test/utils/network.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export class ToggleableNetworkStatus {
this.callbacks = []
}

onStatusChangeListener(callback) {
addListener(callback) {
this.callbacks.push(callback)
}

Expand All @@ -26,7 +26,7 @@ export class ToggleableNetworkStatus {
setOnline(online) {
this.online = online;
for (const callback of this.callbacks) {
callback.onStatusChange({ online })
callback({ online })
}
}
};
11 changes: 9 additions & 2 deletions packages/offix-client/test/mock/MockNetworkStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,17 @@ export class MockNetworkStatus {
this.callbacks = [];
}

public onStatusChangeListener(callback: any) {
public addListener(callback: any) {
this.callbacks.push(callback);
}

public removeListener(callback: any) {
const index = this.callbacks.indexOf(callback);
if (index >= 0) {
this.callbacks.splice(index, 1);
}
}

public isOffline(): Promise<boolean> {
const online = this.online;
return new Promise(resolve => resolve(!online));
Expand All @@ -19,7 +26,7 @@ export class MockNetworkStatus {
public setOnline(online: boolean) {
this.online = online;
for (const callback of this.callbacks) {
callback.onStatusChange({ online });
callback({ online });
}
}
}
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 addListener(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({ online });
});
}

}
17 changes: 11 additions & 6 deletions packages/offix-offline/src/network/NetworkStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,25 @@ export interface NetworkInfo {
online: boolean;
}

export interface NetworkStatusChangeCallback {
onStatusChange(info: NetworkInfo): void;
}
export type NetworkStatusChangeCallback = (info: NetworkInfo) => void;

/**
* Responsable to handle Networks status
*/
export interface NetworkStatus {
/**
* Trigger callback whenever the network status change
* Register callback whenever the network status change
*
* @param callback Callback to be added when network status change
*/
addListener(listener: NetworkStatusChangeCallback): void;

/**
* Remove callback whenever the network status change
*
* @param callback Callback to be called when network status change
* @param callback Callback to be removed when network status change
*/
onStatusChangeListener(callback: NetworkStatusChangeCallback): void;
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 addListener(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({ online });
});
}
}
5 changes: 4 additions & 1 deletion packages/offix-offline/test/mock/NetworkState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ export const networkStatus = {
isOffline() {
return Promise.resolve(false);
},
onStatusChangeListener() {
addListener() {
return;
},
removeListener() {
return;
}
};
16 changes: 9 additions & 7 deletions packages/offix-scheduler/src/OffixScheduler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,15 @@ export class OffixScheduler<T> {
if (this.online) {
queue.forwardOperations();
}
this.networkStatus.onStatusChangeListener({
onStatusChange(networkInfo: NetworkInfo) {
self.online = networkInfo.online;
if (self.online) {
queue.forwardOperations();
}

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

this.networkStatus.addListener(listener);

}
}
11 changes: 9 additions & 2 deletions packages/offix-scheduler/test/mock/ToggleableNetworkStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,17 @@ export class ToggleableNetworkStatus {
this.callbacks = [];
}

public onStatusChangeListener(callback: any) {
public addListener(callback: any) {
this.callbacks.push(callback);
}

public removeListener(callback: any) {
const index = this.callbacks.indexOf(callback);
if (index >= 0) {
this.callbacks.splice(index, 1);
}
}

public isOffline(): Promise<boolean> {
const online = this.online;
return new Promise(resolve => resolve(!online));
Expand All @@ -19,7 +26,7 @@ export class ToggleableNetworkStatus {
public setOnline(online: boolean) {
this.online = online;
for (const callback of this.callbacks) {
callback.onStatusChange({ online });
callback({ online });
}
}
}
17 changes: 11 additions & 6 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,16 @@ export function useNetworkStatus(){

setOnlineStatus();

// get result and set online state to result
const listener: NetworkStatusChangeCallback = ({ online }) => setIsOnline(online);

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

return function cleanup() {
client.networkStatus.removeListener(listener);
};
}, [client]);

return isOnline;
};
11 changes: 9 additions & 2 deletions packages/react-offix-hooks/test/mock/MockNetworkStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,17 @@ export class MockNetworkStatus {
this.callbacks = [];
}

public onStatusChangeListener(callback: any) {
public addListener(callback: any) {
this.callbacks.push(callback);
}

public removeListener(callback: any) {
const index = this.callbacks.indexOf(callback);
if (index >= 0) {
this.callbacks.splice(index, 1);
}
}

public isOffline(): Promise<boolean> {
const online = this.online;
return new Promise(resolve => resolve(!online));
Expand All @@ -19,7 +26,7 @@ export class MockNetworkStatus {
public setOnline(online: boolean) {
this.online = online;
for (const callback of this.callbacks) {
callback.onStatusChange({ online });
callback({ online });
}
}
}
6 changes: 3 additions & 3 deletions packages/react-offix-hooks/test/useNetworkStatus.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import { HttpLink } from "apollo-link-http";
import { MockNetworkStatus } from "./mock/MockNetworkStatus";

const createClient = async ({ online } : { online: boolean }) => {
let link = new HttpLink({ uri: "http://test" });
let networkStatus = new MockNetworkStatus();
const link = new HttpLink({ uri: "http://test" });
const networkStatus = new MockNetworkStatus();
networkStatus.setOnline(online);
let client = new ApolloOfflineClient({
const client = new ApolloOfflineClient({
cache: new InMemoryCache(),
link,
networkStatus
Expand Down

0 comments on commit 05625f2

Please sign in to comment.