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, useTheme, Typography } from '@mui/material'; import { useRequest } from 'alova'; import { useContext, useState } from 'react'; import { toast } from 'react-toastify'; import type { Theme } from '@mui/material'; import type { FC } from 'react'; import type { NTPStatus } from 'types'; import { dialogStyle } from 'CustomTheme'; import * as NTPApi from 'api/ntp'; import { ButtonRow, FormLoader, SectionContent } from 'components'; import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; import { NTPSyncStatus } from 'types'; import { formatDateTime, formatLocalDateTime } from 'utils'; 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; } }; const NTPStatusForm: 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 { me } = useContext(AuthenticatedContext); const { LL } = useI18nContext(); const { send: updateTime } = useRequest((local_time) => NTPApi.updateTime(local_time), { immediate: false }); NTPApi.updateTime; const updateLocalTime = (event: React.ChangeEvent) => setLocalTime(event.target.value); const openSetTime = () => { setLocalTime(formatLocalDateTime(new Date())); setSettingTime(true); }; const theme = useTheme(); const ntpStatus = ({ status }: NTPStatus) => { 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) && ( <> )} {me.admin && data && !isNtpActive(data) && ( )} {renderSetTimeDialog()} ); }; return ( {content()} ); }; export default NTPStatusForm;