From 9d24003517e786c006e5f51e7edd44491f9e0e8f Mon Sep 17 00:00:00 2001 From: zsviczian Date: Fri, 17 Jan 2025 22:39:06 +0000 Subject: [PATCH 1/2] testing --- packages/excalidraw/data/filesystem.ts | 53 +++++++++++++++++++------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/packages/excalidraw/data/filesystem.ts b/packages/excalidraw/data/filesystem.ts index 186d58734..d9880a700 100644 --- a/packages/excalidraw/data/filesystem.ts +++ b/packages/excalidraw/data/filesystem.ts @@ -22,7 +22,6 @@ export const fileOpen = (opts: { const mimeTypes = opts.extensions?.reduce((mimeTypes, type) => { mimeTypes.push(MIME_TYPES[type]); - return mimeTypes; }, [] as string[]); @@ -39,34 +38,60 @@ export const fileOpen = (opts: { mimeTypes, multiple: opts.multiple ?? false, legacySetup: (resolve, reject, input) => { + let isResolved = false; + let checkInterval: number | null = null; + + // Increased delay for iOS to ensure file selection is complete + const CHECK_INTERVAL = 100; // 100ms + const MAX_CHECKS = 50; // 5 seconds total + let checkCount = 0; + const scheduleRejection = debounce(reject, INPUT_CHANGE_INTERVAL_MS); - const focusHandler = () => { - checkForFile(); - document.addEventListener(EVENT.KEYUP, scheduleRejection); - document.addEventListener(EVENT.POINTER_UP, scheduleRejection); - scheduleRejection(); - }; + const checkForFile = () => { - // this hack might not work when expecting multiple files + if (isResolved) return; + if (input.files?.length) { + isResolved = true; const ret = opts.multiple ? [...input.files] : input.files[0]; resolve(ret as RetType); + return true; } + + checkCount++; + if (checkCount >= MAX_CHECKS) { + scheduleRejection(); + return true; + } + return false; }; + + const focusHandler = () => { + // Start checking for files only after focus event + checkInterval = window.setInterval(() => { + if (checkForFile()) { + clearInterval(checkInterval!); + } + }, CHECK_INTERVAL); + + document.addEventListener(EVENT.KEYUP, scheduleRejection); + document.addEventListener(EVENT.POINTER_UP, scheduleRejection); + }; + requestAnimationFrame(() => { window.addEventListener(EVENT.FOCUS, focusHandler); }); - const interval = window.setInterval(() => { - checkForFile(); - }, INPUT_CHANGE_INTERVAL_MS); + return (rejectPromise) => { - clearInterval(interval); + if (checkInterval) { + clearInterval(checkInterval); + } scheduleRejection.cancel(); window.removeEventListener(EVENT.FOCUS, focusHandler); document.removeEventListener(EVENT.KEYUP, scheduleRejection); document.removeEventListener(EVENT.POINTER_UP, scheduleRejection); - if (rejectPromise) { - // so that something is shown in console if we need to debug this + + if (rejectPromise && !isResolved) { console.warn("Opening the file was canceled (legacy-fs)."); rejectPromise(new AbortError()); } From 64e43bf7c771086336815691a5141004a08902bb Mon Sep 17 00:00:00 2001 From: zsviczian Date: Fri, 17 Jan 2025 22:47:50 +0000 Subject: [PATCH 2/2] lint --- packages/excalidraw/data/filesystem.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/excalidraw/data/filesystem.ts b/packages/excalidraw/data/filesystem.ts index d9880a700..965d6c659 100644 --- a/packages/excalidraw/data/filesystem.ts +++ b/packages/excalidraw/data/filesystem.ts @@ -40,24 +40,26 @@ export const fileOpen = (opts: { legacySetup: (resolve, reject, input) => { let isResolved = false; let checkInterval: number | null = null; - + // Increased delay for iOS to ensure file selection is complete const CHECK_INTERVAL = 100; // 100ms const MAX_CHECKS = 50; // 5 seconds total let checkCount = 0; const scheduleRejection = debounce(reject, INPUT_CHANGE_INTERVAL_MS); - + const checkForFile = () => { - if (isResolved) return; - + if (isResolved) { + return; + } + if (input.files?.length) { isResolved = true; const ret = opts.multiple ? [...input.files] : input.files[0]; resolve(ret as RetType); return true; } - + checkCount++; if (checkCount >= MAX_CHECKS) { scheduleRejection(); @@ -73,7 +75,7 @@ export const fileOpen = (opts: { clearInterval(checkInterval!); } }, CHECK_INTERVAL); - + document.addEventListener(EVENT.KEYUP, scheduleRejection); document.addEventListener(EVENT.POINTER_UP, scheduleRejection); }; @@ -90,7 +92,7 @@ export const fileOpen = (opts: { window.removeEventListener(EVENT.FOCUS, focusHandler); document.removeEventListener(EVENT.KEYUP, scheduleRejection); document.removeEventListener(EVENT.POINTER_UP, scheduleRejection); - + if (rejectPromise && !isResolved) { console.warn("Opening the file was canceled (legacy-fs)."); rejectPromise(new AbortError());