VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/html/libs/absol-acomp/demo/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/libs/absol-acomp/demo/HistoryHelper.js
//demo: https://absol.cf/libs/absol-acomp/demo/history.html
//doc: https://absol.cf/libs/absol-doc/?page=Other_HistoryHelper

var HistoryHelper = {};
window.HistoryHelper = window.HistoryHelper || HistoryHelper;//assign to global if code is module

HistoryHelper._stack = [];
HistoryHelper._id = 1;

/***
 *
 * current state info(exculde hock without url)
 * @type {{id: number, callback: function, bundle: any}}
 */
Object.defineProperty(HistoryHelper, 'current', {
    get: function () {
        var holder;
        for (var i = HistoryHelper._stack.length - 1; i >= 0; --i) {
            holder = HistoryHelper._stack[i];
            if (!holder.preventBack)
                return holder;
        }
        return null;
    }
})

HistoryHelper._onpopstate = function (event) {
    var state = event.state;
    if (!state || state.of !== 'HISTORY_HELPER') {
        HistoryHelper.current = null;
        return;
    }
    var idx;
    if (state.id === "EMPTY") {
        idx = HistoryHelper._stack.findIndex(function (holder) {
            return holder.id === state.ref;
        });
        if (idx > 0) {
            HistoryHelper.current = HistoryHelper._stack[idx];
        }
        else {
            // setTimeout(function (){
            window.history.back();
            // }, 10);
        }

        return;
    }
    idx = HistoryHelper._stack.findIndex(function (holder) {
        return holder.id === state.id;
    });
    if (idx < 0) {
        history.back();
        return;
    }
    var holder = HistoryHelper._stack[idx];
    if (holder.preventBack) {
        if (typeof holder.callback === "function") {
            holder.callback(holder.bundle);
        }
        window.history.pushState({ id: 'EMPTY', ref: holder.id, of: 'HISTORY_HELPER' }, '');
    }
    else {
        HistoryHelper._stack.splice(idx, HistoryHelper._stack.length - idx)
            .forEach(function (holder) {
                delete HistoryHelper._id[holder.id];
            });
        HistoryHelper.current = HistoryHelper._stack[HistoryHelper._stack.length - 1] || null;
        if (typeof holder.callback === "function") {
            holder.callback(holder.bundle);
        }
        // setTimeout(function (){
        window.history.back();
        // }, 10);
    }
};

window.addEventListener('popstate', HistoryHelper._onpopstate, true);

/***
 *
 * @param {string} newURL
 * @param {function(bundle:any):void} callbackFunc
 * @param {any=} bundle - optional, everthing you want to recive in callbackFunc
 * @return {number}
 */
HistoryHelper.setNewLink = function (newURL, callbackFunc, bundle) {
    var id = HistoryHelper._id++;
    var currentState = history.state;
    window.history.pushState({ id: id, of: 'HISTORY_HELPER' }, '', newURL);
    window.history.pushState({ id: 'EMPTY', ref: id, of: 'HISTORY_HELPER' }, '');

    var holder = {
        id: id,
        callback: callbackFunc,
        url: newURL,
        preventBack: false,
        bundle: bundle
    };
    HistoryHelper._stack.push(holder);
    HistoryHelper.current = holder;
    return id;
};


HistoryHelper.deleteHandle = function (handle) {
    var idx = HistoryHelper._stack.findIndex(function (holder) {
        return holder.id === handle;
    });
    if (idx >= 0) {
        HistoryHelper._stack.splice(idx, 1);
        if (window.history.state && (window.history.state.id === handle || window.history.state.ref === handle)) window.history.back();
    }
};


/***
 *
 * @param {function(bundle:any):void} callbackFunc
 * @param {any=} bundle - optional, everthing you want to recive in callbackFunc
 * @return {number}
 */
HistoryHelper.hook = function (callbackFunc, bundle) {
    var id = HistoryHelper._id++;
    window.history.pushState({ id: id, of: 'HISTORY_HELPER' }, '');
    window.history.pushState({ id: 'EMPTY', ref: id, of: 'HISTORY_HELPER' }, '');
    var holder = {
        id: id,
        callback: callbackFunc,
        bundle: bundle,
        preventBack: true
    };
    HistoryHelper._stack.push(holder);
    return id;
};

VaKeR 2022