/**
* Outil pour vérifier qu'un dossier de sd card est bien monté
*/
function getExternalStorageAuthorizationStatus () {
return new Promise((resolve, reject) => {
window.cordova.plugins.diagnostic.getExternalStorageAuthorizationStatus((status) => {
const isGranted = status === window.cordova.plugins.diagnostic.permissionStatus.GRANTED
resolve(isGranted)
}, (error) => {
reject(new Error(error))
})
})
}
function requestExternalStorageAuthorization () {
return new Promise((resolve, reject) => {
window.cordova.plugins.diagnostic.requestExternalStorageAuthorization((status) => {
console.info(`[SDCARD] Authorization request for external storage use was ${status === window.cordova.plugins.diagnostic.permissionStatus.GRANTED ? 'granted' : 'denied'}`)
resolve()
}, (error) => {
reject(new Error(error))
})
})
}
function getExternalSdLocation () {
return new Promise((resolve, reject) => {
window.cordova.plugins.diagnostic.getExternalSdCardDetails(details => {
details.forEach(detail => {
if (detail.type === 'application') {
window.cordova.file.externalSdCardApplicationDirectory = detail.filePath
} else if (detail.type === 'root') {
window.cordova.file.externalSdCardRootDirectory = detail.filePath
}
})
console.info(`[SDCARD] detected root:${window.cordova.file.externalSdCardRootDirectory}`)
resolve()
}, error => {
reject(new Error(error))
})
})
}
function getExternalSd () {
return Promise.resolve()
.then(getExternalStorageAuthorizationStatus)
.then((isGranted) => {
return isGranted ? Promise.resolve() : requestExternalStorageAuthorization()
})
.then(getExternalSdLocation)
}
function browseSdcard () {
if (!window.cordova.file || !window.cordova.file.externalSdCardRootDirectory) {
return Promise.resolve([])
}
return new Promise((resolve, reject) => {
window.resolveLocalFileSystemURL(window.cordova.file.externalSdCardRootDirectory, (fileSystem) => {
const reader = fileSystem.createReader()
reader.readEntries(entries => {
const paths = entries
.filter(entry => entry.isDirectory)
.reduce((acc, entry) => ({
...acc,
[entry.name]: entry.nativeURL,
}), {})
console.info(`[SDCARD] entries: ${JSON.stringify(paths)}`)
resolve(paths)
}, err => {
reject(new Error(err))
})
}, err => {
reject(new Error(err))
})
})
}
/**
* Vérifie que le dossier est bien monté dans une sd-car via cordova
* @param {string} path
* @returns {boolean}
*/
async function pathExist (path) {
if (window.cordova) {
try {
await getExternalSd()
const paths = await browseSdcard()
return Object.keys(paths).includes(path)
} catch (e) {
console.error('[SDCARD]: erreur lors de la lecture', e)
}
}
return false
}
export const SdCard = {
pathExist,
}