bibot 1.0.5 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. package/.babelrc +7 -0
  2. package/.vscode/settings.json +5 -0
  3. package/dist/bibot.js +175 -0
  4. package/dist/bibot.js.map +1 -0
  5. package/dist/component/bibot.d.ts +5 -0
  6. package/dist/component/bibot.js +170 -0
  7. package/dist/component/bibot.js.map +1 -0
  8. package/dist/config/appStateEnums.js +10 -5
  9. package/dist/config/endpointEnums.js +27 -22
  10. package/dist/config/index.js +38 -5
  11. package/dist/config/statusCode.js +49 -44
  12. package/dist/context/AppContext.js +73 -56
  13. package/dist/context/index.js +16 -3
  14. package/dist/hooks/index.d.ts +1 -0
  15. package/dist/hooks/index.js +38 -4
  16. package/dist/hooks/index.js.map +1 -1
  17. package/dist/hooks/mobileView.js +33 -18
  18. package/dist/hooks/useBiBotChatBot.d.ts +29 -0
  19. package/dist/hooks/useBiBotChatBot.js +206 -0
  20. package/dist/hooks/useBiBotChatBot.js.map +1 -0
  21. package/dist/hooks/usePluginFactory.js +60 -77
  22. package/dist/index.css +36 -0
  23. package/dist/index.d.ts +1 -2
  24. package/dist/index.js +9 -6
  25. package/dist/index.js.map +1 -1
  26. package/dist/reducers/appReducer.js +24 -22
  27. package/dist/reducers/index.js +16 -3
  28. package/dist/services/index.js +16 -3
  29. package/dist/services/plugin-api.js +179 -182
  30. package/dist/styles/RegisterPageStyle.css +63 -0
  31. package/dist/styles/adminPortal.css +26 -0
  32. package/dist/styles/appConfig.css +90 -0
  33. package/dist/styles/buttonStyle.css +27 -0
  34. package/dist/styles/chatStyle.css +140 -0
  35. package/dist/styles/index.css +82 -0
  36. package/dist/styles/predefinedStyle.css +35 -0
  37. package/dist/styles/themeStyle.css +42 -0
  38. package/dist/styles/training.css +86 -0
  39. package/dist/types/coreInterfaces.d.ts +1 -10
  40. package/dist/types/coreInterfaces.js +5 -2
  41. package/dist/types/index.js +16 -3
  42. package/dist/utils/index.js +27 -3
  43. package/dist/utils/sessionManager.js +16 -12
  44. package/dist/utils/trimWhitespace.js +15 -11
  45. package/package.json +51 -54
  46. package/src/component/bibot.tsx +103 -0
  47. package/src/config/appStateEnums.ts +3 -0
  48. package/src/config/endpointEnums.ts +28 -0
  49. package/src/config/index.ts +5 -0
  50. package/src/config/statusCode.ts +49 -0
  51. package/src/context/AppContext.tsx +66 -0
  52. package/src/context/index.ts +3 -0
  53. package/src/hooks/index.ts +5 -0
  54. package/src/hooks/mobileView.tsx +17 -0
  55. package/src/hooks/useBiBotChatBot.tsx +107 -0
  56. package/src/hooks/usePluginFactory.tsx +38 -0
  57. package/src/index.css +36 -0
  58. package/src/index.tsx +3 -0
  59. package/src/reducers/appReducer.ts +16 -0
  60. package/src/reducers/index.ts +4 -0
  61. package/src/services/index.ts +2 -0
  62. package/src/services/plugin-api.tsx +120 -0
  63. package/src/styles/RegisterPageStyle.css +63 -0
  64. package/src/styles/adminPortal.css +26 -0
  65. package/src/styles/appConfig.css +90 -0
  66. package/src/styles/buttonStyle.css +27 -0
  67. package/src/styles/chatStyle.css +140 -0
  68. package/src/styles/index.css +82 -0
  69. package/src/styles/predefinedStyle.css +35 -0
  70. package/src/styles/themeStyle.css +42 -0
  71. package/src/styles/training.css +86 -0
  72. package/src/types/coreInterfaces.ts +69 -0
  73. package/src/types/index.ts +4 -0
  74. package/src/utils/index.ts +2 -0
  75. package/src/utils/sessionManager.tsx +15 -0
  76. package/src/utils/trimWhitespace.ts +11 -0
  77. package/tsconfig.json +25 -0
  78. package/webpack.config.js +19 -0
  79. package/dist/components/bibot.js +0 -171
  80. package/dist/components/bibot.js.map +0 -1
  81. /package/dist/{components/bibot.d.ts → bibot.d.ts} +0 -0
