merimandi / src /components /InboxOverlay.jsx
datamk's picture
Upload 65 files
57da3ff verified
import { useState, useEffect } from 'react';
import { useStore } from '../store';
import { motion, AnimatePresence } from 'framer-motion';
import { X, MessageSquare, User } from 'lucide-react';
export function InboxOverlay() {
const { currentUser, showInbox, toggleInbox, startChat } = useStore();
const [inbox, setInbox] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
if (!showInbox || !currentUser) return;
const fetchInbox = async () => {
setLoading(true);
try {
const res = await fetch(`/api/messages/inbox/${currentUser.id}`);
const data = await res.json();
setInbox(data || []);
} catch (error) {
console.error(error);
} finally {
setLoading(false);
}
};
fetchInbox();
}, [showInbox, currentUser]);
if (!showInbox) return null;
return (
<AnimatePresence>
<div
style={{
position: 'fixed', bottom: 0, right: 0, left: 0, top: 0,
background: 'rgba(0,0,0,0.5)', zIndex: 9998,
display: 'flex', justifyContent: 'center'
}}
onClick={toggleInbox}
>
<motion.div
initial={{ opacity: 0, y: 50 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: 50 }}
style={{
width: '100%', maxWidth: '480px', height: '80%', marginTop: 'auto',
background: 'var(--bg-main)', borderTopLeftRadius: '24px', borderTopRightRadius: '24px',
position: 'relative', display: 'flex', flexDirection: 'column',
boxShadow: '0 -10px 40px rgba(0,0,0,0.6)'
}}
onClick={e => e.stopPropagation()}
>
{/* Header */}
<div style={{ padding: '24px', borderBottom: '1px solid var(--border-color)', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
<div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
<MessageSquare size={24} color="var(--primary-color)" />
<h2 style={{ margin: 0, fontSize: '20px' }}>Your Messages</h2>
</div>
<button onClick={toggleInbox} style={{ background: 'var(--surface-light)', border: 'none', color: 'var(--text-main)', width: '36px', height: '36px', borderRadius: '50%', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer' }}>
<X size={20} />
</button>
</div>
{/* List */}
<div style={{ flex: 1, overflowY: 'auto', padding: '16px' }}>
{loading ? (
<p style={{ textAlign: 'center', color: 'var(--text-muted)' }}>Loading messages...</p>
) : inbox.length === 0 ? (
<div style={{ textAlign: 'center', padding: '40px 20px', color: 'var(--text-muted)' }}>
<MessageSquare size={48} opacity={0.3} style={{ marginBottom: '16px' }} />
<p>No messages yet.</p>
<p style={{ fontSize: '14px' }}>Conversations with buyers or sellers will appear here.</p>
</div>
) : (
<div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>
{inbox.map(chat => (
<button
key={chat.id}
onClick={() => startChat(chat.contactId, chat.contactName, chat.contactSelfie)}
className="glass-panel"
style={{
display: 'flex', alignItems: 'center', gap: '16px', padding: '16px',
border: 'none', width: '100%', textAlign: 'left', cursor: 'pointer',
background: 'var(--surface-color)', transition: '0.2s'
}}
onMouseEnter={e => e.currentTarget.style.background = 'var(--surface-light)'}
onMouseLeave={e => e.currentTarget.style.background = 'var(--surface-color)'}
>
<div style={{ width: '50px', height: '50px', borderRadius: '50%', overflow: 'hidden', background: 'var(--surface-light)', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>
{chat.contactSelfie ? (
<img src={chat.contactSelfie} alt={chat.contactName} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />
) : (
<User size={24} color="var(--text-muted)" />
)}
</div>
<div style={{ flex: 1, minWidth: 0 }}>
<div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px' }}>
<h4 style={{ margin: 0, fontSize: '16px', fontWeight: 600, color: 'white', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{chat.contactName}</h4>
<span style={{ fontSize: '12px', color: 'var(--text-muted)', flexShrink: 0 }}>
{new Date(chat.timestamp).toLocaleDateString([], { month: 'short', day: 'numeric' })}
</span>
</div>
<p style={{ margin: 0, fontSize: '14px', color: 'var(--text-muted)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', fontWeight: chat.senderId !== currentUser.id ? 500 : 400 }}>
{chat.senderId === currentUser.id ? 'You: ' : ''}{chat.message}
</p>
</div>
</button>
))}
</div>
)}
</div>
</motion.div>
</div>
</AnimatePresence>
);
}