You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.9 KiB
142 lines
3.9 KiB
import React, { useEffect, useState } from 'react' |
|
import { RouteComponentProps, useHistory } from 'react-router-dom' |
|
import { getClient, killSession, restartSession, startSession } from '../api' |
|
import { SessionPictures } from '../components/SessionPictures' |
|
import { StatusChip } from '../components/StatusChip' |
|
|
|
import { |
|
Button, |
|
Input, |
|
InputNumber, |
|
message, |
|
Popconfirm, |
|
Row, |
|
Typography, |
|
} from 'antd' |
|
import { Content } from 'antd/lib/layout/layout' |
|
import { Client } from '../types' |
|
|
|
type Props = RouteComponentProps<{ clientId: string }> |
|
|
|
export const Session = (props: Props) => { |
|
const history = useHistory() |
|
const { clientId } = props.match.params |
|
const [client, setClient] = useState<Client | null>(null) |
|
const [active, setActive] = useState(false) |
|
const [lightTime, setLightTime] = useState( |
|
parseInt(window.localStorage.getItem('lightTime') || '5000'), |
|
) |
|
|
|
const handleTimingUpdate = (n: number) => { |
|
window.localStorage.setItem('lightTime', n.toString()) |
|
setLightTime(n) |
|
} |
|
|
|
const handleStartSession = async () => { |
|
message.loading('Photo sequence starting! Stand by...') |
|
await startSession(clientId, { light_time: lightTime }) |
|
setActive(true) |
|
} |
|
|
|
const handleRestartSession = async () => { |
|
setActive(false) |
|
message.loading( |
|
'Deleting photos & restarting capture sequence! Stand by...', |
|
) |
|
await restartSession(clientId, { light_time: lightTime }) |
|
setActive(true) |
|
} |
|
|
|
const handleExit = async () => { |
|
history.push('/') |
|
} |
|
|
|
const handleNuke = async () => { |
|
await killSession(clientId) |
|
message.success('Photos Deleted! Going back to dashboard') |
|
history.push('/') |
|
} |
|
|
|
useEffect(() => { |
|
const get = async () => { |
|
const client = await getClient(clientId) |
|
setClient(client) |
|
if (client.has_photos) setActive(true) |
|
} |
|
|
|
get() |
|
}, [clientId]) |
|
|
|
return ( |
|
<Content> |
|
<Typography.Title className="page-head" level={3}> |
|
Session View |
|
</Typography.Title> |
|
|
|
<Row className="client-info"> |
|
<Typography.Text> |
|
<strong>Name:</strong> {client?.name} |
|
</Typography.Text> |
|
<Typography.Text> |
|
<strong>Email:</strong> {client?.email} |
|
</Typography.Text> |
|
<Typography.Text> |
|
<strong>Phone:</strong> {client?.phone} |
|
</Typography.Text> |
|
</Row> |
|
<div className="toolbar"> |
|
<Row justify="center" className="session-toolbar"> |
|
<Button key="finish" onClick={handleExit}> |
|
Back To Dashboard |
|
</Button> |
|
<Button |
|
key="startsession" |
|
disabled={active} |
|
type="primary" |
|
onClick={handleStartSession} |
|
> |
|
Capture |
|
</Button> |
|
<Popconfirm |
|
disabled={!active} |
|
key="retry" |
|
title="Re-capture set?" |
|
onConfirm={handleRestartSession} |
|
> |
|
<Button type="default" disabled={!active}> |
|
Retry Capture |
|
</Button> |
|
</Popconfirm> |
|
<Popconfirm |
|
key="nuke" |
|
disabled={!active} |
|
title="Delete all photos and return to dashboard?" |
|
onConfirm={handleNuke} |
|
> |
|
<Button danger disabled={!active}> |
|
Abort Session |
|
</Button> |
|
</Popconfirm> |
|
|
|
<StatusChip poll={true} /> |
|
</Row> |
|
<Row className="session-toolbar"> |
|
<h3>Light Duration (ms)</h3> |
|
<InputNumber value={lightTime} onChange={handleTimingUpdate} /> |
|
<Input |
|
className="slider" |
|
type="range" |
|
onChange={(e) => handleTimingUpdate(parseInt(e.target.value))} |
|
value={lightTime} |
|
min={500} |
|
max={10000} |
|
step={500} |
|
/> |
|
</Row> |
|
</div> |
|
<Row className="controls"> |
|
{active && <SessionPictures clientId={clientId} />} |
|
</Row> |
|
</Content> |
|
) |
|
}
|
|
|