import { useState, useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import SharedFile from "./SharedFile";
import { getUserColor } from "../../utils/userColor";
import { dmService } from "../../services/dm.service";
import { updateUserProfile } from "../../store/slices/dmSlice";
import {
FiMail,
FiFileText,
FiInbox,
FiSearch,
FiMousePointer,
FiMessageCircle,
FiZap,
FiUsers,
} from "react-icons/fi";
function getInitials(name) {
if (!name) return "?";
return name
.split(" ")
.map((n) => n[0])
.join("")
.slice(0, 2)
.toUpperCase();
}
function isEmoji(str) {
if (!str) return false;
return /\p{Emoji}/u.test(str) && str.length <= 2;
}
function UserAvatar({ name, avatarUrl, isOnline, isDark, isBot, color }) {
const userColor = getUserColor(name, color);
const textColor = isDark ? "var(--bg-surface)" : "#fff";
const avatarEmoji = isEmoji(avatarUrl) ? avatarUrl : null;
const imageUrl = avatarUrl && !avatarEmoji ? avatarUrl : null;
const [imgError, setImgError] = useState(false);
return (
{avatarEmoji ? (
{avatarEmoji}
) : imageUrl && !imgError ? (

setImgError(true)}
/>
) : (
getInitials(name)
)}
);
}
function DMProfile({ isDark, dmUser }) {
const dispatch = useDispatch();
const onlineUsers = useSelector((state) => state.dm.onlineUsers);
const [profileColor, setProfileColor] = useState(null);
const isOnlineRealtime = dmUser?.id && onlineUsers.includes(String(dmUser.id));
console.log("[DMProfile] dmUser.id:", dmUser?.id, "onlineUsers:", onlineUsers, "isOnlineRealtime:", isOnlineRealtime, "dmUser.isOnline:", dmUser?.isOnline);
const dmUserOnline = isOnlineRealtime || dmUser?.isOnline || false;
useEffect(() => {
if (!dmUser) {
setProfileColor(null);
return;
}
if (dmUser.color) {
setProfileColor(dmUser.color);
return;
}
let mounted = true;
dmService
.getUserProfile(dmUser.id)
.then(({ data }) => {
const color = data?.user?.color || data?.color || null;
const displayName =
data?.user?.display_name || data?.display_name || null;
const avatarUrl = data?.user?.avatar_url || data?.avatar_url || null;
if (mounted && color) {
setProfileColor(color);
}
// Update Redux store with user profile info
if (color || displayName || avatarUrl) {
dispatch(
updateUserProfile({
userId: dmUser.id,
updates: {
...(color && { color }),
...(displayName && { display_name: displayName }),
...(avatarUrl && { avatar_url: avatarUrl }),
},
}),
);
}
})
.catch(() => {});
return () => {
mounted = false;
};
}, [dmUser]);
const effectiveColor = dmUser?.color || profileColor || null;
if (!dmUser) {
return (
Hướng dẫn
Tìm kiếm bạn bè
Nhập tên hoặc email để tìm
Chọn để nhắn tin
Click vào tên để bắt đầu trò chuyện
Tham gia space học tập
Vào các nhóm môn học để trao đổi
Hỏi StudyBot
Trợ lý AI sẵn sàng giải đáp 24/7
Kết nối & học tập
Trao đổi bài tập và tài liệu
);
}
return (
{/* Avatar + Name */}
{dmUser.name}
{dmUserOnline ? "Đang hoạt động" : "Ngoại tuyến"}
{/* Info */}
{dmUser.email && (
{dmUser.email}
)}
{dmUser.bio && (
{dmUser.bio}
)}
{/* Shared Files */}
Tệp chia sẻ
{dmUser.sharedFiles && dmUser.sharedFiles.length > 0 ? (
dmUser.sharedFiles.map((file, idx) => (
))
) : (
)}
);
}
export default DMProfile;