import React, { useState, useRef, useEffect } from "react"; import { RotateCcw, Plus, Minus, Clock, Compass, Settings, Hand, ChevronLeft, ChevronRight, Bell, Moon, Globe, Info, CheckCircle2, Circle, Users, User, BookOpen } from "lucide-react"; const DHIKR_LIST = [ { id: "subhanallah", ar: "سُبْحَانَ اللَّه", label: "Subhanallah" }, { id: "alhamdulillah", ar: "الْحَمْدُ لِلَّه", label: "Alhamdulillah" }, { id: "allahuakbar", ar: "اللَّهُ أَكْبَر", label: "Allahu Akbar" }, { id: "astaghfirullah", ar: "أَسْتَغْفِرُ اللَّه", label: "Astaghfirullah" }, ]; const PRAYER_TIMES = [ { name: "Fajr", time: "04:32" }, { name: "Dhuhr", time: "12:14" }, { name: "Asr", time: "15:47" }, { name: "Maghrib", time: "18:21" }, { name: "Isha", time: "19:45" }, ]; const PRAYER_CONFIG = [ { id: "fajr", label: "ফজর", defaultRakat: 2 }, { id: "dhuhr", label: "যোহর", defaultRakat: 4 }, { id: "asr", label: "আসর", defaultRakat: 4 }, { id: "maghrib", label: "মাগরিব", defaultRakat: 3 }, { id: "isha", label: "এশা", defaultRakat: 4 }, ]; function StarPattern({ className }) { return ( ); } function TasbihTab() { const [activeDhikr, setActiveDhikr] = useState(0); const [counts, setCounts] = useState({ subhanallah: 0, alhamdulillah: 0, allahuakbar: 0, astaghfirullah: 0 }); const [target, setTarget] = useState(33); const [pulse, setPulse] = useState(false); const current = DHIKR_LIST[activeDhikr]; const count = counts[current.id]; const tap = () => { setCounts((c) => ({ ...c, [current.id]: c[current.id] + 1 })); setPulse(true); setTimeout(() => setPulse(false), 140); }; const reset = () => setCounts((c) => ({ ...c, [current.id]: 0 })); const cycleTarget = () => setTarget((t) => (t === 33 ? 99 : t === 99 ? 100 : 33)); const progress = Math.min(count / target, 1); const circumference = 2 * Math.PI * 88; return (
{current.ar}
{current.label}
{count} of {target}
{DHIKR_LIST.map((d, i) => ( ))}
); } function PrayerTab() { const now = "14:02"; return (
Next Prayer
Asr · 15:47
in 1h 45m
{PRAYER_TIMES.map((p, i) => (
{p.name} {p.time}
))}
Sample times shown — connecting real location & calculation method needs a prayer-times API.
); } function QiblaTab() { const [angle] = useState(292); return (
Qibla Direction
{angle}° from North
{["N", "E", "S", "W"].map((dir, i) => ( {dir} ))}
A live compass needs device orientation permission, which only works when this runs as an installed app on a phone.
); } function PrayerCard({ config, data, onChange }) { const { done, rakat, mode } = data; return (
{done && (
{rakat}
)}
{done && (
)}
); } function AmolTab() { const [prayers, setPrayers] = useState({ fajr: { done: false, rakat: 2, mode: "jamaat" }, dhuhr: { done: false, rakat: 4, mode: "jamaat" }, asr: { done: false, rakat: 4, mode: "jamaat" }, maghrib: { done: false, rakat: 3, mode: "jamaat" }, isha: { done: false, rakat: 4, mode: "jamaat" }, }); const [tahajjud, setTahajjud] = useState({ done: false, rakat: 2 }); const [quran, setQuran] = useState({ done: false, from: "", to: "" }); const updatePrayer = (id, data) => setPrayers((p) => ({ ...p, [id]: data })); const totalRakat = Object.values(prayers).reduce((s, p) => s + (p.done ? p.rakat : 0), 0) + (tahajjud.done ? tahajjud.rakat : 0); const jamaatCount = Object.values(prayers).filter((p) => p.done && p.mode === "jamaat").length; const ishaDone = prayers.isha.done; return (
আজকের আমল
{totalRakat} রাকাত আদায়
{jamaatCount} ওয়াক্ত জামায়াতে
{PRAYER_CONFIG.map((cfg) => ( updatePrayer(cfg.id, d)} /> ))} {ishaDone && (
{tahajjud.done && (
{tahajjud.rakat}
)}
)} {!ishaDone && (
এশা আদায় করলে তাহাজ্জুদ অপশন চালু হবে
)}
{quran.done && (
setQuran((q) => ({ ...q, from: e.target.value }))} placeholder="শুরু — যেমন: সূরা বাকারা, আয়াত ১" className="text-xs px-3 py-2 rounded-lg bg-[#F8F2E4] border border-[#E2D6B8] text-[#3A362B] placeholder-[#B3A583] outline-none" /> setQuran((q) => ({ ...q, to: e.target.value }))} placeholder="শেষ — যেমন: সূরা বাকারা, আয়াত ২০" className="text-xs px-3 py-2 rounded-lg bg-[#F8F2E4] border border-[#E2D6B8] text-[#3A362B] placeholder-[#B3A583] outline-none" />
)}
); } function ToggleRow({ icon: Icon, label, sub, value, onChange }) { return (
{label}
{sub &&
{sub}
}
); } function SettingsTab() { const [notif, setNotif] = useState(true); const [dark, setDark] = useState(false); const [arabic, setArabic] = useState(true); return (
Preferences
Noor
Prototype v0.1 · demo data only
); } export default function NoorApp() { const [tab, setTab] = useState("tasbih"); const tabs = [ { id: "tasbih", label: "Tasbih", icon: Hand }, { id: "prayer", label: "Prayer", icon: Clock }, { id: "amol", label: "Amol", icon: BookOpen }, { id: "qibla", label: "Qibla", icon: Compass }, { id: "settings", label: "Settings", icon: Settings }, ]; return (
{/* Header */}
Noor
A
{/* Content */}
{tab === "tasbih" && } {tab === "prayer" && } {tab === "amol" && } {tab === "qibla" && } {tab === "settings" && }
{/* Bottom nav */}
{tabs.map((t) => { const Icon = t.icon; const active = tab === t.id; return ( ); })}
); }