UNPKG

@replyke/core

Version:

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

116 lines 4.88 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = require("react"); const useAxiosPrivate_1 = __importDefault(require("../../../config/useAxiosPrivate")); const useProject_1 = __importDefault(require("../../projects/useProject")); const handleError_1 = require("../../../utils/handleError"); function useConversationMembers({ conversationId, }) { const { projectId } = (0, useProject_1.default)(); const axios = (0, useAxiosPrivate_1.default)(); const [members, setMembers] = (0, react_1.useState)([]); const [loading, setLoading] = (0, react_1.useState)(false); (0, react_1.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) { (0, handleError_1.handleError)(err, "Failed to load conversation members"); } finally { setLoading(false); } }; fetch(); }, [projectId, conversationId]); // eslint-disable-line react-hooks/exhaustive-deps const addMember = (0, react_1.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) { (0, handleError_1.handleError)(err, "Failed to add member"); throw err; } }, [projectId, conversationId, axios]); const removeMember = (0, react_1.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) { (0, handleError_1.handleError)(err, "Failed to remove member"); throw err; } }, [projectId, conversationId, axios]); const leave = (0, react_1.useCallback)(async () => { if (!projectId || !conversationId) return; try { await axios.delete(`/${projectId}/chat/conversations/${conversationId}/leave`); } catch (err) { (0, handleError_1.handleError)(err, "Failed to leave conversation"); throw err; } }, [projectId, conversationId, axios]); const upsertMember = (0, react_1.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 = (0, react_1.useCallback)(({ userId }) => { setMembers((prev) => prev.filter((m) => m.userId !== userId)); }, []); const changeRole = (0, react_1.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) { (0, handleError_1.handleError)(err, "Failed to change member role"); throw err; } }, [projectId, conversationId, axios]); return { members, loading, addMember, removeMember, leave, changeRole, upsertMember, removeMemberLocally }; } exports.default = useConversationMembers; //# sourceMappingURL=useConversationMembers.js.map