import type {
ConnectedAccountError,
Device,
DeviceError,
} from '@seamapi/types/connect'
import { CheckIcon } from 'lib/icons/Check.js'
import { ExclamationCircleOutlineIcon } from 'lib/icons/ExclamationCircleOutline.js'
import { OnlineStatusAccountOfflineIcon } from 'lib/icons/OnlineStatusAccountOffline.js'
import {
connectedAccountErrorFilter,
deviceErrorFilter,
} from 'lib/seam/filters.js'
import { TableFilterBar } from 'lib/ui/Table/TableFilterBar/TableFilterBar.js'
import { TableFilterItem } from 'lib/ui/Table/TableFilterBar/TableFilterItem.js'
export type AccountFilter = 'account_issues'
export type DeviceFilter = 'device_issues'
interface DeviceHealthBarProps {
devices: Device[]
filter: AccountFilter | DeviceFilter | null
onFilterSelect: (filter: AccountFilter | DeviceFilter | null) => void
errorFilter: (error: DeviceError | ConnectedAccountError) => boolean
}
export function DeviceHealthBar({
devices,
filter,
onFilterSelect,
errorFilter,
}: DeviceHealthBarProps): JSX.Element {
const erroredAccounts = devices.filter((device) => {
return (
device.errors.filter(errorFilter).filter(connectedAccountErrorFilter)
.length > 0
)
})
const erroredDevices = devices.filter((device) => {
return (
device.errors.filter(errorFilter).filter(deviceErrorFilter).length > 0
)
})
const accountIssueCount = erroredAccounts.length
const deviceIssueCount = erroredDevices.length
const toggle = (target: AccountFilter | DeviceFilter) => () => {
const newFilter = target === filter ? null : target
onFilterSelect(newFilter)
}
const deviceLabel =
deviceIssueCount > 0
? `${deviceIssueCount} ${t.deviceIssues}`
: `${deviceIssueCount} ${t.deviceIssue}`
const accountLabel =
accountIssueCount > 0
? `${accountIssueCount} ${t.accountIssues}`
: `${accountIssueCount} ${t.accountIssue}`
if (accountIssueCount === 0 && deviceIssueCount === 0) {
return (
{t.devicesAndAccountsOk}
)
}
return (
{
onFilterSelect(null)
}}
>
{deviceIssueCount > 0 && (
{deviceLabel}
)}
{accountIssueCount > 0 && (
{accountLabel}
)}
)
}
const t = {
devicesAndAccountsOk: 'Devices & accounts OK',
accountIssue: 'account issue',
accountIssues: 'account issues',
deviceIssue: 'device issue',
deviceIssues: 'device issues',
}