From 845ef9bad6b9f5ff471b62505f9e39300297a3a4 Mon Sep 17 00:00:00 2001 From: Cheng-Han, Wu Date: Fri, 4 Mar 2016 23:17:35 +0800 Subject: Support export to and import from Google Drive --- public/js/google-drive-picker.js | 118 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 public/js/google-drive-picker.js (limited to 'public/js/google-drive-picker.js') diff --git a/public/js/google-drive-picker.js b/public/js/google-drive-picker.js new file mode 100644 index 00000000..e653653c --- /dev/null +++ b/public/js/google-drive-picker.js @@ -0,0 +1,118 @@ +/**! + * Google Drive File Picker Example + * By Daniel Lo Nigro (http://dan.cx/) + */ +(function() { + /** + * Initialise a Google Driver file picker + */ + var FilePicker = window.FilePicker = function(options) { + // Config + this.apiKey = options.apiKey; + this.clientId = options.clientId; + + // Elements + this.buttonEl = options.buttonEl; + + // Events + this.onSelect = options.onSelect; + this.buttonEl.on('click', this.open.bind(this)); + + // Disable the button until the API loads, as it won't work properly until then. + this.buttonEl.prop('disabled', true); + + // Load the drive API + gapi.client.setApiKey(this.apiKey); + gapi.client.load('drive', 'v2', this._driveApiLoaded.bind(this)); + google.load('picker', '1', { callback: this._pickerApiLoaded.bind(this) }); + } + + FilePicker.prototype = { + /** + * Open the file picker. + */ + open: function() { + // Check if the user has already authenticated + var token = gapi.auth.getToken(); + if (token) { + this._showPicker(); + } else { + // The user has not yet authenticated with Google + // We need to do the authentication before displaying the Drive picker. + this._doAuth(false, function() { this._showPicker(); }.bind(this)); + } + }, + + /** + * Show the file picker once authentication has been done. + * @private + */ + _showPicker: function() { + var accessToken = gapi.auth.getToken().access_token; + var view = new google.picker.DocsView(); + view.setMimeTypes("text/markdown,text/html"); + view.setIncludeFolders(true); + this.picker = new google.picker.PickerBuilder(). + enableFeature(google.picker.Feature.NAV_HIDDEN). + addView(view). + setAppId(this.clientId). + setOAuthToken(accessToken). + setCallback(this._pickerCallback.bind(this)). + build(). + setVisible(true); + }, + + /** + * Called when a file has been selected in the Google Drive file picker. + * @private + */ + _pickerCallback: function(data) { + if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) { + var file = data[google.picker.Response.DOCUMENTS][0], + id = file[google.picker.Document.ID], + request = gapi.client.drive.files.get({ + fileId: id + }); + + request.execute(this._fileGetCallback.bind(this)); + } + }, + /** + * Called when file details have been retrieved from Google Drive. + * @private + */ + _fileGetCallback: function(file) { + if (this.onSelect) { + this.onSelect(file); + } + }, + + /** + * Called when the Google Drive file picker API has finished loading. + * @private + */ + _pickerApiLoaded: function() { + this.buttonEl.prop('disabled', false); + }, + + /** + * Called when the Google Drive API has finished loading. + * @private + */ + _driveApiLoaded: function() { + this._doAuth(true); + }, + + /** + * Authenticate with Google Drive via the Google JavaScript API. + * @private + */ + _doAuth: function(immediate, callback) { + gapi.auth.authorize({ + client_id: this.clientId, + scope: 'https://www.googleapis.com/auth/drive.readonly', + immediate: immediate + }, callback ? callback : function() {}); + } + }; +}()); \ No newline at end of file -- cgit v1.2.3