0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-24 23:48:13 -05:00
ghost/apps/comments-ui/src/actions.js

321 lines
7.5 KiB
JavaScript
Raw Normal View History

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;
}
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
};
}
async function addComment({state, api, data: comment}) {
const data = await api.comments.add({comment});
comment = data.comments[0];
2022-07-07 11:24:39 +02:00
// Temporary workaround for missing member relation (bug in API)
const commentStructured = {
...comment,
2022-07-07 11:24:39 +02:00
member: state.member,
replies: []
};
2022-07-07 14:29:24 +02:00
return {
2022-07-05 16:10:24 +02:00
comments: [commentStructured, ...state.comments]
// 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;
})
};
}
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;
});
if (c.id === comment.id) {
return {
...c,
2022-07-07 14:33:37 +02:00
status: 'hidden',
replies
};
}
2022-07-07 14:33:37 +02:00
return {
...c,
replies
};
})
};
}
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;
});
if (c.id === comment.id) {
return {
...c,
2022-07-07 14:29:24 +02:00
status: 'published',
replies
};
}
2022-07-07 14:29:24 +02:00
return {
...c,
replies
};
})
};
}
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
})
};
}
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;
})
};
}
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;
}
function openPopup({data}) {
return {
popup: data
};
}
function closePopup() {
return {
popup: null
};
}
const Actions = {
// Put your actions here
addComment,
2022-07-07 10:29:29 +02:00
editComment,
hideComment,
2022-07-06 11:27:03 +02:00
deleteComment,
showComment,
2022-07-06 17:20:19 +02:00
likeComment,
unlikeComment,
reportComment,
2022-07-07 11:12:00 +02:00
addReply,
loadMoreComments,
updateMemberName,
openPopup,
closePopup
};
/** Handle actions in the App, returns updated state */
export default async function ActionHandler({action, data, state, api, adminApi}) {
const handler = Actions[action];
if (handler) {
return await handler({data, state, api, adminApi}) || {};
}
return {};
}