mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-04-14 01:17:50 +02:00
add tabbed buttons component
This commit is contained in:
parent
4449bc5292
commit
16ef432228
@ -1,26 +1,34 @@
|
|||||||
import { h } from 'preact';
|
import { h } from 'preact';
|
||||||
import { useCallback } from 'preact/hooks';
|
import { useCallback, useState } from 'preact/hooks';
|
||||||
|
|
||||||
export default function ButtonsTabbed({ titles = [], viewMode, setViewMode }) {
|
export default function ButtonsTabbed({
|
||||||
const className = 'text-gray-600 py-0 px-4 block hover:text-gray-500';
|
viewModes = [''],
|
||||||
|
setViewMode = null,
|
||||||
|
setHeader = null,
|
||||||
|
headers = [''],
|
||||||
|
className = 'text-gray-600 py-0 px-4 block hover:text-gray-500',
|
||||||
|
selectedClassName = `${className} focus:outline-none border-b-2 font-medium border-gray-500`
|
||||||
|
}) {
|
||||||
|
const [selected, setSelected] = useState(0);
|
||||||
|
const captitalize = (str) => { return (`${str.charAt(0).toUpperCase()}${str.slice(1)}`); };
|
||||||
|
|
||||||
|
const getHeader = useCallback((i) => {
|
||||||
|
return (headers.length === viewModes.length ? headers[i] : captitalize(viewModes[i]));
|
||||||
|
}, [headers, viewModes]);
|
||||||
|
|
||||||
const handleClick = useCallback((i) => {
|
const handleClick = useCallback((i) => {
|
||||||
setViewMode(titles[i]);
|
setSelected(i);
|
||||||
}, [viewMode]); // eslint-disable-line react-hooks/exhaustive-deps
|
setViewMode && setViewMode(viewModes[i]);
|
||||||
|
setHeader && setHeader(getHeader(i));
|
||||||
|
}, [setViewMode, setHeader, setSelected, viewModes, getHeader]);
|
||||||
|
|
||||||
|
setHeader && setHeader(getHeader(selected));
|
||||||
return (
|
return (
|
||||||
<nav className="flex justify-end">
|
<nav className="flex justify-end">
|
||||||
{titles.map((title, i) => {
|
{viewModes.map((item, i) => {
|
||||||
return (
|
return (
|
||||||
<button
|
<button onClick={() => handleClick(i)} className={i === selected ? selectedClassName : className}>
|
||||||
autoFocus={!i}
|
{captitalize(item)}
|
||||||
onClick={() => handleClick(i)}
|
|
||||||
className={viewMode === title
|
|
||||||
? `${className} focus:outline-none border-b-2 font-medium border-gray-500`
|
|
||||||
: className
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{`${title.charAt(0).toUpperCase()}${title.slice(1)}`}
|
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
@ -113,7 +113,7 @@ export default function Camera({ camera }) {
|
|||||||
return (
|
return (
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<Heading size="2xl">{camera}</Heading>
|
<Heading size="2xl">{camera}</Heading>
|
||||||
<ButtonsTabbed titles={['live', 'debug']} setViewMode={setViewMode} viewMode={viewMode} />
|
<ButtonsTabbed viewModes={['live', 'debug']} setViewMode={setViewMode} />
|
||||||
|
|
||||||
{player}
|
{player}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user