Skip to content
Open

a #17

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion assets/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
--gold-crayola: hsl(38, 61%, 73%);
--quick-silver: hsla(0, 0%, 65%, 1);
--davys-grey: hsla(30, 3%, 34%, 1);
--smoky-black-1: hsla(40, 12%, 5%, 1);
--smoky-black-1: rgb(63, 24, 24);
--smoky-black-2: hsla(30, 8%, 5%, 1);
--smoky-black-3: hsla(0, 3%, 7%, 1);
--eerie-black-1: hsla(210, 4%, 9%, 1);
Expand Down
202 changes: 202 additions & 0 deletions chatbot.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Restaurant Table Booking Chatbot</title>
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #121212;
color: #e0e0e0;
}
.card {
background-color: #1e1e1e;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
width: 100%;
max-width: 400px;
}
.card-header {
padding: 1rem;
border-bottom: 1px solid #333;
}
.card-title {
margin: 0;
font-size: 1.25rem;
color: #ffffff;
}
.card-content {
height: 400px;
overflow-y: auto;
padding: 1rem;
}
.message {
margin-bottom: 0.5rem;
padding: 0.5rem;
border-radius: 4px;
max-width: 80%;
}
.bot-message {
background-color: #ffffff;
color: #000000;
align-self: flex-start;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.user-message {
background-color: #4a4a4a;
color: #ffffff;
align-self: flex-end;
margin-left: auto;
}
.card-footer {
padding: 1rem;
border-top: 1px solid #333;
display: flex;
}
input {
flex-grow: 1;
padding: 0.5rem;
border: 1px solid #555;
border-radius: 4px;
background-color: #2c2c2c;
color: #ffffff;
}
button {
padding: 0.5rem 1rem;
background-color: #4a4a4a;
color: white;
border: none;
border-radius: 4px;
margin-left: 0.5rem;
cursor: pointer;
}
button:hover {
background-color: #5a5a5a;
}
button:disabled {
background-color: #3a3a3a;
cursor: not-allowed;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #1e1e1e;
}
::-webkit-scrollbar-thumb {
background: #4a4a4a;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #5a5a5a;
}
</style>
</head>
<body>
<div id="root"></div>

<script type="text/babel">
function ChatBot() {
const [messages, setMessages] = React.useState([
{ text: "Welcome! I can help you book a table. How many people will be dining?", sender: 'bot' }
]);
const [input, setInput] = React.useState('');
const [step, setStep] = React.useState(0);
const [booking, setBooking] = React.useState({
people: '',
email: '',
phone: '',
time: ''
});

const handleSend = () => {
if (input.trim() === '') return;

setMessages(prev => [...prev, { text: input, sender: 'user' }]);

switch (step) {
case 0:
setBooking(prev => ({ ...prev, people: input }));
setMessages(prev => [...prev, { text: "Great! Please provide your email address.", sender: 'bot' }]);
setStep(1);
break;
case 1:
if (!/^\S+@\S+\.\S+$/.test(input)) {
setMessages(prev => [...prev, { text: "That doesn't look like a valid email. Please try again.", sender: 'bot' }]);
} else {
setBooking(prev => ({ ...prev, email: input }));
setMessages(prev => [...prev, { text: "Thank you. Now, what's your phone number?", sender: 'bot' }]);
setStep(2);
}
break;
case 2:
if (!/^\d{10}$/.test(input)) {
setMessages(prev => [...prev, { text: "Please enter a valid 10-digit phone number.", sender: 'bot' }]);
} else {
setBooking(prev => ({ ...prev, phone: input }));
setMessages(prev => [...prev, { text: "Perfect! Lastly, what time would you like to book the table?", sender: 'bot' }]);
setStep(3);
}
break;
case 3:
setBooking(prev => ({ ...prev, time: input }));
setMessages(prev => [
...prev,
{ text: "Thank you for providing all the information. Your request has been sent!", sender: 'bot' },
{ text: `Booking details:\nPeople: ${booking.people}\nEmail: ${booking.email}\nPhone: ${booking.phone}\nTime: ${input}`, sender: 'bot' }
]);
setStep(4);
break;
}

setInput('');
};

React.useEffect(() => {
const chatContent = document.querySelector('.card-content');
chatContent.scrollTop = chatContent.scrollHeight;
}, [messages]);

return (
<div className="card">
<div className="card-header">
<h2 className="card-title">Restaurant Table Booking</h2>
</div>
<div className="card-content">
{messages.map((message, index) => (
<div key={index} className={`message ${message.sender === 'bot' ? 'bot-message' : 'user-message'}`}>
{message.text}
</div>
))}
</div>
<div className="card-footer">
<input
type="text"
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyPress={(e) => e.key === 'Enter' && handleSend()}
disabled={step === 4}
placeholder="Type your message..."
aria-label="Type your message"
/>
<button onClick={handleSend} disabled={step === 4}>
Send
</button>
</div>
</div>
);
}

ReactDOM.render(<ChatBot />, document.getElementById('root'));
</script>
</body>
</html>
Loading