Greasy Fork

Greasy Fork is available in English.

WhatsApp Web Sohbet Arşivle Butonu

WhatsApp Web sohbet listesine hızlı arşivleme simgesi ekler.

// ==UserScript==
// @name WhatsApp Web Sohbet Arşivle Butonu
// @namespace http://tampermonkey.net/ or https://violentmonkey.github.io
// @version 0.8
// @description WhatsApp Web sohbet listesine hızlı arşivleme simgesi ekler.
// @author CustME
// @match https://web.whatsapp.com/
// @grant none
// @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0zIDhoMThtMC00SDMuMTdhMiAyIDAgMDAtMS45MiAyLjU4TDMuMDcgMjlhMiAyIDAgMDAxLjkzIDEuNDJINi40NWEyIDIgMCAwMDItMlY0eiIvPjxwYXRoIGQ9Ik0xMiAxNlY2Ii8+PHBhdGggZD0iTTcgMTEuMkwxMiAxNmw1LTMuMiIvPjwvc3ZnPg==
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    const svgNS = 'http://www.w3.org/2000/svg';

    function addArchiveButton(chatElement) {
        if (chatElement.classList.contains('archive-button-added')) {
            return;
        }
        chatElement.classList.add('archive-button-added');

        const timeStatusContainer = chatElement.querySelector('._ak8j');
        if (!timeStatusContainer) {
            console.warn('WhatsApp: Zaman/durum konteyneri (._ak8j) bulunamadı:', chatElement);
            return;
        }

        if (timeStatusContainer.querySelector('.whatsapp-archive-button')) {
            return;
        }

        const button = document.createElement('button');
        button.className = 'whatsapp-archive-button';
        button.title = 'Sohbeti Arşivle';
        button.style.cssText = `
            width: 18px;
            height: 18px;
            min-width: 18px;
            background-color: #e9e9eb;
            border: none;
            border-radius: 3px;
            cursor: pointer;
            color: #555;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 0;
            margin-left: 5px;
            opacity: 0.8;
            transition: opacity 0.1s ease-in-out;
            flex-shrink: 0;
        `;

        // Yeni, daha modern arşiv ikonu SVG'si
        const svg = document.createElementNS(svgNS, 'svg');
        svg.setAttribute('viewBox', '0 0 24 24');
        svg.setAttribute('width', '100%');
        svg.setAttribute('height', '100%');
        svg.setAttribute('fill', 'none');
        svg.setAttribute('stroke', 'currentColor');
        svg.setAttribute('stroke-width', '2');
        svg.setAttribute('stroke-linecap', 'round');
        svg.setAttribute('stroke-linejoin', 'round');

        const path = document.createElementNS(svgNS, 'path');
        path.setAttribute('d', 'M3 8h18m0-4H3.17a2 2 0 00-1.92 2.58L3.07 29a2 2 0 001.93 1.42H6.45a2 2 0 002-2V4z'); // Kasa veya kutu kısmı
        const path2 = document.createElementNS(svgNS, 'path');
        path2.setAttribute('d', 'M12 16V6'); // Okun dikey çizgisi
        const path3 = document.createElementNS(svgNS, 'path');
        path3.setAttribute('d', 'M7 11.2L12 16l5-3.2'); // Okun başı
        
        svg.appendChild(path);
        svg.appendChild(path2);
        svg.appendChild(path3);
        button.appendChild(svg);

        button.addEventListener('mouseover', () => { button.style.opacity = '1'; });
        button.addEventListener('mouseout', () => { button.style.opacity = '0.8'; });

        button.addEventListener('click', (event) => {
            event.stopPropagation();
            event.preventDefault();

            const targetChat = event.target.closest('._ak8l');
            if (!targetChat) return;

            const chatRect = targetChat.getBoundingClientRect();
            const contextMenuEvent = new MouseEvent('contextmenu', {
                bubbles: true,
                cancelable: true,
                clientX: chatRect.left + chatRect.width - 20,
                clientY: chatRect.top + chatRect.height / 2
            });
            targetChat.dispatchEvent(contextMenuEvent);

            setTimeout(() => {
                const contextMenu = document.querySelector('._ak4w');

                if (contextMenu) {
                    let archiveMenuItem = null;

                    // 1. Yol: data-icon ile arama (en güvenilir yol)
                    archiveMenuItem = contextMenu.querySelector('li[role="button"] > div > span[data-icon="archive-refreshed"]');

                    if (!archiveMenuItem) {
                        // 2. Yol: Eğer data-icon bulunamazsa, innerText ile arama (yedek)
                        archiveMenuItem = Array.from(contextMenu.querySelectorAll('li[role="button"]'))
                                             .find(item => item.querySelector('span.x1o2sk6j')?.innerText === 'Sohbeti arşivle');
                    }
                    
                    if (archiveMenuItem) {
                        // Bulunan menü öğesinin en yakın li elementine tıklayın
                        archiveMenuItem.closest('li[role="button"]').click();
                        console.log('WhatsApp: Arşiv butonu tıklandı, menü öğesi bulundu ve tıklandı.');
                    } else {
                        console.error('WhatsApp: "Sohbeti arşivle" menü öğesi bulunamadı. Mevcut menü öğeleri:');
                        contextMenu.querySelectorAll('li[role="button"]').forEach(item => {
                            const spanText = item.querySelector('span.x1o2sk6j')?.innerText;
                            const dataIcon = item.querySelector('span[data-icon]')?.getAttribute('data-icon');
                            console.log(`- Metin: "${spanText || 'Yok'}", İkon: "${dataIcon || 'Yok'}"`);
                        });
                    }
                } else {
                    console.error('WhatsApp: Bağlam menüsü konteyneri (._ak4w) bulunamadı.');
                }
            }, 150); // Gecikmeyi 150ms'ye çıkarıldı.

        });

        timeStatusContainer.appendChild(button);
    }

    const chatListContainerSelector = 'div[aria-label="Sohbet listesi"][role="grid"]';

    const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
            if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                mutation.addedNodes.forEach((node) => {
                    if (node.nodeType === 1) {
                        if (node.classList && node.classList.contains('_ak8l')) {
                            addArchiveButton(node);
                        }
                        if (node.querySelectorAll) {
                            node.querySelectorAll('._ak8l').forEach(addArchiveButton);
                        }
                    }
                });
            }
        });
    });

    function findContainerAndObserve() {
        const chatListContainer = document.querySelector(chatListContainerSelector);
        if (chatListContainer) {
            console.log('WhatsApp: Sohbet listesi konteyneri bulundu. Mevcut sohbetlere butonlar ekleniyor ve yenileri gözlemleniyor.');
            chatListContainer.querySelectorAll('._ak8l').forEach(addArchiveButton);
            observer.observe(chatListContainer, { childList: true, subtree: false });
        } else {
            console.log('WhatsApp: Sohbet listesi konteyneri (', chatListContainerSelector, ') bulunamadı. Tekrar deneniyor...');
            setTimeout(findContainerAndObserve, 1000);
        }
    }

    window.addEventListener('load', () => {
        setTimeout(findContainerAndObserve, 500);
    });

})();