Files
frigate/web/src/utils/iconUtil.tsx
T

202 lines
5.7 KiB
TypeScript
Raw Normal View History

2024-05-09 08:22:48 -05:00
import { IconName } from "@/components/icons/IconPicker";
import { FrigateConfig } from "@/types/frigateConfig";
2026-01-09 17:23:33 -06:00
import { EventType } from "@/types/search";
2024-02-21 13:07:32 -07:00
import { BsPersonWalking } from "react-icons/bs";
import {
FaAmazon,
2024-05-02 06:52:44 -06:00
FaBicycle,
FaBus,
2024-02-21 13:07:32 -07:00
FaCarSide,
FaCat,
2024-03-30 12:45:42 -06:00
FaCheckCircle,
2024-10-12 07:37:22 -06:00
FaDhl,
2024-02-21 13:07:32 -07:00
FaDog,
FaFedex,
FaFire,
2024-07-18 15:11:05 -06:00
FaFootballBall,
2024-10-12 07:37:22 -06:00
FaHockeyPuck,
FaHorse,
2024-07-18 15:11:05 -06:00
FaMotorcycle,
FaMouse,
2024-10-12 07:37:22 -06:00
FaRegTrashAlt,
FaUmbrella,
2024-02-21 13:07:32 -07:00
FaUps,
2024-07-18 15:11:05 -06:00
FaUsps,
2024-02-21 13:07:32 -07:00
} from "react-icons/fa";
2024-10-12 07:37:22 -06:00
import {
GiDeer,
GiFox,
GiGoat,
2025-06-19 09:20:33 -06:00
GiKangaroo,
2024-10-12 07:37:22 -06:00
GiPolarBear,
GiPostStamp,
GiRabbit,
GiRaccoonHead,
GiSailboat,
2026-01-09 17:23:33 -06:00
GiSoundWaves,
2025-06-19 09:20:33 -06:00
GiSquirrel,
2024-10-12 07:37:22 -06:00
} from "react-icons/gi";
import { LuBox, LuLassoSelect, LuScanBarcode } from "react-icons/lu";
2024-05-09 08:22:48 -05:00
import * as LuIcons from "react-icons/lu";
2024-02-21 13:07:32 -07:00
import { MdRecordVoiceOver } from "react-icons/md";
2024-11-05 08:29:07 -07:00
import { PiBirdFill } from "react-icons/pi";
2024-02-21 13:07:32 -07:00
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];
}
2024-05-09 08:22:48 -05:00
export function isValidIconName(value: string): value is IconName {
return Object.keys(LuIcons).includes(value as IconName);
2024-03-04 16:18:30 -07:00
}
2026-01-09 17:23:33 -06:00
export function getIconForLabel(
label: string,
type: EventType = "object",
className?: string,
2026-02-12 14:42:08 -06:00
key?: string,
2026-01-09 17:23:33 -06:00
) {
2026-02-12 14:42:08 -06:00
const iconKey = key || label;
2024-03-30 12:45:42 -06:00
if (label.endsWith("-verified")) {
2026-02-12 14:42:08 -06:00
return getVerifiedIcon(label, className, type, iconKey);
} else if (label.endsWith("-plate")) {
2026-02-12 14:42:08 -06:00
return getRecognizedPlateIcon(label, className, type, iconKey);
2024-03-30 12:45:42 -06:00
}
2024-02-21 13:07:32 -07:00
switch (label) {
2024-07-18 15:11:05 -06:00
// objects
case "bear":
2026-02-12 14:42:08 -06:00
return <GiPolarBear key={iconKey} className={className} />;
2024-05-02 06:52:44 -06:00
case "bicycle":
2026-02-12 14:42:08 -06:00
return <FaBicycle key={iconKey} className={className} />;
2024-05-02 06:52:44 -06:00
case "bird":
2026-02-12 14:42:08 -06:00
return <PiBirdFill key={iconKey} className={className} />;
2024-07-18 15:11:05 -06:00
case "boat":
2026-02-12 14:42:08 -06:00
return <GiSailboat key={iconKey} className={className} />;
2024-05-02 06:52:44 -06:00
case "bus":
2025-06-19 09:20:33 -06:00
case "school_bus":
2026-02-12 14:42:08 -06:00
return <FaBus key={iconKey} className={className} />;
2024-02-21 13:07:32 -07:00
case "car":
2024-05-02 06:52:44 -06:00
case "vehicle":
2026-02-12 14:42:08 -06:00
return <FaCarSide key={iconKey} className={className} />;
2024-02-21 13:07:32 -07:00
case "cat":
2026-02-12 14:42:08 -06:00
return <FaCat key={iconKey} className={className} />;
2024-05-29 12:06:48 -06:00
case "deer":
2026-02-12 14:42:08 -06:00
return <GiDeer key={iconKey} className={className} />;
2024-05-02 06:52:44 -06:00
case "animal":
2024-02-21 13:07:32 -07:00
case "bark":
case "dog":
2026-02-12 14:42:08 -06:00
return <FaDog key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "fox":
2026-02-12 14:42:08 -06:00
return <GiFox key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "goat":
2026-02-12 14:42:08 -06:00
return <GiGoat key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "horse":
2026-02-12 14:42:08 -06:00
return <FaHorse key={iconKey} className={className} />;
2025-06-19 09:20:33 -06:00
case "kangaroo":
2026-02-12 14:42:08 -06:00
return <GiKangaroo key={iconKey} className={className} />;
2025-04-11 07:48:16 -05:00
case "license_plate":
2026-02-12 14:42:08 -06:00
return <LuScanBarcode key={iconKey} className={className} />;
2024-07-18 15:11:05 -06:00
case "motorcycle":
2026-02-12 14:42:08 -06:00
return <FaMotorcycle key={iconKey} className={className} />;
2024-07-18 15:11:05 -06:00
case "mouse":
2026-02-12 14:42:08 -06:00
return <FaMouse key={iconKey} className={className} />;
2024-02-21 13:07:32 -07:00
case "package":
2026-02-12 14:42:08 -06:00
return <LuBox key={iconKey} className={className} />;
2024-02-21 13:07:32 -07:00
case "person":
2026-02-12 14:42:08 -06:00
return <BsPersonWalking key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "rabbit":
2026-02-12 14:42:08 -06:00
return <GiRabbit key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "raccoon":
2026-02-12 14:42:08 -06:00
return <GiRaccoonHead key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "robot_lawnmower":
2026-02-12 14:42:08 -06:00
return <FaHockeyPuck key={iconKey} className={className} />;
2024-07-18 15:11:05 -06:00
case "sports_ball":
2026-02-12 14:42:08 -06:00
return <FaFootballBall key={iconKey} className={className} />;
2025-06-19 09:20:33 -06:00
case "skunk":
2026-02-12 14:42:08 -06:00
return <GiSquirrel key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "squirrel":
2026-02-12 14:42:08 -06:00
return <LuIcons.LuSquirrel key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "umbrella":
2026-02-12 14:42:08 -06:00
return <FaUmbrella key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "waste_bin":
2026-02-12 14:42:08 -06:00
return <FaRegTrashAlt key={iconKey} className={className} />;
2024-03-30 12:45:42 -06:00
// audio
2024-02-21 13:07:32 -07:00
case "crying":
case "laughter":
case "scream":
case "speech":
case "yell":
2026-02-12 14:42:08 -06:00
return <MdRecordVoiceOver key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "fire_alarm":
2026-02-12 14:42:08 -06:00
return <FaFire key={iconKey} className={className} />;
2024-03-30 12:45:42 -06:00
// sub labels
2024-02-21 13:07:32 -07:00
case "amazon":
2026-02-12 14:42:08 -06:00
return <FaAmazon key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "an_post":
2025-06-19 09:20:33 -06:00
case "canada_post":
2024-10-12 07:37:22 -06:00
case "dpd":
case "gls":
case "nzpost":
case "postnl":
case "postnord":
case "purolator":
2025-06-19 09:20:33 -06:00
case "royal_mail":
2026-02-12 14:42:08 -06:00
return <GiPostStamp key={iconKey} className={className} />;
2024-10-12 07:37:22 -06:00
case "dhl":
2026-02-12 14:42:08 -06:00
return <FaDhl key={iconKey} className={className} />;
2024-02-21 13:07:32 -07:00
case "fedex":
2026-02-12 14:42:08 -06:00
return <FaFedex key={iconKey} className={className} />;
2024-02-21 13:07:32 -07:00
case "ups":
2026-02-12 14:42:08 -06:00
return <FaUps key={iconKey} className={className} />;
2024-07-18 15:11:05 -06:00
case "usps":
2026-02-12 14:42:08 -06:00
return <FaUsps key={iconKey} className={className} />;
2024-03-30 12:45:42 -06:00
default:
2026-01-09 17:23:33 -06:00
if (type === "audio") {
2026-02-12 14:42:08 -06:00
return <GiSoundWaves key={iconKey} className={className} />;
2026-01-09 17:23:33 -06:00
}
2026-02-12 14:42:08 -06:00
return <LuLassoSelect key={iconKey} className={className} />;
2024-02-21 13:07:32 -07:00
}
}
2024-03-30 12:45:42 -06:00
2026-01-09 17:23:33 -06:00
function getVerifiedIcon(
label: string,
className?: string,
type: EventType = "object",
2026-02-12 14:42:08 -06:00
key?: string,
2026-01-09 17:23:33 -06:00
) {
2024-03-30 12:45:42 -06:00
const simpleLabel = label.substring(0, label.lastIndexOf("-"));
return (
2026-02-12 14:42:08 -06:00
<div key={key} className="relative flex items-center">
2026-01-09 17:23:33 -06:00
{getIconForLabel(simpleLabel, type, className)}
2026-01-29 13:42:06 -06:00
<FaCheckCircle className="absolute -bottom-0.5 -right-0.5 size-2" />
2024-03-30 12:45:42 -06:00
</div>
);
}
2026-01-09 17:23:33 -06:00
function getRecognizedPlateIcon(
label: string,
className?: string,
type: EventType = "object",
2026-02-12 14:42:08 -06:00
key?: string,
2026-01-09 17:23:33 -06:00
) {
const simpleLabel = label.substring(0, label.lastIndexOf("-"));
return (
2026-02-12 14:42:08 -06:00
<div key={key} className="relative inline-flex items-center">
2026-01-09 17:23:33 -06:00
{getIconForLabel(simpleLabel, type, className)}
2026-01-29 13:42:06 -06:00
<LuScanBarcode className="absolute -bottom-0.5 -right-0.5 size-2" />
</div>
);
}