/*
* Copyright (c) 2015 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
*/
import React, { type FC, useMemo } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { Toggle } from '../../../Toggle/Toggle';
import classNames from '../../../utils/classNames';
import { getAutoReselect, setAutoReselect } from '../../deviceAutoSelectSlice';
import { displayedDeviceName } from '../../deviceInfo/deviceInfo';
import {
type Device as DeviceProps,
getDevices,
selectedDevice,
} from '../../deviceSlice';
import { AnimatedItem, AnimatedList } from './AnimatedList';
import BrokenDevice from './BrokenDevice';
import Device from './Device';
import VirtualDevices from './VirtualDevices';
import './device-list.scss';
const NoDevicesConnected = () => (
);
const NoSupportedDevicesConnected = () => (
No supported devices connected
);
const showAllDevices = () => true;
const sorted = (devices: DeviceProps[]) =>
[...devices].sort((a, b) => {
if (!!a.favorite !== !!b.favorite) {
return a.favorite ? -1 : 1;
}
return displayedDeviceName(a) < displayedDeviceName(b) ? -1 : 1;
});
interface Props {
doSelectDevice: (device: DeviceProps, autoReselected: boolean) => void;
doSelectVirtualDevice: (device: string) => void;
isVisible: boolean;
deviceFilter?: (device: DeviceProps) => boolean;
virtualDevices?: string[];
}
const DeviceList: FC = ({
isVisible,
doSelectDevice,
doSelectVirtualDevice,
deviceFilter = showAllDevices,
virtualDevices = [],
}) => {
const dispatch = useDispatch();
const autoReconnect = useSelector(getAutoReselect);
const devices = useSelector(getDevices);
const currentDevice = useSelector(selectedDevice);
const sortedDevices = useMemo(
() => sorted([...devices.values()]),
[devices],
);
const filteredDevices = useMemo(
() => sortedDevices.filter(deviceFilter),
[deviceFilter, sortedDevices],
);
const canUseAutoReconnect =
(!!currentDevice && !!currentDevice?.serialNumber) || !currentDevice;
return (
{
dispatch(setAutoReselect(value));
}}
/>
{sortedDevices.length === 0 &&
}
{sortedDevices.length > 0 &&
filteredDevices.length === 0 ? (
) : (
{filteredDevices.map(device => (
{device.traits.broken ? (
) : (
)}
))}
)}
{virtualDevices.length > 0 && (
)}
);
};
export default DeviceList;