@brainfish-ai/components 0.25.5 → 0.26.1
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/chat-search.d.ts +40 -3
- package/dist/esm/chunks/ChatSearch.Cqo4WF3n.js +95 -0
- package/dist/esm/chunks/ChatSearch.Cqo4WF3n.js.map +1 -0
- package/dist/esm/chunks/Conversation.UZ5rx7_0.js +22 -0
- package/dist/esm/chunks/{Conversation.BriXFYqU.js.map → Conversation.UZ5rx7_0.js.map} +1 -1
- package/dist/esm/chunks/FormattedMessage.D9xA6QsH.js +23 -0
- package/dist/esm/chunks/FormattedMessage.D9xA6QsH.js.map +1 -0
- package/dist/esm/chunks/MermaidDiagram.PRgXQ5Yh.js +2 -0
- package/dist/esm/chunks/{MermaidDiagram.xQ0CVFOI.js.map → MermaidDiagram.PRgXQ5Yh.js.map} +1 -1
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js +2 -0
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js.map +1 -0
- package/dist/esm/chunks/button.BYc5d6AZ.js +3 -0
- package/dist/esm/chunks/{button.DQL6gCAt.js.map → button.BYc5d6AZ.js.map} +1 -1
- package/dist/esm/chunks/chart.BDL2tf-S.js +10 -0
- package/dist/esm/chunks/{chart.4ZbtBMmR.js.map → chart.BDL2tf-S.js.map} +1 -1
- package/dist/esm/chunks/chat-logo.CqPppEb9.js +3 -0
- package/dist/esm/chunks/chat-logo.CqPppEb9.js.map +1 -0
- package/dist/esm/chunks/combobox.CxaWbDm9.js +6 -0
- package/dist/esm/chunks/{combobox.CJKym3Z1.js.map → combobox.CxaWbDm9.js.map} +1 -1
- package/dist/esm/chunks/dark.DuW7JuAk.js +2 -0
- package/dist/esm/chunks/{dark.Cq2RCgy4.js.map → dark.DuW7JuAk.js.map} +1 -1
- package/dist/esm/chunks/data-table.CJOR-1Kf.js +5 -0
- package/dist/esm/chunks/{data-table.DbcAYxMY.js.map → data-table.CJOR-1Kf.js.map} +1 -1
- package/dist/esm/chunks/date-picker.Bhplnvxn.js +4 -0
- package/dist/esm/chunks/{date-picker._cBTpdEK.js.map → date-picker.Bhplnvxn.js.map} +1 -1
- package/dist/esm/chunks/extends.DPdBf6DS.js +2 -0
- package/dist/esm/chunks/extends.DPdBf6DS.js.map +1 -0
- package/dist/esm/chunks/feature-flags.DOcVlPHk.js +3 -0
- package/dist/esm/chunks/{feature-flags.DeDEcnd1.js.map → feature-flags.DOcVlPHk.js.map} +1 -1
- package/dist/esm/chunks/feedback.BXKvlNz1.js +13 -0
- package/dist/esm/chunks/{feedback.W2OzN-5r.js.map → feedback.BXKvlNz1.js.map} +1 -1
- package/dist/esm/chunks/file-upload-status.4ukNFyi2.js +8 -0
- package/dist/esm/chunks/{file-upload-status.DP2iuttI.js.map → file-upload-status.4ukNFyi2.js.map} +1 -1
- package/dist/esm/chunks/filters.ita3UAnO.js +22 -0
- package/dist/esm/chunks/{filters.-7vSLEQ2.js.map → filters.ita3UAnO.js.map} +1 -1
- package/dist/esm/chunks/font-picker.BwEWBowG.js +6 -0
- package/dist/esm/chunks/{font-picker.DisEoE8a.js.map → font-picker.BwEWBowG.js.map} +1 -1
- package/dist/esm/chunks/formatDate.D2xEZm8f.js +2 -0
- package/dist/esm/chunks/{formatDate.CWN6IFKq.js.map → formatDate.D2xEZm8f.js.map} +1 -1
- package/dist/esm/chunks/formatNumber.DhVn228t.js +2 -0
- package/dist/esm/chunks/{formatNumber.Bm2k8QrT.js.map → formatNumber.DhVn228t.js.map} +1 -1
- package/dist/esm/chunks/generating-star.BN9p_FDu.js +7 -0
- package/dist/esm/chunks/generating-star.BN9p_FDu.js.map +1 -0
- package/dist/esm/chunks/header-nav.B4IJjted.js +10 -0
- package/dist/esm/chunks/{header-nav.b4hvOsKc.js.map → header-nav.B4IJjted.js.map} +1 -1
- package/dist/esm/chunks/header-pane.C1RWesOW.js +20 -0
- package/dist/esm/chunks/{header-pane.BV7xKJXV.js.map → header-pane.C1RWesOW.js.map} +1 -1
- package/dist/esm/chunks/hooks.BQTKhHSv.js +2 -0
- package/dist/esm/chunks/hooks.BQTKhHSv.js.map +1 -0
- package/dist/esm/chunks/index.uF4ME3WQ.js +4 -0
- package/dist/esm/chunks/{index.BqibIWDw.js.map → index.uF4ME3WQ.js.map} +1 -1
- package/dist/esm/chunks/input-with-tags.DrDDPxse.js +5 -0
- package/dist/esm/chunks/{input-with-tags.tg2nhPFv.js.map → input-with-tags.DrDDPxse.js.map} +1 -1
- package/dist/esm/chunks/logo.CketsPBx.js +5 -0
- package/dist/esm/chunks/{logo.D5BMN6Db.js.map → logo.CketsPBx.js.map} +1 -1
- package/dist/esm/chunks/primary.CMQbo1GJ.js +2 -0
- package/dist/esm/chunks/{primary.CtiRZbqq.js.map → primary.CMQbo1GJ.js.map} +1 -1
- package/dist/esm/chunks/review-list.qvxeqG9l.js +6 -0
- package/dist/esm/chunks/{review-list.BtSnfpSc.js.map → review-list.qvxeqG9l.js.map} +1 -1
- package/dist/esm/chunks/sidebar.IcJADYLR.js +25 -0
- package/dist/esm/chunks/sidebar.IcJADYLR.js.map +1 -0
- package/dist/esm/chunks/simpleSelect.DK1qZSXM.js +3 -0
- package/dist/esm/chunks/{simpleSelect.B1rktKkt.js.map → simpleSelect.DK1qZSXM.js.map} +1 -1
- package/dist/esm/chunks/status-badge.C-jt7Zs2.js +3 -0
- package/dist/esm/chunks/{status-badge.eFJ1PYeb.js.map → status-badge.C-jt7Zs2.js.map} +1 -1
- package/dist/esm/chunks/trend-value.BPBDBsk2.js +3 -0
- package/dist/esm/chunks/{trend-value.COSukPwk.js.map → trend-value.BPBDBsk2.js.map} +1 -1
- package/dist/esm/chunks/two-level-combobox.Bv2OQgjh.js +8 -0
- package/dist/esm/chunks/{two-level-combobox.BXs2z9u5.js.map → two-level-combobox.Bv2OQgjh.js.map} +1 -1
- package/dist/esm/chunks/useChartDateFormatters.Dx2h5AAm.js +2 -0
- package/dist/esm/chunks/{useChartDateFormatters.DS9ASgFO.js.map → useChartDateFormatters.Dx2h5AAm.js.map} +1 -1
- package/dist/esm/chunks/utils.C6Qu-kwd.js +2 -0
- package/dist/esm/chunks/{utils.Cwtlq8dh.js.map → utils.C6Qu-kwd.js.map} +1 -1
- package/dist/esm/colors.js +1 -169
- package/dist/esm/colors.js.map +1 -1
- package/dist/esm/components/article-suggestions-banner.js +4 -53
- package/dist/esm/components/article-suggestions-banner.js.map +1 -1
- package/dist/esm/components/articles-coverage.js +4 -116
- package/dist/esm/components/articles-coverage.js.map +1 -1
- package/dist/esm/components/articles-updated.js +4 -74
- package/dist/esm/components/articles-updated.js.map +1 -1
- package/dist/esm/components/breadcrumbs.js +3 -13
- package/dist/esm/components/breadcrumbs.js.map +1 -1
- package/dist/esm/components/chart-area-linear.js +6 -66
- package/dist/esm/components/chart-area-linear.js.map +1 -1
- package/dist/esm/components/chart-radial-stacked.js +2 -48
- package/dist/esm/components/chart-radial-stacked.js.map +1 -1
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/confirm-dialog.js +2 -47
- package/dist/esm/components/confirm-dialog.js.map +1 -1
- package/dist/esm/components/conversation.js +1 -1
- package/dist/esm/components/convos.js +27 -607
- package/dist/esm/components/convos.js.map +1 -1
- package/dist/esm/components/data-table.js +1 -1
- package/dist/esm/components/date-picker.js +1 -1
- package/dist/esm/components/discoveries-created.js +4 -64
- package/dist/esm/components/discoveries-created.js.map +1 -1
- package/dist/esm/components/feedback.js +1 -1
- package/dist/esm/components/file-upload.js +1 -1
- package/dist/esm/components/filter.js +1 -1
- package/dist/esm/components/font-picker.js +1 -1
- package/dist/esm/components/generating-star.js +1 -1
- package/dist/esm/components/input-with-tags.js +1 -1
- package/dist/esm/components/logo.js +1 -1
- package/dist/esm/components/markdown.js +1 -2
- package/dist/esm/components/markdown.js.map +1 -1
- package/dist/esm/components/metric-card.js +3 -29
- package/dist/esm/components/metric-card.js.map +1 -1
- package/dist/esm/components/select.js +1 -1
- package/dist/esm/components/trend-value.js +1 -1
- package/dist/esm/components/two-level-combobox.js +1 -1
- package/dist/esm/components/ui/accordion.js +7 -46
- package/dist/esm/components/ui/accordion.js.map +1 -1
- package/dist/esm/components/ui/alert-dialog.js +3 -114
- package/dist/esm/components/ui/alert-dialog.js.map +1 -1
- package/dist/esm/components/ui/alert.js +4 -103
- package/dist/esm/components/ui/alert.js.map +1 -1
- package/dist/esm/components/ui/avatar.js +7 -89
- package/dist/esm/components/ui/avatar.js.map +1 -1
- package/dist/esm/components/ui/badge.js +2 -26
- package/dist/esm/components/ui/badge.js.map +1 -1
- package/dist/esm/components/ui/breadcrumb.js +4 -60
- package/dist/esm/components/ui/breadcrumb.js.map +1 -1
- package/dist/esm/components/ui/button-group.js +4 -88
- package/dist/esm/components/ui/button-group.js.map +1 -1
- package/dist/esm/components/ui/button.js +1 -5
- package/dist/esm/components/ui/button.js.map +1 -1
- package/dist/esm/components/ui/calendar.js +2 -20
- package/dist/esm/components/ui/calendar.js.map +1 -1
- package/dist/esm/components/ui/card.js +1 -55
- package/dist/esm/components/ui/card.js.map +1 -1
- package/dist/esm/components/ui/collapsible.js +1 -33
- package/dist/esm/components/ui/collapsible.js.map +1 -1
- package/dist/esm/components/ui/combobox.js +1 -1
- package/dist/esm/components/ui/command.js +2 -79
- package/dist/esm/components/ui/command.js.map +1 -1
- package/dist/esm/components/ui/dialog.js +4 -60
- package/dist/esm/components/ui/dialog.js.map +1 -1
- package/dist/esm/components/ui/div-button.js +2 -61
- package/dist/esm/components/ui/div-button.js.map +1 -1
- package/dist/esm/components/ui/dropdown-menu.js +3 -114
- package/dist/esm/components/ui/dropdown-menu.js.map +1 -1
- package/dist/esm/components/ui/icon.js +2 -25
- package/dist/esm/components/ui/icon.js.map +1 -1
- package/dist/esm/components/ui/input.js +4 -47
- package/dist/esm/components/ui/input.js.map +1 -1
- package/dist/esm/components/ui/item.js +11 -140
- package/dist/esm/components/ui/item.js.map +1 -1
- package/dist/esm/components/ui/label.js +1 -19
- package/dist/esm/components/ui/label.js.map +1 -1
- package/dist/esm/components/ui/popover.js +1 -31
- package/dist/esm/components/ui/popover.js.map +1 -1
- package/dist/esm/components/ui/progress.js +2 -22
- package/dist/esm/components/ui/progress.js.map +1 -1
- package/dist/esm/components/ui/scroll-area.js +2 -32
- package/dist/esm/components/ui/scroll-area.js.map +1 -1
- package/dist/esm/components/ui/select.js +5 -66
- package/dist/esm/components/ui/select.js.map +1 -1
- package/dist/esm/components/ui/separator.js +1 -23
- package/dist/esm/components/ui/separator.js.map +1 -1
- package/dist/esm/components/ui/sheet.js +3 -62
- package/dist/esm/components/ui/sheet.js.map +1 -1
- package/dist/esm/components/ui/spinner.js +2 -17
- package/dist/esm/components/ui/spinner.js.map +1 -1
- package/dist/esm/components/ui/switch.js +2 -26
- package/dist/esm/components/ui/switch.js.map +1 -1
- package/dist/esm/components/ui/table.js +1 -82
- package/dist/esm/components/ui/table.js.map +1 -1
- package/dist/esm/components/ui/textarea.js +1 -33
- package/dist/esm/components/ui/textarea.js.map +1 -1
- package/dist/esm/components/ui/tooltip.js +3 -31
- package/dist/esm/components/ui/tooltip.js.map +1 -1
- package/dist/esm/global.css +1 -1
- package/dist/esm/index.js +1 -53
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/layouts/full-layout.js +1 -1
- package/dist/esm/layouts/header-nav.js +1 -1
- package/dist/esm/layouts/sidebar.js +1 -1
- package/dist/esm/logos/microsoft-logo.js +6 -66
- package/dist/esm/logos/microsoft-logo.js.map +1 -1
- package/dist/esm/logos/microsoft-teams-logo.js +12 -112
- package/dist/esm/logos/microsoft-teams-logo.js.map +1 -1
- package/dist/esm/logos/slack-logo.js +3 -39
- package/dist/esm/logos/slack-logo.js.map +1 -1
- package/dist/esm/scenes/knowledge-review.js +17 -380
- package/dist/esm/scenes/knowledge-review.js.map +1 -1
- package/dist/esm/tailwind.preset.js +1 -1526
- package/dist/esm/tailwind.preset.js.map +1 -1
- package/dist/index.d.ts +48 -3
- package/dist/logo.d.ts +9 -0
- package/dist/stats.html +47 -46
- package/package.json +17 -18
- package/tailwind.preset.ts +1 -0
- package/dist/esm/chunks/ChatSearch.CL2VnSod.js +0 -6697
- package/dist/esm/chunks/ChatSearch.CL2VnSod.js.map +0 -1
- package/dist/esm/chunks/Conversation.BriXFYqU.js +0 -831
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js +0 -39715
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js.map +0 -1
- package/dist/esm/chunks/MermaidDiagram.xQ0CVFOI.js +0 -50
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js +0 -8
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js.map +0 -1
- package/dist/esm/chunks/button.DQL6gCAt.js +0 -48
- package/dist/esm/chunks/chart.4ZbtBMmR.js +0 -199
- package/dist/esm/chunks/combobox.CJKym3Z1.js +0 -95
- package/dist/esm/chunks/dark.Cq2RCgy4.js +0 -18
- package/dist/esm/chunks/data-table.DbcAYxMY.js +0 -102
- package/dist/esm/chunks/date-picker._cBTpdEK.js +0 -26
- package/dist/esm/chunks/extends.mO86zOh3.js +0 -12
- package/dist/esm/chunks/extends.mO86zOh3.js.map +0 -1
- package/dist/esm/chunks/feature-flags.DeDEcnd1.js +0 -22
- package/dist/esm/chunks/feedback.W2OzN-5r.js +0 -214
- package/dist/esm/chunks/file-upload-status.DP2iuttI.js +0 -141
- package/dist/esm/chunks/filters.-7vSLEQ2.js +0 -565
- package/dist/esm/chunks/font-picker.DisEoE8a.js +0 -181
- package/dist/esm/chunks/formatDate.CWN6IFKq.js +0 -952
- package/dist/esm/chunks/formatNumber.Bm2k8QrT.js +0 -10
- package/dist/esm/chunks/generating-star.DMDPNTaM.js +0 -1501
- package/dist/esm/chunks/generating-star.DMDPNTaM.js.map +0 -1
- package/dist/esm/chunks/header-nav.b4hvOsKc.js +0 -197
- package/dist/esm/chunks/header-pane.BV7xKJXV.js +0 -559
- package/dist/esm/chunks/hooks.m-nIJmio.js +0 -337
- package/dist/esm/chunks/hooks.m-nIJmio.js.map +0 -1
- package/dist/esm/chunks/index.BqibIWDw.js +0 -137
- package/dist/esm/chunks/input-with-tags.tg2nhPFv.js +0 -110
- package/dist/esm/chunks/logo.D5BMN6Db.js +0 -191
- package/dist/esm/chunks/primary.CtiRZbqq.js +0 -18
- package/dist/esm/chunks/review-list.BtSnfpSc.js +0 -117
- package/dist/esm/chunks/sidebar.PfXKnt9J.js +0 -803
- package/dist/esm/chunks/sidebar.PfXKnt9J.js.map +0 -1
- package/dist/esm/chunks/simpleSelect.B1rktKkt.js +0 -23
- package/dist/esm/chunks/status-badge.eFJ1PYeb.js +0 -18
- package/dist/esm/chunks/trend-value.COSukPwk.js +0 -51
- package/dist/esm/chunks/two-level-combobox.BXs2z9u5.js +0 -132
- package/dist/esm/chunks/useChartDateFormatters.DS9ASgFO.js +0 -11
- package/dist/esm/chunks/utils.Cwtlq8dh.js +0 -45
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback, useEffect, useMemo } from 'react';
|
|
2
|
-
import { createId } from '@paralleldrive/cuid2';
|
|
3
|
-
|
|
4
|
-
const defaultRetryOptions = {
|
|
5
|
-
maxRetries: 3,
|
|
6
|
-
baseDelay: 1e3,
|
|
7
|
-
shouldRetry: (error) => {
|
|
8
|
-
if (error instanceof TypeError) {
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
const apiError = error;
|
|
12
|
-
return apiError.status ? apiError.status >= 500 : false;
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
const defaultFallbackConfig = {
|
|
16
|
-
emptyResponse: "I apologize, but I couldn't generate an answer at this time. Please try again.",
|
|
17
|
-
errorResponse: "I encountered an error while processing your request. Please try again."
|
|
18
|
-
};
|
|
19
|
-
let globalRetryOptions = { ...defaultRetryOptions };
|
|
20
|
-
let globalFallbackConfig = { ...defaultFallbackConfig };
|
|
21
|
-
async function delay(ms) {
|
|
22
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
23
|
-
}
|
|
24
|
-
async function makeRequest(url, config = {}) {
|
|
25
|
-
const { retry = {}, headers = {}, body, isStream = false, fallback = {}, ...fetchConfig } = config;
|
|
26
|
-
const retryOptions = {
|
|
27
|
-
...globalRetryOptions,
|
|
28
|
-
...retry
|
|
29
|
-
};
|
|
30
|
-
const fallbackOptions = {
|
|
31
|
-
...globalFallbackConfig,
|
|
32
|
-
...fallback
|
|
33
|
-
};
|
|
34
|
-
let attempt = 1;
|
|
35
|
-
while (true) {
|
|
36
|
-
try {
|
|
37
|
-
const response = await fetch(url, {
|
|
38
|
-
...fetchConfig,
|
|
39
|
-
headers: {
|
|
40
|
-
"Content-Type": "application/json",
|
|
41
|
-
...headers
|
|
42
|
-
},
|
|
43
|
-
body: body ? JSON.stringify(body) : void 0
|
|
44
|
-
});
|
|
45
|
-
if (response.ok) {
|
|
46
|
-
if (isStream) {
|
|
47
|
-
if (!response.ok) {
|
|
48
|
-
throw new Error("Failed to fetch answer");
|
|
49
|
-
}
|
|
50
|
-
return response;
|
|
51
|
-
}
|
|
52
|
-
const data = await response.json();
|
|
53
|
-
if (!data || typeof data === "object" && Object.keys(data).length === 0) {
|
|
54
|
-
const emptyError = new Error(fallbackOptions.emptyResponse);
|
|
55
|
-
emptyError.name = "EmptyResponseError";
|
|
56
|
-
throw emptyError;
|
|
57
|
-
}
|
|
58
|
-
return data;
|
|
59
|
-
}
|
|
60
|
-
const error = new Error(fallbackOptions.errorResponse);
|
|
61
|
-
error.status = response.status;
|
|
62
|
-
error.data = await response.json().catch(() => void 0);
|
|
63
|
-
throw error;
|
|
64
|
-
} catch (error) {
|
|
65
|
-
const shouldAttemptRetry = await Promise.resolve(retryOptions.shouldRetry(error, attempt));
|
|
66
|
-
if (attempt >= retryOptions.maxRetries || !shouldAttemptRetry) {
|
|
67
|
-
if (error instanceof Error && error.name === "EmptyResponseError") {
|
|
68
|
-
return { message: error.message };
|
|
69
|
-
}
|
|
70
|
-
throw error;
|
|
71
|
-
}
|
|
72
|
-
console.warn(`Request failed, attempt ${attempt} of ${retryOptions.maxRetries}. Retrying...`);
|
|
73
|
-
const jitter = Math.random() * 0.3 + 0.85;
|
|
74
|
-
await delay(retryOptions.baseDelay * Math.pow(2, attempt - 1) * jitter);
|
|
75
|
-
attempt++;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const searchRetryConfig = {
|
|
81
|
-
maxRetries: 3,
|
|
82
|
-
baseDelay: 300,
|
|
83
|
-
// Start with 300ms delay
|
|
84
|
-
shouldRetry: (error) => {
|
|
85
|
-
if (error instanceof TypeError) {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
const apiError = error;
|
|
89
|
-
return apiError.status ? apiError.status >= 500 || apiError.status === 429 : false;
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
const answerRetryConfig = {
|
|
93
|
-
maxRetries: 3,
|
|
94
|
-
baseDelay: 500,
|
|
95
|
-
// Start with 500ms delay for streaming responses
|
|
96
|
-
shouldRetry: (error) => {
|
|
97
|
-
if (error instanceof TypeError) {
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
const apiError = error;
|
|
101
|
-
return apiError.status ? apiError.status >= 500 : false;
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
async function searchApi({
|
|
105
|
-
endpoint,
|
|
106
|
-
query,
|
|
107
|
-
collectionId,
|
|
108
|
-
headers,
|
|
109
|
-
conversationId,
|
|
110
|
-
attributes,
|
|
111
|
-
secretAttributes,
|
|
112
|
-
allowedRegions,
|
|
113
|
-
source
|
|
114
|
-
}) {
|
|
115
|
-
const payload = await makeRequest(endpoint, {
|
|
116
|
-
method: "POST",
|
|
117
|
-
headers,
|
|
118
|
-
retry: searchRetryConfig,
|
|
119
|
-
body: {
|
|
120
|
-
query,
|
|
121
|
-
limit: 5,
|
|
122
|
-
...collectionId && collectionId !== "all" && { collectionId },
|
|
123
|
-
...conversationId && { conversationId },
|
|
124
|
-
...attributes && { attributes },
|
|
125
|
-
...secretAttributes && { secretAttributes },
|
|
126
|
-
...allowedRegions && { allowedRegions },
|
|
127
|
-
...source && { source }
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
return {
|
|
131
|
-
results: payload?.data,
|
|
132
|
-
searchQueryId: payload?.searchQuery?.id,
|
|
133
|
-
isAgenticResponse: payload?.isAgenticResponse
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
async function fetchAnswerStream({
|
|
137
|
-
endpoint,
|
|
138
|
-
headers,
|
|
139
|
-
body
|
|
140
|
-
}) {
|
|
141
|
-
return makeRequest(endpoint, {
|
|
142
|
-
method: "POST",
|
|
143
|
-
headers,
|
|
144
|
-
retry: answerRetryConfig,
|
|
145
|
-
isStream: true,
|
|
146
|
-
fallback: {
|
|
147
|
-
emptyResponse: "I apologize, but I couldn't generate an answer for your query. Please try rephrasing your question.",
|
|
148
|
-
errorResponse: "I encountered an issue while generating the answer. Please try again in a moment."
|
|
149
|
-
},
|
|
150
|
-
body
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
function createConversationId() {
|
|
154
|
-
return createId();
|
|
155
|
-
}
|
|
156
|
-
async function uploadFileToApi({
|
|
157
|
-
endpoint,
|
|
158
|
-
conversationId,
|
|
159
|
-
file,
|
|
160
|
-
headers
|
|
161
|
-
}) {
|
|
162
|
-
const formData = new FormData();
|
|
163
|
-
formData.append("file", file);
|
|
164
|
-
formData.append("conversationId", conversationId);
|
|
165
|
-
const response = await fetch(endpoint, {
|
|
166
|
-
method: "POST",
|
|
167
|
-
headers,
|
|
168
|
-
body: formData
|
|
169
|
-
});
|
|
170
|
-
if (!response.ok) {
|
|
171
|
-
throw new Error(`Upload failed with status ${response.status}`);
|
|
172
|
-
}
|
|
173
|
-
const json = await response.json();
|
|
174
|
-
return { publicUrl: json.data.publicUrl };
|
|
175
|
-
}
|
|
176
|
-
async function sendFeedback({
|
|
177
|
-
endpoint,
|
|
178
|
-
searchQueryId,
|
|
179
|
-
response,
|
|
180
|
-
headers,
|
|
181
|
-
conversationId
|
|
182
|
-
}) {
|
|
183
|
-
await makeRequest(endpoint, {
|
|
184
|
-
method: "POST",
|
|
185
|
-
headers,
|
|
186
|
-
body: {
|
|
187
|
-
searchQueryId,
|
|
188
|
-
response,
|
|
189
|
-
...conversationId && { conversationId }
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
async function sendFeedbackReason({
|
|
194
|
-
endpoint,
|
|
195
|
-
searchQueryId,
|
|
196
|
-
reason,
|
|
197
|
-
headers
|
|
198
|
-
}) {
|
|
199
|
-
await makeRequest(endpoint, {
|
|
200
|
-
method: "POST",
|
|
201
|
-
headers,
|
|
202
|
-
body: {
|
|
203
|
-
searchQueryId,
|
|
204
|
-
reason
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
async function loadConversation({
|
|
209
|
-
endpoint,
|
|
210
|
-
conversationId,
|
|
211
|
-
headers,
|
|
212
|
-
signal
|
|
213
|
-
}) {
|
|
214
|
-
const payload = await makeRequest(endpoint, {
|
|
215
|
-
method: "POST",
|
|
216
|
-
headers,
|
|
217
|
-
body: { conversationId },
|
|
218
|
-
signal
|
|
219
|
-
});
|
|
220
|
-
return { data: payload.data };
|
|
221
|
-
}
|
|
222
|
-
async function fetchFollowUpQuestions({
|
|
223
|
-
endpoint,
|
|
224
|
-
searchQueryId,
|
|
225
|
-
headers,
|
|
226
|
-
conversationId
|
|
227
|
-
}) {
|
|
228
|
-
const data = await makeRequest(endpoint, {
|
|
229
|
-
method: "POST",
|
|
230
|
-
headers,
|
|
231
|
-
body: {
|
|
232
|
-
searchQueryId,
|
|
233
|
-
...conversationId
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
return data.questions;
|
|
237
|
-
}
|
|
238
|
-
async function fetchAutocomplete({
|
|
239
|
-
endpoint,
|
|
240
|
-
query,
|
|
241
|
-
collectionId,
|
|
242
|
-
headers,
|
|
243
|
-
conversationId,
|
|
244
|
-
allowedRegions
|
|
245
|
-
}) {
|
|
246
|
-
const data = await makeRequest(endpoint, {
|
|
247
|
-
method: "POST",
|
|
248
|
-
headers,
|
|
249
|
-
retry: searchRetryConfig,
|
|
250
|
-
body: {
|
|
251
|
-
query,
|
|
252
|
-
...collectionId && collectionId !== "all" && { collectionId },
|
|
253
|
-
...conversationId && { conversationId },
|
|
254
|
-
...allowedRegions && { allowedRegions }
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
return data;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
function useDebounce(value, delay) {
|
|
261
|
-
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
262
|
-
useEffect(() => {
|
|
263
|
-
const handler = setTimeout(() => {
|
|
264
|
-
setDebouncedValue(value);
|
|
265
|
-
}, delay);
|
|
266
|
-
return () => {
|
|
267
|
-
clearTimeout(handler);
|
|
268
|
-
};
|
|
269
|
-
}, [value, delay]);
|
|
270
|
-
return debouncedValue;
|
|
271
|
-
}
|
|
272
|
-
function useAutocomplete({
|
|
273
|
-
query,
|
|
274
|
-
endpoint,
|
|
275
|
-
allowedRegions,
|
|
276
|
-
collectionId,
|
|
277
|
-
headers,
|
|
278
|
-
conversationId,
|
|
279
|
-
delay = 300
|
|
280
|
-
}) {
|
|
281
|
-
const [suggestions, setSuggestions] = useState([]);
|
|
282
|
-
const [isLoading, setIsLoading] = useState(false);
|
|
283
|
-
const [error, setError] = useState();
|
|
284
|
-
const debouncedQuery = useDebounce(query, delay);
|
|
285
|
-
const fetchSuggestions = useCallback(async () => {
|
|
286
|
-
if (!debouncedQuery.trim()) {
|
|
287
|
-
setSuggestions([]);
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
setIsLoading(true);
|
|
291
|
-
setError(void 0);
|
|
292
|
-
try {
|
|
293
|
-
const payload = await fetchAutocomplete({
|
|
294
|
-
endpoint,
|
|
295
|
-
query: debouncedQuery,
|
|
296
|
-
collectionId,
|
|
297
|
-
headers,
|
|
298
|
-
conversationId,
|
|
299
|
-
allowedRegions
|
|
300
|
-
});
|
|
301
|
-
if (payload?.response?.results) {
|
|
302
|
-
const lowerCaseQuery = debouncedQuery.toLowerCase();
|
|
303
|
-
const sortedSuggestions = payload.response.results.sort((a, b) => {
|
|
304
|
-
const aStartsWithQuery = a.question.toLowerCase().startsWith(lowerCaseQuery);
|
|
305
|
-
const bStartsWithQuery = b.question.toLowerCase().startsWith(lowerCaseQuery);
|
|
306
|
-
if (aStartsWithQuery && !bStartsWithQuery) return -1;
|
|
307
|
-
if (!aStartsWithQuery && bStartsWithQuery) return 1;
|
|
308
|
-
return 0;
|
|
309
|
-
});
|
|
310
|
-
setSuggestions(sortedSuggestions);
|
|
311
|
-
} else {
|
|
312
|
-
setSuggestions([]);
|
|
313
|
-
}
|
|
314
|
-
} catch (err) {
|
|
315
|
-
console.error("Error fetching autocomplete suggestions:", err);
|
|
316
|
-
setError(err instanceof Error ? err.message : "Failed to fetch suggestions");
|
|
317
|
-
setSuggestions([]);
|
|
318
|
-
} finally {
|
|
319
|
-
setIsLoading(false);
|
|
320
|
-
}
|
|
321
|
-
}, [debouncedQuery, endpoint, collectionId, headers, conversationId, allowedRegions]);
|
|
322
|
-
useEffect(() => {
|
|
323
|
-
void fetchSuggestions();
|
|
324
|
-
}, [fetchSuggestions]);
|
|
325
|
-
return { suggestions, isLoading, error };
|
|
326
|
-
}
|
|
327
|
-
function useSubstringFilter() {
|
|
328
|
-
return useMemo(
|
|
329
|
-
() => ({
|
|
330
|
-
contains: (text, substring) => text.toLowerCase().includes(substring.toLowerCase())
|
|
331
|
-
}),
|
|
332
|
-
[]
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
export { uploadFileToApi as a, useAutocomplete as b, createConversationId as c, sendFeedback as d, searchApi as e, fetchAnswerStream as f, fetchFollowUpQuestions as g, loadConversation as l, sendFeedbackReason as s, useSubstringFilter as u };
|
|
337
|
-
//# sourceMappingURL=hooks.m-nIJmio.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.m-nIJmio.js","sources":["../../../src/lib/fetchClient.ts","../../../src/lib/api.ts","../../../src/lib/hooks.ts"],"sourcesContent":["interface RetryOptions {\n maxRetries?: number;\n baseDelay?: number;\n shouldRetry?: (error: Error, attempt: number) => boolean | Promise<boolean>;\n}\n\ninterface FallbackConfig {\n emptyResponse?: string;\n errorResponse?: string;\n}\n\ninterface RequestConfig<T> extends Omit<RequestInit, 'body'> {\n retry?: RetryOptions;\n body?: T;\n isStream?: boolean;\n fallback?: FallbackConfig;\n}\n\ninterface APIError extends Error {\n status?: number;\n data?: unknown;\n}\n\nconst defaultRetryOptions: Required<RetryOptions> = {\n maxRetries: 3,\n baseDelay: 1000,\n shouldRetry: (error: Error) => {\n // By default, retry on network errors and 5xx server errors\n if (error instanceof TypeError) {\n return true; // Network errors\n }\n\n const apiError = error as APIError;\n\n return apiError.status ? apiError.status >= 500 : false;\n },\n};\n\nconst defaultFallbackConfig: Required<FallbackConfig> = {\n emptyResponse: \"I apologize, but I couldn't generate an answer at this time. Please try again.\",\n errorResponse: 'I encountered an error while processing your request. Please try again.',\n};\n\nlet globalRetryOptions: Required<RetryOptions> = { ...defaultRetryOptions };\nlet globalFallbackConfig: Required<FallbackConfig> = { ...defaultFallbackConfig };\n\nexport function configureRetry(options: RetryOptions): void {\n globalRetryOptions = {\n ...defaultRetryOptions,\n ...options,\n };\n}\n\nexport function configureFallback(config: FallbackConfig): void {\n globalFallbackConfig = {\n ...defaultFallbackConfig,\n ...config,\n };\n}\n\nasync function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function makeRequest<TResponse, TBody = unknown>(url: string | URL, config: RequestConfig<TBody> = {}): Promise<TResponse> {\n const { retry = {}, headers = {}, body, isStream = false, fallback = {}, ...fetchConfig } = config;\n const retryOptions = {\n ...globalRetryOptions,\n ...retry,\n };\n const fallbackOptions = {\n ...globalFallbackConfig,\n ...fallback,\n };\n\n let attempt = 1;\n\n while (true) {\n try {\n const response = await fetch(url, {\n ...fetchConfig,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (response.ok) {\n // For streaming responses, return the response object directly\n if (isStream) {\n if (!response.ok) {\n throw new Error('Failed to fetch answer');\n }\n\n return response as unknown as TResponse;\n }\n\n const data = await response.json();\n // Check for empty response in JSON\n if (!data || (typeof data === 'object' && Object.keys(data).length === 0)) {\n const emptyError = new Error(fallbackOptions.emptyResponse);\n emptyError.name = 'EmptyResponseError';\n throw emptyError;\n }\n\n return data as TResponse;\n }\n\n const error = new Error(fallbackOptions.errorResponse) as APIError;\n error.status = response.status;\n error.data = await response.json().catch(() => undefined);\n throw error;\n } catch (error) {\n const shouldAttemptRetry = await Promise.resolve(retryOptions.shouldRetry(error as Error, attempt));\n\n if (attempt >= retryOptions.maxRetries || !shouldAttemptRetry) {\n if (error instanceof Error && error.name === 'EmptyResponseError') {\n return { message: error.message } as TResponse;\n }\n throw error;\n }\n\n console.warn(`Request failed, attempt ${attempt} of ${retryOptions.maxRetries}. Retrying...`);\n\n // Exponential backoff with jitter to prevent thundering herd\n const jitter = Math.random() * 0.3 + 0.85; // Random between 0.85-1.15\n await delay(retryOptions.baseDelay * Math.pow(2, attempt - 1) * jitter);\n attempt++;\n }\n }\n}\n","import { createId } from '@paralleldrive/cuid2';\n\nimport { makeRequest } from './fetchClient';\n\nimport {\n SearchResponse,\n FeedbackResponse,\n APIFeedbackResponse,\n SearchResult,\n ActionInputs,\n ClientExecutionResult,\n SearchQueryAttributes,\n} from '@/components/chat-search/types';\n\n// Retry configurations for different endpoints\nconst searchRetryConfig = {\n maxRetries: 3,\n baseDelay: 300, // Start with 300ms delay\n shouldRetry: (error: Error) => {\n if (error instanceof TypeError) {\n return true; // Network errors\n }\n const apiError = error as { status?: number };\n // Retry on server errors (5xx) and rate limits (429)\n\n return apiError.status ? apiError.status >= 500 || apiError.status === 429 : false;\n },\n};\n\nconst answerRetryConfig = {\n maxRetries: 3,\n baseDelay: 500, // Start with 500ms delay for streaming responses\n shouldRetry: (error: Error) => {\n if (error instanceof TypeError) {\n return true; // Network errors\n }\n const apiError = error as { status?: number };\n // Only retry on server errors, not on client errors\n\n return apiError.status ? apiError.status >= 500 : false;\n },\n};\n\ninterface APISearchResponse {\n data: Array<{\n id: string;\n title: string;\n url: string;\n }>;\n searchQuery: {\n id: string;\n };\n isAgenticResponse?: boolean;\n}\n\nexport async function searchApi({\n endpoint,\n query,\n collectionId,\n headers,\n conversationId,\n attributes,\n secretAttributes,\n allowedRegions,\n source,\n}: {\n endpoint: string;\n query: string;\n collectionId?: string;\n headers?: Record<string, string>;\n conversationId?: string;\n attributes?: SearchQueryAttributes;\n secretAttributes?: string;\n allowedRegions?: string[];\n source?: string;\n}): Promise<SearchResponse> {\n const payload = await makeRequest<\n APISearchResponse,\n {\n query: string;\n limit: number;\n collectionId?: string;\n conversationId?: string;\n source?: string;\n }\n >(endpoint, {\n method: 'POST',\n headers,\n retry: searchRetryConfig,\n body: {\n query,\n limit: 5,\n ...(collectionId && collectionId !== 'all' && { collectionId }),\n ...(conversationId && { conversationId }),\n ...(attributes && { attributes }),\n ...(secretAttributes && { secretAttributes }),\n ...(allowedRegions && { allowedRegions }),\n ...(source && { source }),\n },\n });\n\n return {\n results: payload?.data,\n searchQueryId: payload?.searchQuery?.id,\n isAgenticResponse: payload?.isAgenticResponse,\n };\n}\n\nexport async function fetchAnswer({\n endpoint,\n searchQueryId,\n headers,\n conversationId,\n}: {\n endpoint: string;\n searchQueryId: string;\n headers?: Record<string, string>;\n conversationId?: string;\n}): Promise<Response> {\n return makeRequest<\n Response,\n {\n searchQueryId: string;\n conversationId?: string;\n }\n >(endpoint, {\n method: 'POST',\n headers,\n retry: answerRetryConfig,\n isStream: true,\n fallback: {\n emptyResponse: \"I apologize, but I couldn't generate an answer for your query. Please try rephrasing your question.\",\n errorResponse: 'I encountered an issue while generating the answer. Please try again in a moment.',\n },\n body: {\n searchQueryId,\n ...(conversationId && { conversationId }),\n },\n });\n}\n\nexport async function fetchAnswerStream({\n endpoint,\n headers,\n body,\n}: {\n endpoint: string;\n headers?: Record<string, string>;\n body:\n | {\n type: 'generate-for-query';\n conversationId?: string;\n searchQueryId: string;\n profileId?: string;\n context?: { type: 'text'; text: string }[];\n attachments?: { type: string; url: string; filename?: string }[];\n }\n | {\n type: 'invoke-action';\n conversationId?: string;\n searchQueryId: string;\n searchIntentId: string;\n actionId: string;\n parameters: ActionInputs;\n profileId?: string;\n }\n | {\n type: 'client-execution-result';\n conversationId?: string;\n searchQueryId: string;\n searchIntentId: string;\n actionId: string;\n results: ClientExecutionResult;\n profileId?: string;\n };\n}): Promise<Response> {\n return makeRequest<Response, typeof body>(endpoint, {\n method: 'POST',\n headers,\n retry: answerRetryConfig,\n isStream: true,\n fallback: {\n emptyResponse: \"I apologize, but I couldn't generate an answer for your query. Please try rephrasing your question.\",\n errorResponse: 'I encountered an issue while generating the answer. Please try again in a moment.',\n },\n body,\n });\n}\n\n// Helper function to generate a unique conversation ID\nexport function createConversationId(): string {\n return createId();\n}\n\nexport async function uploadFileToApi({\n endpoint,\n conversationId,\n file,\n headers,\n}: {\n endpoint: string;\n conversationId: string;\n file: File;\n headers?: Record<string, string>;\n}): Promise<{ publicUrl: string }> {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('conversationId', conversationId);\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed with status ${response.status}`);\n }\n\n const json = (await response.json()) as { data: { publicUrl: string } };\n\n return { publicUrl: json.data.publicUrl };\n}\n\nexport async function sendFeedback({\n endpoint,\n searchQueryId,\n response,\n headers,\n conversationId,\n}: {\n endpoint: string;\n searchQueryId: string;\n response: FeedbackResponse;\n headers?: Record<string, string>;\n conversationId?: string;\n}): Promise<void> {\n await makeRequest<\n void,\n {\n searchQueryId: string;\n response: FeedbackResponse;\n conversationId?: string;\n }\n >(endpoint, {\n method: 'POST',\n headers,\n body: {\n searchQueryId,\n response,\n ...(conversationId && { conversationId }),\n },\n });\n}\n\nexport async function sendFeedbackReason({\n endpoint,\n searchQueryId,\n reason,\n headers,\n}: {\n endpoint: string;\n searchQueryId: string;\n reason: string;\n headers?: Record<string, string>;\n conversationId?: string;\n}): Promise<void> {\n await makeRequest<\n void,\n {\n searchQueryId: string;\n reason: string;\n conversationId?: string;\n }\n >(endpoint, {\n method: 'POST',\n headers,\n body: {\n searchQueryId,\n reason,\n },\n });\n}\n\nexport interface ConversationResponse {\n data: Array<{\n question: string;\n answer: string;\n searchQueryId: string;\n searchResults?: SearchResult[];\n searchIntentId?: string;\n feedback?: APIFeedbackResponse;\n }>;\n}\n\nexport async function loadConversation({\n endpoint,\n conversationId,\n headers,\n signal,\n}: {\n endpoint: string;\n conversationId: string;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}): Promise<{ data: ConversationResponse['data'] }> {\n const payload = await makeRequest<\n ConversationResponse,\n {\n conversationId: string;\n }\n >(endpoint, {\n method: 'POST',\n headers,\n body: { conversationId },\n signal,\n });\n\n return { data: payload.data };\n}\n\ninterface FollowUpQuestionsResponse {\n questions: string[];\n}\n\nexport async function fetchFollowUpQuestions({\n endpoint,\n searchQueryId,\n headers,\n conversationId,\n}: {\n endpoint: string;\n searchQueryId: string;\n headers?: Record<string, string>;\n conversationId?: string;\n}): Promise<string[]> {\n const data = await makeRequest<\n FollowUpQuestionsResponse,\n {\n searchQueryId: string;\n conversationId?: string;\n }\n >(endpoint, {\n method: 'POST',\n headers,\n body: {\n searchQueryId,\n ...(conversationId && { conversationId }),\n },\n });\n\n return data.questions;\n}\n\ninterface AutocompleteResponse {\n response: {\n results: Array<{\n id: string;\n question: string;\n }>;\n };\n}\n\nexport async function fetchAutocomplete({\n endpoint,\n query,\n collectionId,\n headers,\n conversationId,\n allowedRegions,\n}: {\n endpoint: string;\n query: string;\n collectionId?: string;\n headers?: Record<string, string>;\n conversationId?: string;\n allowedRegions?: string[];\n}): Promise<AutocompleteResponse> {\n const data = await makeRequest<\n AutocompleteResponse,\n {\n query: string;\n collectionId?: string;\n conversationId?: string;\n allowedRegions?: string[];\n }\n >(endpoint, {\n method: 'POST',\n headers,\n retry: searchRetryConfig,\n body: {\n query,\n ...(collectionId && collectionId !== 'all' && { collectionId }),\n ...(conversationId && { conversationId }),\n ...(allowedRegions && { allowedRegions }),\n },\n });\n\n return data;\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react';\n\nimport { fetchAutocomplete } from './api';\n\nimport type { Suggestion } from '@/components/chat-search/types';\n\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nexport function useAutocomplete({\n query,\n endpoint,\n allowedRegions,\n collectionId,\n headers,\n conversationId,\n delay = 300,\n}: {\n query: string;\n endpoint: string;\n allowedRegions?: string[];\n collectionId?: string;\n headers?: Record<string, string>;\n conversationId?: string;\n delay?: number;\n}) {\n const [suggestions, setSuggestions] = useState<Suggestion[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string>();\n\n const debouncedQuery = useDebounce(query, delay);\n\n const fetchSuggestions = useCallback(async () => {\n if (!debouncedQuery.trim()) {\n setSuggestions([]);\n\n return;\n }\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n const payload = await fetchAutocomplete({\n endpoint,\n query: debouncedQuery,\n collectionId,\n headers,\n conversationId,\n allowedRegions,\n });\n if (payload?.response?.results) {\n // move suggestions that don't prefix with the debounced question to the bottom\n const lowerCaseQuery = debouncedQuery.toLowerCase();\n const sortedSuggestions = payload.response.results.sort((a: { question: string }, b: { question: string }) => {\n const aStartsWithQuery = a.question.toLowerCase().startsWith(lowerCaseQuery);\n const bStartsWithQuery = b.question.toLowerCase().startsWith(lowerCaseQuery);\n\n if (aStartsWithQuery && !bStartsWithQuery) return -1;\n if (!aStartsWithQuery && bStartsWithQuery) return 1;\n\n return 0; // preserve original order for items in same category\n });\n\n setSuggestions(sortedSuggestions);\n } else {\n setSuggestions([]);\n }\n } catch (err) {\n console.error('Error fetching autocomplete suggestions:', err);\n setError(err instanceof Error ? err.message : 'Failed to fetch suggestions');\n setSuggestions([]);\n } finally {\n setIsLoading(false);\n }\n }, [debouncedQuery, endpoint, collectionId, headers, conversationId, allowedRegions]);\n\n useEffect(() => {\n void fetchSuggestions();\n }, [fetchSuggestions]);\n\n return { suggestions, isLoading, error };\n}\n/** Stable `{ contains }` for case-insensitive substring checks when filtering lists. */\nexport function useSubstringFilter() {\n return useMemo(\n () => ({\n contains: (text: string, substring: string) => text.toLowerCase().includes(substring.toLowerCase()),\n }),\n [],\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
|
|
4
|
-
// packages/react/compose-refs/src/compose-refs.tsx
|
|
5
|
-
function setRef(ref, value) {
|
|
6
|
-
if (typeof ref === "function") {
|
|
7
|
-
return ref(value);
|
|
8
|
-
} else if (ref !== null && ref !== void 0) {
|
|
9
|
-
ref.current = value;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
function composeRefs(...refs) {
|
|
13
|
-
return (node) => {
|
|
14
|
-
let hasCleanup = false;
|
|
15
|
-
const cleanups = refs.map((ref) => {
|
|
16
|
-
const cleanup = setRef(ref, node);
|
|
17
|
-
if (!hasCleanup && typeof cleanup == "function") {
|
|
18
|
-
hasCleanup = true;
|
|
19
|
-
}
|
|
20
|
-
return cleanup;
|
|
21
|
-
});
|
|
22
|
-
if (hasCleanup) {
|
|
23
|
-
return () => {
|
|
24
|
-
for (let i = 0; i < cleanups.length; i++) {
|
|
25
|
-
const cleanup = cleanups[i];
|
|
26
|
-
if (typeof cleanup == "function") {
|
|
27
|
-
cleanup();
|
|
28
|
-
} else {
|
|
29
|
-
setRef(refs[i], null);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// src/slot.tsx
|
|
38
|
-
var REACT_LAZY_TYPE = Symbol.for("react.lazy");
|
|
39
|
-
var use = React[" use ".trim().toString()];
|
|
40
|
-
function isPromiseLike(value) {
|
|
41
|
-
return typeof value === "object" && value !== null && "then" in value;
|
|
42
|
-
}
|
|
43
|
-
function isLazyComponent(element) {
|
|
44
|
-
return element != null && typeof element === "object" && "$$typeof" in element && element.$$typeof === REACT_LAZY_TYPE && "_payload" in element && isPromiseLike(element._payload);
|
|
45
|
-
}
|
|
46
|
-
// @__NO_SIDE_EFFECTS__
|
|
47
|
-
function createSlot(ownerName) {
|
|
48
|
-
const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);
|
|
49
|
-
const Slot2 = React.forwardRef((props, forwardedRef) => {
|
|
50
|
-
let { children, ...slotProps } = props;
|
|
51
|
-
if (isLazyComponent(children) && typeof use === "function") {
|
|
52
|
-
children = use(children._payload);
|
|
53
|
-
}
|
|
54
|
-
const childrenArray = React.Children.toArray(children);
|
|
55
|
-
const slottable = childrenArray.find(isSlottable);
|
|
56
|
-
if (slottable) {
|
|
57
|
-
const newElement = slottable.props.children;
|
|
58
|
-
const newChildren = childrenArray.map((child) => {
|
|
59
|
-
if (child === slottable) {
|
|
60
|
-
if (React.Children.count(newElement) > 1) return React.Children.only(null);
|
|
61
|
-
return React.isValidElement(newElement) ? newElement.props.children : null;
|
|
62
|
-
} else {
|
|
63
|
-
return child;
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });
|
|
67
|
-
}
|
|
68
|
-
return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });
|
|
69
|
-
});
|
|
70
|
-
Slot2.displayName = `${ownerName}.Slot`;
|
|
71
|
-
return Slot2;
|
|
72
|
-
}
|
|
73
|
-
var Slot = /* @__PURE__ */ createSlot("Slot");
|
|
74
|
-
// @__NO_SIDE_EFFECTS__
|
|
75
|
-
function createSlotClone(ownerName) {
|
|
76
|
-
const SlotClone = React.forwardRef((props, forwardedRef) => {
|
|
77
|
-
let { children, ...slotProps } = props;
|
|
78
|
-
if (isLazyComponent(children) && typeof use === "function") {
|
|
79
|
-
children = use(children._payload);
|
|
80
|
-
}
|
|
81
|
-
if (React.isValidElement(children)) {
|
|
82
|
-
const childrenRef = getElementRef(children);
|
|
83
|
-
const props2 = mergeProps(slotProps, children.props);
|
|
84
|
-
if (children.type !== React.Fragment) {
|
|
85
|
-
props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
|
|
86
|
-
}
|
|
87
|
-
return React.cloneElement(children, props2);
|
|
88
|
-
}
|
|
89
|
-
return React.Children.count(children) > 1 ? React.Children.only(null) : null;
|
|
90
|
-
});
|
|
91
|
-
SlotClone.displayName = `${ownerName}.SlotClone`;
|
|
92
|
-
return SlotClone;
|
|
93
|
-
}
|
|
94
|
-
var SLOTTABLE_IDENTIFIER = Symbol("radix.slottable");
|
|
95
|
-
function isSlottable(child) {
|
|
96
|
-
return React.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
|
|
97
|
-
}
|
|
98
|
-
function mergeProps(slotProps, childProps) {
|
|
99
|
-
const overrideProps = { ...childProps };
|
|
100
|
-
for (const propName in childProps) {
|
|
101
|
-
const slotPropValue = slotProps[propName];
|
|
102
|
-
const childPropValue = childProps[propName];
|
|
103
|
-
const isHandler = /^on[A-Z]/.test(propName);
|
|
104
|
-
if (isHandler) {
|
|
105
|
-
if (slotPropValue && childPropValue) {
|
|
106
|
-
overrideProps[propName] = (...args) => {
|
|
107
|
-
const result = childPropValue(...args);
|
|
108
|
-
slotPropValue(...args);
|
|
109
|
-
return result;
|
|
110
|
-
};
|
|
111
|
-
} else if (slotPropValue) {
|
|
112
|
-
overrideProps[propName] = slotPropValue;
|
|
113
|
-
}
|
|
114
|
-
} else if (propName === "style") {
|
|
115
|
-
overrideProps[propName] = { ...slotPropValue, ...childPropValue };
|
|
116
|
-
} else if (propName === "className") {
|
|
117
|
-
overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(" ");
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return { ...slotProps, ...overrideProps };
|
|
121
|
-
}
|
|
122
|
-
function getElementRef(element) {
|
|
123
|
-
let getter = Object.getOwnPropertyDescriptor(element.props, "ref")?.get;
|
|
124
|
-
let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
|
|
125
|
-
if (mayWarn) {
|
|
126
|
-
return element.ref;
|
|
127
|
-
}
|
|
128
|
-
getter = Object.getOwnPropertyDescriptor(element, "ref")?.get;
|
|
129
|
-
mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
|
|
130
|
-
if (mayWarn) {
|
|
131
|
-
return element.props.ref;
|
|
132
|
-
}
|
|
133
|
-
return element.props.ref || element.ref;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export { Slot as S };
|
|
137
|
-
//# sourceMappingURL=index.BqibIWDw.js.map
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { Plus } from '@phosphor-icons/react';
|
|
3
|
-
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
4
|
-
import { Textarea } from '../components/ui/textarea.js';
|
|
5
|
-
import { B as Button } from './button.DQL6gCAt.js';
|
|
6
|
-
|
|
7
|
-
function InputWithTags({
|
|
8
|
-
title,
|
|
9
|
-
placeholder,
|
|
10
|
-
tags,
|
|
11
|
-
value: controlledValue,
|
|
12
|
-
defaultValue,
|
|
13
|
-
onChange,
|
|
14
|
-
onTagClick,
|
|
15
|
-
singleValue = false,
|
|
16
|
-
className,
|
|
17
|
-
inputClassName,
|
|
18
|
-
tagsClassName,
|
|
19
|
-
disabled,
|
|
20
|
-
name,
|
|
21
|
-
id,
|
|
22
|
-
required,
|
|
23
|
-
maxLength,
|
|
24
|
-
minLength,
|
|
25
|
-
rows
|
|
26
|
-
}) {
|
|
27
|
-
const findTagsInValue = React.useCallback(
|
|
28
|
-
(val) => {
|
|
29
|
-
if (!val) return /* @__PURE__ */ new Set();
|
|
30
|
-
const trimmedVal = val.trim();
|
|
31
|
-
const foundTags = /* @__PURE__ */ new Set();
|
|
32
|
-
for (const tag of tags) {
|
|
33
|
-
const tagValue = tag.value.trim();
|
|
34
|
-
if (singleValue) {
|
|
35
|
-
if (trimmedVal === tagValue) {
|
|
36
|
-
foundTags.add(tag.value);
|
|
37
|
-
}
|
|
38
|
-
} else {
|
|
39
|
-
if (trimmedVal === tagValue || trimmedVal.startsWith(tagValue + " ") || trimmedVal.includes(" " + tagValue + " ") || trimmedVal.endsWith(" " + tagValue)) {
|
|
40
|
-
foundTags.add(tag.value);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return foundTags;
|
|
45
|
-
},
|
|
46
|
-
[tags, singleValue]
|
|
47
|
-
);
|
|
48
|
-
const initialValue = controlledValue !== void 0 ? controlledValue : defaultValue || "";
|
|
49
|
-
const [internalValue, setInternalValue] = React.useState(defaultValue || "");
|
|
50
|
-
const [clickedTags, setClickedTags] = React.useState(() => findTagsInValue(initialValue));
|
|
51
|
-
const value = controlledValue !== void 0 ? controlledValue : internalValue;
|
|
52
|
-
React.useEffect(() => {
|
|
53
|
-
const currentValue = controlledValue !== void 0 ? controlledValue : internalValue;
|
|
54
|
-
setClickedTags(findTagsInValue(currentValue));
|
|
55
|
-
}, [controlledValue, internalValue, tags, singleValue, findTagsInValue]);
|
|
56
|
-
const availableTags = tags.filter((tag) => !clickedTags.has(tag.value));
|
|
57
|
-
const handleInputChange = (e) => {
|
|
58
|
-
const newValue = e.target.value;
|
|
59
|
-
if (controlledValue === void 0) {
|
|
60
|
-
setInternalValue(newValue);
|
|
61
|
-
setClickedTags(findTagsInValue(newValue));
|
|
62
|
-
}
|
|
63
|
-
onChange?.(newValue);
|
|
64
|
-
};
|
|
65
|
-
const handleTagClick = (tag) => {
|
|
66
|
-
const newValue = singleValue ? tag.value : value ? `${value} ${tag.value}` : tag.value;
|
|
67
|
-
if (controlledValue === void 0) {
|
|
68
|
-
setInternalValue(newValue);
|
|
69
|
-
if (singleValue) {
|
|
70
|
-
setClickedTags(/* @__PURE__ */ new Set([tag.value]));
|
|
71
|
-
} else {
|
|
72
|
-
setClickedTags(findTagsInValue(newValue));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
onChange?.(newValue);
|
|
76
|
-
onTagClick?.(tag);
|
|
77
|
-
};
|
|
78
|
-
return /* @__PURE__ */ React.createElement("div", { className: cn("w-full flex flex-col gap-3", className) }, title && /* @__PURE__ */ React.createElement("label", { htmlFor: id, className: "text-sm font-semibold" }, title), /* @__PURE__ */ React.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React.createElement(
|
|
79
|
-
Textarea,
|
|
80
|
-
{
|
|
81
|
-
id,
|
|
82
|
-
name,
|
|
83
|
-
placeholder,
|
|
84
|
-
value,
|
|
85
|
-
onChange: handleInputChange,
|
|
86
|
-
disabled,
|
|
87
|
-
required,
|
|
88
|
-
maxLength,
|
|
89
|
-
minLength,
|
|
90
|
-
rows,
|
|
91
|
-
className: inputClassName
|
|
92
|
-
}
|
|
93
|
-
)), availableTags.length > 0 && /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-wrap gap-2", tagsClassName) }, availableTags.map((tag, index) => /* @__PURE__ */ React.createElement(
|
|
94
|
-
Button,
|
|
95
|
-
{
|
|
96
|
-
key: `${tag.value}-${index}`,
|
|
97
|
-
type: "button",
|
|
98
|
-
variant: "outline",
|
|
99
|
-
size: "sm",
|
|
100
|
-
onClick: () => handleTagClick(tag),
|
|
101
|
-
disabled,
|
|
102
|
-
className: "rounded-full"
|
|
103
|
-
},
|
|
104
|
-
/* @__PURE__ */ React.createElement(Plus, { size: 16, className: "text-muted-foreground" }),
|
|
105
|
-
/* @__PURE__ */ React.createElement("span", null, tag.label)
|
|
106
|
-
))));
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export { InputWithTags as I };
|
|
110
|
-
//# sourceMappingURL=input-with-tags.tg2nhPFv.js.map
|