Files
blog-eleventy-indiekit/js/share-post.js
Ricardo fb19a68f9e feat: replace Post button with post-type dropdown menu
Clicking Post now shows a dropdown with Note, Bookmark, Reply, Like,
Repost, and Article options. Each opens /posts/create with the
selected type and pre-filled URL/title in a popup window.
2026-02-28 11:12:07 +01:00

87 lines
2.4 KiB
JavaScript

/**
* Share Post — frontend module
* Opens the Indiekit post creation form in a popup window.
* Provides a dropdown menu with post type choices.
* Only active when user is logged in (body[data-indiekit-auth="true"]).
*/
(function () {
var POST_TYPES = [
{ value: 'note', label: 'Note' },
{ value: 'bookmark', label: 'Bookmark' },
{ value: 'reply', label: 'Reply' },
{ value: 'like', label: 'Like' },
{ value: 'repost', label: 'Repost' },
{ value: 'article', label: 'Article' }
];
function isLoggedIn() {
return document.body.getAttribute('data-indiekit-auth') === 'true';
}
function openPostPopup(type, url, title) {
var createUrl = '/posts/create'
+ '?type=' + encodeURIComponent(type)
+ '&url=' + encodeURIComponent(url)
+ '&name=' + encodeURIComponent(title);
window.open(
createUrl,
'PostCreator',
'resizable,scrollbars,status=0,toolbar=0,menubar=0,titlebar=0,width=620,height=780,location=0'
);
}
function createDropdown(button) {
if (button.querySelector('.post-type-dropdown')) return;
var url = button.dataset.shareUrl;
var title = button.dataset.shareTitle || '';
var dropdown = document.createElement('div');
dropdown.className = 'post-type-dropdown';
POST_TYPES.forEach(function (pt) {
var item = document.createElement('button');
item.type = 'button';
item.className = 'post-type-dropdown-item';
item.textContent = pt.label;
item.addEventListener('click', function (e) {
e.stopPropagation();
openPostPopup(pt.value, url, title);
closeAllDropdowns();
});
dropdown.appendChild(item);
});
button.style.position = 'relative';
button.appendChild(dropdown);
}
function closeAllDropdowns() {
document.querySelectorAll('.post-type-dropdown.open').forEach(function (d) {
d.classList.remove('open');
});
}
document.addEventListener('click', function (e) {
if (!isLoggedIn()) return;
var button = e.target.closest('.share-post-btn');
if (button) {
e.preventDefault();
e.stopPropagation();
createDropdown(button);
var dropdown = button.querySelector('.post-type-dropdown');
var wasOpen = dropdown.classList.contains('open');
closeAllDropdowns();
if (!wasOpen) {
dropdown.classList.add('open');
}
return;
}
// Click outside closes dropdowns
closeAllDropdowns();
});
})();