blob: ea2253f8d4871d7d9bae0c10e3b7e405a2f4c34f [file] [log] [blame]
Krishya6bf199c2025-06-06 21:14:23 +08001import React, { useState, useEffect } from 'react';
Krishyab5ef96d2025-06-05 13:57:05 +08002import { useGroupStore } from '../../context/useGroupStore';
3import { useUser } from '../../context/UserContext';
4import CreatePostForm from './CreatePostForm';
Krishya6bf199c2025-06-06 21:14:23 +08005import axios from 'axios';
Krishyab5ef96d2025-06-05 13:57:05 +08006
7const GroupItem = ({ group }) => {
Krishya73cd8822025-06-07 15:48:41 +08008 const { handleJoinGroup, joinStatus, setJoinStatus,fetchGroupList } = useGroupStore();
Krishyab5ef96d2025-06-05 13:57:05 +08009 const { user } = useUser();
Krishya6bf199c2025-06-06 21:14:23 +080010
Krishyab5ef96d2025-06-05 13:57:05 +080011 const userId = user?.userId;
Krishya6bf199c2025-06-06 21:14:23 +080012 const groupId = group.groupId;
13
14 const [isMember, setIsMember] = useState(false);
15 const [loading, setLoading] = useState(false); // 新增:加载状态
16 const [error, setError] = useState(''); // 新增:错误信息
17
18 useEffect(() => {
19 console.log('joinStatus updated:', joinStatus);
20 setIsMember(joinStatus[groupId] === '加入成功');
21 }, [joinStatus, groupId]);
22
23 // 初始挂载时检查成员状态(新增)
24 useEffect(() => {
25 if (userId && groupId) {
26 checkMembershipStatus();
27 }
28 }, [userId, groupId]);
29
30 // 检查成员状态(新增)
31 const checkMembershipStatus = async () => {
32 try {
33 const res = await axios.get(`/echo/groups/${groupId}/members`);
34 const isMember = res.data.members.some(member => member.user_id === userId);
Krishya73cd8822025-06-07 15:48:41 +080035 setIsMember(isMember);
36 // setJoinStatus(groupId, isMember ? '加入成功' : '未加入');
Krishya6bf199c2025-06-06 21:14:23 +080037 } catch (error) {
38 console.error('检查成员状态失败:', error);
39 }
40 };
Krishyab5ef96d2025-06-05 13:57:05 +080041
42 const [showCreatePost, setShowCreatePost] = useState(false);
43
Krishya6bf199c2025-06-06 21:14:23 +080044 const handleLeaveGroup = async () => {
45 setLoading(true);
46 try {
47 const res = await axios.post(`/echo/groups/${groupId}/leave`, {
48 user_id: userId,
49 });
50 if (res.data.status === 'success') {
Krishya73cd8822025-06-07 15:48:41 +080051 fetchGroupList(); // 刷新小组列表
52 // setJoinStatus(groupId, '未加入');
Krishya6bf199c2025-06-06 21:14:23 +080053 setIsMember(false);
54 // 可选:刷新小组成员计数
55 group.memberCount = (group.memberCount || 0) - 1;
56 } else {
57 setError(res.data.message || '退出失败');
58 }
59 } catch (error) {
60 console.error('退出小组失败:', error);
61 setError('退出小组失败');
62 } finally {
63 setLoading(false);
64 }
65 };
66
67 // 修改加入小组逻辑(新增)
68 const handleJoin = async () => {
69 setLoading(true);
70 try {
71 const res = await handleJoinGroup(groupId, userId);
72 if (res && res.status === 'success') {
73 setJoinStatus(groupId, '加入成功');
74 setIsMember(true);
75 // 可选:刷新小组成员计数
76 group.memberCount = (group.memberCount || 0) + 1;
77 } else {
78 setError(res?.message || '加入失败');
79 }
80 } catch (error) {
81 console.error('加入小组失败:', error);
82 setError('加入小组失败');
83 } finally {
84 setLoading(false);
85 }
86 };
87
Krishyab5ef96d2025-06-05 13:57:05 +080088 return (
89 <div className="group-item">
90 <div className="group-content">
91 <img
92 style={{ width: '40%', height: '40%' }}
22301009e68c0dd2025-06-05 15:28:07 +080093 src={group.coverImage || 'https://picsum.photos/200/200'}
Krishyab5ef96d2025-06-05 13:57:05 +080094 alt={group.groupName}
95 className="group-cover"
96 />
97 <div className="group-info-right">
Krishya6bf199c2025-06-06 21:14:23 +080098 <h3>{group.groupName}</h3>
Krishyab5ef96d2025-06-05 13:57:05 +080099 <p style={{ color: '#BA929A' }}>{group.memberCount || 0}人加入了小组</p>
100
Krishya6bf199c2025-06-06 21:14:23 +0800101 {/* 加入/退出按钮逻辑 */}
102 {userId && (
103 <button
104 onClick={() => {
105 if (isMember) {
106 handleLeaveGroup();
107 } else {
108 handleJoin();
109 }
110 }}
111 disabled={loading}
112 >
113 {loading ? '处理中...' : isMember ? '退出小组' : '+加入小组'}
114 </button>
115 )}
116 {!userId && <button disabled>请登录</button>}
Krishyab5ef96d2025-06-05 13:57:05 +0800117
Krishya6bf199c2025-06-06 21:14:23 +0800118 {/* 显示错误信息(新增) */}
119 {error && <p style={{ color: 'red' }}>{error}</p>}
120
121 {/* 发布帖子按钮 */}
122 {userId && isMember && (
Krishyab5ef96d2025-06-05 13:57:05 +0800123 <button onClick={() => setShowCreatePost(!showCreatePost)}>
124 +发布帖子
125 </button>
126 )}
127 </div>
128 </div>
129
130 <div className="group-description">
131 <p>{group.description}</p>
132 </div>
133 <p>分类:{group.category}</p>
134
135 {showCreatePost && (
136 <CreatePostForm
137 groupId={groupId}
138 onClose={() => setShowCreatePost(false)}
139 />
140 )}
141 </div>
142 );
143};
144
Krishya6bf199c2025-06-06 21:14:23 +0800145export default GroupItem;