Build a Bookmark Manager App - Build a Bookmark Manager App

Tell us what’s happening:

Failing 21 (I haven’t implemented the code for 23 yet). Not sure what else to try with the closeListButton event listener- I’ve tried conditionally toggling the “hidden” classes based on whether the objects have them already but that doesn’t work. Is the issue in the event listener or elsewhere?

Your code so far

/* file: script.js */
let mainSection = document.getElementById("main-section");
let formSection = document.getElementById("form-section");
let addBookmarkButton = document.getElementById("add-bookmark-button");
let categoryName = document.querySelector(".category-name");
let categoryDropdown = document.getElementById("category-dropdown");
let closeFormButton = document.getElementById("close-form-button");
let addBookmarkButtonForm = document.getElementById("add-bookmark-button-form");
let nameElement = document.getElementById("name");
let urlElement = document.getElementById("url");
let viewCategoryButton = document.getElementById("view-category-button");
let categoryList = document.getElementById("category-list");
let closeListButton = document.getElementById("close-list-button");
let bookmarkListSection = document.getElementById("bookmark-list-section");
let deleteBookmarkButton = document.getElementById("delete-bookmark-button");

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

closeFormButton.addEventListener("click", () => {
  displayOrCloseForm();
})

addBookmarkButtonForm.addEventListener("click", () => {
  let bookmarks = JSON.parse(localStorage.getItem("bookmarks"));
  bookmarks.push({
    name: nameElement.value,
    category: categoryDropdown.value,
    url: urlElement.value,
  });
  localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
  nameElement.value = "";
  urlElement.value = "";
  displayOrCloseForm();
})

