refactor: refactor zones_friendly_names

This commit is contained in:
ZhaiSoul 2025-10-27 07:39:46 +00:00
parent 5d5f812d53
commit 6219c25c67
3 changed files with 35 additions and 16 deletions

View File

@ -71,8 +71,11 @@ export default function ObjectTrackOverlay({
{ revalidateOnFocus: false }, { revalidateOnFocus: false },
); );
const getZonesFriendlyNames = (zones: string[], config: FrigateConfig) => {
return zones?.map((zone) => resolveZoneName(config, zone)) ?? [];
};
const timelineResults = useMemo(() => { const timelineResults = useMemo(() => {
// Group timeline entries by source_id
if (!timelineData) return selectedObjectIds.map(() => []); if (!timelineData) return selectedObjectIds.map(() => []);
const grouped: Record<string, ObjectLifecycleSequence[]> = {}; const grouped: Record<string, ObjectLifecycleSequence[]> = {};
@ -83,9 +86,19 @@ export default function ObjectTrackOverlay({
grouped[entry.source_id].push(entry); grouped[entry.source_id].push(entry);
} }
// Return timeline arrays in the same order as selectedObjectIds return selectedObjectIds.map((id) => {
return selectedObjectIds.map((id) => grouped[id] || []); const entries = grouped[id] || [];
}, [selectedObjectIds, timelineData]); return entries.map((event) => ({
...event,
data: {
...event.data,
zones_friendly_names: config
? getZonesFriendlyNames(event.data?.zones, config)
: [],
},
}));
});
}, [selectedObjectIds, timelineData, config]);
const typeColorMap = useMemo( const typeColorMap = useMemo(
() => ({ () => ({
@ -157,11 +170,6 @@ export default function ObjectTrackOverlay({
) )
.map((event: ObjectLifecycleSequence) => { .map((event: ObjectLifecycleSequence) => {
const [left, top, width, height] = event.data.box!; const [left, top, width, height] = event.data.box!;
event.data.zones_friendly_names = event?.data?.zones?.map(
(zone) => {
return resolveZoneName(config, zone);
},
);
return { return {
x: left + width / 2, // Center x x: left + width / 2, // Center x
y: top + height, // Bottom y y: top + height, // Bottom y

View File

@ -51,10 +51,15 @@ export function ObjectPath({
const imgRect = imgRef.current.getBoundingClientRect(); const imgRect = imgRef.current.getBoundingClientRect();
return positions.map((pos) => { return positions.map((pos) => {
if (config && pos.lifecycle_item?.data?.zones) { if (config && pos.lifecycle_item?.data?.zones) {
pos.lifecycle_item.data.zones_friendly_names = pos.lifecycle_item = {
pos.lifecycle_item.data.zones.map((zone) => { ...pos.lifecycle_item,
return resolveZoneName(config, zone); data: {
}); ...pos.lifecycle_item.data,
zones_friendly_names: pos.lifecycle_item.data.zones.map((zone) => {
return resolveZoneName(config, zone);
}),
},
};
} }
return { return {
x: pos.x * imgRect.width, x: pos.x * imgRect.width,

View File

@ -558,9 +558,15 @@ function LifecycleItem({
const { t } = useTranslation("views/events"); const { t } = useTranslation("views/events");
const { data: config } = useSWR<FrigateConfig>("config"); const { data: config } = useSWR<FrigateConfig>("config");
item.data.zones_friendly_names = item?.data?.zones?.map((zone) => { item = {
return resolveZoneName(config, zone); ...item,
}); data: {
...item.data,
zones_friendly_names: item?.data?.zones?.map((zone) => {
return resolveZoneName(config, zone);
}),
},
};
const aspectRatio = useMemo(() => { const aspectRatio = useMemo(() => {
if (!config || !item?.camera) { if (!config || !item?.camera) {