import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { useToast } from "@/hooks/use-toast"; import { apiRequest, queryClient } from "@/lib/queryClient"; import { useMutation } from "@tanstack/react-query"; import { Search, Settings, User, Sun, Moon, Monitor, Globe } from "lucide-react"; import MainContent from "@/components/MainContent"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; export default function Landing() { const [showLoginModal, setShowLoginModal] = useState(false); const [showRequestModal, setShowRequestModal] = useState(false); const [loginForm, setLoginForm] = useState({ username: "", password: "" }); const [requestForm, setRequestForm] = useState({ name: "", category: "people", description: "" }); const { toast } = useToast(); const [theme, setTheme] = useState(() => localStorage.getItem('theme') || 'light'); const [language, setLanguage] = useState(() => localStorage.getItem('language') || 'en'); useEffect(() => { if (theme === 'dark') { document.documentElement.classList.add('dark'); } else { document.documentElement.classList.remove('dark'); } localStorage.setItem('theme', theme); }, [theme]); useEffect(() => { localStorage.setItem('language', language); }, [language]); const handleThemeChange = (newTheme: string) => { setTheme(newTheme); }; const handleLanguageChange = (newLanguage: string) => { setLanguage(newLanguage); }; const languages = [ { code: 'en', name: 'English' }, { code: 'fr', name: 'Français' }, { code: 'de', name: 'Deutsch' }, { code: 'it', name: 'Italiano' }, { code: 'hi', name: 'हिन्दी' }, { code: 'ar', name: 'العربية' }, { code: 'ja', name: '日本語' }, { code: 'ko', name: '한국어' }, { code: 'zh-TW', name: '繁體中文' }, { code: 'zh-CN', name: '简体中文' }, ]; const loginMutation = useMutation({ mutationFn: async (credentials: { username: string; password: string }) => { return await apiRequest("POST", "/api/login", credentials); }, onSuccess: () => { toast({ title: "Success", description: "Successfully logged in!", }); setShowLoginModal(false); setLoginForm({ username: "", password: "" }); // Refresh user data queryClient.invalidateQueries({ queryKey: ["/api/auth/user"] }); // Redirect to home window.location.href = "/"; }, onError: () => { toast({ title: "Error", description: "Invalid credentials. Please try again.", variant: "destructive" }); } }); const requestMutation = useMutation({ mutationFn: async (data: typeof requestForm) => { await apiRequest("POST", "/api/media-outlet-requests", data); }, onSuccess: () => { toast({ title: "Success", description: "Your media outlet request has been submitted for review.", }); setShowRequestModal(false); setRequestForm({ name: "", category: "people", description: "" }); }, onError: () => { toast({ title: "Error", description: "Failed to submit request. Please try again.", variant: "destructive" }); } }); const handleLogin = () => { setShowLoginModal(true); }; const handleLoginSubmit = (e: React.FormEvent) => { e.preventDefault(); loginMutation.mutate(loginForm); }; const handleRequestSubmit = (e: React.FormEvent) => { e.preventDefault(); requestMutation.mutate(requestForm); }; return (
{/* Header */}
SAPIENS
search in SAPIENS
Theme handleThemeChange('light')} className="cursor-pointer" data-testid="theme-light" > Light handleThemeChange('dark')} className="cursor-pointer" data-testid="theme-dark" > Dark handleThemeChange('system')} className="cursor-pointer" data-testid="theme-system" > System Language {languages.map((lang) => ( handleLanguageChange(lang.code)} className="cursor-pointer" data-testid={`language-${lang.code}`} > {lang.name} ))}
{/* Main Content */} {/* Login Modal */} Login to SAPIENS
setLoginForm(prev => ({ ...prev, username: e.target.value }))} onInvalid={(e) => (e.target as HTMLInputElement).setCustomValidity('Please enter your username')} onInput={(e) => (e.target as HTMLInputElement).setCustomValidity('')} placeholder="Enter username" required data-testid="input-username" />
setLoginForm(prev => ({ ...prev, password: e.target.value }))} onInvalid={(e) => (e.target as HTMLInputElement).setCustomValidity('Please enter your password')} onInput={(e) => (e.target as HTMLInputElement).setCustomValidity('')} placeholder="Enter password" required data-testid="input-password" />
Use: admin/1234 or superadmin/1234
{/* Request Modal */} Request New Media Outlet
setRequestForm(prev => ({ ...prev, name: e.target.value }))} onInvalid={(e) => (e.target as HTMLInputElement).setCustomValidity('Please enter outlet name')} onInput={(e) => (e.target as HTMLInputElement).setCustomValidity('')} placeholder="Enter outlet name" required data-testid="input-outlet-name" />