UNPKG

@replyke/core

Version:

Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.

111 lines 4.39 kB
import { useCallback, useEffect, useState } from "react"; import useAxiosPrivate from "../../../config/useAxiosPrivate"; import useProject from "../../projects/useProject"; import { handleError } from "../../../utils/handleError"; function useConversationMembers({ conversationId, }) { const { projectId } = useProject(); const axios = useAxiosPrivate(); const [members, setMembers] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (!projectId || !conversationId) return; const fetch = async () => { setLoading(true); try { const response = await axios.get(`/${projectId}/chat/conversations/${conversationId}/members`, { params: { limit: 100 } }); setMembers(response.data.data); } catch (err) { handleError(err, "Failed to load conversation members"); } finally { setLoading(false); } }; fetch(); }, [projectId, conversationId]); // eslint-disable-line react-hooks/exhaustive-deps const addMember = useCallback(async ({ userId }) => { if (!projectId || !conversationId) return; try { const response = await axios.post(`/${projectId}/chat/conversations/${conversationId}/members`, { userId }); const newMember = response.data; setMembers((prev) => { // Replace existing entry or append const idx = prev.findIndex((m) => m.userId === newMember.userId); if (idx !== -1) { const next = [...prev]; next[idx] = newMember; return next; } return [...prev, newMember]; }); } catch (err) { handleError(err, "Failed to add member"); throw err; } }, [projectId, conversationId, axios]); const removeMember = useCallback(async ({ userId }) => { if (!projectId || !conversationId) return; try { await axios.delete(`/${projectId}/chat/conversations/${conversationId}/members/${userId}`); setMembers((prev) => prev.filter((m) => m.userId !== userId)); } catch (err) { handleError(err, "Failed to remove member"); throw err; } }, [projectId, conversationId, axios]); const leave = useCallback(async () => { if (!projectId || !conversationId) return; try { await axios.delete(`/${projectId}/chat/conversations/${conversationId}/leave`); } catch (err) { handleError(err, "Failed to leave conversation"); throw err; } }, [projectId, conversationId, axios]); const upsertMember = useCallback((member) => { setMembers((prev) => { const idx = prev.findIndex((m) => m.userId === member.userId); if (idx !== -1) { const next = [...prev]; next[idx] = member; return next; } return [...prev, member]; }); }, []); const removeMemberLocally = useCallback(({ userId }) => { setMembers((prev) => prev.filter((m) => m.userId !== userId)); }, []); const changeRole = useCallback(async ({ userId, role }) => { if (!projectId || !conversationId) return; try { const response = await axios.patch(`/${projectId}/chat/conversations/${conversationId}/members/${userId}/role`, { role }); const updated = response.data; setMembers((prev) => { const idx = prev.findIndex((m) => m.userId === userId); if (idx !== -1) { const next = [...prev]; next[idx] = updated; return next; } return prev; }); } catch (err) { handleError(err, "Failed to change member role"); throw err; } }, [projectId, conversationId, axios]); return { members, loading, addMember, removeMember, leave, changeRole, upsertMember, removeMemberLocally }; } export default useConversationMembers; //# sourceMappingURL=useConversationMembers.js.map