diff --git a/web/public/locales/en/views/faceLibrary.json b/web/public/locales/en/views/faceLibrary.json index 4c0d1e712..453abfc22 100644 --- a/web/public/locales/en/views/faceLibrary.json +++ b/web/public/locales/en/views/faceLibrary.json @@ -75,7 +75,7 @@ "deletedName_other": "{{count}} faces have been successfully deleted.", "renamedFace": "Successfully renamed face to {{name}}", "trainedFace": "Successfully trained face.", - "updatedFaceScore": "Successfully updated face score." + "updatedFaceScore": "Successfully updated face score to {{name}} ({{score}})." }, "error": { "uploadingImageFailed": "Failed to upload image: {{errorMessage}}", diff --git a/web/src/pages/FaceLibrary.tsx b/web/src/pages/FaceLibrary.tsx index 6cc113e77..78e0e5760 100644 --- a/web/src/pages/FaceLibrary.tsx +++ b/web/src/pages/FaceLibrary.tsx @@ -622,7 +622,15 @@ type TrainingGridProps = { faceNames: string[]; selectedFaces: string[]; onClickFaces: (images: string[], ctrl: boolean) => void; - onRefresh: () => void; + onRefresh: ( + data?: + | FaceLibraryData + | Promise + | (( + currentData: FaceLibraryData | undefined, + ) => FaceLibraryData | undefined), + opts?: boolean | { revalidate?: boolean }, + ) => Promise; }; function TrainingGrid({ config, @@ -726,7 +734,15 @@ type FaceAttemptGroupProps = { faceNames: string[]; selectedFaces: string[]; onClickFaces: (image: string[], ctrl: boolean) => void; - onRefresh: () => void; + onRefresh: ( + data?: + | FaceLibraryData + | Promise + | (( + currentData: FaceLibraryData | undefined, + ) => FaceLibraryData | undefined), + opts?: boolean | { revalidate?: boolean }, + ) => Promise; }; function FaceAttemptGroup({ config, @@ -814,11 +830,44 @@ function FaceAttemptGroup({ axios .post(`/faces/reprocess`, { training_file: data.filename }) .then((resp) => { - if (resp.status == 200) { - toast.success(t("toast.success.updatedFaceScore"), { - position: "top-center", - }); - onRefresh(); + if (resp.status == 200 && resp.data?.success) { + const { face_name, score } = resp.data; + const oldFilename = data.filename; + const parts = oldFilename.split("-"); + const newFilename = `${parts[0]}-${parts[1]}-${parts[2]}-${face_name}-${score}.webp`; + + onRefresh( + (currentData: FaceLibraryData | undefined) => { + if (!currentData?.train) return currentData; + + return { + ...currentData, + train: currentData.train.map((filename: string) => + filename === oldFilename ? newFilename : filename, + ), + }; + }, + { revalidate: true }, + ); + + toast.success( + t("toast.success.updatedFaceScore", { + name: face_name, + score: score.toFixed(2), + }), + { + position: "top-center", + }, + ); + } else if (resp.data?.success === false) { + // Handle case where API returns success: false + const errorMessage = resp.data?.message || "Unknown error"; + toast.error( + t("toast.error.updateFaceScoreFailed", { errorMessage }), + { + position: "top-center", + }, + ); } }) .catch((error) => {