From a619d44eca67ab90d5c39724e0cc7b8e6189a8cb Mon Sep 17 00:00:00 2001 From: Aditya Gupta Date: Sat, 6 Jun 2026 10:51:13 +0530 Subject: [PATCH] refactor: everything --- src/App.jsx | 388 ++------------------------------- src/components/BeanDetail.jsx | 33 +++ src/components/BeanForm.jsx | 59 +++++ src/components/BottomNav.jsx | 42 ++++ src/components/BrewCard.jsx | 36 +++ src/components/BrewForm.jsx | 90 ++++++++ src/components/CreateModal.jsx | 32 +++ src/constants.js | 8 + src/{ => pages}/Login.jsx | 6 +- src/pages/ProfilePage.jsx | 73 +++++++ src/{ => pages}/Register.jsx | 6 +- 11 files changed, 394 insertions(+), 379 deletions(-) create mode 100644 src/components/BeanDetail.jsx create mode 100644 src/components/BeanForm.jsx create mode 100644 src/components/BottomNav.jsx create mode 100644 src/components/BrewCard.jsx create mode 100644 src/components/BrewForm.jsx create mode 100644 src/components/CreateModal.jsx create mode 100644 src/constants.js rename src/{ => pages}/Login.jsx (88%) create mode 100644 src/pages/ProfilePage.jsx rename src/{ => pages}/Register.jsx (92%) diff --git a/src/App.jsx b/src/App.jsx index 28a162e..d48c629 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,7 +1,22 @@ import { useState, useEffect, useCallback, useContext, useRef } from "react"; import { AuthContext } from "./AuthContext"; -import Login from "./Login"; -import Register from "./Register"; + +// Import pages/views +import Login from "./pages/Login"; +import Register from "./pages/Register"; +import ProfilePage from "./pages/ProfilePage"; + +// Import refactored components +import CreateModal from "./components/CreateModal"; +import BeanForm from "./components/BeanForm"; +import BrewForm from "./components/BrewForm"; +import BeanDetail from "./components/BeanDetail"; +import BrewCard from "./components/BrewCard"; +import BottomNav from "./components/BottomNav"; + + +// Import constants +import { METHODS, METHOD_LABELS, METHOD_ICONS, METHOD_COLORS } from "./constants"; // ─── Storage helpers ─── const STORAGE_KEY = "coffee-logbook-data"; @@ -37,375 +52,6 @@ async function saveData(data) { const uid = () => Date.now().toString(36) + Math.random().toString(36).slice(2, 7); -const ROAST_TYPES = ["Light", "Light-Medium", "Medium", "Medium-Dark", "Dark"]; -const METHODS = ["pourover", "espresso", "coldbrew"]; -const METHOD_LABELS = { pourover: "Pour Over", espresso: "Espresso", coldbrew: "Cold Brew" }; -const METHOD_ICONS = { pourover: "☕", espresso: "⚡", coldbrew: "❄️" }; -const METHOD_COLORS = { pourover: "#8B6914", espresso: "#5C3317", coldbrew: "#2F4F6F" }; - -const inputCls = "w-full px-3.5 py-3 border border-[#E8DFD3] rounded-lg bg-white text-sm text-[#2C1810] transition-colors outline-none focus:border-[#8B6914]"; -const labelCls = "block text-[10px] font-semibold uppercase tracking-wider text-[#6B5744] mb-1.5"; - -// ─── Create Modal ─── -function CreateModal({ onClose, onAddBean, onAddBrew }) { - return ( -
-
e.stopPropagation()}> -
-
What would you like to add?
-
- - -
-
-
- ); -} - -// ─── Bean Form ─── -function BeanForm({ onSave, onClose, initial }) { - const [form, setForm] = useState(initial || { name: "", roastery: "", roastDate: "", roastType: "", image: "", tastingNotes: "" }); - const set = (k, v) => setForm(p => ({ ...p, [k]: v })); - const canSave = form.name.trim().length > 0; - - const handleImage = (e) => { - const file = e.target.files?.[0]; - if (!file) return; - if (file.size > 2 * 1024 * 1024) { alert("Image must be under 2 MB"); return; } - const reader = new FileReader(); - reader.onload = () => set("image", reader.result); - reader.readAsDataURL(file); - }; - - return ( -
-
e.stopPropagation()}> -
-
{initial ? "Edit Bean" : "Add Bean"}
-
- set("name", e.target.value)} />
-
- set("roastery", e.target.value)} />
-
-
- set("roastDate", e.target.value)} />
-
-
-
-
- -
- {form.image ? ( - <>Bean - - ) : (<>
📷
Tap to upload a photo
)} - -
-
Max 2 MB · JPG, PNG, or WebP
-
-
-