From 9d2448cf774a85c5e7fcaab9dec5f6dc07eca181 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 19:45:49 +0000 Subject: [PATCH 1/6] Initial plan From 65c1bad6aab8aebbe291403f38fd50ec3af00130 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 19:58:46 +0000 Subject: [PATCH 2/6] Filter and order glosses/definitions by project analysis languages Co-authored-by: imnasnainaec <6411521+imnasnainaec@users.noreply.github.com> --- package-lock.json | 48 ++++++++++++++----- src/components/WordCard/SensesTextSummary.tsx | 40 +++++++++++----- .../MergeDragDrop/SidebarDragSense.tsx | 6 ++- src/utilities/fontContext.ts | 3 ++ src/utilities/tests/fontContext.test.ts | 11 +++++ 5 files changed, 81 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 057db1eed6..df787ba127 100644 --- a/package-lock.json +++ b/package-lock.json @@ -169,6 +169,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2100,6 +2101,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2123,6 +2125,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2225,6 +2228,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2268,6 +2272,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -3346,6 +3351,7 @@ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.12.tgz", "integrity": "sha512-ILTe3A2te0+Vb9TG4P1AZVmZFOjDDCV/b2nBmV1rNOmSu3Q/xkHghW+yMhMffwHcXklMlcajMlc4iFSkPbrTKw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.26.0" }, @@ -3372,6 +3378,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.5.0.tgz", "integrity": "sha512-yjvtXoFcrPLGtgKRxFaH6OQPtcLPhkloC0BML6rBG5UeldR0nPULR/2E2BfXdo5JNV7j7lOzrrLX2Qf/iSidow==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.5.0", @@ -3488,6 +3495,7 @@ "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.5.0.tgz", "integrity": "sha512-XcbBYxDS+h/lgsoGe78ExXFZXtuIlSBpn/KsZq8PtZcIkUNJInkuDqcLd2rVBQrDC1u+rvVovdaWPf2FHKJf3w==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/private-theming": "^6.4.9", @@ -3578,6 +3586,7 @@ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.29.4.tgz", "integrity": "sha512-wJ3tsqk/y6dp+mXGtT9czciAMEO5Zr3IIAHg9x6IL0Eqanqy0N3chbmQQZv3iq0m2qUpQDLvZ4utZBUTJdjNzw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.7", "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0", @@ -3807,6 +3816,7 @@ "integrity": "sha512-b9ll4jaFYfXSv6NZAOJ2P0uuyT/Doel7ho2AHLSUz2thtcL6HEb2+qdV2f9wriVvbEoPAj9VuSOgNc0t0f5iMw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@mischnic/json-sourcemap": "^0.1.1", "@parcel/cache": "2.16.3", @@ -6074,8 +6084,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -6289,6 +6298,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -6310,6 +6320,7 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -6410,6 +6421,7 @@ "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.51.0", @@ -6449,6 +6461,7 @@ "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.51.0", "@typescript-eslint/types": "8.51.0", @@ -6967,6 +6980,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7566,6 +7580,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -7743,6 +7758,7 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", + "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -8153,7 +8169,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/data-urls": { "version": "5.0.0", @@ -8227,7 +8244,8 @@ "version": "1.11.19", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/debug": { "version": "4.4.3", @@ -8381,8 +8399,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -8779,6 +8796,7 @@ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -8949,6 +8967,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -10079,6 +10098,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.28.4" }, @@ -10902,6 +10922,7 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -11965,6 +11986,7 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -12580,7 +12602,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -13823,7 +13844,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -13839,7 +13859,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -13852,8 +13871,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/process": { "version": "0.11.10", @@ -14004,6 +14022,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -14242,7 +14261,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-mock-store": { "version": "1.5.5", @@ -15381,6 +15401,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -15646,6 +15667,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15765,6 +15787,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -16381,6 +16404,7 @@ "integrity": "sha512-Zw/uYiiyF6pUT1qmKbZziChgNPRu+ZRneAsMUDU6IwmXdWt5JwcUfy2bvLOCUtz5UniaN/Zx5aFttZYbYc7O/A==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/src/components/WordCard/SensesTextSummary.tsx b/src/components/WordCard/SensesTextSummary.tsx index 8d00300185..d06dfaeed3 100644 --- a/src/components/WordCard/SensesTextSummary.tsx +++ b/src/components/WordCard/SensesTextSummary.tsx @@ -1,6 +1,7 @@ -import { type ReactElement } from "react"; +import { type ReactElement, useContext } from "react"; import { type Sense } from "api/models"; +import FontContext from "utilities/fontContext"; import { TypographyWithFont } from "utilities/fontComponents"; interface SensesTextSummaryProp { @@ -16,16 +17,39 @@ export default function SensesTextSummary( const interSenseSep = " | "; const intraSenseSep = "; "; + const analysisLangs = useContext(FontContext).analysisLangs; + const typographies: ReactElement[] = []; props.senses.forEach((sense) => { let texts: string[]; + let lang: string | undefined; switch (props.definitionsOrGlosses) { case "definitions": - texts = sense.definitions.map((d) => d.text.trim()); + if (analysisLangs.length) { + texts = analysisLangs.flatMap((l) => + sense.definitions.filter((d) => d.language === l).map((d) => d.text.trim()) + ); + lang = analysisLangs.find((l) => + sense.definitions.some((d) => d.language === l && d.text.trim()) + ); + } else { + texts = sense.definitions.map((d) => d.text.trim()); + lang = sense.definitions.find((d) => d.text.trim())?.language; + } break; case "glosses": - texts = sense.glosses.map((g) => g.def.trim()); + if (analysisLangs.length) { + texts = analysisLangs.flatMap((l) => + sense.glosses.filter((g) => g.language === l).map((g) => g.def.trim()) + ); + lang = analysisLangs.find((l) => + sense.glosses.some((g) => g.language === l && g.def.trim()) + ); + } else { + texts = sense.glosses.map((g) => g.def.trim()); + lang = sense.glosses.find((g) => g.def.trim())?.language; + } break; } let text = texts.filter((t) => t).join(intraSenseSep); @@ -49,16 +73,6 @@ export default function SensesTextSummary( ); } - // Use the analysis language of the first non-empty definition/gloss, if any. - let lang: string | undefined; - switch (props.definitionsOrGlosses) { - case "definitions": - lang = sense.definitions.find((d) => d.text.trim())?.language; - break; - case "glosses": - lang = sense.glosses.find((g) => g.def.trim())?.language; - break; - } typographies.push( { const ref = state.mergeDuplicateGoal.tree.sidebar.senseRef; return JSON.stringify({ ...ref, order: props.index }); @@ -59,7 +61,7 @@ export default function SidebarDragSense( : "lightgrey", }} > - + )} diff --git a/src/utilities/fontContext.ts b/src/utilities/fontContext.ts index 3ef355b09e..6374dc845f 100644 --- a/src/utilities/fontContext.ts +++ b/src/utilities/fontContext.ts @@ -12,6 +12,7 @@ export type WithFontProps = { export class ProjectFonts { readonly analysisDir: CSSProperties["direction"]; readonly analysisFont: string; + readonly analysisLangs: string[] = []; private readonly rtlLangs: Hash = {}; private readonly inherit = "inherit"; private readonly langMap: Hash = {}; @@ -26,6 +27,8 @@ export class ProjectFonts { return; } + this.analysisLangs = proj.analysisWritingSystems.map((ws) => ws.bcp47); + proj.analysisWritingSystems.forEach((ws) => { const font = ws.font.replaceAll(" ", ""); if (font && !(ws.bcp47 in this.langMap)) { diff --git a/src/utilities/tests/fontContext.test.ts b/src/utilities/tests/fontContext.test.ts index bfe55f9ad7..7fba7898d1 100644 --- a/src/utilities/tests/fontContext.test.ts +++ b/src/utilities/tests/fontContext.test.ts @@ -39,6 +39,17 @@ describe("ProjectFonts", () => { }); expect(projFonts.getLangFont("not-a-lang-in-the-proj") === inherit); expect(projFonts.vernacularFont === vernFont.replaceAll(" ", "")); + expect(projFonts.analysisLangs).toEqual(aBcp); + }); + + it("has empty analysisLangs with no project input", () => { + expect(new ProjectFonts().analysisLangs).toEqual([]); + }); + + it("correctly extracts analysisLangs from project writing systems", () => { + const proj = newProject(); + proj.analysisWritingSystems = [newWritingSystem("en"), newWritingSystem("es")]; + expect(new ProjectFonts(proj).analysisLangs).toEqual(["en", "es"]); }); }); }); From 9177e4b08d84934cd913060410f20e0fc87506f8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 22:33:22 +0000 Subject: [PATCH 3/6] Refactor: use useAppSelector in SenseCardText/SensesTextSummary, remove languages prop Co-authored-by: imnasnainaec <6411521+imnasnainaec@users.noreply.github.com> --- package-lock.json | 48 +++++-------------- src/components/WordCard/SenseCard.tsx | 2 - src/components/WordCard/SenseCardText.tsx | 20 ++++---- src/components/WordCard/SensesTextSummary.tsx | 14 ++++-- src/components/WordCard/index.tsx | 4 +- .../MergeDupsStep/MergeDragDrop/DragSense.tsx | 8 ---- .../MergeDragDrop/SidebarDragSense.tsx | 6 +-- .../MergeDupsStep/SenseCardContent.tsx | 3 +- .../tests/EditSensesCardContent.test.tsx | 21 ++++---- src/utilities/fontContext.ts | 3 -- src/utilities/tests/fontContext.test.ts | 11 ----- 11 files changed, 52 insertions(+), 88 deletions(-) diff --git a/package-lock.json b/package-lock.json index df787ba127..057db1eed6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -169,7 +169,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2101,7 +2100,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -2125,7 +2123,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2228,7 +2225,6 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2272,7 +2268,6 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -3351,7 +3346,6 @@ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.12.tgz", "integrity": "sha512-ILTe3A2te0+Vb9TG4P1AZVmZFOjDDCV/b2nBmV1rNOmSu3Q/xkHghW+yMhMffwHcXklMlcajMlc4iFSkPbrTKw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.26.0" }, @@ -3378,7 +3372,6 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.5.0.tgz", "integrity": "sha512-yjvtXoFcrPLGtgKRxFaH6OQPtcLPhkloC0BML6rBG5UeldR0nPULR/2E2BfXdo5JNV7j7lOzrrLX2Qf/iSidow==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.5.0", @@ -3495,7 +3488,6 @@ "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.5.0.tgz", "integrity": "sha512-XcbBYxDS+h/lgsoGe78ExXFZXtuIlSBpn/KsZq8PtZcIkUNJInkuDqcLd2rVBQrDC1u+rvVovdaWPf2FHKJf3w==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/private-theming": "^6.4.9", @@ -3586,7 +3578,6 @@ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.29.4.tgz", "integrity": "sha512-wJ3tsqk/y6dp+mXGtT9czciAMEO5Zr3IIAHg9x6IL0Eqanqy0N3chbmQQZv3iq0m2qUpQDLvZ4utZBUTJdjNzw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.7", "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0", @@ -3816,7 +3807,6 @@ "integrity": "sha512-b9ll4jaFYfXSv6NZAOJ2P0uuyT/Doel7ho2AHLSUz2thtcL6HEb2+qdV2f9wriVvbEoPAj9VuSOgNc0t0f5iMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@mischnic/json-sourcemap": "^0.1.1", "@parcel/cache": "2.16.3", @@ -6084,7 +6074,8 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -6298,7 +6289,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -6320,7 +6310,6 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -6421,7 +6410,6 @@ "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.51.0", @@ -6461,7 +6449,6 @@ "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.51.0", "@typescript-eslint/types": "8.51.0", @@ -6980,7 +6967,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7580,7 +7566,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -7758,7 +7743,6 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", - "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -8169,8 +8153,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/data-urls": { "version": "5.0.0", @@ -8244,8 +8227,7 @@ "version": "1.11.19", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", @@ -8399,7 +8381,8 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -8796,7 +8779,6 @@ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -8967,7 +8949,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -10098,7 +10079,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.28.4" }, @@ -10922,7 +10902,6 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -11986,7 +11965,6 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -12602,6 +12580,7 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -13844,6 +13823,7 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -13859,6 +13839,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -13871,7 +13852,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/process": { "version": "0.11.10", @@ -14022,7 +14004,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -14261,8 +14242,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-mock-store": { "version": "1.5.5", @@ -15401,7 +15381,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -15667,7 +15646,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15787,7 +15765,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -16404,7 +16381,6 @@ "integrity": "sha512-Zw/uYiiyF6pUT1qmKbZziChgNPRu+ZRneAsMUDU6IwmXdWt5JwcUfy2bvLOCUtz5UniaN/Zx5aFttZYbYc7O/A==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/src/components/WordCard/SenseCard.tsx b/src/components/WordCard/SenseCard.tsx index c1c34806a7..95edb956ff 100644 --- a/src/components/WordCard/SenseCard.tsx +++ b/src/components/WordCard/SenseCard.tsx @@ -17,7 +17,6 @@ export enum SenseCardLabel { interface SenseCardProps { bgColor?: string; - languages?: string[]; minimal?: boolean; provenance?: boolean; sense: Sense; @@ -45,7 +44,6 @@ export default function SenseCard(props: SenseCardProps): ReactElement { {/* Glosses and (if any) definitions */} diff --git a/src/components/WordCard/SenseCardText.tsx b/src/components/WordCard/SenseCardText.tsx index 31c25587ca..59697240d9 100644 --- a/src/components/WordCard/SenseCardText.tsx +++ b/src/components/WordCard/SenseCardText.tsx @@ -8,8 +8,11 @@ import { Typography, } from "@mui/material"; import { ReactElement } from "react"; +import { shallowEqual } from "react-redux"; import { Sense } from "api/models"; +import { useAppSelector } from "rootRedux/hooks"; +import { type StoreState } from "rootRedux/types"; import { TypographyWithFont } from "utilities/fontComponents"; interface SenseInLanguage { @@ -36,25 +39,26 @@ function getSenseInLanguage( function getSenseInLanguages( sense: Sense, - languages?: string[] + languages: string[] ): SenseInLanguage[] { - if (!languages) { - languages = sense.glosses.map((g) => g.language); - languages.push(...sense.definitions.map((d) => d.language)); - languages = [...new Set(languages)]; - } return languages.map((l) => getSenseInLanguage(sense, l)); } interface SenseCardTextProps { sense: Sense; hideDefs?: boolean; - languages?: string[]; } // Show glosses and (if not hideDefs) definitions. export default function SenseCardText(props: SenseCardTextProps): ReactElement { - const senseTextInLangs = getSenseInLanguages(props.sense, props.languages); + const analysisLangs = useAppSelector( + (state: StoreState) => + state.currentProjectState.project.analysisWritingSystems.map( + (ws) => ws.bcp47 + ), + shallowEqual + ); + const senseTextInLangs = getSenseInLanguages(props.sense, analysisLangs); return ( diff --git a/src/components/WordCard/SensesTextSummary.tsx b/src/components/WordCard/SensesTextSummary.tsx index d06dfaeed3..f667af2173 100644 --- a/src/components/WordCard/SensesTextSummary.tsx +++ b/src/components/WordCard/SensesTextSummary.tsx @@ -1,7 +1,9 @@ -import { type ReactElement, useContext } from "react"; +import { type ReactElement } from "react"; +import { shallowEqual } from "react-redux"; import { type Sense } from "api/models"; -import FontContext from "utilities/fontContext"; +import { useAppSelector } from "rootRedux/hooks"; +import { type StoreState } from "rootRedux/types"; import { TypographyWithFont } from "utilities/fontComponents"; interface SensesTextSummaryProp { @@ -17,7 +19,13 @@ export default function SensesTextSummary( const interSenseSep = " | "; const intraSenseSep = "; "; - const analysisLangs = useContext(FontContext).analysisLangs; + const analysisLangs = useAppSelector( + (state: StoreState) => + state.currentProjectState.project.analysisWritingSystems.map( + (ws) => ws.bcp47 + ), + shallowEqual + ); const typographies: ReactElement[] = []; diff --git a/src/components/WordCard/index.tsx b/src/components/WordCard/index.tsx index 4f355956c1..a1a2d998d8 100644 --- a/src/components/WordCard/index.tsx +++ b/src/components/WordCard/index.tsx @@ -23,7 +23,6 @@ import { TypographyWithFont } from "utilities/fontComponents"; import { getLocalizedDateTimeString } from "utilities/utilities"; interface WordCardProps { - languages?: string[]; provenance?: boolean; word: Word; } @@ -40,7 +39,7 @@ export enum WordCardLabel { } export default function WordCard(props: WordCardProps): ReactElement { - const { languages, provenance, word } = props; + const { provenance, word } = props; const { audio, editedBy, flag, id, note, senses } = word; const [full, setFull] = useState(false); const [username, setUsername] = useState(""); @@ -127,7 +126,6 @@ export default function WordCard(props: WordCardProps): ReactElement { {senses.map((s) => ( diff --git a/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/DragSense.tsx b/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/DragSense.tsx index 15f0eef8af..3c26ade3da 100644 --- a/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/DragSense.tsx +++ b/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/DragSense.tsx @@ -34,13 +34,6 @@ function arraysEqual(arr1: T[], arr2: T[]): boolean { export default function DragSense(props: DragSenseProps): ReactElement { const [duplicateCount, setDuplicateCount] = useState(1); - const analysisLangs = useAppSelector( - (state: StoreState) => - state.currentProjectState.project.analysisWritingSystems.map( - (ws) => ws.bcp47 - ), - arraysEqual - ); const dispatch = useAppDispatch(); const overrideProtection = useAppSelector( (state: StoreState) => state.mergeDuplicateGoal.overrideProtection @@ -122,7 +115,6 @@ export default function DragSense(props: DragSenseProps): ReactElement { > s.sense)} - languages={analysisLangs} toggleFunction={toggleSidebar} /> diff --git a/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/SidebarDragSense.tsx b/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/SidebarDragSense.tsx index 4142094162..16bab7d908 100644 --- a/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/SidebarDragSense.tsx +++ b/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/SidebarDragSense.tsx @@ -1,6 +1,6 @@ import { Draggable } from "@hello-pangea/dnd"; import { Card } from "@mui/material"; -import { type ReactElement, useContext } from "react"; +import { type ReactElement } from "react"; import { trashId } from "goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/MergeDragDropTypes"; import SenseCardContent from "goals/MergeDuplicates/MergeDupsStep/SenseCardContent"; @@ -8,7 +8,6 @@ import { type MergeTreeSense } from "goals/MergeDuplicates/MergeDupsTreeTypes"; import { useAppSelector } from "rootRedux/hooks"; import { type StoreState } from "rootRedux/types"; import theme from "types/theme"; -import FontContext from "utilities/fontContext"; interface SidebarDragSenseProps { mergeSense: MergeTreeSense; @@ -18,7 +17,6 @@ interface SidebarDragSenseProps { export default function SidebarDragSense( props: SidebarDragSenseProps ): ReactElement { - const analysisLangs = useContext(FontContext).analysisLangs; const draggableId = useAppSelector((state: StoreState) => { const ref = state.mergeDuplicateGoal.tree.sidebar.senseRef; return JSON.stringify({ ...ref, order: props.index }); @@ -61,7 +59,7 @@ export default function SidebarDragSense( : "lightgrey", }} > - + )} diff --git a/src/goals/MergeDuplicates/MergeDupsStep/SenseCardContent.tsx b/src/goals/MergeDuplicates/MergeDupsStep/SenseCardContent.tsx index 926762afc2..c102dbfc62 100644 --- a/src/goals/MergeDuplicates/MergeDupsStep/SenseCardContent.tsx +++ b/src/goals/MergeDuplicates/MergeDupsStep/SenseCardContent.tsx @@ -12,7 +12,6 @@ import { combineSenses } from "goals/MergeDuplicates/Redux/reducerUtilities"; interface SenseCardContentProps { senses: Sense[]; isCompleted?: boolean; - languages?: string[]; sidebar?: boolean; toggleFunction?: () => void; } @@ -73,7 +72,7 @@ export default function SenseCardContent( )} {/* List glosses and (if any) definitions. */} - + {/* List semantic domains. */} diff --git a/src/goals/ReviewEntries/ReviewEntriesTable/Cells/EditCell/tests/EditSensesCardContent.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/Cells/EditCell/tests/EditSensesCardContent.test.tsx index 32bb48bca4..a3337d728a 100644 --- a/src/goals/ReviewEntries/ReviewEntriesTable/Cells/EditCell/tests/EditSensesCardContent.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/Cells/EditCell/tests/EditSensesCardContent.test.tsx @@ -1,11 +1,14 @@ import "@testing-library/jest-dom"; import { act, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; +import { Provider } from "react-redux"; +import configureMockStore from "redux-mock-store"; import { GramCatGroup, Sense, Status } from "api/models"; import EditSensesCardContent, { EditSensesId, } from "goals/ReviewEntries/ReviewEntriesTable/Cells/EditCell/EditSensesCardContent"; +import { defaultState } from "rootRedux/types"; import { newSemanticDomain } from "types/semanticDomain"; import { newDefinition, newSense } from "types/word"; @@ -48,14 +51,16 @@ const mockSenses = (): Sense[] => [ const renderEditSensesCardContent = async (showSenses = true): Promise => await act(async () => { render( - mockMoveSense(from, to)} - newSenses={mockSenses()} - oldSenses={mockSenses()} - showSenses={showSenses} - toggleSenseDeleted={mockToggleSenseDeleted} - updateOrAddSense={mockUpdateOrAddSense} - /> + + mockMoveSense(from, to)} + newSenses={mockSenses()} + oldSenses={mockSenses()} + showSenses={showSenses} + toggleSenseDeleted={mockToggleSenseDeleted} + updateOrAddSense={mockUpdateOrAddSense} + /> + ); }); diff --git a/src/utilities/fontContext.ts b/src/utilities/fontContext.ts index 6374dc845f..3ef355b09e 100644 --- a/src/utilities/fontContext.ts +++ b/src/utilities/fontContext.ts @@ -12,7 +12,6 @@ export type WithFontProps = { export class ProjectFonts { readonly analysisDir: CSSProperties["direction"]; readonly analysisFont: string; - readonly analysisLangs: string[] = []; private readonly rtlLangs: Hash = {}; private readonly inherit = "inherit"; private readonly langMap: Hash = {}; @@ -27,8 +26,6 @@ export class ProjectFonts { return; } - this.analysisLangs = proj.analysisWritingSystems.map((ws) => ws.bcp47); - proj.analysisWritingSystems.forEach((ws) => { const font = ws.font.replaceAll(" ", ""); if (font && !(ws.bcp47 in this.langMap)) { diff --git a/src/utilities/tests/fontContext.test.ts b/src/utilities/tests/fontContext.test.ts index 7fba7898d1..bfe55f9ad7 100644 --- a/src/utilities/tests/fontContext.test.ts +++ b/src/utilities/tests/fontContext.test.ts @@ -39,17 +39,6 @@ describe("ProjectFonts", () => { }); expect(projFonts.getLangFont("not-a-lang-in-the-proj") === inherit); expect(projFonts.vernacularFont === vernFont.replaceAll(" ", "")); - expect(projFonts.analysisLangs).toEqual(aBcp); - }); - - it("has empty analysisLangs with no project input", () => { - expect(new ProjectFonts().analysisLangs).toEqual([]); - }); - - it("correctly extracts analysisLangs from project writing systems", () => { - const proj = newProject(); - proj.analysisWritingSystems = [newWritingSystem("en"), newWritingSystem("es")]; - expect(new ProjectFonts(proj).analysisLangs).toEqual(["en", "es"]); }); }); }); From d1607c4304bad0087f51b6e1a1061ce53e541403 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 22:45:54 +0000 Subject: [PATCH 4/6] Replace arraysEqual with shallowEqual and remove the local function Co-authored-by: imnasnainaec <6411521+imnasnainaec@users.noreply.github.com> --- .../MergeDupsStep/MergeDragDrop/DragSense.tsx | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/DragSense.tsx b/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/DragSense.tsx index 3c26ade3da..3cd3353aaa 100644 --- a/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/DragSense.tsx +++ b/src/goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/DragSense.tsx @@ -1,6 +1,7 @@ import { Draggable } from "@hello-pangea/dnd"; import { Card } from "@mui/material"; import { type ReactElement, useCallback, useEffect, useState } from "react"; +import { shallowEqual } from "react-redux"; import { trashId } from "goals/MergeDuplicates/MergeDupsStep/MergeDragDrop/MergeDragDropTypes"; import SenseCardContent from "goals/MergeDuplicates/MergeDupsStep/SenseCardContent"; @@ -20,18 +21,6 @@ interface DragSenseProps { senseRef: MergeTreeReference; } -function arraysEqual(arr1: T[], arr2: T[]): boolean { - if (arr1.length !== arr2.length) { - return false; - } - for (let i = 0; i < arr1.length; i++) { - if (arr1[i] !== arr2[i]) { - return false; - } - } - return true; -} - export default function DragSense(props: DragSenseProps): ReactElement { const [duplicateCount, setDuplicateCount] = useState(1); const dispatch = useAppDispatch(); @@ -71,7 +60,7 @@ export default function DragSense(props: DragSenseProps): ReactElement { if ( isInSidebar && - !arraysEqual( + !shallowEqual( sidebar.mergeSenses.map((m) => m.sense.guid), props.mergeSenses.map((m) => m.sense.guid) ) From b53f3d29978d29eeda14101600bbf131075b867d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 22:57:25 +0000 Subject: [PATCH 5/6] Fix prettier formatting in WordCard components Co-authored-by: imnasnainaec <6411521+imnasnainaec@users.noreply.github.com> --- src/components/WordCard/SenseCard.tsx | 5 +---- src/components/WordCard/SensesTextSummary.tsx | 8 ++++++-- src/components/WordCard/index.tsx | 6 +----- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/components/WordCard/SenseCard.tsx b/src/components/WordCard/SenseCard.tsx index 95edb956ff..91de0b4f90 100644 --- a/src/components/WordCard/SenseCard.tsx +++ b/src/components/WordCard/SenseCard.tsx @@ -42,10 +42,7 @@ export default function SenseCard(props: SenseCardProps): ReactElement { {/* Glosses and (if any) definitions */} - + {/* Semantic domains */} diff --git a/src/components/WordCard/SensesTextSummary.tsx b/src/components/WordCard/SensesTextSummary.tsx index f667af2173..394e01cf62 100644 --- a/src/components/WordCard/SensesTextSummary.tsx +++ b/src/components/WordCard/SensesTextSummary.tsx @@ -36,7 +36,9 @@ export default function SensesTextSummary( case "definitions": if (analysisLangs.length) { texts = analysisLangs.flatMap((l) => - sense.definitions.filter((d) => d.language === l).map((d) => d.text.trim()) + sense.definitions + .filter((d) => d.language === l) + .map((d) => d.text.trim()) ); lang = analysisLangs.find((l) => sense.definitions.some((d) => d.language === l && d.text.trim()) @@ -49,7 +51,9 @@ export default function SensesTextSummary( case "glosses": if (analysisLangs.length) { texts = analysisLangs.flatMap((l) => - sense.glosses.filter((g) => g.language === l).map((g) => g.def.trim()) + sense.glosses + .filter((g) => g.language === l) + .map((g) => g.def.trim()) ); lang = analysisLangs.find((l) => sense.glosses.some((g) => g.language === l && g.def.trim()) diff --git a/src/components/WordCard/index.tsx b/src/components/WordCard/index.tsx index a1a2d998d8..d1846816d1 100644 --- a/src/components/WordCard/index.tsx +++ b/src/components/WordCard/index.tsx @@ -124,11 +124,7 @@ export default function WordCard(props: WordCardProps): ReactElement { {full ? ( {senses.map((s) => ( - + ))} ) : ( From 3b71806c8faf6110420430c80888cea022da1b69 Mon Sep 17 00:00:00 2001 From: Danny Rorabaugh Date: Fri, 27 Feb 2026 09:45:38 -0500 Subject: [PATCH 6/6] Fix test --- .../CharacterInventory/tests/CharInvCompleted.test.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/goals/CharacterInventory/tests/CharInvCompleted.test.tsx b/src/goals/CharacterInventory/tests/CharInvCompleted.test.tsx index 4926555254..75116cd658 100644 --- a/src/goals/CharacterInventory/tests/CharInvCompleted.test.tsx +++ b/src/goals/CharacterInventory/tests/CharInvCompleted.test.tsx @@ -13,8 +13,7 @@ import { type FindAndReplaceChange, defaultCharInvChanges, } from "goals/CharacterInventory/CharacterInventoryTypes"; -import { defaultState } from "goals/Redux/GoalReduxTypes"; -import { type StoreState } from "rootRedux/types"; +import { defaultState, type StoreState } from "rootRedux/types"; import { newWord as mockWord } from "types/word"; jest.mock("backend", () => ({ @@ -38,10 +37,11 @@ const mockWordChanges: FindAndReplaceChange = { replace: "q", words: { [mockWordKeys[0]]: "newA", [mockWordKeys[1]]: "newB" }, }; -const mockState = (changes?: CharInvChanges): Partial => ({ +const mockState = (changes?: CharInvChanges): StoreState => ({ + ...defaultState, goalsState: { - ...defaultState, - currentGoal: { ...defaultState.currentGoal, changes }, + ...defaultState.goalsState, + currentGoal: { ...defaultState.goalsState.currentGoal, changes }, }, });