mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-07 00:09:51 +03:00
move common time functions
This commit is contained in:
@@ -27,8 +27,6 @@ import TableCell, { tableCellClasses } from '@mui/material/TableCell';
|
|||||||
|
|
||||||
import { styled } from '@mui/material/styles';
|
import { styled } from '@mui/material/styles';
|
||||||
|
|
||||||
import parseMilliseconds from 'parse-ms';
|
|
||||||
|
|
||||||
import { useSnackbar } from 'notistack';
|
import { useSnackbar } from 'notistack';
|
||||||
|
|
||||||
import RefreshIcon from '@mui/icons-material/Refresh';
|
import RefreshIcon from '@mui/icons-material/Refresh';
|
||||||
@@ -44,6 +42,8 @@ import DeviceIcon from './DeviceIcon';
|
|||||||
|
|
||||||
import { IconContext } from 'react-icons';
|
import { IconContext } from 'react-icons';
|
||||||
|
|
||||||
|
import { formatDurationMin, pluralize } from '../utils';
|
||||||
|
|
||||||
import { AuthenticatedContext } from '../contexts/authentication';
|
import { AuthenticatedContext } from '../contexts/authentication';
|
||||||
|
|
||||||
import { ButtonRow, FormLoader, ValidatedTextField, SectionContent, MessageBox } from '../components';
|
import { ButtonRow, FormLoader, ValidatedTextField, SectionContent, MessageBox } from '../components';
|
||||||
@@ -152,33 +152,15 @@ const DashboardData: FC = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const pluralize = (count: number, noun: string, suffix = 's') =>
|
|
||||||
` ${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? suffix : ''} `;
|
|
||||||
|
|
||||||
const formatDuration = (duration_min: number) => {
|
|
||||||
const { days, hours, minutes } = parseMilliseconds(duration_min * 60000);
|
|
||||||
let formatted = '';
|
|
||||||
if (days) {
|
|
||||||
formatted += pluralize(days, 'day');
|
|
||||||
}
|
|
||||||
if (hours) {
|
|
||||||
formatted += pluralize(hours, 'hour');
|
|
||||||
}
|
|
||||||
if (minutes) {
|
|
||||||
formatted += pluralize(minutes, 'minute');
|
|
||||||
}
|
|
||||||
return formatted;
|
|
||||||
};
|
|
||||||
|
|
||||||
function formatValue(value: any, uom: number) {
|
function formatValue(value: any, uom: number) {
|
||||||
if (value === undefined) {
|
if (value === undefined) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
switch (uom) {
|
switch (uom) {
|
||||||
case DeviceValueUOM.HOURS:
|
case DeviceValueUOM.HOURS:
|
||||||
return value ? formatDuration(value * 60) : '0 hours';
|
return value ? formatDurationMin(value * 60) : '0 hours';
|
||||||
case DeviceValueUOM.MINUTES:
|
case DeviceValueUOM.MINUTES:
|
||||||
return value ? formatDuration(value) : '0 minutes';
|
return value ? formatDurationMin(value) : '0 minutes';
|
||||||
case DeviceValueUOM.NONE:
|
case DeviceValueUOM.NONE:
|
||||||
if (typeof value === 'number') {
|
if (typeof value === 'number') {
|
||||||
return new Intl.NumberFormat().format(value);
|
return new Intl.NumberFormat().format(value);
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ import { ButtonRow, FormLoader, SectionContent } from '../components';
|
|||||||
|
|
||||||
import { Status, busConnectionStatus } from './types';
|
import { Status, busConnectionStatus } from './types';
|
||||||
|
|
||||||
|
import { formatDurationSec, pluralize } from '../utils';
|
||||||
|
|
||||||
import * as EMSESP from './api';
|
import * as EMSESP from './api';
|
||||||
|
|
||||||
import { extractErrorMessage, useRest } from '../utils';
|
import { extractErrorMessage, useRest } from '../utils';
|
||||||
@@ -66,27 +68,6 @@ const busStatus = ({ status }: Status) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const pluralize = (count: number, noun: string) =>
|
|
||||||
`${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? 's' : ''}`;
|
|
||||||
|
|
||||||
const formatDuration = (duration_sec: number) => {
|
|
||||||
if (duration_sec === 0) {
|
|
||||||
return ' ';
|
|
||||||
}
|
|
||||||
const roundTowardsZero = duration_sec > 0 ? Math.floor : Math.ceil;
|
|
||||||
return (
|
|
||||||
', ' +
|
|
||||||
roundTowardsZero(duration_sec / 86400) +
|
|
||||||
'd ' +
|
|
||||||
(roundTowardsZero(duration_sec / 3600) % 24) +
|
|
||||||
'h ' +
|
|
||||||
(roundTowardsZero(duration_sec / 60) % 60) +
|
|
||||||
'm ' +
|
|
||||||
(roundTowardsZero(duration_sec) % 60) +
|
|
||||||
's'
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const formatRow = (name: string, success: number, fail: number, quality: number) => {
|
const formatRow = (name: string, success: number, fail: number, quality: number) => {
|
||||||
if (success === 0 && fail === 0) {
|
if (success === 0 && fail === 0) {
|
||||||
return (
|
return (
|
||||||
@@ -182,7 +163,7 @@ const DashboardStatus: FC = () => {
|
|||||||
<DirectionsBusIcon />
|
<DirectionsBusIcon />
|
||||||
</Avatar>
|
</Avatar>
|
||||||
</ListItemAvatar>
|
</ListItemAvatar>
|
||||||
<ListItemText primary="EMS Bus Status" secondary={busStatus(data) + formatDuration(data.uptime)} />
|
<ListItemText primary="EMS Bus Status" secondary={busStatus(data) + formatDurationSec(data.uptime)} />
|
||||||
</ListItem>
|
</ListItem>
|
||||||
<ListItem>
|
<ListItem>
|
||||||
<ListItemAvatar>
|
<ListItemAvatar>
|
||||||
|
|||||||
@@ -18,23 +18,38 @@ export const formatLocalDateTime = (date: Date) => {
|
|||||||
return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, -1).substr(0, 19);
|
return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, -1).substr(0, 19);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const formatDuration = (duration: number) => {
|
export const pluralize = (count: number, noun: string) =>
|
||||||
const { days, hours, minutes, seconds } = parseMilliseconds(duration * 1000);
|
`${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? 's' : ''}`;
|
||||||
var formatted = '';
|
|
||||||
|
export const formatDurationMin = (duration_min: number) => {
|
||||||
|
const { days, hours, minutes } = parseMilliseconds(duration_min * 60000);
|
||||||
|
let formatted = '';
|
||||||
if (days) {
|
if (days) {
|
||||||
formatted += pluralize(days, 'day');
|
formatted += pluralize(days, 'day') + ' ';
|
||||||
}
|
}
|
||||||
if (formatted || hours) {
|
if (hours) {
|
||||||
formatted += pluralize(hours, 'hour');
|
formatted += pluralize(hours, 'hour') + ' ';
|
||||||
}
|
}
|
||||||
if (formatted || minutes) {
|
if (minutes) {
|
||||||
formatted += pluralize(minutes, 'minute');
|
formatted += pluralize(minutes, 'minute') + ' ';
|
||||||
}
|
|
||||||
if (formatted || seconds) {
|
|
||||||
formatted += pluralize(seconds, 'second');
|
|
||||||
}
|
}
|
||||||
return formatted;
|
return formatted;
|
||||||
};
|
};
|
||||||
|
|
||||||
const pluralize = (count: number, noun: string, suffix: string = 's') =>
|
export const formatDurationSec = (duration_sec: number) => {
|
||||||
` ${count} ${noun}${count !== 1 ? suffix : ''} `;
|
if (duration_sec === 0) {
|
||||||
|
return ' ';
|
||||||
|
}
|
||||||
|
const roundTowardsZero = duration_sec > 0 ? Math.floor : Math.ceil;
|
||||||
|
return (
|
||||||
|
', ' +
|
||||||
|
roundTowardsZero(duration_sec / 86400) +
|
||||||
|
'd ' +
|
||||||
|
(roundTowardsZero(duration_sec / 3600) % 24) +
|
||||||
|
'h ' +
|
||||||
|
(roundTowardsZero(duration_sec / 60) % 60) +
|
||||||
|
'm ' +
|
||||||
|
(roundTowardsZero(duration_sec) % 60) +
|
||||||
|
's'
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user