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