diff --git a/src/App.jsx b/src/App.jsx index 8ccf14b..dcea2b7 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,5 +1,6 @@ import { useState, useEffect, useCallback, useContext, useRef } from "react"; import { AuthContext } from "./AuthContext"; +import { Search } from "lucide-react"; // Import pages/views import Login from "./pages/Login"; @@ -72,12 +73,14 @@ export default function CoffeeLogbook() { const [selectedBean, setSelectedBean] = useState(null); const [brewFilter, setBrewFilter] = useState("all"); const [editingBean, setEditingBean] = useState(null); + const [brewSearchQuery, setBrewSearchQuery] = useState(""); const [isOnline, setIsOnline] = useState(navigator.onLine); const [syncing, setSyncing] = useState(false); const [showSyncedStatus, setShowSyncedStatus] = useState(false); useEffect(() => { loadData().then(setData); }, []); + useEffect(() => { setBrewSearchQuery(""); }, [view]); const dataRef = useRef(data); dataRef.current = data; @@ -178,7 +181,37 @@ export default function CoffeeLogbook() { const addBrew = (form) => { persist({ ...data, brewLogs: [...allLogs, { id: uid(), createdAt: Date.now(), ...form, updatedAt: new Date().toISOString(), isDeleted: false }] }); setModal(null); }; const getBeanName = (id) => allBeans.find(b => b.id === id)?.name || "Unknown Bean"; - const filteredLogs = (brewFilter === "all" ? brewLogs : brewLogs.filter(l => l.method === brewFilter)).sort((a, b) => b.createdAt - a.createdAt); + const filteredLogs = (brewFilter === "all" ? brewLogs : brewLogs.filter(l => l.method === brewFilter)) + .filter(log => { + if (!brewSearchQuery) return true; + const dateObj = new Date(log.createdAt); + const weekday = dateObj.toLocaleDateString("en-US", { weekday: "long" }).toLowerCase(); + const month = dateObj.toLocaleDateString("en-US", { month: "long" }).toLowerCase(); + const monthShort = dateObj.toLocaleDateString("en-US", { month: "short" }).toLowerCase(); + const dateNum = dateObj.getDate().toString(); + const year = dateObj.getFullYear().toString(); + + const searchableText = [ + getBeanName(log.beanId).toLowerCase(), + METHOD_LABELS[log.method]?.toLowerCase() || "", + log.recipeDetails?.toLowerCase() || "", + log.tasteNotes?.toLowerCase() || "", + log.notes?.toLowerCase() || "", + log.grindSize?.toLowerCase() || log.grind?.toLowerCase() || "", + log.waterTemp?.toLowerCase() || "", + log.brewRatio?.toLowerCase() || log.ratio?.toLowerCase() || "", + log.brewTime?.toLowerCase() || log.time?.toLowerCase() || "", + weekday, + month, + monthShort, + dateNum, + year + ].join(" "); + + const queryWords = brewSearchQuery.trim().toLowerCase().split(/\s+/); + return queryWords.every(word => searchableText.includes(word)); + }) + .sort((a, b) => b.createdAt - a.createdAt); const methodCounts = { pourover: 0, espresso: 0, coldbrew: 0 }; brewLogs.forEach(l => { if (methodCounts[l.method] !== undefined) methodCounts[l.method]++; }); @@ -292,6 +325,33 @@ export default function CoffeeLogbook() { {/* ── Brew Logs ── */} {view === "brews" && (
Start brewing and log your recipes here.
++ {brewSearchQuery ? "Try refining your search terms or filters." : "Start brewing and log your recipes here."} +