'use strict'; window.initBlock = initBlock; let template; let data = {}; let reload; // Blocks Initialization. function initBlock(blockName = '', selector = '', cb) { reload = function () { document.querySelectorAll(selector).forEach((el) => cb(el)); } reload(); } // Data Updates Listeners. (function () { loadDataOptions(); listenToDataOptionsUpdates(); function listenToDataOptionsUpdates() { window.addEventListener('message', function (event) { const message = event.data; const prefix = 'dataUpdate:'; if (typeof message !== "string" || !message.startsWith(prefix)) { return; } try { data = JSON.parse(message.substring(prefix.length)); updateBlock({data}); } catch (e) { console.log('Error parsing incoming data.', e); } }); } function getQueryParams() { const urlParams = new URLSearchParams(window.location.search); const params = {}; for (const [key, value] of urlParams) { params[key] = value; } return params; } function loadDataOptions() { const queryParameters = new URLSearchParams({name: getQueryParams().data || 'default'}); fetch(`/data?${queryParameters}`) .then((response) => response.json()) .then((response) => { data = response.data; // Update state. updateBlock({data}); }) } })(); // Listen to Template updates. (function () { initSocket(); function initSocket() { const socket = window.io.connect(); socket.on('error', function (err) { console.log(err); }); // socket.on('connect', function () { // console.log('user connected', socket.id) // }); socket.on('templateUpdate', function (args) { updateBlock({template: args.template}); }); } })(); function updateBlock(args = {}) { if (args.template) { template = args.template; // Update state. } if (args.data) { data = args.data; // Update state. } if (!template) { return; } renderBlock(template, data || {}, document.getElementById("hbs-container")); } function renderBlock(templateHbs, jsonData, target) { const template = Handlebars.compile(templateHbs); /** * Handlebars Helpers */ Handlebars.registerHelper('esc_attr', function (attr) { return attr; }); Handlebars.registerHelper('esc_url', function (attr) { return attr; }); Handlebars.registerHelper('esc_html', function (attr) { return attr; }); Handlebars.registerHelper('base_url', function () { return '/'; }); Handlebars.registerHelper('inner_blocks', function (options) { const content = options.data.root['inner_blocks']; if (!content) { return ''; } return new Handlebars.SafeString(content); }); let html; try { html = template(jsonData); } catch (e) { html = `

Syntax Error:

${e.toString()}
`; } target.innerHTML = html; if (reload) { reload(); } }