diff --git a/web/src/pages/FaceLibrary.tsx b/web/src/pages/FaceLibrary.tsx
index 7d5137e69..ee57a178d 100644
--- a/web/src/pages/FaceLibrary.tsx
+++ b/web/src/pages/FaceLibrary.tsx
@@ -402,8 +402,7 @@ function TrainingGrid({
onClickFace,
onRefresh,
}: TrainingGridProps) {
- const { t } = useTranslation(["views/faceLibrary", "views/explore"]);
- const navigate = useNavigate();
+ const { t } = useTranslation(["views/faceLibrary"]);
// face data
@@ -516,72 +515,18 @@ function TrainingGrid({
{Object.entries(faceGroups).map(([key, group]) => {
const event = events?.find((ev) => ev.id == key);
-
return (
-
-
-
- Person
- {event?.sub_label
- ? `: ${event.sub_label} (${Math.round((event.data.sub_label_score || 0) * 100)}%)`
- : ": Unknown"}
-
- {event && (
-
-
- {
- navigate(`/explore?event_id=${event.id}`);
- }}
- >
-
-
-
-
-
- {t("details.item.button.viewInExplore", {
- ns: "views/explore",
- })}
-
-
-
- )}
-
-
-
- {group.map((data: RecognizedFaceData) => (
- {
- if (meta || selectedFaces.length > 0) {
- onClickFace(data.filename, true);
- } else if (event) {
- setSelectedEvent(event);
- }
- }}
- onRefresh={onRefresh}
- />
- ))}
-
-
+ config={config}
+ group={group}
+ event={event}
+ faceNames={faceNames}
+ selectedFaces={selectedFaces}
+ onClickFace={onClickFace}
+ onSelectEvent={setSelectedEvent}
+ onRefresh={onRefresh}
+ />
);
})}
@@ -589,6 +534,95 @@ function TrainingGrid({
);
}
+type FaceAttemptGroupProps = {
+ config: FrigateConfig;
+ group: RecognizedFaceData[];
+ event?: Event;
+ faceNames: string[];
+ selectedFaces: string[];
+ onClickFace: (image: string, ctrl: boolean) => void;
+ onSelectEvent: (event: Event) => void;
+ onRefresh: () => void;
+};
+function FaceAttemptGroup({
+ config,
+ group,
+ event,
+ faceNames,
+ selectedFaces,
+ onClickFace,
+ onSelectEvent,
+ onRefresh,
+}: FaceAttemptGroupProps) {
+ const navigate = useNavigate();
+ const { t } = useTranslation(["views/faceLibrary", "views/explore"]);
+ return (
+
+
+
+ Person
+ {event?.sub_label
+ ? `: ${event.sub_label} (${Math.round((event.data.sub_label_score || 0) * 100)}%)`
+ : ": Unknown"}
+
+ {event && (
+
+
+ {
+ navigate(`/explore?event_id=${event.id}`);
+ }}
+ >
+
+
+
+
+
+ {t("details.item.button.viewInExplore", {
+ ns: "views/explore",
+ })}
+
+
+
+ )}
+
+
+
+ {group.map((data: RecognizedFaceData) => (
+ {
+ if (meta || selectedFaces.length > 0) {
+ onClickFace(data.filename, true);
+ } else if (event) {
+ onSelectEvent(event);
+ }
+ }}
+ onRefresh={onRefresh}
+ />
+ ))}
+
+
+ );
+}
+
type FaceAttemptProps = {
data: RecognizedFaceData;
faceNames: string[];