From a008115f4cc32c1828e5b6e0780f46be1a832e14 Mon Sep 17 00:00:00 2001 From: Shuveksha Tuladhar Date: Tue, 17 Sep 2024 16:42:06 -0700 Subject: [PATCH] feat(#12): Added a delete button with functionality, as well as handle JS confirm dialog and shows user a message accordingly. --- src/api/firebase.js | 5 ++++- src/components/ListItem.jsx | 22 +++++++++++++++++++++- src/views/List.jsx | 5 +++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/api/firebase.js b/src/api/firebase.js index 51bcd91..6a59949 100644 --- a/src/api/firebase.js +++ b/src/api/firebase.js @@ -7,6 +7,7 @@ import { onSnapshot, updateDoc, addDoc, + deleteDoc, } from 'firebase/firestore'; import { useEffect, useState } from 'react'; import { db } from './config'; @@ -233,10 +234,12 @@ export async function updateItem( }); } -export async function deleteItem() { +export async function deleteItem(listPath, itemId) { /** * TODO: Fill this out so that it uses the correct Firestore function * to delete an existing item. You'll need to figure out what arguments * this function must accept! */ + const itemDocRef = doc(db, listPath, `items`, itemId); + await deleteDoc(itemDocRef); } diff --git a/src/components/ListItem.jsx b/src/components/ListItem.jsx index 94eb733..8be10fb 100644 --- a/src/components/ListItem.jsx +++ b/src/components/ListItem.jsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import { useToggle } from '@uidotdev/usehooks'; import { Toggle } from './Toggle.jsx'; import './ListItem.css'; -import { updateItem } from '../api/firebase.js'; +import { updateItem, deleteItem } from '../api/firebase.js'; export function ListItem({ name, @@ -12,9 +12,11 @@ export function ListItem({ dateLastPurchased, purchaseInterval, dateCreated, + setMessage, }) { const [purchased, setPurchased] = useToggle(false); const [isDisabled, setIsDisabled] = useState(false); + useEffect(() => { if (dateLastPurchased) { const checkExpiration = () => { @@ -59,6 +61,21 @@ export function ListItem({ } }; + const handleDelete = async () => { + const deleteConfirm = window.confirm( + `Are you sure you want to delete ${name}?`, + ); + + if (deleteConfirm) { + try { + await deleteItem(listPath, itemId); + setMessage(`${name} has been deleted successfully!`); + } catch (error) { + console.log(`Error:`, error); + } + } + }; + return ( <>
  • @@ -72,6 +89,9 @@ export function ListItem({ /> {dateLastPurchased ? dateLastPurchased.toDate().toLocaleString() : ''} +
  • ); diff --git a/src/views/List.jsx b/src/views/List.jsx index 74aed42..6710920 100644 --- a/src/views/List.jsx +++ b/src/views/List.jsx @@ -4,6 +4,8 @@ import { NavLink } from 'react-router-dom'; export function List({ data, listPath }) { const [searchInput, setSearchInput] = useState(''); + const [message, setMessage] = useState(''); + const handleInputChange = (e) => { setSearchInput(e.target.value); }; @@ -62,6 +64,7 @@ export function List({ data, listPath }) { dateLastPurchased={item.dateLastPurchased} purchaseInterval={item.purchaseInterval} dateCreated={item.dateCreated} + setMessage={setMessage} /> ); }) @@ -71,6 +74,8 @@ export function List({ data, listPath }) { No items found! Add item )} +
    + {message} );