Skip to content

Commit 5db5589

Browse files
authored
Add getSearchResultsUrl util (#176)
1 parent 43746b6 commit 5db5589

File tree

5 files changed

+66
-23
lines changed

5 files changed

+66
-23
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import React, { useContext } from 'react';
2+
import SectionItemText from './SectionItemText';
3+
import { SearchSuggestion } from '../../../types';
4+
import { CioAutocompleteContext } from '../CioAutocompleteProvider';
5+
6+
interface SearchSuggestionItemProps {
7+
item: SearchSuggestion;
8+
displaySearchTermHighlights?: boolean;
9+
}
10+
export default function SearchSuggestionItem(props: SearchSuggestionItemProps) {
11+
const { item, displaySearchTermHighlights } = props;
12+
const { advancedParameters, query, featureToggles } = useContext(CioAutocompleteContext);
13+
const { featureDisplaySearchSuggestionImages, featureDisplaySearchSuggestionResultCounts } =
14+
featureToggles;
15+
const {
16+
displaySearchSuggestionImages = featureDisplaySearchSuggestionImages,
17+
displaySearchSuggestionResultCounts = featureDisplaySearchSuggestionResultCounts,
18+
} = advancedParameters || {};
19+
20+
return (
21+
<>
22+
{displaySearchSuggestionImages && item.data?.image_url && (
23+
<img src={item.data?.image_url} alt={item.value} className='cio-suggestion-image' />
24+
)}
25+
<p className='cio-suggestion-text'>
26+
<SectionItemText
27+
item={item}
28+
query={query}
29+
highlightSearchTerm={displaySearchTermHighlights}
30+
/>
31+
</p>
32+
{displaySearchSuggestionResultCounts && item.data?.total_num_results && (
33+
<p className='cio-suggestion-count'>({item.data?.total_num_results})</p>
34+
)}
35+
</>
36+
);
37+
}

src/components/Autocomplete/SectionItem/SectionItem.tsx

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Item } from '../../../types';
44
import { isProduct, isInGroupSuggestion, isSearchSuggestion } from '../../../typeGuards';
55
import SectionItemText from './SectionItemText';
66
import { translate } from '../../../utils';
7+
import SearchSuggestionItem from './SearchSuggestionItem';
78

89
export interface SectionItemProps {
910
item: Item;
@@ -14,15 +15,9 @@ export interface SectionItemProps {
1415

1516
export default function SectionItem(props: SectionItemProps) {
1617
const { item, children, displaySearchTermHighlights } = props;
17-
const { getItemProps, advancedParameters, query, featureToggles } =
18+
const { getItemProps, advancedParameters, query, getSearchResultsUrl } =
1819
useContext(CioAutocompleteContext);
19-
const { featureDisplaySearchSuggestionImages, featureDisplaySearchSuggestionResultCounts } =
20-
featureToggles;
21-
const {
22-
displaySearchSuggestionImages = featureDisplaySearchSuggestionImages,
23-
displaySearchSuggestionResultCounts = featureDisplaySearchSuggestionResultCounts,
24-
translations,
25-
} = advancedParameters || {};
20+
const { translations } = advancedParameters || {};
2621
let defaultChildren: ReactNode;
2722

2823
if (isProduct(item)) {
@@ -55,23 +50,23 @@ export default function SectionItem(props: SectionItemProps) {
5550
</p>
5651
);
5752
} else if (isSearchSuggestion(item)) {
58-
defaultChildren = (
59-
<>
60-
{displaySearchSuggestionImages && item.data?.image_url && (
61-
<img src={item.data?.image_url} alt={item.value} className='cio-suggestion-image' />
62-
)}
63-
<p className='cio-suggestion-text'>
64-
<SectionItemText
53+
if (getSearchResultsUrl) {
54+
defaultChildren = (
55+
<a className='suggestion-link' href={getSearchResultsUrl(item)}>
56+
<SearchSuggestionItem
6557
item={item}
66-
query={query}
67-
highlightSearchTerm={displaySearchTermHighlights}
58+
displaySearchTermHighlights={displaySearchTermHighlights}
6859
/>
69-
</p>
70-
{displaySearchSuggestionResultCounts && item.data?.total_num_results && (
71-
<p className='cio-suggestion-count'>({item.data?.total_num_results})</p>
72-
)}
73-
</>
74-
);
60+
</a>
61+
);
62+
} else {
63+
defaultChildren = (
64+
<SearchSuggestionItem
65+
item={item}
66+
displaySearchTermHighlights={displaySearchTermHighlights}
67+
/>
68+
);
69+
}
7570
} else {
7671
defaultChildren = (
7772
<p className='cio-custom-text'>

src/hooks/useCioAutocomplete.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ const useCioAutocomplete = (options: UseCioAutocompleteOptions) => {
7474
autocompleteClassName = 'cio-autocomplete',
7575
advancedParameters,
7676
defaultInput,
77+
getSearchResultsUrl,
7778
} = memoizedOptions;
7879

7980
let { sections = defaultSections, zeroStateSections } = memoizedOptions;
@@ -303,6 +304,7 @@ const useCioAutocomplete = (options: UseCioAutocompleteOptions) => {
303304
autocompleteClassName,
304305
selectedItem: items[highlightedIndex],
305306
advancedParameters,
307+
getSearchResultsUrl,
306308
};
307309
};
308310

src/styles.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@
9898
flex-direction: column;
9999
}
100100

101+
.cio-autocomplete .cio-item .suggestion-link {
102+
display: flex;
103+
flex-direction: row;
104+
align-items: center;
105+
width: 100%;
106+
height: 100%;
107+
}
108+
101109
.cio-autocomplete .cio-item[aria-selected='true'] {
102110
background-color: hsl(0, 0%, 90%);
103111
border-radius: 4px;

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export type AdvancedParameters = AdvancedParametersBase &
3636

3737
export type CioAutocompleteProps = CioClientConfig & {
3838
openOnFocus?: boolean;
39+
getSearchResultsUrl?: (item: SearchSuggestion) => string;
3940
onSubmit: OnSubmit;
4041
onFocus?: () => void;
4142
onChange?: (input: string) => void;

0 commit comments

Comments
 (0)