| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027 | /*The MIT License (MIT)Copyright (c) 2014-2018 Nikolai Suslov and the Krestianstvo.org project contributors. (https://github.com/NikolaySuslov/livecodingspace/blob/master/LICENSE.md)*///import page from '/lib/page.mjs';//import { Header } from '/web/header.js';class IndexApp {    constructor(entry) {        console.log("index app constructor");        this.entry = entry;        this.worlds = {};        this.instances = {};        if (!_app.isLuminary) {            this.initReflectorConnection();        }        this.initHTML();    }    initReflectorConnection() {        this.options = {            query: 'pathname=' + window.location.pathname.slice(1,                window.location.pathname.lastIndexOf("/")),            secure: window.location.protocol === "https:",            reconnection: false,            path: '',            transports: ['websocket']        }        //window.location.host        var socket = io.connect(window._app.reflectorHost, this.options);        const parse = (msg) => {            this.parseOnlineData(msg)        }        socket.on('getWebAppUpdate', msg => parse.call(this, msg));        socket.on("connect", function () {            let noty = new Noty({                text: 'Connected to Reflector!',                timeout: 2000,                theme: 'mint',                layout: 'bottomRight',                type: 'success'            });            noty.show();        })        socket.on('connect_error', function (err) {            console.log(err);            var errDiv = document.createElement("div");            errDiv.innerHTML = "<div class='vwf-err' style='z-index: 10; position: absolute; top: 80px; right: 50px'>Connection error to Reflector!" + err + "</div>";            document.querySelector('body').appendChild(errDiv);            let noty = new Noty({                text: 'Connection error to Reflector! ' + err,                theme: 'mint',                layout: 'bottomRight',                type: 'error'            });            noty.show();        });    }    initHTML() {        let self = this;        //first init from _app        document.querySelector('head').innerHTML += '<link rel="stylesheet" href="/web/index-app.css">';        //if(this.entry !== 'index'){        import('/web/header.js').then(res => {            let gui = new res.Header();            gui.init();        })        // }        import('/web/footer.js').then(res => {            let gui = new res.Footer();            gui.init();        })        //add HTML        let entry = document.createElement("div");        entry.setAttribute("id", 'app');        //entry.classList.add("mdc-typography");        document.body.appendChild(entry);        let divs = ['appGUI', 'userLobby', 'worldsGUI'];        divs.forEach(el => {            let appEl = document.createElement("div");            appEl.setAttribute("id", el);            entry.appendChild(appEl);        })        document.querySelector("#worldsGUI").$cell({            id: "worldsGUI",            $cell: true,            $type: "div",            _comps: [],            _wcards: {},            $components: [],            _refresh: function (comps) {                //do update;                //this._userAlias = user;                this._comps = comps;                this.$components = this._comps;            },            $init: function () {                console.log('init comp...');            },            $update: function () {                //do update;                console.log('update me');            }        });        //init CELL        let userGUI = {            $type: "div",            id: "userGUI",            // style:"background-color: #ffeb3b",            class: "mdc-layout-grid mdc-layout-grid--align-left",            _status: _l.t("welcome") + '!',//"Welcome!",            $init: function () {                //this._status = "Welcome!"                //this._status = 'Welcome!';                self.initUser();                this._refresh(); //$update();            },            $update: function () { },            _refresh: function () {                var gui = {};                if (_LCSDB.user().is) {                    gui = [                        window._app.widgets.buttonRaised(                            {                                "label": _l.t("sign out"), //'Sign OUT',                                "onclick": function (e) {                                    _LCSDB.user().leave();                                    setTimeout(() => {                                        window.location.reload(true);                                    }, 1);                                }                            }),                        {                            $type: "span",                            style: "padding-right: 20px;"                        },                        window._app.widgets.buttonStroked(                            {                                "label": _l.t("profile"),//'PROFILE',                                "onclick": function (e) {                                    e.preventDefault();                                    //page("/profile")                                    window.location.pathname = "/profile"                                }                            }),                        {                            $type: "p"                        },                        window._app.widgets.buttonRaised(                            {                                "label": _l.t("my world protos"),                                "onclick": function (e) {                                    e.preventDefault();                                    let alias = _LCSDB.user().is.alias;                                    window.location.pathname = '/' + alias + '/worlds'                                    //page('/' + alias + '/worlds/protos');                                    //_app.indexApp.getWorldsProtosFromUserDB(alias);                                }                            })                    ]                }                this.$components = [                    {                        $type: "h1",                        class: "mdc-typography--headline3",                        $text: this._status                    }                    // ,{                    //     $type: "div",                    //     class: "mdc-typography--headline4",                    //     $text: navigator.userAgent                    // }                ].concat(gui)            }        }        document.querySelector("#userLobby").$cell({            id: "userLobby",            $cell: true,            $type: "div",            $components: [],            _comps: [],            _refresh: function () {                this.$components = this._comps.concat([userGUI, _app.widgets.getLoginGUI(), _app.widgets.divider, self.getLookWorlds()]);            },            $init: function () {                //this._comps = self.initUserGUI()                this._refresh();            },            $update: function () {            }        });    }    async allWorldsForUser(userAlias) {        let userPub = await _app.helpers.getUserPub(userAlias);        //let db = _LCSDB.user(userPub);        let doc = document.querySelector("#worldsGUI");        var worlds = {};        if (userPub) {            worlds = this.createWorldsGUI('proto', userAlias, userPub)        } else {            worlds = {                $type: 'div',                $text: 'Could not find user with name: ' + userAlias,                class: "mdc-typography--headline4"            }        }        let components = [            {                $type: "div",                class: "mdc-layout-grid",                $components: [                    {                        $type: "div",                        class: "mdc-layout-grid__inner",                        $components: [                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                $components: [                                    {                                        $type: "h1",                                        class: "mdc-typography--headline4",                                        $text: _l.t("protos for") + userAlias                                    }                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                $components: [worlds]                            }                        ]                    }                ]            }        ];        doc._refresh(components);    }    authGUI() {        let alias = _LCSDB.user().is.alias;        let userEl = document.querySelector('#userGUI');        userEl._status = _l.t("welcome") + ', ' + alias + '!';        //userEl.style.backgroundColor = '#e6e6e6';           userEl._refresh(); //$update();        //_LCSDB.user().get('profile').once(function (data) { console.log(data) })        let el = document.getElementById("loginGUI");        if (el) {            el.remove();        }        _LCSDB.user().get('profile').not(function (key) {            let profile = { 'alias': alias };            _LCSDB.user().get('profile').put(profile);        })        // not load proxy by default        // _LCSDB.user().get('proxy').not(res=>{        //     console.log('user has no proxy');        //     window._app.loadProxyDefaults();        // });        let actionsGUI = document.querySelector('#worldActionsGUI');        if (actionsGUI) {            actionsGUI._refresh();            actionsGUI._gen = _app.helpers.randId();        }        new Noty({            text: alias + ' is succesfully authenticated!',            timeout: 2000,            theme: 'mint',            layout: 'bottomRight',            type: 'success'        }).show();        if (this.entry == 'index') {            //change for LiveCoding.space to 'app'            //this.initWorldsProtosListForUserNew(alias);            this.allWorldsForUser(alias)        }    }    initUser() {        let self = this;        if (_LCSDB.user().is) {            self.authGUI()        } else {            _LCSDB.on('auth', function (ack) {                if (ack.sea.pub) {                    _app.helpers.checkUserCollision();                    self.authGUI();                }                console.log(_LCSDB.user().is);            });        }    }    getLookWorlds() {        let self = this;        let lookWorlds =        {            $type: "div",            id: "lookWorlds",            class: "mdc-layout-grid mdc-layout-grid--align-left",            _status: '',            $init: function () {                this._status = "init";            },            $update: function () {                //change for LiveCoding.space site 'app'                let defaultName = '';                let guiForAll = [                    {                        $type: "div",                        style: "margin-top: 20px;",                        _userName: null,                        _userNameField: null,                        $components:                            [                                _app.widgets.inputTextFieldOutlined({                                    "id": 'worldsUserName',                                    "label": _l.t("enter user name"),                                    "value": defaultName,                                    "type": "text",                                    "init": function () {                                        this._userNameField = new mdc.textField.MDCTextField(this);                                    }                                }),                                _app.widgets.p,                                _app.widgets.buttonRaised(                                    {                                        "label": _l.t("world protos"),                                        "onclick": function (e) {                                            e.preventDefault();                                            //page("/app/worlds/protos")                                            let searchName = this._userNameField.value;                                            if (searchName !== "")                                                window.location.pathname = "/" + searchName + "/worlds"                                            //_app.indexApp.getAppDetailsFromDefaultDB('protos');                                        }                                    })                            ]                    }                ];                this.$components = [                    {                        $type: "h1",                        class: "mdc-typography--headline4",                        $text: _l.t("show worlds")//"Looking for Worlds made by other Users!"                    }                ].concat(guiForAll, _app.widgets.p)            }        }        return lookWorlds    }    refresh() {        // socket.emit('getWebAppUpdate', "");    }    parseOnlineData(data) {        let parcedData = _app.parseAppInstancesData(data);        //if (Object.entries(parcedData).length !== 0)        let onlineGUIs = document.querySelectorAll('.online');        onlineGUIs.forEach(function (item) {            item._refresh(parcedData)        });    }    createWorldCard(worldType, userAlias, userPub, worldName, id, type, cb) {        let self = this;        let db = _LCSDB.user(userPub);        let onlineGUI = {            $cell: true,            id: "onlineGUI_" + id,            class: "online",            $type: "div",            _instances: {},            _worldListItem: function (m) {                let instanceID = _app.helpers.getInstanceID(m[0]);                var link = "#";                if (m[1].loadInfo.save_name) {                    link = "/" + m[1].user + "/" + worldName + "/" + instanceID + '/load/' + m[1].loadInfo.save_name;                } else {                    link = "/" + m[1].user + "/" + worldName + "?k=" + instanceID; //m[0];                }                return {                    $type: "li",                    class: "mdc-list-item",                    style: "padding: 10px;",                    $components: [                        {                            $type: "span",                            class: "world-link mdc-list-item__text",                            $components: [                                {                                    $type: "span",                                    class: "mdc-list-item__primary-text",                                    $components: [                                        {                                            $type: "a",                                            $text: instanceID, //m[0],                                            //href: link,                                            //target: "_blank",                                            // href: window.location.protocol + "//" + window.location.host + "/" + m[1].user + m[0],                                            onclick: function (e) {                                                self.checkForManualSettings();                                                window.location.href = window.location.origin + link                                                //self.refresh();                                            }                                        },                                    ]                                },                                {                                    $type: "span",                                    class: "mdc-list-item__secondary-text",                                    $text: _app.isLuminary ? _LangManager.language.t('users') + Object.keys(m[1].clients).length : _LangManager.language.t('users') + ' : ' + m[1].clients                                }                            ]                        }                    ]                }            },            $components: [],            _refresh: function (data) {                if (data) {                    if (Object.entries(data).length !== 0) {                        if (this._worldInfo) {                            let insts = Object.entries(data).filter(el => el[0] == this._worldInfo.worldName);                            if (insts.length !== 0)                                this._instances = insts[0][1];                        }                    } else {                        this._instances = {}                    }                }            },            $init: function () {                if (_app.isLuminary) {                    //let luminaryPath = _app.luminaryPath;                    //let ref = _lum //.get(luminaryPath);                    setInterval(function () {                        _LCSDB.get('allclients').once().map().once(res => {                            if (res) {                                if (res.id) {                                    let clientTime = Gun.state.is(res, 'live');                                    let now = Gun.time.is();                                    if (now - clientTime < 10000) {                                        let instance = res.user + res.instance;                                        //let data = JSON.stringify({[res.instance]: {instance: instance, clients: {}, user: res.user, loadInfo: {}}});                                        //console.log(data);                                        if (!self.instances[res.instance]) {                                            self.instances[res.instance] = { id: res.instance, instance: instance, clients: { [res.id]: res }, user: res.user, loadInfo: {} }                                        } else {                                            self.instances[res.instance].clients[res.id] = res                                        }                                        let data = JSON.stringify(self.instances);                                        self.parseOnlineData(data);                                    } else {                                        if (self.instances[res.instance]) {                                            delete self.instances[res.instance].clients[res.id];                                            if (Object.keys(self.instances[res.instance].clients).length == 0) {                                                delete self.instances[res.instance];                                                self.parseOnlineData(JSON.stringify({}));                                            }                                        }                                        //ref.get('instances').get(res.instance).get(res.id).put(null);                                    }                                }                            }                        }                        )                    }, 5000);                }                this._refresh();            },            $update: function () {                if (this._instances) {                    let cardListData = Object.entries(this._instances).filter(el => el[1].user == this._worldInfo.userAlias);                    this.$components = [                        {                            $type: "hr",                            class: "mdc-list-divider"                        }                    ].concat(cardListData.map(this._worldListItem))                }            }        }        return {            $cell: true,            id: 'worldCard_' + id,            $type: "div",            _worldName: "",            _worldInfo: {},            _refresh: function (data) {                this._worldInfo = data;                this.$components = [this._updateCard()]            },            $init: function () {                this._worldName = worldName;                if (type == 'min') {                    if (worldType == 'proto') {                        db.get('worlds').get(this._worldName).path('info_json').on((res) => {                            if (res) {                                if (res.file) {                                    let doc = {                                        'worldName': this._worldName,                                        'created': undefined,                                        'modified': undefined,                                        'type': 'proto',                                        'userAlias': userAlias,                                        'info': { title: 'Need to repair!' }                                    }                                    this._refresh(doc);                                    return                                }                                //console.log(res);                                let worldDesc = JSON.parse(res);                                let root = Object.keys(worldDesc)[0];                                var appInfo = worldDesc[root]['en'];                                let langID = localStorage.getItem('krestianstvo_locale');                                if (langID) {                                    appInfo = worldDesc[root][langID]                                }                                let doc = {                                    'worldName': this._worldName,                                    'created': undefined,                                    'modified': undefined,                                    'type': 'proto',                                    'userAlias': userAlias,                                    'info': appInfo                                }                                this._refresh(doc);                                //callback                                if (cb)                                    cb(doc);                            }                        })                    }                } else if (type == 'full') {                    if (worldType == 'proto') {                        db.get('worlds').get(this._worldName).on((res) => {                            if (res) {                                if (res["info_json"]['#']) {                                    let doc = {                                        'worldName': this._worldName,                                        'created': undefined,                                        'modified': undefined,                                        'type': 'proto',                                        'userAlias': userAlias,                                        'info': { title: 'Need to repair!' }                                    }                                    this._refresh(doc);                                    //   if(cb)                                    //     cb(doc);                                    return                                }                                //console.log(res);                                let worldDesc = JSON.parse(res['info_json']);                                let root = Object.keys(worldDesc)[0];                                var appInfo = worldDesc[root]['en'];                                let langID = localStorage.getItem('krestianstvo_locale');                                if (langID) {                                    appInfo = worldDesc[root][langID]                                }                                let settings = worldDesc[root]['settings'];                                let doc = {                                    'worldName': this._worldName,                                    'created': res.created ? res.created : "",                                    'modified': res.modified ? res.modified : "",                                    'proxy': res.proxy,                                    'type': 'proto',                                    'userAlias': userAlias,                                    'info': appInfo,                                    'settings': settings                                }                                this._refresh(doc);                                //callback                                if (cb)                                    cb(doc);                            } else {                                //no world                                this._refresh({})                            }                        })                    }                }            },            $update: function () {                //this.$components = [this._updateCard()]            },            _updateComps: function () {                //console.log(this._worldInfo);            },            _updateCard: function () {                let desc = this._worldInfo;                if (!desc || Object.keys(desc).length == 0) {                    return {                        $type: "h1",                        class: "mdc-typography--headline4",                        $text: "ERROR: NO WORLD!"                    }                }                let userGUI = [];                let online = [];                let cardInfo = {                    "title": ""                };                if (type == "full") {                } else {                    userGUI.push({                        $type: "a",                        class: "mdc-button mdc-button--compact mdc-card__action mdc-button--outlined",                        $text: _l.t("details"),                        onclick: function (e) {                            e.preventDefault();                            window.location.pathname = "/" + desc.userAlias + '/' + desc.worldName + '/about'                        }                    });                }                if (desc.info.title !== 'Need to repair!') {                    userGUI.push({                        $type: "a",                        class: "mdc-button mdc-button--raised mdc-card__action ",                        $text: _LangManager.language.t('start'),//"Start new",                        //target: "_blank",                        //href: "/" + desc.userAlias + '/' + desc.worldName,                        onclick: function (e) {                            self.checkForManualSettings();                            window.location.pathname = "/" + desc.userAlias + '/' + desc.worldName                            //self.refresh();                        }                    });                }                let protoID = {}                if (desc.type == 'saveState') {                    cardInfo.title = desc.worldName.split('/')[2];                    let protoIDComp = {                        $type: 'div',                        $components: [                            {                                $type: "span",                                class: "mdc-card__subtitle mdc-theme--text-secondary-on-background",                                $text: 'proto: '                            },                            {                                $type: "input",                                type: "text",                                disabled: "",                                style: "font-size:18px",                                value: desc.worldName.split('/')[0]                            }                        ]                    }                    Object.assign(protoID, protoIDComp)                }                if (desc.type == 'proto') {                    cardInfo.title = desc.worldName;                }                online.push(onlineGUI);                if (!desc.info) {                    desc.info = {                        imgUrl: "/defaults/worlds/webrtc/webimg.jpg",                        text: "..no text",                        title: "..no title"                    }                }                return {                    $type: "div",                    class: "mdc-card world-card",                    $components: [                        {                            $type: "section",                            class: "mdc-card__media world-card__16-9-media",                            $init: function () {                                if (desc.info.imgUrl !== "") {                                    this.style.backgroundImage = 'linear-gradient(0deg, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.3) ), url(' + desc.info.imgUrl + ')';                                }                            }                        },                        {                            $type: "section",                            class: "mdc-card__primary",                            $components: [                                {                                    $type: "h1",                                    class: "mdc-card__title mdc-card__title--large",                                    $text: desc.info.title                                },                                {                                    $type: "h2",                                    class: "mdc-card__subtitle mdc-theme--text-secondary-on-background",                                    $text: desc.info.text                                },                                {                                    $type: "span",                                    class: "mdc-card__subtitle mdc-theme--text-secondary-on-background",                                    $text: 'id: '                                },                                {                                    $type: "input",                                    type: "text",                                    disabled: "",                                    style: "font-size:18px",                                    value: cardInfo.title                                },                                {                                    $type: "p",                                },                                protoID,                                {                                    $type: "p",                                },                                {                                    $type: "span",                                    class: "mdc-card__subtitle mdc-theme--text-secondary-on-background",                                    $text: desc.created ? 'created: ' + (new Date(desc.created)).toUTCString() : ""                                },                                {                                    $type: "p",                                }                                // ,{                                //     $type: "span",                                //     class: "mdc-card__subtitle mdc-theme--text-secondary-on-background",                                //     $text: 'modified: ' + (new Date(desc[5])).toUTCString()                                // }                            ]                        },                        {                            $type: "section",                            class: "mdc-card__actions",                            $components: [                            ].concat(userGUI)                        },                        {                            $type: "section",                            class: "mdc-card__actions",                            $components: [                                {                                    $type: 'div',                                    $text: _l.t("online now") + ': '                                }                            ].concat(online)                        }                    ]                }            }        }    }    createWorldsGUI(worldType, userAlias, userPub) {        let self = this;        let db = _LCSDB.user(userPub);        let id = "allWorlds_" + userAlias;        let worldCards = {            $cell: true,            id: id,            $type: "div",            $components: [],            _cards: [],            $init: function () {                console.log('init lab...');                if (worldType == 'proto') {                    db.get('worlds')                        .map()                        .on((res, k) => {                            //console.log('From world: ', k);                            //let doc = document.querySelector('#'+ k);                            if (res) {                                let cardID = userAlias + '_' + k;                                let doc = this._cards.filter(el => el.$components[0].id == 'worldCard_' + cardID)[0];                                if (!doc) {                                    doc = this._makeWorldCard(k, cardID);                                    this._cards.push(doc);                                }                            }                        })                }            },            _makeWorldCard: function (worldID, cardID) {                //let cardID = userAlias + '_' + worldID//data[1].userAlias + '_' + data[1].worldName + '_' + data[0];                let card = self.createWorldCard(worldType, userAlias, userPub, worldID, cardID, 'min');                return {                    $cell: true,                    $type: "div",                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-4",                    $components: [card]                }            },            $update: function () {                this.$components = [                    {                        $type: "div",                        class: "mdc-layout-grid",                        $components: [                            // {                            //     $type: "div",                            //     class: "mdc-layout-grid__inner",                            //     $components: [                            //         {                            //             $type: "div",                            //             class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                            //             $components: [                            //                 {                            //                     $type: "H3",                            //                     $text: headerText                            //                 }                            //             ]                            //         }                            //     ]                            // },                            {                                $type: "div",                                class: "mdc-layout-grid__inner",                                $components: this._cards                            }                        ]                    }                ]            }        }        return worldCards    }    checkForManualSettings() {        console.log("check for manual settings");        let manualSettings = localStorage.getItem('lcs_app_manual_settings');        if (manualSettings) {            localStorage.removeItem('lcs_app_manual_settings');        }        let el = document.querySelector('#runWorldGUI');        if (el) {            if (el._arSwitch.checked) {                let arSettings = {                    model: {                        '/drivers/model/aframe': null,                        '/drivers/model/aframeComponent': null                    },                    view: {                        '/drivers/view/aframe': null,                        '/drivers/view/aframeComponent': null,                        '/drivers/view/editor': null                    }                }                localStorage.setItem('lcs_app_manual_settings', JSON.stringify(arSettings));            }            if (el._turnArOnSwitch.checked) {                let arSettings = {                    model: {                        '/drivers/model/aframe': null,                        '/drivers/model/aframeComponent': null                    },                    view: {                        '/drivers/view/aframe': null,                        '/drivers/view/aframeComponent': null,                        '/drivers/view/aframe-ar-driver': null                    }                }                localStorage.setItem('lcs_app_manual_settings', JSON.stringify(arSettings));            }        }    }}export { IndexApp as default }    //export {getAppDetails, generateFrontPage, setLanguage, initLocale};
 |