diff --git a/components/settings/data-management/DataManagement.js b/components/settings/data-management/DataManagement.js index 1e4d2a3..587149b 100644 --- a/components/settings/data-management/DataManagement.js +++ b/components/settings/data-management/DataManagement.js @@ -3,34 +3,26 @@ import React, { useState } from 'react' import AppLoadingView from '../../common/app-loading' import AppPage from '../../common/app-page' import AppText from '../../common/app-text' -import Button from '../../common/button' import Segment from '../../common/segment' -import openShareDialogAndExport from './export-dialog' import DeleteData from './delete-data' import labels from '../../../i18n/en/settings' import ImportData from './ImportData' +import ExportData from './ExportData' const DataManagement = () => { const [isLoading, setIsLoading] = useState(false) const [isDeletingData, setIsDeletingData] = useState(false) - const startExport = () => { - setIsDeletingData(false) - openShareDialogAndExport() - } - if (isLoading) return return ( - - {labels.export.segmentExplainer} - - + setIsDeletingData(false)} + setIsLoading={setIsLoading} + /> setIsDeletingData(false)} setIsLoading={setIsLoading} diff --git a/components/settings/data-management/ExportData.js b/components/settings/data-management/ExportData.js new file mode 100644 index 0000000..f3eda73 --- /dev/null +++ b/components/settings/data-management/ExportData.js @@ -0,0 +1,77 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { getCycleDaysSortedByDate, mapRealmObjToJsObj } from '../../../db' +import getDataAsCsvDataUri from '../../../lib/import-export/export-to-csv' +import alertError from '../common/alert-error' +import { EXPORT_FILE_NAME } from './constants' +import RNFS from 'react-native-fs' +import { useTranslation } from 'react-i18next' + +import AppText from '../../common/app-text' +import Button from '../../common/button' +import Segment from '../../common/segment' +import Share from 'react-native-share' + +export default function ExportData({ setIsLoading, resetIsDeletingData }) { + const { t } = useTranslation(null, { + keyPrefix: 'hamburgerMenu.settings.data.export', + }) + + async function startExport() { + resetIsDeletingData() + setIsLoading(true) + await exportData() + setIsLoading(false) + } + + async function getData() { + const cycleDaysByDate = mapRealmObjToJsObj(getCycleDaysSortedByDate()) + + try { + return cycleDaysByDate.length + ? getDataAsCsvDataUri(cycleDaysByDate) + : null + } catch (err) { + alertError(t('error.convert')) + return null + } + } + + async function exportData() { + const data = await getData() + if (!data) { + alertError(t('error.data')) + return + } + + try { + const path = `${RNFS.DocumentDirectoryPath}/${EXPORT_FILE_NAME}` + await RNFS.writeFile(path, data) + + await Share.open({ + title: t('title'), + url: `file://${path}`, + subject: t('title'), + type: 'text/csv', + showAppsToView: true, + failOnCancel: false, + }) + } catch (err) { + return alertError(t('error.share')) + } + } + + return ( + + {t('text')} + + + ) +} + +ExportData.propTypes = { + resetIsDeletingData: PropTypes.func.isRequired, + setIsLoading: PropTypes.func.isRequired, +} diff --git a/components/settings/data-management/export-dialog.js b/components/settings/data-management/export-dialog.js deleted file mode 100644 index 9d428b9..0000000 --- a/components/settings/data-management/export-dialog.js +++ /dev/null @@ -1,43 +0,0 @@ -import Share from 'react-native-share' - -import { getCycleDaysSortedByDate, mapRealmObjToJsObj } from '../../../db' -import getDataAsCsvDataUri from '../../../lib/import-export/export-to-csv' -import alertError from '../common/alert-error' -import settings from '../../../i18n/en/settings' -import { EXPORT_FILE_NAME } from './constants' -import RNFS from 'react-native-fs' - -export default async function exportData() { - let data - const labels = settings.export - const cycleDaysByDate = mapRealmObjToJsObj(getCycleDaysSortedByDate()) - - if (!cycleDaysByDate.length) return alertError(labels.errors.noData) - - try { - data = getDataAsCsvDataUri(cycleDaysByDate) - if (!data) { - return alertError(labels.errors.noData) - } - } catch (err) { - console.error(err) - return alertError(labels.errors.couldNotConvert) - } - - try { - const path = `${RNFS.DocumentDirectoryPath}/${EXPORT_FILE_NAME}` - await RNFS.writeFile(path, data) - - await Share.open({ - title: labels.title, - url: `file://${path}`, - subject: labels.subject, - type: 'text/csv', - showAppsToView: true, - failOnCancel: false, - }) - } catch (err) { - console.error(err) - return alertError(labels.errors.problemSharing) - } -} diff --git a/i18n/en.json b/i18n/en.json index 39a1123..1e8db38 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -81,6 +81,16 @@ }, "settings": { "data": { + "export": { + "button": "Export data", + "error": { + "convert": "Could not convert data to CSV", + "data": "There is no data to export", + "share": "There was a problem sharing the data export file" + }, + "text": "Export data in CSV format for backup or so you can use it elsewhere", + "title": "My drip. data export" + }, "import": { "button": "Import data", "dialog": { diff --git a/i18n/en/settings.js b/i18n/en/settings.js index 4cdffcd..c1d82e5 100644 --- a/i18n/en/settings.js +++ b/i18n/en/settings.js @@ -19,18 +19,6 @@ export default { text: '', }, }, - export: { - errors: { - noData: 'There is no data to export', - couldNotConvert: 'Could not convert data to CSV', - problemSharing: 'There was a problem sharing the data export file', - }, - title: 'My drip. data export', - subject: 'My drip. data export', - button: 'Export data', - segmentExplainer: - 'Export data in CSV format for backup or so you can use it elsewhere', - }, deleteSegment: { title: 'Delete app data', explainer: 'Delete app data from this phone',