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.
 
 
 
 

1 lines
15 KiB

{"version":3,"sources":["settings.ts","api/index.ts","pages/Dashboard.tsx","pages/SessionPictures.tsx","pages/Session.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["settings","axios","defaults","baseURL","createClient","body","a","post","res","data","client_id","getClient","id","get","startSession","clientId","getSession","killSession","delete","restartSession","Dashboard","history","useHistory","useState","error","setError","name","setName","email","setEmail","phone","setPhone","handleSubmit","e","preventDefault","length","message","parseInt","push","onSubmit","htmlFor","minLength","value","onChange","target","type","onClick","className","SessionPictures","urls","setUrls","activeUrl","setActiveUrl","useEffect","interval","setInterval","photos","clearInterval","closeModal","host","visible","onOk","cancelText","onCancel","width","src","alt","sort","b","split","localeCompare","map","title","Session","props","match","params","setClient","active","setActive","handleStartSession","loading","handleRestartSession","handleExit","handleNuke","success","client","has_photos","ghost","onBack","goBack","tags","color","subTitle","extra","disabled","onConfirm","danger","App","path","component","exact","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","document","getElementById"],"mappings":"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","file":"static/js/main.f00f7f92.chunk.js","sourcesContent":["export default {\n env: 'prod',\n}\n","import { Client } from '../types'\nimport axios from 'axios'\nimport settings from '../settings'\n\nif (settings.env === 'jank') {\n const host = 'http://192.168.1.107:5000'\n axios.defaults.baseURL = host\n}\n\nexport const createClient = async (body: Omit<Client, 'has_photos'>) => {\n const res = await axios.post<{ client_id: string }>(`/api/clients`, body)\n return res.data.client_id\n}\n\nexport const getClient = async (id: string): Promise<Client> => {\n const res = await axios.get<Client>(`/api/clients/${id}`)\n return res.data\n}\nexport const startSession = async (clientId: string) => {\n const res = await axios.post(`/api/clients/${clientId}/session`)\n return res.data // session data\n}\n\nexport const getSession = async (clientId: string) => {\n const res = await axios.get<{ photos: string[] }>(\n `/api/clients/${clientId}/session`,\n )\n return res.data // session data\n}\n\nexport const killSession = async (clientId: string) => {\n await axios.delete(`/api/clients/${clientId}/session`)\n}\n\nexport const restartSession = async (clientId: string) => {\n await killSession(clientId)\n await startSession(clientId)\n}\n\n// Someday\n\nexport const getClients = async (): Promise<Client[]> => {\n const res = await axios.get<Client[]>(`/api/clients`)\n return res.data\n}\n\nexport const cleanup = () => {\n // send\n}\n","import { message } from 'antd'\nimport { Content } from 'antd/lib/layout/layout'\nimport React, { FormEvent } from 'react'\nimport { useState } from 'react'\nimport { useHistory } from 'react-router-dom'\nimport { createClient } from '../api'\n\nexport const Dashboard = () => {\n const history = useHistory()\n const [error, setError] = useState<string | null>(null)\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [phone, setPhone] = useState('')\n\n const handleReset = () => {\n //\n setName('')\n setEmail('')\n setPhone('')\n }\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n\n if (phone.length < 10) {\n // helpful message\n message.error('Check all fields!')\n setError('Phone number needs to be a length of at least 10')\n return\n }\n\n const client_id = await createClient({\n name,\n email,\n phone: parseInt(phone),\n })\n\n history.push(`/sessions/${client_id}`)\n }\n\n return (\n <Content>\n <h1>Dashboard</h1>\n <form onSubmit={handleSubmit}>\n <label htmlFor=\"name\">\n Name:\n <input\n minLength={3}\n value={name}\n onChange={(e) => setName(e.target.value)}\n name=\"name\"\n />\n </label>\n <label htmlFor=\"email\">\n Email:\n <input\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n type=\"email\"\n name=\"email\"\n />\n </label>\n <label htmlFor=\"phone\">\n Phone:\n <input\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n type=\"tel\"\n name=\"phone\"\n />\n </label>\n <button type=\"submit\">Start Session</button>\n <button type=\"button\" onClick={handleReset}>\n Reset\n </button>\n {error && <p className=\"error\">{error}</p>}\n </form>\n </Content>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Card, Modal, Spin } from 'antd'\nimport { getSession } from '../api'\nimport settings from '../settings'\n\ntype Props = {\n clientId: string\n}\n\nexport const SessionPictures = ({ clientId }: Props) => {\n const [urls, setUrls] = useState<string[] | null>(null)\n const [activeUrl, setActiveUrl] = useState<string | null>(null)\n\n useEffect(() => {\n const get = async () => {\n if (urls) return\n\n const { photos } = await getSession(clientId)\n if (photos.length) setUrls(photos)\n }\n\n const interval = setInterval(get, 250)\n\n return () => clearInterval(interval)\n }, [clientId, urls])\n\n const closeModal = () => setActiveUrl(null)\n\n const host = settings.env === 'jank' ? 'http://192.168.1.107:5000' : ''\n\n if (!urls?.length) return null\n\n return (\n <>\n <Modal\n visible={!!activeUrl}\n onOk={closeModal}\n cancelText={null}\n onCancel={closeModal}\n width=\"50%\"\n >\n <img\n width=\"100%\"\n onClick={closeModal}\n src={`${host}/output/${clientId}/${activeUrl}`}\n alt=\"large image\"\n ></img>\n </Modal>\n <div>\n <h3>Session Pictures</h3>\n <div className=\"photo-wall\">\n {urls ? (\n urls\n .sort((a, b) => a.split('_')[0].localeCompare(b.split('_')[0]))\n .map((src) => (\n <Card className=\"photo\" title={src.split('_')[0]}>\n <img\n onClick={() => setActiveUrl(src)}\n key={src}\n id={src}\n src={`${host}/output/${clientId}/${src}`}\n alt=\"lol\"\n />\n </Card>\n ))\n ) : (\n <Spin />\n )}\n </div>\n </div>\n </>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { RouteComponentProps, useHistory } from 'react-router-dom'\nimport { getClient, killSession, restartSession, startSession } from '../api'\nimport { SessionPictures } from './SessionPictures'\nimport {\n Button,\n Divider,\n message,\n PageHeader,\n Popconfirm,\n Row,\n Tag,\n} from 'antd'\nimport { Content } from 'antd/lib/layout/layout'\nimport { Client } from '../types'\n\ntype Props = RouteComponentProps<{ clientId: string }>\n\nexport const Session = (props: Props) => {\n const history = useHistory()\n const { clientId } = props.match.params\n const [client, setClient] = useState<Client | null>(null)\n const [active, setActive] = useState(false)\n\n const handleStartSession = async () => {\n message.loading('Photo sequence starting! Stand by...')\n await startSession(clientId)\n setActive(true)\n }\n\n const handleRestartSession = async () => {\n setActive(false)\n message.loading(\n 'Deleting photos & restarting capture sequence! Stand by...',\n )\n await restartSession(clientId)\n setActive(true)\n }\n\n const handleExit = async () => {\n history.push('/')\n }\n\n const handleNuke = async () => {\n await killSession(clientId)\n message.success('Photos Deleted! Going back to dashboard')\n history.push('/')\n }\n\n useEffect(() => {\n const get = async () => {\n const client = await getClient(clientId)\n setClient(client)\n if (client.has_photos) setActive(true)\n }\n\n get()\n }, [clientId])\n\n return (\n <Content>\n <PageHeader\n ghost={false}\n onBack={() => history.goBack()}\n title={`Session for ${clientId}`}\n tags={active ? <Tag color=\"lime\">Active</Tag> : <Tag>Inactive</Tag>}\n subTitle={`session has ${active ? 'started' : 'not started'}`}\n extra={[\n <Button\n key=\"startsession\"\n disabled={active}\n type=\"primary\"\n onClick={handleStartSession}\n >\n Capture\n </Button>,\n <Popconfirm\n key=\"retry\"\n title=\"Re-capture set?\"\n onConfirm={handleRestartSession}\n >\n <Button type=\"default\" disabled={!active}>\n Retry Capture\n </Button>\n </Popconfirm>,\n <Popconfirm\n key=\"nuke\"\n title=\"Delete all photos?\"\n onConfirm={handleNuke}\n >\n <Button danger disabled={!active}>\n Nuke Session\n </Button>\n </Popconfirm>,\n <Button\n key=\"finish\"\n ghost\n type=\"primary\"\n disabled={!active}\n onClick={handleExit}\n >\n Finish Session\n </Button>,\n ]}\n ></PageHeader>\n <Divider />\n <Row className=\"controls\">\n <SessionPictures clientId={clientId} />\n </Row>\n </Content>\n )\n}\n","import React from 'react'\nimport './App.css'\n\nimport { BrowserRouter, Switch, Route } from 'react-router-dom'\nimport { Dashboard } from './pages/Dashboard'\nimport { Session } from './pages/Session'\n\nfunction App() {\n return (\n <BrowserRouter>\n <div className=\"App\">\n <Switch>\n <Route path=\"/sessions/:clientId\" component={Session} />\n <Route exact path=\"/\" component={Dashboard} />\n </Switch>\n </div>\n </BrowserRouter>\n )\n}\n\nexport default App\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport 'antd/dist/antd.css'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(<App />, document.getElementById('root'))\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}