diff --git a/apps/portal/src/components/resumes/shared/ResumeExperienceTypeahead.tsx b/apps/portal/src/components/resumes/shared/ResumeExperienceTypeahead.tsx index 5a53103a..1a17370b 100644 --- a/apps/portal/src/components/resumes/shared/ResumeExperienceTypeahead.tsx +++ b/apps/portal/src/components/resumes/shared/ResumeExperienceTypeahead.tsx @@ -18,16 +18,18 @@ type BaseProps = Pick< type Props = BaseProps & Readonly<{ onSelect: (option: TypeaheadOption | null) => void; - value?: TypeaheadOption | null; + selectedValues?: Set; }>; export default function ResumeExperienceTypeahead({ onSelect, - value, + selectedValues = new Set(), ...props }: Props) { const [query, setQuery] = useState(''); const options = EXPERIENCES.filter( + ({ value }) => !selectedValues.has(value), + ).filter( ({ label }) => label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) > -1, ); @@ -38,7 +40,6 @@ export default function ResumeExperienceTypeahead({ noResultsMessage="No available experiences." nullable={true} options={options} - value={value} onQueryChange={setQuery} onSelect={onSelect} {...props} diff --git a/apps/portal/src/components/resumes/shared/ResumeLocationTypeahead.tsx b/apps/portal/src/components/resumes/shared/ResumeLocationTypeahead.tsx index 8464a8dc..98bd0d2a 100644 --- a/apps/portal/src/components/resumes/shared/ResumeLocationTypeahead.tsx +++ b/apps/portal/src/components/resumes/shared/ResumeLocationTypeahead.tsx @@ -1,5 +1,5 @@ import type { ComponentProps } from 'react'; -import { useState } from 'react'; +import { useMemo, useState } from 'react'; import type { TypeaheadOption } from '@tih/ui'; import { Typeahead } from '@tih/ui'; @@ -18,12 +18,12 @@ type BaseProps = Pick< type Props = BaseProps & Readonly<{ onSelect: (option: TypeaheadOption | null) => void; - value?: TypeaheadOption | null; + selectedValues?: Set; }>; export default function ResumeLocationTypeahead({ onSelect, - value, + selectedValues = new Set(), ...props }: Props) { const [query, setQuery] = useState(''); @@ -34,21 +34,27 @@ export default function ResumeLocationTypeahead({ }, ]); - const { data } = countries; + const options = useMemo(() => { + const { data } = countries; + if (data == null) { + return []; + } + + return data + .map(({ id, name }) => ({ + id, + label: name, + value: id, + })) + .filter(({ value }) => !selectedValues.has(value)); + }, [countries, selectedValues]); return ( ({ - id, - label: name, - value: id, - })) ?? [] - } - value={value} + options={options} onQueryChange={setQuery} onSelect={onSelect} {...props} diff --git a/apps/portal/src/components/resumes/shared/ResumeRoleTypeahead.tsx b/apps/portal/src/components/resumes/shared/ResumeRoleTypeahead.tsx index ed0b93cf..a7e8a8bb 100644 --- a/apps/portal/src/components/resumes/shared/ResumeRoleTypeahead.tsx +++ b/apps/portal/src/components/resumes/shared/ResumeRoleTypeahead.tsx @@ -18,12 +18,12 @@ type BaseProps = Pick< type Props = BaseProps & Readonly<{ onSelect: (option: TypeaheadOption | null) => void; - value?: TypeaheadOption | null; + selectedValues?: Set; }>; export default function ResumeRoleTypeahead({ onSelect, - value, + selectedValues = new Set(), ...props }: Props) { const [query, setQuery] = useState(''); @@ -33,6 +33,7 @@ export default function ResumeRoleTypeahead({ label, value: slug, })) + .filter(({ value }) => !selectedValues.has(value)) .filter( ({ label }) => label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) > -1, @@ -44,7 +45,6 @@ export default function ResumeRoleTypeahead({ noResultsMessage="No available roles." nullable={true} options={options} - value={value} onQueryChange={setQuery} onSelect={onSelect} {...props} diff --git a/apps/portal/src/pages/resumes/index.tsx b/apps/portal/src/pages/resumes/index.tsx index 28e69114..01c9a0ae 100644 --- a/apps/portal/src/pages/resumes/index.tsx +++ b/apps/portal/src/pages/resumes/index.tsx @@ -354,6 +354,9 @@ export default function ResumeHomePage() { value)) + } onSelect={onSelect} /> ); @@ -362,6 +365,9 @@ export default function ResumeHomePage() { value)) + } onSelect={onSelect} /> ); @@ -370,6 +376,9 @@ export default function ResumeHomePage() { value)) + } onSelect={onSelect} /> );