import { useState } from 'react'; import type { FC } from 'react'; import { toast } from 'react-toastify'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; import CancelIcon from '@mui/icons-material/Cancel'; import DnsIcon from '@mui/icons-material/Dns'; import RefreshIcon from '@mui/icons-material/Refresh'; import SwapVerticalCircleIcon from '@mui/icons-material/SwapVerticalCircle'; import UpdateIcon from '@mui/icons-material/Update'; import { Avatar, Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Divider, List, ListItem, ListItemAvatar, ListItemText, TextField, Typography, useTheme } from '@mui/material'; import type { Theme } from '@mui/material'; import * as NTPApi from 'api/ntp'; import { dialogStyle } from 'CustomTheme'; import { useRequest } from 'alova'; import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { NTPStatusType, Time } from 'types'; import { NTPSyncStatus } from 'types'; import { formatDateTime, formatLocalDateTime } from 'utils'; const NTPStatus: FC = () => { const { data: data, send: loadData, error } = useRequest(NTPApi.readNTPStatus); const [localTime, setLocalTime] = useState(''); const [settingTime, setSettingTime] = useState(false); const [processing, setProcessing] = useState(false); const { LL } = useI18nContext(); useLayoutTitle(LL.STATUS_OF('NTP')); const { send: updateTime } = useRequest( (local_time: Time) => NTPApi.updateTime(local_time), { immediate: false } ); NTPApi.updateTime; const isNtpActive = ({ status }: NTPStatusType) => status === NTPSyncStatus.NTP_ACTIVE; const isNtpEnabled = ({ status }: NTPStatusType) => status !== NTPSyncStatus.NTP_DISABLED; const ntpStatusHighlight = ({ status }: NTPStatusType, 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; } }; const updateLocalTime = (event: React.ChangeEvent) => setLocalTime(event.target.value); const openSetTime = () => { setLocalTime(formatLocalDateTime(new Date())); setSettingTime(true); }; const theme = useTheme(); const ntpStatus = ({ status }: NTPStatusType) => { switch (status) { case NTPSyncStatus.NTP_DISABLED: return LL.NOT_ENABLED(); case NTPSyncStatus.NTP_INACTIVE: return LL.INACTIVE(0); case NTPSyncStatus.NTP_ACTIVE: return LL.ACTIVE(); default: return LL.UNKNOWN(); } }; const configureTime = async () => { setProcessing(true); await updateTime({ local_time: formatLocalDateTime(new Date(localTime)) }) .then(async () => { toast.success(LL.TIME_SET()); setSettingTime(false); await loadData(); }) .catch(() => { toast.error(LL.PROBLEM_UPDATING()); }) .finally(() => { setProcessing(false); }); }; const renderSetTimeDialog = () => ( setSettingTime(false)} > {LL.SET_TIME(1)} {LL.SET_TIME_TEXT()} ); const content = () => { if (!data) { return ; } return ( <> {isNtpEnabled(data) && ( <> )} {data && !isNtpActive(data) && ( )} {renderSetTimeDialog()} ); }; return {content()}; }; export default NTPStatus;