// pages/index.jsx import React, { useState, useEffect, useMemo, useCallback } from "react"; import Head from "next/head"; import { motion, AnimatePresence } from "framer-motion"; import { fontTransforms, getFontsByCategory, getPopularFonts, transformText, } from "@/components/fontTransforms"; import MobileOptimizedHeader from "@/components/MobileOptimizedHeader"; import EnhancedTextInput from "@/components/EnhancedTextInput"; import ImprovedCategoryFilter from "@/components/ImprovedCategoryFilter"; import PerformanceOptimizedFontCard from "@/components/PerformanceOptimizedFontCard"; import InfoSection from "@/components/InfoSection"; import SocialButtons from "@/components/SocialButtons"; import SEOHead from "@/components/SEOHead"; if (typeof window !== "undefined") { sessionStorage.removeItem("fancytext_recent_fonts"); } export default function HomePage() { const [inputText, setInputText] = useState("Hello Instagram!"); const [previewFont, setPreviewFont] = useState(null); const [selectedCategory, setSelectedCategory] = useState("all"); const [searchQuery, setSearchQuery] = useState(""); const [recentFonts, setRecentFonts] = useState([]); const [isMobile, setIsMobile] = useState(false); const [animationsEnabled, setAnimationsEnabled] = useState(() => { if (typeof window !== "undefined") { const hasReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; const isLowEndDevice = (navigator.hardwareConcurrency ?? 8) < 4; return !hasReducedMotion && !isLowEndDevice; } return true; }); useEffect(() => { const checkMobile = () => { if (typeof window !== "undefined") { setIsMobile(window.innerWidth < 768 || /iPhone|iPad|iPod|Android/i.test(navigator.userAgent)); } }; checkMobile(); window.addEventListener("resize", checkMobile); return () => window.removeEventListener("resize", checkMobile); }, []); useEffect(() => { setRecentFonts([]); }, []); const [debouncedText, setDebouncedText] = useState(inputText); useEffect(() => { const delay = isMobile ? 200 : 100; const handler = setTimeout(() => setDebouncedText(inputText), delay); return () => clearTimeout(handler); }, [inputText, isMobile]); const filteredFonts = useMemo(() => { const list = getFontsByCategory(selectedCategory); if (!searchQuery) return list; const q = searchQuery.toLowerCase(); return list.filter((font) => { const desc = fontTransforms[font]?.description?.toLowerCase() ?? ""; return font.toLowerCase().includes(q) || desc.includes(q); }); }, [selectedCategory, searchQuery]); const popularFonts = useMemo(() => getPopularFonts(), []); const fontCounts = useMemo(() => { const total = Object.keys(fontTransforms).length; const counts = { all: total }; Object.values(fontTransforms).forEach(({ category }) => { counts[category] = (counts[category] || 0) + 1; }); return counts; }, []); const trackFontCopy = useCallback((fontName, text) => { window.gtag?.("event", "font_copied", { font_name: fontName, text_length: text.length, category: fontTransforms[fontName]?.category, }); setRecentFonts((prev) => { const updated = [fontName, ...prev.filter((f) => f !== fontName)].slice(0, 5); return updated; }); }, []); const trackFontLike = useCallback((fontName, liked) => { window.gtag?.("event", "font_liked", { font_name: fontName, action: liked ? "like" : "unlike", }); }, []); const handleQuickShare = useCallback(async () => { const shareData = { title: "FancyText - Cool Fonts! 🔥", text: "Check out this app for cool Instagram & TikTok fonts! 30+ fonts free ✨", url: window.location.href, }; if (navigator.share) { try { await navigator.share(shareData); } catch {} } else { await navigator.clipboard.writeText(`${shareData.text}\n${shareData.url}`); alert("Link copied to clipboard! 🗌"); } window.gtag?.("event", "app_shared", { method: "button_click" }); }, []); const handleTextChange = useCallback((text) => { setInputText(text); setPreviewFont(null); }, []); const handleCategoryChange = useCallback((cat) => setSelectedCategory(cat), []); const handleSearch = useCallback((q) => setSearchQuery(q), []); const handleRandomFont = useCallback(() => { const fontList = Object.keys(fontTransforms); let tries = 0; let newFont; do { newFont = fontList[Math.floor(Math.random() * fontList.length)]; tries++; } while (newFont === previewFont && tries < 50); setPreviewFont(newFont); }, [previewFont]); const displayText = previewFont ? transformText(inputText || "Try me!", previewFont) : inputText; return ( <> FancyText | Viral Fonts