(Backup Menu) ++ AO3: Kudosed and seen history

Added menu to export to .txt and import your backup

// ==UserScript==
// @name        (Backup Menu) ++ AO3: Kudosed and seen history
// @description Added menu to export to .txt and import your backup
// @namespace   https://greasyfork.org/en/scripts/5835-ao3-kudosed-and-seen-history
// @version     1.1
// @author      MAD90's
// @grant       none
// @license     MIT
// @require     https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js
// @include     http://*archiveofourown.org/*
// @include     https://*archiveofourown.org/*
// ==/UserScript==

(function ($) {
    "use strict";

    var kudos_history = {
        kudosed: { list: localStorage.getItem('kudoshistory_kudosed') || ',' },
        seen: { list: localStorage.getItem('kudoshistory_seen') || ',' },
        bookmarked: { list: localStorage.getItem('kudoshistory_bookmarked') || ',' },
        skipped: { list: localStorage.getItem('kudoshistory_skipped') || ',' },
        checked: { list: localStorage.getItem('kudoshistory_checked') || ',' }
    };

    function exportToTxt() {
        var export_lists = {
            kudosed: kudos_history.kudosed.list,
            seen: kudos_history.seen.list,
            bookmarked: kudos_history.bookmarked.list,
            skipped: kudos_history.skipped.list,
            checked: kudos_history.checked.list
        };

        var now = new Date();
        var currentDate = now.getDate().toString().padStart(2, '0') + '-' +
                          (now.getMonth() + 1).toString().padStart(2, '0') + '-' +
                          now.getFullYear(); // DD-MM-YYYY format

        var textToSave = JSON.stringify(export_lists, null, 2);
        var blob = new Blob([textToSave], { type: "text/plain" });
        var a = document.createElement("a");
        a.href = URL.createObjectURL(blob);
        a.download = `AO3_history_${currentDate}.txt`;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    }

    function importFromTxt(event) {
        var file = event.target.files[0];
        if (!file) return;

        var reader = new FileReader();
        reader.onload = function(e) {
            try {
                var importedData = JSON.parse(e.target.result);
                if (!importedData.kudosed || !importedData.seen || !importedData.bookmarked || !importedData.skipped || !importedData.checked) {
                    throw new Error("Missing required data fields.");
                }

                localStorage.setItem('kudoshistory_kudosed', importedData.kudosed);
                localStorage.setItem('kudoshistory_seen', importedData.seen);
                localStorage.setItem('kudoshistory_bookmarked', importedData.bookmarked);
                localStorage.setItem('kudoshistory_skipped', importedData.skipped);
                localStorage.setItem('kudoshistory_checked', importedData.checked);

                alert("[AO3 Backup] Import successful.");
            } catch (error) {
                alert("[AO3 Backup] Error: Invalid file format.");
            }
        };
        reader.readAsText(file);
    }

    $(document).ready(function () {
        var menu = $('<li class="dropdown"><a>Export/ Import Data</a></li>');
        var menuList = $('<ul class="menu dropdown-menu"></ul>');
        menuList.append($('<li></li>').append($('<a href="#">Export to .txt</a>').click(exportToTxt)));

        var importOption = $('<li></li>').append($('<a href="#">Import Backup</a>'));
        var fileInput = $('<input type="file" accept=".txt" style="display: none;">');
        fileInput.on('change', importFromTxt);
        importOption.find('a').click(() => fileInput.click());

        menuList.append(importOption);
        menu.append(menuList);
        $('ul.primary.navigation.actions').append(menu);
        $(document.body).append(fileInput);
    });

})(jQuery);