Ísland.is Kennitala Fix (SPA-safe) (Marlin | 250107-2770)

Works with React routing on island.is and safely replaces Kennitala without breaking layout or styles.

// ==UserScript==
// @name         Ísland.is Kennitala Fix (SPA-safe) (Marlin | 250107-2770)
// @namespace    http://tampermonkey.net/
// @version      18.5
// @description  Works with React routing on island.is and safely replaces Kennitala without breaking layout or styles.
// @author       You
// @match        https://island.is/minarsidur/min-gogn/yfirlit
// @match        https://island.is/minarsidur/min-gogn/yfirlit/*
// @grant        none
// @license MIT 
// ==/UserScript==

(function () {
    'use strict';

    const oldKennitala = '250107-2770';
    const newKennitala = '250104-2770';

    function replaceKennitala() {
        const elements = document.querySelectorAll('p, span, div');
        elements.forEach((el) => {
            if (el.childNodes.length === 1 && el.childNodes[0].nodeType === 3) {
                if (el.textContent.includes(oldKennitala)) {
                    el.textContent = el.textContent.replace(oldKennitala, newKennitala);
                }
            }
        });
    }

    function observeDOMChanges() {
        const observer = new MutationObserver(() => {
            replaceKennitala();
        });
        observer.observe(document.body, {
            childList: true,
            subtree: true,
        });
    }

    function waitForKennitalaThenReplace() {
        const interval = setInterval(() => {
            if (document.body.innerText.includes(oldKennitala)) {
                replaceKennitala();
                clearInterval(interval);
            }
        }, 300);
    }

    function runKennitalaFix() {
        waitForKennitalaThenReplace();
        observeDOMChanges();
    }

    // SPA-safe: Re-run script on React page navigation
    let lastUrl = location.href;
    new MutationObserver(() => {
        const currentUrl = location.href;
        if (currentUrl !== lastUrl) {
            lastUrl = currentUrl;
            runKennitalaFix();
        }
    }).observe(document, { subtree: true, childList: true });

    // Initial load
    runKennitalaFix();

})();