Youtube Logout Confirm

Prevent logout all your account accidentally by misclick at YouTube.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         Youtube Logout Confirm
// @name:zh      防止在 Youtube 誤觸登出
// @namespace    http://tampermonkey.net/
// @author       Microdust
// @version      1.0
// @description  Prevent logout all your account accidentally by misclick at YouTube.
// @description:zh  為 Youtube 登出鈕增加確認對話框,避免誤點導致帳號全部登出
// @include      *://*.youtube.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    const MSG = (() => {
        const userLanguage = navigator.language || navigator.userLanguage;
        switch (userLanguage) {
            case 'zh-TW':
                return '確定要登出嗎?';
            case 'zh-HK':
                return '確定要登出嗎?';
            case 'zh-CN':
                return '确定要登出吗?';
            default:
                return 'Are you sure you want to log out?';
        }
    })();

    function confirmLogout(element) {
        const parent = element.closest('a');
        if (parent && !parent.dataset.processed) {
            parent.dataset.processed = 'true';
            const clonedLink = parent.cloneNode(false);
            clonedLink.removeAttribute('href');
            clonedLink.appendChild(parent.children[0]);
            clonedLink.addEventListener('click', (event) => {
                event.preventDefault();
                if (confirm(MSG)) {
                    parent.click();
                }
            });

            parent.parentElement.insertBefore(clonedLink, parent);
            parent.style.display = 'none';
        }
    }

    const observer = new MutationObserver((mutationsList) => {
        for (const mutation of mutationsList) {
            if (mutation.type === 'childList') {
                const logoutElements = Array.from(document.querySelectorAll('[id=endpoint]')).filter(el => el.href.includes('logout') && !el.closest('a').dataset.processed);
                if (logoutElements.length) {
                    confirmLogout(logoutElements[0]);
                }
            }
        }
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();