🏠 Home 

Tweetdecコレクション操作改善

コレクションを表示してるときの操作を改善

// ==UserScript==
// @name         Tweetdecコレクション操作改善
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  コレクションを表示してるときの操作を改善
// @author       y_kahou
// @match        https://tweetdeck.twitter.com/
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// @noframes
// ==/UserScript==
if (typeof GM_getValue('addCollectionHide') === "undefined") { GM_setValue('addCollectionHide', false) }
if (typeof GM_getValue('actionsMenuHide') === "undefined") { GM_setValue('actionsMenuHide', false) }
if (typeof GM_getValue('dragHandleHide') === "undefined") { GM_setValue('dragHandleHide', false) }
// addCollectionボタンを非表示
let addCollectionHide = GM_getValue('addCollectionHide', false);
if (addCollectionHide) {
GM_addStyle(' ul.tweet-actions>li[title="Add Collection"] { display: none; } ')
}
// アクションメニュー「…」ボタンを非表示
let actionsMenuHide = GM_getValue('actionsMenuHide', false);
if (actionsMenuHide) {
GM_addStyle(' ul.tweet-actions>li:nth-child(4) { display: none; } ')
}
// Drag to Collection「十」矢印ボタンを非表示
let dragHandleHide = GM_getValue('dragHandleHide', false);
if (dragHandleHide) {
GM_addStyle(' li.tweet-drag-handle { display: none; } ')
}
class AddCollection {
inject(article) {
let btn_group = article.querySelector('div[role="group"]:last-of-type, ul.tweet-actions, ul.tweet-detail-actions');
if (btn_group.querySelector('[rel="removeFromCustomTimeline"]')) {
return;
}
let handle = btn_group.querySelector('.tweet-drag-handle');
handle.classList.remove('margin-l--7');
handle.classList.add('margin-r--10');
let collection = handle.cloneNode(true);
collection.setAttribute('title', 'Add Collection')
collection.classList.remove('tweet-drag-handle');
collection.classList.remove('margin-l--7');
collection.classList.add('margin-r--10');
collection.querySelector('i').classList.remove('icon-move');
collection.querySelector('i').classList.add('icon-custom-timeline');
collection.querySelector('span.is-vishidden').textContent = 'Add Collection';
collection.addEventListener('click', e => {
this.click(btn_group);
e.stopPropagation();
})
btn_group.appendChild(collection);
article.dataset.c_injected = 'true';
}
async click(group) {
let menu = group.querySelector('li:nth-child(4)');
menu.querySelector('a').click();
await wait(200)
let ac = menu.querySelector('.feature-customtimelines')
ac.classList.add('is-selected')
ac.querySelector('a').click()
await wait(200)
if (document.querySelector('#actions-modal h3').textContent != ' Include Tweet in:') {
return;
}
if (document.querySelectorAll('#actions-modal li').length == 1) {
let checkbox = document.querySelector('#actions-modal li [type="checkbox"]');
if (!checkbox.checked) {
checkbox.click()
}
document.querySelector('#actions-modal button').click();
}
}
}
function wait(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms);
})
}
(function () {
const AD = new AddCollection();
// 全体を監視してボタン追加の処理を実行
new MutationObserver(ms => ms.forEach(m => m.addedNodes.forEach(node => {
let article = node.tagName == 'ARTICLE' && node || node.tagName == 'DIV' && (node.querySelector('article') || node.closest('article'));
if (article && !article.dataset.c_injected && article.dataset.tweetId) AD.inject(article);
}))).observe(document.body, {childList: true, subtree: true});
})();