cryptpad/www/common/inner/snapshots.js

119 lines
4.1 KiB
JavaScript

define([
'jquery',
'/common/common-interface.js',
'/common/hyperscript.js',
'/customize/messages.js',
'/bower_components/nthen/index.js',
'/bower_components/chainpad/chainpad.dist.js',
], function ($, UI, h, Messages, nThen, ChainPad /* JsonOT */) {
var Snapshots = {};
Snapshots.create = function (common, config) {
if (!config.$toolbar) { return void console.error("config.$toolbar is undefined");}
if (Snapshots.loading) { return void console.error("Snapshot is already being loaded..."); }
Snapshots.loading = true;
var sframeChan = common.getSframeChannel();
var $toolbar = config.$toolbar;
var $snap = $toolbar.find('.cp-toolbar-snapshots');
var $bottom = $toolbar.find('.cp-toolbar-bottom');
var $cke = $toolbar.find('.cke_toolbox_main');
$snap.html('').css('display', 'flex');
$bottom.hide();
$cke.hide();
var createChainPad = function () {
return ChainPad.create({
userName: 'snapshot',
validateContent: function (content) {
try {
JSON.parse(content);
return true;
} catch (e) {
console.log('Failed to parse, rejecting patch');
return false;
}
},
initialState: '',
logLevel: 0
});
};
var snapshot;
var getData = function () {
sframeChan.query("Q_GET_SNAPSHOT", {hash: config.hash}, function (err, obj) {
if (err || (obj && obj.error)) { return void console.error(err || obj.error); }
if (!Array.isArray(obj)) { return void console.error("invalid type"); }
if (!obj.length) { return void console.error("Empty channel"); }
var checkLast = obj[obj.length - 1].serverHash === config.hash;
if (!checkLast) {
$snap.find('.cp-toolbar-snapshots-close').click();
return void UI.alert(Messages.snapshots_notFound);
}
var messages = obj;
var chainpad = createChainPad();
messages.forEach(function (m) {
chainpad.message(m);
});
snapshot = chainpad.getAuthDoc();
config.applyVal(snapshot);
chainpad.abort();
});
};
var display = function () {
var data = config.data || {};
var actions = h('span.cp-toolbar-snapshots-actions');
var $actions = $(actions);
var content = [
h('span.cp-toolbar-snapshots-info', [
h('i.fa.fa-camera'),
h('span.cp-toolbar-snapshots-title', data.title + ' - ' + new Date(data.time).toLocaleString()),
]),
actions
];
if (!config.readOnly) {
$(h('button.cp-toolbar-snapshots-restore', [
h('i.fa.fa-check'),
h('spap.cp-button-name', Messages.snapshots_restore)
])).click(function () {
var closed = config.close(true, snapshot);
if (!closed) {
return void UI.alert(Messages.snapshots_cantRestore);
}
$snap.hide();
$bottom.show();
$cke.show();
Snapshots.loading = false;
}).appendTo($actions);
}
$(h('button.cp-toolbar-snapshots-close', [
h('i.fa.fa-times'),
h('spap.cp-button-name', Messages.snapshots_close)
])).click(function () {
$snap.hide();
$bottom.show();
$cke.show();
Snapshots.loading = false;
config.close(false);
}).appendTo($actions);
$snap.append(content);
};
display();
getData();
};
return Snapshots;
});