From 258ed874ec65374007767590706bfd7bf6341a7c Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 1 Feb 2021 11:30:12 +0100 Subject: [PATCH] update ntp lib to moment --- interface/package-lock.json | 126 +++++++++++++-------------- interface/package.json | 10 +-- interface/src/ntp/NTPStatusForm.tsx | 21 +++-- interface/src/ntp/TimeFormat.ts | 48 +++++----- interface/src/ntp/types.ts | 1 - lib/framework/NTPSettingsService.cpp | 8 +- lib/framework/NTPStatus.cpp | 4 +- 7 files changed, 112 insertions(+), 106 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index a7a2438a4..f5beaf69b 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -1741,13 +1741,13 @@ } }, "@material-ui/core": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.2.tgz", - "integrity": "sha512-/D1+AQQeYX/WhT/FUk78UCRj8ch/RCglsQLYujYTIqPSJlwZHKcvHidNeVhODXeApojeXjkl0tWdk5C9ofwOkQ==", + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.3.tgz", + "integrity": "sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.2", - "@material-ui/system": "^4.11.2", + "@material-ui/styles": "^4.11.3", + "@material-ui/system": "^4.11.3", "@material-ui/types": "^5.1.0", "@material-ui/utils": "^4.11.2", "@types/react-transition-group": "^4.2.0", @@ -1768,9 +1768,9 @@ } }, "@material-ui/styles": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.2.tgz", - "integrity": "sha512-xbItf8zkfD3FuGoD9f2vlcyPf9jTEtj9YTJoNNV+NMWaSAHXgrW6geqRoo/IwBuMjqpwqsZhct13e2nUyU9Ljw==", + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.3.tgz", + "integrity": "sha512-HzVzCG+PpgUGMUYEJ2rTEmQYeonGh41BYfILNFb/1ueqma+p1meSdu4RX6NjxYBMhf7k+jgfHFTTz+L1SXL/Zg==", "requires": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", @@ -1779,21 +1779,21 @@ "clsx": "^1.0.4", "csstype": "^2.5.2", "hoist-non-react-statics": "^3.3.2", - "jss": "^10.0.3", - "jss-plugin-camel-case": "^10.0.3", - "jss-plugin-default-unit": "^10.0.3", - "jss-plugin-global": "^10.0.3", - "jss-plugin-nested": "^10.0.3", - "jss-plugin-props-sort": "^10.0.3", - "jss-plugin-rule-value-function": "^10.0.3", - "jss-plugin-vendor-prefixer": "^10.0.3", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", "prop-types": "^15.7.2" } }, "@material-ui/system": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.11.2.tgz", - "integrity": "sha512-BELFJEel5E+5DMiZb6XXT3peWRn6UixRvBtKwSxqntmD0+zwbbfCij6jtGwwdJhN1qX/aXrKu10zX31GBaeR7A==", + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.11.3.tgz", + "integrity": "sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.2", @@ -2165,9 +2165,9 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "@types/lodash": { - "version": "4.14.167", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz", - "integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==" + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" }, "@types/material-ui": { "version": "0.21.8", @@ -2184,9 +2184,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "12.19.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.14.tgz", - "integrity": "sha512-2U9uLN46+7dv9PiS8VQJcHhuoOjiDPZOLAt0WuA1EanEknIMae+2QbMhayF7cgGqjvRVIfNpt+6jLPczJZFiRw==" + "version": "12.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.15.tgz", + "integrity": "sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -9706,9 +9706,9 @@ } }, "jss": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.5.0.tgz", - "integrity": "sha512-B6151NvG+thUg3murLNHRPLxTLwQ13ep4SH5brj4d8qKtogOx/jupnpfkPGSHPqvcwKJaCLctpj2lEk+5yGwMw==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.5.1.tgz", + "integrity": "sha512-hbbO3+FOTqVdd7ZUoTiwpHzKXIo5vGpMNbuXH1a0wubRSWLWSBvwvaq4CiHH/U42CmjOnp6lVNNs/l+Z7ZdDmg==", "requires": { "@babel/runtime": "^7.3.1", "csstype": "^3.0.2", @@ -9725,70 +9725,70 @@ } }, "jss-plugin-camel-case": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.0.tgz", - "integrity": "sha512-GSjPL0adGAkuoqeYiXTgO7PlIrmjv5v8lA6TTBdfxbNYpxADOdGKJgIEkffhlyuIZHlPuuiFYTwUreLUmSn7rg==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.1.tgz", + "integrity": "sha512-9+oymA7wPtswm+zxVti1qiowC5q7bRdCJNORtns2JUj/QHp2QPXYwSNRD8+D2Cy3/CEMtdJzlNnt5aXmpS6NAg==", "requires": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", - "jss": "10.5.0" + "jss": "10.5.1" } }, "jss-plugin-default-unit": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.0.tgz", - "integrity": "sha512-rsbTtZGCMrbcb9beiDd+TwL991NGmsAgVYH0hATrYJtue9e+LH/Gn4yFD1ENwE+3JzF3A+rPnM2JuD9L/SIIWw==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.1.tgz", + "integrity": "sha512-D48hJBc9Tj3PusvlillHW8Fz0y/QqA7MNmTYDQaSB/7mTrCZjt7AVRROExoOHEtd2qIYKOYJW3Jc2agnvsXRlQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.5.0" + "jss": "10.5.1" } }, "jss-plugin-global": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.5.0.tgz", - "integrity": "sha512-FZd9+JE/3D7HMefEG54fEC0XiQ9rhGtDHAT/ols24y8sKQ1D5KIw6OyXEmIdKFmACgxZV2ARQ5pAUypxkk2IFQ==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.5.1.tgz", + "integrity": "sha512-jX4XpNgoaB8yPWw/gA1aPXJEoX0LNpvsROPvxlnYe+SE0JOhuvF7mA6dCkgpXBxfTWKJsno7cDSCgzHTocRjCQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.5.0" + "jss": "10.5.1" } }, "jss-plugin-nested": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.5.0.tgz", - "integrity": "sha512-ejPlCLNlEGgx8jmMiDk/zarsCZk+DV0YqXfddpgzbO9Toamo0HweCFuwJ3ZO40UFOfqKwfpKMVH/3HUXgxkTMg==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.5.1.tgz", + "integrity": "sha512-xXkWKOCljuwHNjSYcXrCxBnjd8eJp90KVFW1rlhvKKRXnEKVD6vdKXYezk2a89uKAHckSvBvBoDGsfZrldWqqQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.5.0", + "jss": "10.5.1", "tiny-warning": "^1.0.2" } }, "jss-plugin-props-sort": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.0.tgz", - "integrity": "sha512-kTLRvrOetFKz5vM88FAhLNeJIxfjhCepnvq65G7xsAQ/Wgy7HwO1BS/2wE5mx8iLaAWC6Rj5h16mhMk9sKdZxg==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.1.tgz", + "integrity": "sha512-t+2vcevNmMg4U/jAuxlfjKt46D/jHzCPEjsjLRj/J56CvP7Iy03scsUP58Iw8mVnaV36xAUZH2CmAmAdo8994g==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.5.0" + "jss": "10.5.1" } }, "jss-plugin-rule-value-function": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.0.tgz", - "integrity": "sha512-jXINGr8BSsB13JVuK274oEtk0LoooYSJqTBCGeBu2cG/VJ3+4FPs1gwLgsq24xTgKshtZ+WEQMVL34OprLidRA==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.1.tgz", + "integrity": "sha512-3gjrSxsy4ka/lGQsTDY8oYYtkt2esBvQiceGBB4PykXxHoGRz14tbCK31Zc6DHEnIeqsjMUGbq+wEly5UViStQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.5.0", + "jss": "10.5.1", "tiny-warning": "^1.0.2" } }, "jss-plugin-vendor-prefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.0.tgz", - "integrity": "sha512-rux3gmfwDdOKCLDx0IQjTwTm03IfBa+Rm/hs747cOw5Q7O3RaTUIMPKjtVfc31Xr/XI9Abz2XEupk1/oMQ7zRA==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.1.tgz", + "integrity": "sha512-cLkH6RaPZWHa1TqSfd2vszNNgxT1W0omlSjAd6hCFHp3KIocSrW21gaHjlMU26JpTHwkc+tJTCQOmE/O1A4FKQ==", "requires": { "@babel/runtime": "^7.3.1", "css-vendor": "^2.0.8", - "jss": "10.5.0" + "jss": "10.5.1" } }, "jsx-ast-utils": { @@ -12629,9 +12629,9 @@ "integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw==" }, "react-form-validator-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-form-validator-core/-/react-form-validator-core-1.0.0.tgz", - "integrity": "sha512-J+itG0oD/6VikXWJlOyjpoe3QaB35iX2WeFuQ1psxyJ5KkjMncBcOjUw/lemW8dYCOC7vQTFGUjlvwkGenTgig==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-form-validator-core/-/react-form-validator-core-1.0.1.tgz", + "integrity": "sha512-5saUtkeGhmjYoN3SeVtTyc+rO3Saxo8MzERQU9HHC+0bM1EIe24j62mYGk9aZv/eti51eRNOTZMmilIvSHt4LQ==", "requires": { "create-react-context": "^0.3.0", "promise-polyfill": "8.1.0", @@ -12650,12 +12650,12 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-material-ui-form-validator": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-material-ui-form-validator/-/react-material-ui-form-validator-2.1.1.tgz", - "integrity": "sha512-4+W6dbRVyfUnWPHaBWJTLo6LTyim/ZyCWre/GUuBalbH0l4KMlOO7VUcz+h9Vy4cTQT1/TQIxzdfitD5Y+nYMw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-material-ui-form-validator/-/react-material-ui-form-validator-2.1.2.tgz", + "integrity": "sha512-IyAB7rRbSIrwNtvOy+80C5CB3FX0rUqgNgXWCdJKGrGiJUAuhOrOqVjMSojNAoJppl0hX23nmW+MMdvEBIRvMQ==", "requires": { "prop-types": "^15.0.0", - "react-form-validator-core": "1.0.0" + "react-form-validator-core": "1.0.1" } }, "react-refresh": { diff --git a/interface/package.json b/interface/package.json index ff7354805..ff72a159e 100644 --- a/interface/package.json +++ b/interface/package.json @@ -3,10 +3,10 @@ "version": "0.1.0", "private": true, "dependencies": { - "@material-ui/core": "^4.11.2", + "@material-ui/core": "^4.11.3", "@material-ui/icons": "^4.11.2", - "@types/lodash": "^4.14.165", - "@types/node": "^12.12.32", + "@types/lodash": "^4.14.168", + "@types/node": "^12.19.15", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", "@types/react-material-ui-form-validator": "^2.1.0", @@ -21,8 +21,8 @@ "react": "^17.0.1", "react-dom": "^17.0.1", "react-dropzone": "^11.2.4", - "react-form-validator-core": "^1.0.0", - "react-material-ui-form-validator": "^2.1.1", + "react-form-validator-core": "^1.0.1", + "react-material-ui-form-validator": "^2.1.2", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", "react-scripts": "4.0.1", diff --git a/interface/src/ntp/NTPStatusForm.tsx b/interface/src/ntp/NTPStatusForm.tsx index 9972cf127..30a3cd9d7 100644 --- a/interface/src/ntp/NTPStatusForm.tsx +++ b/interface/src/ntp/NTPStatusForm.tsx @@ -13,7 +13,7 @@ import RefreshIcon from '@material-ui/icons/Refresh'; import { RestFormProps, FormButton, HighlightAvatar } from '../components'; import { isNtpActive, ntpStatusHighlight, ntpStatus } from './NTPStatus'; -import { formatDuration, formatDateTime, formatLocalDateTimeNow, formatLocalDateTime } from './TimeFormat'; +import { formatDuration, formatDateTime, formatLocalDateTime } from './TimeFormat'; import { NTPStatus, Time } from './types'; import { redirectingAuthorizedFetch, withAuthenticatedContext, AuthenticatedContextProps } from '../authentication'; import { TIME_ENDPOINT } from '../api'; @@ -38,18 +38,27 @@ class NTPStatusForm extends Component { } updateLocalTime = (event: React.ChangeEvent) => { - this.setState({ localTime: event.target.value }); + this.setState({ + localTime: event.target.value + }); } openSetTime = () => { - this.setState({ localTime: formatLocalDateTimeNow(), settingTime: true, }); + this.setState({ + localTime: formatLocalDateTime(new Date()), + settingTime: true + }); } closeSetTime = () => { - this.setState({ settingTime: false }); + this.setState({ + settingTime: false + }); } - createTime = (): Time => ({ local_time: formatLocalDateTime(this.state.localTime) }); + createTime = (): Time => ({ + local_time: formatLocalDateTime(new Date(this.state.localTime)) + }); configureTime = () => { this.setState({ processing: true }); @@ -185,4 +194,4 @@ class NTPStatusForm extends Component { } } -export default withAuthenticatedContext(withTheme(NTPStatusForm)); \ No newline at end of file +export default withAuthenticatedContext(withTheme(NTPStatusForm)); diff --git a/interface/src/ntp/TimeFormat.ts b/interface/src/ntp/TimeFormat.ts index 8aba12b5e..863771112 100644 --- a/interface/src/ntp/TimeFormat.ts +++ b/interface/src/ntp/TimeFormat.ts @@ -1,45 +1,45 @@ import parseMilliseconds from 'parse-ms'; -const LOCALE_FORMAT = new Intl.DateTimeFormat('default', { - day: 'numeric', - month: 'short', - year: 'numeric', - hour: 'numeric', - minute: 'numeric', - second: 'numeric', - hour12: false -}); +const LOCALE_FORMAT = new Intl.DateTimeFormat( + [...window.navigator.languages], + { + day: 'numeric', + month: 'short', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false + } +); export const formatDateTime = (dateTime: string) => { return LOCALE_FORMAT.format(new Date(dateTime.substr(0, 19))); } -export const formatLocalDateTimeNow = () => { - return formatIsoDateTime(new Date()).substr(0, 19); -} - -export const formatLocalDateTime = (dateTime: string) => { - return formatIsoDateTime(new Date(dateTime)).substr(0, 19); -} - -export const formatIsoDateTime = (date: Date) => { - return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, -1); +export const formatLocalDateTime = (date: Date) => { + return new Date(date.getTime() - date.getTimezoneOffset() * 60000) + .toISOString() + .slice(0, -1) + .substr(0, 19); } export const formatDuration = (duration: number) => { const { days, hours, minutes, seconds } = parseMilliseconds(duration * 1000); var formatted = ''; if (days) { - formatted += days + ' days '; + formatted += pluralize(days, 'day'); } if (formatted || hours) { - formatted += hours + ' hours '; + formatted += pluralize(hours, 'hour'); } if (formatted || minutes) { - formatted += minutes + ' minutes '; + formatted += pluralize(minutes, 'minute'); } if (formatted || seconds) { - formatted += seconds + ' seconds'; + formatted += pluralize(seconds, 'second'); } return formatted; -} \ No newline at end of file +} + +const pluralize = (count: number, noun: string, suffix: string = 's') => ` ${count} ${noun}${count !== 1 ? suffix : ''} `; diff --git a/interface/src/ntp/types.ts b/interface/src/ntp/types.ts index a0e25f3a8..4a19da6e7 100644 --- a/interface/src/ntp/types.ts +++ b/interface/src/ntp/types.ts @@ -1,4 +1,3 @@ - export enum NTPSyncStatus { NTP_INACTIVE = 0, NTP_ACTIVE = 1 diff --git a/lib/framework/NTPSettingsService.cpp b/lib/framework/NTPSettingsService.cpp index 73a03a78d..b19d7c8c2 100644 --- a/lib/framework/NTPSettingsService.cpp +++ b/lib/framework/NTPSettingsService.cpp @@ -52,10 +52,9 @@ void NTPSettingsService::configureNTP() { void NTPSettingsService::configureTime(AsyncWebServerRequest * request, JsonVariant & json) { if (!sntp_enabled() && json.is()) { - String timeUtc = json["time_utc"]; - struct tm tm = {0}; - - char * s = strptime(timeUtc.c_str(), "%Y-%m-%dT%H:%M:%SZ", &tm); + struct tm tm = {0}; + String timeLocal = json["local_time"]; + char * s = strptime(timeLocal.c_str(), "%Y-%m-%dT%H:%M:%S", &tm); if (s != nullptr) { time_t time = mktime(&tm); struct timeval now = {.tv_sec = time}; @@ -65,7 +64,6 @@ void NTPSettingsService::configureTime(AsyncWebServerRequest * request, JsonVari return; } } - AsyncWebServerResponse * response = request->beginResponse(400); request->send(response); } diff --git a/lib/framework/NTPStatus.cpp b/lib/framework/NTPStatus.cpp index 125dcd316..19c8449df 100644 --- a/lib/framework/NTPStatus.cpp +++ b/lib/framework/NTPStatus.cpp @@ -36,14 +36,14 @@ void NTPStatus::ntpStatus(AsyncWebServerRequest * request) { // the current time in UTC root["utc_time"] = toUTCTimeString(gmtime(&now)); - // local time as ISO String with TZ + // local time with offset root["local_time"] = toLocalTimeString(localtime(&now)); // the sntp server name root["server"] = sntp_getservername(0); // device uptime in seconds - root["uptime"] = uuid::get_uptime() / 1000; + root["uptime"] = millis() / 1000; response->setLength(); request->send(response);