import AutoAwesomeMotionIcon from '@mui/icons-material/AutoAwesomeMotion'; import DeviceHubIcon from '@mui/icons-material/DeviceHub'; import RefreshIcon from '@mui/icons-material/Refresh'; import ReportIcon from '@mui/icons-material/Report'; import SpeakerNotesOffIcon from '@mui/icons-material/SpeakerNotesOff'; import { Avatar, Button, Divider, List, ListItem, ListItemAvatar, ListItemText, useTheme } from '@mui/material'; import { useRequest } from 'alova'; import type { Theme } from '@mui/material'; import type { FC } from 'react'; import type { MqttStatus } from 'types'; import * as MqttApi from 'api/mqtt'; import { ButtonRow, FormLoader, SectionContent } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import { MqttDisconnectReason } from 'types'; export const mqttStatusHighlight = ({ enabled, connected }: MqttStatus, theme: Theme) => { if (!enabled) { return theme.palette.info.main; } if (connected) { return theme.palette.success.main; } return theme.palette.error.main; }; export const mqttPublishHighlight = ({ mqtt_fails }: MqttStatus, theme: Theme) => { if (mqtt_fails === 0) return theme.palette.success.main; if (mqtt_fails < 10) return theme.palette.warning.main; return theme.palette.error.main; }; export const mqttQueueHighlight = ({ mqtt_queued }: MqttStatus, theme: Theme) => { if (mqtt_queued <= 1) return theme.palette.success.main; return theme.palette.warning.main; }; const MqttStatusForm: FC = () => { const { data: data, send: loadData, error } = useRequest(MqttApi.readMqttStatus); const { LL } = useI18nContext(); const theme = useTheme(); const mqttStatus = ({ enabled, connected, connect_count }: MqttStatus) => { if (!enabled) { return LL.NOT_ENABLED(); } if (connected) { return LL.CONNECTED(0) + (connect_count > 1 ? ' (' + connect_count + ')' : ''); } return LL.DISCONNECTED() + (connect_count > 1 ? ' (' + connect_count + ')' : ''); }; const disconnectReason = ({ disconnect_reason }: MqttStatus) => { switch (disconnect_reason) { case MqttDisconnectReason.TCP_DISCONNECTED: return 'TCP disconnected'; case MqttDisconnectReason.MQTT_UNACCEPTABLE_PROTOCOL_VERSION: return 'Unacceptable protocol version'; case MqttDisconnectReason.MQTT_IDENTIFIER_REJECTED: return 'Client ID rejected'; case MqttDisconnectReason.MQTT_SERVER_UNAVAILABLE: return 'Server unavailable'; case MqttDisconnectReason.MQTT_MALFORMED_CREDENTIALS: return 'Malformed credentials'; case MqttDisconnectReason.MQTT_NOT_AUTHORIZED: return 'Not authorized'; case MqttDisconnectReason.TLS_BAD_FINGERPRINT: return 'TSL fingerprint invalid'; default: return 'Unknown'; } }; const content = () => { if (!data) { return ; } const renderConnectionStatus = () => ( <> {!data.connected && ( <> )} # ); return ( <> {data.enabled && renderConnectionStatus()} ); }; return ( {content()} ); }; export default MqttStatusForm;