import { FC, useContext, useState } from 'react'; import { useSnackbar } from 'notistack'; import { Avatar, Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Divider, List, ListItem, ListItemAvatar, ListItemText, TextField, Theme, useTheme } from '@mui/material'; import RefreshIcon from '@mui/icons-material/Refresh'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; import SwapVerticalCircleIcon from '@mui/icons-material/SwapVerticalCircle'; import UpdateIcon from '@mui/icons-material/Update'; import DnsIcon from '@mui/icons-material/Dns'; import CancelIcon from '@mui/icons-material/Cancel'; import * as NTPApi from '../../api/ntp'; import { NTPStatus, NTPSyncStatus } from '../../types'; import { ButtonRow, FormLoader, SectionContent } from '../../components'; import { extractErrorMessage, formatDateTime, formatLocalDateTime, useRest } from '../../utils'; import { AuthenticatedContext } from '../../contexts/authentication'; export const isNtpActive = ({ status }: NTPStatus) => status === NTPSyncStatus.NTP_ACTIVE; export const isNtpEnabled = ({ status }: NTPStatus) => status !== NTPSyncStatus.NTP_DISABLED; export const ntpStatusHighlight = ({ status }: NTPStatus, theme: Theme) => { switch (status) { case NTPSyncStatus.NTP_DISABLED: return theme.palette.info.main; case NTPSyncStatus.NTP_INACTIVE: return theme.palette.error.main; case NTPSyncStatus.NTP_ACTIVE: return theme.palette.success.main; default: return theme.palette.error.main; } }; export const ntpStatus = ({ status }: NTPStatus) => { switch (status) { case NTPSyncStatus.NTP_DISABLED: return 'Disabled'; case NTPSyncStatus.NTP_INACTIVE: return 'Inactive'; case NTPSyncStatus.NTP_ACTIVE: return 'Active'; default: return 'Unknown'; } }; const NTPStatusForm: FC = () => { const { loadData, data, errorMessage } = useRest({ read: NTPApi.readNTPStatus }); const [localTime, setLocalTime] = useState(''); const [settingTime, setSettingTime] = useState(false); const [processing, setProcessing] = useState(false); const { enqueueSnackbar } = useSnackbar(); const { me } = useContext(AuthenticatedContext); const updateLocalTime = (event: React.ChangeEvent) => setLocalTime(event.target.value); const openSetTime = () => { setLocalTime(formatLocalDateTime(new Date())); setSettingTime(true); }; const theme = useTheme(); const configureTime = async () => { setProcessing(true); try { await NTPApi.updateTime({ local_time: formatLocalDateTime(new Date(localTime)) }); enqueueSnackbar('Time set', { variant: 'success' }); setSettingTime(false); loadData(); } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem updating time'), { variant: 'error' }); } finally { setProcessing(false); } }; const renderSetTimeDialog = () => { return ( setSettingTime(false)}> Set Time Enter local date and time below to set the device's time. ); }; const content = () => { if (!data) { return ; } return ( <> {isNtpEnabled(data) && ( <> )} {me.admin && data && !isNtpActive(data) && ( )} {renderSetTimeDialog()} ); }; return ( {content()} ); }; export default NTPStatusForm;