viewCategoryButton.addEventListener("click", () => {
  let bookmarks = getBookmarks();
  let oneHas = false;
  if (bookmarks != []) {
    bookmarks.forEach((bookmark) => {;
      let hasProperty = Object.hasOwn(bookmark, categoryDropdown.value);
      if (hasProperty) {
        oneHas = true;
      };
    });
  };
  if (!oneHas) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>";
  };
  bookmarks.forEach((bookmark) => {
    if (bookmark.category === categoryDropdown.value) {
      categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</label>`;
    };
  })
})

closeListButton.addEventListener("click", () => {
  mainSection.classList.remove("hidden");
  bookmarkListSection.classList.add("hidden");
})

function getBookmarks() {
  try {
    let bookmarks = JSON.parse(localStorage.getItem("bookmarks"));
    let allValid;
    bookmarks.forEach((bookmark) => {
      let hasName = Object.hasOwn(bookmark, "name");
      let hasCategory = Object.hasOwn(bookmark, "category");
      let hasURL = Object.hasOwn(bookmark, "url");
      if (hasName && hasCategory && hasURL) {
        allValid = true;
      } else {
        allValid = false;
      };
    });
    return allValid ? bookmarks : [];
  } catch(error) {
    return [];
  };
}

function displayOrCloseForm() {
  if (mainSection.classList.contains("hidden")) {
    mainSection.classList.remove("hidden");
  } else {
    mainSection.classList.add("hidden");
  };
  if (formSection.classList.contains("hidden")) {
    formSection.classList.remove("hidden");
  } else {
    formSection.classList.add("hidden");
  }
}

function displayOrHideCategory() {
  if (mainSection.classList.contains("hidden")) {
    mainSection.classList.remove("hidden");
  } else {
    mainSection.classList.add("hidden");
  };
}
<!-- file: index.html -->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=0.0">
    <title>Bookmark Manager</title>
    <link rel="stylesheet" href="styles.css">
</head>

<body>
    <main>
        <section id="main-section">
            <h1>Bookmark Manager</h1>
            <div id="dropdown">
                <label for="category-dropdown">Select a category:</label>
                <select id="category-dropdown" name="options">
                    <option value="news" selected>News</option>
                    <option value="entertainment">Entertainment</option>
                    <option value="work">Work</option>
                    <option value="miscellaneous">Miscellaneous</option>
                </select>
            </div>
            <div id="buttons">
                <button type="button" id="view-category-button">View Category</button>
                <button type="button" id="add-bookmark-button">Add Bookmark</button>
            </div>
        </section>

        <section id="form-section" class="hidden">
            <form>
                <h2 class="category-name"></h2>
                <div>
                    <label for="name">Name:</label>
                    <input type="text" id="name">
                </div>
                <div>
                    <label for="url">URL:</label>
                    <input type="text" id="url">
                </div>
                <div>
                    <button type="button" id="close-form-button">Go Back</button>
                    <button type="button" id="add-bookmark-button-form">Add Bookmark</button>
                </div>
            </form>
        </section>

        <section id="bookmark-list-section" class="hidden">
            <h2 class="category-name"></h2>
            <div id="category-list">
            </div>
            <div>
                <button type="button" id="close-list-button">Go Back</button>
                <button type="button" id="delete-bookmark-button">Delete Bookmark</button>
            </div>
        </section>

    </main>
    <script src="script.js"></script>
</body>

</html>
/* file: styles.css */
:root {
  --light-grey: #f5f6f7;
  --dark-grey: #0a0a23;
  --yellow: #f1be32;
  --golden-yellow: #feac32;
}

*,
*::before,
*::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

main {
  display: flex;
  justify-content: center;
}

body {
  background-color: var(--dark-grey);
}

.hidden {
  display: none;
}

section {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

select,
input,
label {
  margin-left: 10px;
}

div {
  padding: 30px;
  display: flex;
  justify-content: center;
}

.close-form-button {
  background: none;
  border: none;
  cursor: pointer;
}

h1, h2 {
  margin-top: 20px;
  text-align: center;
}

#category-list {
  text-align: center;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  background-color: var(--light-grey);
  align-self: center;
  width: 80%;
  margin-top: 15px;
  border-radius: 10px;
}

#category-list,
h1,
h2,
label {
  color: var(--light-grey);
}

#category-list p {
  color: var(--dark-grey);
}

button {
  cursor: pointer;
  padding: 5px;
  width: 100px;
  margin: 10px;
  color: var(--dark-grey);
  background-color: var(--golden-yellow);
  background-image: linear-gradient(#fecc4c, #ffac33);
  border-color: var(--golden-yellow);
  border-width: 3px;
}

button:hover {
  background-image: linear-gradient(#ffcc4c, #f89808);
}

section {
  margin-top: 60px;
  border: 2px solid var(--golden-yellow);
  width: fit-content;
  border-radius: 10px;
}

Your browser information:

User Agent is: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36

Challenge Information:

Build a Bookmark Manager App - Build a Bookmark Manager App

I’m not able to test the app. If I try to add a bookmark I get this error TypeError: can't access property "push", bookmarks is null

Am I doing something wrong or that’s not implemented yet?

The test might be trying to do a sequence of actions that’s preventing testing that feature.

What can you do here to make sure you have an array to push to if there is no bookmarks key in local storage yet?

Also, your view category event listener needs work. Get some logs in there to see what’s going on.

All of the tests apart from 21 and 23 pass for me, I’m not sure why it’s not doing so for you. The only thing I haven’t implemented is an event listener for delete-bookmark-button (test 23). Do you have any idea what’s wrong with test 21 specifically?

Fixed this bit, still not passing 21

addBookmarkButtonForm.addEventListener("click", () => {
  try {
    let bookmarks = JSON.parse(localStorage.getItem("bookmarks"));
    bookmarks.push({
      name: nameElement.value,
      category: categoryDropdown.value,
      url: urlElement.value,
    });
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    nameElement.value = "";
    urlElement.value = "";
    displayOrCloseForm();
  } catch {
    let bookmarks = [{
      name: nameElement.value, 
      category: categoryDropdown.value,
      url: urlElement.value,
    }];
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    nameElement.value = "";
    urlElement.value = "";
    displayOrCloseForm();
  };
})

I’ve updated the view-category event listener to actually find the relevant bookmarks, but now the tests 19-23 all fail because the HTML’s not being added correctly. I’ve not changed any of the code for adding the HTML so I’m not sure what’s wrong with it.

viewCategoryButton.addEventListener("click", () => {
  let bookmarks = getBookmarks();
  let oneHas = false;
  if (bookmarks != []) {
    bookmarks.forEach((bookmark) => {
      let hasProperty = false;
      if (bookmark.category === categoryDropdown.value) {
        hasProperty = true;
      };
      if (hasProperty) {
        oneHas = true;
      };
    });
  };
  if (!oneHas) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>";
  } else {
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</label>`;
      };
    });
  };
})

