87 lines
2.2 KiB
TypeScript
87 lines
2.2 KiB
TypeScript
import React, { useEffect, useState } from 'react'
|
|
import { Card, Modal, Row, Spin, Typography } from 'antd'
|
|
import { getSession } from '../api'
|
|
|
|
type Props = {
|
|
clientId: string
|
|
}
|
|
|
|
export const SessionPictures = ({ clientId }: Props) => {
|
|
const [urls, setUrls] = useState<string[] | null>(null)
|
|
const [activeUrl, setActiveUrl] = useState<string | null>(null)
|
|
|
|
useEffect(() => {
|
|
const get = async () => {
|
|
if (urls && urls.length >= 89 * 1) {
|
|
return
|
|
}
|
|
|
|
const { photos } = await getSession(clientId)
|
|
if (photos.length) setUrls(photos)
|
|
}
|
|
|
|
const interval = setInterval(get, 250)
|
|
|
|
return () => clearInterval(interval)
|
|
}, [clientId, urls])
|
|
|
|
const closeModal = () => setActiveUrl(null)
|
|
|
|
const host =
|
|
process.env.NODE_ENV === 'development' ? 'http://192.168.1.107:5000' : ''
|
|
|
|
if (!urls?.length) return null
|
|
|
|
const u = urls.length / 89
|
|
|
|
return (
|
|
<>
|
|
<Modal
|
|
visible={!!activeUrl}
|
|
onOk={closeModal}
|
|
cancelText={null}
|
|
onCancel={closeModal}
|
|
width="50%"
|
|
>
|
|
<img
|
|
width="100%"
|
|
onClick={closeModal}
|
|
src={`${host}/output/${clientId}/${activeUrl}`}
|
|
alt="large modal"
|
|
></img>
|
|
</Modal>
|
|
<Row align="middle" justify="center">
|
|
<Typography.Title level={3}>Session Pictures</Typography.Title>
|
|
<Typography.Text>{urls.length}/ 89 loaded</Typography.Text>
|
|
</Row>
|
|
|
|
<div className="loading-bar-container">
|
|
<div
|
|
className="loading-bar"
|
|
style={{
|
|
width: `${u * 100}%`,
|
|
background: `hsl(${Math.floor(1 * 120)}, 90%, 70%)`,
|
|
}}
|
|
></div>
|
|
</div>
|
|
<div className="photo-wall">
|
|
{urls ? (
|
|
urls
|
|
.sort((a, b) => a.split('_')[0].localeCompare(b.split('_')[0]))
|
|
.map((src) => (
|
|
<Card key={src} className="photo" title={src.split('_')[0]}>
|
|
<img
|
|
onClick={() => setActiveUrl(src)}
|
|
src={`${host}/output/${clientId}/${src}`}
|
|
alt="lol"
|
|
/>
|
|
</Card>
|
|
))
|
|
) : (
|
|
<Spin />
|
|
)}
|
|
</div>
|
|
</>
|
|
)
|
|
}
|