import { useEffect, useState } from "react"; import { motion, useAnimation, Variants } from "framer-motion"; import { useInView } from "react-intersection-observer"; import { easeInOut } from "framer-motion"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import Cookies from "js-cookie"; import { ArrowRight, BookOpenText, ShieldCheck } from "lucide-react"; import { useTenantConfig, resolveModuleConfig, } from "@/layout/components/TenantConfig"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/shared/common/ui/dialog"; const HeroSection = () => { const controls = useAnimation(); const { t } = useTranslation(); const navigate = useNavigate(); const { config: tenantConfig } = useTenantConfig(); const moduleConfig = resolveModuleConfig(tenantConfig); const primary = tenantConfig.primaryColor || "#18AA9D"; const secondary = tenantConfig.secondaryColor || primary; const [ref, inView] = useInView({ threshold: 0.1, triggerOnce: true, }); useEffect(() => { if (inView) { controls.start("visible"); } else { controls.start("hidden"); } }, [controls, inView]); const containerVariants: Variants = { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { staggerChildren: 0.15, delayChildren: 0.2, }, }, }; const itemVariants: Variants = { hidden: { y: 30, opacity: 0 }, visible: { y: 0, opacity: 1, transition: { duration: 0.6, ease: easeInOut, }, }, }; const isTokenPresent = Boolean(Cookies.get("auth-token")); const heroTitle = tenantConfig?.organizationName || t("landingPage.smartOffice"); const welcomeMessage = tenantConfig?.welcomeMessage || t("landingPage.initiativeDescription"); const organizationInitials = heroTitle ?.split(/[\s\-–—]+/) .filter(Boolean) .map((word) => word.charAt(0)) .join("") .toUpperCase() || "SO"; const cardVariants: Variants = { hidden: { scale: 0.85, opacity: 0, rotateX: 10 }, visible: { scale: 1, opacity: 1, rotateX: 0, transition: { delay: 0.4, duration: 0.8, type: "spring", stiffness: 100, damping: 15, }, }, }; const floatingElementVariants: Variants = { float: { y: [0, -20, 0], transition: { duration: 4, repeat: Infinity, ease: "easeInOut", // ✅ correct literal type }, }, }; return (
{/* Enhanced Background */}
{/* Gradient Orbs */}
{/* Grid Pattern */}
{/* Enhanced Content */} {!isTokenPresent && ( {"Online"} )} {tenantConfig?.organizationName || t("landingPage.smartOffice")} {t("landingPage.platformSystem")} {welcomeMessage}
{tenantConfig?.logo ? (
{ const fallback = e.currentTarget.parentElement?.querySelector( ".modal-logo-fallback", ); if (fallback) { fallback.classList.remove("hidden"); fallback.classList.add("flex"); } e.currentTarget.remove(); }} />
{organizationInitials || "SO"}
) : (
{organizationInitials || "SO"}
)}
{heroTitle} {welcomeMessage}

{welcomeMessage}

{moduleConfig.complaint && ( navigate("/complaints")} className="group relative px-8 py-4 rounded-xl bg-gradient-to-r from-primary to-primary-500 text-white font-semibold text-lg shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1 overflow-hidden" >
{t("complaint.fayda.submitComplaint")}
)} {!isTokenPresent && (
{t("landingPage.signIn")}
)} {t("landingPage.learnMore")}
{/* Stats */}
95%
{t("landingPage.uptime")}
25+
{t("landingPage.bureaus")}
24/7
{t("landingPage.support")}
{/* Enhanced Card */}
{/* Card Header */}
{/* Logo/Brand */}
SO
{t("landingPage.sops")}
{tenantConfig.appName}
{t("landingPage.revolutionDescription")}
{/* Features List */}
{[ "features1", "features2", "features3", "features4", "features5", "features6", ].map((feature, index) => (
{t(`landingPage.${feature}`)}
))}
{t("landingPage.liveDemo")}
{/* Enhanced Floating Elements */}
{/* Scroll Indicator */}
); }; export default HeroSection;