blob: 8a8d67bd13a5e779313f939961ef5a68a25413b4 [file] [log] [blame]
import React, { useEffect, useState } from 'react';
import axios from 'axios';
import './InterestGroup.css';
import Header from '../../components/Header'; // 导入 Header 组件
const API_BASE = process.env.REACT_APP_API_BASE;
const InterestGroup = () => {
const [groups, setGroups] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const [category, setCategory] = useState('');
const [name, setName] = useState('');
const [page, setPage] = useState(1);
const [size, setSize] = useState(10);
const [totalPages, setTotalPages] = useState(1);
const [sortBy, setSortBy] = useState('member_count'); // 默认按照成员数排序
const [joinStatus, setJoinStatus] = useState({}); // 存储每个小组的加入状态
useEffect(() => {
// 请求兴趣小组列表
const fetchGroups = async () => {
try {
setLoading(true);
setError(null);
const response = await axios.get(`${API_BASE}/echo/groups`, {
params: {
category,
name,
page,
size,
sort_by: sortBy
}
});
if (response.data.status === 'success') {
setGroups(response.data.items);
setTotalPages(response.data.total_pages); // 更新总页数
} else {
setError('获取兴趣小组列表失败');
}
} catch (err) {
setError('请求失败,请稍后再试');
} finally {
setLoading(false);
}
};
fetchGroups();
}, [category, name, page, size, sortBy]);
const handleCategoryChange = (e) => {
setCategory(e.target.value);
setPage(1); // 重置为第一页
};
const handleSearchChange = (e) => {
setName(e.target.value);
setPage(1); // 重置为第一页
};
const handleSortChange = (e) => {
setSortBy(e.target.value);
};
const handlePageChange = (newPage) => {
if (newPage > 0 && newPage <= totalPages) {
setPage(newPage);
}
};
// 加入兴趣小组
const handleJoinGroup = async (groupId) => {
const userId = 1; // 假设用户ID为1,可以根据实际情况获取
try {
const response = await axios.post(`${API_BASE}/echo/groups/${groupId}/join`, {
user_id: userId
});
if (response.data.status === 'success') {
setJoinStatus(prevState => ({
...prevState,
[groupId]: '加入成功'
}));
} else {
setJoinStatus(prevState => ({
...prevState,
[groupId]: '加入失败'
}));
}
} catch (error) {
setJoinStatus(prevState => ({
...prevState,
[groupId]: '请求失败,请稍后再试'
}));
}
};
return (
<div className="interest-group-container">
{/* Header 组件放在页面最上方 */}
<Header />
<h1>兴趣小组列表</h1>
{/* 分类筛选 */}
<div className="filter">
<label>分类:</label>
<select onChange={handleCategoryChange} value={category}>
<option value="">全部</option>
<option value="影视">影视</option>
<option value="游戏">游戏</option>
<option value="学习">学习</option>
<option value="体育">体育</option>
<option value="其他">其他</option>
</select>
</div>
{/* 搜索框 */}
<div className="search">
<label>搜索:</label>
<input
type="text"
value={name}
onChange={handleSearchChange}
placeholder="输入小组名称搜索"
/>
</div>
{/* 排序 */}
<div className="sort">
<label>排序:</label>
<select onChange={handleSortChange} value={sortBy}>
<option value="member_count">按成员数排序</option>
<option value="name">按名称排序</option>
<option value="category">按分类排序</option>
</select>
</div>
{/* 加载中提示 */}
{loading && <p>加载中...</p>}
{/* 错误提示 */}
{error && <p className="error">{error}</p>}
{/* 小组列表 */}
{!loading && !error && (
<div className="group-list">
{groups.map((group) => (
<div className="group-item" key={group.group_id}>
<img
src={group.cover_image}
alt={group.name}
className="group-cover"
/>
<div className="group-info">
<h2>{group.name}</h2>
<p>{group.description}</p>
<p>成员数:{group.member_count}</p>
<p>分类:{group.category}</p>
{/* 加入小组按钮 */}
<button
onClick={() => handleJoinGroup(group.group_id)}
disabled={joinStatus[group.group_id] === '加入成功'}
>
{joinStatus[group.group_id] === '加入成功' ? '已加入' : '加入小组'}
</button>
{/* 显示加入状态 */}
{joinStatus[group.group_id] && <p>{joinStatus[group.group_id]}</p>}
</div>
</div>
))}
</div>
)}
{/* 分页 */}
<div className="pagination">
<button onClick={() => handlePageChange(page - 1)} disabled={page <= 1}>
上一页
</button>
<span> {page} / {totalPages} 页</span>
<button
onClick={() => handlePageChange(page + 1)}
disabled={page >= totalPages}
>
下一页
</button>
</div>
</div>
);
};
export default InterestGroup;