Compare commits

...

2 Commits

Author SHA1 Message Date
zsviczian
64e43bf7c7 lint 2025-01-17 22:47:50 +00:00
zsviczian
9d24003517 testing 2025-01-17 22:39:06 +00:00

View File

@ -22,7 +22,6 @@ export const fileOpen = <M extends boolean | undefined = false>(opts: {
const mimeTypes = opts.extensions?.reduce((mimeTypes, type) => { const mimeTypes = opts.extensions?.reduce((mimeTypes, type) => {
mimeTypes.push(MIME_TYPES[type]); mimeTypes.push(MIME_TYPES[type]);
return mimeTypes; return mimeTypes;
}, [] as string[]); }, [] as string[]);
@ -39,34 +38,62 @@ export const fileOpen = <M extends boolean | undefined = false>(opts: {
mimeTypes, mimeTypes,
multiple: opts.multiple ?? false, multiple: opts.multiple ?? false,
legacySetup: (resolve, reject, input) => { 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 scheduleRejection = debounce(reject, INPUT_CHANGE_INTERVAL_MS);
const focusHandler = () => {
checkForFile();
document.addEventListener(EVENT.KEYUP, scheduleRejection);
document.addEventListener(EVENT.POINTER_UP, scheduleRejection);
scheduleRejection();
};
const checkForFile = () => { const checkForFile = () => {
// this hack might not work when expecting multiple files if (isResolved) {
return;
}
if (input.files?.length) { if (input.files?.length) {
isResolved = true;
const ret = opts.multiple ? [...input.files] : input.files[0]; const ret = opts.multiple ? [...input.files] : input.files[0];
resolve(ret as RetType); 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(() => { requestAnimationFrame(() => {
window.addEventListener(EVENT.FOCUS, focusHandler); window.addEventListener(EVENT.FOCUS, focusHandler);
}); });
const interval = window.setInterval(() => {
checkForFile();
}, INPUT_CHANGE_INTERVAL_MS);
return (rejectPromise) => { return (rejectPromise) => {
clearInterval(interval); if (checkInterval) {
clearInterval(checkInterval);
}
scheduleRejection.cancel(); scheduleRejection.cancel();
window.removeEventListener(EVENT.FOCUS, focusHandler); window.removeEventListener(EVENT.FOCUS, focusHandler);
document.removeEventListener(EVENT.KEYUP, scheduleRejection); document.removeEventListener(EVENT.KEYUP, scheduleRejection);
document.removeEventListener(EVENT.POINTER_UP, 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)."); console.warn("Opening the file was canceled (legacy-fs).");
rejectPromise(new AbortError()); rejectPromise(new AbortError());
} }