If I log the HTML to the console, it looks fine.

Focus on making the app work first, not the tests.

The view category button is not working.

1 Like

I know it’s not working, that’s what I was asking about? From logging things to the console I think that this part:

viewCategoryButton.addEventListener("click", () => {
  let bookmarks = getBookmarks();
  let oneHas = false;
  if (bookmarks != []) {
    bookmarks.forEach((bookmark) => {
      let hasProperty = false;
      if (bookmark.category === categoryDropdown.value) {
        hasProperty = true;
      };
      if (hasProperty) {
        oneHas = true;
      };
    });
  };
  if (!oneHas) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>";

works but that the end of the event listener:

} else {
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</label>`;
      };
    });
  };
})

Do you have any idea what’s wrong with adding the HTML?

Go through the user stories again to make sure you are following them exactly. Focus on getting the application to work like the example app. Use the functions you have already created instead of rewriting the same code. After your code is finished and is working like the example app, then run the tests.

Can you post your full current code?

I’m not getting the same results as you. Need to make sure we are looking at the same things.

What did you log to the console? I don’t see your console.log lines

I’ve added the two lines at the end to match story 9, but clicking View Category just shows a completely blank page.

viewCategoryButton.addEventListener("click", () => {
  let bookmarks = getBookmarks();
  let oneHas = false;
  if (bookmarks != []) {
    bookmarks.forEach((bookmark) => {
      let hasProperty = false;
      if (bookmark.category === categoryDropdown.value) {
        hasProperty = true;
      };
      if (hasProperty) {
        oneHas = true;
      };
    });
  };
  if (!oneHas) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>";
  } else {
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</a></label>`;
      };
    });
  };
  categoryName.innerHTML = `${categoryDropdown.value}`;
  displayOrHideCategory();
})
let mainSection = document.getElementById("main-section");
let formSection = document.getElementById("form-section");
let addBookmarkButton = document.getElementById("add-bookmark-button");
let categoryName = document.querySelector(".category-name");
let categoryDropdown = document.getElementById("category-dropdown");
let closeFormButton = document.getElementById("close-form-button");
let addBookmarkButtonForm = document.getElementById("add-bookmark-button-form");
let nameElement = document.getElementById("name");
let urlElement = document.getElementById("url");
let viewCategoryButton = document.getElementById("view-category-button");
let categoryList = document.getElementById("category-list");
let closeListButton = document.getElementById("close-list-button");
let bookmarkListSection = document.getElementById("bookmark-list-section");
let deleteBookmarkButton = document.getElementById("delete-bookmark-button");
let radioButtons = document.querySelectorAll("#radio-button");

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

closeFormButton.addEventListener("click", () => {
  displayOrCloseForm();
})

addBookmarkButtonForm.addEventListener("click", () => {
  try {
    let bookmarks = JSON.parse(localStorage.getItem("bookmarks"));
    bookmarks.push({
      name: nameElement.value,
      category: categoryDropdown.value,
      url: urlElement.value,
    });
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    nameElement.value = "";
    urlElement.value = "";
    displayOrCloseForm();
  } catch {
    let bookmarks = [{
      name: nameElement.value, 
      category: categoryDropdown.value,
      url: urlElement.value,
    }];
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    nameElement.value = "";
    urlElement.value = "";
    displayOrCloseForm();
  };
})

