summaryrefslogtreecommitdiff
path: root/public/js/google-drive-picker.js
diff options
context:
space:
mode:
authorCheng-Han, Wu2016-03-04 23:17:35 +0800
committerCheng-Han, Wu2016-03-04 23:17:35 +0800
commit845ef9bad6b9f5ff471b62505f9e39300297a3a4 (patch)
tree8ee0bcd9a2b0ba22330d7ca4015c681bf4ad2bcf /public/js/google-drive-picker.js
parentc183002c14397c8b6e1ef26c1367197d987d7c62 (diff)
Support export to and import from Google Drive
Diffstat (limited to 'public/js/google-drive-picker.js')
-rw-r--r--public/js/google-drive-picker.js118
1 files changed, 118 insertions, 0 deletions
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