blob: d10a69a824a998c5bea349bc4d0f4afb630ad303 [file] [log] [blame]
import { createContext, useContext, useState, useCallback } from 'react';
import { fetchGroups, joinGroup, createPost } from '../services/groupService';
const GroupContext = createContext();
export const GroupProvider = ({ children }) => {
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({});
// 获取小组列表
const fetchGroupList = useCallback(async () => {
try {
setLoading(true);
setError(null);
const requestData = {
page,
size,
sort_by: sortBy
};
if (category) requestData.category = category;
if (name) requestData.name = name;
const response = await fetchGroups(requestData);
if (response.status === 'success') {
setGroups(response.items || []);
setTotalPages(response.total_pages || 1);
} else {
setError('获取兴趣小组列表失败');
}
} catch (err) {
setError('请求失败,请稍后再试');
} finally {
setLoading(false);
}
}, [category, name, page, size, sortBy]);
// 加入小组
const handleJoinGroup = useCallback(async (groupId, userId) => {
if (!userId) return;
try {
setJoinStatus(prev => ({ ...prev, [groupId]: '请求中' }));
const response = await joinGroup(groupId, userId);
if (response.status === 'success') {
setJoinStatus(prev => ({ ...prev, [groupId]: '加入成功' }));
fetchGroupList(); // 刷新列表
} else {
setJoinStatus(prev => ({ ...prev, [groupId]: '加入失败' }));
}
} catch (error) {
setJoinStatus(prev => ({ ...prev, [groupId]: '请求失败' }));
}
}, [fetchGroupList]);
// 创建帖子
const handleCreatePost = useCallback(async (groupId, userId, content, title, images) => {
if (!userId || !content || !title) return;
try {
const response = await createPost(groupId, userId, content, title, images);
if (response.post_id) {
return true; // 成功
} else {
throw new Error('创建帖子失败');
}
} catch (error) {
console.error('创建帖子错误:', error);
return false;
}
}, []);
const value = {
groups,
loading,
error,
category,
setCategory,
name,
setName,
page,
setPage,
size,
setSize,
totalPages,
sortBy,
setSortBy,
joinStatus,
setJoinStatus,
fetchGroupList,
handleJoinGroup,
handleCreatePost
};
return (
<GroupContext.Provider value={value}>
{children}
</GroupContext.Provider>
);
};
export const useGroupStore = () => useContext(GroupContext);