Skip to content

Commit

Permalink
Release 1.0.1
Browse files Browse the repository at this point in the history
  • Loading branch information
olexh committed Nov 8, 2018
1 parent 23ab067 commit 24765dd
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 90 deletions.
2 changes: 1 addition & 1 deletion App.js
Expand Up @@ -59,7 +59,7 @@ export default class App extends React.Component {
global.port = 7403;
global.ip = "13.57.248.201";
global.ecl = new ElectrumCli(global.port, global.ip, 'tcp');
global.version = "1.0";
global.version = "1.0.1";

global.ecl.connect().then(() => this.ping)
}
Expand Down
4 changes: 2 additions & 2 deletions android/app/build.gradle
Expand Up @@ -101,8 +101,8 @@ android {
applicationId "com.microbitcoin"
minSdkVersion 16
targetSdkVersion 27
versionCode 6
versionName "1.0"
versionCode 7
versionName "1.0.1"
ndk {
abiFilters "armeabi-v7a", "x86"
}
Expand Down
17 changes: 10 additions & 7 deletions src/components/ImportKeyScreen.js
Expand Up @@ -18,9 +18,9 @@ export default class openPasswordWalletScreen extends React.Component {
constructor(props) {

super(props);
this.walletUtils = this.props.navigation.getParam('walletUtils', null);
this.state = {
key: ""
key: "",
walletUtils: this.props.navigation.getParam('walletUtils', null)
}

}
Expand All @@ -30,17 +30,20 @@ export default class openPasswordWalletScreen extends React.Component {
}

import = () => {
this.setState({key: this.state.key.trim()});

if(this.state.key != "" && this.state.key != null) {
let address = coinjs.wif2address(this.state.key).address;
if(this.walletUtils.wallet.addresses.external[address] == undefined) {

if(this.state.walletUtils.wallet.addresses.external[address] == undefined) {
Alert.alert("Import WIF key", `Is this your address?\n\n${address}`,
[
{text: 'No', onPress: () => false},
{text: 'Yes', onPress: () => {
this.walletUtils.wallet.addresses.external[address] = {"used": false, "privateKey": encryptData(this.state.key, this.walletUtils.password)};
this.walletUtils.updateBalance();
this.walletUtils.subscribeToAddresses();
saveWallet(this.walletUtils.wallet);
this.state.walletUtils.wallet.addresses.external[address] = {"used": false, "privateKey": encryptData(this.state.key, this.state.walletUtils.password)};
this.state.walletUtils.updateBalance();
this.state.walletUtils.subscribeToAddresses();
saveWallet(this.state.walletUtils.wallet);
this.props.navigation.goBack();
}},
],
Expand Down
57 changes: 32 additions & 25 deletions src/components/MyWalletDetailsScreen.js
Expand Up @@ -24,19 +24,19 @@ export default class MyWalletDetailsScreen extends React.Component {

constructor(props) {
super(props)
this.walletUtils = new WalletUtils(this.props.navigation.getParam('wallet', null), this.props.navigation.getParam('password', null), global.ecl);
this.walletUtils.subscribeToAddresses();
this.walletUtils.checkHistory();
this.isCancelled = false;
this.state = {

updatingBalance: false,
loading: false,
isConnected: false,
wallet: this.props.navigation.getParam('wallet', null),
password: this.props.navigation.getParam('password', null),
walletUtils: new WalletUtils(this.props.navigation.getParam('wallet', null), this.props.navigation.getParam('password', null), global.ecl),
appState: AppState.currentState

}

this.state.walletUtils.subscribeToAddresses();
this.state.walletUtils.checkHistory();
this.state.isCancelled = false;

const willFocusSubscription = this.props.navigation.addListener(
'willFocus',
Expand Down Expand Up @@ -83,7 +83,14 @@ export default class MyWalletDetailsScreen extends React.Component {
}

updateWallet() {
if(!this.isCancelled) this.setState({wallet: this.walletUtils.wallet});
if(!this.isCancelled) this.setState({walletUtils: this.state.walletUtils});
}

async updateBalance() {
if(!this.isCancelled) this.setState({updatingBalance: true});
await this.state.walletUtils.updateBalance();
if(!this.isCancelled) this.setState({walletUtils: this.state.walletUtils});
if(!this.isCancelled) this.setState({updatingBalance: false});
}

static navigationOptions = ({ navigation }) => {
Expand All @@ -98,7 +105,7 @@ export default class MyWalletDetailsScreen extends React.Component {
}

navigateToSettings = () => {
this.props.navigation.navigate("WalletSettings", {wallet: this.state.wallet, password: this.state.password})
this.props.navigation.navigate("WalletSettings", {walletUtils: this.state.walletUtils})
}


Expand All @@ -117,9 +124,9 @@ export default class MyWalletDetailsScreen extends React.Component {

handleAppStateChange = (nextAppState) => {
if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
this.walletUtils = new WalletUtils(this.state.wallet, this.props.navigation.getParam('password', null), global.ecl);
this.walletUtils.subscribeToAddresses();
this.walletUtils.checkHistory();
this.setState({walletUtils: new WalletUtils(this.state.walletUtils.wallet, this.state.walletUtils.password, global.ecl)});
this.state.walletUtils.subscribeToAddresses();
this.state.walletUtils.checkHistory();
}
if (!this.isCancelled) this.setState({appState: nextAppState});
}
Expand All @@ -134,26 +141,26 @@ export default class MyWalletDetailsScreen extends React.Component {

render() {

const { wallet, password, isConnected, loading, updatingBalance } = this.state
const { walletUtils, isConnected, loading, updatingBalance } = this.state

return(
<View style={styles.container}>
{loading &&
<Loader loading={true} />
}
<View style={styles.balanceContainer}>
<Text style={styles.balanceText}>{`${wallet.balance/10000} MBC`}</Text>
{updatingBalance ? <ActivityIndicator size="small" color="#fff" style={styles.balanceLoading} /> : <TouchableOpacity onPress={() => this.updateBalance()}><Text style={styles.balanceText}>{`${walletUtils.wallet.balance/10000} MBC`}</Text></TouchableOpacity>}
<Text>
<Icon name="controller-record" size={14} color={isConnected ? '#00d47d' : '#ff4133'} />
<Text style={styles.balanceSubText}> {wallet.title}</Text>
<Text style={styles.balanceSubText}> {walletUtils.wallet.title}</Text>
</Text>
</View>
<ScrollView>
{wallet.transactions == null ? <View style={styles.noHistoryContainer}><ActivityIndicator size="large" color="#000672" /></View> : null}
{wallet.transactions != null && Object.keys(wallet.transactions).length == 0 && wallet.mempool.length == 0 ? <View style={styles.noHistoryContainer}><Text style={styles.labelText}>Wallet history is empty</Text></View> : null}
{wallet.mempool.length > 0 ? <Text style={styles.addressHeader}>Unconfirmed transactions</Text> : null}
{walletUtils.wallet.transactions == null ? <View style={styles.noHistoryContainer}><ActivityIndicator size="large" color="#000672" /></View> : null}
{walletUtils.wallet.transactions != null && Object.keys(walletUtils.wallet.transactions).length == 0 && walletUtils.wallet.mempool.length == 0 ? <View style={styles.noHistoryContainer}><Text style={styles.labelText}>Wallet history is empty</Text></View> : null}
{walletUtils.wallet.mempool.length > 0 ? <Text style={styles.addressHeader}>Unconfirmed transactions</Text> : null}
{
wallet.mempool.map((tx) => (
walletUtils.wallet.mempool.map((tx) => (
<TouchableOpacity
key={tx['hash']}
onPress={() => this.openLink(tx['hash'])}>
Expand All @@ -162,20 +169,20 @@ export default class MyWalletDetailsScreen extends React.Component {
))
}

{Object.keys(wallet.transactions).length > 0 ? <Text style={styles.addressHeader}>Confirmed transactions</Text> : null}
{Object.keys(walletUtils.wallet.transactions).length > 0 ? <Text style={styles.addressHeader}>Confirmed transactions</Text> : null}
{
wallet.transactions != null ? Object.keys(wallet.transactions).reverse().slice(0, wallet.settings.historyCount).map((tx) => (
walletUtils.wallet.transactions != null ? Object.keys(walletUtils.wallet.transactions).reverse().slice(0, walletUtils.wallet.settings.historyCount).map((tx) => (
<TouchableOpacity
key={wallet.transactions[tx]['hash']}
onPress={() => this.openLink(wallet.transactions[tx]['hash'])}>
<MyWalletTransaction tx={wallet.transactions[tx]} />
key={walletUtils.wallet.transactions[tx]['hash']}
onPress={() => this.openLink(walletUtils.wallet.transactions[tx]['hash'])}>
<MyWalletTransaction tx={walletUtils.wallet.transactions[tx]} />
</TouchableOpacity>
)) : null
}
</ScrollView>
<View style={styles.navbar}>
<TouchableOpacity
onPress={() => this.props.navigation.navigate('WalletReceive', {'wallet': wallet, 'password': password, 'walletUtils': this.walletUtils})}
onPress={() => this.props.navigation.navigate('WalletReceive', {'walletUtils': walletUtils})}
style={styles.navbarIconButton}>
<NavbarButton label='Receive' icon='login' />
</TouchableOpacity>
Expand All @@ -184,7 +191,7 @@ export default class MyWalletDetailsScreen extends React.Component {
<NavbarButton label='Wallets' icon='wallet' />
</TouchableOpacity>
<TouchableOpacity
onPress={() => this.props.navigation.navigate('WalletSend', {'wallet': wallet, 'password': password, 'walletUtils': this.walletUtils})}
onPress={() => this.props.navigation.navigate('WalletSend', {'walletUtils': walletUtils})}
style={styles.navbarIconButton}>
<NavbarButton label='Send' icon='log-out' />
</TouchableOpacity>
Expand Down
4 changes: 2 additions & 2 deletions src/components/RestoreWalletScreen.js
Expand Up @@ -60,12 +60,12 @@ export default class RestoreWalletScreen extends React.Component {
<View style={styles.btnContainer}>
<TouchableOpacity
style={styles.btnCreate}
onPress={() => this.props.navigation.navigate('CreateWallet')}>
onPress={() => this.props.navigation.push('CreateWallet')}>
<Text style={styles.btnTextCreate}>CREATE WALLET</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.btnImport}
onPress={() => this.props.navigation.navigate('ImportWallet')}>
onPress={() => this.props.navigation.push('ImportWallet')}>
<Text style={styles.btnTextImport}>IMPORT WALLET</Text>
</TouchableOpacity>
</View>
Expand Down
38 changes: 18 additions & 20 deletions src/components/WalletReceiveScreen.js
Expand Up @@ -19,48 +19,46 @@ export default class ReceiveScreen extends React.Component {
constructor(props) {

super(props);
this.walletUtils = this.props.navigation.getParam('walletUtils', null);
this.state = {
loading: false,
wallet: this.walletUtils.wallet
walletUtils: this.props.navigation.getParam('walletUtils', null)
}

const willFocusSubscription = this.props.navigation.addListener(
'willFocus',
payload => {
this.setState({wallet: this.walletUtils.wallet})
this.setState({wallet: this.state.walletUtils.wallet})
}
)

}

importWIFKey = () => {
this.props.navigation.navigate('ImportKey', {walletUtils: this.walletUtils});
this.props.navigation.navigate('ImportKey', {walletUtils: this.state.walletUtils});
}

changeCurrentAddress = (address) => {
this.walletUtils.wallet.addresses.currentExternal = address;
saveWallet(this.walletUtils.wallet);
this.setState({wallet: this.walletUtils.wallet});
this.state.walletUtils.wallet.addresses.currentExternal = address;
saveWallet(this.state.walletUtils.wallet);
this.setState({walletUtils: this.state.walletUtils});
}

generateNewAddress = () => {
this.setState({loading: true})
store.get("wallets").then((res) => {

generateNextAddress(this.walletUtils.wallet, this.walletUtils.password, 0).then((address) => {
this.walletUtils.wallet.addresses.external[address.address] = address.data;
this.walletUtils.wallet.addresses.currentExternal = address.address;
generateNextAddress(this.state.walletUtils.wallet, this.state.walletUtils.password, 0).then((address) => {
this.state.walletUtils.wallet.addresses.external[address.address] = address.data;
this.state.walletUtils.wallet.addresses.currentExternal = address.address;

for (var i = 0; i < res.length; i++) {
if(res[i].id == this.walletUtils.wallet.id) {
res[i] = this.walletUtils.wallet;
if(res[i].id == this.state.walletUtils.wallet.id) {
res[i] = this.state.walletUtils.wallet;
break;
}
}

store.save('wallets', res);
this.setState({wallet: this.walletUtils.wallet});
this.setState({loading: false});
})

Expand All @@ -79,7 +77,7 @@ export default class ReceiveScreen extends React.Component {

render() {

const { wallet, loading } = this.state
const { walletUtils, loading } = this.state

return(
<View style={styles.container}>
Expand All @@ -90,24 +88,24 @@ export default class ReceiveScreen extends React.Component {
<View style={styles.innerContainer}>
<View style={styles.qrContainer}>
<Text style={styles.txtTitle}>Receive</Text>
<TouchableOpacity onPress={() => Clipboard.setString(wallet.addresses.currentExternal)}>
<TouchableOpacity onPress={() => Clipboard.setString(walletUtils.wallet.addresses.currentExternal)}>
<QRCode
value={"microbitcoin:" + wallet.addresses.currentExternal}
value={"microbitcoin:" + walletUtils.wallet.addresses.currentExternal}
size={240}
bgColor='#000672'
fgColor='white'
/>
</TouchableOpacity>
<TouchableOpacity onPress={() => Clipboard.setString(wallet.addresses.currentExternal)}>
<Text selectable style={styles.txtAddress}>{wallet.addresses.currentExternal}</Text>
<TouchableOpacity onPress={() => Clipboard.setString(walletUtils.wallet.addresses.currentExternal)}>
<Text selectable style={styles.txtAddress}>{walletUtils.wallet.addresses.currentExternal}</Text>
</TouchableOpacity>
</View>
</View>
<View style={styles.spacing}>
{
Object.keys(wallet.addresses.external).map((address, i) => (
Object.keys(walletUtils.wallet.addresses.external).map((address, i) => (
<TouchableOpacity key={i} onPress={() => this.changeCurrentAddress(address)}>
<MyWalletAddress address={address} current={wallet.addresses.currentExternal} />
<MyWalletAddress address={address} current={walletUtils.wallet.addresses.currentExternal} />
</TouchableOpacity>
))
}
Expand Down
7 changes: 3 additions & 4 deletions src/components/WalletSendScreen.js
Expand Up @@ -20,22 +20,21 @@ export default class SendScreen extends React.Component {
constructor(props) {

super(props)
this.walletUtils = this.props.navigation.getParam('walletUtils', null);
this.state = {
loading: false,
rAddress: '',
rAmount: '',
rFees: '',
smartFee: '0.000',
wallet: this.walletUtils.wallet
walletUtils: this.props.navigation.getParam('walletUtils', null)
}

const willFocusSubscription = this.props.navigation.addListener(
'willFocus',
payload => {

this.setState({rAddress: this.props.navigation.getParam('scannedAddress', '')})
this.walletUtils.estimateFee().then((res) => {
this.state.walletUtils.estimateFee().then((res) => {
this.setState({smartFee: res})
})

Expand Down Expand Up @@ -81,7 +80,7 @@ export default class SendScreen extends React.Component {
sendTransaction = async() => {

this.setState({loading: true})
let tx = await this.walletUtils.sendTransation(this.state.rAddress.split(' ').join(''), this.state.rAmount, this.state.rFees)
let tx = await this.state.walletUtils.sendTransation(this.state.rAddress.split(' ').join(''), this.state.rAmount, this.state.rFees)
console.log("TX:", tx)

this.setState({loading: false})
Expand Down
16 changes: 8 additions & 8 deletions src/components/WalletSettingsScreen.js
Expand Up @@ -24,8 +24,7 @@ export default class WalletSettingsScreen extends React.Component {
this.isCancelled = false
this.state = {

wallet: this.props.navigation.getParam('wallet', null),
password: this.props.navigation.getParam('password', null)
walletUtils: this.props.navigation.getParam('walletUtils', null),

}
}
Expand All @@ -43,14 +42,14 @@ export default class WalletSettingsScreen extends React.Component {
}

copyMnemonic = () => {
Clipboard.setString(decryptData(this.state.wallet.mnemonicPhrase, this.state.password))
Clipboard.setString(decryptData(this.state.walletUtils.wallet.mnemonicPhrase, this.state.password))
Alert.alert('Copy recovery phrase', 'The recovery phrase has been successfully copied!')
}

clearTransactions = () => {
store.get('wallets').then((res) => {
for (var i = 0; i < res.length; i++) {
if (res[i].id == this.state.wallet.id) {
if (res[i].id == this.state.walletUtils.wallet.id) {
res[i].transactions = {}
this.setState({wallet: res[i]})
break
Expand All @@ -73,7 +72,7 @@ export default class WalletSettingsScreen extends React.Component {

for (var i = 0; i < res.length; i++) {

if(res[i].id == this.state.wallet.id) {
if(res[i].id == this.state.walletUtils.wallet.id) {

res.splice(i, 1)
break
Expand All @@ -96,9 +95,10 @@ export default class WalletSettingsScreen extends React.Component {
changeHistoryCount = (itemValue) => {
store.get('wallets').then((res) => {
for (var i = 0; i < res.length; i++) {
if (res[i].id == this.state.wallet.id) {
if (res[i].id == this.state.walletUtils.wallet.id) {
res[i].settings.historyCount = itemValue
this.setState({wallet: res[i]})
this.state.walletUtils.wallet = res[i]
this.setState({walletUtils: this.state.walletUtils})
break
}
}
Expand All @@ -114,7 +114,7 @@ export default class WalletSettingsScreen extends React.Component {
<TouchableOpacity>
<SettingsItem item={{containerStyle: {padding: 0, flexDirection: 'column'}, 'icon': 'bookmarks', 'left': 'Number of transactions to display', 'right': '', own:
<Picker
selectedValue={this.state.wallet.settings.historyCount}
selectedValue={this.state.walletUtils.wallet.settings.historyCount}
style={{ width: 100}}
onValueChange={(itemValue, itemIndex) => this.changeHistoryCount(itemValue)}>
<Picker.Item label="5" value="5" />
Expand Down

0 comments on commit 24765dd

Please sign in to comment.