@@ -0,0 +1,103 @@
1
+ import { Avatar, Indicator } from '@mantine/core'
2
+ import { Close, SendRounded } from '@mui/icons-material'
3
+ import ChatIcon from '@mui/icons-material/Chat'
4
+ import { Button } from 'antd'
5
+ import { useBiBotChatBot } from '../hooks'
6
+ import { AppProvider } from '../context/AppContext'
7
+ interface bubbleProps {
8
+ clientId: string
9
+ }
10
+
11
+ interface PredefinedQuestionsProps {
12
+ onSelect: (question: string) => void
13
+ questions: string[]
14
+ }
15
+
16
+ const PredefinedQuestions = ({ questions, onSelect }: PredefinedQuestionsProps) => {
17
+ return (
18
+ <div className="predefined-questions">
19
+ {questions.map((question, index) => (
20
+ <div key={index} className="predefined-question" onClick={() => onSelect(question)}>
21
+ {question}
22
+ </div>
23
+ ))}
24
+ </div>
25
+ );
26
+ };
27
+
28
+ const BiBot = ({ clientId }: bubbleProps) => {
29
+ const {
30
+ chatIsOpen,
31
+ messages,
32
+ isLoading,
33
+ messageEndRef,
34
+ userInput,
35
+ handleUserInput,
36
+ handleKeyPress,
37
+ sendInputInquiry,
38
+ toggleChat,
39
+ chatBubbleConfig,
40
+ showPredefinedQuestions,
41
+ predefinedQuestions,
42
+ handlePredefinedQuestionSelect,
43
+ } = useBiBotChatBot({clientId})
44
+
45
+ return (
46
+ <AppProvider>
47
+ <div className={`chat-bubble ${chatIsOpen ? 'open' : ''}`}>
48
+ {chatIsOpen && (
49
+ <div className="chat-window" style={{ backgroundColor: chatBubbleConfig?.bgColor }}>
50
+ <div className="chat-header" style={{ backgroundColor: chatBubbleConfig?.color ?? '#dedede' }}>
51
+ <div style={{ alignItems: 'center', display: 'flex', color: '#fff', fontWeight: 'bold' }}>
52
+ <Indicator inline size={12} offset={7} position="bottom-end" color={ 'green' }>
53
+ <Avatar color="white" src={chatBubbleConfig?.logo_url} alt="profile" />
54
+ </Indicator>
55
+ </div>
56
+ <div style={{ display: 'flex', flexDirection: 'column', textAlign: 'left', paddingLeft: '10px', justifyContent: 'flex-start', color: '#fff' }}>
57
+ <span style={{ fontWeight: 'bold' }}>{chatBubbleConfig?.title}</span>
58
+ {}
59
+ {isLoading ? <span style={{ fontSize: '12px', lineHeight: '0.5' }}>Typing...</span> : <span style={{ fontSize: '12px', lineHeight: '0.5' }}>{'Online'}</span>}
60
+ </div>
61
+ </div>
62
+ <div className="message-list">
63
+ {messages.map((message: { sender: 'user' | 'bot', text: string }, index: number) => (
64
+ message.sender === 'user'
65
+ ? <div key={index} className={`message ${message.sender}`}>
66
+ {message.text}
67
+ </div>
68
+ : <div key={index} style={{ display: 'flex' }}>
69
+ <Avatar color="white" src={chatBubbleConfig?.logo_url} size={25} alt="profile" />
70
+ <div className={`message ${message.sender}`}>
71
+ {message.text}
72
+ </div>
73
+ </div>
74
+ ))}
75
+ {showPredefinedQuestions && predefinedQuestions && predefinedQuestions.length > 0 && (
76
+ <PredefinedQuestions questions={predefinedQuestions} onSelect={handlePredefinedQuestionSelect} />
77
+ )}
78
+ {isLoading && <div style={{marginLeft: '20px'}} className='message'> <div className="loader"></div> </div> }
79
+ <div ref={messageEndRef} />
80
+ </div>
81
+ <div className="input-area">
82
+ <input
83
+ autoFocus={true}
84
+ type="text"
85
+ value={userInput}
86
+ onChange={handleUserInput}
87
+ onKeyPress={handleKeyPress}
88
+ placeholder="Ask a question"
89
+ />
90
+ <Button disabled={isLoading ?? true} style={{ backgroundColor: 'transparent', color: isLoading ? '#dedede' : chatBubbleConfig?.color }} size='middle' icon={<SendRounded />} onClick={sendInputInquiry}/>
91
+ </div>
92
+ </div>
93
+ )}
94
+ <Button type='link' onClick={toggleChat} className="chat-toggle" style={{ backgroundColor: chatBubbleConfig?.color ?? '#dedede' }}>
95
+ {chatIsOpen ? <Close style={{ width: 30, height: 30, color: '#fff' }} /> : <ChatIcon style={{ width: 30, height: 30, color: '#fff' }}/>}
96
+ </Button>
97
+ </div>
98
+ </AppProvider>
99
+
100
+ )
101
+ }
102
+
103
+ export default BiBot
@@ -0,0 +1,3 @@
1
+ export enum appStateEnums {
2
+ BIBOT = 'BIBOT'
3
+ }
@@ -0,0 +1,28 @@
1
+
2
+ export const APP_DATA = {
3
+ APP_NAME: 'Bibot'
4
+ }
5
+
6
+ const baseUrls = {
7
+ inference: 'https://inference.dev.bibot.thespuka.com/v0',
8
+ }
9
+
10
+ export const endpoints = {
11
+ get inference () {
12
+ return baseUrls.inference
13
+ },
14
+ } as const
15
+
16
+ export enum domain {
17
+ app = '/app',
18
+ bibot = '/bibot',
19
+ inference = '/inference',
20
+ }
21
+
22
+ export enum resources {
23
+ chatBubble = '/chat-bubble-config',
24
+ predefinedQ = '/predefined-q',
25
+ localQ = '/local-q',
26
+ timedOutLocalQ = '/t-local-q',
27
+ q = '/q'
28
+ }
@@ -0,0 +1,5 @@
1
+ // created from 'create-ts-index'
2
+ export * from './appStateEnums'
3
+ export * from './endpointEnums'
4
+ export * from './statusCode'
5
+
@@ -0,0 +1,49 @@
1
+ export enum statusCode {
2
+ ok = 200
3
+ , created = 201
4
+ , accepted = 202
5
+
6
+ // 3xx codes
7
+ , unmodified = 304
8
+
9
+ // 4xx Client Error
10
+ , sucMsg = 'success'
11
+ , badReq = 400
12
+ , unauthorized = 401
13
+ , paymentReq = 402
14
+ , forbidden = 403
15
+ , notFound = 404
16
+ , methodNotAllowed = 405
17
+ , notAcceptable = 406
18
+ , pxyAuthReq = 407
19
+ , reqTimeOut = 408
20
+ , conflict = 409
21
+ , gone = 410
22
+ , lengthReq = 411
23
+ , preConFailed = 412
24
+ , payloadTooLarge = 413
25
+ , urlTooLong = 414
26
+ , unsupportedMediaType = 415
27
+ , rangeNotSatisfiable = 416
28
+ , expectationFailed = 417
29
+
30
+ , misdirectedReq = 421
31
+ , unprocessableEntity = 422
32
+ , locked = 423
33
+ , failedDependency = 424
34
+ , tooLarge = 425
35
+ , upgradeRequired = 426
36
+ , preconReq = 428
37
+ , tooManyReq = 429
38
+ , reqHeaderTooLarge = 431
39
+ , unavailableForLegalReasons = 451
40
+
41
+ // 5xx Server Error
42
+ , internalServerError = 500
43
+ , notImplemented = 501
44
+ , badGateway = 502
45
+ , svcUnavalable = 503
46
+ , gtwayTimeout = 504
47
+ , httpVNotSupported = 505
48
+ , networkAuthReq = 511
49
+ }
@@ -0,0 +1,66 @@
1
+ import { appStateEnums } from '../config/appStateEnums'
2
+ import React, { type ReactNode, createContext, useReducer, useEffect } from 'react'
3
+ import { appReducer } from '../reducers/appReducer'
4
+ import type { AppContextProps, AppStates } from '../types/coreInterfaces'
5
+ import { getSessionId } from '../utils/sessionManager'
6
+
7
+ interface AppProps {
8
+ children: ReactNode
9
+ }
10
+
11
+ const dummyDispatch = () => {} // A no-op function.
12
+
13
+ const defaultContextValue: AppContextProps = {
14
+ state: {
15
+ chatIsOpen: false,
16
+ sessionId: getSessionId()
17
+ },
18
+ dispatch: dummyDispatch
19
+ }
20
+
21
+ const AppContext = createContext<AppContextProps>(defaultContextValue)
22
+
23
+ const AppProvider: React.FC<AppProps> = ({ children }) => {
24
+ const APP_STATE_KEY = 'app_states'
25
+ const initialState: AppStates = {
26
+ chatIsOpen: false,
27
+ sessionId: getSessionId()
28
+ }
29
+
30
+ const [state, dispatch] = useReducer(appReducer, initialState)
31
+
32
+ useEffect(() => {
33
+ // Pool the initial states from local storage
34
+ const storedStates = localStorage.getItem(APP_STATE_KEY)
35
+
36
+ if (storedStates) {
37
+ try {
38
+ const parsedStates = JSON.parse(storedStates)
39
+
40
+ // Merge stored states with initial states
41
+ const updatedStates = {
42
+ ...initialState,
43
+ ...parsedStates
44
+ }
45
+ console.log(initialState, parsedStates, updatedStates)
46
+ // Dispatch action to update the states
47
+ dispatch({ type: appStateEnums.BIBOT, ...updatedStates })
48
+ } catch (error) {
49
+ console.error('Failed to parse app states from local storage:', error)
50
+ }
51
+ }
52
+ }, [])
53
+
54
+ useEffect(() => {
55
+ console.log('Changes in state: ', state)
56
+ localStorage.setItem(APP_STATE_KEY, JSON.stringify(state))
57
+ }, [state])
58
+
59
+ return (
60
+ <AppContext.Provider value={{ state, dispatch }}>
61
+ {children}
62
+ </AppContext.Provider>
63
+ )
64
+ }
65
+
66
+ export { AppContext, AppProvider }
@@ -0,0 +1,3 @@
1
+ // created from 'create-ts-index'
2
+
3
+ export * from './AppContext'
@@ -0,0 +1,5 @@
1
+ // created from 'create-ts-index'
2
+
3
+ export * from './usePluginFactory'
4
+ export * from './useBiBotChatBot'
5
+ export * from './mobileView'
@@ -0,0 +1,17 @@
1
+ import React, { useState, useEffect } from 'react'
2
+ export default function MobileView () {
3
+ const [isMobile, setIsMobile] = useState<boolean>(false)
4
+ useEffect(() => {
5
+ const isMobileDevice = () => {
6
+ const screenWidth = window.innerWidth
7
+ const mobileThreshold = 768
8
+ setIsMobile(screenWidth < mobileThreshold)
9
+ }
10
+ isMobileDevice()
11
+ window.addEventListener('resize', isMobileDevice)
12
+ return () => { // clean up event listner on when component unmount
13
+ window.removeEventListener('resize', isMobileDevice)
14
+ }
15
+ }, [])
16
+ return isMobile
17
+ }
@@ -0,0 +1,107 @@
1
+ import { message } from 'antd'
2
+ import { appStateEnums } from '../config/appStateEnums'
3
+ import React, { useEffect, useRef, useState, useContext, useCallback } from 'react'
4
+ import { AppContext } from '../context/AppContext'
5
+
6
+ import { v4 as uuidv4 } from 'uuid'
7
+ import { askBiBot, getRemoteClientChatBubbleConfig, getRemoteClientChatPredefinedQuestions } from '../services/plugin-api'
8
+ interface UseBiBotChatBotProps {
9
+ clientId: string
10
+ }
11
+
12
+ interface ChatBubbleConfigProps {
13
+ bgColor?: string,
14
+ color?: string,
15
+ title?: string,
16
+ logo_url?: string
17
+ }
18
+ const useBiBotChatBot = ({ clientId }: UseBiBotChatBotProps) => {
19
+ const [predefinedQuestions, setPredefinedQuestions] = useState<string[]>([]) // State to store predefined questions
20
+ const [showPredefinedQuestions, setShowPredefinedQuestions] = useState(true); // State to toggle predefined questions
21
+ const { state, dispatch } = useContext(AppContext)
22
+ const { chatIsOpen } = state
23
+ const [messages, setMessages] = useState<Array<{ sender: 'user' | 'bot', text: string }>>([])
24
+ const [userInput, setUserInput] = useState('')
25
+ const [isLoading, setIsLoading] = useState(false)
26
+ const messageEndRef = useRef<HTMLDivElement>(null)
27
+ const [chatBubbleConfig, setChatBubbleConfig] = useState<ChatBubbleConfigProps>()
28
+
29
+ // Function to handle selecting a predefined question
30
+ const handlePredefinedQuestionSelect = (question: any) => {
31
+ setUserInput(question);
32
+ sendInputInquiry();
33
+ setShowPredefinedQuestions(false); // Hide predefined questions after selection
34
+ }
35
+
36
+ const getChatBubbleConfig = useCallback(async()=>{
37
+ const remotePredefinedQuestions = await getRemoteClientChatPredefinedQuestions({client_id: clientId})
38
+ if (remotePredefinedQuestions){
39
+ setPredefinedQuestions(remotePredefinedQuestions)
40
+ }
41
+ const remoteChatBubbleConfig = await getRemoteClientChatBubbleConfig({client_id: clientId})
42
+ if (remoteChatBubbleConfig){
43
+ setChatBubbleConfig(remoteChatBubbleConfig)
44
+ }
45
+ },[clientId])
46
+
47
+ useEffect(()=>{
48
+ void getChatBubbleConfig()
49
+ }, [getChatBubbleConfig])
50
+
51
+ useEffect(() => {
52
+ if (messageEndRef?.current) { messageEndRef.current.scrollIntoView({ behavior: 'smooth' }) }
53
+ }, [messages])
54
+
55
+ const toggleChat = () => {
56
+ dispatch({ type: appStateEnums.BIBOT, chatIsOpen: !chatIsOpen })
57
+ }
58
+
59
+ const handleUserInput = (e: React.ChangeEvent<HTMLInputElement>) => {
60
+ setUserInput(e.target.value)
61
+ }
62
+
63
+ async function sendInputInquiry () {
64
+ setIsLoading(true)
65
+ setUserInput('')
66
+ try {
67
+ if (userInput.trim()) {
68
+ // dispatch({ type: appStateEnums.BIBOT, chatIsOpen: true })
69
+ setMessages(messages => [...messages, { sender: 'user', text: userInput }])
70
+ const response = await askBiBot({
71
+ client_id: clientId,
72
+ q: userInput.trim(),
73
+ session_id: state.sessionId,
74
+ chat_id: uuidv4()
75
+ })
76
+ setMessages(messages => [...messages, { sender: 'bot', text: response }])
77
+ }
78
+ } catch (error: any) {
79
+ void message.error(error?.message ?? 'Failed to get response from server')
80
+ } finally {
81
+ setIsLoading(false)
82
+ }
83
+ }
84
+
85
+ const handleKeyPress = async (e: React.KeyboardEvent<HTMLInputElement>) => {
86
+ if (e.key === 'Enter' && !isLoading) {
87
+ await sendInputInquiry()
88
+ }
89
+ }
90
+ return {
91
+ chatIsOpen,
92
+ messages,
93
+ isLoading,
94
+ messageEndRef,
95
+ userInput,
96
+ handleUserInput,
97
+ handleKeyPress,
98
+ toggleChat,
99
+ sendInputInquiry,
100
+ chatBubbleConfig,
101
+ showPredefinedQuestions,
102
+ predefinedQuestions,
103
+ handlePredefinedQuestionSelect,
104
+ }
105
+ }
106
+
107
+ export { useBiBotChatBot }
@@ -0,0 +1,38 @@
1
+ import axios from 'axios';
2
+ import { endpoints } from '../config/endpointEnums';
3
+ import React from 'react';
4
+ const inferenceBaseURL = endpoints.inference;
5
+
6
+ export const createPluginAxiosInstance = (params = {}, headers = {}) => {
7
+ const instance = axios.create({
8
+ baseURL: inferenceBaseURL,
9
+ timeout: 60000, // 1 minute
10
+ headers: {
11
+ 'Content-Type': 'application/json',
12
+ ...headers
13
+ },
14
+ ...params
15
+ });
16
+
17
+
18
+ instance.interceptors.response.use(
19
+ (response) => {
20
+ return response
21
+ },
22
+ async (error) => {
23
+ let errMsg = 'An unknown error occurred'
24
+ if (error.response) {
25
+ errMsg = error.response.data.message
26
+ } else if (error.request) {
27
+ errMsg = 'No response received from the server.'
28
+ } else {
29
+ errMsg = `Error setting up the request: ${error.message}`
30
+ }
31
+ return await Promise.reject(new Error(errMsg))
32
+ }
33
+ )
34
+
35
+ return instance
36
+ }
37
+
38
+
package/src/index.css ADDED
@@ -0,0 +1,36 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5
+ sans-serif;
6
+ -webkit-font-smoothing: antialiased;
7
+ -moz-osx-font-smoothing: grayscale;
8
+ }
9
+
10
+
11
+ *{
12
+ margin: 0;
13
+ padding: 0;
14
+ box-sizing: border-box;
15
+ }
16
+ code {
17
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
18
+ monospace;
19
+ }
20
+
21
+ .upload-component {
22
+ .drop-area {
23
+ border: 2px dashed #ccc;
24
+ border-radius: 5px;
25
+ padding: 20px;
26
+ text-align: center;
27
+ cursor: pointer;
28
+ &:hover, &:focus {
29
+ border-color: #007bff;
30
+ }
31
+ }
32
+
33
+ .uploading { background-color: #fff3cd; }
34
+ .completed { background-color: #d4edda; }
35
+ .error { background-color: #f8d7da; }
36
+ }
package/src/index.tsx ADDED
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import BiBot from './component/bibot';
3
+ export default BiBot;
@@ -0,0 +1,16 @@
1
+ import { appStateEnums } from '../config/appStateEnums'
2
+ import type { AppStates, AppAction } from 'types'
3
+ import React from 'react';
4
+
5
+ export const appReducer = (state: AppStates, action: AppAction): AppStates => {
6
+ console.log('This is the appReducer state', state, action)
7
+ switch (action.type) {
8
+ case appStateEnums.BIBOT:
9
+ return {
10
+ ...state,
11
+ chatIsOpen: action.chatIsOpen
12
+ }
13
+ default:
14
+ return state
15
+ }
16
+ }
@@ -0,0 +1,4 @@
1
+ // created from 'create-ts-index'
2
+
3
+ export * from './appReducer'
4
+
@@ -0,0 +1,2 @@
1
+ // export * from './bibot'
2
+ export * from './plugin-api'
@@ -0,0 +1,120 @@
1
+ import { domain, resources } from '../config/endpointEnums'
2
+ import React from 'react';
3
+ // import { createPluginAxiosInstance } from '../hooks/usePluginFactory'
4
+
5
+ // const pluginAxiosInstance=createPluginAxiosInstance()
6
+
7
+ interface Q_DATA_TYPE {
8
+ client_id: string
9
+ q: string
10
+ endSession?: boolean
11
+ session_id: string
12
+ chat_id: string
13
+ tries?: number
14
+ }
15
+
16
+ interface RemoteChatBubbleConfigProps {
17
+ bgColor: string,
18
+ chatColor: string,
19
+ title: string,
20
+ userImage: string
21
+ }
22
+
23
+ async function askTimedOutBiBot(data: Q_DATA_TYPE): Promise<string> {
24
+ try {
25
+ return 'Hello'
26
+ // const path=`${domain.bibot}${resources.timedOutLocalQ}`
27
+ // const response=await pluginAxiosInstance.post<any>(path, data)
28
+ // console.log(response)
29
+ // return response.data.message
30
+ } catch (error: any) {
31
+ console.log(error.message)
32
+ return error.message
33
+ }
34
+ }
35
+
36
+ async function askBiBot(data: Q_DATA_TYPE): Promise<string> {
37
+ try {
38
+ // const path=`${domain.inference}${resources.q}`
39
+ // const response=await pluginAxiosInstance.post<any>(path, data)
40
+ // console.log(response)
41
+ // return response.data.message
42
+ return 'Hello'
43
+ } catch (error1: any) {
44
+ console.log(error1.message)
45
+ if (error1.code==='ECONNABORTED'||error1.message.includes('Endpoint request timed out')) {
46
+ try {
47
+ return await askTimedOutBiBot({
48
+ ...data,
49
+ tries: 2
50
+ })
51
+ } catch (error2: any) {
52
+ if (error2.code==='ECONNABORTED'||error2.message.includes('Endpoint request timed out')) {
53
+ try {
54
+ return await askTimedOutBiBot({
55
+ ...data,
56
+ tries: 3
57
+ })
58
+ } catch (error3: any) {
59
+ return error3.message
60
+ }
61
+ } else {
62
+ return error2.message
63
+ }
64
+ }
65
+ } else {
66
+ return error1.message
67
+ }
68
+ }
69
+ }
70
+ // TODO: Emmanuel fix the default returned values, especially the userImage to a default robot image
71
+ async function getRemoteClientChatBubbleConfig(params: { client_id: string }): Promise<RemoteChatBubbleConfigProps> {
72
+ try {
73
+ return {
74
+ bgColor: 'white',
75
+ chatColor: 'blue',
76
+ title: 'ChatBot',
77
+ userImage: 'string'
78
+ }
79
+ // const path=`${domain.inference}${resources.chatBubble}`
80
+ // const response=await pluginAxiosInstance.get<any>(path, { params })
81
+ // return response.data
82
+ } catch (error: any) {
83
+ return {
84
+ bgColor: 'white',
85
+ chatColor: 'blue',
86
+ title: 'ChatBot',
87
+ userImage: 'string'
88
+ }
89
+ }
90
+ }
91
+
92
+ async function getRemoteClientChatPredefinedQuestions(params: { client_id: string }): Promise<string[]> {
93
+ try {
94
+ return ['Hello']
95
+ // const path=`${domain.inference}${resources.predefinedQ}`
96
+ // const response=await pluginAxiosInstance.get<any>(path, { params })
97
+ // return response.data.predefined_messages
98
+ } catch (error: any) {
99
+ return ['These are placeholders', 'They will be removed in production', 'This will be empty if there are no predefined questions', 'So hide if there are no predefined questions']
100
+ }
101
+ }
102
+
103
+ async function GetPredefinedQuestion (){
104
+ const clientId = '6c74b4bb-0395-4751-a55f-7d065d67c56b'
105
+ try {
106
+ return [{question: "q", answer: "a"}]
107
+ // const path = `${domain.inference}${resources.predefinedQ}?client_id=${clientId}`
108
+ // const response = await pluginAxiosInstance.get(path)
109
+ // return response.data
110
+ } catch (error) {
111
+ console.error('Error fetching subscription:', error)
112
+ }
113
+ }
114
+
115
+ export {
116
+ askBiBot,
117
+ getRemoteClientChatBubbleConfig,
118
+ getRemoteClientChatPredefinedQuestions,
119
+ GetPredefinedQuestion
120
+ }
@@ -0,0 +1,63 @@
1
+
2
+ .amplify-button--primary {
3
+ background-color: #0fa781;
4
+ }
5
+
6
+ .preAuditLogo-on-registerPage{
7
+ max-height: 50px;
8
+ margin-bottom: 20px;
9
+ }
10
+ .amplify-tabs-item[data-state=active] {
11
+ color: #fff;
12
+ border-color: #0fa781;
13
+ }
14
+ .amplify-tabs-item[data-state=active]:hover {
15
+ color: #fff;
16
+ }
17
+
18
+ .amplify-tabs-item:hover {
19
+ color: #00152a;
20
+ }
21
+
22
+ [data-amplify-authenticator] [data-amplify-router] {
23
+ background-color: #ffffff;
24
+ border-color: #b9eee1;
25
+ }
26
+ .amplify-tabs-item[data-spacing=equal]{
27
+
28
+ }
29
+ .amplify-button--link {
30
+ color: #00152a;
31
+ }
32
+ .amplify-button--link:hover {
33
+ color: #00152a;
34
+ background-color: #fff;
35
+ }
36
+
37
+ .amplify-input, .amplify-input:focus {
38
+ border-color: #bed7f0;
39
+ border: 1px solid;
40
+ }
41
+ .fieldContainer{
42
+ display: flex;
43
+ justify-content: space-between;
44
+ flex-direction: row;
45
+ }
46
+ select, .amplify-field-group__outer-end .amplify-field-group__control, .amplify-field-group__outer-start .amplify-select__wrapper:not(:first-child) .amplify-select:not(:first-child), .amplify-field-group__outer-start--quiet .amplify-field-group__control, .amplify-field-group__outer-start .amplify-field-group__control:not(:first-child), .amplify-field-group :not(:first-child) .amplify-input {
47
+ border-color: #c9ebe2;
48
+ }
49
+ .amplify-input{
50
+ border-color: #c9ebe2;
51
+ }
52
+
53
+ .amplify-checkbox__icon {
54
+ background-color: #c9ebe2;
55
+ border-color: #c9ebe2;
56
+ }
57
+ .input-select-field{
58
+ border-color: #0fa781;
59
+ }
60
+ .amplify-select{
61
+ border-color: #c9ebe2 !important;
62
+
63
+ }