diff --git a/components/app-loading.js b/components/app-loading.js
new file mode 100644
index 0000000..c99cd51
--- /dev/null
+++ b/components/app-loading.js
@@ -0,0 +1,18 @@
+import React from 'react'
+
+import { View } from 'react-native'
+
+import AppText from './app-text'
+import { shared } from '../i18n/en/labels'
+
+const AppLoadingView = () => {
+ return (
+
+
+ {shared.loading}
+
+
+ )
+}
+
+export default AppLoadingView
\ No newline at end of file
diff --git a/components/chart/chart.js b/components/chart/chart.js
index 586ed41..4106938 100644
--- a/components/chart/chart.js
+++ b/components/chart/chart.js
@@ -10,6 +10,7 @@ import { cycleDayColor } from '../../styles'
import { scaleObservable } from '../../local-storage'
import config from '../../config'
import AppText from '../app-text'
+import AppLoadingView from '../app-loading'
import { shared as labels } from '../../i18n/en/labels'
import DripIcon from '../../assets/drip-icons'
import DripHomeIcon from '../../assets/drip-home-icons'
@@ -133,11 +134,7 @@ export default class CycleChart extends Component {
onLayout={this.onLayout}
style={{ flexDirection: 'row', flex: 1 }}
>
- {!this.state.chartLoaded &&
-
- {labels.loading}
-
- }
+ {!this.state.chartLoaded && }
{this.state.chartHeight && this.state.chartLoaded &&
diff --git a/components/settings/data-management/import-dialog.js b/components/settings/data-management/import-dialog.js
index 5971c4b..9995d31 100644
--- a/components/settings/data-management/import-dialog.js
+++ b/components/settings/data-management/import-dialog.js
@@ -6,23 +6,23 @@ import { shared as sharedLabels } from '../../../i18n/en/labels'
import labels from '../../../i18n/en/settings'
import alertError from '../shared/alert-error'
-export default function openImportDialogAndImport() {
+export function openImportDialog(onImportData) {
Alert.alert(
labels.import.title,
labels.import.message,
[{
text: labels.import.replaceOption,
- onPress: () => getFileContentAndImport({ deleteExisting: false })
+ onPress: () => onImportData(false)
}, {
text: labels.import.deleteOption,
- onPress: () => getFileContentAndImport({ deleteExisting: true })
+ onPress: () => onImportData(true)
}, {
text: sharedLabels.cancel, style: 'cancel', onPress: () => { }
}]
)
}
-async function getFileContentAndImport({ deleteExisting }) {
+export async function getFileContent() {
let fileInfo
try {
fileInfo = await new Promise((resolve, reject) => {
@@ -45,8 +45,13 @@ async function getFileContentAndImport({ deleteExisting }) {
return importError(labels.import.errors.couldNotOpenFile)
}
+ return fileContent
+}
+
+export async function importData(shouldDeleteExistingData, fileContent) {
+
try {
- await importCsv(fileContent, deleteExisting)
+ await importCsv(fileContent, shouldDeleteExistingData)
Alert.alert(sharedLabels.successTitle, labels.import.success.message)
} catch(err) {
importError(err.message)
diff --git a/components/settings/data-management/index.js b/components/settings/data-management/index.js
index bbcf9df..27818f8 100644
--- a/components/settings/data-management/index.js
+++ b/components/settings/data-management/index.js
@@ -1,37 +1,76 @@
-import React from 'react'
-import { ScrollView } from 'react-native'
+import React, { Component } from 'react'
+import { ScrollView, View } from 'react-native'
import AppText from '../../app-text'
import FramedSegment from '../../framed-segment'
+import AppLoadingView from '../../app-loading'
import SettingsButton from '../shared/settings-button'
-import openImportDialogAndImport from './import-dialog'
+import { openImportDialog, getFileContent, importData } from './import-dialog'
import openShareDialogAndExport from './export-dialog'
import DeleteData from './delete-data'
import labels from '../../../i18n/en/settings'
-const DataManagement = () => {
- return (
-
-
- {labels.export.segmentExplainer}
-
- {labels.export.button}
-
-
-
- {labels.import.segmentExplainer}
-
- {labels.import.button}
-
-
-
- {labels.deleteSegment.explainer}
-
-
-
- )
-}
+export default class DataManagement extends Component {
-export default DataManagement
+ constructor(props) {
+ super(props)
+ this.state = { isLoading: false }
+ }
+
+ onStartLoading = () => {
+ this.setState({ isLoading: true })
+ }
+
+ onEndLoading = () => {
+ this.setState({ isLoading: false })
+ }
+
+ onImportData = async (shouldDeleteExistingData) => {
+
+ try {
+ this.onStartLoading()
+ const fileContent = await getFileContent()
+ if (fileContent) {
+ await importData(shouldDeleteExistingData, fileContent)
+ }
+ } catch(err) {
+ return
+ } finally {
+ this.onEndLoading()
+ }
+ }
+
+ render() {
+ return (
+
+ {this.state.isLoading && }
+ {!this.state.isLoading &&
+
+
+
+ {labels.export.segmentExplainer}
+
+ {labels.export.button}
+
+
+
+ {labels.import.segmentExplainer}
+ openImportDialog(this.onImportData)}
+ >
+ {labels.import.button}
+
+
+
+ {labels.deleteSegment.explainer}
+
+
+
+
+ }
+
+ )
+ }
+}