Source: tools/services/sd-card.js

/**
 * 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,
}