bibot 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. package/.babelrc +7 -0
  2. package/.vscode/settings.json +5 -0
  3. package/README.md +46 -0
  4. package/dist/bibot.d.ts +5 -0
  5. package/dist/bibot.js +173 -0
  6. package/dist/bibot.js.map +1 -0
  7. package/dist/config/appStateEnums.d.ts +3 -0
  8. package/dist/config/appStateEnums.js +10 -0
  9. package/dist/config/appStateEnums.js.map +1 -0
  10. package/dist/config/endpointEnums.d.ts +18 -0
  11. package/dist/config/endpointEnums.js +31 -0
  12. package/dist/config/endpointEnums.js.map +1 -0
  13. package/dist/config/index.d.ts +3 -0
  14. package/dist/config/index.js +38 -0
  15. package/dist/config/index.js.map +1 -0
  16. package/dist/config/statusCode.d.ts +42 -0
  17. package/dist/config/statusCode.js +49 -0
  18. package/dist/config/statusCode.js.map +1 -0
  19. package/dist/context/AppContext.d.ts +8 -0
  20. package/dist/context/AppContext.js +75 -0
  21. package/dist/context/AppContext.js.map +1 -0
  22. package/dist/context/index.d.ts +1 -0
  23. package/dist/context/index.js +16 -0
  24. package/dist/context/index.js.map +1 -0
  25. package/dist/hooks/index.d.ts +3 -0
  26. package/dist/hooks/index.js +38 -0
  27. package/dist/hooks/index.js.map +1 -0
  28. package/dist/hooks/mobileView.d.ts +1 -0
  29. package/dist/hooks/mobileView.js +33 -0
  30. package/dist/hooks/mobileView.js.map +1 -0
  31. package/dist/hooks/useBiBotChatBot.d.ts +29 -0
  32. package/dist/hooks/useBiBotChatBot.js +206 -0
  33. package/dist/hooks/useBiBotChatBot.js.map +1 -0
  34. package/dist/hooks/usePluginFactory.d.ts +1 -0
  35. package/dist/hooks/usePluginFactory.js +62 -0
  36. package/dist/hooks/usePluginFactory.js.map +1 -0
  37. package/dist/index.css +36 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +9 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/reducers/appReducer.d.ts +2 -0
  42. package/dist/reducers/appReducer.js +24 -0
  43. package/dist/reducers/appReducer.js.map +1 -0
  44. package/dist/reducers/index.d.ts +1 -0
  45. package/dist/reducers/index.js +16 -0
  46. package/dist/reducers/index.js.map +1 -0
  47. package/dist/services/index.d.ts +1 -0
  48. package/dist/services/index.js +16 -0
  49. package/dist/services/index.js.map +1 -0
  50. package/dist/services/plugin-api.d.ts +26 -0
  51. package/dist/services/plugin-api.js +185 -0
  52. package/dist/services/plugin-api.js.map +1 -0
  53. package/dist/styles/RegisterPageStyle.css +63 -0
  54. package/dist/styles/adminPortal.css +26 -0
  55. package/dist/styles/appConfig.css +90 -0
  56. package/dist/styles/buttonStyle.css +27 -0
  57. package/dist/styles/chatStyle.css +140 -0
  58. package/dist/styles/index.css +82 -0
  59. package/dist/styles/predefinedStyle.css +35 -0
  60. package/dist/styles/themeStyle.css +42 -0
  61. package/dist/styles/training.css +86 -0
  62. package/dist/types/coreInterfaces.d.ts +51 -0
  63. package/dist/types/coreInterfaces.js +5 -0
  64. package/dist/types/coreInterfaces.js.map +1 -0
  65. package/dist/types/index.d.ts +1 -0
  66. package/dist/types/index.js +16 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/utils/index.d.ts +2 -0
  69. package/dist/utils/index.js +27 -0
  70. package/dist/utils/index.js.map +1 -0
  71. package/dist/utils/sessionManager.d.ts +2 -0
  72. package/dist/utils/sessionManager.js +17 -0
  73. package/dist/utils/sessionManager.js.map +1 -0
  74. package/dist/utils/trimWhitespace.d.ts +2 -0
  75. package/dist/utils/trimWhitespace.js +15 -0
  76. package/dist/utils/trimWhitespace.js.map +1 -0
  77. package/example/README.md +46 -0
  78. package/example/package-lock.json +18173 -0
  79. package/example/package.json +47 -0
  80. package/example/public/favicon.ico +0 -0
  81. package/example/public/index.html +43 -0
  82. package/example/public/logo192.png +0 -0
  83. package/example/public/logo512.png +0 -0
  84. package/example/public/manifest.json +25 -0
  85. package/example/public/robots.txt +3 -0
  86. package/example/src/App.css +38 -0
  87. package/example/src/App.test.tsx +9 -0
  88. package/example/src/App.tsx +28 -0
  89. package/example/src/index.css +13 -0
  90. package/example/src/index.tsx +13 -0
  91. package/example/src/logo.svg +1 -0
  92. package/example/src/react-app-env.d.ts +1 -0
  93. package/example/tsconfig.json +26 -0
  94. package/package.json +30 -8
  95. package/src/bibot.tsx +111 -0
  96. package/src/config/appStateEnums.ts +3 -0
  97. package/src/config/endpointEnums.ts +28 -0
  98. package/src/config/index.ts +5 -0
  99. package/src/config/statusCode.ts +49 -0
  100. package/src/context/AppContext.tsx +66 -0
  101. package/src/context/index.ts +3 -0
  102. package/src/hooks/index.ts +5 -0
  103. package/src/hooks/mobileView.tsx +17 -0
  104. package/src/hooks/useBiBotChatBot.tsx +107 -0
  105. package/src/hooks/usePluginFactory.tsx +38 -0
  106. package/src/index.css +36 -0
  107. package/src/index.tsx +3 -11
  108. package/src/reducers/appReducer.ts +16 -0
  109. package/src/reducers/index.ts +4 -0
  110. package/src/services/index.ts +2 -0
  111. package/src/services/plugin-api.tsx +120 -0
  112. package/src/styles/RegisterPageStyle.css +63 -0
  113. package/src/styles/adminPortal.css +26 -0
  114. package/src/styles/appConfig.css +90 -0
  115. package/src/styles/buttonStyle.css +27 -0
  116. package/src/styles/chatStyle.css +140 -0
  117. package/src/styles/index.css +82 -0
  118. package/src/styles/predefinedStyle.css +35 -0
  119. package/src/styles/themeStyle.css +42 -0
  120. package/src/styles/training.css +86 -0
  121. package/src/types/coreInterfaces.ts +69 -0
  122. package/src/types/index.ts +4 -0
  123. package/src/utils/index.ts +2 -0
  124. package/src/utils/sessionManager.tsx +15 -0
  125. package/src/utils/trimWhitespace.ts +11 -0
  126. package/tsconfig.json +25 -0
  127. package/webpack.config.js +19 -0
  128. package/src/App.tsx +0 -11
