Stop_smoking_website_ver2/src/components/DailyInspirationCard.tsx

187 lines
10 KiB
TypeScript

'use client';
import { useState, useMemo } from 'react';
import { Sparkles, Settings, BookOpen, Quote as QuoteIcon, Check } from 'lucide-react';
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { savePreferencesAsync, getPreferences, UserPreferences } from '@/lib/storage';
type Religion = 'christian' | 'secular';
interface Verse {
text: string;
source: string;
}
const VERSES: Record<Religion, Verse[]> = {
christian: [
{ text: "I can do all things through Christ which strengtheneth me.", source: "Philippians 4:13 (KJV)" },
{ text: "For God hath not given us the spirit of fear; but of power, and of love, and of a sound mind.", source: "2 Timothy 1:7 (KJV)" },
{ text: "But they that wait upon the LORD shall renew their strength; they shall mount up with wings as eagles.", source: "Isaiah 40:31 (KJV)" },
{ text: "Be strong and of a good courage; be not afraid, neither be thou dismayed: for the LORD thy God is with thee whithersoever thou goest.", source: "Joshua 1:9 (KJV)" },
{ text: "The LORD is my shepherd; I shall not want.", source: "Psalm 23:1 (KJV)" },
{ text: "Trust in the LORD with all thine heart; and lean not unto thine own understanding.", source: "Proverbs 3:5 (KJV)" },
{ text: "And be not conformed to this world: but be ye transformed by the renewing of your mind.", source: "Romans 12:2 (KJV)" },
{ text: "Cast thy burden upon the LORD, and he shall sustain thee.", source: "Psalm 55:22 (KJV)" },
{ text: "Fear thou not; for I am with thee: be not dismayed; for I am thy God: I will strengthen thee.", source: "Isaiah 41:10 (KJV)" },
{ text: "Come unto me, all ye that labour and are heavy laden, and I will give you rest.", source: "Matthew 11:28 (KJV)" },
{ text: "The name of the LORD is a strong tower: the righteous runneth into it, and is safe.", source: "Proverbs 18:10 (KJV)" },
{ text: "Peace I leave with you, my peace I give unto you: not as the world giveth, give I unto you.", source: "John 14:27 (KJV)" },
{ text: "If God be for us, who can be against us?", source: "Romans 8:31 (KJV)" },
{ text: "He healeth the broken in heart, and bindeth up their wounds.", source: "Psalm 147:3 (KJV)" },
{ text: "Wait on the LORD: be of good courage, and he shall strengthen thine heart.", source: "Psalm 27:14 (KJV)" },
{ text: "My flesh and my heart faileth: but God is the strength of my heart, and my portion for ever.", source: "Psalm 73:26 (KJV)" },
{ text: "God is our refuge and strength, a very present help in trouble.", source: "Psalm 46:1 (KJV)" },
{ text: "In him was life; and the life was the light of men.", source: "John 1:4 (KJV)" },
{ text: "Therefore if any man be in Christ, he is a new creature: old things are passed away; behold, all things are become new.", source: "2 Corinthians 5:17 (KJV)" },
{ text: "The LORD shall fight for you, and ye shall hold your peace.", source: "Exodus 14:14 (KJV)" },
],
secular: [
{ text: "The only way to do great work is to love what you do.", source: "Steve Jobs" },
{ text: "It is during our darkest moments that we must focus to see the light.", source: "Aristotle" },
{ text: "The greatest glory in living lies not in never falling, but in rising every time we fall.", source: "Nelson Mandela" },
{ text: "In the middle of difficulty lies opportunity.", source: "Albert Einstein" },
{ text: "What you get by achieving your goals is not as important as what you become by achieving your goals.", source: "Zig Ziglar" },
{ text: "The future belongs to those who believe in the beauty of their dreams.", source: "Eleanor Roosevelt" },
{ text: "It does not matter how slowly you go as long as you do not stop.", source: "Confucius" },
{ text: "Everything you've ever wanted is on the other side of fear.", source: "George Addair" },
{ text: "The best time to plant a tree was 20 years ago. The second best time is now.", source: "Chinese Proverb" },
{ text: "You are never too old to set another goal or to dream a new dream.", source: "C.S. Lewis" },
{ text: "The only impossible journey is the one you never begin.", source: "Tony Robbins" },
{ text: "Success is not final, failure is not fatal: it is the courage to continue that counts.", source: "Winston Churchill" },
{ text: "Believe you can and you're halfway there.", source: "Theodore Roosevelt" },
{ text: "The pain you feel today will be the strength you feel tomorrow.", source: "Arnold Schwarzenegger" },
{ text: "Your life does not get better by chance, it gets better by change.", source: "Jim Rohn" },
{ text: "The secret of change is to focus all of your energy not on fighting the old, but on building the new.", source: "Socrates" },
{ text: "What lies behind us and what lies before us are tiny matters compared to what lies within us.", source: "Ralph Waldo Emerson" },
{ text: "The man who moves a mountain begins by carrying away small stones.", source: "Confucius" },
{ text: "Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.", source: "Thomas Edison" },
{ text: "Fall seven times, stand up eight.", source: "Japanese Proverb" },
]
};
interface DailyInspirationCardProps {
initialReligion?: Religion | null;
onReligionChange?: (religion: Religion) => void;
}
export function DailyInspirationCard({ initialReligion, onReligionChange }: DailyInspirationCardProps) {
const [currentReligion, setCurrentReligion] = useState<Religion>(initialReligion || 'secular');
// Get a quote based on the day of the year and selected religion
const dailyVerse = useMemo(() => {
const verses = VERSES[currentReligion];
const now = new Date();
const start = new Date(now.getFullYear(), 0, 0);
const diff = now.getTime() - start.getTime();
const oneDay = 1000 * 60 * 60 * 24;
const dayOfYear = Math.floor(diff / oneDay);
return verses[dayOfYear % verses.length];
}, [currentReligion]);
const handleReligionChange = async (religion: Religion) => {
setCurrentReligion(religion);
// Save to backend if we can
const prefs = getPreferences();
if (prefs) {
const updatedPrefs: UserPreferences = {
...prefs,
religion: religion
};
await savePreferencesAsync(updatedPrefs);
}
if (onReligionChange) {
onReligionChange(religion);
}
};
const getLabel = (r: Religion) => {
switch (r) {
case 'christian': return 'Christian (KJV)';
case 'secular': return 'Secular (Quotes)';
}
};
const getIcon = () => {
if (currentReligion === 'christian') {
return <BookOpen className="h-4 w-4 text-yellow-300 animate-pulse-subtle" />;
}
return <Sparkles className="h-4 w-4 text-yellow-300 animate-pulse-subtle" />;
};
const getBackground = () => {
if (currentReligion === 'christian') {
return 'linear-gradient(135deg, rgba(59, 130, 246, 0.35) 0%, rgba(37, 99, 235, 0.3) 50%, rgba(30, 64, 175, 0.4) 100%)'; // Blue
}
return 'linear-gradient(135deg, rgba(67, 56, 202, 0.35) 0%, rgba(109, 40, 217, 0.3) 50%, rgba(76, 29, 149, 0.4) 100%)'; // Indigo/Original
};
const getShadowColor = () => {
if (currentReligion === 'christian') {
return 'rgba(59, 130, 246, 0.15)';
}
return 'rgba(99, 102, 241, 0.15)';
};
return (
<div
className="flex-1 flex flex-col justify-center p-3 sm:p-5 rounded-xl border border-white/10 min-h-[100px] sm:min-h-[120px] relative overflow-hidden group"
style={{
background: getBackground(),
boxShadow: `inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 4px 20px ${getShadowColor()}`
}}
>
<div className="absolute top-0 right-0 w-24 h-24 sm:w-32 sm:h-32 bg-gradient-to-br from-white/10 to-transparent rounded-full -translate-y-1/2 translate-x-1/2" />
<div className="relative z-10">
<div className="flex items-center justify-between mb-2 sm:mb-3">
<div className="flex items-center gap-2">
{getIcon()}
<span className="text-xs font-semibold text-white/80 uppercase tracking-wider">
{currentReligion === 'secular' ? 'Daily Inspiration' : 'Daily Verse'}
</span>
</div>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="ghost"
size="icon"
className="h-6 w-6 text-white/50 hover:text-white hover:bg-white/10 rounded-full"
>
<Settings className="h-3.5 w-3.5" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{(['christian', 'secular'] as Religion[]).map((r) => (
<DropdownMenuItem
key={r}
onClick={() => handleReligionChange(r)}
className="flex items-center justify-between gap-2"
>
<span>{getLabel(r)}</span>
{currentReligion === r && <Check className="h-4 w-4" />}
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
</div>
<p className="text-xs sm:text-sm font-medium text-white leading-relaxed mb-2 sm:mb-3 text-shadow-sm italic">
&ldquo;{dailyVerse.text}&rdquo;
</p>
<p className="text-[10px] sm:text-xs text-white/70 font-medium">
{dailyVerse.source}
</p>
</div>
</div >
);
}