2022-07-05 15:53:28 +02:00
|
|
|
async function loadMoreComments({state, api}) {
|
2022-07-05 14:24:29 +02:00
|
|
|
let page = 1;
|
|
|
|
if (state.pagination && state.pagination.page) {
|
|
|
|
page = state.pagination.page + 1;
|
|
|
|
}
|
2022-07-05 15:53:28 +02:00
|
|
|
const data = await api.comments.browse({page, postId: state.postId});
|
2022-07-07 14:29:24 +02:00
|
|
|
|
2022-07-05 16:08:08 +02:00
|
|
|
// Note: we store the comments from new to old, and show them in reverse order
|
2022-07-05 14:24:29 +02:00
|
|
|
return {
|
2022-07-05 16:08:08 +02:00
|
|
|
comments: [...state.comments, ...data.comments],
|
2022-07-05 14:24:29 +02:00
|
|
|
pagination: data.meta.pagination
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-05 15:53:28 +02:00
|
|
|
async function addComment({state, api, data: comment}) {
|
2022-07-06 17:30:44 +02:00
|
|
|
const data = await api.comments.add({comment});
|
|
|
|
comment = data.comments[0];
|
2022-07-05 15:53:28 +02:00
|
|
|
|
2022-07-07 11:24:39 +02:00
|
|
|
// Temporary workaround for missing member relation (bug in API)
|
2022-07-05 15:53:28 +02:00
|
|
|
const commentStructured = {
|
|
|
|
...comment,
|
2022-07-07 11:24:39 +02:00
|
|
|
member: state.member,
|
|
|
|
replies: []
|
2022-07-05 15:53:28 +02:00
|
|
|
};
|
2022-07-07 14:29:24 +02:00
|
|
|
|
2022-07-05 15:30:04 +02:00
|
|
|
return {
|
2022-07-05 16:10:24 +02:00
|
|
|
comments: [commentStructured, ...state.comments]
|
2022-07-05 15:30:04 +02:00
|
|
|
// todo: fix pagination now?
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-07 11:12:00 +02:00
|
|
|
async function addReply({state, api, data: {reply, parent}}) {
|
|
|
|
let comment = reply;
|
|
|
|
comment.parent_id = parent.id;
|
|
|
|
|
|
|
|
const data = await api.comments.add({comment});
|
|
|
|
comment = data.comments[0];
|
|
|
|
|
|
|
|
// Temporary workaround for missing member relation (bug in API)
|
|
|
|
comment = {
|
|
|
|
...comment,
|
|
|
|
member: state.member
|
|
|
|
};
|
2022-07-07 14:29:24 +02:00
|
|
|
|
2022-07-07 11:12:00 +02:00
|
|
|
// Replace the comment in the state with the new one
|
|
|
|
return {
|
|
|
|
comments: state.comments.map((c) => {
|
|
|
|
if (c.id === parent.id) {
|
|
|
|
return {
|
|
|
|
...parent,
|
|
|
|
replies: [...parent.replies, comment]
|
|
|
|
};
|
|
|
|
}
|
|
|
|
return c;
|
|
|
|
})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-06 11:11:54 +02:00
|
|
|
async function hideComment({state, adminApi, data: comment}) {
|
|
|
|
await adminApi.hideComment(comment.id);
|
|
|
|
|
|
|
|
return {
|
|
|
|
comments: state.comments.map((c) => {
|
2022-07-07 14:33:37 +02:00
|
|
|
const replies = c.replies.map((r) => {
|
|
|
|
if (r.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...r,
|
|
|
|
status: 'hidden'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return r;
|
|
|
|
});
|
|
|
|
|
2022-07-06 11:11:54 +02:00
|
|
|
if (c.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...c,
|
2022-07-07 14:33:37 +02:00
|
|
|
status: 'hidden',
|
|
|
|
replies
|
2022-07-06 11:11:54 +02:00
|
|
|
};
|
|
|
|
}
|
2022-07-07 14:33:37 +02:00
|
|
|
|
|
|
|
return {
|
|
|
|
...c,
|
|
|
|
replies
|
|
|
|
};
|
2022-07-06 11:11:54 +02:00
|
|
|
})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-06 11:45:45 +02:00
|
|
|
async function showComment({state, adminApi, data: comment}) {
|
|
|
|
await adminApi.showComment(comment.id);
|
|
|
|
|
|
|
|
return {
|
|
|
|
comments: state.comments.map((c) => {
|
2022-07-07 14:29:24 +02:00
|
|
|
const replies = c.replies.map((r) => {
|
|
|
|
if (r.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...r,
|
|
|
|
status: 'published'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return r;
|
|
|
|
});
|
|
|
|
|
2022-07-06 11:45:45 +02:00
|
|
|
if (c.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...c,
|
2022-07-07 14:29:24 +02:00
|
|
|
status: 'published',
|
|
|
|
replies
|
2022-07-06 11:45:45 +02:00
|
|
|
};
|
|
|
|
}
|
2022-07-07 14:29:24 +02:00
|
|
|
|
|
|
|
return {
|
|
|
|
...c,
|
|
|
|
replies
|
|
|
|
};
|
2022-07-06 11:45:45 +02:00
|
|
|
})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-06 17:20:19 +02:00
|
|
|
async function likeComment({state, api, data: comment}) {
|
|
|
|
await api.comments.like({comment});
|
|
|
|
|
|
|
|
return {
|
|
|
|
comments: state.comments.map((c) => {
|
2022-07-07 14:47:04 +02:00
|
|
|
const replies = c.replies.map((r) => {
|
|
|
|
if (r.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...r,
|
|
|
|
liked: true,
|
|
|
|
likes_count: r.likes_count + 1
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return r;
|
|
|
|
});
|
|
|
|
|
2022-07-06 17:20:19 +02:00
|
|
|
if (c.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...c,
|
|
|
|
liked: true,
|
2022-07-07 14:47:04 +02:00
|
|
|
likes_count: c.likes_count + 1,
|
|
|
|
replies
|
2022-07-06 17:20:19 +02:00
|
|
|
};
|
|
|
|
}
|
2022-07-07 14:47:04 +02:00
|
|
|
|
|
|
|
return {
|
|
|
|
...c,
|
|
|
|
replies
|
|
|
|
};
|
2022-07-06 17:20:19 +02:00
|
|
|
})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-18 17:36:09 +02:00
|
|
|
async function reportComment({state, api, data: comment}) {
|
|
|
|
await api.comments.report({comment});
|
|
|
|
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
2022-07-06 17:20:19 +02:00
|
|
|
async function unlikeComment({state, api, data: comment}) {
|
|
|
|
await api.comments.unlike({comment});
|
|
|
|
|
|
|
|
return {
|
|
|
|
comments: state.comments.map((c) => {
|
2022-07-07 14:47:04 +02:00
|
|
|
const replies = c.replies.map((r) => {
|
|
|
|
if (r.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...r,
|
|
|
|
liked: false,
|
|
|
|
likes_count: r.likes_count - 1
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return r;
|
|
|
|
});
|
|
|
|
|
2022-07-06 17:20:19 +02:00
|
|
|
if (c.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...c,
|
|
|
|
liked: false,
|
2022-07-07 14:47:04 +02:00
|
|
|
likes_count: c.likes_count - 1,
|
|
|
|
replies
|
2022-07-06 17:20:19 +02:00
|
|
|
};
|
|
|
|
}
|
2022-07-07 14:47:04 +02:00
|
|
|
return {
|
|
|
|
...c,
|
|
|
|
replies
|
|
|
|
};
|
2022-07-06 17:20:19 +02:00
|
|
|
})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-06 11:27:03 +02:00
|
|
|
async function deleteComment({state, api, data: comment}) {
|
|
|
|
await api.comments.edit({
|
|
|
|
comment: {
|
|
|
|
id: comment.id,
|
|
|
|
status: 'deleted'
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return {
|
|
|
|
comments: state.comments.map((c) => {
|
2022-07-07 14:29:24 +02:00
|
|
|
const replies = c.replies.map((r) => {
|
|
|
|
if (r.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...r,
|
|
|
|
status: 'deleted'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return r;
|
|
|
|
});
|
|
|
|
|
2022-07-06 11:27:03 +02:00
|
|
|
if (c.id === comment.id) {
|
|
|
|
return {
|
|
|
|
...c,
|
2022-07-07 14:29:24 +02:00
|
|
|
status: 'deleted',
|
|
|
|
replies
|
2022-07-06 11:27:03 +02:00
|
|
|
};
|
|
|
|
}
|
2022-07-07 14:29:24 +02:00
|
|
|
|
|
|
|
return {
|
|
|
|
...c,
|
|
|
|
replies
|
|
|
|
};
|
2022-07-06 11:27:03 +02:00
|
|
|
})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-07 11:39:12 +02:00
|
|
|
async function editComment({state, api, data: {comment, parent}}) {
|
2022-07-07 10:29:29 +02:00
|
|
|
const data = await api.comments.edit({
|
|
|
|
comment
|
|
|
|
});
|
|
|
|
comment = data.comments[0];
|
|
|
|
|
|
|
|
// Replace the comment in the state with the new one
|
|
|
|
return {
|
|
|
|
comments: state.comments.map((c) => {
|
2022-07-07 11:39:12 +02:00
|
|
|
if (parent && parent.id === c.id) {
|
|
|
|
return {
|
|
|
|
...c,
|
|
|
|
replies: c.replies.map((r) => {
|
|
|
|
if (r.id === comment.id) {
|
|
|
|
return comment;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
})
|
|
|
|
};
|
|
|
|
} else if (c.id === comment.id) {
|
2022-07-07 10:29:29 +02:00
|
|
|
return comment;
|
|
|
|
}
|
2022-07-07 14:29:24 +02:00
|
|
|
|
2022-07-07 10:29:29 +02:00
|
|
|
return c;
|
|
|
|
})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-21 15:47:51 +05:30
|
|
|
async function updateMemberName({data, state, api}) {
|
|
|
|
const {name} = data;
|
|
|
|
const originalName = state?.member?.name;
|
|
|
|
if (originalName !== name) {
|
|
|
|
try {
|
|
|
|
const member = await api.member.update({name});
|
|
|
|
if (!member) {
|
|
|
|
throw new Error('Failed to update member');
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
member,
|
|
|
|
success: true
|
|
|
|
};
|
|
|
|
} catch (err) {
|
|
|
|
return {
|
|
|
|
success: false,
|
|
|
|
error: err
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2022-07-04 17:23:01 +02:00
|
|
|
const Actions = {
|
|
|
|
// Put your actions here
|
2022-07-05 15:30:04 +02:00
|
|
|
addComment,
|
2022-07-07 10:29:29 +02:00
|
|
|
editComment,
|
2022-07-06 11:11:54 +02:00
|
|
|
hideComment,
|
2022-07-06 11:27:03 +02:00
|
|
|
deleteComment,
|
2022-07-06 11:45:45 +02:00
|
|
|
showComment,
|
2022-07-06 17:20:19 +02:00
|
|
|
likeComment,
|
|
|
|
unlikeComment,
|
2022-07-18 17:36:09 +02:00
|
|
|
reportComment,
|
2022-07-07 11:12:00 +02:00
|
|
|
addReply,
|
2022-07-21 15:47:51 +05:30
|
|
|
loadMoreComments,
|
|
|
|
updateMemberName
|
2022-07-04 17:23:01 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/** Handle actions in the App, returns updated state */
|
2022-07-06 11:11:54 +02:00
|
|
|
export default async function ActionHandler({action, data, state, api, adminApi}) {
|
2022-07-04 17:23:01 +02:00
|
|
|
const handler = Actions[action];
|
|
|
|
if (handler) {
|
2022-07-06 11:11:54 +02:00
|
|
|
return await handler({data, state, api, adminApi}) || {};
|
2022-07-04 17:23:01 +02:00
|
|
|
}
|
|
|
|
return {};
|
|
|
|
}
|