docbrown/app/javascript/packs/unpublishPostModal.jsx
Rajat Talesra bc0e5ced6c
Used PreactModal for unpublish-post feature (#18019)
* Used preact modal

* Minor fix

* UI fix

* Appplied minor suggestions
2022-07-06 16:29:08 +05:30

80 lines
2.3 KiB
JavaScript

/* eslint-disable no-restricted-globals */
import { closeWindowModal, showWindowModal } from '@utilities/showModal';
import { request } from '@utilities/http';
async function confirmAdminUnpublishPost(id, username, slug) {
try {
const response = await request(`/articles/${id}/admin_unpublish`, {
method: 'PATCH',
body: JSON.stringify({ id, username, slug }),
credentials: 'same-origin',
});
const outcome = await response.json();
/* eslint-disable no-restricted-globals */
if (outcome.message == 'success') {
window.top.location.assign(`${window.location.origin}${outcome.path}`);
} else {
top.addSnackbarItem({
message: `Error: ${outcome.message}`,
addCloseButton: true,
});
}
} catch (error) {
top.addSnackbarItem({
message: `Error: ${error}`,
addCloseButton: true,
});
}
closeWindowModal(window.parent.document);
}
let modalContents;
/**
* Helper function to handle finding and caching modal content. Since our Preact modal helper works by duplicating HTML content,
* and our modals rely on IDs to label form controls, we remove the original hidden content from the DOM to avoid ID conflicts.
*
* @param {string} modalContentSelector The CSS selector used to identify the correct modal content
*/
function getModalContents(modalContentSelector) {
if (!modalContents) {
const modalContentElement =
window.parent.document.querySelector(modalContentSelector);
modalContents = modalContentElement.innerHTML;
modalContentElement.remove();
}
return modalContents;
}
function activateModalUnpublishBtn(id, username, slug) {
const unpublishBtn = window.parent.document.getElementById(
'confirm-unpublish-post-action',
);
unpublishBtn?.addEventListener('click', () => {
confirmAdminUnpublishPost(id, username, slug);
});
}
/**
* Shows or hides the flag user modal.
*/
export function toggleUnpublishPostModal(event) {
event.preventDefault;
const { articleId, authorUsername, articleSlug, modalContentSelector } =
event.target.dataset;
showWindowModal({
document: window.parent.document,
modalContent: getModalContents(modalContentSelector),
title: 'Unpublish post',
size: 'small',
onOpen: () => {
activateModalUnpublishBtn(articleId, authorUsername, articleSlug);
},
});
}