@replyke/core
Version:
Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.
111 lines • 4.39 kB
JavaScript
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