/** * Home Page - Landing page and quick start interface */ import { useState } from 'react'; import { trackUrlSubmission, trackAnalysisResult, trackError } from '../utils/analytics'; import { Box, Heading, Text, Container, VStack, HStack, Card, CardBody, CardHeader, SimpleGrid, Button, Badge, Input, Icon, useToast, useColorModeValue, Stat, StatLabel, StatNumber, StatHelpText, FormControl, FormLabel, Select, Switch, FormHelperText, Slider, SliderTrack, SliderFilledTrack, SliderThumb, NumberInput, NumberInputField, NumberInputStepper, NumberIncrementStepper, NumberDecrementStepper, Textarea, Collapse, Divider, Alert, AlertIcon, // StatArrow, // Flex, // Stack, // Image, // Center, } from '@chakra-ui/react'; import { Link as RouterLink } from 'react-router-dom'; import { useMutation } from '@tanstack/react-query'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { FiTrendingUp, FiActivity, FiLock, FiSearch, FiShield, FiUpload, FiBarChart, FiZap, // FiGlobe, FiArrowRight, FiCheckCircle, } from 'react-icons/fi'; import { trackingApi, TrackRequestV2 } from '../services/api'; import { useAuth } from '../contexts/AuthContext'; import { TrackingResults } from '../components/Tracking/TrackingResults'; const trackingSchema = z.object({ url: z.string().min(1, 'URL is required').url('Invalid URL format'), method: z.enum(['GET', 'POST', 'HEAD']), userAgent: z.string().optional(), maxHops: z.number().min(1).max(20), timeout: z.number().min(1000).max(30000), enableSSLAnalysis: z.boolean(), enableSEOAnalysis: z.boolean(), enableSecurityAnalysis: z.boolean(), customHeaders: z.string().optional(), }); type TrackingFormData = z.infer; export function HomePage() { const [showAdvanced, setShowAdvanced] = useState(false); const [trackingResult, setTrackingResult] = useState(null); const { isAuthenticated } = useAuth(); const toast = useToast(); const cardBg = useColorModeValue('white', 'gray.800'); const borderColor = useColorModeValue('gray.200', 'gray.700'); const bgGradient = useColorModeValue( 'linear(to-br, blue.50, purple.50, pink.50)', 'linear(to-br, gray.900, blue.900, purple.900)' ); const { register, handleSubmit, watch, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(trackingSchema), defaultValues: { method: 'GET', maxHops: 10, timeout: 15000, enableSSLAnalysis: true, enableSEOAnalysis: true, enableSecurityAnalysis: true, }, }); const maxHops = watch('maxHops'); const timeout = watch('timeout'); // Tracking mutation const trackingMutation = useMutation({ mutationFn: async (data: TrackRequestV2) => { // Track URL submission trackUrlSubmission(data.url, isAuthenticated); return await trackingApi.trackUrlV2(data); }, onSuccess: (result) => { setTrackingResult(result); toast({ title: 'Tracking completed', description: `Found ${result.check.redirectCount} redirects`, status: 'success', duration: 3000, isClosable: true, }); // Track analysis results const analysis = (result as any).check?.analysis; if (analysis) { trackAnalysisResult( (result as any).check.redirectCount || 0, analysis.ssl?.warningsJson?.length > 0 || false, !analysis.seo?.robotsTxtStatus || analysis.seo?.noindex || false, analysis.security?.mixedContent === 'PRESENT' || analysis.security?.safeBrowsingStatus !== 'safe' || false ); } // Don't auto-navigate on home page to allow users to see results // They can manually navigate to their dashboard to see saved results }, onError: (error: any) => { // Track errors trackError('tracking_failed', error.response?.data?.message || error.message || 'Unknown error'); toast({ title: 'Tracking failed', description: error.response?.data?.message || 'An error occurred', status: 'error', duration: 5000, isClosable: true, }); }, }); const onSubmit = (data: TrackingFormData) => { let headers: Record = {}; // Parse custom headers if provided if (data.customHeaders) { try { const lines = data.customHeaders.split('\n').filter(line => line.trim()); for (const line of lines) { const [key, ...valueParts] = line.split(':'); if (key && valueParts.length > 0) { headers[key.trim()] = valueParts.join(':').trim(); } } } catch (error) { toast({ title: 'Invalid headers format', description: 'Please use format: Header-Name: Header-Value', status: 'error', duration: 3000, isClosable: true, }); return; } } const trackRequest: TrackRequestV2 = { url: data.url, method: data.method, userAgent: data.userAgent, headers: Object.keys(headers).length > 0 ? headers : undefined, maxHops: data.maxHops, timeout: data.timeout, enableSSLAnalysis: data.enableSSLAnalysis, enableSEOAnalysis: data.enableSEOAnalysis, enableSecurityAnalysis: data.enableSecurityAnalysis, }; trackingMutation.mutate(trackRequest); }; const features = [ { icon: FiActivity, title: 'Real-time Tracking', description: 'Track redirects in real-time with comprehensive hop analysis and performance metrics.', color: 'blue', }, { icon: FiLock, title: 'SSL Analysis', description: 'Comprehensive SSL certificate analysis with expiry warnings and security insights.', color: 'green', }, { icon: FiSearch, title: 'SEO Optimization', description: 'Check meta tags, robots.txt, canonical URLs, and other SEO factors.', color: 'purple', }, { icon: FiShield, title: 'Security Scanning', description: 'Detect security vulnerabilities, mixed content, and safe browsing status.', color: 'red', }, { icon: FiUpload, title: 'Bulk Processing', description: 'Upload CSV files to track thousands of URLs with background processing.', color: 'orange', }, { icon: FiBarChart, title: 'Advanced Analytics', description: 'Generate detailed reports with Mermaid diagrams and export to PDF/Markdown.', color: 'teal', }, ]; const stats = [ { label: 'Redirect Hops Tracked', value: '10M+', helpText: 'Total redirect hops analyzed', icon: FiTrendingUp, }, { label: 'SSL Certificates Analyzed', value: '2.5M+', helpText: 'Certificates checked for security', icon: FiLock, }, { label: 'Security Scans', value: '1M+', helpText: 'Vulnerability assessments performed', icon: FiShield, }, { label: 'Average Response Time', value: '<500ms', helpText: 'Lightning-fast analysis', icon: FiZap, }, ]; return ( {/* Hero Section */} 🚀 URL Tracker Tool V2 - Now Available URL Redirect Tracking & Analysis Track redirect chains, analyze SSL certificates, optimize SEO, and scan for security vulnerabilities with our comprehensive platform. {/* Advanced Tracking Form */} URL Redirect Tracker Enhanced v2
{/* URL Input */} URL to Track {errors.url && ( {errors.url.message} )} Enter the URL you want to track. Protocol (http/https) is optional. {/* Method Selection */} HTTP Method HTTP method to use for the initial request {/* Analysis Options */} Analysis Options SSL Certificate Analysis SEO Optimization Analysis Security Vulnerability Scan Enable advanced analysis features (recommended) {/* Advanced Options Toggle */} {/* Advanced Options */} {/* Max Hops */} Maximum Hops: {maxHops} setValue('maxHops', value)} min={1} max={20} step={1} colorScheme="brand" > Maximum number of redirects to follow (1-20) {/* Timeout */} Timeout (milliseconds) setValue('timeout', parseInt(valueString) || 15000)} min={1000} max={30000} step={1000} > Request timeout in milliseconds (1000-30000) {/* User Agent */} Custom User Agent Custom User-Agent header (optional) {/* Custom Headers */} Custom Headers