forked from lunanting/cangku
51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
const presenceTimestamp = (value) => {
|
|
const timestamp = new Date(value || 0).getTime();
|
|
return Number.isFinite(timestamp) ? timestamp : 0;
|
|
};
|
|
|
|
export function selectCurrentPresenceDevice(devices = []) {
|
|
return devices.filter(Boolean).reduce((current, candidate) => {
|
|
if (!current) return candidate;
|
|
if (Boolean(candidate.isOnline) !== Boolean(current.isOnline)) {
|
|
return candidate.isOnline ? candidate : current;
|
|
}
|
|
return presenceTimestamp(candidate.lastSeenAt) > presenceTimestamp(current.lastSeenAt)
|
|
? candidate
|
|
: current;
|
|
}, null);
|
|
}
|
|
|
|
export function buildOperatorPresenceRows(users = []) {
|
|
return users.flatMap((user) => {
|
|
const devices = Array.isArray(user?.devices) ? user.devices : [];
|
|
const currentDevice = selectCurrentPresenceDevice(devices);
|
|
if (!currentDevice) return [];
|
|
|
|
return [{
|
|
...currentDevice,
|
|
userId: String(user.userId ?? ''),
|
|
name: user.name || '',
|
|
username: user.username || '',
|
|
departmentName: user.departmentName || '',
|
|
activeDeviceCount: Number(user.activeDeviceCount) || 0,
|
|
deviceCount: Number(user.deviceCount) || devices.length,
|
|
isOnline: Boolean(currentDevice.isOnline),
|
|
}];
|
|
});
|
|
}
|
|
|
|
export function filterOperatorPresenceRows(rows = [], status = 'all') {
|
|
if (status === 'online') return rows.filter((row) => row.isOnline);
|
|
if (status === 'offline') return rows.filter((row) => !row.isOnline);
|
|
return rows;
|
|
}
|
|
|
|
export function getOperatorPresenceCounts(rows = []) {
|
|
const online = rows.filter((row) => row.isOnline).length;
|
|
return {
|
|
total: rows.length,
|
|
online,
|
|
offline: rows.length - online,
|
|
};
|
|
}
|