seitime-frappe/frappe/public/js/integrations/google_drive_picker.js
2022-08-04 14:51:01 +05:30

95 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,
});
};
}
}
}