stacker.news/wallets/status.js
2025-04-13 00:50:29 +02:00

55 lines
1.8 KiB
JavaScript

import { canReceive, canSend, isConfigured } from '@/wallets/common'
import { useWalletLogs } from '@/wallets/logger'
import styles from '@/styles/wallet.module.css'
export const Status = {
Enabled: 'Enabled',
Disabled: 'Disabled',
Error: 'Error',
Warning: 'Warning'
}
export function useWalletStatus (wallet) {
const { logs } = useWalletLogs(wallet)
return statusFromLogs(wallet, {
any: wallet.config?.enabled && isConfigured(wallet) ? Status.Enabled : Status.Disabled,
send: wallet.config?.enabled && canSend(wallet) ? Status.Enabled : Status.Disabled,
recv: wallet.config?.enabled && canReceive(wallet) ? Status.Enabled : Status.Disabled
}, logs)
}
const statusFromLogs = (wallet, status, logs) => {
if (status.any === Status.Disabled) return status
// override status depending on if there have been warnings or errors in the logs recently
// find first log from which we can derive status (logs are sorted by recent first)
const walletLogs = logs.filter(l => l.wallet === wallet.def.name)
const sendLevel = walletLogs.find(l => l.context?.status && l.context?.send)?.level
const recvLevel = walletLogs.find(l => l.context?.status && l.context?.recv)?.level
const levelToStatus = (level) => {
switch (level?.toLowerCase()) {
case 'ok':
case 'success': return Status.Enabled
case 'error': return Status.Error
case 'warn': return Status.Warning
}
}
return {
any: status.any,
send: levelToStatus(sendLevel) || status.send,
recv: levelToStatus(recvLevel) || status.recv
}
}
export const statusToClass = status => {
switch (status) {
case Status.Enabled: return styles.success
case Status.Disabled: return styles.disabled
case Status.Error: return styles.error
case Status.Warning: return styles.warning
}
}