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 all commits
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
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