import Page, {PageBody, PageFlexColumn, PageFlexRow} from "../primitives/page/Page"; import Header, {HeaderButton, HeaderTitle} from "../primitives/header/Header"; import {TitleLine} from "../primitives/misc/Misc"; import {Size} from "../models/Shared"; import Blob, {BlobInput, BlobText} from "../primitives/blob/Blob"; import {Icon} from "../primitives/Shared"; import { faChain, faCheck, faChevronDown, faChevronLeft, faChevronUp, faMessage, faPencilAlt, faTag, faTrashCan } from "@fortawesome/free-solid-svg-icons"; import {useCallback, useContext, useEffect, useMemo, useState} from "react"; import LoadingPage from "./LoadingPage"; import {useNavigate, useParams} from "react-router"; import DeviceContext from "../contexts/DeviceContext"; import {useSearchParams} from "react-router-dom"; import {Device} from "../models/Devices"; import deviceRepo from "../actions/devices"; import RuntimeContext from "../contexts/RuntimeContext"; interface DevicePageProps { edit?: boolean } export default function DevicePage({edit}: DevicePageProps): JSX.Element { const {devices} = useContext(DeviceContext); const navigate = useNavigate(); const {id} = useParams(); const [search] = useSearchParams(); const device = useMemo(() => devices?.find(d => d.id === id) || null, [devices]); if (edit && id === undefined) { return ; } else if (edit && device) { return ; } else if (device !== null) { return ; } else { if (devices !== null) { navigate("/"); } return ; } } function NewDevicePage(): JSX.Element { const navigate = useNavigate(); const {refreshDevices} = useContext(DeviceContext); const [name, setName] = useState(""); const [connectionString, setConnectionString] = useState(""); const [wait, setWait] = useState(); const onSave = useCallback(async () => { setWait(true); if (await deviceRepo().save({name, connectionString})) { refreshDevices(); navigate("/"); } else { setWait(false); } }, [name, connectionString]); if (wait) { return ; } return (
navigate("/")}> Ny enhet
Enhet Navn Adresse Lagre
); } interface EditDevicePageProps { device: Device } function EditDevicePage({device}: EditDevicePageProps): JSX.Element { const navigate = useNavigate(); const {refreshDevices} = useContext(DeviceContext); const [name, setName] = useState(device.name); const [connectionString, setConnectionString] = useState(device.connectionString); const [wait, setWait] = useState(); const onSave = useCallback(async () => { setWait(true); if (await deviceRepo().save({id: device.id, name, connectionString})) { refreshDevices(); navigate(`/devices/${device.id}`); } else { setWait(false); } }, [device, name, connectionString]); if (wait) { return ; } return (
navigate(`/devices/${device.id}`)}> Endre «{device.name}»
Enhet Navn Adresse Lagre
); } interface ViewDevicePageProps { device: Device } function ViewDevicePage({device}: ViewDevicePageProps): JSX.Element { const navigate = useNavigate(); const {refreshDevices} = useContext(DeviceContext); const {active, ended, error, create} = useContext(RuntimeContext); const onDelete = useCallback(() => { if (!window.confirm("Vil du fjerne denne enheten?")) return; deviceRepo().delete(device.id).then(() => { refreshDevices(); navigate("/"); }) }, [device, navigate, refreshDevices]); return (
navigate("/")}> {device.name}
Enhet {device.name} {device.connectionString} navigate(`/devices/${device.id}/edit`)}> Test {active && !ended ? : ( create({deviceId: device.id, test: true})} > {ended && error && Prøv igjen} {ended && !error && Vellykket} {!ended && Kjør} )}
); } interface Event { createdAt: string, type: "up" | "down" | "log", message: string } function currentTime(): string { return (new Date().toTimeString().substring(0, 8)); } function TestSection(): JSX.Element { const {lastEvent, connect, disconnect, start, stop} = useContext(RuntimeContext); const [events, setEvents] = useState([]); useEffect(() => { const timeouts: number[] = []; if (lastEvent) { const createdAt = (new Date().toTimeString().substring(0, 8)); if (lastEvent.workout) { setEvents(prev => [ ...prev, {createdAt, type: "down", message: `Opprettet økt ${lastEvent.workout!.id}`}, {createdAt, type: "log", message: "Vil koble til umiddelbart"}, ]); } if (lastEvent.workoutStates && lastEvent.workoutStates.length > 0) { const last = lastEvent.workoutStates[lastEvent.workoutStates.length - 1]; setEvents(prev => [...prev, { createdAt, type: "down", message: `Ny tilstand: ${last.time} s, ${last.calories} kcal`, }]) } if (lastEvent.event) { setEvents(prev => [ ...prev, {createdAt, type: "down", message: `Ny hendelse: ${lastEvent.event!.name}`}, ]); if (lastEvent.event.name === "Connected") { setEvents(prev => [ ...prev, {createdAt, type: "log", message: "Vil starte om 5 sekunder..."}, ]); timeouts.push(setTimeout(() => { setEvents(prev => [ ...prev, {createdAt: currentTime(), type: "up", message: "Starter"}, ]); start(); }, 5000)); } if (lastEvent.event.name === "Started") { setEvents(prev => [ ...prev, {createdAt, type: "log", message: "Vil stoppe om 30 sekunder..."}, ]); timeouts.push(setTimeout(() => { setEvents(prev => [ ...prev, {createdAt: currentTime(), type: "up", message: "Stopper"}, ]); stop(); }, 30000)); } if (lastEvent.event.name === "Stopped") { setEvents(prev => [ ...prev, {createdAt, type: "log", message: "Vil koble fra om 5 sekunder..."}, ]); timeouts.push(setTimeout(() => { setEvents(prev => [ ...prev, {createdAt: currentTime(), type: "up", message: "Kobler fra"}, ]); disconnect(); }, 5000)); } if (lastEvent.event.name === "Disconnected") { setEvents(prev => [ ...prev, {createdAt, type: "log", message: "Frakoblet"}, ]); } } } else { setEvents([]); } }, [lastEvent]); return ( <> {events.map((e, i) => ( {e.createdAt} {e.type === "up" && } {e.type === "down" && } {e.type === "log" && } {e.message} ))}
); }