Greasy Fork is available in English.

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});
})();