import React, { useState, useEffect, useRef, useCallback } from 'react'; import { Home, Search, PlusSquare, User as UserIcon, Heart, MessageCircle, Share2, CheckCircle2, Image as ImageIcon, LogOut, ArrowLeft, Loader2, Camera, Edit3 } from 'lucide-react'; import { motion, AnimatePresence } from 'motion/react'; import { clsx, type ClassValue } from 'clsx'; import { twMerge } from 'tailwind-merge'; import { User, Post, View } from './types'; import { ImageCropper } from './components/ImageCropper'; // Utility for Tailwind classes function cn(...inputs) { return twMerge(clsx(inputs)); } const API_BASE_URL = 'https://api.layzur.qzz.io'; export default function App() { const [view, setView] = useState('auth'); const [token, setToken] = useState(localStorage.getItem('layzur_token')); const [currentUser, setCurrentUser] = useState(localStorage.getItem('layzur_username')); const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (token) { setView('home'); fetchPosts(); } else { setView('auth'); } }, [token]); const fetchPosts = async () => { try { setLoading(true); const res = await fetch(`${API_BASE_URL}/api/posts`); if (res.ok) { const data = await res.json(); if (Array.isArray(data)) { setPosts(data); } } } catch (err) { console.error('Failed to fetch posts', err); } finally { setLoading(false); } }; const handleLogout = () => { localStorage.removeItem('layzur_token'); localStorage.removeItem('layzur_username'); setToken(null); setCurrentUser(null); setView('auth'); }; return (
{view === 'auth' && ( { setToken(t); setCurrentUser(u); }} /> )} {view === 'home' && } {view === 'search' && } {view === 'post' && { setView('home'); fetchPosts(); }} onCancel={() => setView('home')} />} {view === 'profile' && }
{view !== 'auth' && ( )}
); } function NavButton({ active, onClick, icon }{ active() => void, icon.ReactNode }) { return ( ); } function AuthView({ onSuccess }{ onSuccess(token) => void }) { const [isLogin, setIsLogin] = useState(true); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const handleSubmit = async (e.FormEvent) => { e.preventDefault(); setError(''); setLoading(true); const endpoint = isLogin ? '/api/login' '/api/register'; try { const res = await fetch(`${API_BASE_URL}${endpoint}`, { method'POST', headers{ 'Content-Type''application/json' }, body.stringify({ username, password }) }); const data = await res.json(); if (res.ok) { localStorage.setItem('layzur_token', data.token); localStorage.setItem('layzur_username', username); onSuccess(data.token, username); } else { setError(data.message || 'Authentication failed'); } } catch (err) { setError('Connection error'); } finally { setLoading(false); } }; return (

LAYZUR

See what's happening right now. Join the conversation on Layzur.

setUsername(e.target.value)} className="w-full bg-white/5 border border-white/10 rounded-xl px-4 py-3 focus-none focus-orange-500/50 transition-colors" required /> setPassword(e.target.value)} className="w-full bg-white/5 border border-white/10 rounded-xl px-4 py-3 focus-none focus-orange-500/50 transition-colors" required /> {error &&

{error}

}
); } function HomeView({ posts, onRefresh, loading }{ posts() => void, loading}) { return (

Feed

{posts.map((post) => ( ))} {posts.length === 0 && !loading && (
No posts yet. Be the first to share something.
)}
); } function PostCard({ post }{ post?}) { const [liked, setLiked] = useState(false); const [likesCount, setLikesCount] = useState(post.likes || 0); const handleLike = async () => { const token = localStorage.getItem('layzur_token'); if (!token) return; setLiked(!liked); setLikesCount(prev => liked ? prev - 1 + 1); try { await fetch(`${API_BASE_URL}/api/like`, { method'POST', headers{ 'Content-Type''application/json', 'Authorization'`Bearer ${token}` }, body.stringify({ postId.id }) }); } catch (err) { console.error('Like failed', err); } }; return (
{post.profilePicture ? ( {post.username ) (
{(post.username?.[0] || '?').toUpperCase()}
)}
@{post.username || 'unknown'} {post.verified === 1 && }
{post.createdAt ? new Date(post.createdAt).toLocaleDateString() 'recently'}

{post.content}

{post.media && (
Post media
)}
); } function CreatePostView({ onCreated, onCancel }{ onCreated() => void, onCancel() => void }) { const [content, setContent] = useState(''); const [media, setMedia] = useState(null); const [preview, setPreview] = useState(null); const [loading, setLoading] = useState(false); const fileInputRef = useRef(null); const handleMediaChange = (e.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setMedia(file); setPreview(URL.createObjectURL(file)); } }; const handleSubmit = async () => { if (!content.trim() && !media) return; setLoading(true); const token = localStorage.getItem('layzur_token'); const username = localStorage.getItem('layzur_username'); try { let mediaUrl = ''; if (media) { const formData = new FormData(); formData.append('file', media); const uploadRes = await fetch(`${API_BASE_URL}/api/upload`, { method'POST', headers{ 'Authorization'`Bearer ${token}` }, body}); const uploadData = await uploadRes.json(); mediaUrl = uploadData.url; } const res = await fetch(`${API_BASE_URL}/api/post`, { method'POST', headers{ 'Content-Type''application/json', 'Authorization'`Bearer ${token}` }, body.stringify({ username, content, media}) }); if (res.ok) { onCreated(); } } catch (err) { console.error('Post creation failed', err); } finally { setLoading(false); } }; return (