import { useLazyQuery, useQuery } from '@apollo/react-hooks' import { makeStyles } from '@material-ui/core/styles' import { subMinutes } from 'date-fns' import FileSaver from 'file-saver' import gql from 'graphql-tag' import React, { useState, useEffect } from 'react' import Modal from 'src/components/Modal' import { Button } from 'src/components/buttons' import { H3, P } from 'src/components/typography' import { URI } from 'src/utils/apollo' import { diagnosticsModal } from './MachineActions.styles' const useStyles = makeStyles(diagnosticsModal) const STATES = { INITIAL: 'INITIAL', EMPTY: 'EMPTY', RUNNING: 'RUNNING', FAILURE: 'FAILURE', FILLED: 'FILLED' } const MACHINE = gql` query getMachine($deviceId: ID!) { machine(deviceId: $deviceId) { diagnostics { timestamp frontTimestamp scanTimestamp } } } ` const MACHINE_LOGS = gql` query machineLogsCsv( $deviceId: ID! $limit: Int $from: Date $until: Date $timezone: String ) { machineLogsCsv( deviceId: $deviceId limit: $limit from: $from until: $until timezone: $timezone ) } ` const createCsv = async ({ machineLogsCsv }) => { console.log(machineLogsCsv) const machineLogs = new Blob([machineLogsCsv], { type: 'text/plain;charset=utf-8' }) FileSaver.saveAs(machineLogs, 'machineLogs.csv') } const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { const classes = useStyles() const [state, setState] = useState(STATES.INITIAL) const [timestamp, setTimestamp] = useState(null) let timeout = null const [fetchSummary, { loading }] = useLazyQuery(MACHINE_LOGS, { onCompleted: data => createCsv(data) }) const { data, stopPolling, startPolling } = useQuery(MACHINE, { variables: { deviceId } }) useEffect(() => { if (!data) return if (!timestamp && !data.machine.diagnostics.timestamp) { stopPolling() setState(STATES.EMPTY) } if ( data.machine.diagnostics.timestamp && data.machine.diagnostics.timestamp !== timestamp ) { clearTimeout(timeout) setTimestamp(data.machine.diagnostics.timestamp) setState(STATES.FILLED) stopPolling() } }, [data, stopPolling, timeout, timestamp]) const path = `${URI}/operator-data/diagnostics/${deviceId}/` function runDiagnostics() { startPolling(2000) timeout = setTimeout(() => { setState(STATES.FAILURE) stopPolling() }, 60 * 1000) setState(STATES.RUNNING) sendAction() } return ( {state === STATES.INITIAL && (

Loading...

)} {state === STATES.EMPTY && (

No diagnostics available

Run diagnostics to generate a report

)} {state === STATES.RUNNING && (

Running Diagnostics...

This page should refresh automatically

)} {state === STATES.FAILURE && (

Failed to run diagnostics

Please try again. If the problem persists, contact support.

)} {state === STATES.FILLED && (

Scan

Failure getting photo

Front

Failure getting photo

Diagnostics executed at: {timestamp}

)}
) } export default DiagnosticsModal