1
0
mirror of https://github.com/pavlobu/deskreen.git synced 2025-05-19 00:40:11 -07:00
2020-09-24 19:06:07 +03:00

100 lines
2.7 KiB
TypeScript

/* eslint-disable @typescript-eslint/ban-ts-comment */
/* eslint-disable react/prop-types */
import React, { useState, useCallback } from 'react';
interface ConnectedDevicesContextInterface {
devices: Device[];
pendingConnectionDevice: Device | null;
setPendingConnectionDeviceHook: (device: Device) => void;
addPendingConnectedDeviceListener: (
callback: (device: Device) => void
) => void;
setDevicesHook: (devices: Device[]) => void;
resetPendingConnectionDeviceHook: () => void;
getDevices: () => Device[];
}
// TODO this value should be set as soon as electron-ConnectedDevices is loaded, to load user pref
const defaultConnectedDevicesContextValue = {
devices: [] as Device[],
pendingConnectionDevice: null,
setPendingConnectionDeviceHook: () => {},
addPendingConnectedDeviceListener: () => {},
setDevicesHook: () => {},
resetPendingConnectionDeviceHook: () => {},
getDevices: () => [] as Device[],
};
export const ConnectedDevicesContext = React.createContext<
ConnectedDevicesContextInterface
>(defaultConnectedDevicesContextValue);
export const ConnectedDevicesProvider: React.FC = ({ children }) => {
const [devices, setDevices] = useState([] as Device[]);
const [
pendingConnectionDevice,
setPendingConnectionDevice,
] = useState<Device | null>();
const [
pendingDeviceConnectedListeners,
setPendingDeviceConnectedListeners,
] = useState([]);
const emitPendingConnectionDeviceConnected = useCallback(
(device: Device) => {
pendingDeviceConnectedListeners.forEach(
(callback: (device: Device) => void) => {
callback(device);
}
);
},
[pendingDeviceConnectedListeners]
);
const setPendingConnectionDeviceHook = (device: Device) => {
setPendingConnectionDevice(device);
emitPendingConnectionDeviceConnected(device);
};
const setDevicesHook = (_devices: Device[]) => {
setDevices(_devices);
};
const resetPendingConnectionDeviceHook = () => {
setPendingConnectionDevice(undefined);
};
const addPendingConnectedDeviceListener = (
callback: (device: Device) => void
) => {
// @ts-ignore: has to be like that for now
setPendingDeviceConnectedListeners([
...pendingDeviceConnectedListeners,
callback,
]);
};
const getDevices = useCallback(() => {
return devices;
}, [devices]);
// TODO: load saved devices here? in useEffect
const value = {
devices,
pendingConnectionDevice,
setDevicesHook,
setPendingConnectionDeviceHook,
addPendingConnectedDeviceListener,
resetPendingConnectionDeviceHook,
getDevices,
};
return (
// @ts-ignore: it is ok here
<ConnectedDevicesContext.Provider value={value}>
{children}
</ConnectedDevicesContext.Provider>
);
};