@magmamath/students-features 0.1.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/README.md +33 -0
- package/dist/commonjs/features/chatbot/components/Alternatives/Alternatives.js +60 -0
- package/dist/commonjs/features/chatbot/components/Alternatives/Alternatives.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/Alternatives/HelpRequestOption.js +96 -0
- package/dist/commonjs/features/chatbot/components/Alternatives/HelpRequestOption.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js +97 -0
- package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/ChatMessage.js +27 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/ChatMessage.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/MessageLoader.js +56 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/MessageLoader.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/MessageTextToSpeech.js +88 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/MessageTextToSpeech.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js +87 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/SentMessage.js +43 -0
- package/dist/commonjs/features/chatbot/components/ChatMessage/SentMessage.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/ChatMessages/ChatbotMessages.js +130 -0
- package/dist/commonjs/features/chatbot/components/ChatMessages/ChatbotMessages.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/Chatbot.js +69 -0
- package/dist/commonjs/features/chatbot/components/Chatbot.js.map +1 -0
- package/dist/commonjs/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.js +65 -0
- package/dist/commonjs/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.js.map +1 -0
- package/dist/commonjs/features/chatbot/constants.js +31 -0
- package/dist/commonjs/features/chatbot/constants.js.map +1 -0
- package/dist/commonjs/features/chatbot/helpers.js +12 -0
- package/dist/commonjs/features/chatbot/helpers.js.map +1 -0
- package/dist/commonjs/features/chatbot/index.js +34 -0
- package/dist/commonjs/features/chatbot/index.js.map +1 -0
- package/dist/commonjs/features/chatbot/model/api.js +18 -0
- package/dist/commonjs/features/chatbot/model/api.js.map +1 -0
- package/dist/commonjs/features/chatbot/model/model.js +244 -0
- package/dist/commonjs/features/chatbot/model/model.js.map +1 -0
- package/dist/commonjs/features/chatbot/model/t2s.js +104 -0
- package/dist/commonjs/features/chatbot/model/t2s.js.map +1 -0
- package/dist/commonjs/features/chatbot/model/translation.js +203 -0
- package/dist/commonjs/features/chatbot/model/translation.js.map +1 -0
- package/dist/commonjs/features/chatbot/types/api.types.js +2 -0
- package/dist/commonjs/features/chatbot/types/api.types.js.map +1 -0
- package/dist/commonjs/features/chatbot/types/model.types.js +12 -0
- package/dist/commonjs/features/chatbot/types/model.types.js.map +1 -0
- package/dist/commonjs/features/chatbot/types/t2s.types.js +13 -0
- package/dist/commonjs/features/chatbot/types/t2s.types.js.map +1 -0
- package/dist/commonjs/features/chatbot/types/translation.types.js +6 -0
- package/dist/commonjs/features/chatbot/types/translation.types.js.map +1 -0
- package/dist/commonjs/index.js +42 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/lib/createFeature/createFeature.js +28 -0
- package/dist/commonjs/lib/createFeature/createFeature.js.map +1 -0
- package/dist/commonjs/lib/effector/createControllerEffect.js +51 -0
- package/dist/commonjs/lib/effector/createControllerEffect.js.map +1 -0
- package/dist/commonjs/lib/effector/createEntityFieldStore.js +42 -0
- package/dist/commonjs/lib/effector/createEntityFieldStore.js.map +1 -0
- package/dist/commonjs/lib/effector/index.js +20 -0
- package/dist/commonjs/lib/effector/index.js.map +1 -0
- package/dist/commonjs/lib/helpers/helpers.js +9 -0
- package/dist/commonjs/lib/helpers/helpers.js.map +1 -0
- package/dist/commonjs/lib/localization/en.json +2 -0
- package/dist/commonjs/lib/localization/gb.json +2 -0
- package/dist/commonjs/lib/localization/sw.json +2 -0
- package/dist/commonjs/shared/hooks/useDebounce.js +21 -0
- package/dist/commonjs/shared/hooks/useDebounce.js.map +1 -0
- package/dist/commonjs/shared/icons/ArrowRightIcon.js +30 -0
- package/dist/commonjs/shared/icons/ArrowRightIcon.js.map +1 -0
- package/dist/commonjs/shared/icons/ChatbotIcon.js +148 -0
- package/dist/commonjs/shared/icons/ChatbotIcon.js.map +1 -0
- package/dist/commonjs/shared/icons/CloseIcon.js +28 -0
- package/dist/commonjs/shared/icons/CloseIcon.js.map +1 -0
- package/dist/commonjs/shared/icons/GlobeIcon.js +30 -0
- package/dist/commonjs/shared/icons/GlobeIcon.js.map +1 -0
- package/dist/commonjs/shared/icons/PauseIcon.js +32 -0
- package/dist/commonjs/shared/icons/PauseIcon.js.map +1 -0
- package/dist/commonjs/shared/icons/PlayIcon.js +32 -0
- package/dist/commonjs/shared/icons/PlayIcon.js.map +1 -0
- package/dist/commonjs/shared/icons/SpeakerIcon.js +37 -0
- package/dist/commonjs/shared/icons/SpeakerIcon.js.map +1 -0
- package/dist/commonjs/shared/icons/icon.types.js +2 -0
- package/dist/commonjs/shared/icons/icon.types.js.map +1 -0
- package/dist/commonjs/shared/translation/constants.js +17 -0
- package/dist/commonjs/shared/translation/constants.js.map +1 -0
- package/dist/commonjs/shared/translation/helpers.js +31 -0
- package/dist/commonjs/shared/translation/helpers.js.map +1 -0
- package/dist/commonjs/shared/translation/hooks.js +28 -0
- package/dist/commonjs/shared/translation/hooks.js.map +1 -0
- package/dist/commonjs/shared/translation/index.js +52 -0
- package/dist/commonjs/shared/translation/index.js.map +1 -0
- package/dist/commonjs/shared/translation/model.js +15 -0
- package/dist/commonjs/shared/translation/model.js.map +1 -0
- package/dist/commonjs/shared/translation/types.js +13 -0
- package/dist/commonjs/shared/translation/types.js.map +1 -0
- package/dist/commonjs/types/types.d.js +2 -0
- package/dist/commonjs/types/types.d.js.map +1 -0
- package/dist/module/features/chatbot/components/Alternatives/Alternatives.js +54 -0
- package/dist/module/features/chatbot/components/Alternatives/Alternatives.js.map +1 -0
- package/dist/module/features/chatbot/components/Alternatives/HelpRequestOption.js +90 -0
- package/dist/module/features/chatbot/components/Alternatives/HelpRequestOption.js.map +1 -0
- package/dist/module/features/chatbot/components/ChatControls/ChatControls.js +91 -0
- package/dist/module/features/chatbot/components/ChatControls/ChatControls.js.map +1 -0
- package/dist/module/features/chatbot/components/ChatMessage/ChatMessage.js +21 -0
- package/dist/module/features/chatbot/components/ChatMessage/ChatMessage.js.map +1 -0
- package/dist/module/features/chatbot/components/ChatMessage/MessageLoader.js +50 -0
- package/dist/module/features/chatbot/components/ChatMessage/MessageLoader.js.map +1 -0
- package/dist/module/features/chatbot/components/ChatMessage/MessageTextToSpeech.js +82 -0
- package/dist/module/features/chatbot/components/ChatMessage/MessageTextToSpeech.js.map +1 -0
- package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js +81 -0
- package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -0
- package/dist/module/features/chatbot/components/ChatMessage/SentMessage.js +37 -0
- package/dist/module/features/chatbot/components/ChatMessage/SentMessage.js.map +1 -0
- package/dist/module/features/chatbot/components/ChatMessages/ChatbotMessages.js +123 -0
- package/dist/module/features/chatbot/components/ChatMessages/ChatbotMessages.js.map +1 -0
- package/dist/module/features/chatbot/components/Chatbot.js +63 -0
- package/dist/module/features/chatbot/components/Chatbot.js.map +1 -0
- package/dist/module/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.js +59 -0
- package/dist/module/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.js.map +1 -0
- package/dist/module/features/chatbot/constants.js +27 -0
- package/dist/module/features/chatbot/constants.js.map +1 -0
- package/dist/module/features/chatbot/helpers.js +7 -0
- package/dist/module/features/chatbot/helpers.js.map +1 -0
- package/dist/module/features/chatbot/index.js +7 -0
- package/dist/module/features/chatbot/index.js.map +1 -0
- package/dist/module/features/chatbot/model/api.js +13 -0
- package/dist/module/features/chatbot/model/api.js.map +1 -0
- package/dist/module/features/chatbot/model/model.js +239 -0
- package/dist/module/features/chatbot/model/model.js.map +1 -0
- package/dist/module/features/chatbot/model/t2s.js +99 -0
- package/dist/module/features/chatbot/model/t2s.js.map +1 -0
- package/dist/module/features/chatbot/model/translation.js +198 -0
- package/dist/module/features/chatbot/model/translation.js.map +1 -0
- package/dist/module/features/chatbot/types/api.types.js +2 -0
- package/dist/module/features/chatbot/types/api.types.js.map +1 -0
- package/dist/module/features/chatbot/types/model.types.js +8 -0
- package/dist/module/features/chatbot/types/model.types.js.map +1 -0
- package/dist/module/features/chatbot/types/t2s.types.js +9 -0
- package/dist/module/features/chatbot/types/t2s.types.js.map +1 -0
- package/dist/module/features/chatbot/types/translation.types.js +4 -0
- package/dist/module/features/chatbot/types/translation.types.js.map +1 -0
- package/dist/module/index.js +5 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/lib/createFeature/createFeature.js +22 -0
- package/dist/module/lib/createFeature/createFeature.js.map +1 -0
- package/dist/module/lib/effector/createControllerEffect.js +45 -0
- package/dist/module/lib/effector/createControllerEffect.js.map +1 -0
- package/dist/module/lib/effector/createEntityFieldStore.js +38 -0
- package/dist/module/lib/effector/createEntityFieldStore.js.map +1 -0
- package/dist/module/lib/effector/index.js +5 -0
- package/dist/module/lib/effector/index.js.map +1 -0
- package/dist/module/lib/helpers/helpers.js +4 -0
- package/dist/module/lib/helpers/helpers.js.map +1 -0
- package/dist/module/lib/localization/en.json +2 -0
- package/dist/module/lib/localization/gb.json +2 -0
- package/dist/module/lib/localization/sw.json +2 -0
- package/dist/module/shared/hooks/useDebounce.js +16 -0
- package/dist/module/shared/hooks/useDebounce.js.map +1 -0
- package/dist/module/shared/icons/ArrowRightIcon.js +22 -0
- package/dist/module/shared/icons/ArrowRightIcon.js.map +1 -0
- package/dist/module/shared/icons/ChatbotIcon.js +140 -0
- package/dist/module/shared/icons/ChatbotIcon.js.map +1 -0
- package/dist/module/shared/icons/CloseIcon.js +20 -0
- package/dist/module/shared/icons/CloseIcon.js.map +1 -0
- package/dist/module/shared/icons/GlobeIcon.js +22 -0
- package/dist/module/shared/icons/GlobeIcon.js.map +1 -0
- package/dist/module/shared/icons/PauseIcon.js +24 -0
- package/dist/module/shared/icons/PauseIcon.js.map +1 -0
- package/dist/module/shared/icons/PlayIcon.js +24 -0
- package/dist/module/shared/icons/PlayIcon.js.map +1 -0
- package/dist/module/shared/icons/SpeakerIcon.js +29 -0
- package/dist/module/shared/icons/SpeakerIcon.js.map +1 -0
- package/dist/module/shared/icons/icon.types.js +2 -0
- package/dist/module/shared/icons/icon.types.js.map +1 -0
- package/dist/module/shared/translation/constants.js +12 -0
- package/dist/module/shared/translation/constants.js.map +1 -0
- package/dist/module/shared/translation/helpers.js +24 -0
- package/dist/module/shared/translation/helpers.js.map +1 -0
- package/dist/module/shared/translation/hooks.js +22 -0
- package/dist/module/shared/translation/hooks.js.map +1 -0
- package/dist/module/shared/translation/index.js +7 -0
- package/dist/module/shared/translation/index.js.map +1 -0
- package/dist/module/shared/translation/model.js +11 -0
- package/dist/module/shared/translation/model.js.map +1 -0
- package/dist/module/shared/translation/types.js +9 -0
- package/dist/module/shared/translation/types.js.map +1 -0
- package/dist/module/types/types.d.js +2 -0
- package/dist/module/types/types.d.js.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/Alternatives/Alternatives.d.ts +11 -0
- package/dist/typescript/commonjs/features/chatbot/components/Alternatives/Alternatives.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/Alternatives/HelpRequestOption.d.ts +9 -0
- package/dist/typescript/commonjs/features/chatbot/components/Alternatives/HelpRequestOption.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts +14 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ChatMessage.d.ts +17 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ChatMessage.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageLoader.d.ts +3 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageLoader.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageTextToSpeech.d.ts +12 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageTextToSpeech.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts +4 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/SentMessage.d.ts +4 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/SentMessage.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessages/ChatbotMessages.d.ts +21 -0
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessages/ChatbotMessages.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts +25 -0
- package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.d.ts +9 -0
- package/dist/typescript/commonjs/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/constants.d.ts +21 -0
- package/dist/typescript/commonjs/features/chatbot/constants.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/helpers.d.ts +2 -0
- package/dist/typescript/commonjs/features/chatbot/helpers.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/index.d.ts +5 -0
- package/dist/typescript/commonjs/features/chatbot/index.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/model/api.d.ts +12 -0
- package/dist/typescript/commonjs/features/chatbot/model/api.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/model/model.d.ts +73 -0
- package/dist/typescript/commonjs/features/chatbot/model/model.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts +18 -0
- package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/model/translation.d.ts +22 -0
- package/dist/typescript/commonjs/features/chatbot/model/translation.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts +60 -0
- package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts +64 -0
- package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/types/t2s.types.d.ts +22 -0
- package/dist/typescript/commonjs/features/chatbot/types/t2s.types.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/types/translation.types.d.ts +23 -0
- package/dist/typescript/commonjs/features/chatbot/types/translation.types.d.ts.map +1 -0
- package/dist/typescript/commonjs/index.d.ts +4 -0
- package/dist/typescript/commonjs/index.d.ts.map +1 -0
- package/dist/typescript/commonjs/lib/createFeature/createFeature.d.ts +7 -0
- package/dist/typescript/commonjs/lib/createFeature/createFeature.d.ts.map +1 -0
- package/dist/typescript/commonjs/lib/effector/createControllerEffect.d.ts +16 -0
- package/dist/typescript/commonjs/lib/effector/createControllerEffect.d.ts.map +1 -0
- package/dist/typescript/commonjs/lib/effector/createEntityFieldStore.d.ts +16 -0
- package/dist/typescript/commonjs/lib/effector/createEntityFieldStore.d.ts.map +1 -0
- package/dist/typescript/commonjs/lib/effector/index.d.ts +3 -0
- package/dist/typescript/commonjs/lib/effector/index.d.ts.map +1 -0
- package/dist/typescript/commonjs/lib/helpers/helpers.d.ts +2 -0
- package/dist/typescript/commonjs/lib/helpers/helpers.d.ts.map +1 -0
- package/dist/typescript/commonjs/package.json +1 -0
- package/dist/typescript/commonjs/shared/hooks/useDebounce.d.ts +2 -0
- package/dist/typescript/commonjs/shared/hooks/useDebounce.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/icons/ArrowRightIcon.d.ts +4 -0
- package/dist/typescript/commonjs/shared/icons/ArrowRightIcon.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/icons/ChatbotIcon.d.ts +4 -0
- package/dist/typescript/commonjs/shared/icons/ChatbotIcon.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/icons/CloseIcon.d.ts +4 -0
- package/dist/typescript/commonjs/shared/icons/CloseIcon.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/icons/GlobeIcon.d.ts +4 -0
- package/dist/typescript/commonjs/shared/icons/GlobeIcon.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/icons/PauseIcon.d.ts +4 -0
- package/dist/typescript/commonjs/shared/icons/PauseIcon.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/icons/PlayIcon.d.ts +4 -0
- package/dist/typescript/commonjs/shared/icons/PlayIcon.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/icons/SpeakerIcon.d.ts +4 -0
- package/dist/typescript/commonjs/shared/icons/SpeakerIcon.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/icons/icon.types.d.ts +9 -0
- package/dist/typescript/commonjs/shared/icons/icon.types.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/translation/constants.d.ts +6 -0
- package/dist/typescript/commonjs/shared/translation/constants.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/translation/helpers.d.ts +6 -0
- package/dist/typescript/commonjs/shared/translation/helpers.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/translation/hooks.d.ts +5 -0
- package/dist/typescript/commonjs/shared/translation/hooks.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/translation/index.d.ts +6 -0
- package/dist/typescript/commonjs/shared/translation/index.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/translation/model.d.ts +5 -0
- package/dist/typescript/commonjs/shared/translation/model.d.ts.map +1 -0
- package/dist/typescript/commonjs/shared/translation/types.d.ts +8 -0
- package/dist/typescript/commonjs/shared/translation/types.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/Alternatives/Alternatives.d.ts +11 -0
- package/dist/typescript/module/features/chatbot/components/Alternatives/Alternatives.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/Alternatives/HelpRequestOption.d.ts +9 -0
- package/dist/typescript/module/features/chatbot/components/Alternatives/HelpRequestOption.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts +14 -0
- package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/ChatMessage.d.ts +17 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/ChatMessage.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageLoader.d.ts +3 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageLoader.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageTextToSpeech.d.ts +12 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageTextToSpeech.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts +4 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/SentMessage.d.ts +4 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessage/SentMessage.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessages/ChatbotMessages.d.ts +21 -0
- package/dist/typescript/module/features/chatbot/components/ChatMessages/ChatbotMessages.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts +25 -0
- package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.d.ts +9 -0
- package/dist/typescript/module/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/constants.d.ts +21 -0
- package/dist/typescript/module/features/chatbot/constants.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/helpers.d.ts +2 -0
- package/dist/typescript/module/features/chatbot/helpers.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/index.d.ts +5 -0
- package/dist/typescript/module/features/chatbot/index.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/model/api.d.ts +12 -0
- package/dist/typescript/module/features/chatbot/model/api.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/model/model.d.ts +73 -0
- package/dist/typescript/module/features/chatbot/model/model.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/model/t2s.d.ts +18 -0
- package/dist/typescript/module/features/chatbot/model/t2s.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/model/translation.d.ts +22 -0
- package/dist/typescript/module/features/chatbot/model/translation.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/types/api.types.d.ts +60 -0
- package/dist/typescript/module/features/chatbot/types/api.types.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/types/model.types.d.ts +64 -0
- package/dist/typescript/module/features/chatbot/types/model.types.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/types/t2s.types.d.ts +22 -0
- package/dist/typescript/module/features/chatbot/types/t2s.types.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/types/translation.types.d.ts +23 -0
- package/dist/typescript/module/features/chatbot/types/translation.types.d.ts.map +1 -0
- package/dist/typescript/module/index.d.ts +4 -0
- package/dist/typescript/module/index.d.ts.map +1 -0
- package/dist/typescript/module/lib/createFeature/createFeature.d.ts +7 -0
- package/dist/typescript/module/lib/createFeature/createFeature.d.ts.map +1 -0
- package/dist/typescript/module/lib/effector/createControllerEffect.d.ts +16 -0
- package/dist/typescript/module/lib/effector/createControllerEffect.d.ts.map +1 -0
- package/dist/typescript/module/lib/effector/createEntityFieldStore.d.ts +16 -0
- package/dist/typescript/module/lib/effector/createEntityFieldStore.d.ts.map +1 -0
- package/dist/typescript/module/lib/effector/index.d.ts +3 -0
- package/dist/typescript/module/lib/effector/index.d.ts.map +1 -0
- package/dist/typescript/module/lib/helpers/helpers.d.ts +2 -0
- package/dist/typescript/module/lib/helpers/helpers.d.ts.map +1 -0
- package/dist/typescript/module/package.json +1 -0
- package/dist/typescript/module/shared/hooks/useDebounce.d.ts +2 -0
- package/dist/typescript/module/shared/hooks/useDebounce.d.ts.map +1 -0
- package/dist/typescript/module/shared/icons/ArrowRightIcon.d.ts +4 -0
- package/dist/typescript/module/shared/icons/ArrowRightIcon.d.ts.map +1 -0
- package/dist/typescript/module/shared/icons/ChatbotIcon.d.ts +4 -0
- package/dist/typescript/module/shared/icons/ChatbotIcon.d.ts.map +1 -0
- package/dist/typescript/module/shared/icons/CloseIcon.d.ts +4 -0
- package/dist/typescript/module/shared/icons/CloseIcon.d.ts.map +1 -0
- package/dist/typescript/module/shared/icons/GlobeIcon.d.ts +4 -0
- package/dist/typescript/module/shared/icons/GlobeIcon.d.ts.map +1 -0
- package/dist/typescript/module/shared/icons/PauseIcon.d.ts +4 -0
- package/dist/typescript/module/shared/icons/PauseIcon.d.ts.map +1 -0
- package/dist/typescript/module/shared/icons/PlayIcon.d.ts +4 -0
- package/dist/typescript/module/shared/icons/PlayIcon.d.ts.map +1 -0
- package/dist/typescript/module/shared/icons/SpeakerIcon.d.ts +4 -0
- package/dist/typescript/module/shared/icons/SpeakerIcon.d.ts.map +1 -0
- package/dist/typescript/module/shared/icons/icon.types.d.ts +9 -0
- package/dist/typescript/module/shared/icons/icon.types.d.ts.map +1 -0
- package/dist/typescript/module/shared/translation/constants.d.ts +6 -0
- package/dist/typescript/module/shared/translation/constants.d.ts.map +1 -0
- package/dist/typescript/module/shared/translation/helpers.d.ts +6 -0
- package/dist/typescript/module/shared/translation/helpers.d.ts.map +1 -0
- package/dist/typescript/module/shared/translation/hooks.d.ts +5 -0
- package/dist/typescript/module/shared/translation/hooks.d.ts.map +1 -0
- package/dist/typescript/module/shared/translation/index.d.ts +6 -0
- package/dist/typescript/module/shared/translation/index.d.ts.map +1 -0
- package/dist/typescript/module/shared/translation/model.d.ts +5 -0
- package/dist/typescript/module/shared/translation/model.d.ts.map +1 -0
- package/dist/typescript/module/shared/translation/types.d.ts +8 -0
- package/dist/typescript/module/shared/translation/types.d.ts.map +1 -0
- package/package.json +73 -0
- package/src/features/chatbot/components/Alternatives/Alternatives.tsx +64 -0
- package/src/features/chatbot/components/Alternatives/HelpRequestOption.tsx +92 -0
- package/src/features/chatbot/components/ChatControls/ChatControls.tsx +103 -0
- package/src/features/chatbot/components/ChatMessage/ChatMessage.tsx +28 -0
- package/src/features/chatbot/components/ChatMessage/MessageLoader.tsx +42 -0
- package/src/features/chatbot/components/ChatMessage/MessageTextToSpeech.tsx +78 -0
- package/src/features/chatbot/components/ChatMessage/ReceivedMessage.tsx +73 -0
- package/src/features/chatbot/components/ChatMessage/SentMessage.tsx +31 -0
- package/src/features/chatbot/components/ChatMessages/ChatbotMessages.tsx +148 -0
- package/src/features/chatbot/components/Chatbot.tsx +92 -0
- package/src/features/chatbot/components/ThreeDotsLoader/ThreeDotsLoader.tsx +77 -0
- package/src/features/chatbot/constants.ts +30 -0
- package/src/features/chatbot/helpers.ts +4 -0
- package/src/features/chatbot/index.ts +4 -0
- package/src/features/chatbot/model/api.ts +28 -0
- package/src/features/chatbot/model/model.ts +277 -0
- package/src/features/chatbot/model/t2s.ts +107 -0
- package/src/features/chatbot/model/translation.ts +231 -0
- package/src/features/chatbot/types/api.types.ts +59 -0
- package/src/features/chatbot/types/model.types.ts +73 -0
- package/src/features/chatbot/types/t2s.types.ts +24 -0
- package/src/features/chatbot/types/translation.types.ts +23 -0
- package/src/index.ts +3 -0
- package/src/lib/createFeature/createFeature.tsx +21 -0
- package/src/lib/effector/createControllerEffect.ts +66 -0
- package/src/lib/effector/createEntityFieldStore.ts +43 -0
- package/src/lib/effector/index.ts +2 -0
- package/src/lib/helpers/helpers.ts +2 -0
- package/src/lib/localization/en.json +2 -0
- package/src/lib/localization/gb.json +2 -0
- package/src/lib/localization/sw.json +2 -0
- package/src/shared/hooks/useDebounce.ts +17 -0
- package/src/shared/icons/ArrowRightIcon.tsx +14 -0
- package/src/shared/icons/ChatbotIcon.tsx +109 -0
- package/src/shared/icons/CloseIcon.tsx +12 -0
- package/src/shared/icons/GlobeIcon.tsx +14 -0
- package/src/shared/icons/PauseIcon.tsx +16 -0
- package/src/shared/icons/PlayIcon.tsx +16 -0
- package/src/shared/icons/SpeakerIcon.tsx +22 -0
- package/src/shared/icons/icon.types.ts +8 -0
- package/src/shared/translation/constants.ts +10 -0
- package/src/shared/translation/helpers.ts +34 -0
- package/src/shared/translation/hooks.ts +28 -0
- package/src/shared/translation/index.ts +5 -0
- package/src/shared/translation/model.ts +15 -0
- package/src/shared/translation/types.ts +9 -0
- package/src/types/types.d.ts +4 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { createEvent, restore, attach, createEffect, type Effect, sample } from 'effector'
|
|
2
|
+
import { ChatbotModel } from './model'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
TranslateAlternativesFxProps,
|
|
6
|
+
TranslateBatchFxProps,
|
|
7
|
+
TranslateMessageFxProps,
|
|
8
|
+
} from '../types/translation.types'
|
|
9
|
+
import { ConversationMessage } from '../types/model.types'
|
|
10
|
+
import { GetAlternativesResponse } from '../types/api.types'
|
|
11
|
+
import { decodeHTMLEntities } from '../helpers'
|
|
12
|
+
|
|
13
|
+
export class ChatbotTranslation {
|
|
14
|
+
private readonly model: ChatbotModel
|
|
15
|
+
|
|
16
|
+
readonly setIsTranslated = createEvent<boolean>()
|
|
17
|
+
readonly $isTranslated = restore(this.setIsTranslated, false)
|
|
18
|
+
|
|
19
|
+
readonly translateMessageFx: Effect<TranslateMessageFxProps, ConversationMessage>
|
|
20
|
+
readonly translateBatchFx: Effect<TranslateBatchFxProps['params'], ConversationMessage[]>
|
|
21
|
+
readonly translateAlternativesFx: Effect<
|
|
22
|
+
TranslateAlternativesFxProps['params'],
|
|
23
|
+
GetAlternativesResponse | null
|
|
24
|
+
>
|
|
25
|
+
|
|
26
|
+
constructor(chatbotModel: ChatbotModel) {
|
|
27
|
+
this.model = chatbotModel
|
|
28
|
+
|
|
29
|
+
this.translateAlternativesFx = this.createTranslateAlternativesEffect()
|
|
30
|
+
this.translateMessageFx = this.createTranslateMessageEffect()
|
|
31
|
+
this.translateBatchFx = this.createTranslateBatchEffect()
|
|
32
|
+
|
|
33
|
+
this.initTranslationSamples()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private shouldSkipTranslation(messages: ConversationMessage[]) {
|
|
37
|
+
if (this.$isTranslated.getState()) {
|
|
38
|
+
this.setIsTranslated(false)
|
|
39
|
+
return true
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const allTranslated = messages.every(message => message.translatedMessage)
|
|
43
|
+
if (allTranslated) {
|
|
44
|
+
this.setIsTranslated(true)
|
|
45
|
+
return true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return false
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private initTranslationSamples() {
|
|
52
|
+
sample({
|
|
53
|
+
clock: this.translateBatchFx.doneData,
|
|
54
|
+
source: [this.model.credits.$assignmentId, this.model.credits.$exerciseId] as const,
|
|
55
|
+
fn: ([assignmentId, exerciseId], translatedMessages) => ({
|
|
56
|
+
assignmentId,
|
|
57
|
+
exerciseId,
|
|
58
|
+
translatedMessages,
|
|
59
|
+
}),
|
|
60
|
+
}).watch(({ assignmentId, exerciseId, translatedMessages }) => {
|
|
61
|
+
this.model.messages.setField({
|
|
62
|
+
entityId: assignmentId,
|
|
63
|
+
fieldId: exerciseId,
|
|
64
|
+
messages: translatedMessages,
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private createTranslateAlternativesEffect() {
|
|
70
|
+
return attach({
|
|
71
|
+
source: [this.model.$alternatives],
|
|
72
|
+
mapParams: (params: TranslateAlternativesFxProps['params'], [alternatives]) => ({
|
|
73
|
+
params,
|
|
74
|
+
alternatives,
|
|
75
|
+
}),
|
|
76
|
+
effect: createEffect(async ({ alternatives, params }: TranslateAlternativesFxProps) => {
|
|
77
|
+
const hintAlternatives = alternatives?.options.hints ?? []
|
|
78
|
+
const defaultAlternatives = alternatives?.options.default ?? []
|
|
79
|
+
|
|
80
|
+
const translatedAlternatives = { ...alternatives }
|
|
81
|
+
|
|
82
|
+
if (hintAlternatives.length) {
|
|
83
|
+
const hintText = hintAlternatives.map(({ text }) => text)
|
|
84
|
+
const response = await this.model.api.translateTextFx({
|
|
85
|
+
text: hintText,
|
|
86
|
+
targetLanguage: params.targetLanguage,
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
if (translatedAlternatives.options) {
|
|
90
|
+
translatedAlternatives.options.hints = hintAlternatives.map(
|
|
91
|
+
(alternative, index) => ({
|
|
92
|
+
...alternative,
|
|
93
|
+
translatedMessage: decodeHTMLEntities(
|
|
94
|
+
response.data.translations[index].translatedText,
|
|
95
|
+
),
|
|
96
|
+
}),
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (defaultAlternatives.length) {
|
|
102
|
+
const defaultText = defaultAlternatives.map(({ text }) => text)
|
|
103
|
+
const response = await this.model.api.translateTextFx({
|
|
104
|
+
text: defaultText,
|
|
105
|
+
targetLanguage: params.targetLanguage,
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
if (translatedAlternatives.options) {
|
|
109
|
+
translatedAlternatives.options.default = defaultAlternatives.map(
|
|
110
|
+
(alternative, index) => ({
|
|
111
|
+
...alternative,
|
|
112
|
+
translatedText: decodeHTMLEntities(
|
|
113
|
+
response.data.translations[index].translatedText,
|
|
114
|
+
),
|
|
115
|
+
}),
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return translatedAlternatives as GetAlternativesResponse | null
|
|
121
|
+
}),
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private createTranslateMessageEffect() {
|
|
126
|
+
return createEffect(async ({ message, targetLanguage }: TranslateMessageFxProps) => {
|
|
127
|
+
const optionsText = message.options.map(({ text }) => text)
|
|
128
|
+
const response = await this.model.api.translateTextFx({
|
|
129
|
+
text: [message.message, ...optionsText],
|
|
130
|
+
targetLanguage,
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
const translatedOptions = response.data.translations.slice(1)
|
|
134
|
+
const optionsCopy = [...message.options]
|
|
135
|
+
const newOptions = optionsCopy.map((option, index) => ({
|
|
136
|
+
...option,
|
|
137
|
+
translatedText: decodeHTMLEntities(translatedOptions[index].translatedText),
|
|
138
|
+
}))
|
|
139
|
+
|
|
140
|
+
return {
|
|
141
|
+
...message,
|
|
142
|
+
translatedMessage: decodeHTMLEntities(response.data.translations[0].translatedText),
|
|
143
|
+
options: newOptions,
|
|
144
|
+
} as ConversationMessage
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private createTranslateBatchEffect() {
|
|
149
|
+
return attach({
|
|
150
|
+
source: [this.model.credits.$assignmentId, this.model.credits.$exerciseId, this.model.messages.$state],
|
|
151
|
+
mapParams: (
|
|
152
|
+
params: TranslateBatchFxProps['params'],
|
|
153
|
+
[assignmentId, exerciseId, messages],
|
|
154
|
+
) => ({
|
|
155
|
+
params,
|
|
156
|
+
assignmentId,
|
|
157
|
+
exerciseId,
|
|
158
|
+
messages,
|
|
159
|
+
}),
|
|
160
|
+
effect: createEffect(
|
|
161
|
+
async ({ messages, assignmentId, exerciseId, params }: TranslateBatchFxProps) => {
|
|
162
|
+
const currentMessages = messages[assignmentId]?.[exerciseId]?.messages ?? []
|
|
163
|
+
|
|
164
|
+
if (this.shouldSkipTranslation(currentMessages)) {
|
|
165
|
+
return currentMessages
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const messagesText = currentMessages.map(({ message }) => message)
|
|
169
|
+
const response = await this.model.api.translateTextFx({
|
|
170
|
+
text: messagesText,
|
|
171
|
+
targetLanguage: params.targetLanguage,
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
const lastMessage = currentMessages.at(-1)
|
|
175
|
+
const lastMessageTranslatedOptions = lastMessage
|
|
176
|
+
? await this.translateMessageOptions(lastMessage, params.targetLanguage)
|
|
177
|
+
: undefined
|
|
178
|
+
|
|
179
|
+
const errorMessageTranslationResponse = await this.model.api.translateTextFx({
|
|
180
|
+
text: [this.model.defaultMessages.error.message],
|
|
181
|
+
targetLanguage: params.targetLanguage,
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
this.model.defaultMessages.error.translatedMessage = decodeHTMLEntities(
|
|
185
|
+
errorMessageTranslationResponse.data.translations[0].translatedText,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
// TODO: move this AFTER state update in sample and remove initTranslationSamples it is not needed
|
|
189
|
+
// TODO: maybe just one request to translate everything
|
|
190
|
+
this.setIsTranslated(true)
|
|
191
|
+
|
|
192
|
+
const translatedMessages = response.data.translations.map(
|
|
193
|
+
({ translatedText }) => translatedText,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
return currentMessages.map((message, index) => {
|
|
197
|
+
const isLastMessage = index === currentMessages.length - 1
|
|
198
|
+
return {
|
|
199
|
+
...message,
|
|
200
|
+
options: isLastMessage ? lastMessageTranslatedOptions : message.options,
|
|
201
|
+
translatedMessage: decodeHTMLEntities(translatedMessages[index]),
|
|
202
|
+
}
|
|
203
|
+
}) as ConversationMessage[]
|
|
204
|
+
},
|
|
205
|
+
),
|
|
206
|
+
})
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private async translateMessageOptions(message: ConversationMessage, targetLanguage: string) {
|
|
210
|
+
if (!message?.options?.length) {
|
|
211
|
+
const translatedAlternatives = await this.translateAlternativesFx({ targetLanguage })
|
|
212
|
+
this.model.setAlternatives(translatedAlternatives)
|
|
213
|
+
return
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const optionsText = message.options.map(({ text }) => text)
|
|
217
|
+
const response = await this.model.api.translateTextFx({
|
|
218
|
+
text: optionsText,
|
|
219
|
+
targetLanguage,
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
return message.options.map((option, index) => ({
|
|
223
|
+
...option,
|
|
224
|
+
translatedText: decodeHTMLEntities(response.data.translations[index].translatedText),
|
|
225
|
+
}))
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
public reset() {
|
|
229
|
+
this.setIsTranslated(false)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export type ChatAnswer = {
|
|
2
|
+
text: string
|
|
3
|
+
promptKey: string
|
|
4
|
+
translatedText?: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type GetAlternativesResponse = {
|
|
8
|
+
options: {
|
|
9
|
+
default: ChatAnswer[]
|
|
10
|
+
hints: ChatAnswer[]
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type PostMessagePayload = {
|
|
15
|
+
hint: string | null
|
|
16
|
+
language: string
|
|
17
|
+
problem: string
|
|
18
|
+
problemAnswer: string[]
|
|
19
|
+
solutionImages: { canvasDrawing: string | null }
|
|
20
|
+
type: string
|
|
21
|
+
problemId?: string
|
|
22
|
+
answer?: string | string[]
|
|
23
|
+
grade?: string | null
|
|
24
|
+
threadId?: string | null
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type PostMessageResponse = {
|
|
28
|
+
message: string
|
|
29
|
+
threadId: string
|
|
30
|
+
options: ChatAnswer[]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type GoogleTranslatePayload = {
|
|
34
|
+
text: string[]
|
|
35
|
+
targetLanguage: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export type GoogleTranslateResponse = {
|
|
39
|
+
data: {
|
|
40
|
+
translations: { translatedText: string; detectedSourceLanguage: string }[]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type GoogleText2SpeechPayload = {
|
|
45
|
+
input: {
|
|
46
|
+
text: string
|
|
47
|
+
}
|
|
48
|
+
voice: {
|
|
49
|
+
languageCode: string
|
|
50
|
+
name: string
|
|
51
|
+
}
|
|
52
|
+
audioConfig: {
|
|
53
|
+
audioEncoding: string
|
|
54
|
+
pitch: number
|
|
55
|
+
speakingRate: number
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export type GoogleText2SpeechResponse = string | undefined | { audioContent?: string }
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Store } from 'effector'
|
|
2
|
+
import {
|
|
3
|
+
GetAlternativesResponse,
|
|
4
|
+
PostMessagePayload,
|
|
5
|
+
PostMessageResponse,
|
|
6
|
+
GoogleTranslatePayload,
|
|
7
|
+
GoogleTranslateResponse,
|
|
8
|
+
GoogleText2SpeechPayload,
|
|
9
|
+
GoogleText2SpeechResponse,
|
|
10
|
+
ChatAnswer,
|
|
11
|
+
} from './api.types'
|
|
12
|
+
|
|
13
|
+
export type ConversationMessage = {
|
|
14
|
+
id: string
|
|
15
|
+
message: string
|
|
16
|
+
threadId: string
|
|
17
|
+
options: ChatAnswer[]
|
|
18
|
+
isOwnMessage: boolean
|
|
19
|
+
translatedMessage?: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type EntityIds = {
|
|
23
|
+
entityId: string
|
|
24
|
+
fieldId: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type ChatMessagesModel = EntityIds & { messages: ConversationMessage[] }
|
|
28
|
+
export type ThreadIdsModel = EntityIds & { threadId: string }
|
|
29
|
+
export type AvailableChatsModel = EntityIds & { isAvailable: boolean }
|
|
30
|
+
|
|
31
|
+
export type ChatbotModelProps = {
|
|
32
|
+
credits: {
|
|
33
|
+
$assignmentId: Store<string>
|
|
34
|
+
$exerciseId: Store<string>
|
|
35
|
+
},
|
|
36
|
+
api: {
|
|
37
|
+
getAlternatives: (props: void) => Promise<GetAlternativesResponse>
|
|
38
|
+
postMessage: (props: PostMessagePayload) => Promise<PostMessageResponse>
|
|
39
|
+
postTranslateText: (props: GoogleTranslatePayload) => Promise<GoogleTranslateResponse>
|
|
40
|
+
postTextToSpeech: (props: GoogleText2SpeechPayload) => Promise<GoogleText2SpeechResponse>
|
|
41
|
+
}
|
|
42
|
+
messages: {
|
|
43
|
+
error: ConversationMessage,
|
|
44
|
+
start: ConversationMessage
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type SendHelpParams = {
|
|
49
|
+
payload: PostMessagePayload
|
|
50
|
+
message: string
|
|
51
|
+
translationTargetLanguage: string
|
|
52
|
+
translatedMessage?: string
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type SendHelpProps = SendHelpParams & {
|
|
56
|
+
assignmentId: string
|
|
57
|
+
exerciseId: string
|
|
58
|
+
messages: Record<string, Record<string, { messages: ConversationMessage[] }>>
|
|
59
|
+
isTranslated: boolean
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type SetHintMessageProps = EntityIds & ConversationMessage
|
|
63
|
+
|
|
64
|
+
export enum MessageVariant {
|
|
65
|
+
SENT = 'sent',
|
|
66
|
+
RECEIVED = 'received',
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export type ChatbotRenderer = {
|
|
70
|
+
message: string
|
|
71
|
+
variant: MessageVariant
|
|
72
|
+
withTextToSpeech: boolean
|
|
73
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AUDIO_CONFIG, DEFAULT_VOICE } from '../constants'
|
|
2
|
+
|
|
3
|
+
export enum AudioStatus {
|
|
4
|
+
PLAYING = 'playing',
|
|
5
|
+
STOPPED = 'stopped',
|
|
6
|
+
PAUSED = 'paused',
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type AudioProvider = {
|
|
10
|
+
play: (audioPath: string, onPlaybackComplete: () => void) => Promise<void>
|
|
11
|
+
pause: () => void
|
|
12
|
+
resume: () => void
|
|
13
|
+
stop: () => void
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type PlayTextToSpeechProps = {
|
|
17
|
+
text: string
|
|
18
|
+
messageId: string
|
|
19
|
+
isTranslated: boolean
|
|
20
|
+
config?: {
|
|
21
|
+
voice?: typeof DEFAULT_VOICE
|
|
22
|
+
audioConfig?: typeof AUDIO_CONFIG
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ConversationMessage } from './model.types'
|
|
2
|
+
import { GetAlternativesResponse } from './api.types'
|
|
3
|
+
|
|
4
|
+
export type TranslateBatchFxProps = {
|
|
5
|
+
messages: Record<string, Record<string, { messages: ConversationMessage[] }>>
|
|
6
|
+
assignmentId: string
|
|
7
|
+
exerciseId: string
|
|
8
|
+
params: {
|
|
9
|
+
targetLanguage: string
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type TranslateMessageFxProps = {
|
|
14
|
+
message: ConversationMessage
|
|
15
|
+
targetLanguage: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type TranslateAlternativesFxProps = {
|
|
19
|
+
alternatives: GetAlternativesResponse | null
|
|
20
|
+
params: {
|
|
21
|
+
targetLanguage: string
|
|
22
|
+
}
|
|
23
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React, { createContext, PropsWithChildren, useContext } from 'react'
|
|
2
|
+
|
|
3
|
+
export function createFeature<T>() {
|
|
4
|
+
const context = createContext<T | null>(null)
|
|
5
|
+
|
|
6
|
+
type ProviderProps = {
|
|
7
|
+
model: T | null
|
|
8
|
+
} & PropsWithChildren
|
|
9
|
+
|
|
10
|
+
const FeatureProvider = ({ children, model }: ProviderProps) => {
|
|
11
|
+
if (!model) return null
|
|
12
|
+
|
|
13
|
+
return <context.Provider value={model}>{children}</context.Provider>
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const useFeatureModel = () => {
|
|
17
|
+
return useContext(context) as T
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return [FeatureProvider, useFeatureModel, context] as const
|
|
21
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createEffect, type Effect } from 'effector'
|
|
2
|
+
|
|
3
|
+
type LikeCanceledError = {
|
|
4
|
+
code?: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type ControlledEffect<P, T> = Effect<P, T> & {
|
|
8
|
+
controller: AbortController
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type ControlledRequestProps<P> = {
|
|
12
|
+
data: P
|
|
13
|
+
controller?: AbortController
|
|
14
|
+
abortAfter?: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type RequestOptionalConfig = { signal?: AbortSignal }
|
|
18
|
+
|
|
19
|
+
export function controlledRequest<R = void, P = void>(
|
|
20
|
+
request: (props: P, config?: RequestOptionalConfig) => Promise<R>,
|
|
21
|
+
) {
|
|
22
|
+
return async ({
|
|
23
|
+
data,
|
|
24
|
+
controller = new AbortController(),
|
|
25
|
+
abortAfter = 20000,
|
|
26
|
+
}: ControlledRequestProps<P>) => {
|
|
27
|
+
let timeout: ReturnType<typeof setTimeout> | null = null
|
|
28
|
+
|
|
29
|
+
if (abortAfter) {
|
|
30
|
+
timeout = setTimeout(() => {
|
|
31
|
+
controller.abort('timeout')
|
|
32
|
+
}, abortAfter)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const response = await request(data, { signal: controller?.signal })
|
|
37
|
+
if (timeout !== null) clearTimeout(timeout)
|
|
38
|
+
return response
|
|
39
|
+
} catch (error: unknown) {
|
|
40
|
+
if ((error as LikeCanceledError).code === 'ERR_CANCELED') {
|
|
41
|
+
if (controller.signal.reason === 'timeout') {
|
|
42
|
+
throw new Error('Request timed out')
|
|
43
|
+
}
|
|
44
|
+
throw new Error('Request aborted manually')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
throw error
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const createControllerEffect = <T, P>(
|
|
53
|
+
fn: (props: P, config?: RequestOptionalConfig) => Promise<T>,
|
|
54
|
+
) => {
|
|
55
|
+
const request = controlledRequest<T, P>(fn)
|
|
56
|
+
const effect = createEffect((data: P) =>
|
|
57
|
+
request({ data, controller: effect.controller }),
|
|
58
|
+
) as ControlledEffect<P, T>
|
|
59
|
+
effect.controller = new AbortController()
|
|
60
|
+
|
|
61
|
+
effect.fail.watch(() => {
|
|
62
|
+
effect.controller = new AbortController()
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
return effect
|
|
66
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createEvent, createStore } from 'effector'
|
|
2
|
+
|
|
3
|
+
type UpdateField<T> = {
|
|
4
|
+
entityId: string
|
|
5
|
+
fieldId: string
|
|
6
|
+
data: T
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
type CreateEntityFieldStoreSettings<T, U> = {
|
|
10
|
+
mapper?: (value: U) => UpdateField<T>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function createEntityFieldStore<T, U = UpdateField<T>>({
|
|
14
|
+
mapper = (value: any) => value,
|
|
15
|
+
}: CreateEntityFieldStoreSettings<T, U> = {}) {
|
|
16
|
+
const initialState: Record<string, Record<string, T>> = {}
|
|
17
|
+
const fieldAdded = createEvent<UpdateField<T>>()
|
|
18
|
+
const reset = createEvent()
|
|
19
|
+
|
|
20
|
+
const setField = (value: U) => {
|
|
21
|
+
fieldAdded(mapper(value))
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const $state = createStore(initialState)
|
|
25
|
+
.on(fieldAdded, (state, { entityId, fieldId, data }) => {
|
|
26
|
+
if (!fieldId || !entityId) {
|
|
27
|
+
console.error('fieldId or entityId missing in createValuePersistorModel.ts')
|
|
28
|
+
return state
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const newState = { ...state }
|
|
32
|
+
|
|
33
|
+
if (!newState[entityId]) {
|
|
34
|
+
newState[entityId] = {}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
newState[entityId][fieldId] = data
|
|
38
|
+
return newState
|
|
39
|
+
})
|
|
40
|
+
.reset(reset)
|
|
41
|
+
|
|
42
|
+
return { $state, setField, fieldAdded, reset }
|
|
43
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react'
|
|
2
|
+
|
|
3
|
+
export const useDebounce = <T>(value: T, delay?: number): T => {
|
|
4
|
+
const [debouncedValue, setDebouncedValue] = useState(value)
|
|
5
|
+
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const timer = setTimeout(() => {
|
|
8
|
+
setDebouncedValue(value)
|
|
9
|
+
}, delay || 300)
|
|
10
|
+
|
|
11
|
+
return () => {
|
|
12
|
+
clearTimeout(timer)
|
|
13
|
+
}
|
|
14
|
+
}, [value, delay])
|
|
15
|
+
|
|
16
|
+
return debouncedValue
|
|
17
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import Svg, { Path } from 'react-native-svg'
|
|
3
|
+
import { IconProps } from './icon.types'
|
|
4
|
+
|
|
5
|
+
export const ArrowRightIcon = ({ width = 16, height = 16, color = '#33334D' }: IconProps) => (
|
|
6
|
+
<Svg width={width} height={height} viewBox="0 0 16 16" fill="none">
|
|
7
|
+
<Path
|
|
8
|
+
fillRule="evenodd"
|
|
9
|
+
clipRule="evenodd"
|
|
10
|
+
d="M8.91 12.53a.75.75 0 010-1.06l2.72-2.72H2.56a.75.75 0 110-1.5h9.07L8.91 4.53a.75.75 0 011.06-1.06l4 4a.75.75 0 010 1.06l-4 4a.75.75 0 01-1.06 0z"
|
|
11
|
+
fill={color}
|
|
12
|
+
/>
|
|
13
|
+
</Svg>
|
|
14
|
+
)
|