UNPKG

@infinite-canvas-tutorial/webcomponents

Version:
124 lines 5.02 kB
"use strict"; /** * borrow from https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/data/filesystem.ts#L80 */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.fileSave = exports.fileOpen = exports.debounce = void 0; exports.getDataURL = getDataURL; const ecs_1 = require("@infinite-canvas-tutorial/ecs"); const browser_fs_access_1 = require("browser-fs-access"); const debounce = (fn, timeout) => { let handle = 0; let lastArgs = null; const ret = (...args) => { lastArgs = args; clearTimeout(handle); handle = window.setTimeout(() => { lastArgs = null; fn(...args); }, timeout); }; ret.flush = () => { clearTimeout(handle); if (lastArgs) { const _lastArgs = lastArgs; lastArgs = null; fn(..._lastArgs); } }; ret.cancel = () => { lastArgs = null; clearTimeout(handle); }; return ret; }; exports.debounce = debounce; const INPUT_CHANGE_INTERVAL_MS = 500; const fileOpen = (opts) => { var _a, _b, _c; const mimeTypes = (_a = opts.extensions) === null || _a === void 0 ? void 0 : _a.reduce((mimeTypes, type) => { mimeTypes.push(ecs_1.MIME_TYPES[type]); return mimeTypes; }, []); const extensions = (_b = opts.extensions) === null || _b === void 0 ? void 0 : _b.reduce((acc, ext) => { if (ext === 'jpg') { return acc.concat('.jpg', '.jpeg'); } return acc.concat(`.${ext}`); }, []); return (0, browser_fs_access_1.fileOpen)({ description: opts.description, extensions, mimeTypes, multiple: (_c = opts.multiple) !== null && _c !== void 0 ? _c : false, // @ts-ignore legacySetup: (resolve, reject, input) => { const scheduleRejection = (0, exports.debounce)(reject, INPUT_CHANGE_INTERVAL_MS); const checkForFile = () => { var _a; // this hack might not work when expecting multiple files if ((_a = input.files) === null || _a === void 0 ? void 0 : _a.length) { const ret = opts.multiple ? [...input.files] : input.files[0]; resolve(ret); } }; const focusHandler = () => { checkForFile(); document.addEventListener('keyup', scheduleRejection); document.addEventListener('pointerup', scheduleRejection); scheduleRejection(); }; requestAnimationFrame(() => { window.addEventListener('focus', focusHandler); }); const interval = window.setInterval(() => { checkForFile(); }, INPUT_CHANGE_INTERVAL_MS); return (rejectPromise) => { clearInterval(interval); scheduleRejection.cancel(); window.removeEventListener('focus', focusHandler); document.removeEventListener('keyup', scheduleRejection); document.removeEventListener('pointerup', scheduleRejection); if (rejectPromise) { // so that something is shown in console if we need to debug this console.warn('Opening the file was canceled (legacy-fs).'); rejectPromise(new Error('Opening the file was canceled (legacy-fs).')); } }; }, }); }; exports.fileOpen = fileOpen; const fileSave = (blob, opts) => { return (0, browser_fs_access_1.fileSave)(blob, { fileName: `${opts.name}.${opts.extension}`, description: opts.description, extensions: [`.${opts.extension}`], mimeTypes: opts.mimeTypes, }, opts.fileHandle); }; exports.fileSave = fileSave; function getDataURL(file) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => { const dataURL = reader.result; resolve(dataURL); }; reader.onerror = (error) => reject(error); reader.readAsDataURL(file); }); }); } //# sourceMappingURL=filesystem.js.map