diff --git a/src/components/AddProductDialog.tsx b/src/components/AddProductDialog.tsx index c1e53e5..4fc8ffd 100644 --- a/src/components/AddProductDialog.tsx +++ b/src/components/AddProductDialog.tsx @@ -15,6 +15,7 @@ import { import CloseIcon from '@mui/icons-material/Close'; import { v4 as uuidv4 } from 'uuid'; import { useDatabase } from '../context/DBProvider'; +import { useProducts } from '../hooks/dataHooks'; import { BarcodeScannerView } from './BarcodeScannerView'; import { ExternalProductInfo, fetchProductFromOFF } from '../modules/openFoodFacts'; import { DEFAULT_BULK_NAME, DEFAULT_UNIT_TYPE, Product } from '../models/Product'; @@ -35,6 +36,7 @@ export const AddProductDialog = ({ initialBarcode, }: AddProductDialogProps) => { const db = useDatabase(); + const products = useProducts(); const [name, setName] = useState(''); const [category, setCategory] = useState(''); const [barcode, setBarcode] = useState(''); @@ -83,20 +85,26 @@ export const AddProductDialog = ({ const findBarcodeConflict = useCallback( async (value?: string) => { if (!value) return undefined; - const conflict = await db.products.where('barcode').equals(value).first(); - return conflict ?? undefined; + const conflict = products.find((product) => product.barcode === value); + if (conflict) return conflict; + const dbConflict = await db.products.where('barcode').equals(value).first(); + return dbConflict ?? undefined; }, - [db.products], + [db.products, products], ); const findNameConflict = useCallback( async (value?: string) => { if (!value) return undefined; const normalizedValue = value.trim().toLowerCase(); - const conflict = await db.products.filter((product) => product.name.trim().toLowerCase() === normalizedValue).first(); - return conflict ?? undefined; + const conflict = products.find((product) => product.name.trim().toLowerCase() === normalizedValue); + if (conflict) return conflict; + const dbConflict = await db.products + .filter((product) => product.name.trim().toLowerCase() === normalizedValue) + .first(); + return dbConflict ?? undefined; }, - [db.products], + [db.products, products], ); const assertUniqueBarcode = useCallback( @@ -254,7 +262,14 @@ export const AddProductDialog = ({ }; return ( - + Add product diff --git a/src/screens/__tests__/ManageProductsScreen.addAndUpdate.test.tsx b/src/screens/__tests__/ManageProductsScreen.addAndUpdate.test.tsx index 73dc3b1..f947632 100644 --- a/src/screens/__tests__/ManageProductsScreen.addAndUpdate.test.tsx +++ b/src/screens/__tests__/ManageProductsScreen.addAndUpdate.test.tsx @@ -58,6 +58,7 @@ describe('ManageProductsScreen add and update flows', () => { , ); + await user.click(screen.getByRole('button', { name: /add product/i })); await user.type(screen.getByLabelText(/name/i), 'New Product'); await selectCategory(user, 'Snacks'); await user.type(screen.getByLabelText(/barcode/i), '111'); @@ -91,6 +92,7 @@ describe('ManageProductsScreen add and update flows', () => { , ); + await user.click(screen.getByRole('button', { name: /add product/i })); await user.type(screen.getByLabelText(/name/i), 'Another'); await selectCategory(user, 'Snacks'); await user.click(screen.getByText(/scan barcode/i)); @@ -139,6 +141,7 @@ describe('ManageProductsScreen add and update flows', () => { , ); + await user.click(screen.getByRole('button', { name: /add product/i })); await user.type(screen.getByLabelText(/name/i), 'Lettuce'); await selectCategory(user, 'Fresh'); await clickSaveButton(user);