Medium Freedium Button

Adds a "Freedium" button to Medium posts

// ==UserScript==
// @name         Medium Freedium Button
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Adds a "Freedium" button to Medium posts
// @author       lmdw
// @match        *://medium.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let found = false; // Biến để theo dõi xem đã tìm thấy bài đăng hay chưa
    let url = window.location.href; // Lưu URL ban đầu
    let checkInterval; // Biến để lưu interval ID
    let timeout; // Biến để lưu timeout ID
    let metaTagRef = null; // Lưu trữ tham chiếu đến tag meta (tối ưu hóa)
    let freediumButton = null; // Biến để lưu tham chiếu đến nút Freedium

    // Function to create and append the Freedium button
    function createFreediumButton() {
        // Create the button element
        freediumButton = document.createElement('button');
        freediumButton.textContent = 'Freedium';

        // Style the button to match Medium's design (example styles - adjust as needed)
        freediumButton.style.position = 'fixed';
        freediumButton.style.top = '50%'; // Position vertically centered
        freediumButton.style.right = '10px'; // Position near the scrollbar
        freediumButton.style.transform = 'translateY(-50%)'; // Correct vertical centering
        freediumButton.style.backgroundColor = '#292929';
        freediumButton.style.color = '#fff';
        freediumButton.style.border = 'none';
        freediumButton.style.padding = '10px 15px';
        freediumButton.style.borderRadius = '4px';
        freediumButton.style.cursor = 'pointer';
        freediumButton.style.zIndex = '9999'; // Ensure it's on top of other elements
        freediumButton.style.fontFamily = 'sohne, "Helvetica Neue", Helvetica, Arial, sans-serif'; // Medium's font
        freediumButton.style.fontSize = '14px';

        // Add opacity and hover effect
        freediumButton.style.opacity = '0.4'; // Initial opacity (more transparent)
        freediumButton.style.transition = 'opacity 0.2s ease-in-out'; // Smooth transition

        freediumButton.addEventListener('mouseover', function() {
            freediumButton.style.opacity = '1'; // Fully opaque on hover
            freediumButton.style.backgroundColor = '#3e3e3e';
        });
        freediumButton.addEventListener('mouseout', function() {
            freediumButton.style.opacity = '0.6'; // Return to original opacity
            freediumButton.style.backgroundColor = '#292929';
        });


        // Add the click event listener to redirect to Freedium
        freediumButton.addEventListener('click', function() {
            window.location.href = 'https://freedium.cfd/' + window.location.href;
        });

        // Append the button to the body
        document.body.appendChild(freediumButton);
    }

    function checkAndPrint() {
        if (!metaTagRef) {
            metaTagRef = document.querySelector('meta[data-rh="true"][property="og:type"][content="article"]');
        }

        if (metaTagRef) {
            // In thông báo nổi bật bằng CSS
            console.log('%cFound Medium post', 'color: white; background-color: green; font-size: 16px; padding: 5px;');
            createFreediumButton();
            found = true;
            clearInterval(checkInterval);
            clearTimeout(timeout);

        }
    }

    function notFound() {
        if (!found) {
            console.log('%cNot found Medium post', 'color: white; background-color: red; font-size: 16px; padding: 5px;');
            clearInterval(checkInterval);
            found = true;
        }
    }

    function startChecking() {
        // Xóa nút Freedium nếu nó tồn tại
        if (freediumButton) {
            freediumButton.remove();
            freediumButton = null;
        }

        found = false;
        metaTagRef = null; // Reset tham chiếu tag meta
        clearInterval(checkInterval);
        clearTimeout(timeout);

        checkInterval = setInterval(checkAndPrint, 1000);

        timeout = setTimeout(notFound, 5000);
    }

    // Kiểm tra khi trang được tải xong hoàn toàn (load event)
    window.addEventListener('load', function() {
        startChecking();
    });

    // Theo dõi thay đổi URL (giảm tần suất kiểm tra)
    setInterval(function() {
        if (window.location.href !== url) {
            url = window.location.href;
            startChecking();
        }
    }, 1000);

    window.addEventListener('beforeunload', function (e) {
        clearInterval(checkInterval);
        clearTimeout(timeout);
    });

})();