Skip to content
Snippets Groups Projects
settings.js 2.31 KiB
Newer Older
import React, { Component } from 'react'
import {
  View,
  Button,
  ScrollView,
  Alert
} from 'react-native'
import Share from 'react-native-share'
import { DocumentPicker, DocumentPickerUtil } from 'react-native-document-picker'
import rnfs from 'react-native-fs'
import styles from '../styles/index'
Julia Friesel's avatar
Julia Friesel committed
import { settings as labels } from './labels'
Julia Friesel's avatar
Julia Friesel committed
import getDataAsCsvDataUri from '../lib/import-export/export-to-csv'
import importCsv from '../lib/import-export/import-from-csv'

export default class Settings extends Component {
  render() {
    return (
      <ScrollView>
        <View style={styles.homeButtons}>
          <View style={styles.homeButton}>
            <Button
Julia Friesel's avatar
Julia Friesel committed
              onPress={ openShareDialogAndExport }
              title={labels.exportLabel}>
          <View style={styles.homeButton}>
            <Button
              onPress={ getFileContentAndImport }
Julia Friesel's avatar
Julia Friesel committed
              title={labels.importLabel}>
            </Button>
          </View>
Julia Friesel's avatar
Julia Friesel committed
async function openShareDialogAndExport() {
  let data
  try {
    data = getDataAsCsvDataUri()
    if (!data) {
      return alertError(labels.errors.noData)
Julia Friesel's avatar
Julia Friesel committed
    }
  } catch (err) {
    console.error(err)
    return alertError(labels.errors.couldNotConvert)
Julia Friesel's avatar
Julia Friesel committed
  }

  try {
    await Share.open({
      title: labels.exportTitle,
      url: data,
      subject: labels.exportSubject,
      type: 'text/csv',
      showAppsToView: true
    })
  } catch (err) {
    console.error(err)
    return alertError(labels.errors.problemSharing)
async function getFileContentAndImport() {
  let fileInfo
  try {
    fileInfo = await new Promise((resolve, reject) => {
      DocumentPicker.show({
        filetype: [DocumentPickerUtil.allFiles()],
      }, (err, res) => {
        if (err) return reject(err)
        resolve(res)
      })
    })
  } catch (err) {
    // because cancelling also triggers an error, we do nothing here
    return
  }

  let fileContent
  try {
    fileContent = await rnfs.readFile(fileInfo.uri, 'utf8')
  } catch (err) {
    return alertError('Could not open file')
    await importCsv(fileContent, false)
    Alert.alert('Success', 'Data successfully imported')
  } catch(err) {
    alertError(err.message)

function alertError(msg) {
  Alert.alert('Error', msg)
}