Browse Source

store version 1.2.0

localNotifications v1.2.0
Overtorment 7 years ago
parent
commit
8646f1d06e
  1. 22
      BlueComponents.js
  2. 5
      app.json
  3. BIN
      gif.gif
  4. 14
      screen/about.js
  5. 2
      screen/plausibledeniability.js
  6. 42
      screen/receive/details.js
  7. 25
      screen/receive/list.js
  8. 2
      screen/selftest.js
  9. 21
      screen/send/details.js
  10. 25
      screen/send/list.js
  11. 12
      screen/send/scanQrAddress.js
  12. 2
      screen/settings.js
  13. 6
      screen/transactions/details.js
  14. 5
      screen/transactions/list.js
  15. 8
      screen/wallets/add.js
  16. 50
      screen/wallets/details.js
  17. 7
      screen/wallets/export.js
  18. 14
      screen/wallets/list.js
  19. 1
      up-build-number.js

22
BlueComponents.js

@ -11,8 +11,16 @@ import {
List,
ListItem,
} from 'react-native-elements';
import { ActivityIndicator, ListView, View } from 'react-native';
import { ActivityIndicator, ListView, View, Dimensions } from 'react-native';
let BlueApp = require('./BlueApp');
const { height, width } = Dimensions.get('window');
const aspectRatio = height / width;
let isIpad;
if (aspectRatio > 1.6) {
isIpad = false;
} else {
isIpad = true;
}
export class BlueButton extends Component {
render() {
@ -104,7 +112,7 @@ export class BlueFormInputAddress extends Component {
return (
<FormInput
{...this.props}
inputStyle={{ color: 'white', fontSize: 12 }}
inputStyle={{ color: 'white', fontSize: (isIpad && 10) || 12 }}
containerStyle={{ borderBottomColor: 'white', borderBottomWidth: 0.5 }}
/>
);
@ -132,6 +140,16 @@ export class BlueSpacing extends Component {
);
}
}
export class BlueSpacing40 extends Component {
render() {
return (
<View
{...this.props}
style={{ height: 50, backgroundColor: BlueApp.settings.brandingColor }}
/>
);
}
}
export class BlueSpacing20 extends Component {
render() {

5
app.json

@ -7,13 +7,14 @@
"ios"
],
"ios": {
"buildNumber": 14,
"buildNumber": "25",
"supportsTablet": false,
"isRemoteJSEnabled": false,
"bundleIdentifier": "io.bluewallet.bluewallet",
"infoPlist": {
"NSLocationWhenInUseUsageDescription": "Discover local stores nearby that accept Bitcoin",
"NSCameraUsageDescription": "Allow BlueWallet to scan QR codes",
"ITSAppUsesNonExemptEncryption": true
"ITSAppUsesNonExemptEncryption": false
}
},
"name": "Blue Wallet",

BIN
gif.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 726 KiB

14
screen/about.js

@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { ScrollView, Linking } from 'react-native';
import { ScrollView, Linking, Dimensions } from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
import { Icon } from 'react-native-elements';
import {
@ -14,6 +14,7 @@ import {
import PropTypes from 'prop-types';
/** @type {AppStorage} */
let BlueApp = require('../BlueApp');
const { height } = Dimensions.get('window');
export default class About extends Component {
static navigationOptions = {
@ -58,21 +59,16 @@ export default class About extends Component {
}
centerComponent={{
text: 'About',
style: { color: '#fff', fontSize: 25 },
style: { color: '#fff', fontSize: 23 },
}}
/>
<BlueCard>
<ScrollView maxHeight={450}>
<BlueText h1>About</BlueText>
<BlueSpacing20 />
<ScrollView maxHeight={height - 150}>
<BlueText h4>
Blue Wallet is free and opensource Bitcoin wallet
</BlueText>
<BlueText>
Warning: Alpha version, don't use to store large amouts!
</BlueText>
<BlueButton
icon={{ name: 'octoface', type: 'octicon' }}
onPress={() => {

2
screen/plausibledeniability.js

@ -60,7 +60,7 @@ export default class PlausibleDeniability extends Component {
}
centerComponent={{
text: 'Plausible Deniability',
style: { color: '#fff', fontSize: 25 },
style: { color: '#fff', fontSize: 23 },
}}
/>

42
screen/receive/details.js

@ -1,16 +1,25 @@
import React, { Component } from 'react';
import { TextInput } from 'react-native';
import { Dimensions } from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
import QRCode from 'react-native-qrcode';
import {
BlueLoading,
BlueButton,
BlueSpacing40,
BlueFormInputAddress,
SafeBlueArea,
BlueCard,
BlueSpacing,
} from '../../BlueComponents';
import PropTypes from 'prop-types';
let BlueApp = require('../../BlueApp');
const { height, width } = Dimensions.get('window');
const aspectRatio = height / width;
let isIpad;
if (aspectRatio > 1.6) {
isIpad = false;
} else {
isIpad = true;
}
export default class ReceiveDetails extends Component {
static navigationOptions = {
@ -47,34 +56,27 @@ export default class ReceiveDetails extends Component {
}
return (
<SafeBlueArea
forceInset={{ horizontal: 'always' }}
style={{ flex: 1, paddingTop: 20 }}
>
<BlueSpacing />
<SafeBlueArea style={{ flex: 1 }}>
{(() => {
if (isIpad) {
return <BlueSpacing40 />;
} else {
return <BlueSpacing />;
}
})()}
<BlueCard
title={'Share this address with payer'}
style={{ alignItems: 'center', flex: 1 }}
>
<TextInput
style={{ marginBottom: 20, color: 'white' }}
editable
value={this.state.address}
/>
<BlueFormInputAddress editable value={this.state.address} />
<QRCode
value={this.state.address}
size={312}
size={(isIpad && 250) || 312}
bgColor="white"
fgColor={BlueApp.settings.brandingColor}
/>
</BlueCard>
<BlueButton
icon={{ name: 'arrow-left', type: 'octicon' }}
backgroundColor={BlueApp.settings.brandingColor}
onPress={() => this.props.navigation.goBack()}
title="Go back"
/>
</SafeBlueArea>
);
}

25
screen/receive/list.js

@ -1,5 +1,6 @@
/** @type {AppStorage} */
import React, { Component } from 'react';
import { ListView, Dimensions } from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
import {
BlueLoading,
@ -11,6 +12,8 @@ import {
import PropTypes from 'prop-types';
let BlueApp = require('../../BlueApp');
let EV = require('../../events');
const { height } = Dimensions.get('window');
let ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
export default class ReceiveList extends Component {
static navigationOptions = {
@ -51,6 +54,7 @@ export default class ReceiveList extends Component {
this.setState({
isLoading: false,
list: list,
dataSource: ds.cloneWithRows(list),
});
}
@ -64,29 +68,34 @@ export default class ReceiveList extends Component {
return (
<SafeBlueArea forceInset={{ horizontal: 'always' }} style={{ flex: 1 }}>
<BlueHeader
backgroundColor={BlueApp.settings.brandingColor}
centerComponent={{
text: 'Choose a wallet to receive',
style: { color: '#fff', fontSize: 25 },
text: 'Choose a wallet',
style: { color: '#fff', fontSize: 23 },
}}
/>
<BlueCard containerStyle={{ padding: 0 }}>
{this.state.list.map((item, i) => (
<ListView
maxHeight={height - 200}
enableEmptySections
dataSource={this.state.dataSource}
renderRow={item => {
return (
<BlueListItem
title={item.title}
subtitle={item.subtitle}
onPress={() => {
navigate('ReceiveDetails', { address: item.title });
}}
key={i}
title={item.title}
subtitle={item.subtitle}
leftIcon={{
name: 'bitcoin',
type: 'font-awesome',
color: 'white',
}}
/>
))}
);
}}
/>
</BlueCard>
</SafeBlueArea>
);

2
screen/selftest.js

@ -150,7 +150,7 @@ export default class Selftest extends Component {
backgroundColor={BlueApp.settings.brandingColor}
centerComponent={{
text: 'Self test',
style: { color: '#fff', fontSize: 25 },
style: { color: '#fff', fontSize: 23 },
}}
/>
<BlueCard>

21
screen/send/details.js

@ -1,9 +1,10 @@
import React, { Component } from 'react';
import { ActivityIndicator, View } from 'react-native';
import { ActivityIndicator, View, Dimensions } from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
import { Text, FormValidationMessage } from 'react-native-elements';
import {
BlueSpacing20,
BlueSpacing40,
BlueButton,
SafeBlueArea,
BlueCard,
@ -17,6 +18,14 @@ const bip21 = require('bip21');
let EV = require('../../events');
let BigNumber = require('bignumber.js');
let BlueApp = require('../../BlueApp');
const { height, width } = Dimensions.get('window');
const aspectRatio = height / width;
let isIpad;
if (aspectRatio > 1.6) {
isIpad = false;
} else {
isIpad = true;
}
const btcAddressRx = /^[a-zA-Z0-9]{26,35}$/;
@ -170,7 +179,13 @@ export default class SendDetails extends Component {
return (
<SafeBlueArea style={{ flex: 1, paddingTop: 20 }}>
<BlueSpacing />
{(() => {
if (isIpad) {
return <BlueSpacing40 />;
} else {
return <BlueSpacing />;
}
})()}
<BlueCard
title={'Create Transaction'}
style={{ alignItems: 'center', flex: 1 }}
@ -216,7 +231,7 @@ export default class SendDetails extends Component {
<FormValidationMessage>{this.state.errorMessage}</FormValidationMessage>
<View style={{ flex: 1, flexDirection: 'row', paddingTop: 20 }}>
<View style={{ flex: 1, flexDirection: 'row' }}>
<View style={{ flex: 0.33 }}>
<BlueButton
onPress={() => this.props.navigation.goBack()}

25
screen/send/list.js

@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { ActivityIndicator, View } from 'react-native';
import { Dimensions, ActivityIndicator, View, ListView } from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
import {
SafeBlueArea,
@ -11,6 +11,8 @@ import PropTypes from 'prop-types';
let EV = require('../../events');
/** @type {AppStorage} */
let BlueApp = require('../../BlueApp');
const { height } = Dimensions.get('window');
let ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
export default class SendList extends Component {
static navigationOptions = {
@ -51,6 +53,7 @@ export default class SendList extends Component {
this.setState({
isLoading: false,
list: list,
dataSource: ds.cloneWithRows(list),
});
}
@ -69,27 +72,33 @@ export default class SendList extends Component {
<SafeBlueArea forceInset={{ horizontal: 'always' }} style={{ flex: 1 }}>
<BlueHeader
centerComponent={{
text: 'Choose a wallet to send from',
style: { color: '#fff', fontSize: 25 },
text: 'Choose a wallet',
style: { color: '#fff', fontSize: 23 },
}}
/>
<BlueCard containerStyle={{ padding: 0 }}>
{this.state.list.map((item, i) => (
<ListView
maxHeight={height - 200}
enableEmptySections
dataSource={this.state.dataSource}
renderRow={item => {
return (
<BlueListItem
title={item.title}
subtitle={item.subtitle}
onPress={() => {
navigate('SendDetails', { fromAddress: item.title });
}}
key={i}
title={item.title}
subtitle={item.subtitle}
leftIcon={{
name: 'bitcoin',
type: 'font-awesome',
color: 'white',
}}
/>
))}
);
}}
/>
</BlueCard>
</SafeBlueArea>
);

12
screen/send/scanQrAddress.js

@ -8,10 +8,22 @@ 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 }}
/>
),
};
state = {
isLoading: false,
hasCameraPermission: null,

2
screen/settings.js

@ -61,7 +61,7 @@ export default class Settings extends Component {
}
centerComponent={{
text: 'Settings',
style: { color: '#fff', fontSize: 25 },
style: { color: '#fff', fontSize: 23 },
}}
/>

6
screen/transactions/details.js

@ -123,12 +123,6 @@ export default class TransactionsDetails extends Component {
);
}
})()}
<BlueButton
icon={{ name: 'arrow-left', type: 'octicon' }}
onPress={() => this.props.navigation.goBack()}
title="Go back"
/>
</SafeBlueArea>
);
}

5
screen/transactions/list.js

@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { ListView } from 'react-native';
import { ListView, Dimensions } from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
import { Header, Icon } from 'react-native-elements';
import {
@ -14,6 +14,7 @@ import PropTypes from 'prop-types';
let EV = require('../../events');
/** @type {AppStorage} */
let BlueApp = require('../../BlueApp');
const { height } = Dimensions.get('window');
let ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
@ -123,7 +124,7 @@ export default class TransactionsList extends Component {
<BlueList>
<ListView
style={{ height: 360 }}
maxHeight={height - 300}
enableEmptySections
dataSource={this.state.dataSource}
renderRow={rowData => {

8
screen/wallets/add.js

@ -95,14 +95,6 @@ export default class WalletsAdd extends Component {
}}
/>
</BlueCard>
<BlueButton
icon={{ name: 'arrow-left', type: 'octicon' }}
title="Go Back"
onPress={() => {
this.props.navigation.goBack();
}}
/>
</SafeBlueArea>
);
}

50
screen/wallets/details.js

@ -1,8 +1,9 @@
import React, { Component } from 'react';
import { ActivityIndicator, View } from 'react-native';
import { Dimensions, ActivityIndicator, View } from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
import {
BlueSpacing,
BlueSpacing40,
BlueFormInput,
BlueButton,
SafeBlueArea,
@ -15,6 +16,14 @@ import PropTypes from 'prop-types';
let EV = require('../../events');
/** @type {AppStorage} */
let BlueApp = require('../../BlueApp');
const { height, width } = Dimensions.get('window');
const aspectRatio = height / width;
let isIpad;
if (aspectRatio > 1.6) {
isIpad = false;
} else {
isIpad = true;
}
export default class WalletDetails extends Component {
static navigationOptions = {
@ -65,15 +74,22 @@ export default class WalletDetails extends Component {
render() {
if (this.state.isLoading) {
return (
<View style={{ flex: 1, paddingTop: 20 }}>
<View style={{ flex: 1 }}>
<ActivityIndicator />
</View>
);
}
return (
<SafeBlueArea style={{ flex: 1, paddingTop: 20 }}>
<BlueSpacing />
<SafeBlueArea style={{ flex: 1 }}>
{(() => {
if (isIpad) {
return <BlueSpacing40 />;
} else {
return <BlueSpacing />;
}
})()}
<BlueCard
title={'Wallet Details'}
style={{ alignItems: 'center', flex: 1 }}
@ -103,7 +119,9 @@ export default class WalletDetails extends Component {
if (this.state.confirmDelete) {
return (
<View style={{ alignItems: 'center' }}>
<BlueText h4>Are you sure?</BlueText>
<BlueText>Are you sure?</BlueText>
<View style={{ flex: 0, flexDirection: 'row' }}>
<View style={{ flex: 0.5 }}>
<BlueButton
icon={{ name: 'stop', type: 'octicon' }}
onPress={async () => {
@ -115,6 +133,8 @@ export default class WalletDetails extends Component {
}}
title="Yes, delete"
/>
</View>
<View style={{ flex: 0.5 }}>
<BlueButton
onPress={async () => {
this.setState({ confirmDelete: false });
@ -122,6 +142,8 @@ export default class WalletDetails extends Component {
title="No, cancel"
/>
</View>
</View>
</View>
);
} else {
return (
@ -133,6 +155,12 @@ export default class WalletDetails extends Component {
}}
title="Delete this wallet"
/>
{(() => {
if (isIpad) {
return <View />;
} else {
return (
<BlueButton
onPress={() =>
this.props.navigation.navigate('WalletExport', {
@ -141,17 +169,9 @@ export default class WalletDetails extends Component {
}
title="Export / backup"
/>
<BlueButton
icon={{ name: 'arrow-left', type: 'octicon' }}
onPress={async () => {
if (this.state.labelChanged) {
await BlueApp.saveToDisk();
EV(EV.enum.WALLETS_COUNT_CHANGED); // TODO: some other event type?
);
}
this.props.navigation.goBack();
}}
title="Go back"
/>
})()}
</View>
);
}

7
screen/wallets/export.js

@ -4,7 +4,6 @@ import Ionicons from 'react-native-vector-icons/Ionicons';
import QRCode from 'react-native-qrcode';
import {
BlueSpacing,
BlueButton,
SafeBlueArea,
BlueCard,
BlueText,
@ -86,12 +85,6 @@ export default class WalletExport extends Component {
{this.state.wallet.getSecret()} [Wallet Import Format]
</BlueText>
</BlueCard>
<BlueButton
icon={{ name: 'arrow-left', type: 'octicon' }}
onPress={() => this.props.navigation.goBack()}
title="Go back"
/>
</SafeBlueArea>
);
}

14
screen/wallets/list.js

@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { ListView } from 'react-native';
import { ListView, Dimensions } from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
import {
BlueLoading,
@ -15,6 +15,14 @@ import PropTypes from 'prop-types';
let EV = require('../../events');
/** @type {AppStorage} */
let BlueApp = require('../../BlueApp');
const { height, width } = Dimensions.get('window');
const aspectRatio = height / width;
let isIpad;
if (aspectRatio > 1.6) {
isIpad = false;
} else {
isIpad = true;
}
let ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
@ -70,7 +78,7 @@ export default class WalletsList extends Component {
<BlueHeader
centerComponent={{
text: 'Blue Wallet',
style: { color: '#fff', fontSize: 25 },
style: { color: '#fff', fontSize: 23 },
}}
/>
<BlueCard title="My Bitcoin Wallets">
@ -82,7 +90,7 @@ export default class WalletsList extends Component {
<BlueList>
<ListView
enableEmptySections
maxHeight={290}
maxHeight={(isIpad && 60) || height - 390}
dataSource={this.state.dataSource}
renderRow={rowData => {
return (

1
up-build-number.js

@ -1,4 +1,5 @@
let fs = require('fs');
var appjson = require('./app.json');
appjson.expo.ios.buildNumber++;
appjson.expo.ios.buildNumber = appjson.expo.ios.buildNumber + ''; // casting to string
fs.writeFileSync('./app.json', JSON.stringify(appjson, null, 2));

Loading…
Cancel
Save