aboutsummaryrefslogtreecommitdiff
path: root/src/components/GuestbookForm.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/GuestbookForm.jsx')
-rw-r--r--src/components/GuestbookForm.jsx75
1 files changed, 44 insertions, 31 deletions
diff --git a/src/components/GuestbookForm.jsx b/src/components/GuestbookForm.jsx
index aae5e10..b8fc1c2 100644
--- a/src/components/GuestbookForm.jsx
+++ b/src/components/GuestbookForm.jsx
@@ -1,12 +1,16 @@
import { h, Component } from 'preact';
import { createMessage } from '../services/GuestbookService';
+import '../styles/GuestbookForm.css';
+import { marked } from "marked";
+import DOMPurify from 'dompurify';
class GuestbookForm extends Component {
state = {
name: '',
email: '',
website: '',
- message: ''
+ message: '',
+ isMessageSent: false,
};
handleChange = (e) => {
@@ -15,40 +19,49 @@ class GuestbookForm extends Component {
handleSubmit = async (e) => {
e.preventDefault();
- await createMessage(this.state);
- this.setState({
- name: '',
- email: '',
- website: '',
- message: ''
- });
+
+ if (this.state.isMessageSent) {
+ return;
+ }
+
+ const messageHtml = marked(DOMPurify.sanitize(this.state.message));
+ try {
+ await createMessage({ ...this.state, message: messageHtml });
+
+ this.setState({
+ name: '',
+ email: '',
+ website: '',
+ message: '',
+ isMessageSent: true,
+ errorMessage: ''
+ });
+ } catch (error) {
+ this.setState({ errorMessage: error.message });
+ }
}
render() {
return (
- <form class="card" onSubmit={this.handleSubmit}>
- <h2>Submit Message</h2>
- <label>
- Name<br />
- <input type="text" name="name" placeholder="Name" required value={this.state.name} onChange={this.handleChange} />
- </label>
- <br />
- <label>
- Email Address<br />
- <input type="email" name="email" placeholder="Email Address (optional)" value={this.state.email} onChange={this.handleChange} />
- </label>
- <br />
- <label>
- Your Website<br />
- <input type="url" name="website" placeholder="https://example.com (optional)" value={this.state.website} onChange={this.handleChange} />
- </label>
- <br />
- <label>
- Message<br />
- <textarea name="message" placeholder="Message (Up to 1000 characters)" required value={this.state.message} onChange={this.handleChange}></textarea>
- </label>
- <button type="submit">Send</button>
- </form>
+ <div class="card">
+ <form onSubmit={this.handleSubmit}>
+ <h2>Submit Message</h2>
+ <label>Name</label>
+ <input type="text" name="name" placeholder="Name" required value={this.state.name}
+ onChange={this.handleChange}/>
+ <label>Email Address</label>
+ <input type="email" name="email" placeholder="hello@example.com (optional)" value={this.state.email}
+ onChange={this.handleChange}/>
+ <label>Your Website</label>
+ <input type="url" name="website" placeholder="https://example.com (optional)"
+ value={this.state.website} onChange={this.handleChange}/>
+ <label>Message (Supports Markdown)</label>
+ <textarea name="message" placeholder="Message" required value={this.state.message}
+ onChange={this.handleChange}></textarea>
+ <button type="submit">Send</button>
+ </form>
+ {this.state.isMessageSent && <p>Sent successfully!</p>}
+ </div>
);
}
}