import React, { useState, useEffect, useRef } from "react"; import { fetchHoroscopeData, fallbackHoroscopeContent, } from "./services/horoscopeService"; // Zodiac Icon Components using Tabler Icons SVGs const ZodiacIcon = ({ sign, size = 24, className = "" }) => { const iconPaths = { taurus: [ "M6 3a6 6 0 0 0 12 0", "M12 15m-6 0a6 6 0 1 0 12 0a6 6 0 1 0 -12 0", ], sagittarius: ["M4 20l16 -16", "M13 4h7v7", "M6.5 12.5l5 5"], pisces: ["M5 3a21 21 0 0 1 0 18", "M19 3a21 21 0 0 0 0 18", "M5 12l14 0"], libra: ["M5 20l14 0", "M5 17h5v-.3a7 7 0 1 1 4 0v.3h5"], gemini: [ "M3 3a21 21 0 0 0 18 0", "M3 21a21 21 0 0 1 18 0", "M7 4.5l0 15", "M17 4.5l0 15", ], leo: [ "M13 17a4 4 0 1 0 8 0", "M6 16m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0", "M11 7m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0", "M7 7c0 3 2 5 2 9", "M15 7c0 4 -2 6 -2 10", ], virgo: [ "M3 4a2 2 0 0 1 2 2v9", "M5 6a2 2 0 0 1 4 0v9", "M9 6a2 2 0 0 1 4 0v10a7 5 0 0 0 7 5", "M12 21a7 5 0 0 0 7 -5v-2a3 3 0 0 0 -6 0", ], aquarius: [ "M3 10l3 -3l3 3l3 -3l3 3l3 -3l3 3", "M3 17l3 -3l3 3l3 -3l3 3l3 -3l3 3", ], aries: ["M12 5a5 5 0 1 0 -4 8", "M16 13a5 5 0 1 0 -4 -8", "M12 21l0 -16"], cancer: [ "M6 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0", "M18 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0", "M3 12a10 6.5 0 0 1 14 -6.5", "M21 12a10 6.5 0 0 1 -14 6.5", ], scorpio: [ "M3 4a2 2 0 0 1 2 2v9", "M5 6a2 2 0 0 1 4 0v9", "M9 6a2 2 0 0 1 4 0v10a3 3 0 0 0 3 3h5l-3 -3m0 6l3 -3", ], capricorn: [ "M4 4a3 3 0 0 1 3 3v9", "M7 7a3 3 0 0 1 6 0v11a3 3 0 0 1 -3 3", "M16 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0", ], }; const paths = iconPaths[sign] || []; return ( {paths.map((path, index) => ( ))} ); }; const HoroscopeApp = () => { const [selectedSign, setSelectedSign] = useState("virgo"); const [selectedGender, setSelectedGender] = useState("female"); const [selectedPeriod, setSelectedPeriod] = useState("today"); const [selectedCategory, setSelectedCategory] = useState("overall"); const [isDarkMode, setIsDarkMode] = useState(false); const [horoscopeData, setHoroscopeData] = useState(null); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const zodiacScrollRef = useRef(null); const loadHoroscopeData = async (category, period) => { setIsLoading(true); setError(null); try { const data = await fetchHoroscopeData(category, period); if (data && data.data) { setHoroscopeData(data); } else { setHoroscopeData(null); setError("No data available from GitHub, using fallback content"); } } catch (err) { setError("Failed to load horoscope data"); setHoroscopeData(null); } finally { setIsLoading(false); } }; const zodiacSigns = [ { id: "aries", name: "Aries", dates: "Mar 21 - Apr 19", emoji: "🐏", symbol: "β™ˆ", imageFile: "ARIES.png", }, { id: "taurus", name: "Taurus", dates: "April 20 - May 20", emoji: "πŸ‚", symbol: "♉", imageFile: "TAURUS.png", }, { id: "gemini", name: "Gemini", dates: "May 21 - Jun 20", emoji: "πŸ‘―", symbol: "β™Š", imageFile: "GEMINI.png", }, { id: "cancer", name: "Cancer", dates: "Jun 21 - Jul 22", emoji: "πŸ¦€", symbol: "β™‹", imageFile: "CANCER.png", }, { id: "leo", name: "Leo", dates: "Jul 23 - Aug 22", emoji: "🦁", symbol: "β™Œ", imageFile: "LEO.png", }, { id: "virgo", name: "Virgo", dates: "Aug 23 - Sep 22", emoji: "πŸ‘Έ", symbol: "♍", imageFile: "VIRGO.png", }, { id: "libra", name: "Libra", dates: "Sep 23 - Oct 22", emoji: "βš–οΈ", symbol: "β™Ž", imageFile: "LIBRA.png", }, { id: "scorpio", name: "Scorpio", dates: "Oct 23 - Nov 21", emoji: "πŸ¦‚", symbol: "♏", imageFile: "SCORPIO.png", }, { id: "sagittarius", name: "Sagittarius", dates: "Nov 22 - Dec 21", emoji: "🏹", symbol: "♐", imageFile: "SAGITTARIUS.png", }, { id: "capricorn", name: "Capricorn", dates: "Dec 22 - Jan 19", emoji: "🐐", symbol: "β™‘", imageFile: "CAPRICORN.png", }, { id: "aquarius", name: "Aquarius", dates: "Jan 20 - Feb 18", emoji: "🏺", symbol: "β™’", imageFile: "AQUARIUS.png", }, { id: "pisces", name: "Pisces", dates: "Feb 19 - Mar 20", emoji: "🐠", symbol: "β™“", imageFile: "PISCES.png", }, ]; const periods = [ { id: "today", name: "Today" }, { id: "week", name: "Week" }, { id: "month", name: "Month" }, { id: "year", name: "Year" }, ]; const categories = [ { id: "overall", name: "Overall", icon: , }, { id: "fortune", name: "Fortune", icon: , }, { id: "health", name: "Health", icon: , }, { id: "love", name: "Love", icon: }, { id: "finance", name: "Finance", icon: , }, { id: "relationship", name: "Relationship", icon: , }, ]; // const horoscopeContent = { // overall: { // today: // "Today brings a harmonious blend of opportunities and challenges across all aspects of your life. Your natural instincts will guide you well.", // week: "This week promises balanced growth in multiple areas. Trust your intuition as you navigate new experiences.", // month: // "A month of significant personal development awaits. Embrace change and new perspectives with confidence.", // year: "This year marks a transformative period of growth, bringing profound insights and meaningful achievements.", // }, // love: { // today: // "Love is in the air today! Your romantic side is highlighted, making it a perfect day for expressing your feelings.", // week: "This week brings romantic opportunities and deepening connections with your loved ones.", // month: // "A month of passionate encounters and meaningful relationships awaits you.", // year: "This year will be transformative for your love life, bringing lasting happiness.", // }, // health: { // today: // "Your energy levels are high today. Focus on maintaining balance between work and rest.", // week: "Pay attention to your physical wellbeing this week. Small changes can make big differences.", // month: // "This month emphasizes the importance of mental and physical health harmony.", // year: "A year of wellness and vitality lies ahead. Make health your priority.", // }, // relationship: { // today: // "Relationships flourish under today's cosmic energy. Communication is key to success.", // week: "Strengthen your bonds with family and friends through meaningful conversations.", // month: // "Social connections expand this month, bringing new friendships and opportunities.", // year: "Your social circle will grow significantly, enriching your life in unexpected ways.", // }, // finance: { // today: // "Financial opportunities present themselves today. Stay alert for new possibilities.", // week: "This week favors careful financial planning and smart investments.", // month: // "Money matters require attention this month. Budget wisely for future security.", // year: "Financial growth and stability are highlighted throughout this year.", // }, // fortune: { // today: // "Lucky energies surround you today. Trust your instincts and take calculated risks for unexpected rewards.", // week: "Fortune favors the bold this week. Positive surprises and serendipitous encounters await.", // month: // "A month of abundance and good fortune unfolds. Opportunities align perfectly with your goals.", // year: "This year brings remarkable luck and prosperity. Your efforts will be rewarded beyond expectations.", // }, // }; // Function to get image path based on gender const getImagePath = (sign) => { if (!sign.imageFile) return null; return `/img/${selectedGender}/${sign.imageFile}`; }; const getCurrentSign = () => { return zodiacSigns.find((sign) => sign.id === selectedSign); }; const getHoroscopeText = () => { // Hiển thα»‹ loading state if (isLoading) { return "Loading your horoscope..."; } if (!horoscopeData || error) { if (selectedPeriod !== "today") { return "Upgrade to Premium to unlock weekly, monthly, and yearly horoscope insights. Get deeper cosmic guidance and detailed predictions for your future."; } return fallbackHoroscopeContent[selectedCategory][selectedPeriod]; } const currentSign = getCurrentSign(); if (currentSign && horoscopeData.data[currentSign.id]) { const signData = horoscopeData.data[currentSign.id]; return ( signData[selectedGender] || signData.male || signData.female || "No horoscope available for today." ); } return "No horoscope available for this sign."; }; const getPeriodTitle = () => { const titles = { today: "Horoscope for Today", week: "Horoscope for This Week", month: "Horoscope for This Month", year: "Horoscope for This Year", }; return titles[selectedPeriod]; }; const toggleTheme = () => { setIsDarkMode(!isDarkMode); }; // Scroll to selected zodiac sign on mount and selection change useEffect(() => { if (zodiacScrollRef.current) { const selectedElement = zodiacScrollRef.current.querySelector( `[data-sign="${selectedSign}"]` ); if (selectedElement) { selectedElement.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "center", }); } } }, [selectedSign]); // Load horoscope data when category or period changes useEffect(() => { loadHoroscopeData(selectedCategory, selectedPeriod); }, [selectedCategory, selectedPeriod]); // Handle zodiac sign selection with auto-center const handleSignSelect = (signId) => { setSelectedSign(signId); }; return (
{/* Header Controls */}
{/* Theme Toggle - Icon only for all screen sizes */} {/* App Icon - Visible on mobile - Fixed centering */}
{/* Gender Selection - Toggle style on mobile, tabs on desktop */} {/* Gender Selection - Desktop tabs */}
{/* App Title - Hidden on mobile */}

