Distraction free Gmail // inbox check detox

Designed for people who use to check their inbox too often. This script hides the Inbox and allows only 3 checks per day for 10 Minutes. Searching for emails and writing emails is possible all day.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Distraction free Gmail // inbox check detox
// @namespace    https://lukasferger.de
// @version      2025-03-27
// @description  Designed for people who use to check their inbox too often. This script hides the Inbox and allows only 3 checks per day for 10 Minutes. Searching for emails and writing emails is possible all day.
// @author       Lukas
// @license MIT means
// @match        https://mail.google.com/mail/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=google.com
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    // Konstanten
    const inboxSelector = 'div[role="main"]';
    const styleId = 'inbox-hide-style';
    const overlayId = 'flash-overlay';
    const maxViewsPerDay = 3;
    const viewDuration = 10 * 60 * 1000; // 10 Minuten
    const key = 'emailViews';
    var today = new Date().toISOString().split('T')[0];

    // Zähler laden/speichern
    let views = JSON.parse(localStorage.getItem(key) || '{}');
    if (!views[today]) { views[today] = 0; }
    localStorage.setItem(key, JSON.stringify(views));

    // Statusvariablen
    let manualViewActive = false; // Manuell aktivierte Ansicht (nur im aktuellen Tab)
    let timerId = null;
    let toggleButton = null;

    // CSS zum Ausblenden der Inbox – hier ohne innerHTML
    function injectHideStyle() {
        if (!document.getElementById(styleId)) {
            const style = document.createElement('style');
            style.id = styleId;
            style.textContent = `${inboxSelector} { display: none !important; }`;
            document.documentElement.appendChild(style);
        }
    }
    function removeHideStyle() {
        const style = document.getElementById(styleId);
        if (style) { style.remove(); }
    }

    // Overlay einfügen, um Flash während des Ladevorgangs zu verhindern
    function injectOverlay() {
        if (!document.getElementById(overlayId)) {
            const overlay = document.createElement('div');
            overlay.id = overlayId;
            overlay.style.position = 'fixed';
            overlay.style.top = '0';
            overlay.style.left = '0';
            overlay.style.width = '100%';
            overlay.style.height = '100%';
            overlay.style.backgroundColor = '#ffffff';
            overlay.style.zIndex = '10000';
            overlay.style.pointerEvents = 'none';
            document.documentElement.appendChild(overlay);
        }
    }
    // Overlay wird nach dem Laden entfernt – unabhängig vom Rest
    function removeOverlay() {
        const overlay = document.getElementById(overlayId);
        if (overlay) { overlay.remove(); }
    }

    // Prüft, ob die aktuelle URL eine Suchseite ist
    function isSearchUrl() {
        return location.hash && location.hash.startsWith('#search');
    }

    // Aktiviert den manuellen View – verbraucht einen View und startet den 10-Minuten-Timer
    function activateManualView() {
        today = new Date().toISOString().split('T')[0];
        if (views[today] >= maxViewsPerDay) {
            alert("Tageslimit erreicht.");
            return;
        }
        removeHideStyle();
        manualViewActive = true;
        views[today]++;
        localStorage.setItem(key, JSON.stringify(views));
        updateToggleButton();
        if (timerId) { clearTimeout(timerId); }
        timerId = setTimeout(() => {
            deactivateManualView();
        }, viewDuration);
    }

    // Deaktiviert den manuellen View – Inbox wird ausgeblendet
    function deactivateManualView() {
        injectHideStyle();
        manualViewActive = false;
        updateToggleButton();
        if (timerId) { clearTimeout(timerId); timerId = null; }
    }

    // Aktiviert den Suchmodus – Suchergebnisse sollen immer sichtbar sein, ohne View-Verbrauch
    function activateSearchView() {
        removeHideStyle();
        if (toggleButton) { toggleButton.style.display = 'none'; }
    }

    // Aktualisiert den Toggle-Button: Auf Nicht-Suchseiten sichtbar, Text je nach Status
    function updateToggleButton() {
        if (!toggleButton) return;
        if (isSearchUrl()) {
            toggleButton.style.display = 'none';
        } else {
            toggleButton.style.display = 'block';

            const remaining = maxViewsPerDay - views[today];
            toggleButton.innerText = manualViewActive ? 'Inbox ausblenden' : 'Inbox anzeigen (' + remaining + ')';
        }
    }

    // Toggle-Button einrichten
    function addToggleButton() {
        const remaining = maxViewsPerDay - views[today];

        toggleButton = document.createElement('button');
        toggleButton.innerText = 'Inbox anzeigen (' + remaining + ')';
        toggleButton.style.position = 'fixed';
        toggleButton.style.top = '10px';
        toggleButton.style.right = '10px';
        toggleButton.style.zIndex = '10001';
        toggleButton.style.padding = '8px';
        toggleButton.style.fontSize = '14px';
        toggleButton.style.backgroundColor = '#4285f4';
        toggleButton.style.color = 'white';
        toggleButton.style.border = 'none';
        toggleButton.style.borderRadius = '4px';
        toggleButton.style.cursor = 'pointer';
        toggleButton.onclick = () => {
            // Nur auf Nicht-Suchseiten
            if (manualViewActive) {
                deactivateManualView();
            } else {
                activateManualView();
            }
        };
        document.body.appendChild(toggleButton);
        updateToggleButton();
    }

    // Bei Navigation: Wenn du in einer Suchseite landest, aktiviere Suchmodus.
    // Falls du in Nicht-Suchseiten navigierst, bleibt der manuelle View aktiv, wenn er bereits aktiviert wurde.
    window.addEventListener('hashchange', () => {
        if (isSearchUrl()) {
            activateSearchView();
        } else {
            // Wenn manueller View aktiv, beibehalten – ansonsten Inbox ausblenden
            if (!manualViewActive) {
                injectHideStyle();
            }
            updateToggleButton();
        }
    });

    // Direkt beim Skriptstart: Inbox ausblenden und Overlay einfügen
    injectHideStyle();
    injectOverlay();

    // Sobald die Seite fertig geladen ist, wird der Overlay entfernt (unabhängig vom Rest)
    window.addEventListener('load', () => {
        removeOverlay();
        addToggleButton();
        if (isSearchUrl()) {
            activateSearchView();
        } else {
            // Wenn kein manueller View aktiv ist, bleibt die Inbox ausgeblendet
            if (!manualViewActive) {
                injectHideStyle();
            }
            updateToggleButton();
        }
    });
})();