Skip to content

Commit

Permalink
Create backdate.js
Browse files Browse the repository at this point in the history
  • Loading branch information
marcustyphoon committed Aug 16, 2024
1 parent ac7e4b3 commit 467ec8c
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/features/_index.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[
"accesskit",
"anti_capitalism",
"backdate",
"classic_search",
"cleanfeed",
"collapsed_queue",
Expand Down
100 changes: 100 additions & 0 deletions src/features/backdate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import { createControlButtonTemplate, cloneControlButton } from '../utils/control_buttons.js';
import { keyToCss } from '../utils/css_map.js';
import { dom } from '../utils/dom.js';
import { filterPostElements, postSelector } from '../utils/interface.js';
import { showModal, hideModal, modalCancelButton, showErrorModal } from '../utils/modals.js';
import { onNewPosts } from '../utils/mutations.js';
import { notify } from '../utils/notifications.js';
import { timelineObject } from '../utils/react_props.js';
import { apiFetch, createEditRequestBody } from '../utils/tumblr_helpers.js';

const symbolId = 'ri-calendar-view';
const buttonClass = 'xkit-backdate-button';
const formId = 'xkit-backdate-form';

const controlIconSelector = keyToCss('controlIcon');

let controlButtonTemplate;

const timezoneOffsetMs = new Date().getTimezoneOffset() * 60000;

const createDateTimeString = (parsableString) => {
const date = new Date(parsableString);

const YYYY = `${date.getFullYear()}`.padStart(4, '0');
const MM = `${date.getMonth() + 1}`.padStart(2, '0');
const DD = `${date.getDate()}`.padStart(2, '0');
const hh = `${date.getHours()}`.padStart(2, '0');
const mm = `${date.getMinutes()}`.padStart(2, '0');

return `${YYYY}-${MM}-${DD}T${hh}:${mm}`;
};

const onButtonClicked = async function ({ currentTarget: controlButton }) {
const postElement = controlButton.closest(postSelector);
const postId = postElement.dataset.id;

const { blog: { uuid } } = await timelineObject(postElement);
const { response: postData } = await apiFetch(`/v2/blog/${uuid}/posts/${postId}?fields[blogs]=name,avatar`);

const onSubmit = async event => {
event.preventDefault();
hideModal();

const { elements } = event.currentTarget;
const newDate = new Date(elements.date.valueAsNumber + timezoneOffsetMs);

try {
const { response: { displayText } } = await apiFetch(`/v2/blog/${uuid}/posts/${postId}`, {
method: 'PUT',
body: {
...createEditRequestBody(postData),
date: newDate.toISOString()
}
});
notify(displayText);

controlButton.remove();
} catch (exception) {
showErrorModal(exception);
}
};

const form = dom('form', { id: formId }, { submit: onSubmit }, [
dom('label', null, null, [
'New date:',
dom('input', { type: 'datetime-local', name: 'date', value: createDateTimeString(postData.date), required: true })
])
]);

const editButton = dom('input', { class: 'blue', type: 'submit', form: formId, value: 'Edit!' });

showModal({
title: 'Change post date?',
message: [form],
buttons: [modalCancelButton, editButton]
});
};

const processPosts = postElements => filterPostElements(postElements).forEach(async postElement => {
const existingButton = postElement.querySelector(`.${buttonClass}`);
if (existingButton !== null) { return; }

const editIcon = postElement.querySelector(`footer ${controlIconSelector} a[href*="/edit/"] use[href="#managed-icon__edit"]`);
if (!editIcon) { return; }
const editButton = editIcon.closest('a');

const clonedControlButton = cloneControlButton(controlButtonTemplate, { click: event => onButtonClicked(event).catch(showErrorModal) });
const controlIcon = editButton.closest(controlIconSelector);
controlIcon.before(clonedControlButton);
});

export const main = async function () {
controlButtonTemplate = createControlButtonTemplate(symbolId, buttonClass, 'Edit Date');
onNewPosts.addListener(processPosts);
};

export const clean = async function () {
onNewPosts.removeListener(processPosts);
$(`.${buttonClass}`).remove();
};
9 changes: 9 additions & 0 deletions src/features/backdate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"title": "Backdate",
"description": "Edit post dates",
"icon": {
"class_name": "ri-calendar-view",
"color": "white",
"background_color": "#000000"
}
}

0 comments on commit 467ec8c

Please sign in to comment.