Small fixes
This commit is contained in:
parent
1231b26710
commit
4b875e798a
@ -16,7 +16,7 @@ define([
|
|||||||
};
|
};
|
||||||
|
|
||||||
var monetize = new MonetizeJS({
|
var monetize = new MonetizeJS({
|
||||||
applicationID: 'iklMbzDI7dvMEScb'
|
applicationID: 'ESTHdCYOi18iLhhO'
|
||||||
});
|
});
|
||||||
|
|
||||||
dialogAbout.onReady = function() {
|
dialogAbout.onReady = function() {
|
||||||
|
@ -48,7 +48,6 @@ define([
|
|||||||
utils.setInputChecked("#input-markdownextra-intraword", markdownExtra.config.intraword);
|
utils.setInputChecked("#input-markdownextra-intraword", markdownExtra.config.intraword);
|
||||||
utils.setInputChecked("#input-markdownextra-comments", markdownExtra.config.comments);
|
utils.setInputChecked("#input-markdownextra-comments", markdownExtra.config.comments);
|
||||||
utils.setInputValue("#input-markdownextra-highlighter", markdownExtra.config.highlighter);
|
utils.setInputValue("#input-markdownextra-highlighter", markdownExtra.config.highlighter);
|
||||||
utils.setInputChecked("#input-markdownextra-diagrams", markdownExtra.config.diagrams);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
markdownExtra.onSaveSettings = function(newConfig) {
|
markdownExtra.onSaveSettings = function(newConfig) {
|
||||||
@ -64,7 +63,6 @@ define([
|
|||||||
newConfig.intraword = utils.getInputChecked("#input-markdownextra-intraword");
|
newConfig.intraword = utils.getInputChecked("#input-markdownextra-intraword");
|
||||||
newConfig.comments = utils.getInputChecked("#input-markdownextra-comments");
|
newConfig.comments = utils.getInputChecked("#input-markdownextra-comments");
|
||||||
newConfig.highlighter = utils.getInputValue("#input-markdownextra-highlighter");
|
newConfig.highlighter = utils.getInputValue("#input-markdownextra-highlighter");
|
||||||
newConfig.diagrams = utils.getInputChecked("#input-markdownextra-diagrams");
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var eventMgr;
|
var eventMgr;
|
||||||
|
@ -63,8 +63,7 @@ define([
|
|||||||
element: '.navbar-inner',
|
element: '.navbar-inner',
|
||||||
title: 'StackEdit 4 is out!',
|
title: 'StackEdit 4 is out!',
|
||||||
content: [
|
content: [
|
||||||
'<p>I\'m very pleased to welcome you here!</p>',
|
'<p>I\'m very pleased to welcome you here! StackEdit keeps getting better and I hope you appreciate it.</p>',
|
||||||
'<p>StackEdit keeps getting better and I hope you appreciate it.</p>',
|
|
||||||
'Please click <b>Next</b> to take a quick tour.'
|
'Please click <b>Next</b> to take a quick tour.'
|
||||||
].join(""),
|
].join(""),
|
||||||
placement: 'bottom'
|
placement: 'bottom'
|
||||||
@ -97,20 +96,20 @@ define([
|
|||||||
'<b>Tip:</b> Reopen the Welcome Document from Settings>Utils to discover other new features.'
|
'<b>Tip:</b> Reopen the Welcome Document from Settings>Utils to discover other new features.'
|
||||||
].join(""),
|
].join(""),
|
||||||
placement: 'right',
|
placement: 'right',
|
||||||
reflex: true,
|
reflex: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
element: '.navbar-inner',
|
element: '.navbar-inner',
|
||||||
title: 'Happy StackWriting!',
|
title: 'Happy StackWriting!',
|
||||||
content: [
|
content: [
|
||||||
'<p>Enjoy, and don\'t forget to rate 5 stars on the <a target="_blank" href="https://chrome.google.com/webstore/detail/stackedit/iiooodelglhkcpgbajoejffhijaclcdg/reviews">Chrome Web Store</a>...</p>',
|
'<p>Enjoy, and don\'t forget to rate 5 stars on the <a target="_blank" href="https://chrome.google.com/webstore/detail/stackedit/iiooodelglhkcpgbajoejffhijaclcdg/reviews">Chrome Web Store</a>...</p>',
|
||||||
'<a href="https://twitter.com/share" class="twitter-share-button" data-url="https://stackedit.io" data-text="Great #markdown editor!" data-via="stackedit" data-size="large"></a>',
|
'<a href="https://twitter.com/share" class="twitter-share-button" data-url="https://stackedit.io" data-text="Great #markdown editor!" data-via="stackedit" data-size="large"></a>'
|
||||||
].join(""),
|
].join(""),
|
||||||
placement: 'bottom',
|
placement: 'bottom',
|
||||||
onShown: function() {
|
onShown: function() {
|
||||||
eventMgr.onTweet();
|
eventMgr.onTweet();
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
]);
|
]);
|
||||||
if(!_.has(storage, 'welcomeTour')) {
|
if(!_.has(storage, 'welcomeTour')) {
|
||||||
tour.start();
|
tour.start();
|
||||||
|
@ -1,361 +1,354 @@
|
|||||||
/*global Dropbox */
|
/*global Dropbox */
|
||||||
define([
|
define([
|
||||||
"jquery",
|
"jquery",
|
||||||
"underscore",
|
"underscore",
|
||||||
"constants",
|
"constants",
|
||||||
"core",
|
"core",
|
||||||
"utils",
|
"utils",
|
||||||
"storage",
|
"storage",
|
||||||
"logger",
|
"logger",
|
||||||
"settings",
|
"settings",
|
||||||
"eventMgr",
|
"eventMgr",
|
||||||
"classes/AsyncTask",
|
"classes/AsyncTask"
|
||||||
], function($, _, constants, core, utils, storage, logger, settings, eventMgr, AsyncTask) {
|
], function($, _, constants, core, utils, storage, logger, settings, eventMgr, AsyncTask) {
|
||||||
|
|
||||||
var client;
|
var client;
|
||||||
var authenticated = false;
|
var authenticated = false;
|
||||||
|
|
||||||
var dropboxHelper = {};
|
var dropboxHelper = {};
|
||||||
|
|
||||||
// Listen to offline status changes
|
|
||||||
var isOffline = false;
|
|
||||||
eventMgr.addListener("onOfflineChanged", function(isOfflineParam) {
|
|
||||||
isOffline = isOfflineParam;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Try to connect dropbox by downloading client.js
|
// Listen to offline status changes
|
||||||
function connect(task) {
|
var isOffline = false;
|
||||||
task.onRun(function() {
|
eventMgr.addListener("onOfflineChanged", function(isOfflineParam) {
|
||||||
if(isOffline === true) {
|
isOffline = isOfflineParam;
|
||||||
client = undefined;
|
});
|
||||||
task.error(new Error("Operation not available in offline mode.|stopPublish"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(client !== undefined) {
|
|
||||||
task.chain();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$.ajax({
|
|
||||||
url: "libs/dropbox.min.js",
|
|
||||||
dataType: "script",
|
|
||||||
timeout: constants.AJAX_TIMEOUT
|
|
||||||
}).done(function() {
|
|
||||||
client = new Dropbox.Client({
|
|
||||||
key: settings.dropboxFullAccess === true ? constants.DROPBOX_APP_KEY : constants.DROPBOX_RESTRICTED_APP_KEY,
|
|
||||||
secret: settings.dropboxFullAccess === true ? constants.DROPBOX_APP_SECRET : constants.DROPBOX_RESTRICTED_APP_SECRET
|
|
||||||
});
|
|
||||||
client.authDriver(new Dropbox.AuthDriver.Popup({
|
|
||||||
receiverUrl: constants.BASE_URL + "html/dropbox-oauth-receiver.html",
|
|
||||||
rememberUser: true
|
|
||||||
}));
|
|
||||||
task.chain();
|
|
||||||
}).fail(function(jqXHR) {
|
|
||||||
var error = {
|
|
||||||
status: jqXHR.status,
|
|
||||||
responseText: jqXHR.statusText
|
|
||||||
};
|
|
||||||
handleError(error, task);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to authenticate with Oauth
|
// Try to connect dropbox by downloading client.js
|
||||||
function authenticate(task) {
|
function connect(task) {
|
||||||
task.onRun(function() {
|
task.onRun(function() {
|
||||||
if(authenticated === true) {
|
if(isOffline === true) {
|
||||||
task.chain();
|
client = undefined;
|
||||||
return;
|
return task.error(new Error("Operation not available in offline mode.|stopPublish"));
|
||||||
}
|
}
|
||||||
var immediate = true;
|
if(client !== undefined) {
|
||||||
function oauthRedirect() {
|
return task.chain();
|
||||||
utils.redirectConfirm('You are being redirected to <strong>Dropbox</strong> authorization page.', function() {
|
}
|
||||||
task.chain(localAuthenticate);
|
$.ajax({
|
||||||
}, function() {
|
url: "libs/dropbox.min.js",
|
||||||
task.error(new Error('Operation canceled.'));
|
dataType: "script",
|
||||||
});
|
timeout: constants.AJAX_TIMEOUT
|
||||||
}
|
}).done(function() {
|
||||||
function localAuthenticate() {
|
client = new Dropbox.Client({
|
||||||
if(immediate === false) {
|
key: settings.dropboxFullAccess === true ? constants.DROPBOX_APP_KEY : constants.DROPBOX_RESTRICTED_APP_KEY,
|
||||||
// If not immediate we add time for user to enter his
|
secret: settings.dropboxFullAccess === true ? constants.DROPBOX_APP_SECRET : constants.DROPBOX_RESTRICTED_APP_SECRET
|
||||||
// credentials
|
});
|
||||||
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
|
client.authDriver(new Dropbox.AuthDriver.Popup({
|
||||||
}
|
receiverUrl: constants.BASE_URL + "html/dropbox-oauth-receiver.html",
|
||||||
else {
|
rememberUser: true
|
||||||
client.reset();
|
}));
|
||||||
}
|
task.chain();
|
||||||
client.authenticate({
|
}).fail(function(jqXHR) {
|
||||||
interactive: !immediate
|
var error = {
|
||||||
}, function(error, client) {
|
status: jqXHR.status,
|
||||||
// Success
|
responseText: jqXHR.statusText
|
||||||
if(client.isAuthenticated() === true) {
|
};
|
||||||
authenticated = true;
|
handleError(error, task);
|
||||||
task.chain();
|
});
|
||||||
return;
|
});
|
||||||
}
|
}
|
||||||
// If immediate did not work retry without immediate flag
|
|
||||||
if(immediate === true) {
|
|
||||||
immediate = false;
|
|
||||||
task.chain(oauthRedirect);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Error
|
|
||||||
task.error(new Error("Access to Dropbox account is not authorized."));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
task.chain(localAuthenticate);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
dropboxHelper.upload = function(path, content, callback) {
|
// Try to authenticate with Oauth
|
||||||
var result;
|
function authenticate(task) {
|
||||||
var task = new AsyncTask();
|
task.onRun(function() {
|
||||||
connect(task);
|
if(authenticated === true) {
|
||||||
authenticate(task);
|
return task.chain();
|
||||||
task.onRun(function() {
|
}
|
||||||
client.writeFile(path, content, function(error, stat) {
|
var immediate = true;
|
||||||
if(!error) {
|
|
||||||
result = stat;
|
|
||||||
task.chain();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Handle error
|
|
||||||
if(error.status === 400) {
|
|
||||||
error = 'Could not upload document into path "' + path + '".';
|
|
||||||
}
|
|
||||||
handleError(error, task);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
task.onSuccess(function() {
|
|
||||||
callback(undefined, result);
|
|
||||||
});
|
|
||||||
task.onError(function(error) {
|
|
||||||
callback(error);
|
|
||||||
});
|
|
||||||
task.enqueue();
|
|
||||||
};
|
|
||||||
|
|
||||||
dropboxHelper.checkChanges = function(lastChangeId, callback) {
|
function oauthRedirect() {
|
||||||
var changes = [];
|
utils.redirectConfirm('You are being redirected to <strong>Dropbox</strong> authorization page.', function() {
|
||||||
var newChangeId = lastChangeId || 0;
|
task.chain(localAuthenticate);
|
||||||
var task = new AsyncTask();
|
}, function() {
|
||||||
connect(task);
|
task.error(new Error('Operation canceled.'));
|
||||||
authenticate(task);
|
});
|
||||||
task.onRun(function() {
|
}
|
||||||
function retrievePageOfChanges() {
|
|
||||||
client.pullChanges(newChangeId, function(error, pullChanges) {
|
|
||||||
if(error) {
|
|
||||||
handleError(error, task);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Retrieve success
|
|
||||||
newChangeId = pullChanges.cursor();
|
|
||||||
if(pullChanges.changes !== undefined) {
|
|
||||||
changes = changes.concat(pullChanges.changes);
|
|
||||||
}
|
|
||||||
if(pullChanges.shouldPullAgain) {
|
|
||||||
task.chain(retrievePageOfChanges);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
task.chain();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
task.chain(retrievePageOfChanges);
|
|
||||||
});
|
|
||||||
task.onSuccess(function() {
|
|
||||||
callback(undefined, changes, newChangeId);
|
|
||||||
});
|
|
||||||
task.onError(function(error) {
|
|
||||||
callback(error);
|
|
||||||
});
|
|
||||||
task.enqueue();
|
|
||||||
};
|
|
||||||
|
|
||||||
dropboxHelper.downloadMetadata = function(paths, callback) {
|
function localAuthenticate() {
|
||||||
var result = [];
|
if(immediate === false) {
|
||||||
var task = new AsyncTask();
|
// If not immediate we add time for user to enter his
|
||||||
connect(task);
|
// credentials
|
||||||
authenticate(task);
|
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
|
||||||
task.onRun(function() {
|
}
|
||||||
function recursiveDownloadMetadata() {
|
else {
|
||||||
if(paths.length === 0) {
|
client.reset();
|
||||||
task.chain();
|
}
|
||||||
return;
|
client.authenticate({
|
||||||
}
|
interactive: !immediate
|
||||||
var path = paths[0];
|
}, function(error, client) {
|
||||||
client.stat(path, function(error, stat) {
|
// Success
|
||||||
if(stat) {
|
if(client.isAuthenticated() === true) {
|
||||||
result.push(stat);
|
authenticated = true;
|
||||||
paths.shift();
|
return task.chain();
|
||||||
task.chain(recursiveDownloadMetadata);
|
}
|
||||||
return;
|
// If immediate did not work retry without immediate flag
|
||||||
}
|
if(immediate === true) {
|
||||||
handleError(error, task);
|
immediate = false;
|
||||||
});
|
return task.chain(oauthRedirect);
|
||||||
}
|
}
|
||||||
task.chain(recursiveDownloadMetadata);
|
// Error
|
||||||
});
|
task.error(new Error("Access to Dropbox account is not authorized."));
|
||||||
task.onSuccess(function() {
|
});
|
||||||
callback(undefined, result);
|
}
|
||||||
});
|
|
||||||
task.onError(function(error) {
|
|
||||||
callback(error);
|
|
||||||
});
|
|
||||||
task.enqueue();
|
|
||||||
};
|
|
||||||
|
|
||||||
dropboxHelper.downloadContent = function(objects, callback) {
|
task.chain(localAuthenticate);
|
||||||
var result = [];
|
});
|
||||||
var task = new AsyncTask();
|
}
|
||||||
connect(task);
|
|
||||||
authenticate(task);
|
|
||||||
task.onRun(function() {
|
|
||||||
function recursiveDownloadContent() {
|
|
||||||
if(objects.length === 0) {
|
|
||||||
task.chain();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var object = objects[0];
|
|
||||||
result.push(object);
|
|
||||||
var file;
|
|
||||||
// object may be a file
|
|
||||||
if(object.isFile === true) {
|
|
||||||
file = object;
|
|
||||||
}
|
|
||||||
// object may be a change
|
|
||||||
else if(object.wasRemoved !== undefined) {
|
|
||||||
file = object.stat;
|
|
||||||
}
|
|
||||||
if(!file) {
|
|
||||||
objects.shift();
|
|
||||||
task.chain(recursiveDownloadContent);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
client.readFile(file.path, function(error, data) {
|
|
||||||
if(_.isString(data)) {
|
|
||||||
file.content = data;
|
|
||||||
objects.shift();
|
|
||||||
task.chain(recursiveDownloadContent);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
handleError(error, task);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
task.chain(recursiveDownloadContent);
|
|
||||||
});
|
|
||||||
task.onSuccess(function() {
|
|
||||||
callback(undefined, result);
|
|
||||||
});
|
|
||||||
task.onError(function(error) {
|
|
||||||
callback(error);
|
|
||||||
});
|
|
||||||
task.enqueue();
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleError(error, task) {
|
dropboxHelper.upload = function(path, content, callback) {
|
||||||
var errorMsg = true;
|
var result;
|
||||||
if(error) {
|
var task = new AsyncTask();
|
||||||
logger.error(error);
|
connect(task);
|
||||||
// Try to analyze the error
|
authenticate(task);
|
||||||
if(typeof error === "string") {
|
task.onRun(function() {
|
||||||
errorMsg = error;
|
client.writeFile(path, content, function(error, stat) {
|
||||||
}
|
if(!error) {
|
||||||
else {
|
result = stat;
|
||||||
errorMsg = "Dropbox error (" + error.status + ": " + error.responseText + ").";
|
return task.chain();
|
||||||
|
}
|
||||||
|
// Handle error
|
||||||
|
if(error.status === 400) {
|
||||||
|
error = 'Could not upload document into path "' + path + '".';
|
||||||
|
}
|
||||||
|
handleError(error, task);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
task.onSuccess(function() {
|
||||||
|
callback(undefined, result);
|
||||||
|
});
|
||||||
|
task.onError(function(error) {
|
||||||
|
callback(error);
|
||||||
|
});
|
||||||
|
task.enqueue();
|
||||||
|
};
|
||||||
|
|
||||||
if(error.status === 401 || error.status === 403) {
|
dropboxHelper.checkChanges = function(lastChangeId, callback) {
|
||||||
authenticated = false;
|
var changes = [];
|
||||||
errorMsg = "Access to Dropbox account is not authorized.";
|
var newChangeId = lastChangeId || 0;
|
||||||
task.retry(new Error(errorMsg), 1);
|
var task = new AsyncTask();
|
||||||
return;
|
connect(task);
|
||||||
}
|
authenticate(task);
|
||||||
else if(error.status === 400 && error.responseText.indexOf("oauth_nonce") !== -1) {
|
task.onRun(function() {
|
||||||
// A bug I guess...
|
function retrievePageOfChanges() {
|
||||||
_.each(_.keys(storage), function(key) {
|
client.pullChanges(newChangeId, function(error, pullChanges) {
|
||||||
// We have to remove the Oauth cache from the
|
if(error) {
|
||||||
// storage
|
return handleError(error, task);
|
||||||
if(key.indexOf("dropbox-auth") === 0) {
|
}
|
||||||
storage.removeItem(key);
|
// Retrieve success
|
||||||
}
|
newChangeId = pullChanges.cursor();
|
||||||
});
|
if(pullChanges.changes !== undefined) {
|
||||||
authenticated = false;
|
changes = changes.concat(pullChanges.changes);
|
||||||
task.retry(new Error(errorMsg), 1);
|
}
|
||||||
return;
|
if(pullChanges.shouldPullAgain) {
|
||||||
}
|
task.chain(retrievePageOfChanges);
|
||||||
else if(error.status <= 0) {
|
}
|
||||||
client = undefined;
|
else {
|
||||||
authenticated = false;
|
task.chain();
|
||||||
core.setOffline();
|
}
|
||||||
errorMsg = "|stopPublish";
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
task.error(new Error(errorMsg));
|
|
||||||
}
|
|
||||||
|
|
||||||
var pickerLoaded = false;
|
task.chain(retrievePageOfChanges);
|
||||||
function loadPicker(task) {
|
});
|
||||||
task.onRun(function() {
|
task.onSuccess(function() {
|
||||||
if(pickerLoaded === true) {
|
callback(undefined, changes, newChangeId);
|
||||||
task.chain();
|
});
|
||||||
return;
|
task.onError(function(error) {
|
||||||
}
|
callback(error);
|
||||||
function chooserRedirect() {
|
});
|
||||||
utils.redirectConfirm('You are being redirected to <strong>Dropbox Chooser</strong> page.', function() {
|
task.enqueue();
|
||||||
task.chain();
|
};
|
||||||
}, function() {
|
|
||||||
task.error(new Error('Operation canceled.'));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
$.ajax({
|
|
||||||
url: "https://www.dropbox.com/static/api/1/dropbox.js",
|
|
||||||
dataType: "script",
|
|
||||||
timeout: constants.AJAX_TIMEOUT
|
|
||||||
}).done(function() {
|
|
||||||
pickerLoaded = true;
|
|
||||||
task.chain(chooserRedirect);
|
|
||||||
}).fail(function(jqXHR) {
|
|
||||||
var error = {
|
|
||||||
status: jqXHR.status,
|
|
||||||
responseText: jqXHR.statusText
|
|
||||||
};
|
|
||||||
handleError(error, task);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
dropboxHelper.picker = function(callback) {
|
dropboxHelper.downloadMetadata = function(paths, callback) {
|
||||||
var paths = [];
|
var result = [];
|
||||||
var task = new AsyncTask();
|
var task = new AsyncTask();
|
||||||
// Add some time for user to choose his files
|
connect(task);
|
||||||
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
|
authenticate(task);
|
||||||
connect(task);
|
task.onRun(function() {
|
||||||
loadPicker(task);
|
function recursiveDownloadMetadata() {
|
||||||
task.onRun(function() {
|
if(paths.length === 0) {
|
||||||
var options = {};
|
return task.chain();
|
||||||
options.multiselect = true;
|
}
|
||||||
options.linkType = "direct";
|
var path = paths[0];
|
||||||
options.success = function(files) {
|
client.stat(path, function(error, stat) {
|
||||||
for ( var i = 0; i < files.length; i++) {
|
if(stat) {
|
||||||
var path = files[i].link;
|
result.push(stat);
|
||||||
path = path.replace(/.*\/view\/[^\/]*/, "");
|
paths.shift();
|
||||||
paths.push(decodeURI(path));
|
return task.chain(recursiveDownloadMetadata);
|
||||||
}
|
}
|
||||||
task.chain();
|
handleError(error, task);
|
||||||
};
|
});
|
||||||
options.cancel = function() {
|
}
|
||||||
task.chain();
|
|
||||||
};
|
|
||||||
Dropbox.choose(options);
|
|
||||||
});
|
|
||||||
task.onSuccess(function() {
|
|
||||||
callback(undefined, paths);
|
|
||||||
});
|
|
||||||
task.onError(function(error) {
|
|
||||||
callback(error);
|
|
||||||
});
|
|
||||||
task.enqueue();
|
|
||||||
};
|
|
||||||
|
|
||||||
return dropboxHelper;
|
task.chain(recursiveDownloadMetadata);
|
||||||
|
});
|
||||||
|
task.onSuccess(function() {
|
||||||
|
callback(undefined, result);
|
||||||
|
});
|
||||||
|
task.onError(function(error) {
|
||||||
|
callback(error);
|
||||||
|
});
|
||||||
|
task.enqueue();
|
||||||
|
};
|
||||||
|
|
||||||
|
dropboxHelper.downloadContent = function(objects, callback) {
|
||||||
|
var result = [];
|
||||||
|
var task = new AsyncTask();
|
||||||
|
connect(task);
|
||||||
|
authenticate(task);
|
||||||
|
task.onRun(function() {
|
||||||
|
function recursiveDownloadContent() {
|
||||||
|
if(objects.length === 0) {
|
||||||
|
return task.chain();
|
||||||
|
}
|
||||||
|
var object = objects[0];
|
||||||
|
result.push(object);
|
||||||
|
var file;
|
||||||
|
// object may be a file
|
||||||
|
if(object.isFile === true) {
|
||||||
|
file = object;
|
||||||
|
}
|
||||||
|
// object may be a change
|
||||||
|
else if(object.wasRemoved !== undefined) {
|
||||||
|
file = object.stat;
|
||||||
|
}
|
||||||
|
if(!file) {
|
||||||
|
objects.shift();
|
||||||
|
return task.chain(recursiveDownloadContent);
|
||||||
|
}
|
||||||
|
client.readFile(file.path, function(error, data) {
|
||||||
|
if(_.isString(data)) {
|
||||||
|
file.content = data;
|
||||||
|
objects.shift();
|
||||||
|
return task.chain(recursiveDownloadContent);
|
||||||
|
}
|
||||||
|
handleError(error, task);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
task.chain(recursiveDownloadContent);
|
||||||
|
});
|
||||||
|
task.onSuccess(function() {
|
||||||
|
callback(undefined, result);
|
||||||
|
});
|
||||||
|
task.onError(function(error) {
|
||||||
|
callback(error);
|
||||||
|
});
|
||||||
|
task.enqueue();
|
||||||
|
};
|
||||||
|
|
||||||
|
function handleError(error, task) {
|
||||||
|
var errorMsg = true;
|
||||||
|
if(error) {
|
||||||
|
logger.error(error);
|
||||||
|
// Try to analyze the error
|
||||||
|
if(typeof error === "string") {
|
||||||
|
errorMsg = error;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
errorMsg = "Dropbox error (" + error.status + ": " + error.responseText + ").";
|
||||||
|
|
||||||
|
if(error.status === 401 || error.status === 403) {
|
||||||
|
authenticated = false;
|
||||||
|
errorMsg = "Access to Dropbox account is not authorized.";
|
||||||
|
return task.retry(new Error(errorMsg), 1);
|
||||||
|
}
|
||||||
|
else if(error.status === 400 && error.responseText.indexOf("oauth_nonce") !== -1) {
|
||||||
|
// A bug I guess...
|
||||||
|
_.each(_.keys(storage), function(key) {
|
||||||
|
// We have to remove the Oauth cache from the
|
||||||
|
// storage
|
||||||
|
if(key.indexOf("dropbox-auth") === 0) {
|
||||||
|
storage.removeItem(key);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
authenticated = false;
|
||||||
|
return task.retry(new Error(errorMsg), 1);
|
||||||
|
}
|
||||||
|
else if(error.status <= 0) {
|
||||||
|
client = undefined;
|
||||||
|
authenticated = false;
|
||||||
|
core.setOffline();
|
||||||
|
errorMsg = "|stopPublish";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
task.error(new Error(errorMsg));
|
||||||
|
}
|
||||||
|
|
||||||
|
var pickerLoaded = false;
|
||||||
|
|
||||||
|
function loadPicker(task) {
|
||||||
|
task.onRun(function() {
|
||||||
|
if(pickerLoaded === true) {
|
||||||
|
return task.chain();
|
||||||
|
}
|
||||||
|
function chooserRedirect() {
|
||||||
|
utils.redirectConfirm('You are being redirected to <strong>Dropbox Chooser</strong> page.', function() {
|
||||||
|
task.chain();
|
||||||
|
}, function() {
|
||||||
|
task.error(new Error('Operation canceled.'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: "https://www.dropbox.com/static/api/1/dropbox.js",
|
||||||
|
dataType: "script",
|
||||||
|
timeout: constants.AJAX_TIMEOUT
|
||||||
|
}).done(function() {
|
||||||
|
pickerLoaded = true;
|
||||||
|
task.chain(chooserRedirect);
|
||||||
|
}).fail(function(jqXHR) {
|
||||||
|
var error = {
|
||||||
|
status: jqXHR.status,
|
||||||
|
responseText: jqXHR.statusText
|
||||||
|
};
|
||||||
|
handleError(error, task);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
dropboxHelper.picker = function(callback) {
|
||||||
|
var paths = [];
|
||||||
|
var task = new AsyncTask();
|
||||||
|
// Add some time for user to choose his files
|
||||||
|
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
|
||||||
|
connect(task);
|
||||||
|
loadPicker(task);
|
||||||
|
task.onRun(function() {
|
||||||
|
var options = {};
|
||||||
|
options.multiselect = true;
|
||||||
|
options.linkType = "direct";
|
||||||
|
options.success = function(files) {
|
||||||
|
for(var i = 0; i < files.length; i++) {
|
||||||
|
var path = files[i].link;
|
||||||
|
path = path.replace(/.*\/view\/[^\/]*/, "");
|
||||||
|
paths.push(decodeURI(path));
|
||||||
|
}
|
||||||
|
task.chain();
|
||||||
|
};
|
||||||
|
options.cancel = function() {
|
||||||
|
task.chain();
|
||||||
|
};
|
||||||
|
Dropbox.choose(options);
|
||||||
|
});
|
||||||
|
task.onSuccess(function() {
|
||||||
|
callback(undefined, paths);
|
||||||
|
});
|
||||||
|
task.onError(function(error) {
|
||||||
|
callback(error);
|
||||||
|
});
|
||||||
|
task.enqueue();
|
||||||
|
};
|
||||||
|
|
||||||
|
return dropboxHelper;
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user