93 lines
2.6 KiB
JavaScript
93 lines
2.6 KiB
JavaScript
import React, { Component } from 'react'
|
|
import { View, TextInput, TouchableOpacity, Alert } from 'react-native'
|
|
import nodejs from 'nodejs-mobile-react-native'
|
|
import { AppText } from './app-text'
|
|
import { hasEncryptionObservable } from '../local-storage'
|
|
import styles from '../styles'
|
|
import { passwordPrompt, shared } from './labels'
|
|
import { requestHash, deleteDbAndOpenNew, openDb } from '../db'
|
|
|
|
export default class PasswordPrompt extends Component {
|
|
constructor(props) {
|
|
super(props)
|
|
this.state = {
|
|
password: null
|
|
}
|
|
hasEncryptionObservable.once(async hasEncryption => {
|
|
hasEncryption = JSON.parse(hasEncryption)
|
|
if (hasEncryption) {
|
|
this.setState({showPasswordPrompt: true})
|
|
} else {
|
|
await openDb({persistConnection: true})
|
|
console.log(this.props)
|
|
this.props.onCorrectPassword()
|
|
}
|
|
})
|
|
|
|
nodejs.channel.addListener(
|
|
'message',
|
|
this.passHashToDb,
|
|
this
|
|
)
|
|
}
|
|
|
|
passHashToDb = async msg => {
|
|
msg = JSON.parse(msg)
|
|
if (msg.type != 'sha512') return
|
|
try {
|
|
console.log('password prompt opening db')
|
|
await openDb({hash: msg.message, persistConnection: true })
|
|
} catch (err) {
|
|
Alert.alert(
|
|
shared.incorrectPassword,
|
|
shared.incorrectPasswordMessage,
|
|
[{
|
|
text: shared.tryAgain,
|
|
onPress: () => this.setState({password: null})
|
|
}]
|
|
)
|
|
return
|
|
}
|
|
this.setState({ showApp: true })
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
nodejs.channel.removeListener('message', this.passHashToDb)
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<View style={styles.passwordPrompt}>
|
|
{this.state.showPasswordPrompt &&
|
|
<View>
|
|
<TextInput
|
|
onChangeText={val => this.setState({ password: val })}
|
|
style={styles.passwordField}
|
|
/>
|
|
<TouchableOpacity
|
|
style={styles.settingsButton}
|
|
onPress={() => {
|
|
requestHash(this.state.password)
|
|
}}
|
|
>
|
|
<AppText style={styles.settingsButtonText}>
|
|
{passwordPrompt.title}
|
|
</AppText>
|
|
</TouchableOpacity>
|
|
<TouchableOpacity
|
|
style={styles.settingsButton}
|
|
onPress={async () => {
|
|
await deleteDbAndOpenNew()
|
|
this.setState({ showApp: true })
|
|
}}
|
|
>
|
|
<AppText style={styles.settingsButtonText}>
|
|
{'Delete old db and make unencrypted new'}
|
|
</AppText>
|
|
</TouchableOpacity>
|
|
</View>
|
|
}
|
|
</View>
|
|
)
|
|
}
|
|
} |