2022-04-15 15:23:02 +03:00
import { h , Fragment } from 'preact' ;
2021-02-08 00:46:05 +03:00
import ActivityIndicator from '../components/ActivityIndicator' ;
import Card from '../components/Card' ;
import CameraImage from '../components/CameraImage' ;
2021-02-18 07:53:57 +03:00
import ClipIcon from '../icons/Clip' ;
import MotionIcon from '../icons/Motion' ;
import SnapshotIcon from '../icons/Snapshot' ;
2022-11-24 05:03:20 +03:00
import { useDetectState , useRecordingsState , useSnapshotsState } from '../api/ws' ;
2021-02-02 07:28:25 +03:00
import { useMemo } from 'preact/hooks' ;
2022-02-26 22:11:00 +03:00
import useSWR from 'swr' ;
2021-01-09 20:26:46 +03:00
export default function Cameras ( ) {
2022-02-26 22:11:00 +03:00
const { data : config } = useSWR ( 'config' ) ;
2021-01-09 20:26:46 +03:00
2022-02-26 22:11:00 +03:00
return ! config ? (
2021-02-09 22:35:33 +03:00
< ActivityIndicator / >
) : (
2022-02-27 17:04:12 +03:00
< div className = "grid grid-cols-1 3xl:grid-cols-3 md:grid-cols-2 gap-4 p-2 px-4" >
2023-05-15 15:36:26 +03:00
< SortedCameras config = { config } unsortedCameras = { config . cameras } / >
2022-04-15 15:23:02 +03:00
< / div >
) ;
}
2023-05-15 15:36:26 +03:00
function SortedCameras ( { config , unsortedCameras } ) {
2022-04-25 14:59:52 +03:00
const sortedCameras = useMemo (
( ) =>
Object . entries ( unsortedCameras )
. filter ( ( [ _ , conf ] ) => conf . ui . dashboard )
. sort ( ( [ _ , aConf ] , [ _ _ , bConf ] ) => aConf . ui . order - bConf . ui . order ) ,
[ unsortedCameras ]
) ;
2022-04-15 15:23:02 +03:00
return (
< Fragment >
{ sortedCameras . map ( ( [ camera , conf ] ) => (
2023-05-15 15:36:26 +03:00
< Camera key = { camera } name = { camera } config = { config . cameras [ camera ] } conf = { conf } / >
2021-01-09 20:26:46 +03:00
) ) }
2022-04-15 15:23:02 +03:00
< / Fragment >
2021-01-09 20:26:46 +03:00
) ;
}
2023-05-15 15:36:26 +03:00
function Camera ( { name , config } ) {
2021-02-18 07:53:57 +03:00
const { payload : detectValue , send : sendDetect } = useDetectState ( name ) ;
2021-07-11 22:49:10 +03:00
const { payload : recordValue , send : sendRecordings } = useRecordingsState ( name ) ;
2021-02-18 07:53:57 +03:00
const { payload : snapshotValue , send : sendSnapshots } = useSnapshotsState ( name ) ;
2021-01-09 20:26:46 +03:00
const href = ` /cameras/ ${ name } ` ;
2021-06-06 03:40:52 +03:00
const buttons = useMemo ( ( ) => {
2022-02-26 22:11:00 +03:00
return [
2023-01-04 04:32:56 +03:00
{ name : 'Events' , href : ` /events?cameras= ${ name } ` } ,
2022-02-26 22:11:00 +03:00
{ name : 'Recordings' , href : ` /recording/ ${ name } ` } ,
] ;
2022-02-12 22:51:28 +03:00
} , [ name ] ) ;
2022-08-25 14:44:34 +03:00
const cleanName = useMemo (
( ) => { return ` ${ name . replaceAll ( '_' , ' ' ) } ` } ,
[ name ]
) ;
2021-02-18 07:53:57 +03:00
const icons = useMemo (
( ) => [
{
name : ` Toggle detect ${ detectValue === 'ON' ? 'off' : 'on' } ` ,
icon : MotionIcon ,
color : detectValue === 'ON' ? 'blue' : 'gray' ,
onClick : ( ) => {
2022-04-25 14:59:52 +03:00
sendDetect ( detectValue === 'ON' ? 'OFF' : 'ON' , true ) ;
2021-02-18 07:53:57 +03:00
} ,
} ,
{
2023-05-15 15:36:26 +03:00
name : config . record . enabled _in _config ? ` Toggle recordings ${ recordValue === 'ON' ? 'off' : 'on' } ` : 'Recordings must be enabled in the config to be turned on in the UI.' ,
2021-02-18 07:53:57 +03:00
icon : ClipIcon ,
2023-05-15 15:36:26 +03:00
color : config . record . enabled _in _config ? ( recordValue === 'ON' ? 'blue' : 'gray' ) : 'red' ,
2021-02-18 07:53:57 +03:00
onClick : ( ) => {
2023-05-15 15:36:26 +03:00
if ( config . record . enabled _in _config ) {
sendRecordings ( recordValue === 'ON' ? 'OFF' : 'ON' , true ) ;
}
2021-02-18 07:53:57 +03:00
} ,
} ,
{
name : ` Toggle snapshots ${ snapshotValue === 'ON' ? 'off' : 'on' } ` ,
icon : SnapshotIcon ,
color : snapshotValue === 'ON' ? 'blue' : 'gray' ,
onClick : ( ) => {
2022-04-25 14:59:52 +03:00
sendSnapshots ( snapshotValue === 'ON' ? 'OFF' : 'ON' , true ) ;
2021-02-18 07:53:57 +03:00
} ,
} ,
] ,
2023-05-15 15:36:26 +03:00
[ config , detectValue , sendDetect , recordValue , sendRecordings , snapshotValue , sendSnapshots ]
2021-02-18 07:53:57 +03:00
) ;
2021-01-09 20:26:46 +03:00
2021-02-18 07:53:57 +03:00
return (
2022-08-25 14:44:34 +03:00
< Card buttons = { buttons } href = { href } header = { cleanName } icons = { icons } media = { < CameraImage camera = { name } stretch / > } / >
2021-02-18 07:53:57 +03:00
) ;
2021-01-09 20:26:46 +03:00
}