diff --git a/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx b/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx index 2d3faab1..d8915465 100644 --- a/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx +++ b/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx @@ -56,6 +56,7 @@ const createCsv = async ({ machineLogsCsv }) => { const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { const [state, setState] = useState(STATES.INITIAL) const [timestamp, setTimestamp] = useState(null) + const [diagnosticTimestamps, setDiagnosticTimestamps] = useState({}) const timeoutRef = useRef(null) const [fetchSummary, { loading }] = useLazyQuery(MACHINE_LOGS, { @@ -81,6 +82,10 @@ const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { timeoutRef.current = null } setTimestamp(data.machine.diagnostics.timestamp) + setDiagnosticTimestamps({ + front: data.machine.diagnostics.frontTimestamp, + scan: data.machine.diagnostics.scanTimestamp, + }) setState(STATES.FILLED) stopPolling() } @@ -95,8 +100,6 @@ const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { } }, []) - const path = `/operator-data/diagnostics/${deviceId}/` - const runDiagnostics = () => { setState(STATES.RUNNING) startPolling(2000) @@ -116,6 +119,18 @@ const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { const messageClass = 'm-auto flex flex-col items-center justify-center' + const showPhoto = diagnosticName => { + console.log(diagnosticName, diagnosticTimestamps) + return diagnosticTimestamps[diagnosticName] ? ( + + ) : ( + <>Failed getting photo + ) + } + return ( { {state === STATES.FILLED && (
-
+

Scan

- Failure getting photo + {showPhoto('scan')}

Front

- Failure getting photo -

+ {showPhoto('front')}
diff --git a/packages/server/lib/machine-loader.js b/packages/server/lib/machine-loader.js index 405f2fb9..8e822fad 100644 --- a/packages/server/lib/machine-loader.js +++ b/packages/server/lib/machine-loader.js @@ -61,11 +61,11 @@ function toMachineObject(r) { timestamp: r.diagnostics_timestamp ? new Date(r.diagnostics_timestamp) : null, - scanTimestamp: r.diagnostics_scan_timestamp - ? new Date(r.diagnostics_scan_timestamp) + scanTimestamp: r.diagnostics_scan_updated_at + ? new Date(r.diagnostics_scan_updated_at) : null, - frontTimestamp: r.diagnostics_front_timestamp - ? new Date(r.diagnostics_front_timestamp) + frontTimestamp: r.diagnostics_front_updated_at + ? new Date(r.diagnostics_front_updated_at) : null, }, pairedAt: new Date(r.created), @@ -676,24 +676,23 @@ function updateDiagnostics(deviceId, images) { ['scan.jpg', scan], ['front.jpg', front], ]) - .then(() => db.none(sql, [deviceId, !!scan, !!front])) + .then(([scan, front]) => db.none(sql, [deviceId, scan, front])) .catch(err => logger.error('while running machine diagnostics: ', err)) } const updateFailedQRScans = (deviceId, frames) => { const timestamp = new Date().toISOString() const directory = `${OPERATOR_DATA_DIR}/failedQRScans/${deviceId}/` - const filenames = _.map( - no => `${timestamp}-${no}.jpg`, - _.range(0, _.size(frames)), + return updatePhotos( + directory, + frames.map((frame, no) => [`${timestamp}-${no}.jpg`, frame]), ) - return updatePhotos(directory, _.zip(filenames, frames)) } function createPhoto(name, data, dir) { if (!data) { logger.error(`Diagnostics error: No data to save for ${name} photo`) - return Promise.resolve() + return Promise.reject() } const decodedImageData = Buffer.from(data, 'base64') @@ -704,9 +703,9 @@ function createPhoto(name, data, dir) { function updatePhotos(dir, photoPairs) { const dirname = path.join(dir) _.attempt(() => makeDir.sync(dirname)) - return Promise.all( + return Promise.allSettled( photoPairs.map(([filename, data]) => createPhoto(filename, data, dirname)), - ) + ).then(savedPhotos => savedPhotos.map(res => res.status === 'fulfilled')) } let pendingRecordPings = new Map()