Skip to content

Commit bba3510

Browse files
fix: sync Select defaultValue and sort EOL vulnerabilities without mutation
Restore useEffect in Select so internal state follows programmatic defaultValue updates (e.g. download page OS/install method). Replace in-place sort in EOLModal useEffect with useMemo that returns a sorted copy so renders always use ordered data without mutating props. Assisted-by: Cursor Agent Co-authored-by: Aviv Keller <me@aviv.sh>
1 parent e785946 commit bba3510

File tree

2 files changed

+16
-15
lines changed

2 files changed

+16
-15
lines changed

apps/site/components/EOL/EOLModal.tsx

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Modal, Title, Content } from '@node-core/ui-components/Common/Modal';
22
import { useTranslations } from 'next-intl';
3-
import { useEffect } from 'react';
3+
import { useMemo } from 'react';
44

55
import KnownSeveritySection from '#site/components/EOL/KnownSeveritySection';
66
import UnknownSeveritySection from '#site/components/EOL/UnknownSeveritySection';
@@ -26,35 +26,32 @@ const EOLModal: FC<EOLModalProps> = ({
2626
? t('components.eolModal.title', { version, codename })
2727
: t('components.eolModal.titleWithoutCodename', { version });
2828

29-
useEffect(
30-
() => {
31-
vulnerabilities.sort(
29+
const sortedVulnerabilities = useMemo(
30+
() =>
31+
[...vulnerabilities].sort(
3232
(a, b) =>
3333
SEVERITY_ORDER.indexOf(a.severity) -
3434
SEVERITY_ORDER.indexOf(b.severity)
35-
);
36-
},
37-
// Only change when the vulnerabilities change
38-
// eslint-disable-next-line @eslint-react/exhaustive-deps
39-
[vulnerabilities.length]
35+
),
36+
[vulnerabilities]
4037
);
4138

4239
return (
4340
<Modal {...props}>
4441
<Title>{modalHeading}</Title>
4542
<Content>
46-
{vulnerabilities.length > 0 && (
43+
{sortedVulnerabilities.length > 0 && (
4744
<p className="m-1">
4845
{t('components.eolModal.vulnerabilitiesMessage', {
49-
count: vulnerabilities.length,
46+
count: sortedVulnerabilities.length,
5047
})}
5148
</p>
5249
)}
5350

54-
<KnownSeveritySection vulnerabilities={vulnerabilities} />
55-
<UnknownSeveritySection vulnerabilities={vulnerabilities} />
51+
<KnownSeveritySection vulnerabilities={sortedVulnerabilities} />
52+
<UnknownSeveritySection vulnerabilities={sortedVulnerabilities} />
5653

57-
{!vulnerabilities.length && (
54+
{!sortedVulnerabilities.length && (
5855
<p className="m-1">
5956
{t('components.eolModal.noVulnerabilitiesMessage')}
6057
</p>

packages/ui-components/src/Common/Select/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { ChevronDownIcon, ChevronUpIcon } from '@heroicons/react/24/outline';
44
import * as SelectPrimitive from '@radix-ui/react-select';
55
import classNames from 'classnames';
6-
import { useId, useMemo, useState } from 'react';
6+
import { useEffect, useId, useMemo, useState } from 'react';
77

88
import Skeleton from '#ui/Common/Skeleton';
99

@@ -64,6 +64,10 @@ const Select = <T extends string>({
6464
const id = useId();
6565
const [value, setValue] = useState(defaultValue);
6666

67+
useEffect(() => {
68+
setValue(defaultValue);
69+
}, [defaultValue]);
70+
6771
const mappedValues = useMemo(() => mapValues(values), [values]) as Array<
6872
SelectGroup<T>
6973
>;

0 commit comments

Comments
 (0)