Bookshelf
Error: Promised response from onMessage listener went out of scopeuser_6589705
javascript
2 years ago
5.6 kB
30
Indexable
const books = [];
const RENDER_EVENT = 'render-book';
const SAVED_EVENT = 'saved-book';
const STORAGE_KEY = 'BOOKSHELF-APP';
const isStorageExist = () => typeof Storage !== 'undefined';
const generatId = () => +new Date();
const generateBook = (id, title, author, year, isComplete) => ({ id, title, author, year, isComplete });
document.addEventListener('DOMContentLoaded', function () {
const frm_submit = document.getElementById('inputBook');
frm_submit.addEventListener('submit', function (event) {
event.preventDefault();
addBooks();
});
const searchInput = document.getElementById('searchBookTitle');
searchInput.addEventListener('input', function () {
searchBooks();
});
if (isStorageExist()) {
loadDataFromLocalStorage();
}
});
function searchBooks() {
const search = document.querySelector('#searchBookTitle').value.toUpperCase();
const bookContainers = document.querySelectorAll('.book_item');
bookContainers.forEach(bookItem => {
const titleElement = bookItem.querySelector('h3');
const title = titleElement.innerText.toUpperCase();
const match = title.includes(search);
if (match) {
bookItem.style.display = '';
} else {
bookItem.style.display = 'none';
}
});
}
function addBooks() {
const {value: bookTitle} = document.getElementById('inputBookTitle');
const {value: bookAuthor} = document.getElementById('inputBookAuthor');
const {value: bookYear} = document.getElementById('inputBookYear');
const bookIsComplete = document.getElementById('inputBookIsComplete').checked;
const generatedID = generatId();
const bookObject = generateBook(generatedID, bookTitle, bookAuthor, bookYear, bookIsComplete);
books.push(bookObject);
document.dispatchEvent(new Event(RENDER_EVENT));
saveData();
}
document.addEventListener(RENDER_EVENT, function () {
const incompleteBookList = document.getElementById('incompleteBookshelfList');
const completeBookList = document.getElementById('completeBookshelfList');
incompleteBookList.innerHTML = '';
completeBookList.innerHTML = '';
books.forEach(bookItem => {
const booksListElement = createBook(bookItem);
(bookItem.isComplete ? completeBookList : incompleteBookList).append(booksListElement);
});
});
function createBook(bookObject) {
const createElement = (tag, text, className) => {
const element = document.createElement(tag);
element.innerText = text;
if (className) element.classList.add(className);
return element;
};
const textTitle = createElement("h3", bookObject.title);
const textAuthor = createElement("p", `Penulis : ${bookObject.author}`);
const textYear = createElement("p", `Tahun : ${Number(bookObject.year)}`);
const bookItem = createElement("div", "", "book_item");
bookItem.append(textTitle, textAuthor, textYear);
const action = createElement("div", "", "action");
const btn_delete = createElement("button", "Hapus Buku", "red");
btn_delete.addEventListener("click", () => removeBook(bookObject.id));
const btn_label = bookObject.isComplete ? "Belum Selesai Dibaca" : "Selesai Dibaca";
const buttonAction = bookObject.isComplete ? undoFromCompleted : addBooksCompleted;
const button = document.createElement("button");
button.innerText = btn_label;
button.classList.add("green");
action.append(button);
button.addEventListener("click", function () {
buttonAction(bookObject.id);
});
action.append(btn_delete);
bookItem.append(action);
return bookItem;
}
function addBooksCompleted(bookId) {
const bookTarget = findBook(bookId);
if (bookTarget == null) return;
bookTarget.isComplete = true;
document.dispatchEvent(new Event(RENDER_EVENT));
saveData();
}
function findBook(bookId) {
for (const bookItem of books) {
if (bookItem.id === bookId) {
return bookItem;
}
}
return null;
}
function removeBook(bookId) {
if (confirm("Hapus buku?")) {
const bookTarget = findBookIndex(bookId);
if (bookTarget !== -1) {
books.splice(bookTarget, 1);
document.dispatchEvent(new Event(RENDER_EVENT));
saveData()
.then(() => {
alert('Buku terhapus');
})
.catch(error => {
console.error('Error saving data:', error);
});
}
}
}
function undoFromCompleted(bookId) {
const bookTarget = findBook(bookId);
if (bookTarget) {
bookTarget.isComplete = false;
document.dispatchEvent(new Event(RENDER_EVENT));
saveData();
}
}
function findBookIndex(bookId) {
return books.findIndex(book => book.id === bookId);
}
function saveData() {
if (isStorageExist()) {
return new Promise((resolve, reject) => {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(books));
document.dispatchEvent(new Event(SAVED_EVENT));
resolve();
} catch (error) {
reject(error);
}
});
}
return Promise.reject(new Error('Storage does not exist'));
}
document.addEventListener(SAVED_EVENT, () => console.log(localStorage.getItem(STORAGE_KEY)));
function loadDataFromLocalStorage() {
const data = JSON.parse(localStorage.getItem(STORAGE_KEY)) || [];
books.push(...data);
document.dispatchEvent(new Event(RENDER_EVENT));
}
Editor is loading...
Leave a Comment