73 lines
2 KiB
JavaScript
73 lines
2 KiB
JavaScript
(function (global) {
|
|
'use strict';
|
|
|
|
if (global.transmittalApp) {
|
|
return;
|
|
}
|
|
|
|
const app = {
|
|
state: {
|
|
mode: 'edit',
|
|
published: false,
|
|
dirty: false
|
|
},
|
|
data: {
|
|
files: [],
|
|
selectedDirHandle: null,
|
|
selectedDirName: ''
|
|
},
|
|
constants: {
|
|
viewableExts: ['pdf', 'png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'txt', 'html', 'htm', 'md'],
|
|
digestAlgorithm: 'SHA-256',
|
|
signatureAlgorithm: 'ECDSA-P256-SHA256',
|
|
SELF_HASH: 'self:payload-digest'
|
|
},
|
|
modules: {},
|
|
initCallbacks: [],
|
|
registerInit(fn) {
|
|
if (typeof fn === 'function') {
|
|
app.initCallbacks.push(fn);
|
|
}
|
|
},
|
|
dirtyListeners: [],
|
|
onDirty(fn) {
|
|
if (typeof fn === 'function') {
|
|
app.dirtyListeners.push(fn);
|
|
}
|
|
},
|
|
markDirty() {
|
|
app.state.dirty = true;
|
|
app.dirtyListeners.forEach(function (fn) {
|
|
try { fn(); } catch (err) { console.error('[transmittal] dirtyListener error', err); }
|
|
});
|
|
},
|
|
ready(fn) {
|
|
if (typeof fn !== 'function') {
|
|
return;
|
|
}
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', fn, { once: true });
|
|
} else {
|
|
fn();
|
|
}
|
|
},
|
|
start() {
|
|
if (app._started) {
|
|
return;
|
|
}
|
|
app._started = true;
|
|
const run = function () {
|
|
app.initCallbacks.forEach(function (fn) {
|
|
try {
|
|
fn();
|
|
} catch (err) {
|
|
console.error('[transmittal] init error', err);
|
|
}
|
|
});
|
|
};
|
|
app.ready(run);
|
|
}
|
|
};
|
|
|
|
global.transmittalApp = app;
|
|
})(window);
|