@seekora-ai/ui-sdk-react 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/suggestions-primitives/SearchInput.d.ts +5 -1
- package/dist/components/suggestions-primitives/SearchInput.d.ts.map +1 -1
- package/dist/components/suggestions-primitives/SearchInput.js +5 -2
- package/dist/hooks/useQuerySuggestionsEnhanced.d.ts.map +1 -1
- package/dist/hooks/useQuerySuggestionsEnhanced.js +30 -8
- package/dist/index.umd.js +1 -1
- package/dist/src/index.d.ts +5 -1
- package/dist/src/index.esm.js +35 -10
- package/dist/src/index.esm.js.map +1 -1
- package/dist/src/index.js +35 -10
- package/dist/src/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -9,11 +9,15 @@ export interface SearchInputProps {
|
|
|
9
9
|
placeholder?: string;
|
|
10
10
|
autoFocus?: boolean;
|
|
11
11
|
showClearButton?: boolean;
|
|
12
|
+
/** When false, blur does not close the dropdown (e.g. for overlay mode). Default true. */
|
|
13
|
+
closeOnBlur?: boolean;
|
|
14
|
+
/** Optional icon (e.g. magnifying glass) rendered to the left of the input */
|
|
15
|
+
leftIcon?: React.ReactNode;
|
|
12
16
|
className?: string;
|
|
13
17
|
style?: React.CSSProperties;
|
|
14
18
|
inputClassName?: string;
|
|
15
19
|
inputStyle?: React.CSSProperties;
|
|
16
20
|
ariaLabel?: string;
|
|
17
21
|
}
|
|
18
|
-
export declare function SearchInput({ placeholder, autoFocus, showClearButton, className, style, inputClassName, inputStyle, ariaLabel, }: SearchInputProps): React.JSX.Element;
|
|
22
|
+
export declare function SearchInput({ placeholder, autoFocus, showClearButton, closeOnBlur, leftIcon, className, style, inputClassName, inputStyle, ariaLabel, }: SearchInputProps): React.JSX.Element;
|
|
19
23
|
//# sourceMappingURL=SearchInput.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../../../src/components/suggestions-primitives/SearchInput.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,wBAAgB,WAAW,CAAC,EAC1B,WAAyB,EACzB,SAAiB,EACjB,eAAsB,EACtB,SAAS,EACT,KAAK,EACL,cAAc,EACd,UAAU,EACV,SAAoB,GACrB,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../../../src/components/suggestions-primitives/SearchInput.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0FAA0F;IAC1F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,wBAAgB,WAAW,CAAC,EAC1B,WAAyB,EACzB,SAAiB,EACjB,eAAsB,EACtB,WAAkB,EAClB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,cAAc,EACd,UAAU,EACV,SAAoB,GACrB,EAAE,gBAAgB,qBA+GlB"}
|
|
@@ -32,15 +32,17 @@ const inputStyles = {
|
|
|
32
32
|
color: 'var(--seekora-text-primary, #111827)',
|
|
33
33
|
fontFamily: 'inherit',
|
|
34
34
|
};
|
|
35
|
-
export function SearchInput({ placeholder = 'Search...', autoFocus = false, showClearButton = true, className, style, inputClassName, inputStyle, ariaLabel = 'Search', }) {
|
|
35
|
+
export function SearchInput({ placeholder = 'Search...', autoFocus = false, showClearButton = true, closeOnBlur = true, leftIcon, className, style, inputClassName, inputStyle, ariaLabel = 'Search', }) {
|
|
36
36
|
const { query, setQuery, isOpen, setIsOpen, navigateNext, navigatePrev, selectActive, close, } = useSuggestionsContext();
|
|
37
37
|
const inputRef = useRef(null);
|
|
38
38
|
const handleFocus = useCallback(() => {
|
|
39
39
|
setIsOpen(true);
|
|
40
40
|
}, [setIsOpen]);
|
|
41
41
|
const handleBlur = useCallback(() => {
|
|
42
|
+
if (!closeOnBlur)
|
|
43
|
+
return;
|
|
42
44
|
setTimeout(() => close(), 200);
|
|
43
|
-
}, [close]);
|
|
45
|
+
}, [close, closeOnBlur]);
|
|
44
46
|
const handleChange = useCallback((e) => {
|
|
45
47
|
setQuery(e.target.value);
|
|
46
48
|
}, [setQuery]);
|
|
@@ -73,6 +75,7 @@ export function SearchInput({ placeholder = 'Search...', autoFocus = false, show
|
|
|
73
75
|
}, [setQuery]);
|
|
74
76
|
return (React.createElement("div", { className: clsx('seekora-suggestions-search-input-wrapper', className), style: { ...defaultStyles, ...style } },
|
|
75
77
|
React.createElement("div", { className: "seekora-suggestions-input-wrapper", style: inputWrapperStyles },
|
|
78
|
+
leftIcon ? (React.createElement("span", { className: "seekora-suggestions-input-left-icon", style: { display: 'flex', flexShrink: 0, color: 'var(--seekora-text-secondary, #6b7280)' } }, leftIcon)) : null,
|
|
76
79
|
React.createElement("input", { ref: inputRef, type: "text", value: query, onChange: handleChange, onFocus: handleFocus, onBlur: handleBlur, onKeyDown: handleKeyDown, placeholder: placeholder, autoFocus: autoFocus, autoComplete: "off", autoCorrect: "off", autoCapitalize: "off", spellCheck: false, "aria-label": ariaLabel, "aria-expanded": isOpen, "aria-haspopup": "listbox", "aria-autocomplete": "list", role: "combobox", className: clsx('seekora-suggestions-input', inputClassName), style: { ...inputStyles, ...inputStyle } }),
|
|
77
80
|
showClearButton && query ? (React.createElement("button", { type: "button", onClick: handleClear, className: "seekora-suggestions-input-clear", "aria-label": "Clear search", style: {
|
|
78
81
|
padding: 4,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuerySuggestionsEnhanced.d.ts","sourceRoot":"","sources":["../../src/hooks/useQuerySuggestionsEnhanced.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"useQuerySuggestionsEnhanced.d.ts","sourceRoot":"","sources":["../../src/hooks/useQuerySuggestionsEnhanced.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,15 +66,16 @@ function parseHighlight(highlighted) {
|
|
|
66
66
|
.replace(/__\/ais-highlight__/g, '</mark>');
|
|
67
67
|
}
|
|
68
68
|
function transformProduct(raw) {
|
|
69
|
+
const meta = raw.metadata || {};
|
|
69
70
|
return {
|
|
70
71
|
id: raw.id || raw.objectID,
|
|
71
72
|
objectID: raw.objectID || raw.id,
|
|
72
|
-
title: raw.title || raw.name || raw.productName,
|
|
73
|
-
name: raw.name || raw.title,
|
|
74
|
-
image: raw.image || raw.imageUrl ||
|
|
75
|
-
price: raw.price
|
|
76
|
-
currency: raw.currency ||
|
|
77
|
-
url: raw.url || raw.productId ||
|
|
73
|
+
title: raw.title || raw.name || raw.productName || meta.name || meta.productName || '',
|
|
74
|
+
name: raw.name || raw.title || meta.name || meta.productName || '',
|
|
75
|
+
image: raw.image || raw.imageUrl || meta.image || meta.image_url || meta.images?.[0] || '',
|
|
76
|
+
price: raw.price ?? raw.sellPrice ?? meta.sellPrice ?? meta.price,
|
|
77
|
+
currency: raw.currency || meta.currency || '',
|
|
78
|
+
url: raw.url || raw.productId || meta.url || meta.productId || '',
|
|
78
79
|
clicks: raw.clicks,
|
|
79
80
|
conversions: raw.conversions,
|
|
80
81
|
revenue: raw.revenue,
|
|
@@ -124,7 +125,10 @@ export function useQuerySuggestionsEnhanced(options) {
|
|
|
124
125
|
}, [enableRecentSearches, recentSearchesKey, maxRecentSearches]);
|
|
125
126
|
// Fetch suggestions
|
|
126
127
|
const fetchSuggestions = useCallback(async (searchQuery) => {
|
|
127
|
-
if (!client
|
|
128
|
+
if (!client)
|
|
129
|
+
return;
|
|
130
|
+
// When minQueryLength is 0, allow empty query so overlay can show default/trending recommendations on open
|
|
131
|
+
if (!searchQuery.trim() && minQueryLength > 0) {
|
|
128
132
|
setSuggestions([]);
|
|
129
133
|
setDropdownRecommendations(null);
|
|
130
134
|
return;
|
|
@@ -159,12 +163,17 @@ export function useQuerySuggestionsEnhanced(options) {
|
|
|
159
163
|
setSuggestions(transformedSuggestions);
|
|
160
164
|
// Extract dropdown recommendations from extensions
|
|
161
165
|
const extensions = (response.extensions || {});
|
|
166
|
+
const rawResults = response.results;
|
|
167
|
+
const secondResultHits = Array.isArray(rawResults?.[1]?.hits) ? rawResults[1].hits : [];
|
|
168
|
+
// Multi-index response: results[0]=suggestions, results[1]=product hits; expose results[1].hits as product_hits for fallback when extensions have no products
|
|
169
|
+
const productHits = secondResultHits.length > 0 ? secondResultHits.map((h) => transformProduct(h)) : [];
|
|
162
170
|
const recommendations = {
|
|
163
171
|
trending_searches: Array.isArray(extensions.trending_searches) ? extensions.trending_searches : [],
|
|
164
172
|
top_searches: Array.isArray(extensions.top_searches) ? extensions.top_searches : [],
|
|
165
173
|
related_searches: Array.isArray(extensions.related_searches) ? extensions.related_searches : [],
|
|
166
174
|
trending_products: Array.isArray(extensions.trending_products) ? extensions.trending_products.map(transformProduct) : [],
|
|
167
175
|
item_recommendations: Array.isArray(extensions.item_recommendations) ? extensions.item_recommendations.map(transformProduct) : [],
|
|
176
|
+
product_hits: productHits.length > 0 ? productHits : undefined,
|
|
168
177
|
popular_brands: Array.isArray(extensions.popular_brands) ? extensions.popular_brands : [],
|
|
169
178
|
filtered_tabs: Array.isArray(extensions.filtered_tabs) ? extensions.filtered_tabs.map(transformFilteredTab) : [],
|
|
170
179
|
processing_time_ms: typeof extensions.processing_time_ms === 'number' ? extensions.processing_time_ms : undefined,
|
|
@@ -224,6 +233,7 @@ export function useQuerySuggestionsEnhanced(options) {
|
|
|
224
233
|
}
|
|
225
234
|
}, [
|
|
226
235
|
client,
|
|
236
|
+
minQueryLength,
|
|
227
237
|
maxSuggestions,
|
|
228
238
|
includeDropdownRecommendations,
|
|
229
239
|
includeCategories,
|
|
@@ -300,7 +310,19 @@ export function useQuerySuggestionsEnhanced(options) {
|
|
|
300
310
|
const relatedSearches = dropdownRecommendations?.related_searches || [];
|
|
301
311
|
const popularBrands = dropdownRecommendations?.popular_brands || [];
|
|
302
312
|
const filteredTabsResult = dropdownRecommendations?.filtered_tabs || [];
|
|
303
|
-
|
|
313
|
+
// Use trending_products, then item_recommendations, then first filtered_tab's products, then results[1].hits (product_hits) so grid shows for any API shape
|
|
314
|
+
const trendingProducts = useMemo(() => {
|
|
315
|
+
const fromTrending = dropdownRecommendations?.trending_products;
|
|
316
|
+
if (fromTrending && fromTrending.length > 0)
|
|
317
|
+
return fromTrending;
|
|
318
|
+
const fromItemRecs = dropdownRecommendations?.item_recommendations;
|
|
319
|
+
if (fromItemRecs && fromItemRecs.length > 0)
|
|
320
|
+
return fromItemRecs;
|
|
321
|
+
const firstTab = dropdownRecommendations?.filtered_tabs?.[0];
|
|
322
|
+
if (firstTab?.products && firstTab.products.length > 0)
|
|
323
|
+
return firstTab.products;
|
|
324
|
+
return dropdownRecommendations?.product_hits ?? [];
|
|
325
|
+
}, [dropdownRecommendations?.trending_products, dropdownRecommendations?.item_recommendations, dropdownRecommendations?.filtered_tabs, dropdownRecommendations?.product_hits]);
|
|
304
326
|
const hasContent = useMemo(() => {
|
|
305
327
|
return (suggestions.length > 0 ||
|
|
306
328
|
recentSearches.length > 0 ||
|