let input: HTMLInputElement
let lastPromiseResolve: (files: File[]) => void
const defaultConfig = {
accept: '*',
multiple: false,
}
/** 打开文件选择 */
export const pickFile = async (config: Partial = defaultConfig) => {
const { accept, multiple } = { ...defaultConfig, ...config }
if (!input) {
input = document.createElement('input')
input.type = 'file'
input.style.display = 'none'
document.body.appendChild(input)
input.addEventListener('change', () => {
lastPromiseResolve?.([...input.files])
lastPromiseResolve = null
})
}
input.accept = accept
input.multiple = multiple
input.value = ''
// 如果前面还有个 Promise 在等, 就直接取消
if (lastPromiseResolve) {
lastPromiseResolve([])
}
const files = await new Promise(resolve => {
lastPromiseResolve = resolve
input.click()
})
return files
}