diff --git a/src/data/constants.js b/src/data/constants.js index 15508a8f..7302bbb2 100644 --- a/src/data/constants.js +++ b/src/data/constants.js @@ -55,6 +55,8 @@ export const ContentActions = { CHANGE_TOPIC: 'topic_id', CHANGE_TYPE: 'type', VOTE: 'voted', + ACCEPT_REVIEW: 'accept_review', + REJECT_REVIEW: 'reject_review', }; /** diff --git a/src/discussions/messages.js b/src/discussions/messages.js index c1cc14ed..4c713b09 100644 --- a/src/discussions/messages.js +++ b/src/discussions/messages.js @@ -26,6 +26,16 @@ const messages = defineMessages({ defaultMessage: 'Unpin', description: 'Action to unpin a post', }, + acceptReview: { + id: 'discussions.actions.reviewAccept', + defaultMessage: 'Accept Review', + description: 'Action to accept content flagged for review', + }, + rejectReview: { + id: 'discussions.actions.reviewReject', + defaultMessage: 'Reject Review', + description: 'Action to reject content flagged for review', + }, deleteAction: { id: 'discussions.actions.delete', defaultMessage: 'Delete', diff --git a/src/discussions/posts/data/api.js b/src/discussions/posts/data/api.js index a5b417e7..94b89dc1 100644 --- a/src/discussions/posts/data/api.js +++ b/src/discussions/posts/data/api.js @@ -151,6 +151,7 @@ export async function updateThread(threadId, { pinned, editReasonCode, closeReasonCode, + reviewStatus, } = {}) { const url = `${getThreadsApiUrl()}${threadId}/`; const patchData = snakeCaseObject({ @@ -166,6 +167,7 @@ export async function updateThread(threadId, { pinned, editReasonCode, closeReasonCode, + reviewStatus, }); const { data } = await getAuthenticatedHttpClient() .patch(url, patchData, { headers: { 'Content-Type': 'application/merge-patch+json' } }); diff --git a/src/discussions/posts/data/thunks.js b/src/discussions/posts/data/thunks.js index 691967ec..a71c6a9b 100644 --- a/src/discussions/posts/data/thunks.js +++ b/src/discussions/posts/data/thunks.js @@ -239,6 +239,7 @@ export function createNewThread({ export function updateExistingThread(threadId, { flagged, voted, read, topicId, type, title, content, following, closed, pinned, closeReasonCode, editReasonCode, + reviewStatus, }) { return async (dispatch) => { try { @@ -256,6 +257,7 @@ export function updateExistingThread(threadId, { pinned, editReasonCode, closeReasonCode, + reviewStatus, })); const data = await updateThread(threadId, { flagged, @@ -270,6 +272,7 @@ export function updateExistingThread(threadId, { pinned, editReasonCode, closeReasonCode, + reviewStatus, }); dispatch(updateThreadSuccess(camelCaseObject(data))); } catch (error) { diff --git a/src/discussions/posts/post/Post.jsx b/src/discussions/posts/post/Post.jsx index a4556b09..f94d364c 100644 --- a/src/discussions/posts/post/Post.jsx +++ b/src/discussions/posts/post/Post.jsx @@ -85,6 +85,8 @@ function Post({ [ContentActions.COPY_LINK]: () => { navigator.clipboard.writeText(`${window.location.origin}/${courseId}/posts/${post.id}`); }, [ContentActions.PIN]: () => dispatch(updateExistingThread(post.id, { pinned: !post.pinned })), [ContentActions.REPORT]: () => handleAbusedFlag(), + [ContentActions.ACCEPT_REVIEW]: () => dispatch(updateExistingThread(post.id, { reviewStatus: "ACCEPTED" })), + [ContentActions.REJECT_REVIEW]: () => dispatch(updateExistingThread(post.id, { reviewStatus: "REJECTED" })), }), [ showDeleteConfirmation, history, diff --git a/src/discussions/utils.js b/src/discussions/utils.js index 2c724fbd..ff7c2fa5 100644 --- a/src/discussions/utils.js +++ b/src/discussions/utils.js @@ -173,6 +173,20 @@ export const ACTIONS_LIST = [ label: messages.deleteAction, conditions: { canDelete: true }, }, + { + id: 'accept-review', + action: ContentActions.ACCEPT_REVIEW, + icon: Delete, // TODO: update this later + label: messages.acceptReview, + conditions: { reviewStatus: "PENDING" }, + }, + { + id: 'reject-review', + action: ContentActions.REJECT_REVIEW, + icon: Delete, // TODO: update this later + label: messages.rejectReview, + conditions: { reviewStatus: "PENDING" }, + }, ]; export function useActions(content) {