mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-03-11 02:47:37 +03:00
Some checks are pending
CI / AMD64 Build (push) Waiting to run
CI / ARM Build (push) Waiting to run
CI / Jetson Jetpack 6 (push) Waiting to run
CI / AMD64 Extra Build (push) Blocked by required conditions
CI / ARM Extra Build (push) Blocked by required conditions
CI / Synaptics Build (push) Blocked by required conditions
CI / Assemble and push default build (push) Blocked by required conditions
* improve chip tooltip display - use formatList to use i18n separators instead of commas - ensure the correct event type is used so sublabels are not run through normalization - remove smart-capitalization classes as translated labels use i18n (which includes capitalization) - give icons an optional key so that the console doesn't complain about duplication when rendering * Add grace period for recording segment checks to prevent spurious ffmpeg restarts * add admin precedence to proxy role_map resolution to prevent downgrade * clean up * formatting * work around radix pointer events issue when dialog is opened from drawer fixes https://github.com/blakeblackshear/frigate/discussions/21940 * prevent console warnings about missing titles and descriptions make these invisible with sr-only * remove duplicate language * Adjust handling for device sizes * Cleanup --------- Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
202 lines
5.7 KiB
TypeScript
202 lines
5.7 KiB
TypeScript
import { IconName } from "@/components/icons/IconPicker";
|
|
import { FrigateConfig } from "@/types/frigateConfig";
|
|
import { EventType } from "@/types/search";
|
|
import { BsPersonWalking } from "react-icons/bs";
|
|
import {
|
|
FaAmazon,
|
|
FaBicycle,
|
|
FaBus,
|
|
FaCarSide,
|
|
FaCat,
|
|
FaCheckCircle,
|
|
FaDhl,
|
|
FaDog,
|
|
FaFedex,
|
|
FaFire,
|
|
FaFootballBall,
|
|
FaHockeyPuck,
|
|
FaHorse,
|
|
FaMotorcycle,
|
|
FaMouse,
|
|
FaRegTrashAlt,
|
|
FaUmbrella,
|
|
FaUps,
|
|
FaUsps,
|
|
} from "react-icons/fa";
|
|
import {
|
|
GiDeer,
|
|
GiFox,
|
|
GiGoat,
|
|
GiKangaroo,
|
|
GiPolarBear,
|
|
GiPostStamp,
|
|
GiRabbit,
|
|
GiRaccoonHead,
|
|
GiSailboat,
|
|
GiSoundWaves,
|
|
GiSquirrel,
|
|
} from "react-icons/gi";
|
|
import { LuBox, LuLassoSelect, LuScanBarcode } from "react-icons/lu";
|
|
import * as LuIcons from "react-icons/lu";
|
|
import { MdRecordVoiceOver } from "react-icons/md";
|
|
import { PiBirdFill } from "react-icons/pi";
|
|
|
|
export function getAttributeLabels(config?: FrigateConfig) {
|
|
if (!config) {
|
|
return [];
|
|
}
|
|
|
|
const labels = new Set();
|
|
|
|
Object.values(config.model.attributes_map).forEach((values) =>
|
|
values.forEach((label) => labels.add(label)),
|
|
);
|
|
return [...labels];
|
|
}
|
|
|
|
export function isValidIconName(value: string): value is IconName {
|
|
return Object.keys(LuIcons).includes(value as IconName);
|
|
}
|
|
|
|
export function getIconForLabel(
|
|
label: string,
|
|
type: EventType = "object",
|
|
className?: string,
|
|
key?: string,
|
|
) {
|
|
const iconKey = key || label;
|
|
|
|
if (label.endsWith("-verified")) {
|
|
return getVerifiedIcon(label, className, type, iconKey);
|
|
} else if (label.endsWith("-plate")) {
|
|
return getRecognizedPlateIcon(label, className, type, iconKey);
|
|
}
|
|
|
|
switch (label) {
|
|
// objects
|
|
case "bear":
|
|
return <GiPolarBear key={iconKey} className={className} />;
|
|
case "bicycle":
|
|
return <FaBicycle key={iconKey} className={className} />;
|
|
case "bird":
|
|
return <PiBirdFill key={iconKey} className={className} />;
|
|
case "boat":
|
|
return <GiSailboat key={iconKey} className={className} />;
|
|
case "bus":
|
|
case "school_bus":
|
|
return <FaBus key={iconKey} className={className} />;
|
|
case "car":
|
|
case "vehicle":
|
|
return <FaCarSide key={iconKey} className={className} />;
|
|
case "cat":
|
|
return <FaCat key={iconKey} className={className} />;
|
|
case "deer":
|
|
return <GiDeer key={iconKey} className={className} />;
|
|
case "animal":
|
|
case "bark":
|
|
case "dog":
|
|
return <FaDog key={iconKey} className={className} />;
|
|
case "fox":
|
|
return <GiFox key={iconKey} className={className} />;
|
|
case "goat":
|
|
return <GiGoat key={iconKey} className={className} />;
|
|
case "horse":
|
|
return <FaHorse key={iconKey} className={className} />;
|
|
case "kangaroo":
|
|
return <GiKangaroo key={iconKey} className={className} />;
|
|
case "license_plate":
|
|
return <LuScanBarcode key={iconKey} className={className} />;
|
|
case "motorcycle":
|
|
return <FaMotorcycle key={iconKey} className={className} />;
|
|
case "mouse":
|
|
return <FaMouse key={iconKey} className={className} />;
|
|
case "package":
|
|
return <LuBox key={iconKey} className={className} />;
|
|
case "person":
|
|
return <BsPersonWalking key={iconKey} className={className} />;
|
|
case "rabbit":
|
|
return <GiRabbit key={iconKey} className={className} />;
|
|
case "raccoon":
|
|
return <GiRaccoonHead key={iconKey} className={className} />;
|
|
case "robot_lawnmower":
|
|
return <FaHockeyPuck key={iconKey} className={className} />;
|
|
case "sports_ball":
|
|
return <FaFootballBall key={iconKey} className={className} />;
|
|
case "skunk":
|
|
return <GiSquirrel key={iconKey} className={className} />;
|
|
case "squirrel":
|
|
return <LuIcons.LuSquirrel key={iconKey} className={className} />;
|
|
case "umbrella":
|
|
return <FaUmbrella key={iconKey} className={className} />;
|
|
case "waste_bin":
|
|
return <FaRegTrashAlt key={iconKey} className={className} />;
|
|
// audio
|
|
case "crying":
|
|
case "laughter":
|
|
case "scream":
|
|
case "speech":
|
|
case "yell":
|
|
return <MdRecordVoiceOver key={iconKey} className={className} />;
|
|
case "fire_alarm":
|
|
return <FaFire key={iconKey} className={className} />;
|
|
// sub labels
|
|
case "amazon":
|
|
return <FaAmazon key={iconKey} className={className} />;
|
|
case "an_post":
|
|
case "canada_post":
|
|
case "dpd":
|
|
case "gls":
|
|
case "nzpost":
|
|
case "postnl":
|
|
case "postnord":
|
|
case "purolator":
|
|
case "royal_mail":
|
|
return <GiPostStamp key={iconKey} className={className} />;
|
|
case "dhl":
|
|
return <FaDhl key={iconKey} className={className} />;
|
|
case "fedex":
|
|
return <FaFedex key={iconKey} className={className} />;
|
|
case "ups":
|
|
return <FaUps key={iconKey} className={className} />;
|
|
case "usps":
|
|
return <FaUsps key={iconKey} className={className} />;
|
|
default:
|
|
if (type === "audio") {
|
|
return <GiSoundWaves key={iconKey} className={className} />;
|
|
}
|
|
return <LuLassoSelect key={iconKey} className={className} />;
|
|
}
|
|
}
|
|
|
|
function getVerifiedIcon(
|
|
label: string,
|
|
className?: string,
|
|
type: EventType = "object",
|
|
key?: string,
|
|
) {
|
|
const simpleLabel = label.substring(0, label.lastIndexOf("-"));
|
|
|
|
return (
|
|
<div key={key} className="relative flex items-center">
|
|
{getIconForLabel(simpleLabel, type, className)}
|
|
<FaCheckCircle className="absolute -bottom-0.5 -right-0.5 size-2" />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function getRecognizedPlateIcon(
|
|
label: string,
|
|
className?: string,
|
|
type: EventType = "object",
|
|
key?: string,
|
|
) {
|
|
const simpleLabel = label.substring(0, label.lastIndexOf("-"));
|
|
|
|
return (
|
|
<div key={key} className="relative inline-flex items-center">
|
|
{getIconForLabel(simpleLabel, type, className)}
|
|
<LuScanBarcode className="absolute -bottom-0.5 -right-0.5 size-2" />
|
|
</div>
|
|
);
|
|
}
|