All files / sportident-react/src react.tsx

92.3% Statements 36/39
100% Branches 3/3
100% Functions 11/11
91.66% Lines 33/36

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 541x 1x       1x     5x 4x 1x 1x 1x 1x 1x 1x         1x 1x 1x 1x 1x 1x         1x 1x 1x 1x 1x 1x 1x 1x 1x         1x 1x 1x 1x 1x 1x     4x    
import React from 'react';
import Immutable from 'immutable';
import {SiDeviceAddEvent, ISiDeviceDriverWithAutodetection, SiDeviceRemoveEvent} from 'sportident/lib/SiDevice/ISiDeviceDriver';
import {ISiDevice, ISiDeviceDriverData} from 'sportident/lib/SiDevice/ISiDevice';
 
export const useSiDevices = <T extends ISiDeviceDriverData<unknown>>(
    siDeviceDriver: ISiDeviceDriverWithAutodetection<T>,
): Immutable.Map<string, ISiDevice<T>> => {
    const [siDevices, setSiDevices] = React.useState(Immutable.Map({}));
    React.useEffect(() => {
        const onDeviceAdd = (event: SiDeviceAddEvent<T>) => {
            const device = event.siDevice;
            setSiDevices((currentSiDevices) => {
                if (!currentSiDevices.has(device.ident)) {
                    console.log('useSiDevices: add');
                    return currentSiDevices.set(device.ident, device);
                }
                return currentSiDevices;
            });
        };
        const onDeviceRemove = (event: SiDeviceRemoveEvent<T>) => {
            const device = event.siDevice;
            setSiDevices((currentSiDevices) => {
                if (currentSiDevices.has(device.ident)) {
                    console.log('useSiDevices: remove');
                    return currentSiDevices.delete(device.ident);
                }
                return currentSiDevices;
            });
        };
        siDeviceDriver.addEventListener('add', onDeviceAdd);
        siDeviceDriver.addEventListener('remove', onDeviceRemove);
        siDeviceDriver.startAutoDetection().then((devices) => {
            setSiDevices((currentSiDevices) => {
                const existingIdentSet = Immutable.Set.fromKeys(currentSiDevices);
                const newIdentSet = Immutable.Set(devices.map((device) => device.ident));
                if (!newIdentSet.equals(existingIdentSet)) {
                    console.log('useSiDevices: reset');
                    return Immutable.Map(devices.map((device) => [device.ident, device]));
                }
                return currentSiDevices;
            });
        });
        console.log('useSiDevices: setup');
        return () => {
            console.log('useSiDevices: cleanup');
            siDeviceDriver.stopAutoDetection();
            siDeviceDriver.removeEventListener('add', onDeviceAdd);
            siDeviceDriver.removeEventListener('remove', onDeviceRemove);
        };
    }, []);
    return siDevices as Immutable.Map<string, ISiDevice<T>>;
};