@mitodl/smoot-design 0.0.0-0a23f44
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/LICENSE +28 -0
- package/README.md +35 -0
- package/dist/bundles/aiDrawerManager.es.js +38832 -0
- package/dist/bundles/aiDrawerManager.es.js.map +1 -0
- package/dist/bundles/aiDrawerManager.umd.js +245 -0
- package/dist/bundles/aiDrawerManager.umd.js.map +1 -0
- package/dist/bundles/remoteTutorDrawer.es.js +38832 -0
- package/dist/bundles/remoteTutorDrawer.es.js.map +1 -0
- package/dist/bundles/remoteTutorDrawer.umd.js +245 -0
- package/dist/bundles/remoteTutorDrawer.umd.js.map +1 -0
- package/dist/cjs/VERSION.d.ts +12 -0
- package/dist/cjs/VERSION.js +15 -0
- package/dist/cjs/ai.d.ts +3 -0
- package/dist/cjs/ai.js +9 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawer.d.ts +55 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawer.js +262 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawer.stories.d.ts +17 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawer.stories.js +264 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawerManager.d.ts +12 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawerManager.js +51 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawerManager.stories.d.ts +6 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawerManager.stories.js +267 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawerManager.test.d.ts +1 -0
- package/dist/cjs/bundles/AiDrawer/AiDrawerManager.test.js +245 -0
- package/dist/cjs/bundles/AiDrawer/FlashcardsScreen.d.ts +9 -0
- package/dist/cjs/bundles/AiDrawer/FlashcardsScreen.js +87 -0
- package/dist/cjs/bundles/aiDrawerManager.d.ts +6 -0
- package/dist/cjs/bundles/aiDrawerManager.js +44 -0
- package/dist/cjs/components/AiChat/AiChat.d.ts +5 -0
- package/dist/cjs/components/AiChat/AiChat.js +267 -0
- package/dist/cjs/components/AiChat/AiChat.stories.d.ts +17 -0
- package/dist/cjs/components/AiChat/AiChat.stories.js +194 -0
- package/dist/cjs/components/AiChat/AiChat.test.d.ts +1 -0
- package/dist/cjs/components/AiChat/AiChat.test.js +211 -0
- package/dist/cjs/components/AiChat/AiChatContext.d.ts +26 -0
- package/dist/cjs/components/AiChat/AiChatContext.js +106 -0
- package/dist/cjs/components/AiChat/AiChatContext.stories.d.ts +14 -0
- package/dist/cjs/components/AiChat/AiChatContext.stories.js +75 -0
- package/dist/cjs/components/AiChat/AiChatMarkdown.stories.d.ts +15 -0
- package/dist/cjs/components/AiChat/AiChatMarkdown.stories.js +282 -0
- package/dist/cjs/components/AiChat/ChatTitle.d.ts +8 -0
- package/dist/cjs/components/AiChat/ChatTitle.js +43 -0
- package/dist/cjs/components/AiChat/EllipsisIcon.d.ts +6 -0
- package/dist/cjs/components/AiChat/EllipsisIcon.js +17 -0
- package/dist/cjs/components/AiChat/EntryScreen.d.ts +11 -0
- package/dist/cjs/components/AiChat/EntryScreen.js +123 -0
- package/dist/cjs/components/AiChat/Markdown.d.ts +7 -0
- package/dist/cjs/components/AiChat/Markdown.js +14 -0
- package/dist/cjs/components/AiChat/TimLogo.d.ts +5 -0
- package/dist/cjs/components/AiChat/TimLogo.js +15 -0
- package/dist/cjs/components/AiChat/test-utils/api.d.ts +2 -0
- package/dist/cjs/components/AiChat/test-utils/api.js +164 -0
- package/dist/cjs/components/AiChat/types.d.ts +96 -0
- package/dist/cjs/components/AiChat/types.js +3 -0
- package/dist/cjs/components/AiChat/utils.d.ts +9 -0
- package/dist/cjs/components/AiChat/utils.js +41 -0
- package/dist/cjs/components/Alert/Alert.d.ts +15 -0
- package/dist/cjs/components/Alert/Alert.js +62 -0
- package/dist/cjs/components/Alert/Alert.stories.d.ts +8 -0
- package/dist/cjs/components/Alert/Alert.stories.js +53 -0
- package/dist/cjs/components/Button/ActionButton.d.ts +30 -0
- package/dist/cjs/components/Button/ActionButton.js +73 -0
- package/dist/cjs/components/Button/ActionButton.stories.d.ts +15 -0
- package/dist/cjs/components/Button/ActionButton.stories.js +113 -0
- package/dist/cjs/components/Button/Button.d.ts +58 -0
- package/dist/cjs/components/Button/Button.js +261 -0
- package/dist/cjs/components/Button/Button.stories.d.ts +18 -0
- package/dist/cjs/components/Button/Button.stories.js +148 -0
- package/dist/cjs/components/Button/Button.test.d.ts +1 -0
- package/dist/cjs/components/Button/Button.test.js +46 -0
- package/dist/cjs/components/Checkbox/Checkbox.d.ts +20 -0
- package/dist/cjs/components/Checkbox/Checkbox.js +85 -0
- package/dist/cjs/components/Checkbox/Checkbox.stories.d.ts +8 -0
- package/dist/cjs/components/Checkbox/Checkbox.stories.js +33 -0
- package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.d.ts +21 -0
- package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.js +43 -0
- package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.stories.d.ts +8 -0
- package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.stories.js +50 -0
- package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.test.d.ts +1 -0
- package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.test.js +52 -0
- package/dist/cjs/components/ImageAdapter/ImageAdapter.d.ts +23 -0
- package/dist/cjs/components/ImageAdapter/ImageAdapter.js +30 -0
- package/dist/cjs/components/Input/Input.d.ts +116 -0
- package/dist/cjs/components/Input/Input.js +237 -0
- package/dist/cjs/components/Input/Input.stories.d.ts +19 -0
- package/dist/cjs/components/Input/Input.stories.js +135 -0
- package/dist/cjs/components/Input/Input.test.d.ts +1 -0
- package/dist/cjs/components/Input/Input.test.js +32 -0
- package/dist/cjs/components/LinkAdapter/LinkAdapter.d.ts +23 -0
- package/dist/cjs/components/LinkAdapter/LinkAdapter.js +34 -0
- package/dist/cjs/components/RadioChoiceField/BooleanRadioChoiceField.stories.d.ts +6 -0
- package/dist/cjs/components/RadioChoiceField/BooleanRadioChoiceField.stories.js +47 -0
- package/dist/cjs/components/RadioChoiceField/RadioChoiceField.d.ts +45 -0
- package/dist/cjs/components/RadioChoiceField/RadioChoiceField.js +69 -0
- package/dist/cjs/components/RadioChoiceField/RadioChoiceField.stories.d.ts +6 -0
- package/dist/cjs/components/RadioChoiceField/RadioChoiceField.stories.js +55 -0
- package/dist/cjs/components/RadioChoiceField/RadioChoiceField.test.d.ts +1 -0
- package/dist/cjs/components/RadioChoiceField/RadioChoiceField.test.js +53 -0
- package/dist/cjs/components/ScrollSnap/ScrollSnap.d.ts +19 -0
- package/dist/cjs/components/ScrollSnap/ScrollSnap.js +59 -0
- package/dist/cjs/components/ScrollSnap/ScrollSnap.stories.d.ts +6 -0
- package/dist/cjs/components/ScrollSnap/ScrollSnap.stories.js +43 -0
- package/dist/cjs/components/ScrollSnap/useScrollSnap.d.ts +6 -0
- package/dist/cjs/components/ScrollSnap/useScrollSnap.js +36 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.d.ts +25 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.js +43 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.stories.d.ts +6 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.stories.js +44 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.test.d.ts +1 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.test.js +62 -0
- package/dist/cjs/components/TabButtons/TabButtonList.d.ts +25 -0
- package/dist/cjs/components/TabButtons/TabButtonList.js +97 -0
- package/dist/cjs/components/TabButtons/TabButtonList.stories.d.ts +24 -0
- package/dist/cjs/components/TabButtons/TabButtonList.stories.js +139 -0
- package/dist/cjs/components/TextField/TextField.d.ts +29 -0
- package/dist/cjs/components/TextField/TextField.js +33 -0
- package/dist/cjs/components/TextField/TextField.stories.d.ts +10 -0
- package/dist/cjs/components/TextField/TextField.stories.js +136 -0
- package/dist/cjs/components/TextField/TextField.test.d.ts +1 -0
- package/dist/cjs/components/TextField/TextField.test.js +77 -0
- package/dist/cjs/components/ThemeProvider/ThemeProvider.d.ts +21 -0
- package/dist/cjs/components/ThemeProvider/ThemeProvider.js +86 -0
- package/dist/cjs/components/ThemeProvider/ThemeProvider.stories.d.ts +63 -0
- package/dist/cjs/components/ThemeProvider/ThemeProvider.stories.js +102 -0
- package/dist/cjs/components/ThemeProvider/Typography.stories.d.ts +39 -0
- package/dist/cjs/components/ThemeProvider/Typography.stories.js +65 -0
- package/dist/cjs/components/ThemeProvider/breakpoints.d.ts +4 -0
- package/dist/cjs/components/ThemeProvider/breakpoints.js +19 -0
- package/dist/cjs/components/ThemeProvider/buttons.d.ts +7 -0
- package/dist/cjs/components/ThemeProvider/buttons.js +20 -0
- package/dist/cjs/components/ThemeProvider/chips.d.ts +3 -0
- package/dist/cjs/components/ThemeProvider/chips.js +154 -0
- package/dist/cjs/components/ThemeProvider/colors.d.ts +32 -0
- package/dist/cjs/components/ThemeProvider/colors.js +35 -0
- package/dist/cjs/components/ThemeProvider/typography.d.ts +18 -0
- package/dist/cjs/components/ThemeProvider/typography.js +173 -0
- package/dist/cjs/components/VisuallyHidden/VisuallyHidden.d.ts +24 -0
- package/dist/cjs/components/VisuallyHidden/VisuallyHidden.js +33 -0
- package/dist/cjs/components/VisuallyHidden/VisuallyHidden.stories.d.ts +6 -0
- package/dist/cjs/components/VisuallyHidden/VisuallyHidden.stories.js +13 -0
- package/dist/cjs/components/internal/FormHelpers/FormHelpers.d.ts +39 -0
- package/dist/cjs/components/internal/FormHelpers/FormHelpers.js +78 -0
- package/dist/cjs/components/internal/FormHelpers/FormHelpers.test.d.ts +1 -0
- package/dist/cjs/components/internal/FormHelpers/FormHelpers.test.js +93 -0
- package/dist/cjs/index.d.ts +25 -0
- package/dist/cjs/index.js +44 -0
- package/dist/cjs/jest-setup.d.ts +1 -0
- package/dist/cjs/jest-setup.js +18 -0
- package/dist/cjs/jsdom-extended.d.ts +6 -0
- package/dist/cjs/jsdom-extended.js +14 -0
- package/dist/cjs/story-utils/index.d.ts +6 -0
- package/dist/cjs/story-utils/index.js +17 -0
- package/dist/cjs/utils/composeRefs.d.ts +7 -0
- package/dist/cjs/utils/composeRefs.js +20 -0
- package/dist/cjs/utils/composeRefs.test.d.ts +1 -0
- package/dist/cjs/utils/composeRefs.test.js +19 -0
- package/dist/cjs/utils/retryingFetch.d.ts +19 -0
- package/dist/cjs/utils/retryingFetch.js +98 -0
- package/dist/cjs/utils/retryingFetch.test.d.ts +1 -0
- package/dist/cjs/utils/retryingFetch.test.js +48 -0
- package/dist/cjs/utils/useDevCheckStable.d.ts +8 -0
- package/dist/cjs/utils/useDevCheckStable.js +29 -0
- package/dist/cjs/utils/useInterval.d.ts +7 -0
- package/dist/cjs/utils/useInterval.js +25 -0
- package/dist/esm/VERSION.d.ts +12 -0
- package/dist/esm/VERSION.js +12 -0
- package/dist/esm/ai.d.ts +3 -0
- package/dist/esm/ai.js +2 -0
- package/dist/esm/bundles/AiDrawer/AiDrawer.d.ts +55 -0
- package/dist/esm/bundles/AiDrawer/AiDrawer.js +259 -0
- package/dist/esm/bundles/AiDrawer/AiDrawer.stories.d.ts +17 -0
- package/dist/esm/bundles/AiDrawer/AiDrawer.stories.js +261 -0
- package/dist/esm/bundles/AiDrawer/AiDrawerManager.d.ts +12 -0
- package/dist/esm/bundles/AiDrawer/AiDrawerManager.js +48 -0
- package/dist/esm/bundles/AiDrawer/AiDrawerManager.stories.d.ts +6 -0
- package/dist/esm/bundles/AiDrawer/AiDrawerManager.stories.js +264 -0
- package/dist/esm/bundles/AiDrawer/AiDrawerManager.test.d.ts +1 -0
- package/dist/esm/bundles/AiDrawer/AiDrawerManager.test.js +243 -0
- package/dist/esm/bundles/AiDrawer/FlashcardsScreen.d.ts +9 -0
- package/dist/esm/bundles/AiDrawer/FlashcardsScreen.js +83 -0
- package/dist/esm/bundles/aiDrawerManager.d.ts +6 -0
- package/dist/esm/bundles/aiDrawerManager.js +41 -0
- package/dist/esm/components/AiChat/AiChat.d.ts +5 -0
- package/dist/esm/components/AiChat/AiChat.js +263 -0
- package/dist/esm/components/AiChat/AiChat.stories.d.ts +17 -0
- package/dist/esm/components/AiChat/AiChat.stories.js +191 -0
- package/dist/esm/components/AiChat/AiChat.test.d.ts +1 -0
- package/dist/esm/components/AiChat/AiChat.test.js +209 -0
- package/dist/esm/components/AiChat/AiChatContext.d.ts +26 -0
- package/dist/esm/components/AiChat/AiChatContext.js +102 -0
- package/dist/esm/components/AiChat/AiChatContext.stories.d.ts +14 -0
- package/dist/esm/components/AiChat/AiChatContext.stories.js +72 -0
- package/dist/esm/components/AiChat/AiChatMarkdown.stories.d.ts +15 -0
- package/dist/esm/components/AiChat/AiChatMarkdown.stories.js +279 -0
- package/dist/esm/components/AiChat/ChatTitle.d.ts +8 -0
- package/dist/esm/components/AiChat/ChatTitle.js +40 -0
- package/dist/esm/components/AiChat/EllipsisIcon.d.ts +6 -0
- package/dist/esm/components/AiChat/EllipsisIcon.js +15 -0
- package/dist/esm/components/AiChat/EntryScreen.d.ts +11 -0
- package/dist/esm/components/AiChat/EntryScreen.js +120 -0
- package/dist/esm/components/AiChat/Markdown.d.ts +7 -0
- package/dist/esm/components/AiChat/Markdown.js +12 -0
- package/dist/esm/components/AiChat/TimLogo.d.ts +5 -0
- package/dist/esm/components/AiChat/TimLogo.js +13 -0
- package/dist/esm/components/AiChat/test-utils/api.d.ts +2 -0
- package/dist/esm/components/AiChat/test-utils/api.js +161 -0
- package/dist/esm/components/AiChat/types.d.ts +96 -0
- package/dist/esm/components/AiChat/types.js +2 -0
- package/dist/esm/components/AiChat/utils.d.ts +9 -0
- package/dist/esm/components/AiChat/utils.js +38 -0
- package/dist/esm/components/Alert/Alert.d.ts +15 -0
- package/dist/esm/components/Alert/Alert.js +59 -0
- package/dist/esm/components/Alert/Alert.stories.d.ts +8 -0
- package/dist/esm/components/Alert/Alert.stories.js +50 -0
- package/dist/esm/components/Button/ActionButton.d.ts +30 -0
- package/dist/esm/components/Button/ActionButton.js +68 -0
- package/dist/esm/components/Button/ActionButton.stories.d.ts +15 -0
- package/dist/esm/components/Button/ActionButton.stories.js +110 -0
- package/dist/esm/components/Button/Button.d.ts +58 -0
- package/dist/esm/components/Button/Button.js +252 -0
- package/dist/esm/components/Button/Button.stories.d.ts +18 -0
- package/dist/esm/components/Button/Button.stories.js +145 -0
- package/dist/esm/components/Button/Button.test.d.ts +1 -0
- package/dist/esm/components/Button/Button.test.js +44 -0
- package/dist/esm/components/Checkbox/Checkbox.d.ts +20 -0
- package/dist/esm/components/Checkbox/Checkbox.js +81 -0
- package/dist/esm/components/Checkbox/Checkbox.stories.d.ts +8 -0
- package/dist/esm/components/Checkbox/Checkbox.stories.js +30 -0
- package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.d.ts +21 -0
- package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.js +40 -0
- package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.stories.d.ts +8 -0
- package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.stories.js +47 -0
- package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.test.d.ts +1 -0
- package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.test.js +50 -0
- package/dist/esm/components/ImageAdapter/ImageAdapter.d.ts +23 -0
- package/dist/esm/components/ImageAdapter/ImageAdapter.js +27 -0
- package/dist/esm/components/Input/Input.d.ts +116 -0
- package/dist/esm/components/Input/Input.js +232 -0
- package/dist/esm/components/Input/Input.stories.d.ts +19 -0
- package/dist/esm/components/Input/Input.stories.js +132 -0
- package/dist/esm/components/Input/Input.test.d.ts +1 -0
- package/dist/esm/components/Input/Input.test.js +30 -0
- package/dist/esm/components/LinkAdapter/LinkAdapter.d.ts +23 -0
- package/dist/esm/components/LinkAdapter/LinkAdapter.js +31 -0
- package/dist/esm/components/RadioChoiceField/BooleanRadioChoiceField.stories.d.ts +6 -0
- package/dist/esm/components/RadioChoiceField/BooleanRadioChoiceField.stories.js +44 -0
- package/dist/esm/components/RadioChoiceField/RadioChoiceField.d.ts +45 -0
- package/dist/esm/components/RadioChoiceField/RadioChoiceField.js +65 -0
- package/dist/esm/components/RadioChoiceField/RadioChoiceField.stories.d.ts +6 -0
- package/dist/esm/components/RadioChoiceField/RadioChoiceField.stories.js +52 -0
- package/dist/esm/components/RadioChoiceField/RadioChoiceField.test.d.ts +1 -0
- package/dist/esm/components/RadioChoiceField/RadioChoiceField.test.js +51 -0
- package/dist/esm/components/ScrollSnap/ScrollSnap.d.ts +19 -0
- package/dist/esm/components/ScrollSnap/ScrollSnap.js +56 -0
- package/dist/esm/components/ScrollSnap/ScrollSnap.stories.d.ts +6 -0
- package/dist/esm/components/ScrollSnap/ScrollSnap.stories.js +40 -0
- package/dist/esm/components/ScrollSnap/useScrollSnap.d.ts +6 -0
- package/dist/esm/components/ScrollSnap/useScrollSnap.js +33 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.d.ts +25 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.js +40 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.stories.d.ts +6 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.stories.js +41 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.test.d.ts +1 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.test.js +60 -0
- package/dist/esm/components/TabButtons/TabButtonList.d.ts +25 -0
- package/dist/esm/components/TabButtons/TabButtonList.js +92 -0
- package/dist/esm/components/TabButtons/TabButtonList.stories.d.ts +24 -0
- package/dist/esm/components/TabButtons/TabButtonList.stories.js +136 -0
- package/dist/esm/components/TextField/TextField.d.ts +29 -0
- package/dist/esm/components/TextField/TextField.js +30 -0
- package/dist/esm/components/TextField/TextField.stories.d.ts +10 -0
- package/dist/esm/components/TextField/TextField.stories.js +133 -0
- package/dist/esm/components/TextField/TextField.test.d.ts +1 -0
- package/dist/esm/components/TextField/TextField.test.js +75 -0
- package/dist/esm/components/ThemeProvider/ThemeProvider.d.ts +21 -0
- package/dist/esm/components/ThemeProvider/ThemeProvider.js +82 -0
- package/dist/esm/components/ThemeProvider/ThemeProvider.stories.d.ts +63 -0
- package/dist/esm/components/ThemeProvider/ThemeProvider.stories.js +99 -0
- package/dist/esm/components/ThemeProvider/Typography.stories.d.ts +39 -0
- package/dist/esm/components/ThemeProvider/Typography.stories.js +62 -0
- package/dist/esm/components/ThemeProvider/breakpoints.d.ts +4 -0
- package/dist/esm/components/ThemeProvider/breakpoints.js +15 -0
- package/dist/esm/components/ThemeProvider/buttons.d.ts +7 -0
- package/dist/esm/components/ThemeProvider/buttons.js +17 -0
- package/dist/esm/components/ThemeProvider/chips.d.ts +3 -0
- package/dist/esm/components/ThemeProvider/chips.js +151 -0
- package/dist/esm/components/ThemeProvider/colors.d.ts +32 -0
- package/dist/esm/components/ThemeProvider/colors.js +32 -0
- package/dist/esm/components/ThemeProvider/typography.d.ts +18 -0
- package/dist/esm/components/ThemeProvider/typography.js +167 -0
- package/dist/esm/components/VisuallyHidden/VisuallyHidden.d.ts +24 -0
- package/dist/esm/components/VisuallyHidden/VisuallyHidden.js +30 -0
- package/dist/esm/components/VisuallyHidden/VisuallyHidden.stories.d.ts +6 -0
- package/dist/esm/components/VisuallyHidden/VisuallyHidden.stories.js +10 -0
- package/dist/esm/components/internal/FormHelpers/FormHelpers.d.ts +39 -0
- package/dist/esm/components/internal/FormHelpers/FormHelpers.js +73 -0
- package/dist/esm/components/internal/FormHelpers/FormHelpers.test.d.ts +1 -0
- package/dist/esm/components/internal/FormHelpers/FormHelpers.test.js +91 -0
- package/dist/esm/index.d.ts +25 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/jest-setup.d.ts +1 -0
- package/dist/esm/jest-setup.js +16 -0
- package/dist/esm/jsdom-extended.d.ts +6 -0
- package/dist/esm/jsdom-extended.js +12 -0
- package/dist/esm/story-utils/index.d.ts +6 -0
- package/dist/esm/story-utils/index.js +13 -0
- package/dist/esm/utils/composeRefs.d.ts +7 -0
- package/dist/esm/utils/composeRefs.js +17 -0
- package/dist/esm/utils/composeRefs.test.d.ts +1 -0
- package/dist/esm/utils/composeRefs.test.js +17 -0
- package/dist/esm/utils/retryingFetch.d.ts +19 -0
- package/dist/esm/utils/retryingFetch.js +96 -0
- package/dist/esm/utils/retryingFetch.test.d.ts +1 -0
- package/dist/esm/utils/retryingFetch.test.js +46 -0
- package/dist/esm/utils/useDevCheckStable.d.ts +8 -0
- package/dist/esm/utils/useDevCheckStable.js +26 -0
- package/dist/esm/utils/useInterval.d.ts +7 -0
- package/dist/esm/utils/useInterval.js +22 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/type-augmentation/TypescriptDocs.mdx +17 -0
- package/dist/type-augmentation/imports.d.ts +3 -0
- package/dist/type-augmentation/index.d.ts +3 -0
- package/dist/type-augmentation/theme.d.ts +105 -0
- package/dist/type-augmentation/typography.d.ts +54 -0
- package/package.json +159 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
// This was giving false positives
|
|
13
|
+
/* eslint-disable testing-library/await-async-utils */
|
|
14
|
+
const react_1 = require("@testing-library/react");
|
|
15
|
+
const user_event_1 = require("@testing-library/user-event");
|
|
16
|
+
const AiChat_1 = require("./AiChat");
|
|
17
|
+
const ThemeProvider_1 = require("../ThemeProvider/ThemeProvider");
|
|
18
|
+
const React = require("react");
|
|
19
|
+
const en_1 = require("@faker-js/faker/locale/en");
|
|
20
|
+
const msw_1 = require("msw");
|
|
21
|
+
const node_1 = require("msw/node");
|
|
22
|
+
const counter = jest.fn(); // use jest.fn as counter because it resets on each test
|
|
23
|
+
const API_URL = "http://localhost:4567/test";
|
|
24
|
+
const server = (0, node_1.setupServer)(msw_1.http.post(API_URL, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
25
|
+
const count = counter.mock.calls.length;
|
|
26
|
+
counter();
|
|
27
|
+
return msw_1.HttpResponse.text(`AI Response ${count}`);
|
|
28
|
+
})));
|
|
29
|
+
beforeAll(() => server.listen());
|
|
30
|
+
afterEach(() => server.resetHandlers());
|
|
31
|
+
afterAll(() => server.close());
|
|
32
|
+
jest.mock("react-markdown", () => {
|
|
33
|
+
return {
|
|
34
|
+
__esModule: true,
|
|
35
|
+
default: ({ children }) => React.createElement("div", null, children),
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
const msg = {
|
|
39
|
+
ai: (text) => `Assistant said: ${text}`,
|
|
40
|
+
you: (text) => `You said: ${text}`,
|
|
41
|
+
};
|
|
42
|
+
const getMessages = () => {
|
|
43
|
+
return Array.from(document.querySelectorAll(".MitAiChat--message"));
|
|
44
|
+
};
|
|
45
|
+
const getConversationStarters = () => {
|
|
46
|
+
return Array.from(document.querySelectorAll("button.MitAiChat--conversationStarter"));
|
|
47
|
+
};
|
|
48
|
+
const whenCount = (cb, count) => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
+
return yield (0, react_1.waitFor)(() => {
|
|
50
|
+
const result = cb();
|
|
51
|
+
expect(result).toHaveLength(count);
|
|
52
|
+
return result;
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("AiChat", () => {
|
|
56
|
+
beforeEach(() => {
|
|
57
|
+
const MockObserverInstance = {
|
|
58
|
+
observe: jest.fn(),
|
|
59
|
+
unobserve: jest.fn(),
|
|
60
|
+
disconnect: jest.fn(),
|
|
61
|
+
};
|
|
62
|
+
global.ResizeObserver = jest
|
|
63
|
+
.fn()
|
|
64
|
+
.mockImplementation(() => MockObserverInstance);
|
|
65
|
+
});
|
|
66
|
+
const setup = (props = {}) => {
|
|
67
|
+
const initialMessages = [
|
|
68
|
+
{ role: "assistant", content: en_1.faker.lorem.sentence() },
|
|
69
|
+
];
|
|
70
|
+
const conversationStarters = [
|
|
71
|
+
{ content: en_1.faker.lorem.sentence() },
|
|
72
|
+
{ content: en_1.faker.lorem.sentence() },
|
|
73
|
+
];
|
|
74
|
+
const view = (0, react_1.render)(React.createElement(AiChat_1.AiChat, Object.assign({ "data-testid": "ai-chat", initialMessages: initialMessages, conversationStarters: conversationStarters, requestOpts: { apiUrl: API_URL }, placeholder: "Type a message...", entryScreenEnabled: false }, props)), { wrapper: ThemeProvider_1.ThemeProvider });
|
|
75
|
+
const rerender = (newProps) => {
|
|
76
|
+
view.rerender(React.createElement(AiChat_1.AiChat, Object.assign({ "data-testid": "ai-chat", initialMessages: initialMessages, conversationStarters: conversationStarters, requestOpts: { apiUrl: API_URL }, entryScreenEnabled: false }, newProps)));
|
|
77
|
+
};
|
|
78
|
+
return { initialMessages, conversationStarters, rerender };
|
|
79
|
+
};
|
|
80
|
+
test("Clicking conversation starters and sending chats", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
81
|
+
const { initialMessages, conversationStarters } = setup();
|
|
82
|
+
const scrollBy = jest.spyOn(HTMLElement.prototype, "scrollBy");
|
|
83
|
+
const initialMessageEls = getMessages();
|
|
84
|
+
expect(initialMessageEls.length).toBe(1);
|
|
85
|
+
expect(initialMessageEls[0]).toHaveTextContent(initialMessages[0].content);
|
|
86
|
+
const starterEls = getConversationStarters();
|
|
87
|
+
expect(starterEls.length).toBe(2);
|
|
88
|
+
expect(starterEls[0]).toHaveTextContent(conversationStarters[0].content);
|
|
89
|
+
expect(starterEls[1]).toHaveTextContent(conversationStarters[1].content);
|
|
90
|
+
const chosen = en_1.faker.helpers.arrayElement([0, 1]);
|
|
91
|
+
yield user_event_1.default.click(starterEls[chosen]);
|
|
92
|
+
expect(scrollBy).toHaveBeenCalled();
|
|
93
|
+
scrollBy.mockReset();
|
|
94
|
+
const messageEls = yield whenCount(getMessages, 3);
|
|
95
|
+
expect(messageEls[0]).toHaveTextContent(initialMessages[0].content);
|
|
96
|
+
expect(messageEls[1]).toHaveTextContent(conversationStarters[chosen].content);
|
|
97
|
+
expect(messageEls[2]).toHaveTextContent("AI Response 0");
|
|
98
|
+
yield user_event_1.default.click(react_1.screen.getByPlaceholderText("Type a message..."));
|
|
99
|
+
yield user_event_1.default.paste("User message");
|
|
100
|
+
yield user_event_1.default.click(react_1.screen.getByRole("button", { name: "Send" }));
|
|
101
|
+
expect(scrollBy).toHaveBeenCalled();
|
|
102
|
+
const afterSending = yield whenCount(getMessages, 5);
|
|
103
|
+
expect(afterSending[3]).toHaveTextContent("User message");
|
|
104
|
+
expect(afterSending[4]).toHaveTextContent("AI Response 1");
|
|
105
|
+
}));
|
|
106
|
+
test("Messages persist if chat has same chatId", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
107
|
+
const { rerender } = setup({ chatId: "test-123" });
|
|
108
|
+
const starterEls = getConversationStarters();
|
|
109
|
+
const chosen = en_1.faker.helpers.arrayElement([0, 1]);
|
|
110
|
+
yield user_event_1.default.click(starterEls[chosen]);
|
|
111
|
+
yield whenCount(getMessages, 3);
|
|
112
|
+
// New chat ... starters should be shown
|
|
113
|
+
rerender({ chatId: "test-345" });
|
|
114
|
+
expect(getConversationStarters().length).toBeGreaterThan(0);
|
|
115
|
+
yield whenCount(getMessages, 1);
|
|
116
|
+
// existing chat ... starters should not be shown, messages should be restored
|
|
117
|
+
rerender({ chatId: "test-123" });
|
|
118
|
+
expect(getConversationStarters().length).toBe(0);
|
|
119
|
+
yield whenCount(getMessages, 3);
|
|
120
|
+
}));
|
|
121
|
+
test("transformBody is called before sending requests", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
122
|
+
const mockFetch = jest.spyOn(window, "fetch");
|
|
123
|
+
const fakeBody = { message: en_1.faker.lorem.sentence() };
|
|
124
|
+
const transformBody = jest.fn(() => fakeBody);
|
|
125
|
+
const { initialMessages } = setup({
|
|
126
|
+
requestOpts: { apiUrl: API_URL, transformBody },
|
|
127
|
+
});
|
|
128
|
+
yield user_event_1.default.click(react_1.screen.getByPlaceholderText("Type a message..."));
|
|
129
|
+
yield user_event_1.default.paste("User message");
|
|
130
|
+
yield user_event_1.default.click(react_1.screen.getByRole("button", { name: "Send" }));
|
|
131
|
+
expect(transformBody).toHaveBeenCalledWith([
|
|
132
|
+
expect.objectContaining(initialMessages[0]),
|
|
133
|
+
expect.objectContaining({ content: "User message", role: "user" }),
|
|
134
|
+
]);
|
|
135
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
136
|
+
expect(mockFetch).toHaveBeenCalledWith(API_URL, expect.objectContaining({
|
|
137
|
+
body: JSON.stringify(fakeBody),
|
|
138
|
+
}));
|
|
139
|
+
}));
|
|
140
|
+
test("parseContent is called on the API-received message content", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
141
|
+
const fakeBody = { message: en_1.faker.lorem.sentence() };
|
|
142
|
+
const transformBody = jest.fn(() => fakeBody);
|
|
143
|
+
const { initialMessages, conversationStarters } = setup({
|
|
144
|
+
requestOpts: { apiUrl: API_URL, transformBody },
|
|
145
|
+
parseContent: jest.fn((content) => `Parsed: ${content}`),
|
|
146
|
+
});
|
|
147
|
+
yield user_event_1.default.click(getConversationStarters()[0]);
|
|
148
|
+
yield whenCount(getMessages, initialMessages.length + 2);
|
|
149
|
+
yield user_event_1.default.click(react_1.screen.getByPlaceholderText("Type a message..."));
|
|
150
|
+
yield user_event_1.default.paste("User message");
|
|
151
|
+
yield user_event_1.default.click(react_1.screen.getByRole("button", { name: "Send" }));
|
|
152
|
+
yield whenCount(getMessages, initialMessages.length + 4);
|
|
153
|
+
const messagesTexts = getMessages().map((el) => el.textContent);
|
|
154
|
+
expect(messagesTexts).toEqual([
|
|
155
|
+
msg.ai(initialMessages[0].content),
|
|
156
|
+
msg.you(conversationStarters[0].content),
|
|
157
|
+
msg.ai("Parsed: AI Response 0"),
|
|
158
|
+
msg.you("User message"),
|
|
159
|
+
msg.ai("Parsed: AI Response 1"),
|
|
160
|
+
]);
|
|
161
|
+
}));
|
|
162
|
+
test("Passes extra attributes to root", () => {
|
|
163
|
+
const fakeBody = { message: en_1.faker.lorem.sentence() };
|
|
164
|
+
const transformBody = jest.fn(() => fakeBody);
|
|
165
|
+
setup({
|
|
166
|
+
requestOpts: { apiUrl: API_URL, transformBody },
|
|
167
|
+
parseContent: jest.fn((content) => `Parsed: ${content}`),
|
|
168
|
+
});
|
|
169
|
+
expect(react_1.screen.getByTestId("ai-chat")).toBeInTheDocument();
|
|
170
|
+
});
|
|
171
|
+
test("If the API returns an error, an alert is shown", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
172
|
+
setup();
|
|
173
|
+
server.use(msw_1.http.post(API_URL, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
174
|
+
return new msw_1.HttpResponse(null, { status: 500 });
|
|
175
|
+
})));
|
|
176
|
+
yield user_event_1.default.click(getConversationStarters()[0]);
|
|
177
|
+
const alert = yield react_1.screen.findByRole("alert");
|
|
178
|
+
expect(alert).toHaveTextContent("An unexpected error has occurred");
|
|
179
|
+
}));
|
|
180
|
+
test("Shows the entry screen if entryScreenEnabled is true", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
181
|
+
setup({
|
|
182
|
+
entryScreenEnabled: true,
|
|
183
|
+
entryScreenTitle: "Entry Screen Title",
|
|
184
|
+
});
|
|
185
|
+
yield expect(react_1.screen.getByText("Entry Screen Title")).toBeInTheDocument();
|
|
186
|
+
}));
|
|
187
|
+
test("User can submit a prompt from the entry screen", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
188
|
+
setup({
|
|
189
|
+
entryScreenEnabled: true,
|
|
190
|
+
entryScreenTitle: "Entry Screen Title",
|
|
191
|
+
initialMessages: [],
|
|
192
|
+
conversationStarters: [],
|
|
193
|
+
});
|
|
194
|
+
yield user_event_1.default.click(react_1.screen.getByRole("textbox"));
|
|
195
|
+
yield user_event_1.default.paste("User message");
|
|
196
|
+
yield user_event_1.default.click(react_1.screen.getByRole("button", { name: "Send" }));
|
|
197
|
+
const messages = getMessages();
|
|
198
|
+
expect(messages[0]).toHaveTextContent("User message");
|
|
199
|
+
}));
|
|
200
|
+
test("User can click starter on the entry screen to submit a prompt", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
201
|
+
setup({
|
|
202
|
+
entryScreenEnabled: true,
|
|
203
|
+
entryScreenTitle: "Entry Screen Title",
|
|
204
|
+
initialMessages: [],
|
|
205
|
+
conversationStarters: [{ content: "Starter 1" }],
|
|
206
|
+
});
|
|
207
|
+
yield user_event_1.default.click(react_1.screen.getByRole("button", { name: "Starter 1" }));
|
|
208
|
+
const messages = getMessages();
|
|
209
|
+
expect(messages[0]).toHaveTextContent("Starter 1");
|
|
210
|
+
}));
|
|
211
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { UseChatHelpers } from "@ai-sdk/react";
|
|
3
|
+
import type { AiChatMessage, AiChatContextProps } from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* All of `@ai-sdk/react`'s [`useChat`](https://ai-sdk.dev/docs/reference/ai-sdk-ui/use-chat)
|
|
6
|
+
* results, plus the initial messages.
|
|
7
|
+
*/
|
|
8
|
+
type AiChatContextResult = UseChatHelpers & {
|
|
9
|
+
initialMessages: AiChatMessage[] | null;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Provides AiChatContext to its children. Within this provider, you can consume
|
|
13
|
+
* the AiChatContext using the `useAiChat` hook.
|
|
14
|
+
*/
|
|
15
|
+
declare const AiChatProvider: React.FC<AiChatContextProps>;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the AiChatContext, which includes all results from `@ai-sdk/react`'s
|
|
18
|
+
* [`useChat`](https://ai-sdk.dev/docs/reference/ai-sdk-ui/use-chat) hook as
|
|
19
|
+
* well as the initial messages.
|
|
20
|
+
*
|
|
21
|
+
* In addition to customizing the fetcher, using a context allows us to avoid
|
|
22
|
+
* this issue https://github.com/vercel/ai/issues/3266 since the caller no
|
|
23
|
+
* longer needs to provide the initial messages.
|
|
24
|
+
*/
|
|
25
|
+
declare const useAiChat: () => AiChatContextResult;
|
|
26
|
+
export { useAiChat, AiChatProvider };
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
+
var t = {};
|
|
13
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
+
t[p] = s[p];
|
|
15
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
+
t[p[i]] = s[p[i]];
|
|
19
|
+
}
|
|
20
|
+
return t;
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.AiChatProvider = exports.useAiChat = void 0;
|
|
24
|
+
const React = require("react");
|
|
25
|
+
const react_1 = require("@ai-sdk/react");
|
|
26
|
+
const react_2 = require("react");
|
|
27
|
+
const retryingFetch_1 = require("../../utils/retryingFetch");
|
|
28
|
+
const identity = (x) => x;
|
|
29
|
+
const getFetcher = (requestOpts) => (url, opts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
30
|
+
var _a, _b;
|
|
31
|
+
if (typeof (opts === null || opts === void 0 ? void 0 : opts.body) !== "string") {
|
|
32
|
+
console.error("Unexpected body type.");
|
|
33
|
+
return (0, retryingFetch_1.default)(url, opts);
|
|
34
|
+
}
|
|
35
|
+
const messages = JSON.parse(opts === null || opts === void 0 ? void 0 : opts.body).messages;
|
|
36
|
+
const transformBody = (_a = requestOpts.transformBody) !== null && _a !== void 0 ? _a : identity;
|
|
37
|
+
const options = Object.assign(Object.assign(Object.assign(Object.assign({}, opts), { body: JSON.stringify(transformBody(messages)) }), requestOpts.fetchOpts), { headers: Object.assign(Object.assign(Object.assign({}, opts === null || opts === void 0 ? void 0 : opts.headers), { "Content-Type": "application/json" }), (_b = requestOpts.fetchOpts) === null || _b === void 0 ? void 0 : _b.headers) });
|
|
38
|
+
return (0, retryingFetch_1.default)(url, options);
|
|
39
|
+
});
|
|
40
|
+
const AiChatContext = (0, react_2.createContext)(null);
|
|
41
|
+
/**
|
|
42
|
+
* Provides AiChatContext to its children. Within this provider, you can consume
|
|
43
|
+
* the AiChatContext using the `useAiChat` hook.
|
|
44
|
+
*/
|
|
45
|
+
const AiChatProvider = ({ initialMessages: _initialMessages, requestOpts, chatId, parseContent, children, }) => {
|
|
46
|
+
const initialMessages = (0, react_2.useMemo)(() => {
|
|
47
|
+
var _a;
|
|
48
|
+
return ((_a = _initialMessages === null || _initialMessages === void 0 ? void 0 : _initialMessages.map((message, i) => (Object.assign(Object.assign({}, message), { id: `initial-${i}` })))) !== null && _a !== void 0 ? _a : []);
|
|
49
|
+
}, [_initialMessages]);
|
|
50
|
+
const fetcher = (0, react_2.useMemo)(() => getFetcher(requestOpts), [requestOpts]);
|
|
51
|
+
const _a = (0, react_1.useChat)({
|
|
52
|
+
api: requestOpts.apiUrl,
|
|
53
|
+
streamProtocol: "text",
|
|
54
|
+
fetch: fetcher,
|
|
55
|
+
onFinish: (message) => {
|
|
56
|
+
var _a;
|
|
57
|
+
if (!requestOpts.onFinish)
|
|
58
|
+
return;
|
|
59
|
+
if (message.role === "assistant" || message.role === "user") {
|
|
60
|
+
(_a = requestOpts.onFinish) === null || _a === void 0 ? void 0 : _a.call(requestOpts, message);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.info("Unexpected message role.", message);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
initialMessages,
|
|
67
|
+
id: chatId,
|
|
68
|
+
}), { messages: unparsed } = _a, others = __rest(_a, ["messages"]);
|
|
69
|
+
const messages = (0, react_2.useMemo)(() => {
|
|
70
|
+
const initial = initialMessages === null || initialMessages === void 0 ? void 0 : initialMessages.map((m) => m.id);
|
|
71
|
+
return unparsed.map((m) => {
|
|
72
|
+
if (m.role === "assistant" && !(initial === null || initial === void 0 ? void 0 : initial.includes(m.id))) {
|
|
73
|
+
const content = parseContent ? parseContent(m.content) : m.content;
|
|
74
|
+
return Object.assign(Object.assign({}, m), { content });
|
|
75
|
+
}
|
|
76
|
+
return m;
|
|
77
|
+
});
|
|
78
|
+
}, [parseContent, unparsed, initialMessages]);
|
|
79
|
+
return (React.createElement(AiChatContext.Provider
|
|
80
|
+
/**
|
|
81
|
+
* Ensure that child state is reset when chatId changes.
|
|
82
|
+
*/
|
|
83
|
+
, {
|
|
84
|
+
/**
|
|
85
|
+
* Ensure that child state is reset when chatId changes.
|
|
86
|
+
*/
|
|
87
|
+
key: chatId, value: Object.assign({ initialMessages, messages }, others) }, children));
|
|
88
|
+
};
|
|
89
|
+
exports.AiChatProvider = AiChatProvider;
|
|
90
|
+
/**
|
|
91
|
+
* Returns the AiChatContext, which includes all results from `@ai-sdk/react`'s
|
|
92
|
+
* [`useChat`](https://ai-sdk.dev/docs/reference/ai-sdk-ui/use-chat) hook as
|
|
93
|
+
* well as the initial messages.
|
|
94
|
+
*
|
|
95
|
+
* In addition to customizing the fetcher, using a context allows us to avoid
|
|
96
|
+
* this issue https://github.com/vercel/ai/issues/3266 since the caller no
|
|
97
|
+
* longer needs to provide the initial messages.
|
|
98
|
+
*/
|
|
99
|
+
const useAiChat = () => {
|
|
100
|
+
const context = React.useContext(AiChatContext);
|
|
101
|
+
if (!context) {
|
|
102
|
+
throw new Error("useAiChatContext must be used within an AiChatProvider");
|
|
103
|
+
}
|
|
104
|
+
return context;
|
|
105
|
+
};
|
|
106
|
+
exports.useAiChat = useAiChat;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { AiChatProvider } from "./AiChatContext";
|
|
3
|
+
/**
|
|
4
|
+
* AiChatProvider provides state and functions for managing chat. The higher-level
|
|
5
|
+
* `AiChat` component is a wrapper around this provider and the `AiChatDisplay`,
|
|
6
|
+
* roughly.
|
|
7
|
+
*
|
|
8
|
+
* If you need to access chat state outside of the chat display, you can use
|
|
9
|
+
* `AiChatProvider` directly.
|
|
10
|
+
*/
|
|
11
|
+
declare const meta: Meta<typeof AiChatProvider>;
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof AiChatProvider>;
|
|
14
|
+
export declare const StreamingResponses: Story;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StreamingResponses = void 0;
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const AiChat_1 = require("./AiChat");
|
|
6
|
+
const AiChatContext_1 = require("./AiChatContext");
|
|
7
|
+
const styled_1 = require("@emotion/styled");
|
|
8
|
+
const api_1 = require("./test-utils/api");
|
|
9
|
+
const Typography_1 = require("@mui/material/Typography");
|
|
10
|
+
const TEST_API_STREAMING = "http://localhost:4567/streaming";
|
|
11
|
+
const INITIAL_MESSAGES = [
|
|
12
|
+
{
|
|
13
|
+
content: "Hi! What are you interested in learning about?",
|
|
14
|
+
role: "assistant",
|
|
15
|
+
},
|
|
16
|
+
];
|
|
17
|
+
const STARTERS = [
|
|
18
|
+
{ content: "I'm interested in quantum computing" },
|
|
19
|
+
{ content: "I want to understand global warming. " },
|
|
20
|
+
{ content: "I am curious about AI applications for business" },
|
|
21
|
+
];
|
|
22
|
+
const Container = styled_1.default.div({
|
|
23
|
+
width: "100%",
|
|
24
|
+
height: "400px",
|
|
25
|
+
position: "relative",
|
|
26
|
+
});
|
|
27
|
+
const MessageCounter = () => {
|
|
28
|
+
const { messages } = (0, AiChatContext_1.useAiChat)();
|
|
29
|
+
return (React.createElement(Typography_1.default, { variant: "subtitle1" },
|
|
30
|
+
"Message count: ",
|
|
31
|
+
messages.length,
|
|
32
|
+
" (Provided by ",
|
|
33
|
+
React.createElement("code", null, "AiChatContext"),
|
|
34
|
+
")"));
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* AiChatProvider provides state and functions for managing chat. The higher-level
|
|
38
|
+
* `AiChat` component is a wrapper around this provider and the `AiChatDisplay`,
|
|
39
|
+
* roughly.
|
|
40
|
+
*
|
|
41
|
+
* If you need to access chat state outside of the chat display, you can use
|
|
42
|
+
* `AiChatProvider` directly.
|
|
43
|
+
*/
|
|
44
|
+
const meta = {
|
|
45
|
+
title: "smoot-design/AI/AiChatContext",
|
|
46
|
+
component: AiChatContext_1.AiChatProvider,
|
|
47
|
+
parameters: {
|
|
48
|
+
msw: { handlers: api_1.handlers },
|
|
49
|
+
},
|
|
50
|
+
render: (args) => {
|
|
51
|
+
return (React.createElement(AiChatContext_1.AiChatProvider, Object.assign({}, args),
|
|
52
|
+
React.createElement(MessageCounter, null),
|
|
53
|
+
React.createElement(Container, null,
|
|
54
|
+
React.createElement(AiChat_1.AiChatDisplay, { entryScreenEnabled: false, conversationStarters: STARTERS, placeholder: "Type your message here", askTimTitle: "Ask TIM" }))));
|
|
55
|
+
},
|
|
56
|
+
decorators: (Story) => {
|
|
57
|
+
return (React.createElement(Container, null,
|
|
58
|
+
React.createElement(Story, null)));
|
|
59
|
+
},
|
|
60
|
+
args: {
|
|
61
|
+
requestOpts: { apiUrl: TEST_API_STREAMING },
|
|
62
|
+
initialMessages: INITIAL_MESSAGES,
|
|
63
|
+
},
|
|
64
|
+
argTypes: {
|
|
65
|
+
initialMessages: {
|
|
66
|
+
control: { type: "object", disable: true },
|
|
67
|
+
},
|
|
68
|
+
requestOpts: {
|
|
69
|
+
control: { type: "object", disable: true },
|
|
70
|
+
table: { readonly: true }, // See above
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
exports.default = meta;
|
|
75
|
+
exports.StreamingResponses = {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { AiChat } from "./AiChat";
|
|
3
|
+
declare const meta: Meta<typeof AiChat>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof AiChat>;
|
|
6
|
+
export declare const Typical: Story;
|
|
7
|
+
export declare const Textual: Story;
|
|
8
|
+
export declare const Math: Story;
|
|
9
|
+
export declare const SimpleOrderedList: Story;
|
|
10
|
+
export declare const SimpleUnorderedList: Story;
|
|
11
|
+
export declare const NestedOrderedList: Story;
|
|
12
|
+
export declare const NestedUnorderedList: Story;
|
|
13
|
+
export declare const NestedOrderedUnorderedList: Story;
|
|
14
|
+
export declare const NestedUnorderedOrderedList: Story;
|
|
15
|
+
export declare const UnexpectedList: Story;
|