@seekora-ai/ui-sdk-react 0.2.18 → 0.2.20
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/SearchBar.d.ts +3 -0
- package/dist/components/SearchBar.d.ts.map +1 -1
- package/dist/components/SearchBar.js +32 -4
- package/dist/index.umd.js +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.esm.js +32 -4
- package/dist/src/index.esm.js.map +1 -1
- package/dist/src/index.js +32 -4
- package/dist/src/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -49,6 +49,9 @@ export interface SearchBarProps {
|
|
|
49
49
|
renderSubmitButton?: () => React.ReactNode;
|
|
50
50
|
/** Size variant controlling padding and font size (default: 'medium') */
|
|
51
51
|
size?: SearchBarSize;
|
|
52
|
+
/** Trigger search automatically as user types, with debounce (default: false).
|
|
53
|
+
* When true, uses `debounceMs` for the delay. Enter still triggers immediately. */
|
|
54
|
+
searchAsYouType?: boolean;
|
|
52
55
|
}
|
|
53
56
|
export declare const SearchBar: React.FC<SearchBarProps>;
|
|
54
57
|
//# sourceMappingURL=SearchBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBar.d.ts","sourceRoot":"","sources":["../../src/components/SearchBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAU5D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/F,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1E,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACzC,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACxC,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAC3C,yEAAyE;IACzE,IAAI,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchBar.d.ts","sourceRoot":"","sources":["../../src/components/SearchBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAU5D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/F,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1E,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACzC,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACxC,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAC3C,yEAAyE;IACzE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB;wFACoF;IACpF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAgED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA8c9C,CAAC"}
|
|
@@ -51,7 +51,7 @@ const DefaultSearchIcon = ({ size = 18 }) => (React.createElement("svg", { width
|
|
|
51
51
|
const DefaultClearIcon = ({ size = 14 }) => (React.createElement("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" },
|
|
52
52
|
React.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
|
|
53
53
|
React.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" })));
|
|
54
|
-
export const SearchBar = ({ placeholder = 'Powered by Seekora', showSuggestions = true, debounceMs = 300, minQueryLength = 2, maxSuggestions = 10, onSearch, onQueryChange, onSuggestionSelect, onSearchStateChange, searchOptions, className, style, theme: customTheme, renderSuggestion, renderSearchIcon, showClearButton = true, renderClearIcon, showSubmitButton = false, renderSubmitButton, size = 'medium', }) => {
|
|
54
|
+
export const SearchBar = ({ placeholder = 'Powered by Seekora', showSuggestions = true, debounceMs = 300, minQueryLength = 2, maxSuggestions = 10, onSearch, onQueryChange, onSuggestionSelect, onSearchStateChange, searchOptions, className, style, theme: customTheme, renderSuggestion, renderSearchIcon, showClearButton = true, renderClearIcon, showSubmitButton = false, renderSubmitButton, size = 'medium', searchAsYouType = false, }) => {
|
|
55
55
|
const { client, theme, enableAnalytics, autoTrackSearch } = useSearchContext();
|
|
56
56
|
const { query, setQuery, search: triggerSearch, results, loading: searchLoading, error: searchError } = useSearchState();
|
|
57
57
|
const [isFocused, setIsFocused] = useState(false);
|
|
@@ -59,6 +59,14 @@ export const SearchBar = ({ placeholder = 'Powered by Seekora', showSuggestions
|
|
|
59
59
|
const inputRef = useRef(null);
|
|
60
60
|
const containerRef = useRef(null);
|
|
61
61
|
const isSearchingRef = useRef(false); // Flag to prevent blur handler from interfering
|
|
62
|
+
const searchAsYouTypeRef = useRef(null);
|
|
63
|
+
// Cleanup searchAsYouType timer on unmount
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
return () => {
|
|
66
|
+
if (searchAsYouTypeRef.current)
|
|
67
|
+
clearTimeout(searchAsYouTypeRef.current);
|
|
68
|
+
};
|
|
69
|
+
}, []);
|
|
62
70
|
const { suggestions, loading: suggestionsLoading } = useQuerySuggestions({
|
|
63
71
|
client,
|
|
64
72
|
query,
|
|
@@ -88,6 +96,11 @@ export const SearchBar = ({ placeholder = 'Powered by Seekora', showSuggestions
|
|
|
88
96
|
}
|
|
89
97
|
}, [query, onQueryChange]);
|
|
90
98
|
const handleSearch = useCallback(async (searchQuery) => {
|
|
99
|
+
// Cancel any pending searchAsYouType debounce — user explicitly submitted
|
|
100
|
+
if (searchAsYouTypeRef.current) {
|
|
101
|
+
clearTimeout(searchAsYouTypeRef.current);
|
|
102
|
+
searchAsYouTypeRef.current = null;
|
|
103
|
+
}
|
|
91
104
|
// Allow empty queries - use empty string for search
|
|
92
105
|
const query = searchQuery.trim();
|
|
93
106
|
log.info('SearchBar: Triggering search', { query, originalQuery: searchQuery, isEmpty: !query });
|
|
@@ -124,10 +137,18 @@ export const SearchBar = ({ placeholder = 'Powered by Seekora', showSuggestions
|
|
|
124
137
|
const handleInputChange = useCallback((e) => {
|
|
125
138
|
const value = e.target.value;
|
|
126
139
|
// Update query in state manager but don't trigger search immediately
|
|
127
|
-
// Search will be triggered on Enter or
|
|
140
|
+
// Search will be triggered on Enter, suggestion select, or after debounce if searchAsYouType
|
|
128
141
|
setQuery(value, false); // false = don't trigger search immediately
|
|
129
142
|
setSelectedIndex(-1);
|
|
130
|
-
|
|
143
|
+
if (searchAsYouType) {
|
|
144
|
+
if (searchAsYouTypeRef.current)
|
|
145
|
+
clearTimeout(searchAsYouTypeRef.current);
|
|
146
|
+
searchAsYouTypeRef.current = setTimeout(() => {
|
|
147
|
+
searchAsYouTypeRef.current = null;
|
|
148
|
+
triggerSearch();
|
|
149
|
+
}, debounceMs);
|
|
150
|
+
}
|
|
151
|
+
}, [setQuery, searchAsYouType, debounceMs, triggerSearch]);
|
|
131
152
|
const handleKeyDown = useCallback((e) => {
|
|
132
153
|
switch (e.key) {
|
|
133
154
|
case 'ArrowDown':
|
|
@@ -206,10 +227,17 @@ export const SearchBar = ({ placeholder = 'Powered by Seekora', showSuggestions
|
|
|
206
227
|
? `0 0 0 3px var(--seekora-border-focus-alpha, ${theme.colors.focus}33)`
|
|
207
228
|
: undefined;
|
|
208
229
|
const handleClear = useCallback(() => {
|
|
230
|
+
if (searchAsYouTypeRef.current) {
|
|
231
|
+
clearTimeout(searchAsYouTypeRef.current);
|
|
232
|
+
searchAsYouTypeRef.current = null;
|
|
233
|
+
}
|
|
209
234
|
setQuery('', false);
|
|
210
235
|
setSelectedIndex(-1);
|
|
211
236
|
inputRef.current?.focus();
|
|
212
|
-
|
|
237
|
+
if (searchAsYouType) {
|
|
238
|
+
triggerSearch();
|
|
239
|
+
}
|
|
240
|
+
}, [setQuery, searchAsYouType, triggerSearch]);
|
|
213
241
|
const handleSubmit = useCallback(() => {
|
|
214
242
|
const currentValue = inputRef.current?.value || query;
|
|
215
243
|
handleSearch(currentValue);
|