Merge branch 'offlineDrives' into cacheRT

pull/1/head
yflory 4 years ago
commit 3a24ef8935

@ -327,6 +327,7 @@ button.primary:hover{
if (!built) { return; } if (!built) { return; }
try { try {
var node = document.querySelector('.cp-loading-progress'); var node = document.querySelector('.cp-loading-progress');
if (!node) { return; }
if (node.parentNode) { node.parentNode.removeChild(node); } if (node.parentNode) { node.parentNode.removeChild(node); }
document.querySelector('.cp-loading-spinner-container').setAttribute('style', 'display:none;'); document.querySelector('.cp-loading-spinner-container').setAttribute('style', 'display:none;');
document.querySelector('#cp-loading-message').setAttribute('style', 'display:block;'); document.querySelector('#cp-loading-message').setAttribute('style', 'display:block;');

@ -42,6 +42,7 @@ define([
var APP = window.APP = { var APP = window.APP = {
editable: false, editable: false,
online: true,
mobile: function () { mobile: function () {
if (window.matchMedia) { return !window.matchMedia('(any-pointer:fine)').matches; } if (window.matchMedia) { return !window.matchMedia('(any-pointer:fine)').matches; }
else { return $('body').width() <= 600; } else { return $('body').width() <= 600; }
@ -267,13 +268,25 @@ define([
}; };
// Handle disconnect/reconnect // Handle disconnect/reconnect
var setEditable = function (state, isHistory) { // If isHistory and isSf are both false, update the "APP.online" flag
// If isHistory is true, update the "APP.history" flag
// isSf is used to detect offline shared folders: setEditable is called on displayDirectory
var setEditable = function (state, isHistory, isSf) {
if (APP.closed || !APP.$content || !$.contains(document.documentElement, APP.$content[0])) { return; } if (APP.closed || !APP.$content || !$.contains(document.documentElement, APP.$content[0])) { return; }
if (isHistory) {
APP.history = !state;
} else if (!isSf) {
APP.online = state;
}
state = APP.online && !APP.history && state;
APP.editable = !APP.readOnly && state; APP.editable = !APP.readOnly && state;
if (!state) { if (!state) {
APP.$content.addClass('cp-app-drive-readonly'); APP.$content.addClass('cp-app-drive-readonly');
if (!isHistory) { if (!APP.history || !APP.online) {
$('#cp-app-drive-connection-state').show(); $('#cp-app-drive-connection-state').show();
} else {
$('#cp-app-drive-connection-state').hide();
} }
$('[draggable="true"]').attr('draggable', false); $('[draggable="true"]').attr('draggable', false);
} }
@ -3670,6 +3683,15 @@ define([
} }
var readOnlyFolder = false; var readOnlyFolder = false;
// If the shared folder is offline, add the "DISCONNECTED" banner, otherwise
// use the normal "editable" behavior (based on drive offline or history mode)
if (sfId && manager.folders[sfId].offline) {
setEditable(false, false, true);
} else {
setEditable(true, false, true);
}
if (APP.readOnly) { if (APP.readOnly) {
// Read-only drive (team?) // Read-only drive (team?)
$content.prepend($readOnly.clone()); $content.prepend($readOnly.clone());

@ -121,10 +121,13 @@ define([
Store.getSharedFolder = function (clientId, data, cb) { Store.getSharedFolder = function (clientId, data, cb) {
var s = getStore(data.teamId); var s = getStore(data.teamId);
var id = data.id; var id = data.id;
var proxy;
if (!s || !s.manager) { return void cb({ error: 'ENOTFOUND' }); } if (!s || !s.manager) { return void cb({ error: 'ENOTFOUND' }); }
if (s.manager.folders[id]) { if (s.manager.folders[id]) {
proxy = Util.clone(s.manager.folders[id].proxy);
proxy.offline = Boolean(s.manager.folders[id].offline);
// If it is loaded, return the shared folder proxy // If it is loaded, return the shared folder proxy
return void cb(s.manager.folders[id].proxy); return void cb(proxy);
} else { } else {
// Otherwise, check if we know this shared folder // Otherwise, check if we know this shared folder
var shared = Util.find(s.proxy, ['drive', UserObject.SHARED_FOLDERS]) || {}; var shared = Util.find(s.proxy, ['drive', UserObject.SHARED_FOLDERS]) || {};

@ -58,11 +58,11 @@ define([
}); });
proxy.on('disconnect', function () { proxy.on('disconnect', function () {
team.offline = true; team.offline = true;
team.sendEvent('NETWORK_DISCONNECT'); team.sendEvent('NETWORK_DISCONNECT', team.id);
}); });
proxy.on('reconnect', function () { proxy.on('reconnect', function () {
team.offline = false; team.offline = false;
team.sendEvent('NETWORK_RECONNECT'); team.sendEvent('NETWORK_RECONNECT', team.id);
}); });
} }
proxy.on('change', [], function (o, n, p) { proxy.on('change', [], function (o, n, p) {
@ -934,7 +934,9 @@ define([
if (!team) { return void cb ({error: 'ENOENT'}); } if (!team) { return void cb ({error: 'ENOENT'}); }
if (!team.roster) { return void cb({error: 'NO_ROSTER'}); } if (!team.roster) { return void cb({error: 'NO_ROSTER'}); }
var state = team.roster.getState() || {}; var state = team.roster.getState() || {};
cb(state.metadata || {}); var md = state.metadata || {};
md.offline = team.offline;
cb(md);
}; };
var setTeamMetadata = function (ctx, data, cId, cb) { var setTeamMetadata = function (ctx, data, cId, cb) {
@ -1882,15 +1884,15 @@ define([
var t = Util.clone(teams); var t = Util.clone(teams);
Object.keys(t).forEach(function (id) { Object.keys(t).forEach(function (id) {
// If failure to load the team, don't send it // If failure to load the team, don't send it
if (ctx.teams[id]) { return; } if (ctx.teams[id]) {
t[id].offline = ctx.teams[id].offline;
return;
}
t[id].error = true; t[id].error = true;
}); });
cb(t); cb(t);
}; };
team.execCommand = function (clientId, obj, cb) { team.execCommand = function (clientId, obj, cb) {
if (ctx.store.offline) {
return void cb({ error: 'OFFLINE' });
}
var cmd = obj.cmd; var cmd = obj.cmd;
var data = obj.data; var data = obj.data;
@ -1914,30 +1916,36 @@ define([
return void setTeamMetadata(ctx, data, clientId, cb); return void setTeamMetadata(ctx, data, clientId, cb);
} }
if (cmd === 'OFFER_OWNERSHIP') { if (cmd === 'OFFER_OWNERSHIP') {
if (ctx.store.offline) { return void cb({ error: 'OFFLINE' }); }
return void offerOwnership(ctx, data, clientId, cb); return void offerOwnership(ctx, data, clientId, cb);
} }
if (cmd === 'ANSWER_OWNERSHIP') { if (cmd === 'ANSWER_OWNERSHIP') {
if (ctx.store.offline) { return void cb({ error: 'OFFLINE' }); }
return void answerOwnership(ctx, data, clientId, cb); return void answerOwnership(ctx, data, clientId, cb);
} }
if (cmd === 'DESCRIBE_USER') { if (cmd === 'DESCRIBE_USER') {
return void describeUser(ctx, data, clientId, cb); return void describeUser(ctx, data, clientId, cb);
} }
if (cmd === 'INVITE_TO_TEAM') { if (cmd === 'INVITE_TO_TEAM') {
if (ctx.store.offline) { return void cb({ error: 'OFFLINE' }); }
return void inviteToTeam(ctx, data, clientId, cb); return void inviteToTeam(ctx, data, clientId, cb);
} }
if (cmd === 'LEAVE_TEAM') { if (cmd === 'LEAVE_TEAM') {
return void leaveTeam(ctx, data, clientId, cb); return void leaveTeam(ctx, data, clientId, cb);
} }
if (cmd === 'JOIN_TEAM') { if (cmd === 'JOIN_TEAM') {
if (ctx.store.offline) { return void cb({ error: 'OFFLINE' }); }
return void joinTeam(ctx, data, clientId, cb); return void joinTeam(ctx, data, clientId, cb);
} }
if (cmd === 'REMOVE_USER') { if (cmd === 'REMOVE_USER') {
return void removeUser(ctx, data, clientId, cb); return void removeUser(ctx, data, clientId, cb);
} }
if (cmd === 'DELETE_TEAM') { if (cmd === 'DELETE_TEAM') {
if (ctx.store.offline) { return void cb({ error: 'OFFLINE' }); }
return void deleteTeam(ctx, data, clientId, cb); return void deleteTeam(ctx, data, clientId, cb);
} }
if (cmd === 'CREATE_TEAM') { if (cmd === 'CREATE_TEAM') {
if (ctx.store.offline) { return void cb({ error: 'OFFLINE' }); }
return void createTeam(ctx, data, clientId, cb); return void createTeam(ctx, data, clientId, cb);
} }
if (cmd === 'GET_EDITABLE_FOLDERS') { if (cmd === 'GET_EDITABLE_FOLDERS') {
@ -1950,6 +1958,7 @@ define([
return void getPreviewContent(ctx, data, clientId, cb); return void getPreviewContent(ctx, data, clientId, cb);
} }
if (cmd === 'ACCEPT_LINK_INVITATION') { if (cmd === 'ACCEPT_LINK_INVITATION') {
if (ctx.store.offline) { return void cb({ error: 'OFFLINE' }); }
return void acceptLinkInvitation(ctx, data, clientId, cb); return void acceptLinkInvitation(ctx, data, clientId, cb);
} }
}; };

@ -40,6 +40,14 @@ define([
userObject: userObject, userObject: userObject,
leave: leave leave: leave
}; };
if (proxy.on) {
proxy.on('disconnect', function () {
Env.folders[id].offline = true;
});
proxy.on('reconnect', function () {
Env.folders[id].online = true;
});
}
return userObject; return userObject;
}; };

@ -82,6 +82,8 @@ define([
var readOnly = !secret.keys.editKeyStr; var readOnly = !secret.keys.editKeyStr;
if (!manager || !manager.folders[fId]) { return; } if (!manager || !manager.folders[fId]) { return; }
manager.folders[fId].userObject.setReadOnly(readOnly, secret.keys.secondaryKey); manager.folders[fId].userObject.setReadOnly(readOnly, secret.keys.secondaryKey);
manager.folders[fId].offline = newObj.offline;
})); }));
}); });
// Remove from memory folders that have been deleted from the drive remotely // Remove from memory folders that have been deleted from the drive remotely

@ -46,7 +46,9 @@ define([
Backup, Backup,
Messages) Messages)
{ {
var APP = {}; var APP = {
teams: {}
};
var driveAPP = {}; var driveAPP = {};
var saveAs = window.saveAs; var saveAs = window.saveAs;
//var SHARED_FOLDER_NAME = Messages.fm_sharedFolderName; //var SHARED_FOLDER_NAME = Messages.fm_sharedFolderName;
@ -91,6 +93,8 @@ define([
var readOnly = !secret.keys.editKeyStr; var readOnly = !secret.keys.editKeyStr;
if (!manager || !manager.folders[fId]) { return; } if (!manager || !manager.folders[fId]) { return; }
manager.folders[fId].userObject.setReadOnly(readOnly, secret.keys.secondaryKey); manager.folders[fId].userObject.setReadOnly(readOnly, secret.keys.secondaryKey);
manager.folders[fId].offline = newObj.offline;
})); }));
}); });
// Remove from memory folders that have been deleted from the drive remotely // Remove from memory folders that have been deleted from the drive remotely
@ -211,6 +215,11 @@ define([
if (obj && obj.error) { if (obj && obj.error) {
return void UI.warn(Messages.error); return void UI.warn(Messages.error);
} }
// Refresh offline state
APP.teams[APP.team] = APP.teams[APP.team] || {};
APP.teams[APP.team].offline = obj.offline;
common.displayAvatar($avatar, obj.avatar, obj.name); common.displayAvatar($avatar, obj.avatar, obj.name);
$category.append($avatar); $category.append($avatar);
$avatar.append(h('span.cp-sidebarlayout-category-name', obj.name)); $avatar.append(h('span.cp-sidebarlayout-category-name', obj.name));
@ -333,6 +342,11 @@ define([
}); });
APP.drive = drive; APP.drive = drive;
driveAPP.refresh = drive.refresh; driveAPP.refresh = drive.refresh;
if (APP.teams[id] && APP.teams[id].offline) {
setEditable(false);
drive.refresh();
}
}); });
}; };
@ -406,7 +420,15 @@ define([
content.push(h('h3', Messages.team_listTitle + ' ' + slots)); content.push(h('h3', Messages.team_listTitle + ' ' + slots));
APP.teams = {};
keys.forEach(function (id) { keys.forEach(function (id) {
if (!obj[id].empty) {
APP.teams[id] = {
offline: obj[id] && obj[id].offline
};
}
var team = obj[id]; var team = obj[id];
if (team.empty) { if (team.empty) {
list.push(h('div.cp-team-list-team.empty', [ list.push(h('div.cp-team-list-team.empty', [
@ -1433,13 +1455,15 @@ define([
} }
}); });
var onDisconnect = function (noAlert) { var onDisconnect = function (teamId) {
if (APP.team && teamId && APP.team !== teamId) { return; }
setEditable(false); setEditable(false);
if (APP.team && driveAPP.refresh) { driveAPP.refresh(); } if (APP.team && driveAPP.refresh) { driveAPP.refresh(); }
toolbar.failed(); toolbar.failed();
if (!noAlert) { UIElements.disconnectAlert(); } UIElements.disconnectAlert();
}; };
var onReconnect = function () { var onReconnect = function (teamId) {
if (APP.team && teamId && APP.team !== teamId) { return; }
setEditable(true); setEditable(true);
if (APP.team && driveAPP.refresh) { driveAPP.refresh(); } if (APP.team && driveAPP.refresh) { driveAPP.refresh(); }
toolbar.reconnecting(); toolbar.reconnecting();
@ -1449,11 +1473,17 @@ define([
sframeChan.on('EV_DRIVE_LOG', function (msg) { sframeChan.on('EV_DRIVE_LOG', function (msg) {
UI.log(msg); UI.log(msg);
}); });
sframeChan.on('EV_NETWORK_DISCONNECT', function () { sframeChan.on('EV_NETWORK_DISCONNECT', function (teamId) {
onDisconnect(); onDisconnect(teamId);
if (teamId && APP.teams[teamId]) {
APP.teams[teamId].offline = true;
}
}); });
sframeChan.on('EV_NETWORK_RECONNECT', function () { sframeChan.on('EV_NETWORK_RECONNECT', function (teamId) {
onReconnect(); onReconnect(teamId);
if (teamId && APP.teams[teamId]) {
APP.teams[teamId].offline = false;
}
}); });
common.onLogout(function () { setEditable(false); }); common.onLogout(function () { setEditable(false); });
}); });

@ -85,10 +85,10 @@ define([
sframeChan.event('EV_'+obj.data.ev, obj.data.data); sframeChan.event('EV_'+obj.data.ev, obj.data.data);
} }
if (obj.data.ev === 'NETWORK_RECONNECT') { if (obj.data.ev === 'NETWORK_RECONNECT') {
sframeChan.event('EV_NETWORK_RECONNECT'); sframeChan.event('EV_NETWORK_RECONNECT', obj.data.data);
} }
if (obj.data.ev === 'NETWORK_DISCONNECT') { if (obj.data.ev === 'NETWORK_DISCONNECT') {
sframeChan.event('EV_NETWORK_DISCONNECT'); sframeChan.event('EV_NETWORK_DISCONNECT', obj.data.data);
} }
}); });

Loading…
Cancel
Save