Horoscope App

{/* Zodiac Signs Grid - Single Row */}
{zodiacSigns.map((sign) => (
handleSignSelect(sign.id)} className="flex flex-col items-center cursor-pointer transition-all duration-300 hover:scale-105 flex-shrink-0 py-1" >
{/* Background layer for separation */}
{getImagePath(sign) ? ( {sign.name} { e.target.style.display = "none"; e.target.nextSibling.style.display = "block"; }} /> ) : ( )} {sign.emoji}

{sign.name}

))}
{/* Period Selection */}
{periods.map((period) => ( ))}
{/* Category Selection */}
{categories.map((category) => ( ))}
{/* Horoscope Content */}
{/* Background layer for separation */}
{getImagePath(getCurrentSign()) ? ( {getCurrentSign()?.name} { e.target.style.display = "none"; e.target.nextSibling.style.display = "block"; }} /> ) : ( )} {getCurrentSign()?.emoji}

{getPeriodTitle()}

{getCurrentSign()?.name} ({getCurrentSign()?.dates})
{isLoading ? (
Loading your horoscope...
) : (

{getHoroscopeText()}

)} {error && (
Using cached content
)}
{" "}
{/* Footer */}

Discover your daily horoscope and unlock the secrets of the stars

Β© 2025 AstroLens Horoscope - All rights reserved.

); }; export default HoroscopeApp;