mirror of
https://codeberg.org/vlw/vlw.se.git
synced 2025-09-13 13:03:41 +02:00

* wip: 2024-02-13T12:59:17+0100 (1707825557) * wip: 2024-02-21T03:16:48+0100 (1708481808) * wip: 2024-02-21T20:50:20+0100 (1708545020) * wip: 2024-02-21T20:50:20+0100 (1708545020) * wip: 2024-03-01T13:17:58+0100 (1709295478) * wip: 2024-03-06T12:06:58+0100 (1709723218) * wip: 2024-03-07T15:07:57+0100 (1709820477) * wip: 2024-03-09T01:36:44+0100 (1709944604) * wip: 2024-03-14T23:24:12+0100 (1710455052) * wip: 2024-03-28T18:27:40+0100 (1711646860) * wip: 2024-03-28T18:27:40+0100 (1711646860) * feat: create README * wip: 2024-04-01T12:21:45+0200 (1711966905)
87 lines
No EOL
2.4 KiB
JavaScript
Executable file
87 lines
No EOL
2.4 KiB
JavaScript
Executable file
class ContactForm {
|
|
static STORAGE_KEY = "contact_form_message";
|
|
|
|
constructor(form) {
|
|
this.form = form;
|
|
|
|
this.getSavedMessageAndPopulateFields();
|
|
|
|
// Save message each time a button is pressed on a form element
|
|
[...document.querySelectorAll("form :is(input, textarea)")].forEach(element => {
|
|
element.addEventListener("keyup", () => this.saveMessage());
|
|
});
|
|
|
|
|
|
}
|
|
|
|
// Get saved message as JSON from SessionStorage
|
|
static getSavedMessage() {
|
|
const data = window.sessionStorage.getItem(ContactForm.STORAGE_KEY);
|
|
|
|
// Return message data as JSON
|
|
return data ? JSON.parse(data) : {};
|
|
}
|
|
|
|
// Remove saved message from SessionStorage if it exists
|
|
static removeSavedMessage() {
|
|
return window.sessionStorage.removeItem(ContactForm.STORAGE_KEY);
|
|
}
|
|
|
|
// Populate from input fields with data from SessionStorage
|
|
getSavedMessageAndPopulateFields() {
|
|
const message = ContactForm.getSavedMessage();
|
|
|
|
// Remove message and bail out if there is no saved message or if it is already sent
|
|
if (!message) {
|
|
return ContactForm.removeSavedMessage();
|
|
}
|
|
|
|
for (const [name, value] of Object.entries(message)) {
|
|
this.form.querySelector(`[name="${name}"]`).value = value;
|
|
}
|
|
}
|
|
|
|
// Save current message in SessionStorage
|
|
saveMessage() {
|
|
const message = {};
|
|
|
|
// Copy field name and value from FormData into object
|
|
(new FormData(this.form)).forEach((v, k) => message[k] = v);
|
|
|
|
// Save message data to SessionStorage as JSON
|
|
window.sessionStorage.setItem(ContactForm.STORAGE_KEY, JSON.stringify(message));
|
|
}
|
|
}
|
|
|
|
// Initialize contact form handler
|
|
{
|
|
const form = document.querySelector("section.form form");
|
|
|
|
// Create a new form handler or remove any saved message if the form element can't be found
|
|
form ? (new ContactForm(form)) : ContactForm.removeSavedMessage();
|
|
}
|
|
|
|
// Social links hover
|
|
{
|
|
const socialElementHover = (target) => {
|
|
const element = target.querySelector("p");
|
|
|
|
target.classList.add("hovering");
|
|
target.addEventListener("mousemove", (event) => {
|
|
const x = event.layerX - (element.clientWidth / 2);
|
|
const y = event.layerY + element.clientHeight;
|
|
|
|
element.style.setProperty("transform", `translate(${x}px, ${y}px)`);
|
|
});
|
|
};
|
|
|
|
const elements = [...document.querySelectorAll("social")];
|
|
|
|
elements.forEach(element => {
|
|
element.addEventListener("mouseenter", () => socialElementHover(element));
|
|
|
|
element.addEventListener("mouseleave", () => {
|
|
elements.forEach(element => element.classList.remove("hovering"));
|
|
});
|
|
});
|
|
} |