修改密码、管理员删帖、促销、退出登录

Change-Id: I2cc0e211ac5a04f9e89d0736fadd25541a5fccb9
diff --git a/src/pages/InterestGroup/GroupItem.jsx b/src/pages/InterestGroup/GroupItem.jsx
index 8fdc640..736f88d 100644
--- a/src/pages/InterestGroup/GroupItem.jsx
+++ b/src/pages/InterestGroup/GroupItem.jsx
@@ -1,20 +1,182 @@
-import React, { useState } from 'react';
+// 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 }) => {
-
-  console.log('group:', group);
-  const { handleJoinGroup, joinStatus } = useGroupStore();
+  const { handleJoinGroup, joinStatus, setJoinStatus } = useGroupStore();
   const { user } = useUser();
-  
+
   const userId = user?.userId;
-  const groupId = group.groupId; // ✅ 使用正确字段
-console.log('加入小组请求 - groupId:', group.group_id, 'userId:', 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">
@@ -25,18 +187,31 @@
           className="group-cover"
         />
         <div className="group-info-right">
-          <h3>{group.groupName}</h3> {/* ✅ 使用 groupName */}
+          <h3>{group.groupName}</h3>
           <p style={{ color: '#BA929A' }}>{group.memberCount || 0}人加入了小组</p>
 
-          <button
-            onClick={() => handleJoinGroup(groupId, userId)}
-            disabled={joinStatus[groupId] === '加入成功' || !userId}
-          >
-            
-            {joinStatus[groupId] === '加入成功' ? '已加入' : userId ? '+加入小组' : '请登录'}
-          </button>
+          {/* 加入/退出按钮逻辑 */}
+          {userId && (
+            <button
+              onClick={() => {
+                if (isMember) {
+                  handleLeaveGroup();
+                } else {
+                  handleJoin();
+                }
+              }}
+              disabled={loading}
+            >
+              {loading ? '处理中...' : isMember ? '退出小组' : '+加入小组'}
+            </button>
+          )}
+          {!userId && <button disabled>请登录</button>}
 
-          {userId && joinStatus[groupId] === '加入成功' && (
+          {/* 显示错误信息(新增) */}
+          {error && <p style={{ color: 'red' }}>{error}</p>}
+
+          {/* 发布帖子按钮 */}
+          {userId && isMember && (
             <button onClick={() => setShowCreatePost(!showCreatePost)}>
               +发布帖子
             </button>
@@ -59,4 +234,4 @@
   );
 };
 
-export default GroupItem;
\ No newline at end of file
+export default GroupItem;