blob: 736f88deea93d3a75ff0f69ac54723c1c7895e8e [file] [log] [blame]
// import React, { useState, useEffect } from 'react';
// import { useGroupStore } from '../../context/useGroupStore';
// import { useUser } from '../../context/UserContext';
// import CreatePostForm from './CreatePostForm';
// import axios from 'axios'; // 新增
// const GroupItem = ({ group }) => {
// const { handleJoinGroup, joinStatus, setJoinStatus } = useGroupStore(); // 假设你有 setJoinStatus 方法
// const { user } = useUser();
// const userId = user?.userId;
// const groupId = group.groupId;
// const [isMember, setIsMember] = useState(false);
// useEffect(() => {
// setIsMember(joinStatus[groupId] === '加入成功');
// }, [joinStatus, groupId]);
// const [showCreatePost, setShowCreatePost] = useState(false);
// // 退出小组函数(新增)
// const handleLeaveGroup = async () => {
// try {
// const res = await axios.post(`/echo/groups/${groupId}/leave`, {
// user_id: userId,
// });
// if (res.data.status === 'success') {
// setJoinStatus(groupId, '未加入'); // 更新全局状态(需确保 useGroupStore 中有此方法)
// setIsMember(false); // 本地状态也更新
// } else {
// alert(res.data.message || '退出失败');
// }
// } catch (error) {
// console.error('退出小组失败:', error);
// alert('退出小组失败');
// }
// };
// return (
// <div className="group-item">
// <div className="group-content">
// <img
// style={{ width: '40%', height: '40%' }}
// src={group.coverImage || 'https://picsum.photos/200/200'}
// alt={group.groupName}
// className="group-cover"
// />
// <div className="group-info-right">
// <h3>{group.groupName}</h3>
// <p style={{ color: '#BA929A' }}>{group.memberCount || 0}人加入了小组</p>
// {/* 加入/退出按钮逻辑 */}
// {userId && (
// <button
// onClick={() => {
// if (isMember) {
// handleLeaveGroup(); // 已加入 -> 退出
// } else {
// handleJoinGroup(groupId, userId); // 未加入 -> 加入
// }
// }}
// >
// {isMember ? '退出小组' : '+加入小组'}
// </button>
// )}
// {!userId && <button disabled>请登录</button>}
// {/* 发布帖子按钮 */}
// {userId && isMember && (
// <button onClick={() => setShowCreatePost(!showCreatePost)}>
// +发布帖子
// </button>
// )}
// </div>
// </div>
// <div className="group-description">
// <p>{group.description}</p>
// </div>
// <p>分类:{group.category}</p>
// {showCreatePost && (
// <CreatePostForm
// groupId={groupId}
// onClose={() => setShowCreatePost(false)}
// />
// )}
// </div>
// );
// };
// export default GroupItem;
import React, { useState, useEffect } from 'react';
import { useGroupStore } from '../../context/useGroupStore';
import { useUser } from '../../context/UserContext';
import CreatePostForm from './CreatePostForm';
import axios from 'axios';
const GroupItem = ({ group }) => {
const { handleJoinGroup, joinStatus, setJoinStatus } = useGroupStore();
const { user } = useUser();
const userId = user?.userId;
const groupId = group.groupId;
const [isMember, setIsMember] = useState(false);
const [loading, setLoading] = useState(false); // 新增:加载状态
const [error, setError] = useState(''); // 新增:错误信息
useEffect(() => {
console.log('joinStatus updated:', joinStatus);
setIsMember(joinStatus[groupId] === '加入成功');
}, [joinStatus, groupId]);
// 初始挂载时检查成员状态(新增)
useEffect(() => {
if (userId && groupId) {
checkMembershipStatus();
}
}, [userId, groupId]);
// 检查成员状态(新增)
const checkMembershipStatus = async () => {
try {
const res = await axios.get(`/echo/groups/${groupId}/members`);
const isMember = res.data.members.some(member => member.user_id === userId);
setJoinStatus(groupId, isMember ? '加入成功' : '未加入');
} catch (error) {
console.error('检查成员状态失败:', error);
}
};
const [showCreatePost, setShowCreatePost] = useState(false);
const handleLeaveGroup = async () => {
setLoading(true);
try {
const res = await axios.post(`/echo/groups/${groupId}/leave`, {
user_id: userId,
});
if (res.data.status === 'success') {
setJoinStatus(groupId, '未加入');
setIsMember(false);
// 可选:刷新小组成员计数
group.memberCount = (group.memberCount || 0) - 1;
} else {
setError(res.data.message || '退出失败');
}
} catch (error) {
console.error('退出小组失败:', error);
setError('退出小组失败');
} finally {
setLoading(false);
}
};
// 修改加入小组逻辑(新增)
const handleJoin = async () => {
setLoading(true);
try {
const res = await handleJoinGroup(groupId, userId);
if (res && res.status === 'success') {
setJoinStatus(groupId, '加入成功');
setIsMember(true);
// 可选:刷新小组成员计数
group.memberCount = (group.memberCount || 0) + 1;
} else {
setError(res?.message || '加入失败');
}
} catch (error) {
console.error('加入小组失败:', error);
setError('加入小组失败');
} finally {
setLoading(false);
}
};
return (
<div className="group-item">
<div className="group-content">
<img
style={{ width: '40%', height: '40%' }}
src={group.coverImage || 'https://picsum.photos/200/200'}
alt={group.groupName}
className="group-cover"
/>
<div className="group-info-right">
<h3>{group.groupName}</h3>
<p style={{ color: '#BA929A' }}>{group.memberCount || 0}人加入了小组</p>
{/* 加入/退出按钮逻辑 */}
{userId && (
<button
onClick={() => {
if (isMember) {
handleLeaveGroup();
} else {
handleJoin();
}
}}
disabled={loading}
>
{loading ? '处理中...' : isMember ? '退出小组' : '+加入小组'}
</button>
)}
{!userId && <button disabled>请登录</button>}
{/* 显示错误信息(新增) */}
{error && <p style={{ color: 'red' }}>{error}</p>}
{/* 发布帖子按钮 */}
{userId && isMember && (
<button onClick={() => setShowCreatePost(!showCreatePost)}>
+发布帖子
</button>
)}
</div>
</div>
<div className="group-description">
<p>{group.description}</p>
</div>
<p>分类:{group.category}</p>
{showCreatePost && (
<CreatePostForm
groupId={groupId}
onClose={() => setShowCreatePost(false)}
/>
)}
</div>
);
};
export default GroupItem;