You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/packages/ui-default/hydro.js

89 lines
2.9 KiB
JavaScript

import './modules';
import 'jquery.transit';
import _ from 'lodash';
import Notification from 'vj/components/notification';
import PageLoader from 'vj/misc/PageLoader';
import delay from 'vj/utils/delay';
import base64 from 'vj/utils/base64';
3 years ago
const start = new Date();
window.UiContext = JSON.parse(base64.decode(window.UiContext));
window.UserContext = JSON.parse(base64.decode(window.UserContext));
// eslint-disable-next-line
try { __webpack_public_path__ = UiContext.cdn_prefix } catch (e) { }
function buildSequence(pages, type) {
if (process.env.NODE_ENV !== 'production') {
if (['before', 'after'].indexOf(type) === -1) {
throw new Error(`'type' should be one of 'before' or 'after'`); // eslint-disable-line quotes
}
}
return pages
.filter((p) => p && p[`${type}Loading`])
.map((p) => ({
page: p,
func: p[`${type}Loading`],
type,
}));
}
async function load() {
if (UiContext.extraPages) {
const tasks = [];
for (const page of UiContext.extraPages) {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.src = page;
head.appendChild(script);
tasks.push(new Promise((resolve) => {
script.onload = resolve;
}));
}
await Promise.all(tasks);
}
const pageLoader = new PageLoader();
const currentPageName = document.documentElement.getAttribute('data-page');
const currentPage = pageLoader.getNamedPage(currentPageName);
const includedPages = pageLoader.getAutoloadPages();
const loadSequence = [
...buildSequence(includedPages, 'before'),
...buildSequence(currentPage, 'before'),
...buildSequence(includedPages, 'after'),
...buildSequence(currentPage, 'after'),
];
// eslint-disable-next-line no-restricted-syntax
for (const { page, func, type } of loadSequence) {
if (process.env.NODE_ENV !== 'production') {
console.time(`${page.name}: ${type}Loading`);
}
try {
await func(currentPageName);
} catch (e) {
Notification.warn(`Failed to call '${type}Loading' of ${page.name}`);
console.error(`Failed to call '${type}Loading' of ${page.name}\n${e.stack}`);
}
if (process.env.NODE_ENV !== 'production') {
console.timeEnd(`${page.name}: ${type}Loading`);
}
}
const sections = _.map($('.section').get(), (section, idx) => ({
shouldDelay: idx < 5, // only animate first 5 sections
$element: $(section),
}));
3 years ago
console.log('done! %d ms', new Date().getTime() - start.getTime());
// eslint-disable-next-line no-restricted-syntax
for (const { $element, shouldDelay } of sections) {
$element.addClass('visible');
if (shouldDelay) await delay(50);
}
await delay(500);
// eslint-disable-next-line no-restricted-syntax
for (const { $element } of sections) $element.trigger('vjLayout');
$(document).trigger('vjPageFullyInitialized');
}
load();