Compare commits
2 Commits
master
...
zsviczian-
Author | SHA1 | Date | |
---|---|---|---|
![]() |
64e43bf7c7 | ||
![]() |
9d24003517 |
@ -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());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user