Build a Bookmark Manager App - Test #23

Tell us what’s happening:

For Test #23, I’m receiving this error message: “When you click the #delete-bookmark-button, you should delete the bookmark corresponding to the selected radio button and appropriate category from the local storage and update the displayed bookmark list.”

Socrates also advised the following:

I’m unclear on the instructions being provided re: how to solve for this. Can someone please provide a little bit of added direction?

Thank you!

Your code so far

const mainSection = document.getElementById("main-section");
const formSection = document.getElementById("form-section");
const bookmarkListSection = document.getElementById("bookmark-list-section");
const addBookmarkButton = document.getElementById("add-bookmark-button");
const categoryName = document.querySelector(".category-name");
const categoryDropdown = document.getElementById("category-dropdown");
const categoryList = document.getElementById("category-list");
const viewCategoryButton = document.getElementById("view-category-button");
const closeFormButton = document.getElementById("close-form-button");
const addBookmarkButtonForm = document.getElementById("add-bookmark-button-form");
const closeListButton = document.getElementById("close-list-button");
const deleteBookmarkButton = document.getElementById("delete-bookmark-button");
const bookmarkName = document.getElementById("name");
const bookmarkUrl = document.getElementById("url");


function getBookmarks() {
  try {
    const parsed = JSON.parse(localStorage.getItem("bookmarks"));
    if (
      Array.isArray(parsed)
      && parsed.every(
        (item) =>
          item.hasOwnProperty("category") &&
          item.hasOwnProperty("name") &&
          item.hasOwnProperty("url")
      )
    ) {
      return parsed;
    }
    return [];
  } catch {
    return [];
  }
};

function displayOrCloseForm () {
  mainSection.classList.toggle("hidden");
  formSection.classList.toggle("hidden");
}

function displayOrHideCategory () {
  mainSection.classList.toggle("hidden");
  bookmarkListSection.classList.toggle("hidden");
}

addBookmarkButton.addEventListener("click", () => {
  categoryName.innerText = categoryDropdown.value;
  displayOrCloseForm();
});

closeFormButton.addEventListener("click", displayOrCloseForm);

addBookmarkButtonForm.addEventListener("click", () => {
  const existingBookmarks = JSON.parse(localStorage.getItem("bookmarks"));
  existingBookmarks.push({
    name: bookmarkName.value,
    category: categoryDropdown.value,
    url: bookmarkUrl.value
  });
  localStorage.setItem("bookmarks", JSON.stringify(existingBookmarks))
  const name = document.getElementById("name");
  const URL = document.getElementById("url");
  name.value = "";
  url.value = "";
  displayOrCloseForm();
})

viewCategoryButton.addEventListener("click", () => {
  const existingBookmarks = JSON.parse(localStorage.getItem("bookmarks"));
  categoryName.innerText = categoryDropdown.value;
  const containsCategory = existingBookmarks.some(obj => obj.category === categoryDropdown.value);
  if (!containsCategory) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>"
  } else if (containsCategory) {
    let innerHTML = ""
    const matchedBookmarks = existingBookmarks.filter(bookmark => bookmark.category === categoryDropdown.value);
    matchedBookmarks.forEach(bookmark => {
      innerHTML += `<input type="radio" name="categoryPicked" value=${bookmark.name} id=${bookmark.name}> <label for=${bookmark.name}><a href=${bookmark.url}>${bookmark.name}</a></label>`;
    })
    categoryList.innerHTML = innerHTML;
  }
  displayOrHideCategory();
});

closeListButton.addEventListener("click", () => {displayOrHideCategory()})

deleteBookmarkButton.addEventListener("click", () => {
  const existingBookmarks = JSON.parse(localStorage.getItem("bookmarks"));
  const selectedBookmark = document.querySelector('input[type="radio"]:checked');
  const bookmarkIndex = existingBookmarks.findIndex(bookmark => bookmark.name === selectedBookmark.value);
  existingBookmarks.splice(bookmarkIndex, 1);
  localStorage.setItem("bookmarks", JSON.stringify(existingBookmarks));

  const containsCategory = existingBookmarks.some(obj => obj.category === categoryDropdown.value);
  if (!containsCategory) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>"
  } else if (containsCategory) {
    let innerHTML = ""
    const matchedBookmarks = existingBookmarks.filter(bookmark => bookmark.category === categoryDropdown.value);
    matchedBookmarks.forEach(bookmark => {
      innerHTML += `<input type="radio" name="categoryPicked" value=${bookmark.name} id=${bookmark.name}> <label for=${bookmark.name}><a href=${bookmark.url}>${bookmark.name}</a></label>`;
    })
    categoryList.innerHTML = innerHTML;
  }
})

<!-- file: index.html -->

/* file: styles.css */

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36

Challenge Information:

Build a Bookmark Manager App - Build a Bookmark Manager App

GitHub Link: freeCodeCamp/curriculum/challenges/english/blocks/lab-bookmark-manager-app/66def5467aee701733aaf8cc.md at main · freeCodeCamp/freeCodeCamp · GitHub

Hi @snaylspace,

What if a user clicks the “Delete Bookmark” button without checking a radio button? Open your browser’s console and you will see that an error is thrown.

What if you have two bookmarks with the same name that are in two different categories? Will your code delete just the bookmark in one category, or will it delete both?

Happy coding