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,
};
}