105 lines
2.1 KiB
TypeScript
105 lines
2.1 KiB
TypeScript
|
import { SocketStatus } from '../../types/SocketStatus';
|
||
|
import { trigger } from '../../shims/events';
|
||
|
|
||
|
// State
|
||
|
|
||
|
export type NetworkStateType = {
|
||
|
isOnline: boolean;
|
||
|
socketStatus: SocketStatus;
|
||
|
withinConnectingGracePeriod: boolean;
|
||
|
};
|
||
|
|
||
|
// Actions
|
||
|
|
||
|
const CHECK_NETWORK_STATUS = 'network/CHECK_NETWORK_STATUS';
|
||
|
const CLOSE_CONNECTING_GRACE_PERIOD = 'network/CLOSE_CONNECTING_GRACE_PERIOD';
|
||
|
const RELINK_DEVICE = 'network/RELINK_DEVICE';
|
||
|
|
||
|
export type CheckNetworkStatusPayloadType = {
|
||
|
isOnline: boolean;
|
||
|
socketStatus: SocketStatus;
|
||
|
};
|
||
|
|
||
|
type CheckNetworkStatusAction = {
|
||
|
type: 'network/CHECK_NETWORK_STATUS';
|
||
|
payload: CheckNetworkStatusPayloadType;
|
||
|
};
|
||
|
|
||
|
type CloseConnectingGracePeriodActionType = {
|
||
|
type: 'network/CLOSE_CONNECTING_GRACE_PERIOD';
|
||
|
};
|
||
|
|
||
|
type RelinkDeviceActionType = {
|
||
|
type: 'network/RELINK_DEVICE';
|
||
|
};
|
||
|
|
||
|
export type NetworkActionType =
|
||
|
| CheckNetworkStatusAction
|
||
|
| CloseConnectingGracePeriodActionType
|
||
|
| RelinkDeviceActionType;
|
||
|
|
||
|
// Action Creators
|
||
|
|
||
|
function checkNetworkStatus(
|
||
|
payload: CheckNetworkStatusPayloadType
|
||
|
): CheckNetworkStatusAction {
|
||
|
return {
|
||
|
type: CHECK_NETWORK_STATUS,
|
||
|
payload,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function closeConnectingGracePeriod(): CloseConnectingGracePeriodActionType {
|
||
|
return {
|
||
|
type: CLOSE_CONNECTING_GRACE_PERIOD,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function relinkDevice(): RelinkDeviceActionType {
|
||
|
trigger('setupAsNewDevice');
|
||
|
|
||
|
return {
|
||
|
type: RELINK_DEVICE,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
export const actions = {
|
||
|
checkNetworkStatus,
|
||
|
closeConnectingGracePeriod,
|
||
|
relinkDevice,
|
||
|
};
|
||
|
|
||
|
// Reducer
|
||
|
|
||
|
function getEmptyState(): NetworkStateType {
|
||
|
return {
|
||
|
isOnline: navigator.onLine,
|
||
|
socketStatus: WebSocket.OPEN,
|
||
|
withinConnectingGracePeriod: true,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
export function reducer(
|
||
|
state: NetworkStateType = getEmptyState(),
|
||
|
action: NetworkActionType
|
||
|
): NetworkStateType {
|
||
|
if (action.type === CHECK_NETWORK_STATUS) {
|
||
|
const { isOnline, socketStatus } = action.payload;
|
||
|
|
||
|
return {
|
||
|
...state,
|
||
|
isOnline,
|
||
|
socketStatus,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
if (action.type === CLOSE_CONNECTING_GRACE_PERIOD) {
|
||
|
return {
|
||
|
...state,
|
||
|
withinConnectingGracePeriod: false,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
return state;
|
||
|
}
|