viewCategoryButton.addEventListener("click", () => {
  console.log(bookmarks);
  let bookmarks = getBookmarks();
  let oneHas = false;
  if (bookmarks != []) {
    bookmarks.forEach((bookmark) => {
      let hasProperty = false;
      if (bookmark.category === categoryDropdown.value) {
        console.log(`${bookmark.name} has category ${categoryDropdown.value}`);
        hasProperty = true;
      };
      if (hasProperty) {
        oneHas = true;
      };
    });
  };
  if (!oneHas) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>";
  } else {
    categoryList.innerHTML = "";
    bookmarks.forEach((bookmark) => {
      console.log(`Adding HTMl for ${bookmark.name}`);
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</a></label>`;
      };
    });
  };
  console.log(categoryList.innerHTML);
  categoryName.innerHTML = `${categoryDropdown.value}`;
  displayOrHideCategory();
})

closeListButton.addEventListener("click", () => {
  mainSection.classList.remove("hidden");
  bookmarkListSection.classList.add("hidden");
})

deleteBookmarkButton.addEventListener("click",  () => {
  let checked = 0;
  radioButtons.forEach((button) => {
    if (button.checked) {
      checked = button;
    };
  });
  let bookmarks = getBookmarks();
  let index = -1;
  for (let bookmark in bookmarks) {
    index += 1;
    if (bookmark.name === checked.value) {
      bookmarks.splice(index, 0);
      break;
    };
  };
  localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
  let oneHas = false;
  if (bookmarks != []) {
    bookmarks.forEach((bookmark) => {
      let hasProperty = false;
      if (bookmark.category === categoryDropdown.value) {
        hasProperty = true;
      };
      if (hasProperty) {
        oneHas = true;
      };
    });
  };
  if (!oneHas) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>";
  } else {
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</a></label>`;
      };
    });
  };
})

function getBookmarks() {
  try {
    let bookmarks = JSON.parse(localStorage.getItem("bookmarks"));
    let allValid;
    bookmarks.forEach((bookmark) => {
      let hasName = Object.hasOwn(bookmark, "name");
      let hasCategory = Object.hasOwn(bookmark, "category");
      let hasURL = Object.hasOwn(bookmark, "url");
      if (hasName && hasCategory && hasURL) {
        allValid = true;
      } else {
        allValid = false;
      };
    });
    return allValid ? bookmarks : [];
  } catch(error) {
    return [];
  };
}

function displayOrCloseForm() {
  if (mainSection.classList.contains("hidden")) {
    mainSection.classList.remove("hidden");
  } else {
    mainSection.classList.add("hidden");
  };
  if (formSection.classList.contains("hidden")) {
    formSection.classList.remove("hidden");
  } else {
    formSection.classList.add("hidden");
  }
}

function displayOrHideCategory() {
  if (mainSection.classList.contains("hidden")) {
    mainSection.classList.remove("hidden");
  } else {
    mainSection.classList.add("hidden");
  };
  if (bookmarkListSection.classList.contains("hidden")) {
    bookmarkListSection.classList.remove("hidden");
  } else {
    bookmarkListSection.classList.add("hidden");
  };
}

It’s just test 23 that’s failing now

Are you sure you need help? You seem to be progressing well.

I would remove all of your current console.log and keep debugging the same way

