mirror of
https://github.com/BlueWallet/BlueWallet.git
synced 2025-03-26 08:55:56 +01:00
WIP: redesign
This commit is contained in:
parent
efb2688eda
commit
a1c774882a
20 changed files with 273 additions and 258 deletions
|
@ -173,7 +173,105 @@ export class BlueHeader extends Component {
|
|||
borderBottomColor: 'transparent',
|
||||
borderBottomWidth: 0,
|
||||
}}
|
||||
statusBarProps={{ barStyle: 'light-content' }}
|
||||
statusBarProps={{ barStyle: 'default' }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class BlueHeaderDefaultSub extends Component {
|
||||
render() {
|
||||
return (
|
||||
<Header
|
||||
{...this.props}
|
||||
backgroundColor="transparent"
|
||||
outerContainerStyles={{
|
||||
borderBottomColor: 'transparent',
|
||||
borderBottomWidth: 0,
|
||||
}}
|
||||
statusBarProps={{ barStyle: 'default' }}
|
||||
leftComponent={
|
||||
<Text
|
||||
style={{
|
||||
fontWeight: 'bold',
|
||||
fontSize: 34,
|
||||
color: BlueApp.settings.foregroundColor,
|
||||
}}
|
||||
>
|
||||
{
|
||||
// eslint-disable-next-line
|
||||
this.props.leftText
|
||||
}
|
||||
</Text>
|
||||
}
|
||||
rightComponent={
|
||||
<TouchableOpacity
|
||||
onPress={() => {
|
||||
// eslint-disable-next-line
|
||||
if (this.props.onClose) this.props.onClose();
|
||||
}}
|
||||
>
|
||||
<View style={stylesBlueIcon.box}>
|
||||
<View style={stylesBlueIcon.ballTransparrent}>
|
||||
<Icon
|
||||
name="times"
|
||||
size={16}
|
||||
type="font-awesome"
|
||||
color={BlueApp.settings.foregroundColor}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
</TouchableOpacity>
|
||||
}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class BlueHeaderDefaultMain extends Component {
|
||||
render() {
|
||||
return (
|
||||
<Header
|
||||
{...this.props}
|
||||
backgroundColor="transparent"
|
||||
outerContainerStyles={{
|
||||
borderBottomColor: 'transparent',
|
||||
borderBottomWidth: 0,
|
||||
}}
|
||||
statusBarProps={{ barStyle: 'default' }}
|
||||
leftComponent={
|
||||
<Text
|
||||
style={{
|
||||
fontWeight: 'bold',
|
||||
fontSize: 34,
|
||||
color: BlueApp.settings.foregroundColor,
|
||||
}}
|
||||
>
|
||||
{
|
||||
// eslint-disable-next-line
|
||||
this.props.leftText
|
||||
}
|
||||
</Text>
|
||||
}
|
||||
rightComponent={
|
||||
<TouchableOpacity
|
||||
onPress={() => {
|
||||
// eslint-disable-next-line
|
||||
if (this.props.onClose) this.props.onClose();
|
||||
}}
|
||||
>
|
||||
<View style={stylesBlueIcon.box}>
|
||||
<View style={stylesBlueIcon.ballTransparrent}>
|
||||
<Icon
|
||||
name="kebab-horizontal"
|
||||
size={22}
|
||||
type="octicon"
|
||||
color={BlueApp.settings.foregroundColor}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
</TouchableOpacity>
|
||||
}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
@ -246,6 +344,9 @@ const stylesBlueIcon = StyleSheet.create({
|
|||
position: 'relative',
|
||||
top: 15,
|
||||
},
|
||||
box: {
|
||||
position: 'relative',
|
||||
},
|
||||
boxIncomming: {
|
||||
position: 'relative',
|
||||
},
|
||||
|
@ -318,11 +419,11 @@ export class BlueRefreshIcon extends Component {
|
|||
return (
|
||||
<TouchableOpacity {...this.props} style={stylesBlueIcon.containerRefresh}>
|
||||
<View style={stylesBlueIcon.box1}>
|
||||
<View style={stylesBlueIcon.ball}>
|
||||
<View style={stylesBlueIcon.ballTransparrent}>
|
||||
<Ionicons
|
||||
{...this.props}
|
||||
name={'ios-refresh'}
|
||||
size={26}
|
||||
size={30}
|
||||
style={{
|
||||
color: BlueApp.settings.foregroundColor,
|
||||
backgroundColor: 'transparent',
|
||||
|
|
|
@ -5,7 +5,6 @@ import wallets from './screen/wallets';
|
|||
import send from './screen/send';
|
||||
import settins from './screen/settings';
|
||||
import receive from './screen/receive';
|
||||
import details from './screen/receive/details';
|
||||
|
||||
/** @type {AppStorage} */
|
||||
let BlueApp = require('./BlueApp');
|
||||
|
@ -34,10 +33,6 @@ const Tabs = TabNavigator(
|
|||
},
|
||||
|
||||
//
|
||||
|
||||
ReceiveDetails: {
|
||||
screen: details,
|
||||
},
|
||||
},
|
||||
{
|
||||
tabBarPosition: 'bottom',
|
||||
|
|
2
app.json
2
app.json
|
@ -7,7 +7,7 @@
|
|||
"ios"
|
||||
],
|
||||
"ios": {
|
||||
"buildNumber": "40",
|
||||
"buildNumber": "41",
|
||||
"supportsTablet": false,
|
||||
"isRemoteJSEnabled": false,
|
||||
"bundleIdentifier": "io.bluewallet.bluewallet",
|
||||
|
|
|
@ -168,7 +168,7 @@ export class AppStorage {
|
|||
* If cached password is saved - finds the correct bucket
|
||||
* to save to, encrypts and then saves.
|
||||
*
|
||||
* @returns Result of AsyncStorage save
|
||||
* @returns {Promise} Result of AsyncStorage save
|
||||
*/
|
||||
async saveToDisk() {
|
||||
let walletsToSave = [];
|
||||
|
@ -212,12 +212,22 @@ export class AppStorage {
|
|||
* For each wallet, fetches balance from remote endpoint.
|
||||
* Use getter for a specific wallet to get actual balance.
|
||||
* Returns void.
|
||||
* If index is present then fetch only from this specific wallet
|
||||
*
|
||||
* @return {Promise.<void>}
|
||||
*/
|
||||
async fetchWalletBalances() {
|
||||
for (let wallet of this.wallets) {
|
||||
await wallet.fetchBalance();
|
||||
async fetchWalletBalances(index) {
|
||||
if (index || index === 0) {
|
||||
let c = 0;
|
||||
for (let wallet of this.wallets) {
|
||||
if (c++ === index) {
|
||||
await wallet.fetchBalance();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (let wallet of this.wallets) {
|
||||
await wallet.fetchBalance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -225,7 +235,7 @@ export class AppStorage {
|
|||
* Fetches from remote endpoint all transactions for each wallet.
|
||||
* Returns void.
|
||||
* To access transactions - get them from each respective wallet.
|
||||
* If index is present then fetch only from this specific wallet
|
||||
* If index is present then fetch only from this specific wallet.
|
||||
*
|
||||
* @param index {Integer} Index of the wallet in this.wallets array,
|
||||
* blank to fetch from all wallets
|
||||
|
|
|
@ -19,7 +19,7 @@ module.exports = {
|
|||
create_a_wallet2: 'as many as you like',
|
||||
},
|
||||
add: {
|
||||
title: 'Add Wallet',
|
||||
title: 'add wallet',
|
||||
description:
|
||||
'You can either scan backup paper wallet (in WIF - Wallet Import Format), or create a new wallet. Segwit wallets supported by default.',
|
||||
scan: 'Scan',
|
||||
|
@ -27,7 +27,7 @@ module.exports = {
|
|||
label_new_segwit: 'New SegWit',
|
||||
},
|
||||
details: {
|
||||
title: 'Wallet Details',
|
||||
title: 'wallet details',
|
||||
address: 'Address',
|
||||
type: 'Type',
|
||||
label: 'Label',
|
||||
|
@ -63,7 +63,7 @@ module.exports = {
|
|||
conf: 'conf',
|
||||
},
|
||||
details: {
|
||||
title: 'Transaction details',
|
||||
title: 'transaction details',
|
||||
from: 'From',
|
||||
to: 'To',
|
||||
},
|
||||
|
@ -113,7 +113,7 @@ module.exports = {
|
|||
},
|
||||
settings: {
|
||||
tabBarLabel: 'Settings',
|
||||
header: 'Settings',
|
||||
header: 'settings',
|
||||
plausible_deniability: 'Plausible deniability...',
|
||||
storage_not_encrypted: 'Storage: not encrypted',
|
||||
storage_encrypted: 'Storage: encrypted',
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import React, { Component } from 'react';
|
||||
import { ScrollView, Linking, Dimensions } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { Icon } from 'react-native-elements';
|
||||
import {
|
||||
BlueLoading,
|
||||
BlueSpacing20,
|
||||
|
@ -9,7 +7,7 @@ import {
|
|||
SafeBlueArea,
|
||||
BlueCard,
|
||||
BlueText,
|
||||
BlueHeader,
|
||||
BlueHeaderDefaultSub,
|
||||
} from '../BlueComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
/** @type {AppStorage} */
|
||||
|
@ -18,14 +16,7 @@ const { height } = Dimensions.get('window');
|
|||
|
||||
export default class About extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarLabel: 'About',
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-settings' : 'ios-settings-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
@ -48,19 +39,9 @@ export default class About extends Component {
|
|||
|
||||
return (
|
||||
<SafeBlueArea forceInset={{ horizontal: 'always' }} style={{ flex: 1 }}>
|
||||
<BlueHeader
|
||||
backgroundColor={BlueApp.settings.brandingColor}
|
||||
leftComponent={
|
||||
<Icon
|
||||
name="menu"
|
||||
color={BlueApp.settings.foregroundColor}
|
||||
onPress={() => this.props.navigation.navigate('DrawerToggle')}
|
||||
/>
|
||||
}
|
||||
centerComponent={{
|
||||
text: 'About',
|
||||
style: { color: BlueApp.settings.foregroundColor, fontSize: 23 },
|
||||
}}
|
||||
<BlueHeaderDefaultSub
|
||||
leftText={'about'}
|
||||
onClose={() => this.props.navigation.goBack()}
|
||||
/>
|
||||
|
||||
<BlueCard>
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
import React, { Component } from 'react';
|
||||
import { Dimensions, Text, TouchableOpacity } from 'react-native';
|
||||
import { Icon } from 'react-native-elements';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { Dimensions, View } from 'react-native';
|
||||
import QRCode from 'react-native-qrcode';
|
||||
import {
|
||||
BlueLoading,
|
||||
BlueHeader,
|
||||
BlueFormInputAddress,
|
||||
SafeBlueArea,
|
||||
BlueCard,
|
||||
BlueHeaderDefaultSub,
|
||||
BlueSpacing,
|
||||
BlueSpacing40,
|
||||
} from '../../BlueComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
/** @type {AppStorage} */
|
||||
|
@ -27,13 +27,6 @@ if (aspectRatio > 1.6) {
|
|||
export default class ReceiveDetails extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarVisible: false,
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-cash' : 'ios-cash-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
@ -70,37 +63,39 @@ export default class ReceiveDetails extends Component {
|
|||
|
||||
return (
|
||||
<SafeBlueArea style={{ flex: 1 }}>
|
||||
<BlueHeader
|
||||
leftComponent={
|
||||
<Text
|
||||
style={{
|
||||
fontWeight: 'bold',
|
||||
fontSize: 34,
|
||||
color: BlueApp.settings.foregroundColor,
|
||||
}}
|
||||
>
|
||||
{loc.receive.list.header}
|
||||
</Text>
|
||||
}
|
||||
rightComponent={
|
||||
<TouchableOpacity onPress={() => this.props.navigation.goBack()}>
|
||||
<Icon
|
||||
name="times"
|
||||
size={16}
|
||||
type="font-awesome"
|
||||
color={BlueApp.settings.foregroundColor}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
{(() => {
|
||||
if (isIpad) {
|
||||
return <BlueSpacing40 />;
|
||||
} else {
|
||||
return <BlueSpacing />;
|
||||
}
|
||||
})()}
|
||||
<BlueHeaderDefaultSub
|
||||
leftText={loc.receive.list.header}
|
||||
onClose={() => this.props.navigation.goBack()}
|
||||
/>
|
||||
|
||||
<BlueCard style={{ alignItems: 'center', flex: 1 }}>
|
||||
<View
|
||||
style={{
|
||||
left: (width - ((isIpad && 250) || 312)) / 2,
|
||||
}}
|
||||
>
|
||||
<QRCode
|
||||
value={this.state.address}
|
||||
size={(isIpad && 250) || 312}
|
||||
bgColor={BlueApp.settings.foregroundColor}
|
||||
fgColor={BlueApp.settings.brandingColor}
|
||||
/>
|
||||
</View>
|
||||
|
||||
<BlueCard
|
||||
containerStyle={{
|
||||
alignItems: 'center',
|
||||
flex: 1,
|
||||
borderColor: 'red',
|
||||
borderWidth: 7,
|
||||
}}
|
||||
>
|
||||
<BlueFormInputAddress editable value={this.state.address} />
|
||||
</BlueCard>
|
||||
</SafeBlueArea>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import React, { Component } from 'react';
|
||||
import { TextInput } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { Text, FormValidationMessage } from 'react-native-elements';
|
||||
import {
|
||||
BlueLoading,
|
||||
|
@ -18,13 +17,7 @@ let loc = require('../../loc');
|
|||
|
||||
export default class SendCreate extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'md-paper-plane' : 'md-paper-plane'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import React, { Component } from 'react';
|
||||
import { ActivityIndicator, View, Dimensions } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { Text, FormValidationMessage } from 'react-native-elements';
|
||||
import {
|
||||
BlueSpacing20,
|
||||
|
@ -32,13 +31,7 @@ const btcAddressRx = /^[a-zA-Z0-9]{26,35}$/;
|
|||
|
||||
export default class SendDetails extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'md-paper-plane' : 'md-paper-plane'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
@ -239,7 +232,7 @@ export default class SendDetails extends Component {
|
|||
<View style={{ flex: 1, flexDirection: 'row' }}>
|
||||
<View style={{ flex: 0.33 }}>
|
||||
<BlueButton
|
||||
onPress={() => this.props.navigation.goBack()}
|
||||
onPress={() => this.props.navigation.navigate('WalletsList')}
|
||||
title={loc.send.details.cancel}
|
||||
/>
|
||||
</View>
|
||||
|
|
|
@ -8,20 +8,12 @@ import {
|
|||
TouchableOpacity,
|
||||
} from 'react-native';
|
||||
import { Camera, Permissions } from 'expo';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import PropTypes from 'prop-types';
|
||||
let EV = require('../../events');
|
||||
|
||||
export default class CameraExample extends React.Component {
|
||||
static navigationOptions = {
|
||||
tabBarLabel: 'Send',
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'md-paper-plane' : 'md-paper-plane'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
state = {
|
||||
|
|
|
@ -1,15 +1,14 @@
|
|||
/* global alert */
|
||||
import React, { Component } from 'react';
|
||||
import { ScrollView, TouchableOpacity, Text, View, Picker } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { Icon, FormValidationMessage } from 'react-native-elements';
|
||||
import { ScrollView, View, Picker } from 'react-native';
|
||||
import { FormValidationMessage } from 'react-native-elements';
|
||||
import {
|
||||
BlueLoading,
|
||||
BlueButton,
|
||||
SafeBlueArea,
|
||||
BlueCard,
|
||||
BlueText,
|
||||
BlueHeader,
|
||||
BlueHeaderDefaultSub,
|
||||
} from '../BlueComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
/** @type {AppStorage} */
|
||||
|
@ -19,15 +18,7 @@ let loc = require('../loc');
|
|||
|
||||
export default class Settings extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarLabel: loc.settings.tabBarLabel,
|
||||
tabBarVisible: false,
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-settings' : 'ios-settings-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
@ -52,28 +43,9 @@ export default class Settings extends Component {
|
|||
|
||||
return (
|
||||
<SafeBlueArea forceInset={{ horizontal: 'always' }} style={{ flex: 1 }}>
|
||||
<BlueHeader
|
||||
leftComponent={
|
||||
<Text
|
||||
style={{
|
||||
fontWeight: 'bold',
|
||||
fontSize: 34,
|
||||
color: BlueApp.settings.foregroundColor,
|
||||
}}
|
||||
>
|
||||
{loc.settings.header}
|
||||
</Text>
|
||||
}
|
||||
rightComponent={
|
||||
<TouchableOpacity onPress={() => this.props.navigation.goBack()}>
|
||||
<Icon
|
||||
name="times"
|
||||
size={16}
|
||||
type="font-awesome"
|
||||
color={BlueApp.settings.foregroundColor}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
}
|
||||
<BlueHeaderDefaultSub
|
||||
leftText={loc.settings.header}
|
||||
onClose={() => this.props.navigation.goBack()}
|
||||
/>
|
||||
|
||||
<BlueCard>
|
||||
|
|
|
@ -1,24 +1,12 @@
|
|||
import { StackNavigator } from 'react-navigation';
|
||||
|
||||
import list from './transactions/list';
|
||||
import details from './transactions/details';
|
||||
import rbf from './transactions/RBF';
|
||||
import createrbf from './transactions/RBF-create';
|
||||
|
||||
const TransactionsNavigator = StackNavigator(
|
||||
{
|
||||
TransactionsList: {
|
||||
screen: list,
|
||||
},
|
||||
TransactionDetails: {
|
||||
screen: details,
|
||||
},
|
||||
RBF: {
|
||||
screen: rbf,
|
||||
},
|
||||
CreateRBF: {
|
||||
screen: createrbf,
|
||||
},
|
||||
},
|
||||
{
|
||||
headerMode: 'none',
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
/** @type {AppStorage} */
|
||||
import React, { Component } from 'react';
|
||||
import { TextInput } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { Text, FormValidationMessage } from 'react-native-elements';
|
||||
import {
|
||||
BlueLoading,
|
||||
|
@ -19,13 +18,7 @@ let BlueApp = require('../../BlueApp');
|
|||
|
||||
export default class SendCreate extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-list-box' : 'ios-list-box-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import React, { Component } from 'react';
|
||||
import { ActivityIndicator, View } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import {
|
||||
BlueSpacing20,
|
||||
BlueButton,
|
||||
|
@ -16,13 +15,7 @@ let BlueApp = require('../../BlueApp');
|
|||
|
||||
export default class RBF extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-list-box' : 'ios-list-box-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
|
|
@ -1,29 +1,32 @@
|
|||
import React, { Component } from 'react';
|
||||
import { View } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { View, Dimensions } from 'react-native';
|
||||
import {
|
||||
BlueButton,
|
||||
SafeBlueArea,
|
||||
BlueCard,
|
||||
BlueText,
|
||||
BlueSpacing,
|
||||
BlueHeaderDefaultSub,
|
||||
BlueLoading,
|
||||
BlueSpacing20,
|
||||
BlueSpacing,
|
||||
BlueSpacing40,
|
||||
} from '../../BlueComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
/** @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 TransactionsDetails extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-list-box' : 'ios-list-box-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
@ -66,15 +69,20 @@ export default class TransactionsDetails extends Component {
|
|||
}
|
||||
|
||||
return (
|
||||
<SafeBlueArea
|
||||
forceInset={{ horizontal: 'always' }}
|
||||
style={{ flex: 1, paddingTop: 20 }}
|
||||
>
|
||||
<BlueSpacing />
|
||||
<BlueCard
|
||||
title={loc.transactions.details.title}
|
||||
style={{ alignItems: 'center', flex: 1 }}
|
||||
>
|
||||
<SafeBlueArea forceInset={{ horizontal: 'always' }} style={{ flex: 1 }}>
|
||||
{(() => {
|
||||
if (isIpad) {
|
||||
return <BlueSpacing40 />;
|
||||
} else {
|
||||
return <BlueSpacing />;
|
||||
}
|
||||
})()}
|
||||
<BlueHeaderDefaultSub
|
||||
leftText={loc.transactions.details.title}
|
||||
onClose={() => this.props.navigation.goBack()}
|
||||
/>
|
||||
|
||||
<BlueCard>
|
||||
{(() => {
|
||||
if (BlueApp.tx_metadata[this.state.tx.hash]) {
|
||||
if (BlueApp.tx_metadata[this.state.tx.hash]['memo']) {
|
||||
|
|
|
@ -6,6 +6,12 @@ import WalletDetails from './wallets/details';
|
|||
import WalletExport from './wallets/export';
|
||||
import scanQrWif from './wallets/scanQrWif';
|
||||
|
||||
import details from './transactions/details';
|
||||
import rbf from './transactions/RBF';
|
||||
import createrbf from './transactions/RBF-create';
|
||||
|
||||
import receiveDetails from './receive/details';
|
||||
|
||||
const WalletsNavigator = StackNavigator(
|
||||
{
|
||||
WalletsList: {
|
||||
|
@ -23,6 +29,24 @@ const WalletsNavigator = StackNavigator(
|
|||
WalletExport: {
|
||||
screen: WalletExport,
|
||||
},
|
||||
|
||||
//
|
||||
|
||||
TransactionDetails: {
|
||||
screen: details,
|
||||
},
|
||||
RBF: {
|
||||
screen: rbf,
|
||||
},
|
||||
CreateRBF: {
|
||||
screen: createrbf,
|
||||
},
|
||||
|
||||
//
|
||||
|
||||
ReceiveDetails: {
|
||||
screen: receiveDetails,
|
||||
},
|
||||
},
|
||||
{
|
||||
headerMode: 'none',
|
||||
|
|
|
@ -1,28 +1,31 @@
|
|||
import { SegwitP2SHWallet } from '../../class';
|
||||
import React, { Component } from 'react';
|
||||
import { ActivityIndicator, View } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { ActivityIndicator, Dimensions, View } from 'react-native';
|
||||
import {
|
||||
BlueSpacing,
|
||||
BlueButton,
|
||||
SafeBlueArea,
|
||||
BlueCard,
|
||||
BlueText,
|
||||
BlueHeaderDefaultSub,
|
||||
BlueSpacing40,
|
||||
} from '../../BlueComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
let EV = require('../../events');
|
||||
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 WalletsAdd extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-briefcase' : 'ios-briefcase-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
@ -52,8 +55,19 @@ export default class WalletsAdd extends Component {
|
|||
forceInset={{ horizontal: 'always' }}
|
||||
style={{ flex: 1, paddingTop: 40 }}
|
||||
>
|
||||
<BlueSpacing />
|
||||
<BlueCard title={loc.wallets.add.title}>
|
||||
{(() => {
|
||||
if (isIpad) {
|
||||
return <BlueSpacing40 />;
|
||||
} else {
|
||||
return <BlueSpacing />;
|
||||
}
|
||||
})()}
|
||||
<BlueHeaderDefaultSub
|
||||
leftText={loc.wallets.add.title}
|
||||
onClose={() => this.props.navigation.goBack()}
|
||||
/>
|
||||
|
||||
<BlueCard>
|
||||
<BlueText>{loc.wallets.add.description}</BlueText>
|
||||
|
||||
<BlueButton
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import React, { Component } from 'react';
|
||||
import { Dimensions, ActivityIndicator, View } from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import {
|
||||
BlueSpacing,
|
||||
BlueSpacing40,
|
||||
|
@ -11,6 +10,7 @@ import {
|
|||
BlueText,
|
||||
BlueFormLabel,
|
||||
BlueFormInputAddress,
|
||||
BlueHeaderDefaultSub,
|
||||
} from '../../BlueComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
let EV = require('../../events');
|
||||
|
@ -28,13 +28,7 @@ if (aspectRatio > 1.6) {
|
|||
|
||||
export default class WalletDetails extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-briefcase' : 'ios-briefcase-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
@ -56,6 +50,7 @@ export default class WalletDetails extends Component {
|
|||
confirmDelete: false,
|
||||
isLoading: true,
|
||||
wallet,
|
||||
address,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -66,7 +61,14 @@ export default class WalletDetails extends Component {
|
|||
}
|
||||
|
||||
async setLabel(text) {
|
||||
this.state.wallet.label = text;
|
||||
this.state.wallet.setLabel(text);
|
||||
if (this.timeout) {
|
||||
clearTimeout(this.timeout);
|
||||
}
|
||||
this.timeout = setTimeout(() => {
|
||||
BlueApp.saveToDisk();
|
||||
}, 3000);
|
||||
|
||||
this.setState({
|
||||
labelChanged: true,
|
||||
}); /* also, a hack to make screen update new typed text */
|
||||
|
@ -91,10 +93,12 @@ export default class WalletDetails extends Component {
|
|||
}
|
||||
})()}
|
||||
|
||||
<BlueCard
|
||||
title={loc.wallets.details.title}
|
||||
style={{ alignItems: 'center', flex: 1 }}
|
||||
>
|
||||
<BlueHeaderDefaultSub
|
||||
leftText={loc.wallets.details.title}
|
||||
onClose={() => this.props.navigation.goBack()}
|
||||
/>
|
||||
|
||||
<BlueCard style={{ alignItems: 'center', flex: 1 }}>
|
||||
<BlueFormLabel>{loc.wallets.details.address}:</BlueFormLabel>
|
||||
<BlueFormInputAddress
|
||||
value={this.state.wallet.getAddress()}
|
||||
|
|
|
@ -1,17 +1,8 @@
|
|||
import React, { Component } from 'react';
|
||||
import {
|
||||
View,
|
||||
TouchableOpacity,
|
||||
Dimensions,
|
||||
Text,
|
||||
ListView,
|
||||
} from 'react-native';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import { Icon } from 'react-native-elements';
|
||||
import { View, Dimensions, Text, ListView } from 'react-native';
|
||||
import {
|
||||
BlueLoading,
|
||||
SafeBlueArea,
|
||||
BlueHeader,
|
||||
WalletsCarousel,
|
||||
BlueTransactionIncommingIcon,
|
||||
BlueTransactionOutgoingIcon,
|
||||
|
@ -21,6 +12,7 @@ import {
|
|||
BlueRefreshIcon,
|
||||
BlueList,
|
||||
BlueListItem,
|
||||
BlueHeaderDefaultMain,
|
||||
} from '../../BlueComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
let EV = require('../../events');
|
||||
|
@ -33,15 +25,7 @@ let ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
|
|||
|
||||
export default class WalletsList extends Component {
|
||||
static navigationOptions = {
|
||||
tabBarLabel: loc.wallets.list.tabBarLabel,
|
||||
tabBarVisible: false,
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-briefcase' : 'ios-briefcase-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
|
@ -68,6 +52,7 @@ export default class WalletsList extends Component {
|
|||
let noErr = true;
|
||||
try {
|
||||
await BlueApp.fetchWalletTransactions(that.lastSnappedTo || 0);
|
||||
await BlueApp.fetchWalletBalances(that.lastSnappedTo || 0);
|
||||
} catch (err) {
|
||||
noErr = false;
|
||||
console.warn(err);
|
||||
|
@ -127,7 +112,7 @@ export default class WalletsList extends Component {
|
|||
|
||||
txMemo(hash) {
|
||||
if (BlueApp.tx_metadata[hash] && BlueApp.tx_metadata[hash]['memo']) {
|
||||
return ' | ' + BlueApp.tx_metadata[hash]['memo'];
|
||||
return BlueApp.tx_metadata[hash]['memo'];
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
@ -174,28 +159,9 @@ export default class WalletsList extends Component {
|
|||
|
||||
return (
|
||||
<SafeBlueArea>
|
||||
<BlueHeader
|
||||
leftComponent={
|
||||
<Text
|
||||
style={{
|
||||
fontWeight: 'bold',
|
||||
fontSize: 34,
|
||||
color: BlueApp.settings.foregroundColor,
|
||||
}}
|
||||
>
|
||||
{loc.wallets.list.title}
|
||||
</Text>
|
||||
}
|
||||
rightComponent={
|
||||
<TouchableOpacity onPress={() => navigate('Settings')}>
|
||||
<Icon
|
||||
name="ellipsis-h"
|
||||
size={16}
|
||||
type="font-awesome"
|
||||
color={BlueApp.settings.foregroundColor}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
}
|
||||
<BlueHeaderDefaultMain
|
||||
leftText={loc.wallets.list.title}
|
||||
onClose={() => navigate('Settings')}
|
||||
/>
|
||||
|
||||
<WalletsCarousel
|
||||
|
@ -265,12 +231,12 @@ export default class WalletsList extends Component {
|
|||
rowData.received,
|
||||
)}
|
||||
subtitle={
|
||||
this.txMemo(rowData.hash) +
|
||||
(rowData.confirmations < 200
|
||||
? loc.transactions.list.conf +
|
||||
': ' +
|
||||
rowData.confirmations
|
||||
: '')
|
||||
rowData.confirmations +
|
||||
' '
|
||||
: '') + this.txMemo(rowData.hash)
|
||||
}
|
||||
onPress={() => {
|
||||
navigate('TransactionDetails', {
|
||||
|
|
|
@ -10,7 +10,6 @@ import {
|
|||
import { BlueText, SafeBlueArea, BlueButton } from '../../BlueComponents';
|
||||
import { Camera, Permissions } from 'expo';
|
||||
import { SegwitP2SHWallet, LegacyWallet } from '../../class';
|
||||
import Ionicons from 'react-native-vector-icons/Ionicons';
|
||||
import PropTypes from 'prop-types';
|
||||
/** @type {AppStorage} */
|
||||
let BlueApp = require('../../BlueApp');
|
||||
|
@ -22,13 +21,7 @@ let loc = require('../../loc');
|
|||
|
||||
export default class ScanQrWif extends React.Component {
|
||||
static navigationOptions = {
|
||||
tabBarIcon: ({ tintColor, focused }) => (
|
||||
<Ionicons
|
||||
name={focused ? 'ios-briefcase' : 'ios-briefcase-outline'}
|
||||
size={26}
|
||||
style={{ color: tintColor }}
|
||||
/>
|
||||
),
|
||||
tabBarVisible: false,
|
||||
};
|
||||
|
||||
state = {
|
||||
|
|
Loading…
Add table
Reference in a new issue