import { Button, Container, MenuItem, Stack, TextField, Typography, InputAdornment, Dialog, DialogTitle, DialogContent, } from '@mui/material'; import SearchIcon from '@mui/icons-material/Search'; import { Link as RouterLink } from 'react-router-dom'; import { useEffect, useMemo, useState } from 'react'; import { v4 as uuidv4 } from 'uuid'; import { ProductRow } from '../components/ProductRow'; import { useCategories, useProducts } from '../hooks/dataHooks'; import { useDatabase } from '../context/DBProvider'; import { DEFAULT_BULK_NAME, DEFAULT_UNIT_TYPE } from '../models/Product'; import { BarcodeScannerView } from '../components/BarcodeScannerView'; export const ManageProductsScreen = () => { const db = useDatabase(); const products = useProducts(); const categories = useCategories(); const [search, setSearch] = useState(''); const [name, setName] = useState(''); const [category, setCategory] = useState(''); const [barcode, setBarcode] = useState(''); const [scannerOpen, setScannerOpen] = useState(false); const categoryOptions = useMemo(() => { const categoryNames = categories.map((item) => item.name); const productCategories = products.map((product) => product.category); return Array.from(new Set([...categoryNames, ...productCategories])); }, [categories, products]); useEffect(() => { if (categoryOptions.length === 0) return; if (!categoryOptions.includes(category)) { setCategory(categoryOptions[0]); } }, [category, categoryOptions]); const filtered = useMemo( () => products.filter((p) => `${p.name} ${p.category}`.toLowerCase().includes(search.toLowerCase()), ), [products, search], ); const addProduct = async () => { if (!name || !category) return; await db.products.add({ id: uuidv4(), name, category, unit_type: DEFAULT_UNIT_TYPE, bulk_name: DEFAULT_BULK_NAME, barcode: barcode || undefined, archived: false, created_at: Date.now(), updated_at: Date.now(), }); setName(''); setBarcode(''); }; const updateProduct = async ( productId: string, updates: { name: string; category: string; barcode?: string; }, ) => { await db.products.update(productId, { ...updates, unit_type: DEFAULT_UNIT_TYPE, bulk_name: DEFAULT_BULK_NAME, updated_at: Date.now(), }); }; const deleteProduct = async (productId: string) => { await db.products.delete(productId); }; return ( Manage Products setSearch(event.target.value)} InputProps={{ startAdornment: {} }} /> Add Product setName(event.target.value)} /> setCategory(event.target.value)} disabled={categoryOptions.length === 0} > {categoryOptions.map((cat) => ( {cat} ))} {barcode ? ( setBarcode(event.target.value)} InputProps={{ endAdornment: ( ), }} /> ) : ( )} {filtered.map((product) => ( ))} setScannerOpen(false)} fullWidth> Scan Barcode { setBarcode(code); setScannerOpen(false); }} /> ); };