From 7c4ce131bf768f297d953ae82687174289cb5f6b Mon Sep 17 00:00:00 2001 From: robbond Date: Mon, 13 Apr 2026 10:07:58 +0100 Subject: [PATCH] refactor(newappeal): extract file merge and dedupe helpers (Slice 2b) --- components/newappeal/buildchecksection.js | 32 +++++++---------------- components/newappeal/buildsection.js | 11 ++++---- context/refactor-tracker.md | 4 +-- lib/newappeal/fileListHelpers.js | 28 ++++++++++++++++++++ 4 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 lib/newappeal/fileListHelpers.js diff --git a/components/newappeal/buildchecksection.js b/components/newappeal/buildchecksection.js index d5672c35..679f0a34 100644 --- a/components/newappeal/buildchecksection.js +++ b/components/newappeal/buildchecksection.js @@ -21,6 +21,10 @@ import { updateLinks, getDocLink } from "../utils"; +import { + dedupeFilesListByName, + removeDuplicatesByKey +} from "../../lib/newappeal/fileListHelpers"; let BuildCheckSection = (props) => { useEffect(() => { @@ -97,20 +101,10 @@ let BuildCheckSection = (props) => { }); //console.log(buildAppealFilesArray); - function removeDuplicates(arr, key) { - const seen = new Set(); - return arr.filter((item) => { - const value = item[key]; - if (seen.has(value)) { - return false; // Duplicate found - } else { - seen.add(value); // Add value to the set - return true; // Keep the item - } - }); - } - - buildAppealFilesArray = removeDuplicates(buildAppealFilesArray, "name"); + buildAppealFilesArray = removeDuplicatesByKey( + buildAppealFilesArray, + "name" + ); let pdfObj = props.props.form.appealForm.values; @@ -152,10 +146,7 @@ let BuildCheckSection = (props) => { const finaliseAppeal = async () => { //console.log("finalising appeal:", pdfObj); - const uniqueArray = pdfObj.filesList.filter( - (value, index, self) => - index === self.findIndex((t) => t.name === value.name) - ); + const uniqueArray = dedupeFilesListByName(pdfObj.filesList); pdfObj.filesList = uniqueArray; pdfObj.locale = locale; @@ -197,10 +188,7 @@ let BuildCheckSection = (props) => { try { setDownloadInProgress(true); - const uniqueArray = pdfObj.filesList.filter( - (value, index, self) => - index === self.findIndex((t) => t.name === value.name) - ); + const uniqueArray = dedupeFilesListByName(pdfObj.filesList); pdfObj.filesList = uniqueArray; pdfObj.locale = locale; diff --git a/components/newappeal/buildsection.js b/components/newappeal/buildsection.js index ea743e26..76435271 100644 --- a/components/newappeal/buildsection.js +++ b/components/newappeal/buildsection.js @@ -6,6 +6,7 @@ import { connect } from "react-redux"; import { formValueSelector, reduxForm } from "redux-form"; import { uploadFiles } from "../../actions/services/documentService"; import { sendEmail } from "../../actions/services/notifyService"; +import { mergeWithExistingFilesList } from "../../lib/newappeal/fileListHelpers"; import { normalizeYesNoBooleans, removeNullKeys, @@ -166,12 +167,10 @@ let BuildSection = (props) => { //console.log(buildAppealFilesArray); - buildAppealFilesArray = values.hasOwnProperty("filesList") - ? (buildAppealFilesArray.concat(values.filesList), - buildAppealFilesArray.filter(function (item, idx) { - return item.name; - })) - : buildAppealFilesArray; + buildAppealFilesArray = mergeWithExistingFilesList( + buildAppealFilesArray, + values + ); Object.assign(values, { "filesList": buildAppealFilesArray }); diff --git a/context/refactor-tracker.md b/context/refactor-tracker.md index c093d347..a4a5313d 100644 --- a/context/refactor-tracker.md +++ b/context/refactor-tracker.md @@ -4,7 +4,7 @@ Base branch for this tracker: `refactor` ## Status -Current slice: Slice 2b — File Merge/Dedupe Helpers +Current slice: Slice 3 — Side Effect Facade Status: READY TO START --- @@ -32,7 +32,7 @@ Status: COMPLETE ### Slice 2b — File Merge/Dedupe Helpers -Status: NOT STARTED +Status: COMPLETE - Extract file list merge logic - Extract dedupe logic diff --git a/lib/newappeal/fileListHelpers.js b/lib/newappeal/fileListHelpers.js new file mode 100644 index 00000000..e13e6a9f --- /dev/null +++ b/lib/newappeal/fileListHelpers.js @@ -0,0 +1,28 @@ +export const mergeWithExistingFilesList = (buildAppealFilesArray, values) => { + return values.hasOwnProperty("filesList") + ? (buildAppealFilesArray.concat(values.filesList), + buildAppealFilesArray.filter(function (item, idx) { + return item.name; + })) + : buildAppealFilesArray; +}; + +export const removeDuplicatesByKey = (arr, key) => { + const seen = new Set(); + return arr.filter((item) => { + const value = item[key]; + if (seen.has(value)) { + return false; // Duplicate found + } else { + seen.add(value); // Add value to the set + return true; // Keep the item + } + }); +}; + +export const dedupeFilesListByName = (filesList) => { + return filesList.filter( + (value, index, self) => + index === self.findIndex((t) => t.name === value.name) + ); +};