@red-hat-developer-hub/backstage-plugin-intelligent-assistant 3.0.0
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/CHANGELOG.md +681 -0
- package/README.md +378 -0
- package/config.d.ts +70 -0
- package/dist/alpha.d.ts +285 -0
- package/dist/alpha.esm.js +3 -0
- package/dist/alpha.esm.js.map +1 -0
- package/dist/api/LightspeedApiClient.esm.js +234 -0
- package/dist/api/LightspeedApiClient.esm.js.map +1 -0
- package/dist/api/NotebooksApiClient.esm.js +179 -0
- package/dist/api/NotebooksApiClient.esm.js.map +1 -0
- package/dist/api/api.esm.js +8 -0
- package/dist/api/api.esm.js.map +1 -0
- package/dist/api/notebooksApi.esm.js +10 -0
- package/dist/api/notebooksApi.esm.js.map +1 -0
- package/dist/components/Attachment.esm.js +108 -0
- package/dist/components/Attachment.esm.js.map +1 -0
- package/dist/components/AttachmentContext.esm.js +125 -0
- package/dist/components/AttachmentContext.esm.js.map +1 -0
- package/dist/components/CollapsedHistoryStrip.esm.js +87 -0
- package/dist/components/CollapsedHistoryStrip.esm.js.map +1 -0
- package/dist/components/DeleteModal.esm.js +92 -0
- package/dist/components/DeleteModal.esm.js.map +1 -0
- package/dist/components/FilePreview.esm.js +49 -0
- package/dist/components/FilePreview.esm.js.map +1 -0
- package/dist/components/LightSpeedChat.esm.js +1898 -0
- package/dist/components/LightSpeedChat.esm.js.map +1 -0
- package/dist/components/LightspeedChatBox.esm.js +252 -0
- package/dist/components/LightspeedChatBox.esm.js.map +1 -0
- package/dist/components/LightspeedChatBoxHeader.esm.js +210 -0
- package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -0
- package/dist/components/LightspeedChatContainer.esm.js +162 -0
- package/dist/components/LightspeedChatContainer.esm.js.map +1 -0
- package/dist/components/LightspeedChatModelsState.esm.js +198 -0
- package/dist/components/LightspeedChatModelsState.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerContext.esm.js +15 -0
- package/dist/components/LightspeedDrawerContext.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerProvider.esm.js +44 -0
- package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerStateExposer.esm.js +34 -0
- package/dist/components/LightspeedDrawerStateExposer.esm.js.map +1 -0
- package/dist/components/LightspeedFAB.esm.js +6 -0
- package/dist/components/LightspeedFAB.esm.js.map +1 -0
- package/dist/components/LightspeedFABContent.esm.js +65 -0
- package/dist/components/LightspeedFABContent.esm.js.map +1 -0
- package/dist/components/LightspeedIcon.esm.js +46 -0
- package/dist/components/LightspeedIcon.esm.js.map +1 -0
- package/dist/components/LightspeedPage.esm.js +31 -0
- package/dist/components/LightspeedPage.esm.js.map +1 -0
- package/dist/components/McpServersSettings.esm.js +953 -0
- package/dist/components/McpServersSettings.esm.js.map +1 -0
- package/dist/components/McpSettingsIcon.esm.js +18 -0
- package/dist/components/McpSettingsIcon.esm.js.map +1 -0
- package/dist/components/MessageBarModelSelector.esm.js +92 -0
- package/dist/components/MessageBarModelSelector.esm.js.map +1 -0
- package/dist/components/PermissionRequiredIcon.esm.js +18 -0
- package/dist/components/PermissionRequiredIcon.esm.js.map +1 -0
- package/dist/components/PermissionRequiredState.esm.js +88 -0
- package/dist/components/PermissionRequiredState.esm.js.map +1 -0
- package/dist/components/RenameConversationModal.esm.js +157 -0
- package/dist/components/RenameConversationModal.esm.js.map +1 -0
- package/dist/components/Router.esm.js +35 -0
- package/dist/components/Router.esm.js.map +1 -0
- package/dist/components/SourcesChipModal.esm.js +124 -0
- package/dist/components/SourcesChipModal.esm.js.map +1 -0
- package/dist/components/ToolCallContent.esm.js +208 -0
- package/dist/components/ToolCallContent.esm.js.map +1 -0
- package/dist/components/Trans.esm.js +33 -0
- package/dist/components/Trans.esm.js.map +1 -0
- package/dist/components/notebooks/AddDocumentModal.esm.js +271 -0
- package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -0
- package/dist/components/notebooks/DeleteDocumentModal.esm.js +131 -0
- package/dist/components/notebooks/DeleteDocumentModal.esm.js.map +1 -0
- package/dist/components/notebooks/DeleteNotebookModal.esm.js +143 -0
- package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -0
- package/dist/components/notebooks/DocumentSidebar.esm.js +235 -0
- package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -0
- package/dist/components/notebooks/FileListItem.esm.js +94 -0
- package/dist/components/notebooks/FileListItem.esm.js.map +1 -0
- package/dist/components/notebooks/FileTypeIcon.esm.js +59 -0
- package/dist/components/notebooks/FileTypeIcon.esm.js.map +1 -0
- package/dist/components/notebooks/NotebookCard.esm.js +118 -0
- package/dist/components/notebooks/NotebookCard.esm.js.map +1 -0
- package/dist/components/notebooks/NotebookView.esm.js +681 -0
- package/dist/components/notebooks/NotebookView.esm.js.map +1 -0
- package/dist/components/notebooks/NotebooksTab.esm.js +71 -0
- package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -0
- package/dist/components/notebooks/OverwriteConfirmModal.esm.js +142 -0
- package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -0
- package/dist/components/notebooks/RenameNotebookModal.esm.js +187 -0
- package/dist/components/notebooks/RenameNotebookModal.esm.js.map +1 -0
- package/dist/components/notebooks/SidebarCollapseIcon.esm.js +50 -0
- package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -0
- package/dist/components/notebooks/UploadResourceScreen.esm.js +79 -0
- package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -0
- package/dist/const.esm.js +74 -0
- package/dist/const.esm.js.map +1 -0
- package/dist/dev.d.ts +2 -0
- package/dist/dev.esm.js +48 -0
- package/dist/dev.esm.js.map +1 -0
- package/dist/hooks/notebooks/useCreateNotebook.esm.js +19 -0
- package/dist/hooks/notebooks/useCreateNotebook.esm.js.map +1 -0
- package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js +24 -0
- package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -0
- package/dist/hooks/notebooks/useDeleteNotebook.esm.js +19 -0
- package/dist/hooks/notebooks/useDeleteNotebook.esm.js.map +1 -0
- package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js +40 -0
- package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js.map +1 -0
- package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js +15 -0
- package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -0
- package/dist/hooks/notebooks/useNotebookDocuments.esm.js +18 -0
- package/dist/hooks/notebooks/useNotebookDocuments.esm.js.map +1 -0
- package/dist/hooks/notebooks/useNotebookSession.esm.js +18 -0
- package/dist/hooks/notebooks/useNotebookSession.esm.js.map +1 -0
- package/dist/hooks/notebooks/useNotebookSessions.esm.js +18 -0
- package/dist/hooks/notebooks/useNotebookSessions.esm.js.map +1 -0
- package/dist/hooks/notebooks/useRenameNotebook.esm.js +19 -0
- package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -0
- package/dist/hooks/notebooks/useUploadDocument.esm.js +28 -0
- package/dist/hooks/notebooks/useUploadDocument.esm.js.map +1 -0
- package/dist/hooks/toolCallsCacheStore.esm.js +61 -0
- package/dist/hooks/toolCallsCacheStore.esm.js.map +1 -0
- package/dist/hooks/useAllModels.esm.js +20 -0
- package/dist/hooks/useAllModels.esm.js.map +1 -0
- package/dist/hooks/useAutoScroll.esm.js +78 -0
- package/dist/hooks/useAutoScroll.esm.js.map +1 -0
- package/dist/hooks/useBackstageUserIdentity.esm.js +14 -0
- package/dist/hooks/useBackstageUserIdentity.esm.js.map +1 -0
- package/dist/hooks/useBufferedMessages.esm.js +27 -0
- package/dist/hooks/useBufferedMessages.esm.js.map +1 -0
- package/dist/hooks/useCaptureFeedback.esm.js +21 -0
- package/dist/hooks/useCaptureFeedback.esm.js.map +1 -0
- package/dist/hooks/useConversationMessages.esm.js +544 -0
- package/dist/hooks/useConversationMessages.esm.js.map +1 -0
- package/dist/hooks/useConversations.esm.js +25 -0
- package/dist/hooks/useConversations.esm.js.map +1 -0
- package/dist/hooks/useCreateCoversationMessage.esm.js +33 -0
- package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -0
- package/dist/hooks/useDeleteConversation.esm.js +39 -0
- package/dist/hooks/useDeleteConversation.esm.js.map +1 -0
- package/dist/hooks/useDisplayModeSettings.esm.js +57 -0
- package/dist/hooks/useDisplayModeSettings.esm.js.map +1 -0
- package/dist/hooks/useFeedbackActions.esm.js +275 -0
- package/dist/hooks/useFeedbackActions.esm.js.map +1 -0
- package/dist/hooks/useFeedbackState.esm.js +93 -0
- package/dist/hooks/useFeedbackState.esm.js.map +1 -0
- package/dist/hooks/useFeedbackStatus.esm.js +14 -0
- package/dist/hooks/useFeedbackStatus.esm.js.map +1 -0
- package/dist/hooks/useIsMobile.esm.js +14 -0
- package/dist/hooks/useIsMobile.esm.js.map +1 -0
- package/dist/hooks/useLastOpenedConversation.esm.js +51 -0
- package/dist/hooks/useLastOpenedConversation.esm.js.map +1 -0
- package/dist/hooks/useLightspeedDeletePermission.esm.js +12 -0
- package/dist/hooks/useLightspeedDeletePermission.esm.js.map +1 -0
- package/dist/hooks/useLightspeedDrawerContext.esm.js +15 -0
- package/dist/hooks/useLightspeedDrawerContext.esm.js.map +1 -0
- package/dist/hooks/useLightspeedProviderState.esm.js +277 -0
- package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -0
- package/dist/hooks/useLightspeedUpdatePermission.esm.js +12 -0
- package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -0
- package/dist/hooks/useLightspeedViewPermission.esm.js +18 -0
- package/dist/hooks/useLightspeedViewPermission.esm.js.map +1 -0
- package/dist/hooks/useNotebookConversationIds.esm.js +19 -0
- package/dist/hooks/useNotebookConversationIds.esm.js.map +1 -0
- package/dist/hooks/useNotebookWelcomePrompts.esm.js +14 -0
- package/dist/hooks/useNotebookWelcomePrompts.esm.js.map +1 -0
- package/dist/hooks/usePinnedChatsSettings.esm.js +118 -0
- package/dist/hooks/usePinnedChatsSettings.esm.js.map +1 -0
- package/dist/hooks/useQuestionValidation.esm.js +16 -0
- package/dist/hooks/useQuestionValidation.esm.js.map +1 -0
- package/dist/hooks/useRenameConversation.esm.js +44 -0
- package/dist/hooks/useRenameConversation.esm.js.map +1 -0
- package/dist/hooks/useSortSettings.esm.js +60 -0
- package/dist/hooks/useSortSettings.esm.js.map +1 -0
- package/dist/hooks/useStopConversation.esm.js +18 -0
- package/dist/hooks/useStopConversation.esm.js.map +1 -0
- package/dist/hooks/useTranslation.esm.js +7 -0
- package/dist/hooks/useTranslation.esm.js.map +1 -0
- package/dist/hooks/useWelcomePrompts.esm.js +36 -0
- package/dist/hooks/useWelcomePrompts.esm.js.map +1 -0
- package/dist/images/bot-avatar-dark.svg +4 -0
- package/dist/images/bot-avatar.svg +4 -0
- package/dist/images/permission-required.svg +319 -0
- package/dist/images/user-avatar.svg +4 -0
- package/dist/index.d.ts +113 -0
- package/dist/index.esm.js +137 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/intelligent-assistant-fab-module.d.ts +4 -0
- package/dist/intelligent-assistant-fab-module.esm.js +2 -0
- package/dist/intelligent-assistant-fab-module.esm.js.map +1 -0
- package/dist/intelligent-assistant-translations-module.d.ts +4 -0
- package/dist/intelligent-assistant-translations-module.esm.js +2 -0
- package/dist/intelligent-assistant-translations-module.esm.js.map +1 -0
- package/dist/legacy.d.ts +75 -0
- package/dist/legacy.esm.js +13 -0
- package/dist/legacy.esm.js.map +1 -0
- package/dist/plugin.esm.js +84 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +23 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/translations/de.esm.js +278 -0
- package/dist/translations/de.esm.js.map +1 -0
- package/dist/translations/es.esm.js +278 -0
- package/dist/translations/es.esm.js.map +1 -0
- package/dist/translations/fr.esm.js +278 -0
- package/dist/translations/fr.esm.js.map +1 -0
- package/dist/translations/index.esm.js +16 -0
- package/dist/translations/index.esm.js.map +1 -0
- package/dist/translations/it.esm.js +278 -0
- package/dist/translations/it.esm.js.map +1 -0
- package/dist/translations/ja.esm.js +278 -0
- package/dist/translations/ja.esm.js.map +1 -0
- package/dist/translations/ref.esm.js +315 -0
- package/dist/translations/ref.esm.js.map +1 -0
- package/dist/types.esm.js +9 -0
- package/dist/types.esm.js.map +1 -0
- package/dist/utils/attachment-utils.esm.js +30 -0
- package/dist/utils/attachment-utils.esm.js.map +1 -0
- package/dist/utils/formatToolResponseForMarkdown.esm.js +98 -0
- package/dist/utils/formatToolResponseForMarkdown.esm.js.map +1 -0
- package/dist/utils/generateClassName.esm.js +12 -0
- package/dist/utils/generateClassName.esm.js.map +1 -0
- package/dist/utils/lightspeed-chatbox-utils.esm.js +232 -0
- package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -0
- package/dist/utils/notebook-upload-utils.esm.js +48 -0
- package/dist/utils/notebook-upload-utils.esm.js.map +1 -0
- package/dist/utils/notebooks-utils.esm.js +25 -0
- package/dist/utils/notebooks-utils.esm.js.map +1 -0
- package/dist/utils/prompt-utils.esm.js +17 -0
- package/dist/utils/prompt-utils.esm.js.map +1 -0
- package/dist/utils/queryClient.esm.js +6 -0
- package/dist/utils/queryClient.esm.js.map +1 -0
- package/dist/utils/reasoningParser.esm.js +33 -0
- package/dist/utils/reasoningParser.esm.js.map +1 -0
- package/dist/utils/toolCallMapper.esm.js +15 -0
- package/dist/utils/toolCallMapper.esm.js.map +1 -0
- package/dist/utils/user-utils.esm.js +7 -0
- package/dist/utils/user-utils.esm.js.map +1 -0
- package/package.json +182 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const useIsMobile = () => {
|
|
4
|
+
const [isMobile, setIsMobile] = React.useState(window.innerWidth <= 768);
|
|
5
|
+
React.useEffect(() => {
|
|
6
|
+
const handleResize = () => setIsMobile(window.innerWidth <= 768);
|
|
7
|
+
window.addEventListener("resize", handleResize);
|
|
8
|
+
return () => window.removeEventListener("resize", handleResize);
|
|
9
|
+
}, []);
|
|
10
|
+
return isMobile;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { useIsMobile };
|
|
14
|
+
//# sourceMappingURL=useIsMobile.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsMobile.esm.js","sources":["../../src/hooks/useIsMobile.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nexport const useIsMobile = () => {\n const [isMobile, setIsMobile] = React.useState(window.innerWidth <= 768);\n\n React.useEffect(() => {\n const handleResize = () => setIsMobile(window.innerWidth <= 768);\n window.addEventListener('resize', handleResize);\n\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return isMobile;\n};\n"],"names":[],"mappings":";;AAiBO,MAAM,cAAc,MAAM;AAC/B,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAI,MAAM,QAAA,CAAS,MAAA,CAAO,cAAc,GAAG,CAAA;AAEvE,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,MAAA,CAAO,cAAc,GAAG,CAAA;AAC/D,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAE9C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,QAAA;AACT;;;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
const useLastOpenedConversation = (user, key = "lastOpenedConversation") => {
|
|
4
|
+
const [lastOpenedId, setLastOpenedId] = useState(null);
|
|
5
|
+
const [isReady, setIsReady] = useState(false);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (!user) {
|
|
8
|
+
setLastOpenedId(null);
|
|
9
|
+
setIsReady(false);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const storedData = localStorage.getItem(key);
|
|
14
|
+
const parsedData = storedData ? JSON.parse(storedData) : {};
|
|
15
|
+
setLastOpenedId(parsedData[user] || null);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.error("Error accessing localStorage:", error);
|
|
18
|
+
} finally {
|
|
19
|
+
setIsReady(true);
|
|
20
|
+
}
|
|
21
|
+
}, [user, key]);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!user || lastOpenedId === null) return;
|
|
24
|
+
try {
|
|
25
|
+
const storedData = localStorage.getItem(key);
|
|
26
|
+
const parsedData = storedData ? JSON.parse(storedData) : {};
|
|
27
|
+
if (parsedData[user] !== lastOpenedId) {
|
|
28
|
+
parsedData[user] = lastOpenedId;
|
|
29
|
+
localStorage.setItem(key, JSON.stringify(parsedData));
|
|
30
|
+
}
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error("Error updating localStorage:", error);
|
|
33
|
+
}
|
|
34
|
+
}, [lastOpenedId, user, key]);
|
|
35
|
+
const clearLastOpenedId = useCallback(() => {
|
|
36
|
+
if (!user) return;
|
|
37
|
+
try {
|
|
38
|
+
const storedData = localStorage.getItem(key);
|
|
39
|
+
const parsedData = storedData ? JSON.parse(storedData) : {};
|
|
40
|
+
delete parsedData[user];
|
|
41
|
+
localStorage.setItem(key, JSON.stringify(parsedData));
|
|
42
|
+
setLastOpenedId(null);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error("Error clearing localStorage:", error);
|
|
45
|
+
}
|
|
46
|
+
}, [user, key]);
|
|
47
|
+
return { lastOpenedId, setLastOpenedId, clearLastOpenedId, isReady };
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export { useLastOpenedConversation };
|
|
51
|
+
//# sourceMappingURL=useLastOpenedConversation.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLastOpenedConversation.esm.js","sources":["../../src/hooks/useLastOpenedConversation.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react';\n\ntype UseLastOpenedConversationReturn = {\n lastOpenedId: string | null;\n setLastOpenedId: Dispatch<SetStateAction<string | null>>;\n clearLastOpenedId: () => void;\n isReady: boolean;\n};\n\nexport const useLastOpenedConversation = (\n user: string | undefined,\n key = 'lastOpenedConversation',\n): UseLastOpenedConversationReturn => {\n const [lastOpenedId, setLastOpenedId] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n if (!user) {\n setLastOpenedId(null);\n setIsReady(false);\n return;\n }\n\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n setLastOpenedId(parsedData[user] || null);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error accessing localStorage:', error);\n } finally {\n setIsReady(true);\n }\n }, [user, key]);\n\n useEffect(() => {\n if (!user || lastOpenedId === null) return;\n // Update localStorage whenever the last opened ID changes\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n\n if (parsedData[user] !== lastOpenedId) {\n parsedData[user] = lastOpenedId;\n localStorage.setItem(key, JSON.stringify(parsedData));\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error updating localStorage:', error);\n }\n }, [lastOpenedId, user, key]);\n\n const clearLastOpenedId = useCallback(() => {\n if (!user) return;\n\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n delete parsedData[user];\n localStorage.setItem(key, JSON.stringify(parsedData));\n setLastOpenedId(null);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error clearing localStorage:', error);\n }\n }, [user, key]);\n\n return { lastOpenedId, setLastOpenedId, clearLastOpenedId, isReady };\n};\n"],"names":[],"mappings":";;AA8BO,MAAM,yBAAA,GAA4B,CACvC,IAAA,EACA,GAAA,GAAM,wBAAA,KAC8B;AACpC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,aAAa,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,IAAI,EAAC;AAC1D,MAAA,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA,IAAK,IAAI,CAAA;AAAA,IAC1C,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,IACtD,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,CAAA;AAEd,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,YAAA,KAAiB,IAAA,EAAM;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,aAAa,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,IAAI,EAAC;AAE1D,MAAA,IAAI,UAAA,CAAW,IAAI,CAAA,KAAM,YAAA,EAAc;AACrC,QAAA,UAAA,CAAW,IAAI,CAAA,GAAI,YAAA;AACnB,QAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,MACtD;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,IAAA,EAAM,GAAG,CAAC,CAAA;AAE5B,EAAA,MAAM,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,aAAa,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,IAAI,EAAC;AAC1D,MAAA,OAAO,WAAW,IAAI,CAAA;AACtB,MAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AACpD,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,CAAA;AAEd,EAAA,OAAO,EAAE,YAAA,EAAc,eAAA,EAAiB,iBAAA,EAAmB,OAAA,EAAQ;AACrE;;;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { usePermission } from '@backstage/plugin-permission-react';
|
|
2
|
+
import { lightspeedChatDeletePermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';
|
|
3
|
+
|
|
4
|
+
const useLightspeedDeletePermission = () => {
|
|
5
|
+
const lightspeedDeletePermissionResult = usePermission({
|
|
6
|
+
permission: lightspeedChatDeletePermission
|
|
7
|
+
});
|
|
8
|
+
return lightspeedDeletePermissionResult;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { useLightspeedDeletePermission };
|
|
12
|
+
//# sourceMappingURL=useLightspeedDeletePermission.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLightspeedDeletePermission.esm.js","sources":["../../src/hooks/useLightspeedDeletePermission.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { lightspeedChatDeletePermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nexport const useLightspeedDeletePermission = () => {\n const lightspeedDeletePermissionResult = usePermission({\n permission: lightspeedChatDeletePermission,\n });\n\n return lightspeedDeletePermissionResult;\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,gCAAgC,MAAM;AACjD,EAAA,MAAM,mCAAmC,aAAA,CAAc;AAAA,IACrD,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO,gCAAA;AACT;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { LightspeedDrawerContext } from '../components/LightspeedDrawerContext.esm.js';
|
|
3
|
+
|
|
4
|
+
const useLightspeedDrawerContext = () => {
|
|
5
|
+
const context = useContext(LightspeedDrawerContext);
|
|
6
|
+
if (context === void 0) {
|
|
7
|
+
throw new Error(
|
|
8
|
+
"useLightspeedDrawerContext must be used within a LightspeedDrawerProvider"
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
return context;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { useLightspeedDrawerContext };
|
|
15
|
+
//# sourceMappingURL=useLightspeedDrawerContext.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLightspeedDrawerContext.esm.js","sources":["../../src/hooks/useLightspeedDrawerContext.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useContext } from 'react';\n\nimport { LightspeedDrawerContext } from '../components/LightspeedDrawerContext';\n\n/**\n * Hook to access the LightspeedDrawerContext\n * @public\n */\nexport const useLightspeedDrawerContext = () => {\n const context = useContext(LightspeedDrawerContext);\n if (context === undefined) {\n throw new Error(\n 'useLightspeedDrawerContext must be used within a LightspeedDrawerProvider',\n );\n }\n return context;\n};\n"],"names":[],"mappings":";;;AAwBO,MAAM,6BAA6B,MAAM;AAC9C,EAAA,MAAM,OAAA,GAAU,WAAW,uBAAuB,CAAA;AAClD,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;;"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|
|
2
|
+
import { useNavigate, useLocation, useMatch } from 'react-router-dom';
|
|
3
|
+
import { ChatbotDisplayMode } from '@patternfly/chatbot';
|
|
4
|
+
import { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react';
|
|
5
|
+
import { LIGHTSPEED_PATH, LIGHTSPEED_APP_DRAWER_ID } from '../const.esm.js';
|
|
6
|
+
import { useBackstageUserIdentity } from './useBackstageUserIdentity.esm.js';
|
|
7
|
+
import { useDisplayModeSettings } from './useDisplayModeSettings.esm.js';
|
|
8
|
+
|
|
9
|
+
function lightspeedRoutePath(conversationId) {
|
|
10
|
+
return conversationId ? `${LIGHTSPEED_PATH}/conversation/${conversationId}` : LIGHTSPEED_PATH;
|
|
11
|
+
}
|
|
12
|
+
function useLightspeedProviderState() {
|
|
13
|
+
const navigate = useNavigate();
|
|
14
|
+
const location = useLocation();
|
|
15
|
+
const { openDrawer, closeDrawer } = useAppDrawer();
|
|
16
|
+
const user = useBackstageUserIdentity();
|
|
17
|
+
const {
|
|
18
|
+
displayMode: persistedDisplayMode,
|
|
19
|
+
setDisplayMode: setPersistedDisplayMode
|
|
20
|
+
} = useDisplayModeSettings(user, ChatbotDisplayMode.default);
|
|
21
|
+
const [displayModeState, setDisplayModeState] = useState(persistedDisplayMode);
|
|
22
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
23
|
+
const [drawerWidth, setDrawerWidth] = useState(400);
|
|
24
|
+
const [currentConversationIdState, setCurrentConversationIdState] = useState(void 0);
|
|
25
|
+
const [draftMessage, setDraftMessageState] = useState("");
|
|
26
|
+
const [draftFileContents, setDraftFileContentsState] = useState([]);
|
|
27
|
+
const [shellViewTab, setShellViewTabState] = useState(0);
|
|
28
|
+
const shellViewTabRef = useRef(shellViewTab);
|
|
29
|
+
shellViewTabRef.current = shellViewTab;
|
|
30
|
+
const setShellViewTab = useCallback((tab) => {
|
|
31
|
+
const next = tab === 1 ? 1 : 0;
|
|
32
|
+
shellViewTabRef.current = next;
|
|
33
|
+
setShellViewTabState(next);
|
|
34
|
+
}, []);
|
|
35
|
+
const openedViaFABRef = useRef(false);
|
|
36
|
+
const dockedAfterLeavingFullscreenRef = useRef(false);
|
|
37
|
+
const leavingLightspeedForNonEmbeddedShellRef = useRef(false);
|
|
38
|
+
const pendingOverlayThreadHandoffRef = useRef(false);
|
|
39
|
+
const lightspeedPathnamePrevRef = useRef(null);
|
|
40
|
+
const isLightspeedRouteRef = useRef(false);
|
|
41
|
+
const persistedDisplayModeRef = useRef(persistedDisplayMode);
|
|
42
|
+
const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);
|
|
43
|
+
isLightspeedRouteRef.current = isLightspeedRoute;
|
|
44
|
+
persistedDisplayModeRef.current = persistedDisplayMode;
|
|
45
|
+
const conversationMatch = useMatch(
|
|
46
|
+
`${LIGHTSPEED_PATH}/conversation/:conversationId`
|
|
47
|
+
);
|
|
48
|
+
const conversationId = conversationMatch?.params?.conversationId;
|
|
49
|
+
const syncShellDrawerForMode = useCallback(
|
|
50
|
+
(mode) => {
|
|
51
|
+
if (mode === ChatbotDisplayMode.docked) {
|
|
52
|
+
if (isLightspeedRoute) {
|
|
53
|
+
dockedAfterLeavingFullscreenRef.current = true;
|
|
54
|
+
} else {
|
|
55
|
+
openDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
dockedAfterLeavingFullscreenRef.current = false;
|
|
59
|
+
closeDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
[closeDrawer, isLightspeedRoute, openDrawer]
|
|
63
|
+
);
|
|
64
|
+
const navigateBackOrGoToCatalog = useCallback(() => {
|
|
65
|
+
if (!openedViaFABRef.current) {
|
|
66
|
+
navigate("/catalog");
|
|
67
|
+
openedViaFABRef.current = true;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
navigate(-1);
|
|
71
|
+
}, [navigate]);
|
|
72
|
+
const leaveLightspeedRouteForShellDisplayMode = useCallback(() => {
|
|
73
|
+
navigate("/catalog", { replace: true });
|
|
74
|
+
}, [navigate]);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
const pathname = location.pathname;
|
|
77
|
+
const prevPathname = lightspeedPathnamePrevRef.current;
|
|
78
|
+
const isUnderLightspeedPath = (p) => Boolean(p && p.startsWith(LIGHTSPEED_PATH));
|
|
79
|
+
const isInternalLightspeedRouteChange = isUnderLightspeedPath(prevPathname) && isUnderLightspeedPath(pathname) && prevPathname !== pathname;
|
|
80
|
+
if (!isLightspeedRoute) {
|
|
81
|
+
leavingLightspeedForNonEmbeddedShellRef.current = false;
|
|
82
|
+
}
|
|
83
|
+
if (conversationId) {
|
|
84
|
+
setCurrentConversationIdState(conversationId);
|
|
85
|
+
} else if (isLightspeedRoute) {
|
|
86
|
+
setCurrentConversationIdState(void 0);
|
|
87
|
+
}
|
|
88
|
+
if (isLightspeedRoute) {
|
|
89
|
+
if (!isInternalLightspeedRouteChange) {
|
|
90
|
+
if (leavingLightspeedForNonEmbeddedShellRef.current && persistedDisplayMode !== ChatbotDisplayMode.embedded) {
|
|
91
|
+
setDisplayModeState(persistedDisplayMode);
|
|
92
|
+
} else {
|
|
93
|
+
setDisplayModeState(ChatbotDisplayMode.embedded);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
setIsOpen(true);
|
|
97
|
+
if (!dockedAfterLeavingFullscreenRef.current) {
|
|
98
|
+
closeDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
99
|
+
}
|
|
100
|
+
} else if (persistedDisplayMode === ChatbotDisplayMode.embedded) {
|
|
101
|
+
setDisplayModeState(ChatbotDisplayMode.default);
|
|
102
|
+
} else {
|
|
103
|
+
setDisplayModeState(persistedDisplayMode);
|
|
104
|
+
}
|
|
105
|
+
lightspeedPathnamePrevRef.current = pathname;
|
|
106
|
+
}, [
|
|
107
|
+
closeDrawer,
|
|
108
|
+
conversationId,
|
|
109
|
+
isLightspeedRoute,
|
|
110
|
+
location.pathname,
|
|
111
|
+
persistedDisplayMode
|
|
112
|
+
]);
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
if (!isLightspeedRoute && isOpen && displayModeState === ChatbotDisplayMode.docked) {
|
|
115
|
+
openDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
116
|
+
dockedAfterLeavingFullscreenRef.current = false;
|
|
117
|
+
}
|
|
118
|
+
}, [displayModeState, isLightspeedRoute, isOpen, openDrawer]);
|
|
119
|
+
const openChatbot = useCallback(() => {
|
|
120
|
+
openedViaFABRef.current = true;
|
|
121
|
+
const rawMode = persistedDisplayMode || ChatbotDisplayMode.default;
|
|
122
|
+
if (rawMode === ChatbotDisplayMode.embedded) {
|
|
123
|
+
if (!isLightspeedRoute) {
|
|
124
|
+
if (shellViewTabRef.current === 1) {
|
|
125
|
+
navigate(`${LIGHTSPEED_PATH}/notebooks`);
|
|
126
|
+
} else {
|
|
127
|
+
navigate(lightspeedRoutePath(currentConversationIdState));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
setDisplayModeState(ChatbotDisplayMode.embedded);
|
|
131
|
+
closeDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
132
|
+
setIsOpen(true);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
setDisplayModeState(rawMode);
|
|
136
|
+
if (rawMode === ChatbotDisplayMode.docked) {
|
|
137
|
+
openDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
138
|
+
} else {
|
|
139
|
+
closeDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
140
|
+
}
|
|
141
|
+
setIsOpen(true);
|
|
142
|
+
}, [
|
|
143
|
+
closeDrawer,
|
|
144
|
+
currentConversationIdState,
|
|
145
|
+
isLightspeedRoute,
|
|
146
|
+
navigate,
|
|
147
|
+
openDrawer,
|
|
148
|
+
persistedDisplayMode
|
|
149
|
+
]);
|
|
150
|
+
const closeChatbot = useCallback(() => {
|
|
151
|
+
dockedAfterLeavingFullscreenRef.current = false;
|
|
152
|
+
if (displayModeState === ChatbotDisplayMode.embedded && isLightspeedRoute) {
|
|
153
|
+
navigateBackOrGoToCatalog();
|
|
154
|
+
}
|
|
155
|
+
if (displayModeState === ChatbotDisplayMode.docked) {
|
|
156
|
+
closeDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
157
|
+
}
|
|
158
|
+
setIsOpen(false);
|
|
159
|
+
}, [
|
|
160
|
+
closeDrawer,
|
|
161
|
+
displayModeState,
|
|
162
|
+
isLightspeedRoute,
|
|
163
|
+
navigateBackOrGoToCatalog
|
|
164
|
+
]);
|
|
165
|
+
const toggleChatbot = useCallback(() => {
|
|
166
|
+
if (isOpen) {
|
|
167
|
+
closeChatbot();
|
|
168
|
+
} else {
|
|
169
|
+
openChatbot();
|
|
170
|
+
}
|
|
171
|
+
}, [isOpen, openChatbot, closeChatbot]);
|
|
172
|
+
const setCurrentConversationId = useCallback(
|
|
173
|
+
(id) => {
|
|
174
|
+
setCurrentConversationIdState(id);
|
|
175
|
+
if (persistedDisplayModeRef.current === ChatbotDisplayMode.embedded && isLightspeedRouteRef.current) {
|
|
176
|
+
navigate(lightspeedRoutePath(id), { replace: true });
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
[navigate]
|
|
180
|
+
);
|
|
181
|
+
const setDraftMessage = useCallback((message) => {
|
|
182
|
+
setDraftMessageState(message);
|
|
183
|
+
}, []);
|
|
184
|
+
const setDraftFileContents = useCallback((files) => {
|
|
185
|
+
setDraftFileContentsState(files);
|
|
186
|
+
}, []);
|
|
187
|
+
const consumePendingOverlayThreadHandoff = useCallback(() => {
|
|
188
|
+
if (!pendingOverlayThreadHandoffRef.current) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
pendingOverlayThreadHandoffRef.current = false;
|
|
192
|
+
return true;
|
|
193
|
+
}, []);
|
|
194
|
+
const setDisplayMode = useCallback(
|
|
195
|
+
(mode, conversationIdParam, embeddedNotebooks) => {
|
|
196
|
+
if (mode === displayModeState) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
setPersistedDisplayMode(mode);
|
|
200
|
+
syncShellDrawerForMode(mode);
|
|
201
|
+
if (mode === ChatbotDisplayMode.embedded) {
|
|
202
|
+
if (embeddedNotebooks) {
|
|
203
|
+
const path = embeddedNotebooks === "notebooks" ? `${LIGHTSPEED_PATH}/notebooks` : `${LIGHTSPEED_PATH}/notebooks/${embeddedNotebooks.notebookSessionId}`;
|
|
204
|
+
navigate(path);
|
|
205
|
+
} else if (shellViewTabRef.current === 1) {
|
|
206
|
+
navigate(`${LIGHTSPEED_PATH}/notebooks`);
|
|
207
|
+
} else {
|
|
208
|
+
const convId = conversationIdParam ?? currentConversationIdState;
|
|
209
|
+
navigate(lightspeedRoutePath(convId));
|
|
210
|
+
}
|
|
211
|
+
setIsOpen(true);
|
|
212
|
+
} else {
|
|
213
|
+
setShellViewTab(0);
|
|
214
|
+
if (isLightspeedRoute) {
|
|
215
|
+
leavingLightspeedForNonEmbeddedShellRef.current = true;
|
|
216
|
+
pendingOverlayThreadHandoffRef.current = true;
|
|
217
|
+
leaveLightspeedRouteForShellDisplayMode();
|
|
218
|
+
}
|
|
219
|
+
setIsOpen(true);
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
[
|
|
223
|
+
currentConversationIdState,
|
|
224
|
+
displayModeState,
|
|
225
|
+
isLightspeedRoute,
|
|
226
|
+
leaveLightspeedRouteForShellDisplayMode,
|
|
227
|
+
navigate,
|
|
228
|
+
setPersistedDisplayMode,
|
|
229
|
+
setShellViewTab,
|
|
230
|
+
syncShellDrawerForMode
|
|
231
|
+
]
|
|
232
|
+
);
|
|
233
|
+
const shouldRenderOverlayModal = isOpen && displayModeState === ChatbotDisplayMode.default && !isLightspeedRoute;
|
|
234
|
+
const contextValue = useMemo(
|
|
235
|
+
() => ({
|
|
236
|
+
isChatbotActive: isOpen,
|
|
237
|
+
toggleChatbot,
|
|
238
|
+
displayMode: displayModeState,
|
|
239
|
+
setDisplayMode,
|
|
240
|
+
drawerWidth,
|
|
241
|
+
setDrawerWidth,
|
|
242
|
+
currentConversationId: currentConversationIdState,
|
|
243
|
+
setCurrentConversationId,
|
|
244
|
+
draftMessage,
|
|
245
|
+
setDraftMessage,
|
|
246
|
+
draftFileContents,
|
|
247
|
+
setDraftFileContents,
|
|
248
|
+
consumePendingOverlayThreadHandoff,
|
|
249
|
+
shellViewTab,
|
|
250
|
+
setShellViewTab
|
|
251
|
+
}),
|
|
252
|
+
[
|
|
253
|
+
isOpen,
|
|
254
|
+
toggleChatbot,
|
|
255
|
+
displayModeState,
|
|
256
|
+
setDisplayMode,
|
|
257
|
+
drawerWidth,
|
|
258
|
+
currentConversationIdState,
|
|
259
|
+
setCurrentConversationId,
|
|
260
|
+
draftMessage,
|
|
261
|
+
setDraftMessage,
|
|
262
|
+
draftFileContents,
|
|
263
|
+
setDraftFileContents,
|
|
264
|
+
consumePendingOverlayThreadHandoff,
|
|
265
|
+
shellViewTab,
|
|
266
|
+
setShellViewTab
|
|
267
|
+
]
|
|
268
|
+
);
|
|
269
|
+
return {
|
|
270
|
+
contextValue,
|
|
271
|
+
shouldRenderOverlayModal,
|
|
272
|
+
closeChatbot
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export { useLightspeedProviderState };
|
|
277
|
+
//# sourceMappingURL=useLightspeedProviderState.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLightspeedProviderState.esm.js","sources":["../../src/hooks/useLightspeedProviderState.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react';\n\nimport type {\n LightspeedDrawerContextType,\n LightspeedEmbeddedNotebooksTarget,\n} from '../components/LightspeedDrawerContext';\nimport { LIGHTSPEED_APP_DRAWER_ID, LIGHTSPEED_PATH } from '../const';\nimport type { FileContent } from '../types';\nimport { useBackstageUserIdentity } from './useBackstageUserIdentity';\nimport { useDisplayModeSettings } from './useDisplayModeSettings';\n\nfunction lightspeedRoutePath(conversationId?: string): string {\n return conversationId\n ? `${LIGHTSPEED_PATH}/conversation/${conversationId}`\n : LIGHTSPEED_PATH;\n}\n\n/**\n * Encapsulates LightspeedDrawerProvider state, routing, and ApplicationDrawer sync.\n *\n * @internal\n */\nexport function useLightspeedProviderState(): {\n contextValue: LightspeedDrawerContextType;\n shouldRenderOverlayModal: boolean;\n closeChatbot: () => void;\n} {\n const navigate = useNavigate();\n const location = useLocation();\n const { openDrawer, closeDrawer } = useAppDrawer();\n const user = useBackstageUserIdentity();\n const {\n displayMode: persistedDisplayMode,\n setDisplayMode: setPersistedDisplayMode,\n } = useDisplayModeSettings(user, ChatbotDisplayMode.default);\n\n const [displayModeState, setDisplayModeState] =\n useState<ChatbotDisplayMode>(persistedDisplayMode);\n const [isOpen, setIsOpen] = useState(false);\n const [drawerWidth, setDrawerWidth] = useState(400);\n const [currentConversationIdState, setCurrentConversationIdState] = useState<\n string | undefined\n >(undefined);\n const [draftMessage, setDraftMessageState] = useState('');\n const [draftFileContents, setDraftFileContentsState] = useState<\n FileContent[]\n >([]);\n const [shellViewTab, setShellViewTabState] = useState(0);\n const shellViewTabRef = useRef(shellViewTab);\n shellViewTabRef.current = shellViewTab;\n const setShellViewTab = useCallback((tab: number) => {\n const next = tab === 1 ? 1 : 0;\n shellViewTabRef.current = next;\n setShellViewTabState(next);\n }, []);\n const openedViaFABRef = useRef(false);\n const dockedAfterLeavingFullscreenRef = useRef(false);\n /** True while navigating off /lightspeed after user chose overlay/docked (URL can lag persisted mode). */\n const leavingLightspeedForNonEmbeddedShellRef = useRef(false);\n /** True until overlay/docked LightspeedChat consumes it (new mount after leaving fullscreen route). */\n const pendingOverlayThreadHandoffRef = useRef(false);\n /** Used to detect in-app moves (e.g. Chat ↔ Notebooks) so display mode is not reset to embedded. */\n const lightspeedPathnamePrevRef = useRef<string | null>(null);\n\n const isLightspeedRouteRef = useRef(false);\n const persistedDisplayModeRef = useRef(persistedDisplayMode);\n\n const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);\n isLightspeedRouteRef.current = isLightspeedRoute;\n persistedDisplayModeRef.current = persistedDisplayMode;\n const conversationMatch = useMatch(\n `${LIGHTSPEED_PATH}/conversation/:conversationId`,\n );\n const conversationId = conversationMatch?.params?.conversationId;\n\n const syncShellDrawerForMode = useCallback(\n (mode: ChatbotDisplayMode) => {\n if (mode === ChatbotDisplayMode.docked) {\n if (isLightspeedRoute) {\n dockedAfterLeavingFullscreenRef.current = true;\n } else {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else {\n dockedAfterLeavingFullscreenRef.current = false;\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n },\n [closeDrawer, isLightspeedRoute, openDrawer],\n );\n\n const navigateBackOrGoToCatalog = useCallback(() => {\n if (!openedViaFABRef.current) {\n navigate('/catalog');\n openedViaFABRef.current = true;\n return;\n }\n navigate(-1);\n }, [navigate]);\n\n /**\n * Leaving /lightspeed for overlay/docked must not use navigate(-1): after the first FAB\n * open, navigateBackOrGoToCatalog uses -1 and can land back on /lightspeed (fullscreen).\n */\n const leaveLightspeedRouteForShellDisplayMode = useCallback(() => {\n navigate('/catalog', { replace: true });\n }, [navigate]);\n\n useEffect(() => {\n const pathname = location.pathname;\n const prevPathname = lightspeedPathnamePrevRef.current;\n const isUnderLightspeedPath = (p: string | null) =>\n Boolean(p && p.startsWith(LIGHTSPEED_PATH));\n const isInternalLightspeedRouteChange =\n isUnderLightspeedPath(prevPathname) &&\n isUnderLightspeedPath(pathname) &&\n prevPathname !== pathname;\n\n if (!isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = false;\n }\n\n if (conversationId) {\n setCurrentConversationIdState(conversationId);\n } else if (isLightspeedRoute) {\n // On `/lightspeed` without a `:conversationId` segment, URL implies a fresh thread.\n // When navigating to another app route (overlay/docked), keep the last id so display\n // mode switches and re-entry to fullscreen stay on the active conversation.\n setCurrentConversationIdState(undefined);\n }\n\n if (isLightspeedRoute) {\n if (!isInternalLightspeedRouteChange) {\n if (\n leavingLightspeedForNonEmbeddedShellRef.current &&\n persistedDisplayMode !== ChatbotDisplayMode.embedded\n ) {\n setDisplayModeState(persistedDisplayMode);\n } else {\n setDisplayModeState(ChatbotDisplayMode.embedded);\n }\n }\n setIsOpen(true);\n if (!dockedAfterLeavingFullscreenRef.current) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else if (persistedDisplayMode === ChatbotDisplayMode.embedded) {\n // Off /lightspeed there is no fullscreen surface; use overlay so FAB stays available.\n // (Persisted preference remains \"fullscreen\" for the next open.)\n setDisplayModeState(ChatbotDisplayMode.default);\n } else {\n setDisplayModeState(persistedDisplayMode);\n }\n\n lightspeedPathnamePrevRef.current = pathname;\n }, [\n closeDrawer,\n conversationId,\n isLightspeedRoute,\n location.pathname,\n persistedDisplayMode,\n ]);\n\n useEffect(() => {\n if (\n !isLightspeedRoute &&\n isOpen &&\n displayModeState === ChatbotDisplayMode.docked\n ) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n dockedAfterLeavingFullscreenRef.current = false;\n }\n }, [displayModeState, isLightspeedRoute, isOpen, openDrawer]);\n\n const openChatbot = useCallback(() => {\n openedViaFABRef.current = true;\n const rawMode = persistedDisplayMode || ChatbotDisplayMode.default;\n\n if (rawMode === ChatbotDisplayMode.embedded) {\n if (!isLightspeedRoute) {\n if (shellViewTabRef.current === 1) {\n navigate(`${LIGHTSPEED_PATH}/notebooks`);\n } else {\n navigate(lightspeedRoutePath(currentConversationIdState));\n }\n }\n setDisplayModeState(ChatbotDisplayMode.embedded);\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n setIsOpen(true);\n return;\n }\n\n setDisplayModeState(rawMode);\n\n if (rawMode === ChatbotDisplayMode.docked) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n } else {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n\n setIsOpen(true);\n }, [\n closeDrawer,\n currentConversationIdState,\n isLightspeedRoute,\n navigate,\n openDrawer,\n persistedDisplayMode,\n ]);\n\n const closeChatbot = useCallback(() => {\n dockedAfterLeavingFullscreenRef.current = false;\n if (displayModeState === ChatbotDisplayMode.embedded && isLightspeedRoute) {\n navigateBackOrGoToCatalog();\n }\n if (displayModeState === ChatbotDisplayMode.docked) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n setIsOpen(false);\n }, [\n closeDrawer,\n displayModeState,\n isLightspeedRoute,\n navigateBackOrGoToCatalog,\n ]);\n\n const toggleChatbot = useCallback(() => {\n if (isOpen) {\n closeChatbot();\n } else {\n openChatbot();\n }\n }, [isOpen, openChatbot, closeChatbot]);\n\n const setCurrentConversationId = useCallback(\n (id: string | undefined) => {\n setCurrentConversationIdState(id);\n // Refs: first-stream completion calls onStart after unmount / mode change; a stale\n // embedded + /lightspeed closure would navigate back to fullscreen without this.\n if (\n persistedDisplayModeRef.current === ChatbotDisplayMode.embedded &&\n isLightspeedRouteRef.current\n ) {\n navigate(lightspeedRoutePath(id), { replace: true });\n }\n },\n [navigate],\n );\n\n const setDraftMessage = useCallback((message: string) => {\n setDraftMessageState(message);\n }, []);\n\n const setDraftFileContents = useCallback((files: FileContent[]) => {\n setDraftFileContentsState(files);\n }, []);\n\n const consumePendingOverlayThreadHandoff = useCallback(() => {\n if (!pendingOverlayThreadHandoffRef.current) {\n return false;\n }\n pendingOverlayThreadHandoffRef.current = false;\n return true;\n }, []);\n\n const setDisplayMode = useCallback(\n (\n mode: ChatbotDisplayMode,\n conversationIdParam?: string,\n embeddedNotebooks?: LightspeedEmbeddedNotebooksTarget,\n ) => {\n if (mode === displayModeState) {\n return;\n }\n setPersistedDisplayMode(mode);\n syncShellDrawerForMode(mode);\n\n if (mode === ChatbotDisplayMode.embedded) {\n if (embeddedNotebooks) {\n const path =\n embeddedNotebooks === 'notebooks'\n ? `${LIGHTSPEED_PATH}/notebooks`\n : `${LIGHTSPEED_PATH}/notebooks/${embeddedNotebooks.notebookSessionId}`;\n navigate(path);\n } else if (shellViewTabRef.current === 1) {\n navigate(`${LIGHTSPEED_PATH}/notebooks`);\n } else {\n const convId = conversationIdParam ?? currentConversationIdState;\n navigate(lightspeedRoutePath(convId));\n }\n setIsOpen(true);\n } else {\n // Notebooks exist only in fullscreen; leaving embedded for overlay/docked\n // must not keep shellViewTab on Notebooks (next fullscreen open should be Chat).\n setShellViewTab(0);\n if (isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = true;\n pendingOverlayThreadHandoffRef.current = true;\n leaveLightspeedRouteForShellDisplayMode();\n }\n setIsOpen(true);\n }\n },\n [\n currentConversationIdState,\n displayModeState,\n isLightspeedRoute,\n leaveLightspeedRouteForShellDisplayMode,\n navigate,\n setPersistedDisplayMode,\n setShellViewTab,\n syncShellDrawerForMode,\n ],\n );\n\n const shouldRenderOverlayModal =\n isOpen &&\n displayModeState === ChatbotDisplayMode.default &&\n !isLightspeedRoute;\n\n const contextValue = useMemo(\n () => ({\n isChatbotActive: isOpen,\n toggleChatbot,\n displayMode: displayModeState,\n setDisplayMode,\n drawerWidth,\n setDrawerWidth,\n currentConversationId: currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n }),\n [\n isOpen,\n toggleChatbot,\n displayModeState,\n setDisplayMode,\n drawerWidth,\n currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n ],\n );\n\n return {\n contextValue,\n shouldRenderOverlayModal,\n closeChatbot,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { usePermission } from '@backstage/plugin-permission-react';
|
|
2
|
+
import { lightspeedChatUpdatePermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';
|
|
3
|
+
|
|
4
|
+
const useLightspeedUpdatePermission = () => {
|
|
5
|
+
const lightspeedUpdatePermissionResult = usePermission({
|
|
6
|
+
permission: lightspeedChatUpdatePermission
|
|
7
|
+
});
|
|
8
|
+
return lightspeedUpdatePermissionResult;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { useLightspeedUpdatePermission };
|
|
12
|
+
//# sourceMappingURL=useLightspeedUpdatePermission.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLightspeedUpdatePermission.esm.js","sources":["../../src/hooks/useLightspeedUpdatePermission.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { lightspeedChatUpdatePermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nexport const useLightspeedUpdatePermission = () => {\n const lightspeedUpdatePermissionResult = usePermission({\n permission: lightspeedChatUpdatePermission,\n });\n\n return lightspeedUpdatePermissionResult;\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,gCAAgC,MAAM;AACjD,EAAA,MAAM,mCAAmC,aAAA,CAAc;AAAA,IACrD,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO,gCAAA;AACT;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { usePermission } from '@backstage/plugin-permission-react';
|
|
2
|
+
import { lightspeedChatReadPermission, lightspeedChatCreatePermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';
|
|
3
|
+
|
|
4
|
+
const useLightspeedViewPermission = () => {
|
|
5
|
+
const canReadChats = usePermission({
|
|
6
|
+
permission: lightspeedChatReadPermission
|
|
7
|
+
});
|
|
8
|
+
const canCreateChats = usePermission({
|
|
9
|
+
permission: lightspeedChatCreatePermission
|
|
10
|
+
});
|
|
11
|
+
return {
|
|
12
|
+
loading: canReadChats.loading || canCreateChats.loading,
|
|
13
|
+
allowed: canReadChats.allowed && canCreateChats.allowed
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { useLightspeedViewPermission };
|
|
18
|
+
//# sourceMappingURL=useLightspeedViewPermission.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLightspeedViewPermission.esm.js","sources":["../../src/hooks/useLightspeedViewPermission.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport {\n lightspeedChatCreatePermission,\n lightspeedChatReadPermission,\n} from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nexport const useLightspeedViewPermission = () => {\n const canReadChats = usePermission({\n permission: lightspeedChatReadPermission,\n });\n\n const canCreateChats = usePermission({\n permission: lightspeedChatCreatePermission,\n });\n\n return {\n loading: canReadChats.loading || canCreateChats.loading,\n allowed: canReadChats.allowed && canCreateChats.allowed,\n };\n};\n"],"names":[],"mappings":";;;AAuBO,MAAM,8BAA8B,MAAM;AAC/C,EAAA,MAAM,eAAe,aAAA,CAAc;AAAA,IACjC,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,MAAM,iBAAiB,aAAA,CAAc;AAAA,IACnC,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA,CAAa,OAAA,IAAW,cAAA,CAAe,OAAA;AAAA,IAChD,OAAA,EAAS,YAAA,CAAa,OAAA,IAAW,cAAA,CAAe;AAAA,GAClD;AACF;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
2
|
+
import { useQuery } from '@tanstack/react-query';
|
|
3
|
+
import { lightspeedApiRef } from '../api/api.esm.js';
|
|
4
|
+
|
|
5
|
+
const useNotebookConversationIds = () => {
|
|
6
|
+
const lightspeedApi = useApi(lightspeedApiRef);
|
|
7
|
+
return useQuery({
|
|
8
|
+
queryKey: ["notebookConversationIds"],
|
|
9
|
+
queryFn: async () => {
|
|
10
|
+
return await lightspeedApi.getNotebookConversationIds();
|
|
11
|
+
},
|
|
12
|
+
staleTime: 1e3 * 60 * 5,
|
|
13
|
+
// 5 minutes
|
|
14
|
+
retry: false
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { useNotebookConversationIds };
|
|
19
|
+
//# sourceMappingURL=useNotebookConversationIds.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNotebookConversationIds.esm.js","sources":["../../src/hooks/useNotebookConversationIds.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\n\n/**\n * Hook to fetch conversation IDs associated with notebook sessions for filtering\n * Works even when notebooks feature is disabled\n */\nexport const useNotebookConversationIds = (): UseQueryResult<\n string[],\n Error\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n\n return useQuery({\n queryKey: ['notebookConversationIds'],\n queryFn: async () => {\n return await lightspeedApi.getNotebookConversationIds();\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n retry: false,\n });\n};\n"],"names":[],"mappings":";;;;AA0BO,MAAM,6BAA6B,MAGrC;AACH,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAE7C,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,yBAAyB,CAAA;AAAA,IACpC,SAAS,YAAY;AACnB,MAAA,OAAO,MAAM,cAAc,0BAAA,EAA2B;AAAA,IACxD,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK,CAAA;AAAA;AAAA,IACvB,KAAA,EAAO;AAAA,GACR,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { NOTEBOOK_PROMPT_KEYS } from '../const.esm.js';
|
|
3
|
+
import { useTranslation } from './useTranslation.esm.js';
|
|
4
|
+
|
|
5
|
+
const useNotebookWelcomePrompts = () => {
|
|
6
|
+
const { t } = useTranslation();
|
|
7
|
+
return useMemo(
|
|
8
|
+
() => NOTEBOOK_PROMPT_KEYS.map((key) => t(key, { defaultValue: key })),
|
|
9
|
+
[t]
|
|
10
|
+
);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { useNotebookWelcomePrompts };
|
|
14
|
+
//# sourceMappingURL=useNotebookWelcomePrompts.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNotebookWelcomePrompts.esm.js","sources":["../../src/hooks/useNotebookWelcomePrompts.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo } from 'react';\n\nimport { NOTEBOOK_PROMPT_KEYS } from '../const';\nimport { useTranslation } from './useTranslation';\n\nexport const useNotebookWelcomePrompts = (): string[] => {\n const { t } = useTranslation();\n\n return useMemo(\n () => NOTEBOOK_PROMPT_KEYS.map(key => t(key as any, { defaultValue: key })),\n [t],\n );\n};\n"],"names":[],"mappings":";;;;AAqBO,MAAM,4BAA4B,MAAgB;AACvD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,OAAO,OAAA;AAAA,IACL,MAAM,oBAAA,CAAqB,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAE,KAAY,EAAE,YAAA,EAAc,GAAA,EAAK,CAAC,CAAA;AAAA,IAC1E,CAAC,CAAC;AAAA,GACJ;AACF;;;;"}
|