Showing
7 changed files
with
256 additions
and
0 deletions
client/.gitignore
0 → 100644
1 | +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. | ||
2 | + | ||
3 | +# dependencies | ||
4 | +/node_modules | ||
5 | +/.pnp | ||
6 | +.pnp.js | ||
7 | + | ||
8 | +# testing | ||
9 | +/coverage | ||
10 | + | ||
11 | +# production | ||
12 | +/build | ||
13 | + | ||
14 | +# misc | ||
15 | +.DS_Store | ||
16 | +.env.local | ||
17 | +.env.development.local | ||
18 | +.env.test.local | ||
19 | +.env.production.local | ||
20 | + | ||
21 | +npm-debug.log* | ||
22 | +yarn-debug.log* | ||
23 | +yarn-error.log* |
client/src/App.js
0 → 100644
1 | +import React from "react"; | ||
2 | +import { Typography, Icon } from 'antd'; | ||
3 | +import chatbot from './chatbot/chatbot'; | ||
4 | +const { Title } = Typography; | ||
5 | + | ||
6 | +function App() { | ||
7 | + return ( | ||
8 | + <div> | ||
9 | + <div style={{ display: 'flex', justifyContent: 'center', marginTop: '2rem' }}> | ||
10 | + <Title level={2} >CHAT BOT APP <Icon type="robot" /></Title> | ||
11 | + </div> | ||
12 | + <div style={{ display: 'flex', justifyContent: 'center' }}> | ||
13 | + | ||
14 | + <chatbot /> | ||
15 | + </div> | ||
16 | + </div> | ||
17 | + ) | ||
18 | +} | ||
19 | + | ||
20 | +export default App |
client/src/chatbot/chatbot.js
0 → 100644
File mode changed
client/src/index.css
0 → 100644
1 | +* { | ||
2 | + word-break: keep-all; | ||
3 | + overflow-wrap: break-word; | ||
4 | + word-wrap: break-word; | ||
5 | + } | ||
6 | + | ||
7 | + html, | ||
8 | + body { | ||
9 | + max-height: 800px; | ||
10 | + } | ||
11 | + | ||
12 | + body { | ||
13 | + margin: 0; | ||
14 | + padding: 0; | ||
15 | + font-family: Lato, Helvetica Neue, Arial, Helvetica, sans-serif; | ||
16 | + -webkit-font-smoothing: antialiased; | ||
17 | + } | ||
18 | + | ||
19 | + .ant-list-item-meta-content { | ||
20 | + max-width: 500px; | ||
21 | + overflow-x: scroll; | ||
22 | + } | ||
23 | + | ||
24 | + .ant-list-item-meta-title { | ||
25 | + font-size: 20px !important; | ||
26 | + } | ||
27 | + | ||
28 | + .ant-list-item-meta-description { | ||
29 | + display: flex; | ||
30 | + color: black !important; | ||
31 | + } | ||
32 | + | ||
33 | + | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
client/src/index.js
0 → 100644
1 | +import React from "react"; | ||
2 | +import ReactDOM from "react-dom"; | ||
3 | +import './index.css'; | ||
4 | +import "antd/dist/antd.css"; | ||
5 | + | ||
6 | +import App from "./App"; | ||
7 | + | ||
8 | +import Reducer from './_reducers'; | ||
9 | +import { Provider } from 'react-redux'; | ||
10 | +import { createStore, applyMiddleware } from 'redux'; | ||
11 | +import promiseMiddleware from 'redux-promise'; | ||
12 | +import ReduxThunk from 'redux-thunk'; | ||
13 | +import { BrowserRouter } from "react-router-dom"; | ||
14 | + | ||
15 | +import * as serviceWorker from "./serviceWorker"; | ||
16 | +const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); | ||
17 | + | ||
18 | +ReactDOM.render( | ||
19 | + <Provider | ||
20 | + store={createStoreWithMiddleware( | ||
21 | + Reducer, | ||
22 | + window.__REDUX_DEVTOOLS_EXTENSION__ && | ||
23 | + window.__REDUX_DEVTOOLS_EXTENSION__() | ||
24 | + )} | ||
25 | + > | ||
26 | + <BrowserRouter> | ||
27 | + <App /> | ||
28 | + </BrowserRouter> | ||
29 | + </Provider> | ||
30 | + | ||
31 | + , | ||
32 | + document.getElementById("root") | ||
33 | +); | ||
34 | + | ||
35 | +// If you want your app to work offline and load faster, you can change | ||
36 | +// unregister() to register() below. Note this comes with some pitfalls. | ||
37 | +// Learn more about service workers: https://bit.ly/CRA-PWA | ||
38 | +serviceWorker.unregister(); |
client/src/serviceWorker.js
0 → 100644
1 | +// This optional code is used to register a service worker. | ||
2 | +// register() is not called by default. | ||
3 | + | ||
4 | +// This lets the app load faster on subsequent visits in production, and gives | ||
5 | +// it offline capabilities. However, it also means that developers (and users) | ||
6 | +// will only see deployed updates on subsequent visits to a page, after all the | ||
7 | +// existing tabs open on the page have been closed, since previously cached | ||
8 | +// resources are updated in the background. | ||
9 | + | ||
10 | +// To learn more about the benefits of this model and instructions on how to | ||
11 | +// opt-in, read https://bit.ly/CRA-PWA | ||
12 | + | ||
13 | +const isLocalhost = Boolean( | ||
14 | + window.location.hostname === 'localhost' || | ||
15 | + // [::1] is the IPv6 localhost address. | ||
16 | + window.location.hostname === '[::1]' || | ||
17 | + // 127.0.0.1/8 is considered localhost for IPv4. | ||
18 | + window.location.hostname.match( | ||
19 | + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ | ||
20 | + ) | ||
21 | + ); | ||
22 | + | ||
23 | + export function register(config) { | ||
24 | + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { | ||
25 | + // The URL constructor is available in all browsers that support SW. | ||
26 | + const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); | ||
27 | + if (publicUrl.origin !== window.location.origin) { | ||
28 | + // Our service worker won't work if PUBLIC_URL is on a different origin | ||
29 | + // from what our page is served on. This might happen if a CDN is used to | ||
30 | + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 | ||
31 | + return; | ||
32 | + } | ||
33 | + | ||
34 | + window.addEventListener('load', () => { | ||
35 | + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; | ||
36 | + | ||
37 | + if (isLocalhost) { | ||
38 | + // This is running on localhost. Let's check if a service worker still exists or not. | ||
39 | + checkValidServiceWorker(swUrl, config); | ||
40 | + | ||
41 | + // Add some additional logging to localhost, pointing developers to the | ||
42 | + // service worker/PWA documentation. | ||
43 | + navigator.serviceWorker.ready.then(() => { | ||
44 | + console.log( | ||
45 | + 'This web app is being served cache-first by a service ' + | ||
46 | + 'worker. To learn more, visit https://bit.ly/CRA-PWA' | ||
47 | + ); | ||
48 | + }); | ||
49 | + } else { | ||
50 | + // Is not localhost. Just register service worker | ||
51 | + registerValidSW(swUrl, config); | ||
52 | + } | ||
53 | + }); | ||
54 | + } | ||
55 | + } | ||
56 | + | ||
57 | + function registerValidSW(swUrl, config) { | ||
58 | + navigator.serviceWorker | ||
59 | + .register(swUrl) | ||
60 | + .then(registration => { | ||
61 | + registration.onupdatefound = () => { | ||
62 | + const installingWorker = registration.installing; | ||
63 | + if (installingWorker == null) { | ||
64 | + return; | ||
65 | + } | ||
66 | + installingWorker.onstatechange = () => { | ||
67 | + if (installingWorker.state === 'installed') { | ||
68 | + if (navigator.serviceWorker.controller) { | ||
69 | + // At this point, the updated precached content has been fetched, | ||
70 | + // but the previous service worker will still serve the older | ||
71 | + // content until all client tabs are closed. | ||
72 | + console.log( | ||
73 | + 'New content is available and will be used when all ' + | ||
74 | + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' | ||
75 | + ); | ||
76 | + | ||
77 | + // Execute callback | ||
78 | + if (config && config.onUpdate) { | ||
79 | + config.onUpdate(registration); | ||
80 | + } | ||
81 | + } else { | ||
82 | + // At this point, everything has been precached. | ||
83 | + // It's the perfect time to display a | ||
84 | + // "Content is cached for offline use." message. | ||
85 | + console.log('Content is cached for offline use.'); | ||
86 | + | ||
87 | + // Execute callback | ||
88 | + if (config && config.onSuccess) { | ||
89 | + config.onSuccess(registration); | ||
90 | + } | ||
91 | + } | ||
92 | + } | ||
93 | + }; | ||
94 | + }; | ||
95 | + }) | ||
96 | + .catch(error => { | ||
97 | + console.error('Error during service worker registration:', error); | ||
98 | + }); | ||
99 | + } | ||
100 | + | ||
101 | + function checkValidServiceWorker(swUrl, config) { | ||
102 | + // Check if the service worker can be found. If it can't reload the page. | ||
103 | + fetch(swUrl) | ||
104 | + .then(response => { | ||
105 | + // Ensure service worker exists, and that we really are getting a JS file. | ||
106 | + const contentType = response.headers.get('content-type'); | ||
107 | + if ( | ||
108 | + response.status === 404 || | ||
109 | + (contentType != null && contentType.indexOf('javascript') === -1) | ||
110 | + ) { | ||
111 | + // No service worker found. Probably a different app. Reload the page. | ||
112 | + navigator.serviceWorker.ready.then(registration => { | ||
113 | + registration.unregister().then(() => { | ||
114 | + window.location.reload(); | ||
115 | + }); | ||
116 | + }); | ||
117 | + } else { | ||
118 | + // Service worker found. Proceed as normal. | ||
119 | + registerValidSW(swUrl, config); | ||
120 | + } | ||
121 | + }) | ||
122 | + .catch(() => { | ||
123 | + console.log( | ||
124 | + 'No internet connection found. App is running in offline mode.' | ||
125 | + ); | ||
126 | + }); | ||
127 | + } | ||
128 | + | ||
129 | + export function unregister() { | ||
130 | + if ('serviceWorker' in navigator) { | ||
131 | + navigator.serviceWorker.ready.then(registration => { | ||
132 | + registration.unregister(); | ||
133 | + }); | ||
134 | + } | ||
135 | + } | ||
136 | + | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment