| // import React, { useEffect, useState } from 'react'; |
| // import axios from 'axios'; |
| // import UserNav from './UserNav'; |
| // import Header from '../../components/Header'; |
| // import './UserFriends.css'; |
| // import { useUser } from '../../context/UserContext'; |
| |
| // const UserFriends = () => { |
| // const { user, loading } = useUser(); |
| // const [friends, setFriends] = useState([]); |
| // const [error, setError] = useState(null); |
| |
| // // 私信相关状态 |
| // const [chatOpen, setChatOpen] = useState(false); |
| // const [chatFriend, setChatFriend] = useState(null); |
| // const [messageContent, setMessageContent] = useState(''); |
| // const [sendingStatus, setSendingStatus] = useState(null); |
| |
| // // 新增:聊天记录 |
| // const [chatMessages, setChatMessages] = useState([]); |
| // const [loadingMessages, setLoadingMessages] = useState(false); |
| // const [messagesError, setMessagesError] = useState(null); |
| |
| // useEffect(() => { |
| // if (loading) return; |
| |
| // const fetchFriends = async () => { |
| // if (!user || !user.userId) { |
| // setError('未登录或用户信息缺失'); |
| // return; |
| // } |
| |
| // try { |
| // const res = await axios.get(`/echo/user/${user.userId}/friends`); |
| // setFriends(res.data || []); |
| // setError(null); |
| // } catch (err) { |
| // setError('加载好友失败,请稍后再试'); |
| // } |
| // }; |
| |
| // fetchFriends(); |
| // }, [user, loading]); |
| |
| // // 打开聊天框时加载聊天记录 |
| // const openChat = async (friend) => { |
| // setChatFriend(friend); |
| // setMessageContent(''); |
| // setSendingStatus(null); |
| // setChatMessages([]); |
| // setMessagesError(null); |
| // setChatOpen(true); |
| |
| // if (!user || !user.userId) return; |
| |
| // setLoadingMessages(true); |
| // try { |
| // const res = await axios.get(`/echo/message/${user.userId}/getUserMessages`); |
| // if (res.data.status === 'success') { |
| // // 过滤出和这个好友的聊天消息(发或收都算) |
| // const allMessages = res.data.messages || []; |
| // const related = allMessages.filter(m => |
| // (m.sender_id === user.userId && m.receiver_id === friend.id) || |
| // (m.sender_id === friend.id && m.receiver_id === user.userId) |
| // ); |
| // // 按时间排序(升序) |
| // related.sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp)); |
| // setChatMessages(related); |
| // } else { |
| // setMessagesError('无法加载聊天记录'); |
| // } |
| // } catch (err) { |
| // setMessagesError('加载聊天记录失败,请稍后再试'); |
| // } finally { |
| // setLoadingMessages(false); |
| // } |
| // }; |
| |
| // const closeChat = () => { |
| // setChatOpen(false); |
| // setChatFriend(null); |
| // setMessageContent(''); |
| // setSendingStatus(null); |
| // setChatMessages([]); |
| // setMessagesError(null); |
| // }; |
| |
| // const sendMessage = async () => { |
| // if (!messageContent.trim()) { |
| // setSendingStatus('消息不能为空'); |
| // return; |
| // } |
| // setSendingStatus('发送中...'); |
| // try { |
| // const res = await axios.post('/echo/message/sendMessages', { |
| // sender_id: user.userId, |
| // receiver_id: chatFriend.id, |
| // content: messageContent.trim(), |
| // }); |
| // if (res.data.status === 'success') { |
| // setSendingStatus('发送成功'); |
| // setMessageContent(''); |
| // // 发送成功后,将这条消息追加到聊天记录 |
| // const newMsg = { |
| // message_id: res.data.message_id, |
| // sender_id: user.userId, |
| // sender_username: user.username || '我', |
| // receiver_id: chatFriend.id, |
| // receiver_username: chatFriend.nickname, |
| // content: messageContent.trim(), |
| // timestamp: new Date().toISOString(), |
| // }; |
| // setChatMessages(prev => [...prev, newMsg]); |
| // } else { |
| // setSendingStatus(res.data.message || '发送失败'); |
| // } |
| // } catch (err) { |
| // setSendingStatus('发送失败,请稍后再试'); |
| // } |
| // }; |
| |
| // if (loading) return <p>正在加载...</p>; |
| // if (error) return <p className="error">{error}</p>; |
| |
| // return ( |
| // <div className="user-friends-container"> |
| // <Header /> |
| // <div className="user-center"> |
| // <div className="user-nav-container"> |
| // <UserNav /> |
| // </div> |
| // <div className="common-card"> |
| // <h2>我的好友</h2> |
| // <div className="friends-list"> |
| // {friends.length === 0 && <p>暂无好友</p>} |
| // {friends.map((friend) => ( |
| // <div key={friend.id} className="friend-card"> |
| // <img src={friend.avatar} alt={friend.nickname} className="friend-avatar" /> |
| // <div className="friend-info"> |
| // <p><strong>{friend.nickname}</strong></p> |
| // <p>{friend.email}</p> |
| // <button |
| // className="send-message-btn" |
| // onClick={() => openChat(friend)} |
| // > |
| // 发送私信 |
| // </button> |
| // </div> |
| // </div> |
| // ))} |
| // </div> |
| // </div> |
| // </div> |
| |
| // {/* 私信弹窗 */} |
| // {chatOpen && ( |
| // <div className="chat-modal"> |
| // <div className="chat-modal-content"> |
| // <h3>给 {chatFriend.nickname} 发送私信</h3> |
| // <div className="chat-messages" style={{height: '250px', overflowY: 'auto', border: '1px solid #ccc', padding: '8px', marginBottom: '8px'}}> |
| // {loadingMessages && <p>加载聊天记录中...</p>} |
| // {messagesError && <p className="error">{messagesError}</p>} |
| // {!loadingMessages && chatMessages.length === 0 && <p>暂无聊天记录</p>} |
| // {chatMessages.map(msg => ( |
| // <div |
| // key={msg.message_id} |
| // style={{ |
| // textAlign: msg.sender_id === user.userId ? 'right' : 'left', |
| // marginBottom: '8px' |
| // }} |
| // > |
| // <div style={{ |
| // display: 'inline-block', |
| // backgroundColor: msg.sender_id === user.userId ? '#409eff' : '#f0f0f0', |
| // color: msg.sender_id === user.userId ? 'white' : 'black', |
| // borderRadius: '10px', |
| // padding: '6px 12px', |
| // maxWidth: '70%', |
| // wordBreak: 'break-word' |
| // }}> |
| // <p style={{margin: 0}}>{msg.content}</p> |
| // <small style={{fontSize: '10px', opacity: 0.7}}> |
| // {new Date(msg.timestamp).toLocaleString()} |
| // </small> |
| // </div> |
| // </div> |
| // ))} |
| // </div> |
| // <textarea |
| // rows="3" |
| // value={messageContent} |
| // onChange={(e) => setMessageContent(e.target.value)} |
| // placeholder="输入消息内容" |
| // style={{width: '100%', marginBottom: '8px'}} |
| // /> |
| // <div className="chat-actions"> |
| // <button onClick={sendMessage}>发送</button> |
| // <button onClick={closeChat}>关闭</button> |
| // </div> |
| // {sendingStatus && <p className="status-msg">{sendingStatus}</p>} |
| // </div> |
| // <div className="chat-modal-backdrop" onClick={closeChat}></div> |
| // </div> |
| // )} |
| // </div> |
| // ); |
| // }; |
| |
| // export default UserFriends; |
| |
| import React, { useEffect, useState } from 'react'; |
| import axios from 'axios'; |
| import { useUser } from '../../context/UserContext'; |
| import './UserFriends.css'; |
| |
| const UserFriends = () => { |
| const { user, loading } = useUser(); |
| const [friends, setFriends] = useState([]); |
| const [error, setError] = useState(null); |
| |
| const [chatOpen, setChatOpen] = useState(false); |
| const [chatFriend, setChatFriend] = useState(null); |
| const [messageContent, setMessageContent] = useState(''); |
| const [sendingStatus, setSendingStatus] = useState(null); |
| const [chatMessages, setChatMessages] = useState([]); |
| const [loadingMessages, setLoadingMessages] = useState(false); |
| const [messagesError, setMessagesError] = useState(null); |
| |
| const [email, setEmail] = useState(''); |
| |
| useEffect(() => { |
| if (loading) return; |
| |
| const fetchFriends = async () => { |
| if (!user || !user.userId) { |
| setError('未登录或用户信息缺失'); |
| return; |
| } |
| |
| try { |
| const res = await axios.get(`/echo/user/${user.userId}/friends`); |
| setFriends(res.data || []); |
| setError(null); |
| } catch (err) { |
| setError('加载好友失败,请稍后再试'); |
| } |
| }; |
| |
| fetchFriends(); |
| }, [user, loading]); |
| |
| const openChat = async (friend) => { |
| setChatFriend(friend); |
| setMessageContent(''); |
| setSendingStatus(null); |
| setChatMessages([]); |
| setMessagesError(null); |
| setChatOpen(true); |
| |
| if (!user || !user.userId) return; |
| |
| setLoadingMessages(true); |
| try { |
| const res = await axios.get(`/echo/message/${user.userId}/getUserMessages`); |
| if (res.data.status === 'success') { |
| const allMessages = res.data.messages || []; |
| const related = allMessages.filter(m => |
| (m.sender_id === user.userId && m.receiver_id === friend.id) || |
| (m.sender_id === friend.id && m.receiver_id === user.userId) |
| ); |
| related.sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp)); |
| setChatMessages(related); |
| } else { |
| setMessagesError('无法加载聊天记录'); |
| } |
| } catch (err) { |
| setMessagesError('加载聊天记录失败,请稍后再试'); |
| } finally { |
| setLoadingMessages(false); |
| } |
| }; |
| |
| const closeChat = () => { |
| setChatOpen(false); |
| setChatFriend(null); |
| setMessageContent(''); |
| setSendingStatus(null); |
| setChatMessages([]); |
| setMessagesError(null); |
| }; |
| |
| const sendMessage = async () => { |
| if (!messageContent.trim()) { |
| setSendingStatus('消息不能为空'); |
| return; |
| } |
| setSendingStatus('发送中...'); |
| try { |
| const res = await axios.post('/echo/message/sendMessages', { |
| sender_id: user.userId, |
| receiver_id: chatFriend.id, |
| content: messageContent.trim(), |
| }); |
| if (res.data.status === 'success') { |
| setSendingStatus('发送成功'); |
| setMessageContent(''); |
| const newMsg = { |
| message_id: res.data.message_id, |
| sender_id: user.userId, |
| sender_username: user.username || '我', |
| receiver_id: chatFriend.id, |
| receiver_username: chatFriend.nickname, |
| content: messageContent.trim(), |
| timestamp: new Date().toISOString(), |
| }; |
| setChatMessages(prev => [...prev, newMsg]); |
| } else { |
| setSendingStatus(res.data.message || '发送失败'); |
| } |
| } catch (err) { |
| setSendingStatus('发送失败,请稍后再试'); |
| } |
| }; |
| |
| const handleSubmit = async () => { |
| const res = await axios.post(`/echo/user/addFriend`, { email: email, userid: user.userId }); |
| console.log(res); |
| const response = await axios.get(`/echo/user/${user.userId}/friends`); |
| setFriends(response.data || []); |
| alert(res.data.msg); |
| } |
| |
| if (loading) return <p>正在加载...</p>; |
| if (error) return <p className="error">{error}</p>; |
| |
| return ( |
| <div className="user-subpage-card"> |
| <h2>我的好友</h2> |
| <div> |
| <input type="text" value={email} placeholder="请输入好友邮箱" onChange={e => setEmail(e.target.value)} /> |
| <button className="btn submit" onClick={handleSubmit}> |
| 添加 |
| </button> |
| </div> |
| <div className="friends-list"> |
| {friends.length === 0 && <p>暂无好友</p>} |
| {friends.map((friend) => ( |
| <div key={friend.id} className="friend-card"> |
| <img src={friend.avatar} alt={friend.nickname} className="friend-avatar" /> |
| <div className="friend-info"> |
| <p><strong>{friend.nickname}</strong></p> |
| <p>{friend.email}</p> |
| <button className="send-message-btn" onClick={() => openChat(friend)}> |
| 发送私信 |
| </button> |
| </div> |
| </div> |
| ))} |
| </div> |
| |
| {/* 私信弹窗 */} |
| {chatOpen && ( |
| <div className="chat-modal"> |
| <div className="chat-modal-content"> |
| <h3>给 {chatFriend.nickname} 发送私信</h3> |
| <div className="chat-messages"> |
| {loadingMessages && <p>加载聊天记录中...</p>} |
| {messagesError && <p className="error">{messagesError}</p>} |
| {!loadingMessages && chatMessages.length === 0 && <p>暂无聊天记录</p>} |
| {chatMessages.map(msg => ( |
| <div |
| key={msg.message_id} |
| style={{ |
| textAlign: msg.sender_id === user.userId ? 'right' : 'left', |
| marginBottom: '8px' |
| }} |
| > |
| <div className={`chat-bubble ${msg.sender_id === user.userId ? 'self' : 'other'}`}> |
| <p>{msg.content}</p> |
| <small>{new Date(msg.timestamp).toLocaleString()}</small> |
| </div> |
| </div> |
| ))} |
| </div> |
| <textarea |
| rows="3" |
| value={messageContent} |
| onChange={(e) => setMessageContent(e.target.value)} |
| placeholder="输入消息内容" |
| /> |
| <div className="chat-actions"> |
| <button onClick={sendMessage}>发送</button> |
| <button onClick={closeChat}>关闭</button> |
| </div> |
| {sendingStatus && <p className="status-msg">{sendingStatus}</p>} |
| </div> |
| <div className="chat-modal-backdrop" onClick={closeChat}></div> |
| </div> |
| )} |
| </div> |
| ); |
| }; |
| |
| export default UserFriends; |
| |