From e4209e28b7bda936e23e246b96558fa69ba93599 Mon Sep 17 00:00:00 2001
From: Sofiya Tepikin <sofiya.tepikin@gmail.com>
Date: Tue, 18 Jun 2019 00:10:54 +0200
Subject: [PATCH] Refactors App wrapper component

---
 components/app-wrapper.js     | 86 ++++++++++++++++++++++++++---------
 components/password-prompt.js | 72 ++++++++++++-----------------
 2 files changed, 92 insertions(+), 66 deletions(-)

diff --git a/components/app-wrapper.js b/components/app-wrapper.js
index 4e8665b6..31419b9e 100644
--- a/components/app-wrapper.js
+++ b/components/app-wrapper.js
@@ -1,44 +1,86 @@
 import React, { Component } from 'react'
-import { View } from 'react-native'
 import nodejs from 'nodejs-mobile-react-native'
+
+import { getLicenseFlag, saveEncryptionFlag } from '../local-storage'
+import { openDb } from '../db'
+
 import App from './app'
 import PasswordPrompt from './password-prompt'
 import License from './license'
-import { getLicenseFlag } from '../local-storage'
+import AppLoadingView from './app-loading'
 
 export default class AppWrapper extends Component {
   constructor() {
     super()
     this.state = {
-      retrievingLicenseSetting: true
+      isCheckingLicenseAgreement: true,
+      shouldShowLicenseAgreement: false,
+      shouldShowPasswordPrompt: false,
+      shouldShowApp: false,
     }
     nodejs.start('main.js')
     this.checkLicenseAgreement()
+    this.checkDbPasswordSet()
   }
 
   async checkLicenseAgreement() {
-    const agreed = await getLicenseFlag()
-    this.setState({retrievingLicenseSetting: false})
-    if (!agreed) this.setState({showLicense: true})
+    const isLicenseFlagSet = await getLicenseFlag()
+    if (!isLicenseFlagSet) {
+      this.enableShowLicenseAgreement()
+    } else {
+      this.setState({ isCheckingLicenseAgreement: false })
+    }
+  }
+
+  async checkDbPasswordSet() {
+    const canConnectToDb = await openDb()
+    if (canConnectToDb) {
+      this.enableShowApp()
+      await saveEncryptionFlag(false)
+      return false
+    }
+    this.setState({ shouldShowPasswordPrompt: true })
+    await saveEncryptionFlag(true)
+  }
+
+  enableShowLicenseAgreement = () => {
+    this.setState({
+      shouldShowLicenseAgreement: true,
+      isCheckingLicenseAgreement: false
+    })
+  }
+
+  disableShowLicenseAgreement = () => {
+    this.setState({ shouldShowLicenseAgreement: false })
+  }
+
+  enableShowApp = () => {
+    this.setState({
+      shouldShowApp: true,
+      shouldShowPasswordPrompt: false
+    })
   }
 
   render() {
-    const whiteScreen = <View style={{ flex: 1 }}></View>
-    const licenseScreen = <License setLicense={() => {
-      this.setState({showLicense: false})
-    }}/>
-    const passwordPrompt = <PasswordPrompt showApp={() => {
-      this.setState({showApp: true})
-    }}/>
-
-    if (this.state.retrievingLicenseSetting) {
-      return whiteScreen
-    } else if (this.state.showLicense) {
-      return licenseScreen
-    } else if (!this.state.showApp) {
-      return passwordPrompt
-    } else {
-      return <App/>
+    const {
+      isCheckingLicenseAgreement,
+      shouldShowLicenseAgreement,
+      shouldShowPasswordPrompt,
+      shouldShowApp,
+    } = this.state
+
+    if (isCheckingLicenseAgreement) {
+      return <AppLoadingView />
     }
+
+    if (shouldShowLicenseAgreement) {
+      return <License setLicense={this.disableShowLicenseAgreement}/>
+    }
+
+    if (shouldShowPasswordPrompt) {
+      return <PasswordPrompt enableShowApp={this.enableShowApp} />
+    }
+
+    return shouldShowApp && <App />
   }
 }
\ No newline at end of file
diff --git a/components/password-prompt.js b/components/password-prompt.js
index 908bc684..356a699a 100644
--- a/components/password-prompt.js
+++ b/components/password-prompt.js
@@ -20,19 +20,6 @@ export default class PasswordPrompt extends Component {
       this.passHashToDb,
       this
     )
-
-    this.tryToOpenDb()
-  }
-
-  async tryToOpenDb() {
-    const connected = await openDb()
-    if (!connected) {
-      this.setState({ showPasswordPrompt: true })
-      await saveEncryptionFlag(true)
-      return
-    }
-    await saveEncryptionFlag(false)
-    this.props.showApp()
   }
 
   passHashToDb = async hash => {
@@ -48,7 +35,7 @@ export default class PasswordPrompt extends Component {
       )
       return
     }
-    this.props.showApp()
+    this.props.enableShowApp()
   }
 
   confirmDeletion = async () => {
@@ -72,7 +59,7 @@ export default class PasswordPrompt extends Component {
               onPress: async () => {
                 await deleteDbAndOpenNew()
                 await saveEncryptionFlag(false)
-                this.props.showApp()
+                this.props.enableShowApp()
               }
             }]
           )
@@ -89,35 +76,32 @@ export default class PasswordPrompt extends Component {
     return (
       <View flex={1}>
         <Header title={menuTitles.PasswordPrompt.toLowerCase()} />
-        {this.state.showPasswordPrompt &&
-          <View style={styles.passwordPromptPage}>
-
-            <TextInput
-              onChangeText={val => this.setState({ password: val })}
-              style={styles.passwordPromptField}
-              secureTextEntry={true}
-              placeholder={labels.enterPassword}
-            />
-            <TouchableOpacity
-              style={styles.passwordPromptButton}
-              onPress={() => {
-                requestHash('check-pw', this.state.password)
-              }}
-              disabled={!this.state.password}
-            >
-              <AppText style={styles.passwordPromptButtonText}>
-                {labels.title}
-              </AppText>
-            </TouchableOpacity>
-            <TouchableOpacity
-              onPress={this.confirmDeletion}
-            >
-              <AppText style={styles.passwordPromptForgotPasswordText}>
-                {labels.forgotPassword}
-              </AppText>
-            </TouchableOpacity>
-          </View>
-        }
+        <View style={styles.passwordPromptPage}>
+          <TextInput
+            onChangeText={val => this.setState({ password: val })}
+            style={styles.passwordPromptField}
+            secureTextEntry={true}
+            placeholder={labels.enterPassword}
+          />
+          <TouchableOpacity
+            style={styles.passwordPromptButton}
+            onPress={() => {
+              requestHash('check-pw', this.state.password)
+            }}
+            disabled={!this.state.password}
+          >
+            <AppText style={styles.passwordPromptButtonText}>
+              {labels.title}
+            </AppText>
+          </TouchableOpacity>
+          <TouchableOpacity
+            onPress={this.confirmDeletion}
+          >
+            <AppText style={styles.passwordPromptForgotPasswordText}>
+              {labels.forgotPassword}
+            </AppText>
+          </TouchableOpacity>
+        </View>
       </View>
     )
   }
-- 
GitLab