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