Add Prayer Times, Dhikr counter, Quran tracker with mobile UI overhaul

- Prayer times page: arc progress ring, next-prayer countdown, clean prayer list
- Dhikr counter: SVG ring with glow, 3-phase sequence (SubhanAllah/Alhamdulillah/AllahuAkbar), streak tracking
- Daily Quran reading tracker API routes (GET/POST)
- Bottom nav updated: Prayer + Dhikr tabs, Repeat2 icon for dhikr, Moon for prayer
- Home page redirects to /prayer as primary entry point
- Dockerfile: openssl added to builder stage, explicit prisma schema path fixes build
- Schema: dhikrStreak, quranStreak on User; DhikrSession and QuranReading models
- Stub wallet top-up checkout to fix TypeScript build error

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
FalahMobile
2026-06-15 08:05:51 +01:00
commit e2365e29fe
60 changed files with 5591 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
export type CoachPersona = 'nurbuddy' | 'ghazali' | 'ibnabbas' | 'rabia'
interface ScholarPersona {
id: CoachPersona
name: string
title: string
era: string
greeting: string
}
export const SCHOLAR_PERSONAS: Record<CoachPersona, ScholarPersona> = {
nurbuddy: {
id: 'nurbuddy',
name: 'NurBuddy',
title: 'Islamic Knowledge Companion',
era: 'Contemporary',
greeting: 'Assalamu alaikum! I am NurBuddy. Ask me anything about Islam.',
},
ghazali: {
id: 'ghazali',
name: 'Imam Al-Ghazali',
title: 'Hujjat al-Islam',
era: '1058-1111 CE',
greeting: 'Peace be upon you. I am Al-Ghazali. Ask what you seek to know.',
},
ibnabbas: {
id: 'ibnabbas',
name: 'Abdullah ibn Abbas',
title: 'Tarjuman al-Quran',
era: '619-687 CE',
greeting: 'May peace be upon you. I am Ibn Abbas. Ask, and I will share from the Book and the Sunnah.',
},
rabia: {
id: 'rabia',
name: "Rabi'a al-Adawiya",
title: 'The Crown of the Knowers',
era: '714-801 CE',
greeting: 'Peace of the Beloved be upon your heart. I am Rabi\'a. Ask what your heart seeks.',
},
}
export const PERSONA_ICONS: Record<CoachPersona, string> = {
nurbuddy: 'Bot',
ghazali: 'Scroll',
ibnabbas: 'Crown',
rabia: 'Heart',
}
export const PERSONA_COLORS: Record<CoachPersona, string> = {
nurbuddy: 'text-[#D4AF37]',
ghazali: 'text-amber-400',
ibnabbas: 'text-emerald-400',
rabia: 'text-rose-400',
}