import getUser from '@salesforce/apex/Apryse_ContentVersionController.getUser';
import saveDocument from '@salesforce/apex/Apryse_ContentVersionController.saveDocument';
import libUrl from '@salesforce/resourceUrl/lib';
import myfilesUrl from '@salesforce/resourceUrl/myfiles';
import { fireEvent, registerListener, unregisterAllListeners } from 'c/pubsub';
import { CurrentPageReference } from 'lightning/navigation';
import { loadScript } from 'lightning/platformResourceLoader';
import { api, LightningElement, wire } from 'lwc';
import mimeTypes from './mimeTypes';
function _base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array( len );
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
export default class ApryseWvInstance extends LightningElement {
//initialization options
fullAPI = true;
enableRedaction = true;
enableFilePicker = true;
uiInitialized = false;
source = 'My file';
@api recordId;
@wire(CurrentPageReference)
pageRef;
username;
connectedCallback() {
registerListener('blobSelected', this.handleBlobSelected, this);
registerListener('closeDocument', this.closeDocument, this);
registerListener('downloadDocument', this.downloadDocument, this);
registerListener('fileSelected', this.handleFileSelected, this);
window.addEventListener('message', this.handleReceiveMessage.bind(this), false);
}
disconnectedCallback() {
unregisterAllListeners(this);
window.removeEventListener('message', this.handleReceiveMessage);
}
handleBlobSelected(record) {
const blobby = new Blob([_base64ToArrayBuffer(record.body)], {
type: mimeTypes[record.FileExtension]
});
const payload = {
blob: blobby,
extension: record.cv.FileExtension,
filename: record.cv.Title + "." + record.cv.FileExtension,
documentId: record.cv.Id
};
this.iframeWindow.postMessage({ type: 'OPEN_DOCUMENT_BLOB', payload }, '*');
}
renderedCallback() {
var self = this;
if (this.uiInitialized) {
return;
}
Promise.all([
loadScript(self, libUrl + '/webviewer.min.js')
])
.then(() => this.handleInitWithCurrentUser())
.catch(console.error);
}
handleFileSelected(file) {
this.iframeWindow.postMessage({type: 'OPEN_DOCUMENT', file: file}, '*')
}
handleInitWithCurrentUser() {
getUser()
.then((result) => {
this.username = result;
this.error = undefined;
this.initUI();
})
.catch((error) => {
console.error(error);
this.showNotification('Error', error.body.message, 'error');
});
}
initUI() {
var myObj = {
libUrl: libUrl,
fullAPI: this.fullAPI || false,
namespacePrefix: '',
username: this.username,
};
var url = myfilesUrl + '/webviewer-demo-annotated.pdf';
const viewerElement = this.template.querySelector('div')
// eslint-disable-next-line no-unused-vars
const viewer = new WebViewer.Iframe({
path: libUrl, // path to the Apryse 'lib' folder on your server
custom: JSON.stringify(myObj),
backendType: 'ems',
config: myfilesUrl + '/config_apex.js',
fullAPI: this.fullAPI,
enableFilePicker: this.enableFilePicker,
enableRedaction: this.enableRedaction,
enableMeasurement: this.enableMeasurement,
enableOptimizedWorkers: true,
loadAsPDF: true,
// l: 'YOUR_LICENSE_KEY',
// To use spreadsheet editor feature, uncomment the below line and comment out loadAsPDF: true
// initialMode: WebViewer.Modes.SPREADSHEET_EDITOR,
}, viewerElement);
viewerElement.addEventListener('ready', () => {
this.iframeWindow = viewerElement.querySelector('iframe').contentWindow;
})
}
handleReceiveMessage(event) {
const me = this;
if (event.isTrusted && typeof event.data === 'object') {
switch (event.data.type) {
case 'SAVE_DOCUMENT':
const cvId = event.data.payload.contentDocumentId;
saveDocument({ json: JSON.stringify(event.data.payload), recordId: this.recordId ? this.recordId : '', cvId: cvId })
.then((response) => {
me.iframeWindow.postMessage({ type: 'DOCUMENT_SAVED', response }, '*')
fireEvent(this.pageRef, 'refreshOnSave', response);
})
.catch(error => {
me.iframeWindow.postMessage({ type: 'DOCUMENT_SAVED', error }, '*')
fireEvent(this.pageRef, 'refreshOnSave', error);
console.error(event.data.payload.contentDocumentId);
console.error(JSON.stringify(error));
this.showNotification('Error', error.body, 'error')
});
break;
default:
break;
}
}
}
downloadDocument() {
this.iframeWindow.postMessage({type: 'DOWNLOAD_DOCUMENT' }, '*')
}
@api
closeDocument() {
this.iframeWindow.postMessage({type: 'CLOSE_DOCUMENT' }, '*')
}
}