82 lines
2.1 KiB
JavaScript
82 lines
2.1 KiB
JavaScript
/* global gapi:false, google:false */
|
|
export default class GoogleDrivePicker {
|
|
constructor({ pickerCallback, enabled, appId, clientId } = {}) {
|
|
this.scope = "https://www.googleapis.com/auth/drive.file";
|
|
this.pickerApiLoaded = false;
|
|
this.enabled = enabled;
|
|
this.appId = appId;
|
|
this.pickerCallback = pickerCallback;
|
|
this.clientId = clientId;
|
|
}
|
|
|
|
async loadPicker() {
|
|
inject_script("https://accounts.google.com/gsi/client").then(() => {
|
|
this.authenticate();
|
|
});
|
|
|
|
inject_script("https://apis.google.com/js/api.js").then(() => {
|
|
gapi.load("client:picker", {
|
|
callback: () => {
|
|
gapi.client.load("https://www.googleapis.com/discovery/v1/apis/drive/v3/rest");
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
authenticate() {
|
|
const tokenClient = google.accounts.oauth2.initTokenClient({
|
|
client_id: this.clientId,
|
|
scope: this.scope,
|
|
callback: async (response) => {
|
|
if (response.error !== undefined) {
|
|
frappe.throw(response);
|
|
}
|
|
|
|
this.createPicker(response.access_token);
|
|
},
|
|
});
|
|
|
|
// Always try to get away with an empty prompt.
|
|
// This will still ask for consent if the user has not given it before.
|
|
tokenClient.requestAccessToken({ prompt: "" });
|
|
}
|
|
|
|
createPicker(access_token) {
|
|
this.view = new google.picker.View(google.picker.ViewId.DOCS);
|
|
this.picker = new google.picker.PickerBuilder()
|
|
.setAppId(this.appId)
|
|
.setOAuthToken(access_token)
|
|
.addView(this.view)
|
|
.addView(new google.picker.DocsUploadView())
|
|
.setLocale(frappe.boot.lang)
|
|
.setCallback(this.pickerCallback)
|
|
.build();
|
|
this.picker.setVisible(true);
|
|
this.setupHide();
|
|
}
|
|
|
|
setupHide() {
|
|
let bg = document.querySelectorAll(".picker-dialog-bg");
|
|
|
|
for (const el of bg) {
|
|
el.addEventListener("click", () => {
|
|
this.picker.dispose();
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
function inject_script(src) {
|
|
return new Promise((resolve, reject) => {
|
|
if (document.querySelector(`script[src="${src}"]`) !== null) {
|
|
resolve();
|
|
return;
|
|
}
|
|
|
|
let script = document.createElement("script");
|
|
script.src = src;
|
|
script.onload = resolve;
|
|
script.onerror = reject;
|
|
document.body.appendChild(script);
|
|
});
|
|
}
|