cryptpad/www/common/sframe-common.js

325 lines
12 KiB
JavaScript
Raw Normal View History

2017-08-17 14:28:54 +00:00
define([
2017-08-23 09:04:44 +00:00
'jquery',
2017-08-17 14:56:18 +00:00
'/bower_components/nthen/index.js',
2017-08-21 13:20:38 +00:00
'/customize/messages.js',
2017-08-17 14:28:54 +00:00
'/common/sframe-chainpad-netflux-inner.js',
2017-08-17 16:28:05 +00:00
'/common/sframe-channel.js',
'/common/sframe-common-title.js',
'/common/sframe-common-interface.js',
2017-08-21 15:40:21 +00:00
'/common/sframe-common-history.js',
'/common/metadata-manager.js',
2017-08-17 16:28:05 +00:00
2017-08-21 16:30:51 +00:00
'/customize/application_config.js',
'/common/cryptpad-common.js',
'/common/common-realtime.js'
2017-08-23 09:04:44 +00:00
], function ($, nThen, Messages, CpNfInner, SFrameChannel, Title, UI, History, MetadataMgr,
AppConfig, Cryptpad, CommonRealtime) {
2017-08-17 14:28:54 +00:00
// Chainpad Netflux Inner
2017-08-17 14:56:18 +00:00
var funcs = {};
var ctx = {};
2017-08-21 15:40:21 +00:00
funcs.Messages = Messages;
2017-08-17 14:56:18 +00:00
funcs.startRealtime = function (options) {
if (ctx.cpNfInner) { return ctx.cpNfInner; }
options.sframeChan = ctx.sframeChan;
options.metadataMgr = ctx.metadataMgr;
2017-08-17 14:56:18 +00:00
ctx.cpNfInner = CpNfInner.start(options);
ctx.cpNfInner.metadataMgr.onChangeLazy(options.onLocal);
2017-08-17 14:56:18 +00:00
return ctx.cpNfInner;
};
2017-08-21 15:40:21 +00:00
funcs.getMetadataMgr = function () {
return ctx.metadataMgr;
};
funcs.getCryptpadCommon = function () {
return Cryptpad;
};
2017-08-21 13:20:38 +00:00
var isLoggedIn = funcs.isLoggedIn = function () {
2017-08-17 14:56:18 +00:00
if (!ctx.cpNfInner) { throw new Error("cpNfInner is not ready!"); }
return ctx.cpNfInner.metadataMgr.getPrivateData().accountName;
2017-08-17 14:28:54 +00:00
};
var titleUpdated;
funcs.updateTitle = function (title, cb) {
ctx.metadataMgr.updateTitle(title);
titleUpdated = cb;
2017-08-17 14:28:54 +00:00
};
// UI
funcs.createUserAdminMenu = UI.createUserAdminMenu;
2017-08-21 10:01:38 +00:00
funcs.displayAvatar = UI.displayAvatar;
2017-08-21 15:40:21 +00:00
// History
funcs.getHistory = function (config) { return History.create(funcs, config); };
2017-08-17 16:28:05 +00:00
// Title module
funcs.createTitle = Title.create;
funcs.getDefaultTitle = function () {
if (!ctx.cpNfInner) { throw new Error("cpNfInner is not ready!"); }
return ctx.cpNfInner.metadataMgr.getMetadata().defaultTitle;
};
2017-08-17 16:09:17 +00:00
funcs.setDisplayName = function (name, cb) {
ctx.sframeChan.query('Q_SETTINGS_SET_DISPLAY_NAME', name, function (err) {
if (cb) { cb(err); }
});
};
2017-08-17 16:28:05 +00:00
funcs.logout = function (cb) {
ctx.sframeChan.query('Q_LOGOUT', null, function (err) {
if (cb) { cb(err); }
});
};
funcs.setLoginRedirect = function (cb) {
ctx.sframeChan.query('Q_SET_LOGIN_REDIRECT', null, function (err) {
if (cb) { cb(err); }
});
};
2017-08-21 10:01:38 +00:00
funcs.sendAnonRpcMsg = function (msg, content, cb) {
ctx.sframeChan.query('Q_ANON_RPC_MESSAGE', {
msg: msg,
content: content
}, function (err, data) {
if (cb) { cb(data); }
});
};
2017-08-21 10:24:33 +00:00
funcs.isOverPinLimit = function (cb) {
ctx.sframeChan.query('Q_GET_PIN_LIMIT_STATUS', null, function (err, data) {
cb(data.error, data.overLimit, data.limits);
});
};
2017-08-21 15:40:21 +00:00
funcs.getFullHistory = function (realtime, cb) {
ctx.sframeChan.on('EV_RT_HIST_MESSAGE', function (content) {
realtime.message(content);
});
ctx.sframeChan.query('Q_GET_FULL_HISTORY', null, cb);
};
// Friends
var pendingFriends = [];
funcs.getPendingFriends = function () {
return pendingFriends.slice();
};
funcs.sendFriendRequest = function (netfluxId) {
ctx.sframeChan.query('Q_SEND_FRIEND_REQUEST', netfluxId, $.noop);
pendingFriends.push(netfluxId);
};
// Feedback
2017-08-22 16:18:58 +00:00
funcs.feedback = function (action, force) {
if (force !== true) {
if (!action) { return; }
try {
if (!ctx.metadataMgr.getPrivateData().feedbackAllowed) { return; }
} catch (e) { return void console.error(e); }
}
var randomToken = Math.random().toString(16).replace(/0./, '');
2017-08-23 09:04:44 +00:00
//var origin = ctx.metadataMgr.getPrivateData().origin;
2017-08-22 16:18:58 +00:00
var href = /*origin +*/ '/common/feedback.html?' + action + '=' + randomToken;
$.ajax({
type: "HEAD",
url: href,
});
};
var prepareFeedback = function (key) {
if (typeof(key) !== 'string') { return $.noop; }
2017-08-21 13:20:38 +00:00
2017-08-22 16:18:58 +00:00
var type = ctx.metadataMgr.getMetadata().type;
return function () {
funcs.feedback((key + (type? '_' + type: '')).toUpperCase());
};
};
2017-08-21 13:20:38 +00:00
// BUTTONS
var isStrongestStored = function () {
var data = ctx.metadataMgr.getPrivateData();
return !data.readOnly || !data.availableHashes.editHash;
};
funcs.createButton = function (type, rightside, data, callback) {
var button;
var size = "17px";
switch (type) {
case 'export':
button = $('<button>', {
'class': 'fa fa-download',
title: Messages.exportButtonTitle,
}).append($('<span>', {'class': 'drawer'}).text(Messages.exportButton));
button.click(prepareFeedback(type));
if (callback) {
button.click(callback);
}
break;
case 'import':
button = $('<button>', {
'class': 'fa fa-upload',
title: Messages.importButtonTitle,
}).append($('<span>', {'class': 'drawer'}).text(Messages.importButton));
if (callback) {
button
.click(prepareFeedback(type))
2017-08-21 13:34:21 +00:00
.click(Cryptpad.importContent('text/plain', function (content, file) {
2017-08-21 13:20:38 +00:00
callback(content, file);
}, {accept: data ? data.accept : undefined}));
}
break;
case 'template':
2017-08-21 16:30:51 +00:00
if (!AppConfig.enableTemplates) { return; }
2017-08-21 13:20:38 +00:00
button = $('<button>', {
title: Messages.saveTemplateButton,
}).append($('<span>', {'class':'fa fa-bookmark', style: 'font:'+size+' FontAwesome'}));
2017-08-21 16:21:53 +00:00
if (data.rt) {
2017-08-21 13:20:38 +00:00
button
.click(function () {
var title = data.getTitle() || document.title;
var todo = function (val) {
if (typeof(val) !== "string") { return; }
var toSave = data.rt.getUserDoc();
if (val.trim()) {
val = val.trim();
title = val;
try {
var parsed = JSON.parse(toSave);
var meta;
if (Array.isArray(parsed) && typeof(parsed[3]) === "object") {
meta = parsed[3].metadata; // pad
} else if (parsed.info) {
meta = parsed.info; // poll
} else {
meta = parsed.metadata;
}
if (typeof(meta) === "object") {
meta.title = val;
meta.defaultTitle = val;
delete meta.users;
}
toSave = JSON.stringify(parsed);
} catch(e) {
console.error("Parse error while setting the title", e);
}
}
2017-08-21 16:21:53 +00:00
ctx.sframeChan.query('Q_SAVE_AS_TEMPLATE', {
title: title,
toSave: toSave
}, function () {
Cryptpad.alert(Messages.templateSaved);
funcs.feedback('TEMPLATE_CREATED');
2017-08-21 13:20:38 +00:00
});
};
2017-08-21 16:21:53 +00:00
Cryptpad.prompt(Messages.saveTemplatePrompt, title, todo);
2017-08-21 13:20:38 +00:00
});
}
break;
case 'forget':
button = $('<button>', {
id: 'cryptpad-forget',
title: Messages.forgetButtonTitle,
'class': "fa fa-trash cryptpad-forget",
style: 'font:'+size+' FontAwesome'
});
if (!isStrongestStored()) {
button.addClass('hidden');
}
if (callback) {
button
.click(prepareFeedback(type))
.click(function() {
var msg = isLoggedIn() ? Messages.forgetPrompt : Messages.fm_removePermanentlyDialog;
Cryptpad.confirm(msg, function (yes) {
if (!yes) { return; }
ctx.sframeChan.query('Q_MOVE_TO_TRASH', null, function (err) {
if (err) { return void callback(err); }
var cMsg = isLoggedIn() ? Messages.movedToTrash : Messages.deleted;
Cryptpad.alert(cMsg, undefined, true);
callback();
return;
});
});
});
}
break;
case 'history':
2017-08-21 16:30:51 +00:00
if (!AppConfig.enableHistory) {
2017-08-21 13:20:38 +00:00
button = $('<span>');
break;
2017-08-21 16:30:51 +00:00
}
2017-08-21 13:20:38 +00:00
button = $('<button>', {
title: Messages.historyButton,
'class': "fa fa-history history",
}).append($('<span>', {'class': 'drawer'}).text(Messages.historyText));
if (data.histConfig) {
button
.click(prepareFeedback(type))
.on('click', function () {
2017-08-21 15:40:21 +00:00
funcs.getHistory(data.histConfig);
2017-08-21 13:20:38 +00:00
});
}
break;
case 'more':
button = $('<button>', {
title: Messages.moreActions || 'TODO',
'class': "drawer-button fa fa-ellipsis-h",
style: 'font:'+size+' FontAwesome'
});
break;
default:
button = $('<button>', {
'class': "fa fa-question",
style: 'font:'+size+' FontAwesome'
})
.click(prepareFeedback(type));
}
if (rightside) {
button.addClass('rightside-button');
}
return button;
};
2017-08-18 16:43:04 +00:00
/* funcs.storeLinkToClipboard = function (readOnly, cb) {
ctx.sframeChan.query('Q_STORE_LINK_TO_CLIPBOARD', readOnly, function (err) {
if (cb) { cb(err); }
});
};
2017-08-18 16:43:04 +00:00
*/
2017-08-21 13:20:38 +00:00
2017-08-17 14:56:18 +00:00
Object.freeze(funcs);
return { create: function (cb) {
nThen(function (waitFor) {
SFrameChannel.create(window.top, waitFor(function (sfc) { ctx.sframeChan = sfc; }));
// CpNfInner.start() should be here....
2017-08-17 15:34:08 +00:00
}).nThen(function () {
ctx.metadataMgr = MetadataMgr.create(ctx.sframeChan);
ctx.metadataMgr.onTitleChange(function (title) {
ctx.sframeChan.query('Q_SET_PAD_TITLE_IN_DRIVE', title, function (err) {
if (err) { return; }
if (titleUpdated) { titleUpdated(undefined, title); }
});
});
ctx.sframeChan.on('EV_RT_CONNECT', function () { CommonRealtime.setConnectionState(true); });
ctx.sframeChan.on('EV_RT_DISCONNECT', function () { CommonRealtime.setConnectionState(false); });
ctx.sframeChan.on('Q_INCOMING_FRIEND_REQUEST', function (confirmMsg, cb) {
Cryptpad.confirm(confirmMsg, cb, null, true);
});
ctx.sframeChan.on('EV_FRIEND_REQUEST', function (data) {
var i = pendingFriends.indexOf(data.sender);
if (i !== -1) { pendingFriends.splice(i, 1); }
Cryptpad.log(data.logText);
});
2017-08-17 14:56:18 +00:00
cb(funcs);
});
} };
2017-08-17 14:28:54 +00:00
});