Skip to content
Snippets Groups Projects
chunk-loader.js 3.31 KiB
Newer Older
export const loadScript = function (script_name) {
    return new Promise(function (resolve, reject) {
        let script = document.createElement('script');
        script.src = `${STUDIP.ASSETS_URL}${script_name}`;
        script.onload = resolve;
        script.onerror = reject;
        document.head.appendChild(script);
    });
};

let mathjax_promise = null;
/** This function dynamically loads JS features organized in chunks.
 *
 * @param {string} chunk  The name of the chunk to load.
 * @param {{ silent: boolean }} options Options for loading the chunk.
 *                                      Pass `{ silent: true }` to supress
 *                                      error messages.
 * @return {Promise}
 */
export const loadChunk = function (chunk, { silent = false } = {}) {
    let promise = null;
    switch (chunk) {
        case 'code-highlight':
            promise = import(
                /* webpackChunkName: "code-highlight" */
                './chunks/code-highlight'
            ).then(({ default: hljs }) => {
                return hljs;
            });
            break;
        case 'courseware':
            promise = Promise.all([
                STUDIP.loadChunk('vue'),
                import(
                    /* webpackChunkName: "courseware" */
                    './chunks/courseware'
                ),
            ]).then(([Vue]) => Vue);
            break;
        case 'chartist':
            promise = import(
                /* webpackChunkName: "chartist" */
                './chunks/chartist'
            ).then(({ default: Chartist }) => Chartist);
            break;
        case 'fullcalendar':
            promise = import(
                /* webpackChunkName: "fullcalendar" */
                './chunks/fullcalendar'
            );
            break;
        case 'tablesorter':
            promise = import(
                /* webpackChunkName: "tablesorter" */
                './chunks/tablesorter'
            );
            break;
        case 'mathjax':
            if (mathjax_promise === null) {
                mathjax_promise = STUDIP.loadScript('javascripts/mathjax/MathJax.js?config=TeX-AMS_HTML,default')
                    .then(() => {
                        (function (origPrint) {
                            window.print = function () {
                                window.MathJax.Hub.Queue(['Delay', window.MathJax.Callback, 700], origPrint);
                        return window.MathJax;
                    })
                    .catch(() => {
                        throw new Error('Could not load mathjax');
            }
            promise = mathjax_promise;
            break;
        case 'vue':
            promise = import(
                /* webpackChunkName: "vue.js" */
                './chunks/vue'
            );
            break;
        case 'wysiwyg':
            promise = import(
                /* webpackChunkName: "wysiwyg.js" */
                './chunks/wysiwyg'
            );
            break;
        default:
            promise = Promise.reject(new Error(`Unknown chunk: ${chunk}`));
    }
    return promise.catch((error) => {
        if (!silent) {
            console.error(`Could not load chunk ${chunk}`, error);