diff options
Diffstat (limited to 'src/main/useFilter.js')
-rw-r--r-- | src/main/useFilter.js | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/main/useFilter.js b/src/main/useFilter.js new file mode 100644 index 00000000..ccda6e14 --- /dev/null +++ b/src/main/useFilter.js @@ -0,0 +1,46 @@ +import { useEffect } from 'react'; +import { useSelector } from 'react-redux'; +import dayjs from 'dayjs'; + +export default (keyword, filter, filterSort, filterMap, positions, setFilteredDevices, setFilteredPositions) => { + const groups = useSelector((state) => state.groups.items); + const devices = useSelector((state) => state.devices.items); + + useEffect(() => { + const deviceGroups = (device) => { + const groupIds = []; + let { groupId } = device; + while (groupId) { + groupIds.push(groupId); + groupId = groups[groupId]?.groupId || 0; + } + return groupIds; + }; + + const filtered = Object.values(devices) + .filter((device) => !filter.statuses.length || filter.statuses.includes(device.status)) + .filter((device) => !filter.groups.length || deviceGroups(device).some((id) => filter.groups.includes(id))) + .filter((device) => { + const lowerCaseKeyword = keyword.toLowerCase(); + return [device.name, device.uniqueId, device.phone, device.model, device.contact].some((s) => s && s.toLowerCase().includes(lowerCaseKeyword)); + }); + switch (filterSort) { + case 'name': + filtered.sort((device1, device2) => device1.name.localeCompare(device2.name)); + break; + case 'lastUpdate': + filtered.sort((device1, device2) => { + const time1 = device1.lastUpdate ? dayjs(device1.lastUpdate).valueOf() : 0; + const time2 = device2.lastUpdate ? dayjs(device2.lastUpdate).valueOf() : 0; + return time2 - time1; + }); + break; + default: + break; + } + setFilteredDevices(filtered); + setFilteredPositions(filterMap + ? filtered.map((device) => positions[device.id]).filter(Boolean) + : Object.values(positions)); + }, [keyword, filter, filterSort, filterMap, groups, devices, positions, setFilteredDevices, setFilteredPositions]); +}; |