diff --git a/src/api/firebase.js b/src/api/firebase.js index 9d96534..83894f1 100644 --- a/src/api/firebase.js +++ b/src/api/firebase.js @@ -7,6 +7,7 @@ import { doc, onSnapshot, updateDoc, + deleteDoc, } from 'firebase/firestore'; import { useEffect, useState } from 'react'; import { db } from './config'; @@ -210,10 +211,13 @@ export async function updateItem( } } -export async function deleteItem() { - /** - * 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! - */ +export async function deleteItem(listPath, itemId) { + // reference the item path + const itemDocRef = doc(db, listPath, 'items', itemId); + try { + // delete the item from the database + await deleteDoc(itemDocRef); + } catch (error) { + throw new Error(`Failed updating item: ${error.message}`); + } } diff --git a/src/components/AddItems.jsx b/src/components/AddItems.jsx index 08558db..812d879 100644 --- a/src/components/AddItems.jsx +++ b/src/components/AddItems.jsx @@ -62,13 +62,10 @@ export function AddItems({ items }) { type="text" id="item-name" placeholder="Enter item name" - pattern="^[^\s].+[^\s]$" - > - Item Name: - - + label="Item Name:" + required={true} + /> + {Object.entries(daysUntilPurchaseOptions).map(([key, value]) => ( { + if (confirm(`Are you sure you want to delete this item?`)) { + try { + await deleteItem(listPath, id); + } catch (error) { + alert('Item was not deleted'); + } + } + return; + }; + return (
  • +
  • ); } diff --git a/src/components/TextInputElement.jsx b/src/components/TextInputElement.jsx index 10e7b62..4b76de1 100644 --- a/src/components/TextInputElement.jsx +++ b/src/components/TextInputElement.jsx @@ -16,6 +16,7 @@ const TextInputElement = ({ placeholder={placeholder} onChange={onChange} required={required} + pattern="^[^\s].+[^\s]$" />
    diff --git a/src/views/List.jsx b/src/views/List.jsx index 7ff9f94..194483e 100644 --- a/src/views/List.jsx +++ b/src/views/List.jsx @@ -1,12 +1,10 @@ import { ListItem } from '../components'; import { useState } from 'react'; -import { useStateWithStorage } from '../utils'; import { AddItems } from '../components/AddItems'; import TextInputElement from '../components/TextInputElement'; -export function List({ data }) { +export function List({ data, listPath }) { const [searchItem, setSearchItem] = useState(''); - const [listPath] = useStateWithStorage('tcl-shopping-list-path', null); const handleTextChange = (event) => { setSearchItem(event.target.value); @@ -20,12 +18,12 @@ export function List({ data }) { return ( <> - {!data.length ? ( + {!data?.length ? ( <>

    Welcome to {listName}!

    Ready to add your first item? Start adding below!

    - + ) : ( <> diff --git a/tests/List.test.jsx b/tests/List.test.jsx index b951d71..a4dd336 100644 --- a/tests/List.test.jsx +++ b/tests/List.test.jsx @@ -14,7 +14,7 @@ beforeEach(() => { describe('List Component', () => { test('renders the shopping list name, search field, and all list items from the data prop', () => { - render(); + render(); expect(screen.getByText('groceries')).toBeInTheDocument(); expect(screen.getByLabelText('Search Item:')).toBeInTheDocument(); @@ -25,7 +25,7 @@ describe('List Component', () => { }); test('shows welcome message and AddItems component when no items are present', () => { - render(); + render(); expect(screen.getByText('Welcome to groceries!')).toBeInTheDocument(); expect(screen.getByLabelText('Item Name:')).toBeInTheDocument();