seitime-frappe/frappe/public/js/integrations/google_drive_picker.js
2022-02-01 08:26:24 +00:00

98 lines
2.3 KiB
JavaScript

/* global gapi:false, google:false */
export default class GoogleDrivePicker {
constructor({
pickerCallback,
enabled,
appId,
developerKey,
clientId
} = {}) {
this.scope = ['https://www.googleapis.com/auth/drive.readonly'];
this.pickerApiLoaded = false;
this.enabled = enabled;
this.appId = appId;
this.pickerCallback = pickerCallback;
this.developerKey = developerKey;
this.clientId = clientId;
}
loadPicker() {
// load the google API library
$.ajax({
method: "GET",
url: "https://apis.google.com/js/api.js",
dataType: "script",
cache: true
}).done(this.loadGapi.bind(this));
}
loadGapi() {
// load auth and picker libraries
if (!frappe.boot.user.google_drive_token) {
gapi.load('auth', this.onAuthApiLoad.bind(this));
}
gapi.load('picker', this.onPickerApiLoad.bind(this));
}
onAuthApiLoad() {
gapi.auth.authorize({
'client_id': this.clientId,
'scope': this.scope,
'immediate': false
}, this.handleAuthResult.bind(this));
}
handleAuthResult(authResult) {
let error_map = {
"popup_closed_by_user": __("Google Authentication was closed abruptly by the user")
};
if (authResult && !authResult.error) {
frappe.boot.user.google_drive_token = authResult.access_token;
this.createPicker();
} else {
let error = error_map[authResult.error] || __("Google Authentication Error");
frappe.throw(error);
}
}
onPickerApiLoad() {
this.pickerApiLoaded = true;
this.createPicker();
}
createPicker() {
// Create and render a Picker object for searching images.
if (this.pickerApiLoaded && frappe.boot.user.google_drive_token) {
this.view = new google.picker.DocsView(google.picker.ViewId.DOCS)
.setParent('root') // show the root folder by default
.setIncludeFolders(true); // also show folders, not just files
this.picker = new google.picker.PickerBuilder()
.setAppId(this.appId)
.setDeveloperKey(this.developerKey)
.setOAuthToken(frappe.boot.user.google_drive_token)
.addView(this.view)
.setLocale(frappe.boot.lang)
.setCallback(this.pickerCallback)
.build();
this.picker.setVisible(true);
this.setupHide();
}
}
setupHide() {
let bg = $(".picker-dialog-bg");
for (let el of bg) {
el.onclick = () => {
this.picker.setVisible(false);
this.picker.Ob({
action: google.picker.Action.CANCEL
});
};
}
}
}