deleteBookmarkButton.addEventListener("click",  () => {
  let checked = 0;
  console.log(radioButtons.length)
  radioButtons.forEach((button) => {
    console.log(button)
    if (button.checked) {
      checked = button;
    };
  });
  console.log(checked)

gives this output:

0 //this is radioButtons.length
0 // this is the checked variable

Even though there is one radiobutton selected.

I’m aware that this bit passes. It’s now the event listener for delete-bookmark-button that I’m trying to work out (test 23)

deleteBookmarkButton.addEventListener("click",  () => {
  let toRemove;
  let bookmarks = getBookmarks();
  radioButtons.forEach((button) => {
    if (button.checked) {
      bookmarks.forEach((bookmark) => {
        if (bookmark.name === button.value && bookmark.category === categoryDropdown.value) {
          toRemove = bookmark;
        };
      });
    };
  });
  try {
    console.log(bookmarks);
    let index = bookmarks.indexOf(toRemove);
    bookmarks.splice(index, 1);
    console.log(bookmarks);
  } finally {
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    categoryList.innerHTML = "";
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</a></label>`;
      };
    });
  };
})

The code works as long as the selected item doesn’t have the same name as another bookmark. I’ve tried to select for both the category and the name, so why should this be the case?

Nice progress!

What happens if you click the delete button without checking a radio button? :open_mouth:

It never gets to the if (bookmark.name === button.value && bookmark.category === categoryDropdown.value), not sure why. Therefore, it automatically deletes the last entry in the category

deleteBookmarkButton.addEventListener("click",  () => {
  let toRemove;
  let bookmarks = getBookmarks();
  radioButtons.forEach((button) => {
    if (button.checked) {
      bookmarks.forEach((bookmark) => {
        if (bookmark.name === button.value && bookmark.category === categoryDropdown.value) {
          console.log(`${bookmark.name}:${button.value}, ${bookmark.category}:${categoryDropdown.value}`)
          toRemove = bookmark;
        };
      });
    };
  });
  let tried = true;
  let index;
  try {
    console.log(bookmarks);
    index = bookmarks.indexOf(toRemove);
    bookmarks.splice(index, 1);
    console.log(bookmarks);
  } catch {
    tried = false;
  } finally {
    console.log(tried);
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    categoryList.innerHTML = "";
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</a></label>`;
      };
    });
  };
})

? Your delete button does not work.

Please read my message again? It’s about the delete button.

console.log(radioButtons.length)
0

Should radioButtons be empty?

Look at the code I shared and where I’ve added console logs.

I know that the delete button doesn’t work, that’s what I’m trying to fix. This is currently my code for that event listener:

deleteBookmarkButton.addEventListener("click",  () => {
  let toRemove;
  let bookmarks = getBookmarks();
  radioButtons.forEach((button) => {
    if (button.checked) {
      bookmarks.forEach((bookmark) => {
        if (bookmark.name === button.value && bookmark.category === categoryDropdown.value) {
          console.log(`${bookmark.name}:${button.value}, ${bookmark.category}:${categoryDropdown.value}`)
          toRemove = bookmark;
        };
      });
    };
  });
  let tried = true;
  let index;
  try {
    console.log(bookmarks);
    index = bookmarks.indexOf(toRemove);
    bookmarks.splice(index, 1);
    console.log(bookmarks);
  } catch {
    tried = false;
  } finally {
    console.log(tried);
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    categoryList.innerHTML = "";
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</a></label>`;
      };
    });
  };
})

I don’t know why radioButtons has nothing in it.

Where does radioButtons come from?

Where is it assigned? When is it assigned?

let radioButtons = document.querySelectorAll("#radio-button");

at the top of script.js:

let mainSection = document.getElementById("main-section");
let formSection = document.getElementById("form-section");
let addBookmarkButton = document.getElementById("add-bookmark-button");
let categoryName = document.querySelector(".category-name");
let categoryDropdown = document.getElementById("category-dropdown");
let closeFormButton = document.getElementById("close-form-button");
let addBookmarkButtonForm = document.getElementById("add-bookmark-button-form");
let nameElement = document.getElementById("name");
let urlElement = document.getElementById("url");
let viewCategoryButton = document.getElementById("view-category-button");
let categoryList = document.getElementById("category-list");
let closeListButton = document.getElementById("close-list-button");
let bookmarkListSection = document.getElementById("bookmark-list-section");
let deleteBookmarkButton = document.getElementById("delete-bookmark-button");
let radioButtons = document.querySelectorAll("#radio-button");

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

closeFormButton.addEventListener("click", () => {
  displayOrCloseForm();
})

addBookmarkButtonForm.addEventListener("click", () => {
  try {
    let bookmarks = JSON.parse(localStorage.getItem("bookmarks"));
    bookmarks.push({
      name: nameElement.value,
      category: categoryDropdown.value,
      url: urlElement.value,
    });
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    nameElement.value = "";
    urlElement.value = "";
    displayOrCloseForm();
  } catch {
    let bookmarks = [{
      name: nameElement.value, 
      category: categoryDropdown.value,
      url: urlElement.value,
    }];
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    nameElement.value = "";
    urlElement.value = "";
    displayOrCloseForm();
  };
})

viewCategoryButton.addEventListener("click", () => {
  let bookmarks = getBookmarks();
  let oneHas = false;
  if (bookmarks != []) {
    bookmarks.forEach((bookmark) => {
      let hasProperty = false;
      if (bookmark.category === categoryDropdown.value) {
        hasProperty = true;
      };
      if (hasProperty) {
        oneHas = true;
      };
    });
  };
  if (!oneHas) {
    categoryList.innerHTML = "<p>No Bookmarks Found</p>";
  } else {
    categoryList.innerHTML = "";
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</a></label>`;
      };
    });
  };
  categoryName.innerHTML = `${categoryDropdown.value}`;
  displayOrHideCategory();
})

