118 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**!
 | |
|  * 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() {});
 | |
| 		}
 | |
| 	};
 | |
| }()); |