@@ -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 CHANGED
@@ -1,11 +1,3 @@
1
- import ReactDOM from 'react-dom/client'
2
- import App from './App'
3
- import React from 'react'
4
- const root = ReactDOM.createRoot(
5
- document.getElementById('root') as HTMLElement
6
- )
7
- root.render(
8
- <React.StrictMode>
9
- <App />
10
- </React.StrictMode>
11
- )
1
+ import React from 'react';
2
+ import BiBot from './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
+ }
@@ -0,0 +1,26 @@
1
+ .useremail{
2
+ width: 70px;
3
+ white-space: nowrap;
4
+ overflow: hidden;
5
+ text-overflow: ellipsis;
6
+ margin-top: 0;
7
+ }
8
+
9
+ /* Media query for screens smaller than 600px */
10
+ @media screen and (max-width: 600px) {
11
+ .hideOnMobile{
12
+ display: none !important;
13
+ }
14
+ }
15
+
16
+ /* Media query for screens between 600px and 900px */
17
+ /* @media screen and (min-width: 600px) and (max-width: 900px) {
18
+ .hideProfile{
19
+ display: none;
20
+ }
21
+ } */
22
+
23
+ /* Media query for screens larger than 1200px */
24
+ @media screen and (min-width: 1200px) {
25
+
26
+ }
@@ -0,0 +1,90 @@
1
+ .mainContent{
2
+ display: flex;
3
+ width: 100%;
4
+ justify-content: space-around;
5
+ flex-wrap: wrap;
6
+ }
7
+ .firstSection{
8
+ text-align: start;
9
+ }
10
+ .secondSection{
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ }
15
+ .previewSection{
16
+ height: 100%;
17
+ }
18
+ input[type="file"] {
19
+ display: none;
20
+ }
21
+ .inputfileButton{
22
+ display: inline-block;
23
+ align-items: center;
24
+ /* background-color: #73767a; */
25
+ border: none;
26
+ border-radius: 5px;
27
+ cursor: pointer;
28
+ }
29
+
30
+
31
+ /* Media query for screens smaller than 600px */
32
+ @media screen and (max-width: 600px) {
33
+ .mainContent{
34
+ display: flex;
35
+ width: 100%;
36
+ flex-direction: column;
37
+ justify-content: space-around;
38
+ align-items: center;
39
+ }
40
+ .button{
41
+ width: 100% !important;
42
+ }
43
+ .previewSection{
44
+ width: 100%;
45
+ margin-top: 30px;
46
+ }
47
+ .firstSection{
48
+ width: 100%;
49
+ text-align: start;
50
+ margin-bottom: 50px;
51
+ }
52
+ .secondSection{
53
+ width: 100%;
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ text-align: start;
58
+ }
59
+ }
60
+
61
+ /* Media query for screens between 600px and 900px */
62
+ @media screen and (min-width: 600px) and (max-width: 900px) {
63
+ .mainContent{
64
+ display: flex;
65
+ width: 100%;
66
+ flex-direction: column;
67
+ justify-content: space-around;
68
+ align-items: center;
69
+ }
70
+ .previewSection{
71
+ width: 100%;
72
+ }
73
+ .firstSection{
74
+ width: 100%;
75
+ text-align: start;
76
+ margin-bottom: 50px;
77
+ }
78
+ .secondSection{
79
+ width: 100%;
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ text-align: start;
84
+ }
85
+ }
86
+
87
+ /* Media query for screens larger than 1200px */
88
+ @media screen and (min-width: 1200px) {
89
+
90
+ }
@@ -0,0 +1,27 @@
1
+ .button,
2
+ .ant-btn.button {
3
+ font-family: Arial, sans-serif;
4
+ font-size: 14px;
5
+ display: flex;
6
+ justify-content: center;
7
+ align-items: center;
8
+ border-radius: 10px;
9
+ border: 2px solid #d67632;
10
+ outline: none;
11
+ cursor: pointer;
12
+ transition: background-color 0.3s, color 0.3s;
13
+ background-color: #5f2d78;
14
+ color: white;
15
+ }
16
+
17
+ .ant-popover-buttons {
18
+ display: flex;
19
+ justify-content: flex-end;
20
+ background-color: #5f2d78;
21
+ color: white
22
+ }
23
+
24
+ .ant-popover-button {
25
+ margin: 8px;
26
+ }
27
+
@@ -0,0 +1,140 @@
1
+ .chat-bubble {
2
+ position: fixed;
3
+ bottom: 20px;
4
+ right: 20px;
5
+ z-index: 9999;
6
+ }
7
+
8
+ .chat-toggle {
9
+ color: #fff;
10
+ border-radius: 50%;
11
+ height: 60px;
12
+ width: 60px;
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ }
17
+
18
+ .chat-window {
19
+ position: absolute;
20
+ bottom: 50px;
21
+ right: 25px;
22
+ width: 350px;
23
+ height: 500px;
24
+ background-color: white;
25
+ border: 1px solid #ddd;
26
+ border-radius: 10px;
27
+ /* padding: 10px; */
28
+ box-shadow: 0 2px 10px rgba(0,0,0,0.2);
29
+ display: flex;
30
+ flex-direction: column;
31
+ justify-content: space-between;
32
+ }
33
+
34
+ /* Existing styles... */
35
+ .chat-header{
36
+ height: 50px;
37
+ border-top-left-radius: 8px;
38
+ border-top-right-radius: 8px;
39
+ display: flex;
40
+ align-items: center;
41
+ justify-content: flex-start;
42
+ padding-inline: 15px;
43
+ padding-block: 30px;
44
+ }
45
+ .message-list {
46
+ height: calc(100% - 100px);
47
+ overflow-y: auto;
48
+ padding: 10px;
49
+ display: flex;
50
+ flex-grow: 1;
51
+ flex-direction: column;
52
+ }
53
+
54
+ .message {
55
+ margin-bottom: 10px;
56
+ padding: 5px 10px;
57
+ border-radius: 8px;
58
+ max-width: 70%;
59
+ }
60
+
61
+ .message.user {
62
+ background-color: #b8b8b8c6;
63
+ align-self: flex-end;
64
+ }
65
+
66
+ .message.bot {
67
+ background-color: #f0f0f0;
68
+ align-self: flex-start;
69
+ }
70
+ textarea:focus, input:focus{
71
+ outline: none;
72
+ }
73
+
74
+ /* Chat loader*/
75
+ .loader {
76
+ width: 12px;
77
+ aspect-ratio: 1;
78
+ border-radius: 50%;
79
+ animation: l5 1s infinite linear alternate;
80
+ }
81
+ @keyframes l5 {
82
+ 0% {box-shadow: 20px 0 #000, -20px 0 #0002;background: #000 }
83
+ 33% {box-shadow: 20px 0 #000, -20px 0 #0002;background: #0002}
84
+ 66% {box-shadow: 20px 0 #0002,-20px 0 #000; background: #0002}
85
+ 100%{box-shadow: 20px 0 #0002,-20px 0 #000; background: #000 }
86
+ }
87
+
88
+
89
+ .input-area {
90
+ display: flex;
91
+ align-items: center;
92
+ border-top: 1px solid #ddd;
93
+ padding: 10px;
94
+ border-bottom-left-radius: 8px;
95
+ border-bottom-right-radius: 8px;
96
+ }
97
+
98
+ .input-area input {
99
+ flex-grow: 1;
100
+ border: none;
101
+ background-color: transparent;
102
+ /* border: 1px solid #ccc; */
103
+ /* border-radius: 15px; */
104
+ padding: 5px 10px;
105
+ margin-right: 10px;
106
+ }
107
+
108
+ .input-area button {
109
+ background-color: #007bff;
110
+ color: white;
111
+ border: none;
112
+ border-radius: 15px;
113
+ padding: 5px 10px;
114
+ cursor: pointer;
115
+ }
116
+
117
+ /* Existing styles... */
118
+
119
+ .loading-bubbles {
120
+ display: flex;
121
+ justify-content: center;
122
+ align-items: center;
123
+ }
124
+
125
+ .bubble {
126
+ width: 8px;
127
+ height: 8px;
128
+ border-radius: 50%;
129
+ margin: 0 3px;
130
+ animation: bounce 0.6s infinite alternate;
131
+ }
132
+
133
+ @keyframes bounce {
134
+ from {
135
+ transform: translateY(0);
136
+ }
137
+ to {
138
+ transform: translateY(-15px);
139
+ }
140
+ }