/** * @module modules/uploader */ import type { IDictionary, IJodit, IUploader, IUploaderAnswer } from 'jodit/types'; import { Ajax } from 'jodit/core/request'; import { isFunction, isPromise } from 'jodit/core/helpers'; import { buildData } from 'jodit/modules/uploader/helpers/build-data'; export const ajaxInstances: WeakMap> = new WeakMap(); export async function send( uploader: IUploader, data: FormData | IDictionary ): Promise { // console.log('send()'); const requestData = buildData(uploader, data); // console.log('requestData: ', requestData); const sendData = async ( request: FormData | IDictionary | string ): Promise => { // console.log('sendData() :: start ::'); // console.log('request', request); // (request as FormData).forEach((value, key) => { // console.log({ value, key }); // }); const ajax = new Ajax(uploader.j, { xhr: (): XMLHttpRequest => { const xhr = new XMLHttpRequest(); // console.log('ajax xhr'); // console.log( // '(uploader.j.ow as any).FormData', // (uploader.j.ow as any).FormData // ); if ( (uploader.j.ow as any).FormData !== undefined && xhr.upload ) { uploader.j.progressbar.show().progress(10); // console.log(uploader.j.progressbar.show().progress(10)); xhr.upload.addEventListener( 'progress', evt => { if (evt.lengthComputable) { // console.log( // 'evt.lengthComputable', // evt.lengthComputable // ); let percentComplete = evt.loaded / evt.total; percentComplete *= 100; // console.log('progress', percentComplete); uploader.j.progressbar .show() .progress(percentComplete); if (percentComplete >= 100) { uploader.j.progressbar.hide(); } } }, false ); } else { uploader.j.progressbar.hide(); } return xhr; }, method: uploader.o.method || 'POST', data: request, url: uploader.o.url(uploader.j, request), headers: isFunction(uploader.o.headers) ? uploader.o.headers(uploader.o.authToken) : uploader.o.headers, queryBuild: uploader.o.queryBuild, contentType: uploader.o.contentType.call(uploader, request), dataType: uploader.o.format || 'json', withCredentials: uploader.o.withCredentials || false }); let instances = ajaxInstances.get(uploader); // console.log('instances: ', instances); if (!instances) { // console.log('if !instances'); instances = new Set(); ajaxInstances.set(uploader, instances); } // console.log('instances: ', instances); instances.add(ajax); return ( ajax .send() .then(resp => resp.json()) // .catch(error => uploader.o.error.call(uploader, error)) .finally(() => instances?.delete(ajax)) ); }; if (isPromise(requestData)) { return requestData.then(sendData).catch(error => { uploader.o.error.call(uploader, error); }); } return sendData(requestData); }