Skip to content

Commit 24765dd

Browse files
committed
Release 1.0.1
1 parent 23ab067 commit 24765dd

9 files changed

Lines changed: 97 additions & 90 deletions

File tree

App.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export default class App extends React.Component {
5959
global.port = 7403;
6060
global.ip = "13.57.248.201";
6161
global.ecl = new ElectrumCli(global.port, global.ip, 'tcp');
62-
global.version = "1.0";
62+
global.version = "1.0.1";
6363

6464
global.ecl.connect().then(() => this.ping)
6565
}

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ android {
101101
applicationId "com.microbitcoin"
102102
minSdkVersion 16
103103
targetSdkVersion 27
104-
versionCode 6
105-
versionName "1.0"
104+
versionCode 7
105+
versionName "1.0.1"
106106
ndk {
107107
abiFilters "armeabi-v7a", "x86"
108108
}

src/components/ImportKeyScreen.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ export default class openPasswordWalletScreen extends React.Component {
1818
constructor(props) {
1919

2020
super(props);
21-
this.walletUtils = this.props.navigation.getParam('walletUtils', null);
2221
this.state = {
23-
key: ""
22+
key: "",
23+
walletUtils: this.props.navigation.getParam('walletUtils', null)
2424
}
2525

2626
}
@@ -30,17 +30,20 @@ export default class openPasswordWalletScreen extends React.Component {
3030
}
3131

3232
import = () => {
33+
this.setState({key: this.state.key.trim()});
34+
3335
if(this.state.key != "" && this.state.key != null) {
3436
let address = coinjs.wif2address(this.state.key).address;
35-
if(this.walletUtils.wallet.addresses.external[address] == undefined) {
37+
38+
if(this.state.walletUtils.wallet.addresses.external[address] == undefined) {
3639
Alert.alert("Import WIF key", `Is this your address?\n\n${address}`,
3740
[
3841
{text: 'No', onPress: () => false},
3942
{text: 'Yes', onPress: () => {
40-
this.walletUtils.wallet.addresses.external[address] = {"used": false, "privateKey": encryptData(this.state.key, this.walletUtils.password)};
41-
this.walletUtils.updateBalance();
42-
this.walletUtils.subscribeToAddresses();
43-
saveWallet(this.walletUtils.wallet);
43+
this.state.walletUtils.wallet.addresses.external[address] = {"used": false, "privateKey": encryptData(this.state.key, this.state.walletUtils.password)};
44+
this.state.walletUtils.updateBalance();
45+
this.state.walletUtils.subscribeToAddresses();
46+
saveWallet(this.state.walletUtils.wallet);
4447
this.props.navigation.goBack();
4548
}},
4649
],

src/components/MyWalletDetailsScreen.js

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@ export default class MyWalletDetailsScreen extends React.Component {
2424

2525
constructor(props) {
2626
super(props)
27-
this.walletUtils = new WalletUtils(this.props.navigation.getParam('wallet', null), this.props.navigation.getParam('password', null), global.ecl);
28-
this.walletUtils.subscribeToAddresses();
29-
this.walletUtils.checkHistory();
30-
this.isCancelled = false;
3127
this.state = {
3228

29+
updatingBalance: false,
3330
loading: false,
3431
isConnected: false,
35-
wallet: this.props.navigation.getParam('wallet', null),
36-
password: this.props.navigation.getParam('password', null),
32+
walletUtils: new WalletUtils(this.props.navigation.getParam('wallet', null), this.props.navigation.getParam('password', null), global.ecl),
3733
appState: AppState.currentState
3834

3935
}
36+
37+
this.state.walletUtils.subscribeToAddresses();
38+
this.state.walletUtils.checkHistory();
39+
this.state.isCancelled = false;
4040

4141
const willFocusSubscription = this.props.navigation.addListener(
4242
'willFocus',
@@ -83,7 +83,14 @@ export default class MyWalletDetailsScreen extends React.Component {
8383
}
8484

8585
updateWallet() {
86-
if(!this.isCancelled) this.setState({wallet: this.walletUtils.wallet});
86+
if(!this.isCancelled) this.setState({walletUtils: this.state.walletUtils});
87+
}
88+
89+
async updateBalance() {
90+
if(!this.isCancelled) this.setState({updatingBalance: true});
91+
await this.state.walletUtils.updateBalance();
92+
if(!this.isCancelled) this.setState({walletUtils: this.state.walletUtils});
93+
if(!this.isCancelled) this.setState({updatingBalance: false});
8794
}
8895

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

100107
navigateToSettings = () => {
101-
this.props.navigation.navigate("WalletSettings", {wallet: this.state.wallet, password: this.state.password})
108+
this.props.navigation.navigate("WalletSettings", {walletUtils: this.state.walletUtils})
102109
}
103110

104111

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

118125
handleAppStateChange = (nextAppState) => {
119126
if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
120-
this.walletUtils = new WalletUtils(this.state.wallet, this.props.navigation.getParam('password', null), global.ecl);
121-
this.walletUtils.subscribeToAddresses();
122-
this.walletUtils.checkHistory();
127+
this.setState({walletUtils: new WalletUtils(this.state.walletUtils.wallet, this.state.walletUtils.password, global.ecl)});
128+
this.state.walletUtils.subscribeToAddresses();
129+
this.state.walletUtils.checkHistory();
123130
}
124131
if (!this.isCancelled) this.setState({appState: nextAppState});
125132
}
@@ -134,26 +141,26 @@ export default class MyWalletDetailsScreen extends React.Component {
134141

135142
render() {
136143

137-
const { wallet, password, isConnected, loading, updatingBalance } = this.state
144+
const { walletUtils, isConnected, loading, updatingBalance } = this.state
138145

139146
return(
140147
<View style={styles.container}>
141148
{loading &&
142149
<Loader loading={true} />
143150
}
144151
<View style={styles.balanceContainer}>
145-
<Text style={styles.balanceText}>{`${wallet.balance/10000} MBC`}</Text>
152+
{updatingBalance ? <ActivityIndicator size="small" color="#fff" style={styles.balanceLoading} /> : <TouchableOpacity onPress={() => this.updateBalance()}><Text style={styles.balanceText}>{`${walletUtils.wallet.balance/10000} MBC`}</Text></TouchableOpacity>}
146153
<Text>
147154
<Icon name="controller-record" size={14} color={isConnected ? '#00d47d' : '#ff4133'} />
148-
<Text style={styles.balanceSubText}> {wallet.title}</Text>
155+
<Text style={styles.balanceSubText}> {walletUtils.wallet.title}</Text>
149156
</Text>
150157
</View>
151158
<ScrollView>
152-
{wallet.transactions == null ? <View style={styles.noHistoryContainer}><ActivityIndicator size="large" color="#000672" /></View> : null}
153-
{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}
154-
{wallet.mempool.length > 0 ? <Text style={styles.addressHeader}>Unconfirmed transactions</Text> : null}
159+
{walletUtils.wallet.transactions == null ? <View style={styles.noHistoryContainer}><ActivityIndicator size="large" color="#000672" /></View> : null}
160+
{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}
161+
{walletUtils.wallet.mempool.length > 0 ? <Text style={styles.addressHeader}>Unconfirmed transactions</Text> : null}
155162
{
156-
wallet.mempool.map((tx) => (
163+
walletUtils.wallet.mempool.map((tx) => (
157164
<TouchableOpacity
158165
key={tx['hash']}
159166
onPress={() => this.openLink(tx['hash'])}>
@@ -162,20 +169,20 @@ export default class MyWalletDetailsScreen extends React.Component {
162169
))
163170
}
164171

165-
{Object.keys(wallet.transactions).length > 0 ? <Text style={styles.addressHeader}>Confirmed transactions</Text> : null}
172+
{Object.keys(walletUtils.wallet.transactions).length > 0 ? <Text style={styles.addressHeader}>Confirmed transactions</Text> : null}
166173
{
167-
wallet.transactions != null ? Object.keys(wallet.transactions).reverse().slice(0, wallet.settings.historyCount).map((tx) => (
174+
walletUtils.wallet.transactions != null ? Object.keys(walletUtils.wallet.transactions).reverse().slice(0, walletUtils.wallet.settings.historyCount).map((tx) => (
168175
<TouchableOpacity
169-
key={wallet.transactions[tx]['hash']}
170-
onPress={() => this.openLink(wallet.transactions[tx]['hash'])}>
171-
<MyWalletTransaction tx={wallet.transactions[tx]} />
176+
key={walletUtils.wallet.transactions[tx]['hash']}
177+
onPress={() => this.openLink(walletUtils.wallet.transactions[tx]['hash'])}>
178+
<MyWalletTransaction tx={walletUtils.wallet.transactions[tx]} />
172179
</TouchableOpacity>
173180
)) : null
174181
}
175182
</ScrollView>
176183
<View style={styles.navbar}>
177184
<TouchableOpacity
178-
onPress={() => this.props.navigation.navigate('WalletReceive', {'wallet': wallet, 'password': password, 'walletUtils': this.walletUtils})}
185+
onPress={() => this.props.navigation.navigate('WalletReceive', {'walletUtils': walletUtils})}
179186
style={styles.navbarIconButton}>
180187
<NavbarButton label='Receive' icon='login' />
181188
</TouchableOpacity>
@@ -184,7 +191,7 @@ export default class MyWalletDetailsScreen extends React.Component {
184191
<NavbarButton label='Wallets' icon='wallet' />
185192
</TouchableOpacity>
186193
<TouchableOpacity
187-
onPress={() => this.props.navigation.navigate('WalletSend', {'wallet': wallet, 'password': password, 'walletUtils': this.walletUtils})}
194+
onPress={() => this.props.navigation.navigate('WalletSend', {'walletUtils': walletUtils})}
188195
style={styles.navbarIconButton}>
189196
<NavbarButton label='Send' icon='log-out' />
190197
</TouchableOpacity>

src/components/RestoreWalletScreen.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ export default class RestoreWalletScreen extends React.Component {
6060
<View style={styles.btnContainer}>
6161
<TouchableOpacity
6262
style={styles.btnCreate}
63-
onPress={() => this.props.navigation.navigate('CreateWallet')}>
63+
onPress={() => this.props.navigation.push('CreateWallet')}>
6464
<Text style={styles.btnTextCreate}>CREATE WALLET</Text>
6565
</TouchableOpacity>
6666
<TouchableOpacity
6767
style={styles.btnImport}
68-
onPress={() => this.props.navigation.navigate('ImportWallet')}>
68+
onPress={() => this.props.navigation.push('ImportWallet')}>
6969
<Text style={styles.btnTextImport}>IMPORT WALLET</Text>
7070
</TouchableOpacity>
7171
</View>

src/components/WalletReceiveScreen.js

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,48 +19,46 @@ export default class ReceiveScreen extends React.Component {
1919
constructor(props) {
2020

2121
super(props);
22-
this.walletUtils = this.props.navigation.getParam('walletUtils', null);
2322
this.state = {
2423
loading: false,
25-
wallet: this.walletUtils.wallet
24+
walletUtils: this.props.navigation.getParam('walletUtils', null)
2625
}
2726

2827
const willFocusSubscription = this.props.navigation.addListener(
2928
'willFocus',
3029
payload => {
31-
this.setState({wallet: this.walletUtils.wallet})
30+
this.setState({wallet: this.state.walletUtils.wallet})
3231
}
3332
)
3433

3534
}
3635

3736
importWIFKey = () => {
38-
this.props.navigation.navigate('ImportKey', {walletUtils: this.walletUtils});
37+
this.props.navigation.navigate('ImportKey', {walletUtils: this.state.walletUtils});
3938
}
4039

4140
changeCurrentAddress = (address) => {
42-
this.walletUtils.wallet.addresses.currentExternal = address;
43-
saveWallet(this.walletUtils.wallet);
44-
this.setState({wallet: this.walletUtils.wallet});
41+
this.state.walletUtils.wallet.addresses.currentExternal = address;
42+
saveWallet(this.state.walletUtils.wallet);
43+
this.setState({walletUtils: this.state.walletUtils});
4544
}
4645

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

51-
generateNextAddress(this.walletUtils.wallet, this.walletUtils.password, 0).then((address) => {
52-
this.walletUtils.wallet.addresses.external[address.address] = address.data;
53-
this.walletUtils.wallet.addresses.currentExternal = address.address;
50+
generateNextAddress(this.state.walletUtils.wallet, this.state.walletUtils.password, 0).then((address) => {
51+
this.state.walletUtils.wallet.addresses.external[address.address] = address.data;
52+
this.state.walletUtils.wallet.addresses.currentExternal = address.address;
5453

5554
for (var i = 0; i < res.length; i++) {
56-
if(res[i].id == this.walletUtils.wallet.id) {
57-
res[i] = this.walletUtils.wallet;
55+
if(res[i].id == this.state.walletUtils.wallet.id) {
56+
res[i] = this.state.walletUtils.wallet;
5857
break;
5958
}
6059
}
6160

6261
store.save('wallets', res);
63-
this.setState({wallet: this.walletUtils.wallet});
6462
this.setState({loading: false});
6563
})
6664

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

8078
render() {
8179

82-
const { wallet, loading } = this.state
80+
const { walletUtils, loading } = this.state
8381

8482
return(
8583
<View style={styles.container}>
@@ -90,24 +88,24 @@ export default class ReceiveScreen extends React.Component {
9088
<View style={styles.innerContainer}>
9189
<View style={styles.qrContainer}>
9290
<Text style={styles.txtTitle}>Receive</Text>
93-
<TouchableOpacity onPress={() => Clipboard.setString(wallet.addresses.currentExternal)}>
91+
<TouchableOpacity onPress={() => Clipboard.setString(walletUtils.wallet.addresses.currentExternal)}>
9492
<QRCode
95-
value={"microbitcoin:" + wallet.addresses.currentExternal}
93+
value={"microbitcoin:" + walletUtils.wallet.addresses.currentExternal}
9694
size={240}
9795
bgColor='#000672'
9896
fgColor='white'
9997
/>
10098
</TouchableOpacity>
101-
<TouchableOpacity onPress={() => Clipboard.setString(wallet.addresses.currentExternal)}>
102-
<Text selectable style={styles.txtAddress}>{wallet.addresses.currentExternal}</Text>
99+
<TouchableOpacity onPress={() => Clipboard.setString(walletUtils.wallet.addresses.currentExternal)}>
100+
<Text selectable style={styles.txtAddress}>{walletUtils.wallet.addresses.currentExternal}</Text>
103101
</TouchableOpacity>
104102
</View>
105103
</View>
106104
<View style={styles.spacing}>
107105
{
108-
Object.keys(wallet.addresses.external).map((address, i) => (
106+
Object.keys(walletUtils.wallet.addresses.external).map((address, i) => (
109107
<TouchableOpacity key={i} onPress={() => this.changeCurrentAddress(address)}>
110-
<MyWalletAddress address={address} current={wallet.addresses.currentExternal} />
108+
<MyWalletAddress address={address} current={walletUtils.wallet.addresses.currentExternal} />
111109
</TouchableOpacity>
112110
))
113111
}

src/components/WalletSendScreen.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,21 @@ export default class SendScreen extends React.Component {
2020
constructor(props) {
2121

2222
super(props)
23-
this.walletUtils = this.props.navigation.getParam('walletUtils', null);
2423
this.state = {
2524
loading: false,
2625
rAddress: '',
2726
rAmount: '',
2827
rFees: '',
2928
smartFee: '0.000',
30-
wallet: this.walletUtils.wallet
29+
walletUtils: this.props.navigation.getParam('walletUtils', null)
3130
}
3231

3332
const willFocusSubscription = this.props.navigation.addListener(
3433
'willFocus',
3534
payload => {
3635

3736
this.setState({rAddress: this.props.navigation.getParam('scannedAddress', '')})
38-
this.walletUtils.estimateFee().then((res) => {
37+
this.state.walletUtils.estimateFee().then((res) => {
3938
this.setState({smartFee: res})
4039
})
4140

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

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

8786
this.setState({loading: false})

src/components/WalletSettingsScreen.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ export default class WalletSettingsScreen extends React.Component {
2424
this.isCancelled = false
2525
this.state = {
2626

27-
wallet: this.props.navigation.getParam('wallet', null),
28-
password: this.props.navigation.getParam('password', null)
27+
walletUtils: this.props.navigation.getParam('walletUtils', null),
2928

3029
}
3130
}
@@ -43,14 +42,14 @@ export default class WalletSettingsScreen extends React.Component {
4342
}
4443

4544
copyMnemonic = () => {
46-
Clipboard.setString(decryptData(this.state.wallet.mnemonicPhrase, this.state.password))
45+
Clipboard.setString(decryptData(this.state.walletUtils.wallet.mnemonicPhrase, this.state.password))
4746
Alert.alert('Copy recovery phrase', 'The recovery phrase has been successfully copied!')
4847
}
4948

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

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

76-
if(res[i].id == this.state.wallet.id) {
75+
if(res[i].id == this.state.walletUtils.wallet.id) {
7776

7877
res.splice(i, 1)
7978
break
@@ -96,9 +95,10 @@ export default class WalletSettingsScreen extends React.Component {
9695
changeHistoryCount = (itemValue) => {
9796
store.get('wallets').then((res) => {
9897
for (var i = 0; i < res.length; i++) {
99-
if (res[i].id == this.state.wallet.id) {
98+
if (res[i].id == this.state.walletUtils.wallet.id) {
10099
res[i].settings.historyCount = itemValue
101-
this.setState({wallet: res[i]})
100+
this.state.walletUtils.wallet = res[i]
101+
this.setState({walletUtils: this.state.walletUtils})
102102
break
103103
}
104104
}
@@ -114,7 +114,7 @@ export default class WalletSettingsScreen extends React.Component {
114114
<TouchableOpacity>
115115
<SettingsItem item={{containerStyle: {padding: 0, flexDirection: 'column'}, 'icon': 'bookmarks', 'left': 'Number of transactions to display', 'right': '', own:
116116
<Picker
117-
selectedValue={this.state.wallet.settings.historyCount}
117+
selectedValue={this.state.walletUtils.wallet.settings.historyCount}
118118
style={{ width: 100}}
119119
onValueChange={(itemValue, itemIndex) => this.changeHistoryCount(itemValue)}>
120120
<Picker.Item label="5" value="5" />

0 commit comments

Comments
 (0)