Igor Korsakov
6 years ago
committed by
GitHub
9 changed files with 196 additions and 0 deletions
@ -0,0 +1,144 @@ |
|||
import React, { Component } from 'react'; |
|||
import { Dimensions, Platform, ActivityIndicator, View, Clipboard, Animated, TouchableOpacity } from 'react-native'; |
|||
import { QRCode as QRSlow } from 'react-native-custom-qr-codes'; |
|||
import { BlueSpacing40, SafeBlueArea, BlueCard, BlueText, BlueHeaderDefaultSub } from '../../BlueComponents'; |
|||
import PropTypes from 'prop-types'; |
|||
const QRFast = require('react-native-qrcode'); |
|||
/** @type {AppStorage} */ |
|||
let BlueApp = require('../../BlueApp'); |
|||
let loc = require('../../loc'); |
|||
const { height, width } = Dimensions.get('window'); |
|||
const aspectRatio = height / width; |
|||
let isIpad; |
|||
if (aspectRatio > 1.6) { |
|||
isIpad = false; |
|||
} else { |
|||
isIpad = true; |
|||
} |
|||
|
|||
export default class WalletXpub extends Component { |
|||
static navigationOptions = { |
|||
header: ({ navigation }) => { |
|||
return <BlueHeaderDefaultSub leftText={loc.wallets.xpub.title} onClose={() => navigation.goBack(null)} />; |
|||
}, |
|||
}; |
|||
|
|||
constructor(props) { |
|||
super(props); |
|||
|
|||
let secret = props.navigation.state.params.secret; |
|||
let wallet; |
|||
|
|||
for (let w of BlueApp.getWallets()) { |
|||
if (w.getSecret() === secret) { |
|||
// found our wallet
|
|||
wallet = w; |
|||
} |
|||
} |
|||
|
|||
this.state = { |
|||
isLoading: true, |
|||
wallet, |
|||
xpub: wallet.getXpub(), |
|||
xpubText: wallet.getXpub(), |
|||
}; |
|||
} |
|||
|
|||
async componentDidMount() { |
|||
this.setState({ |
|||
isLoading: false, |
|||
showQr: false, |
|||
}); |
|||
|
|||
setTimeout(() => { |
|||
this.setState({ showQr: true }); |
|||
}, 1000); |
|||
} |
|||
|
|||
determineSize = () => { |
|||
if (width > 312) { |
|||
return width - 48; |
|||
} |
|||
return 312; |
|||
}; |
|||
|
|||
copyToClipboard = () => { |
|||
this.setState({ xpubText: loc.wallets.xpub.copiedToClipboard }, () => { |
|||
Clipboard.setString(this.state.xpub); |
|||
setTimeout(() => this.setState({ xpubText: this.state.xpub }), 1000); |
|||
}); |
|||
}; |
|||
|
|||
render() { |
|||
if (this.state.isLoading) { |
|||
return ( |
|||
<View style={{ flex: 1, paddingTop: 20 }}> |
|||
<ActivityIndicator /> |
|||
</View> |
|||
); |
|||
} |
|||
|
|||
return ( |
|||
<SafeBlueArea style={{ flex: 1, paddingTop: 20 }}> |
|||
{isIpad && ( |
|||
<BlueSpacing40 /> |
|||
)} |
|||
<BlueCard style={{ alignItems: 'center', flex: 1 }}> |
|||
<View> |
|||
<BlueText>{this.state.wallet.getTypeReadable()}</BlueText> |
|||
</View> |
|||
|
|||
{(() => { |
|||
if (this.state.showQr) { |
|||
if (Platform.OS === 'ios' || this.state.xpub.length < 54) { |
|||
return ( |
|||
<QRSlow |
|||
content={this.state.xpub} |
|||
size={this.determineSize()} |
|||
color={BlueApp.settings.foregroundColor} |
|||
backgroundColor={BlueApp.settings.brandingColor} |
|||
logo={require('../../img/qr-code.png')} |
|||
ecl={'Q'} |
|||
/> |
|||
); |
|||
} else { |
|||
return ( |
|||
<QRFast |
|||
value={this.state.xpub} |
|||
size={this.determineSize()} |
|||
fgColor={BlueApp.settings.brandingColor} |
|||
bgColor={BlueApp.settings.foregroundColor} |
|||
/> |
|||
); |
|||
} |
|||
} else { |
|||
return ( |
|||
<View> |
|||
<ActivityIndicator /> |
|||
</View> |
|||
); |
|||
} |
|||
})()} |
|||
|
|||
<TouchableOpacity onPress={this.copyToClipboard}> |
|||
<Animated.Text style={{ marginVertical: 8, textAlign: 'center' }} numberOfLines={0}> |
|||
{this.state.xpubText} |
|||
</Animated.Text> |
|||
</TouchableOpacity> |
|||
</BlueCard> |
|||
</SafeBlueArea> |
|||
); |
|||
} |
|||
} |
|||
|
|||
WalletXpub.propTypes = { |
|||
navigation: PropTypes.shape({ |
|||
state: PropTypes.shape({ |
|||
params: PropTypes.shape({ |
|||
secret: PropTypes.string, |
|||
}), |
|||
}), |
|||
navigate: PropTypes.func, |
|||
goBack: PropTypes.func, |
|||
}), |
|||
}; |
Loading…
Reference in new issue