signal-desktop/ts/state/ducks/network.ts

104 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;
}