closeListButton.addEventListener("click", () => {
  mainSection.classList.remove("hidden");
  bookmarkListSection.classList.add("hidden");
})

deleteBookmarkButton.addEventListener("click",  () => {
  console.log(radioButtons.length);
  let toRemove;
  let bookmarks = getBookmarks();
  radioButtons.forEach((button) => {
    if (button.checked) {
      bookmarks.forEach((bookmark) => {
        if (bookmark.name === button.value && bookmark.category === categoryDropdown.value) {
          console.log(`${bookmark.name}:${button.value}, ${bookmark.category}:${categoryDropdown.value}`)
          toRemove = bookmark;
        };
      });
    };
  });
  let tried = true;
  let index;
  try {
    console.log(bookmarks);
    index = bookmarks.indexOf(toRemove);
    bookmarks.splice(index, 1);
    console.log(bookmarks);
  } catch {
    tried = false;
  } finally {
    console.log(tried);
    localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    categoryList.innerHTML = "";
    bookmarks.forEach((bookmark) => {
      if (bookmark.category === categoryDropdown.value) {
        categoryList.innerHTML += `<input type="radio" id="${bookmark.name}" value="${bookmark.name}" name="radio-button"></input>
      <label for="${bookmark.name}"><a href="${bookmark.url}">${bookmark.name}</a></label>`;
      };
    });
  };
})

function getBookmarks() {
  try {
    let bookmarks = JSON.parse(localStorage.getItem("bookmarks"));
    let allValid;
    bookmarks.forEach((bookmark) => {
      let hasName = Object.hasOwn(bookmark, "name");
      let hasCategory = Object.hasOwn(bookmark, "category");
      let hasURL = Object.hasOwn(bookmark, "url");
      if (hasName && hasCategory && hasURL) {
        allValid = true;
      } else {
        allValid = false;
      };
    });
    return allValid ? bookmarks : [];
  } catch(error) {
    return [];
  };
}

function displayOrCloseForm() {
  if (mainSection.classList.contains("hidden")) {
    mainSection.classList.remove("hidden");
  } else {
    mainSection.classList.add("hidden");
  };
  if (formSection.classList.contains("hidden")) {
    formSection.classList.remove("hidden");
  } else {
    formSection.classList.add("hidden");
  }
}

function displayOrHideCategory() {
  if (mainSection.classList.contains("hidden")) {
    mainSection.classList.remove("hidden");
  } else {
    mainSection.classList.add("hidden");
  };
  if (bookmarkListSection.classList.contains("hidden")) {
    bookmarkListSection.classList.remove("hidden");
  } else {
    bookmarkListSection.classList.add("hidden");
  };
}