aboutsummaryrefslogtreecommitdiff
path: root/src/main/useFilter.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/useFilter.js')
-rw-r--r--src/main/useFilter.js46
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]);
+};