import Heading from '../components/Heading'; import { useState } from 'preact/hooks'; import useSWR, { mutate } from 'swr'; import Button from '../components/Button'; import axios from 'axios'; import { baseUrl } from '../api/baseUrl'; import { Fragment } from 'preact'; import ActivityIndicator from '../components/ActivityIndicator'; import { Play } from '../icons/Play'; import { Delete } from '../icons/Delete'; import LargeDialog from '../components/DialogLarge'; import VideoPlayer from '../components/VideoPlayer'; import Dialog from '../components/Dialog'; export default function Export() { const { data: config } = useSWR('config'); const { data: exports } = useSWR('exports/', (url) => axios({ baseURL: baseUrl, url }).then((res) => res.data)); // Export States const [camera, setCamera] = useState('select'); const [playback, setPlayback] = useState('select'); const [message, setMessage] = useState({ text: '', error: false }); const currentDate = new Date(); currentDate.setHours(0, 0, 0, 0); const offsetMs = currentDate.getTimezoneOffset() * 60 * 1000; const localDate = new Date(currentDate.getTime() - offsetMs); const localISODate = localDate.toISOString().split('T')[0]; const [startDate, setStartDate] = useState(localISODate); const [startTime, setStartTime] = useState('00:00:00'); const [endDate, setEndDate] = useState(localISODate); const [endTime, setEndTime] = useState('23:59:59'); // Export States const [selectedClip, setSelectedClip] = useState(); const [deleteClip, setDeleteClip] = useState(); const onHandleExport = () => { if (camera == 'select') { setMessage({ text: 'A camera needs to be selected.', error: true }); return; } if (playback == 'select') { setMessage({ text: 'A playback factor needs to be selected.', error: true }); return; } if (!startDate || !startTime || !endDate || !endTime) { setMessage({ text: 'A start and end time needs to be selected', error: true }); return; } const start = new Date(`${startDate}T${startTime}`).getTime() / 1000; const end = new Date(`${endDate}T${endTime}`).getTime() / 1000; if (end <= start) { setMessage({ text: 'The end time must be after the start time.', error: true }); return; } axios .post(`export/${camera}/start/${start}/end/${end}`, { playback }) .then((response) => { if (response.status == 200) { setMessage({ text: 'Successfully started export. View the file in the /exports folder.', error: false }); } }) .catch((error) => { if (error.response?.data?.message) { setMessage({ text: `Failed to start export: ${error.response.data.message}`, error: true }); } else { setMessage({ text: `Failed to start export: ${error.message}`, error: true }); } }); }; const onHandleDelete = (clip) => { axios.delete(`export/${clip}`).then((response) => { if (response.status == 200) { setDeleteClip(); mutate(); } }); }; return (
Export {message.text && (
{message.text}
)} {selectedClip && (
Playback { this.player = player; }} onDispose={() => { this.player = null; }} />
)} {deleteClip && (
Delete Export?

Confirm deletion of {deleteClip}.

)}
From: setStartDate(e.target.value)} /> setStartTime(e.target.value)} /> To: setEndDate(e.target.value)} /> setEndTime(e.target.value)} />
{exports && (
Exports setSelectedClip(clip)} onDeleteClip={(clip) => setDeleteClip(clip)} />
)}
); } function Exports({ exports, onSetClip, onDeleteClip }) { return ( {exports.map((item) => (
{item.name.startsWith('in_progress') ? (
{item.name.substring(12, item.name.length - 4)}
) : (
{item.name.substring(0, item.name.length - 4)}
)}
))}
); }