Merge branch 'master' of https://github.com/esteemapp/esteem-mobile into nodelist

This commit is contained in:
u-e 2018-12-03 21:29:19 +03:00
commit abf2213571
33 changed files with 221 additions and 1280 deletions

View File

@ -32,10 +32,10 @@
"crypto-js": "^3.1.9-1",
"dsteem": "^0.10.1",
"moment": "^2.22.2",
"native-base": "^2.8.1",
"react": "^16.6.0-alpha.8af6728",
"react-intl": "^2.7.2",
"react-native": "^0.57.5",
"react-native-actionsheet": "^2.4.2",
"react-native-config": "^0.11.5",
"react-native-extended-stylesheet": "^0.10.0",
"react-native-fast-image": "^4.0.14",

View File

@ -67,7 +67,7 @@ class CommentsView extends Component {
>
<PostBody isComment handleOnUserPress={handleOnUserPress} body={item.body} />
<View style={{ flexDirection: 'row' }}>
<Upvote isShowPayoutValue content={item} user={currentUser} />
<Upvote isShowPayoutValue content={item} />
<IconButton
iconStyle={{ color: '#c1c5c7' }}
style={{ marginLeft: 20 }}

View File

@ -55,7 +55,7 @@ const DropdownButtonView = ({
<ModalDropdown
style={[!style ? styles.button : style]}
textStyle={[textStyle || styles.buttonText]}
dropdownStyle={[dropdownStyle || styles.dropdown, { height: 35 * (options.length + 1) }]}
dropdownStyle={[styles.dropdown, dropdownStyle, { height: 35 * (options.length + 1) }]}
dropdownTextStyle={[dropdownTextStyle || styles.dropdownText]}
dropdownTextHighlightStyle={styles.dropdownTextHighlight}
options={options}

View File

@ -1,5 +1,4 @@
import Logo from './logo/logo';
import Reply from './reply/reply';
import { FormInput } from './formInput';
import { CircularButton, TextButton, IconButton } from './buttons';
import { NumericKeyboard } from './numericKeyboard';
@ -12,7 +11,6 @@ import UserListItem from './basicUIElements/view/userListItem/userListItem';
export {
Logo,
UserListItem,
Reply,
FormInput,
CircularButton,
TextButton,

View File

@ -4,7 +4,7 @@ import { View, Image } from 'react-native';
import LOGO from '../../assets/esteem.png';
// Styles
import styles from '../../styles/logo.styles';
import styles from './logoStyles';
import globalStyles from '../../globalStyles';
const Logo = props => (

View File

@ -1,8 +1,9 @@
import React, { Component } from 'react';
import {
View, KeyboardAvoidingView, ScrollView, FlatList, Text, ActionSheetIOS
View, KeyboardAvoidingView, ScrollView, FlatList, Text,
} from 'react-native';
import Markdown, { getUniqueID } from 'react-native-markdown-renderer';
import ActionSheet from 'react-native-actionsheet';
// Components
import { DropdownButton } from '../../dropdownButton';
@ -123,63 +124,49 @@ export default class MarkdownEditorView extends Component {
</View>
);
_handleOnImageButtonPress = () => {
const { handleOpenImagePicker } = this.props;
ActionSheetIOS.showActionSheetWithOptions(
{
options: ['Cancel', 'Take Photo', 'Select From Gallery'],
cancelButtonIndex: 0,
},
(buttonIndex) => {
handleOpenImagePicker(buttonIndex === 1 ? 'camera' : buttonIndex === 2 && 'image');
},
);
}
_renderEditorButtons = ({ getState, setState }) => {
return (
<StickyBar>
<View style={styles.leftButtonsWrapper}>
<FlatList
data={Formats}
keyboardShouldPersistTaps="always"
renderItem={({ item, index }) => index !== 9 && this._renderMarkupButton({ item, getState, setState })
}
horizontal
/>
</View>
<View style={styles.rightButtonsWrapper}>
<IconButton
size={20}
style={styles.rightIcons}
iconStyle={styles.icon}
iconType="FontAwesome"
name="link"
onPress={() => Formats[9].onPress({ getState, setState })}
/>
<IconButton
onPress={() => this._handleOnImageButtonPress()}
style={styles.rightIcons}
size={20}
iconStyle={styles.icon}
iconType="FontAwesome"
name="image"
/>
<DropdownButton
style={styles.dropdownStyle}
options={['option1', 'option2', 'option3', 'option4']}
iconName="md-more"
iconStyle={styles.dropdownIconStyle}
isHasChildIcon
/>
</View>
</StickyBar>
);
};
_renderEditorButtons = ({ getState, setState }) => (
<StickyBar>
<View style={styles.leftButtonsWrapper}>
<FlatList
data={Formats}
keyboardShouldPersistTaps="always"
renderItem={({ item, index }) => index !== 9 && this._renderMarkupButton({ item, getState, setState })
}
horizontal
/>
</View>
<View style={styles.rightButtonsWrapper}>
<IconButton
size={20}
style={styles.rightIcons}
iconStyle={styles.icon}
iconType="FontAwesome"
name="link"
onPress={() => Formats[9].onPress({ getState, setState })}
/>
<IconButton
onPress={() => this.ActionSheet.show()}
style={styles.rightIcons}
size={20}
iconStyle={styles.icon}
iconType="FontAwesome"
name="image"
/>
<DropdownButton
style={styles.dropdownStyle}
options={['option1', 'option2', 'option3', 'option4']}
iconName="md-more"
iconStyle={styles.dropdownIconStyle}
isHasChildIcon
/>
</View>
</StickyBar>
);
render() {
const { intl, isPreviewActive, isReply } = this.props;
const {
intl, isPreviewActive, isReply, handleOpenImagePicker,
} = this.props;
const { text, selection } = this.state;
return (
@ -210,6 +197,14 @@ export default class MarkdownEditorView extends Component {
this.setState(state, callback);
},
})}
<ActionSheet
ref={o => (this.ActionSheet = o)}
options={['Open Gallery', 'Capture a photo', 'Cancel']}
cancelButtonIndex={2}
onPress={(index) => {
handleOpenImagePicker(index === 0 ? 'image' : index === 1 && 'camera');
}}
/>
</KeyboardAvoidingView>
);
}

View File

@ -102,7 +102,7 @@ class PostCard extends Component {
</View>
<View style={styles.bodyFooter}>
<View style={styles.leftFooterWrapper}>
<Upvote isShowPayoutValue content={content} user={user} />
<Upvote isShowPayoutValue content={content} />
<TouchableOpacity
style={styles.commentButton}
onPress={() => this._handleOnVotersPress()}

View File

@ -18,9 +18,9 @@ import styles from './postDisplayStyles';
const HEIGHT = Dimensions.get('window').width;
class PostDisplayView extends Component {
/* Props
* ------------------------------------------------
* @prop { type } name - Description....
*/
* ------------------------------------------------
* @prop { type } name - Description....
*/
constructor(props) {
super(props);
@ -62,7 +62,7 @@ class PostDisplayView extends Component {
return (
<StickyBar isFixedFooter={isFixedFooter}>
<View style={styles.stickyWrapper}>
<Upvote isShowPayoutValue content={post} user={currentUser} />
<Upvote isShowPayoutValue content={post} />
<TextWithIcon
isClickable
iconStyle={styles.barIcons}
@ -80,16 +80,14 @@ class PostDisplayView extends Component {
iconType="FontAwesome"
/>
<View style={styles.stickyRightWrapper}>
{post
&& currentUser
&& currentUser.name === post.author && (
<IconButton
iconStyle={styles.barIconRight}
style={styles.barIconButton}
name="pencil"
iconType="SimpleLineIcons"
onPress={() => handleOnEditPress && handleOnEditPress()}
/>
{post && currentUser && currentUser.name === post.author && (
<IconButton
iconStyle={styles.barIconRight}
style={styles.barIconButton}
name="pencil"
iconType="SimpleLineIcons"
onPress={() => handleOnEditPress && handleOnEditPress()}
/>
)}
<IconButton
iconStyle={styles.barIconRight}
@ -145,14 +143,13 @@ class PostDisplayView extends Component {
</View>
)}
</View>
{post
&& (isGetComment || isLoadedComments) && (
<CommentsDisplay
currentUser={currentUser}
author={post.author}
permlink={post.permlink}
commentCount={post.children}
/>
{post && (isGetComment || isLoadedComments) && (
<CommentsDisplay
currentUser={currentUser}
author={post.author}
permlink={post.permlink}
commentCount={post.children}
/>
)}
</ScrollView>
{!isPostEnd && this._getTabBar(true)}

View File

@ -1,176 +0,0 @@
/* eslint-disable no-unused-vars */
import React from 'react';
import {
StyleSheet,
Image,
TouchableOpacity,
Dimensions,
ActivityIndicator,
FlatList,
TextInput,
} from 'react-native';
import {
Card,
CardItem,
Header,
Left,
Right,
Thumbnail,
Title,
View,
Icon,
Body,
Text,
Button,
} from 'native-base';
import { Popover, PopoverController } from 'react-native-modal-popover';
import Slider from 'react-native-slider';
import Modal from 'react-native-modal';
import {
upvote,
upvoteAmount,
postComment,
} from '../../providers/steem/dsteem';
import { decryptKey } from '../../utils/crypto';
import { getUserData } from '../../realm/realm';
import { parsePost } from '../../utils/postParser';
import { getComments, getPost } from '../../providers/steem/dsteem';
/* eslint-enable no-unused-vars */
class Reply extends React.Component {
constructor(props) {
super(props);
this.state = {
comment: '',
};
}
componentDidMount() {
console.log(this.props.navigation.state.params);
}
postComment = async () => {
this.setState({ isLoading: true });
const content = this.props.navigation.state.params.content;
const user = this.props.navigation.state.params.user;
let userData;
let postingKey;
const comment = {
parent_author: content.author,
parent_permlink: content.permlink,
author: user.name,
permlink: this.commentPermlink(content.author, content.permlink),
title: this.commentPermlink(content.author, content.permlink),
body: this.state.comment,
json_metadata: JSON.stringify({
app: 'esteem/2.0.0-mobile',
community: 'esteem.app',
}),
};
await getUserData().then((result) => {
userData = Array.from(result);
postingKey = decryptKey(userData[0].postingKey, 'pinCode');
});
postComment(comment, postingKey)
.then((result) => {
console.log(result);
this.setState({
isLoading: false,
comment: '',
});
})
.catch((error) => {
console.log(error);
this.setState({ isLoading: false });
});
};
/**
* Method to format permlink for a comment
* @param parent_author
* @param parent_permlink
*/
commentPermlink = (parent_author, parent_permlink) => {
const timeStr = new Date()
.toISOString()
.replace(/[^a-zA-Z0-9]+/g, '')
.toLocaleLowerCase();
parent_permlink = parent_permlink.replace(/(-\d{8}t\d{9}z)/g, '');
return `re${parent_author}-${parent_permlink}-${timeStr}`;
};
render() {
return (
<View style={{ backgroundColor: 'white' }}>
<Header>
<Left>
<Button
transparent
onPress={() => this.props.navigation.pop()}
>
<Icon name="arrow-back" />
</Button>
</Left>
<Body>
<Text>Reply</Text>
</Body>
<Right />
</Header>
<View style={{ padding: 10 }}>
<TextInput
style={{
borderWidth: 1,
borderColor: 'lightgray',
borderRadius: 5,
padding: 10,
minHeight: 100,
}}
multiline
numberOfLines={4}
placeholder={`Replying to @${
this.props.navigation.state.params.content.author
}`}
onChangeText={comment => this.setState({ comment })}
value={this.state.comment}
/>
<View style={{ flexDirection: 'row-reverse' }}>
<Button
onPress={this.postComment}
style={{
alignSelf: 'flex-end',
marginTop: 10,
borderRadius: 20,
}}
>
{this.state.isLoading ? (
<ActivityIndicator
style={{ marginHorizontal: 50 }}
/>
) : (
<Text>Submit</Text>
)}
</Button>
<Button
style={{
alignSelf: 'flex-end',
marginRight: 10,
borderRadius: 50,
}}
>
<Icon name="images" />
</Button>
</View>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
reply: {},
});
export default Reply;

View File

@ -1,226 +0,0 @@
import React, { Component } from 'react';
import {
Text,
View,
Dimensions,
TextInput,
FlatList,
Image,
ActivityIndicator,
} from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons';
// import { Navigation } from 'react-native-navigation';
import { lookupAccounts } from '../../providers/steem/dsteem';
import search from '../../config/search';
export default class Search extends Component {
constructor() {
super();
this.handleSearch = this.handleSearch.bind(this);
this.state = {
text: '',
scroll_id: '',
posts: [],
users: [],
loading: false,
};
}
closeSearch = () => {
// Navigation.dismissOverlay(this.props.componentId);
};
handleSearch = async (text) => {
if (text.length < 3) return;
let users;
let posts;
let scroll_id;
await this.setState({
loading: true,
text,
});
users = await lookupAccounts(text);
await this.setState({ users });
const data = { q: text };
search
.post('/', JSON.stringify(data))
.then(result => result.json())
.then((result) => {
posts = result.results;
scroll_id = result.scroll_id;
})
.catch((error) => {
console.log(error);
});
/*await fetch('https://api.search.esteem.app/search', {
method: 'POST',
headers: {
// TODO: Create a config file for authorization
Authorization: SEARCH_API_TOKEN,
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then(result => result.json())
.then((result) => {
posts = result.results;
scroll_id = result.scroll_id;
})
.catch((error) => {
console.log(error);
});*/
await this.setState({ loading: false });
await this.setState({
posts,
scroll_id,
});
};
render() {
return (
<View
style={{
backgroundColor: 'rgba(0, 0, 0, 0.8)',
height: Dimensions.get('window').height,
paddingTop: 25,
flex: 1,
}}
>
<View
style={{
flexDirection: 'row',
borderRadius: 8,
backgroundColor: '$primaryGray',
paddingLeft: 10,
marginHorizontal: 10,
}}
>
<Ionicons
name="md-search"
style={{
flex: 0.1,
fontSize: 18,
top: 10,
color: '$primaryDarkGray',
}}
/>
<TextInput
style={{ flex: 0.9, height: 40 }}
autoCapitalize="none"
onChangeText={text => this.handleSearch(text)}
value={this.state.text}
/>
<Ionicons
onPress={this.closeSearch}
name="md-close-circle"
style={{
flex: 0.1,
fontSize: 15,
top: 12.5,
color:"$iconColor",
}}
/>
</View>
<View
style={{
paddingTop: 20,
flex: 1,
marginTop: 20,
}}
>
<FlatList
data={this.state.users}
showsVerticalScrollIndicator={false}
horizontal
renderItem={({ item }) => (
<View style={{ margin: 10, flexDirection: 'column' }}>
<Image
style={{
width: 50,
height: 50,
borderRadius: 25,
borderWidth: 1,
borderColor: 'gray',
}}
source={{
uri: `https://steemitimages.com/u/${item}/avatar/small`,
}}
/>
<Text
style={{
color: '#fff',
fontWeight: '500',
fontSize: 10,
overflow: 'scroll',
}}
>
@
{item}
</Text>
</View>
)}
keyExtractor={(post, index) => index.toString()}
removeClippedSubviews
onEndThreshold={0}
/>
<FlatList
data={this.state.posts}
showsVerticalScrollIndicator={false}
renderItem={({ item }) => (
// TODO: Create a component to list search results
<View
style={{
backgroundColor: 'white',
borderRadius: 5,
marginHorizontal: 10,
marginVertical: 5,
}}
>
<View
style={{
flexDirection: 'row',
}}
>
<Image
source={{
uri: `https://steemitimages.com/u/${item.author}/avatar/small`,
}}
style={{
width: 40,
height: 40,
borderRadius: 20,
borderWidth: 1,
borderColor: 'gray',
}}
/>
<Text>
{item.author}
{' '}
(
{item.author_rep}
)
</Text>
</View>
</View>
)}
keyExtractor={(post, index) => index.toString()}
removeClippedSubviews
onEndThreshold={0}
initialNumToRender={20}
/>
</View>
</View>
);
}
}

View File

@ -20,19 +20,21 @@ export default EStyleSheet.create({
color: '$primaryDarkGray',
},
rowTextStyle: {
fontSize: 14,
fontSize: 12,
color: '$primaryDarkGray',
padding: 5,
},
dropdownStyle: {
marginRight: -35,
marginTop: 15,
minWidth: 172,
width: 172,
},
dropdownButtonStyle: {
backgroundColor: '$primaryGray',
height: 44,
width: 172,
borderRadius: 8,
marginHorizontal: 2,
},
dropdown: {
flexGrow: 1,

View File

@ -12,9 +12,9 @@ import styles from './settingsItemStyles';
class SettingsItemView extends Component {
/* Props
* ------------------------------------------------
* @prop { type } name - Description....
*/
* ------------------------------------------------
* @prop { type } name - Description....
*/
constructor(props) {
super(props);
@ -26,7 +26,13 @@ class SettingsItemView extends Component {
// Component Functions
_renderItem = () => {
const {
type, options, selectedOptionIndex, handleOnChange, text, isOn, actionType
type,
options,
selectedOptionIndex,
handleOnChange,
text,
isOn,
actionType,
} = this.props;
switch (type) {
@ -47,7 +53,13 @@ class SettingsItemView extends Component {
);
case 'toggle':
return <ToggleSwitch size="large" isOn={isOn} onToggle={e => handleOnChange(e, type, actionType)} />;
return (
<ToggleSwitch
size="large"
isOn={isOn}
onToggle={e => handleOnChange(e, type, actionType)}
/>
);
default:
return (

View File

@ -27,6 +27,12 @@ export default EStyleSheet.create({
},
otherUserAvatar: {
marginLeft: -15,
width: 32,
height: 32,
borderRadius: 32 / 2,
borderWidth: 0.1,
alignSelf: 'center',
borderColor: '$borderColor',
},
userInfoView: {
alignSelf: 'center',
@ -52,14 +58,10 @@ export default EStyleSheet.create({
},
listItemText: {
color: '$primaryDarkGray',
marginLeft: 15,
marginLeft: 12,
alignSelf: 'center',
fontWeight: '500',
},
linearGradient: {
flex: 1,
paddingLeft: 15,
paddingRight: 15,
borderRadius: 5,
fontSize: 14,
},
buttonText: {
fontSize: 18,
@ -78,4 +80,9 @@ export default EStyleSheet.create({
addAccountIcon: {
padding: 10,
},
itemWrapper: {
flexDirection: 'row',
marginVertical: 20,
marginLeft: 48,
},
});

View File

@ -1,9 +1,8 @@
import React, { Component } from 'react';
import { View, Text, ImageBackground } from 'react-native';
import { injectIntl } from 'react-intl';
import {
Thumbnail, List, ListItem, Container,
} from 'native-base';
View, Text, ImageBackground, FlatList, TouchableHighlight,
} from 'react-native';
import { injectIntl } from 'react-intl';
import LinearGradient from 'react-native-linear-gradient';
import FastImage from 'react-native-fast-image';
@ -75,7 +74,7 @@ class SideMenuView extends Component {
: DEFAULT_IMAGE;
return (
<Container style={styles.container}>
<View style={styles.container}>
<LinearGradient
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 0 }}
@ -117,43 +116,49 @@ class SideMenuView extends Component {
</ImageBackground>
</LinearGradient>
<View style={styles.contentView}>
<List
itemDivider={false}
dataArray={menuItems}
renderRow={(item, i) => (
<ListItem
noBorder
<FlatList
data={menuItems}
renderItem={item => (
<TouchableHighlight
style={styles.listItem}
onPress={() => {
if (item.route) {
navigateToRoute(item.route);
if (item.item.route) {
navigateToRoute(item.item.route);
} else {
switchAccount(item.name);
switchAccount(item.item.name);
}
}}
>
{item.icon && (
<Icon iconType="FontAwesome" style={styles.listItemIcon} name={item.icon} />
)}
{item.image && (
<Thumbnail small style={styles.otherUserAvatar} source={item.image} />
)}
<Text style={styles.listItemText}>
{isAddAccountIconActive
? menuItems[menuItems.length - 1].id === item.id
? intl.formatMessage({ id: `side_menu.${item.id}` })
: item.name
:
intl.formatMessage({ id: `side_menu.${item.id}` })
}
</Text>
</ListItem>
<View style={styles.itemWrapper}>
{item.item.icon && (
<Icon
iconType="FontAwesome"
style={styles.listItemIcon}
name={item.item.icon}
/>
)}
{item.item.image && (
<FastImage
style={styles.otherUserAvatar}
source={item.item.image}
defaultSource={DEFAULT_IMAGE}
/>
)}
<Text style={styles.listItemText}>
{isAddAccountIconActive
? menuItems[menuItems.length - 1].id === item.item.id
? intl.formatMessage({ id: `side_menu.${item.item.id}` })
: item.item.name
: intl.formatMessage({ id: `side_menu.${item.item.id}` })}
</Text>
</View>
</TouchableHighlight>
)}
/>
</View>
</Container>
</View>
);
}
}
export default injectIntl(SideMenuView);
export default injectIntl(SideMenuView);

View File

@ -36,7 +36,6 @@ class UpvoteContainer extends Component {
const mapStateToProps = state => ({
isLoggedIn: state.application.isLoggedIn,
// TODO: Remove users as coming props. pass follow current account
currentAccount: state.account.currentAccount,
});

View File

@ -12,7 +12,6 @@ import { Icon } from '../../icon';
// STEEM
import { upvote, upvoteAmount } from '../../../providers/steem/dsteem';
import { decryptKey } from '../../../utils/crypto';
import { getUserData } from '../../../realm/realm';
import { getDigitPinCode } from '../../../providers/steem/auth';
// Styles
@ -27,7 +26,7 @@ class UpvoteView extends Component {
constructor(props) {
super(props);
this.state = {
value: 0.0,
sliderValue: 0.0,
isVoting: false,
isVoted: props.content ? props.content.is_voted : false,
amount: '0.00',
@ -40,59 +39,51 @@ class UpvoteView extends Component {
// Component Functions
_calculateEstimatedAmount = async () => {
const { user } = this.props;
const { currentAccount } = this.props;
// Calculate total vesting shares
if (user) {
const { value } = this.state;
const totalVests = parseFloat(user.vesting_shares)
+ parseFloat(user.received_vesting_shares)
- parseFloat(user.delegated_vesting_shares);
if (currentAccount) {
const { sliderValue } = this.state;
const totalVests = parseFloat(currentAccount.vesting_shares)
+ parseFloat(currentAccount.received_vesting_shares)
- parseFloat(currentAccount.delegated_vesting_shares);
const finalVest = totalVests * 1e6;
const power = (user.voting_power * (value * 10000)) / 10000 / 50;
const power = (currentAccount.voting_power * (sliderValue * 10000)) / 10000 / 50;
const rshares = (power * finalVest) / 10000;
const estimated = await upvoteAmount(rshares);
this.setState({
amount: estimated.toFixed(3),
amount: estimated.toFixed(5),
});
}
};
_upvoteContent = async () => {
const { user, content } = this.props;
const { value } = this.state;
let postingKey;
let userData;
const { currentAccount, content } = this.props;
const { sliderValue } = this.state;
this.setState({
isVoting: true,
});
const digitPinCode = await getDigitPinCode();
await getUserData().then((result) => {
userData = Array.from(result);
postingKey = decryptKey(userData[0].postingKey, digitPinCode);
});
const postingKey = decryptKey(currentAccount.realm_object.postingKey, digitPinCode);
upvote(
{
voter: user && user.name,
voter: currentAccount && currentAccount.username,
author: content && content.author,
permlink: content && content.permlink,
weight: value ? (value * 100).toFixed(0) * 100 : 0,
weight: sliderValue ? (sliderValue * 100).toFixed(0) * 100 : 0,
},
postingKey,
)
.then((res) => {
this.setState({
isVoted: !!value,
isVoted: !!sliderValue,
isVoting: false,
});
})
@ -108,10 +99,10 @@ class UpvoteView extends Component {
render() {
const { isLoggedIn, isShowPayoutValue, content } = this.props;
const {
isVoting, isModalVisible, amount, value, isVoted,
isVoting, isModalVisible, amount, sliderValue, isVoted,
} = this.state;
const _percent = `${(value * 100).toFixed(0)}%`;
const _percent = `${(sliderValue * 100).toFixed(0)}%`;
const _amount = `$${amount}`;
return (
<PopoverController>
@ -184,9 +175,9 @@ class UpvoteView extends Component {
trackStyle={styles.track}
thumbStyle={styles.thumb}
thumbTintColor="#007ee5"
value={value}
value={sliderValue}
onValueChange={(value) => {
this.setState({ value }, () => {
this.setState({ sliderValue: value }, () => {
this._calculateEstimatedAmount();
});
}}

View File

@ -1,15 +1,15 @@
export default [
'https://api.steemit.com',
'https://rpc.esteem.app',
'https://rpc.steemviz.com',
'https://rpc.buildteam.io',
'https://api.steem.house'
'api.steemit.com',
'rpc.esteem.app',
'rpc.steemviz.com',
'rpc.buildteam.io',
'api.steem.house',
];
export const VALUE = [
'https://api.steemit.com',
'https://rpc.esteem.app',
'https://rpc.steemviz.com',
'https://rpc.buildteam.io',
'https://api.steem.house'
'api.steemit.com',
'rpc.esteem.app',
'rpc.steemviz.com',
'rpc.buildteam.io',
'api.steem.house',
];

View File

@ -3,7 +3,7 @@ import { default as ROUTES } from './routeNames';
const authMenuItems = [
{
name: 'Profile',
route: 'Profile',
route: 'ProfileTabbar',
icon: 'user-o',
id: 'profile',
},
@ -43,12 +43,6 @@ const authMenuItems = [
icon: 'gear',
id: 'settings',
},
{
name: 'Add Account',
route: ROUTES.SCREENS.LOGIN,
icon: 'plus-square-o',
id: 'add_account',
},
];
const noAuthMenuItems = [

View File

@ -51,7 +51,7 @@ export default EStyleSheet.create({
height: '$deviceHeight',
},
settingsContainer: {
marginLeft: 48,
marginLeft: 42,
marginRight: 32,
},
});

View File

@ -68,6 +68,7 @@ export const getUser = async (user) => {
const rcPower = await client.call('rc_api', 'find_rc_accounts', { accounts: [user] });
const unreadActivityCount = await getUnreadActivityCount({ user });
account[0].username = account[0].name;
account[0].unread_activity_count = unreadActivityCount;
account[0].rc_manabar = rcPower.rc_accounts[0].rc_manabar;
account[0].steem_power = await vestToSteem(
@ -323,7 +324,12 @@ export const getPostWithComments = async (user, permlink) => {
* @param postingKey private posting key
*/
export const upvote = (vote, postingKey) => {
const key = PrivateKey.fromString(postingKey);
let key;
try {
key = PrivateKey.fromString(postingKey);
} catch (error) {}
return new Promise((resolve, reject) => {
client.broadcast
.vote(vote, key)
@ -353,9 +359,9 @@ export const upvoteAmount = async (input) => {
});
}
const estimated = (input / parseFloat(rewardFund.recent_claims))
const estimated = (input / parseFloat(rewardFund.recent_claims))
* parseFloat(rewardFund.reward_balance)
* parseFloat(medianPrice.base);
* (parseFloat(medianPrice.base) / parseFloat(medianPrice.quote));
return estimated;
};

View File

@ -8,7 +8,6 @@ export const vote = vote => new Promise((resolve, reject) => {
steemConnect
.vote(vote.voter, vote.author, vote.permlink, vote.weight)
.then((result) => {
console.log(result);
resolve(result);
})
.catch((error) => {
@ -32,7 +31,6 @@ export const comment = comment => new Promise((resolve, reject) => {
comment.jsonMetadata,
)
.then((result) => {
console.log(result);
resolve(result);
})
.catch((error) => {
@ -67,7 +65,6 @@ export const post = (post) => {
steemConnect
.broadcast(operations)
.then((result) => {
console.log(result);
resolve(result);
})
.catch((error) => {

View File

@ -115,13 +115,12 @@ class ApplicationContainer extends Component {
const { dispatch } = this.props;
getSettings().then((response) => {
console.log('response :', response);
if (response) {
response.isDarkTheme && dispatch(isDarkTheme(response.isDarkTheme));
response.language && dispatch(setLanguage(response.language));
response.currency && dispatch(setCurrency(response.currency));
response.notification && dispatch(isNotificationOpen(response.notification));
response.server && dispatch(setApi(response.currency));
response.server && dispatch(setApi(response.server));
}
});
};
@ -132,7 +131,6 @@ class ApplicationContainer extends Component {
ws.onmessage = (e) => {
// a message was received
console.log('e.data :', e.data);
dispatch(updateUnreadActivityCount(unreadActivityCount + 1));
};
};

View File

@ -1,7 +1,7 @@
// TODO: Add top users from Surfer
import React from 'react';
import { View, Text } from 'native-base';
import { View, Text } from 'react-native';
class DiscoverPage extends React.Component {
constructor(props) {

View File

@ -1,11 +1,13 @@
import React, { Component } from 'react';
import { Text, TouchableOpacity, View } from 'react-native';
import { Container, Thumbnail } from 'native-base';
import FastImage from 'react-native-fast-image';
import { NumericKeyboard, PinAnimatedInput } from '../../../components';
import styles from './pinCodeStyles';
const DEFAULT_IMAGE = require('../../../assets/avatar_default.png');
class PinCodeScreen extends Component {
constructor(props) {
super(props);
@ -52,9 +54,9 @@ class PinCodeScreen extends Component {
const { pin } = this.state;
return (
<Container style={styles.container}>
<View style={styles.container}>
<View style={styles.logoView}>
<Thumbnail source={avatar} />
<FastImage style={styles.avatar} source={{ uri: avatar }} defaultSource={DEFAULT_IMAGE} />
</View>
<View style={styles.titleView}>
<Text style={styles.title}>{`@${username}`}</Text>
@ -79,7 +81,7 @@ class PinCodeScreen extends Component {
) : (
<View style={styles.forgotButtonView} />
)}
</Container>
</View>
);
}
}

View File

@ -50,4 +50,9 @@ export default EStyleSheet.create({
alignSelf: 'center',
marginBottom: 25,
},
avatar: {
width: 64,
height: 64,
borderRadius: 64 / 2,
},
});

View File

@ -27,17 +27,15 @@ class ProfileContainer extends Component {
constructor(props) {
super(props);
this.state = {
user: null,
comments: [],
replies: [],
follows: {},
isLoggedIn: false,
isLoading: false,
isReverseHeader: false,
isReady: false,
isFollowing: false,
isLoading: false,
isMuted: false,
isProfileLoading: false,
isReady: false,
isReverseHeader: false,
user: null,
};
}
@ -75,13 +73,10 @@ class ProfileContainer extends Component {
this.setState({
isReady: true,
comments: result,
refreshing: false,
isLoading: false,
});
})
.catch((err) => {
console.log(err);
});
.catch((err) => {});
};
_handleFollowUnfollowUser = async (isFollowAction) => {
@ -256,13 +251,12 @@ class ProfileContainer extends Component {
isFollowing,
isMuted,
isLoading,
isLoggedIn,
isReady,
isReverseHeader,
user,
username,
} = this.state;
const { isDarkTheme } = this.props;
const { isDarkTheme, isLoggedIn } = this.props;
return (
<Fragment>
@ -271,19 +265,19 @@ class ProfileContainer extends Component {
comments={comments}
error={error}
follows={follows}
handleOnFollowsPress={this._handleFollowsPress}
handleFollowUnfollowUser={this._handleFollowUnfollowUser}
handleMuteUnmuteUser={this._handleMuteUnmuteUser}
isProfileLoading={isProfileLoading}
handleOnFollowsPress={this._handleFollowsPress}
isDarkTheme={isDarkTheme}
isFollowing={isFollowing}
isLoading={isLoading}
isLoggedIn={isLoggedIn}
isReady={isReady}
isMuted={isMuted}
isProfileLoading={isProfileLoading}
isReady={isReady}
isReverseHeader={isReverseHeader}
user={user}
username={username}
isDarkTheme={isDarkTheme}
/>
</Fragment>
);

View File

@ -1,4 +1,3 @@
/* eslint-disable no-unused-vars */
import React, { Component, Fragment } from 'react';
import { View, ScrollView } from 'react-native';
import { injectIntl } from 'react-intl';
@ -17,7 +16,6 @@ import { Wallet } from '../../../components/wallet';
// Utilitites
import { getFormatedCreatedDate } from '../../../utils/time';
import { getRcPower, getVotingPower } from '../../../utils/manaBar';
import parseToken from '../../../utils/parseToken';
// Styles
import styles from './profileStyles';
@ -92,7 +90,6 @@ class ProfileScreen extends Component {
// locked={!isLoggedIn}
>
<ProfileSummary
intl={intl}
coverImage={coverImage}
date={getFormatedCreatedDate(user && user.created)}
followerCount={follows.follower_count}
@ -102,6 +99,7 @@ class ProfileScreen extends Component {
handleOnFollowsPress={handleOnFollowsPress}
hoursRC={fullInHourRC || null}
hoursVP={fullInHourVP || null}
intl={intl}
isDarkTheme={isDarkTheme}
isFollowing={isFollowing}
isLoggedIn={isLoggedIn}

View File

@ -5,7 +5,7 @@ export default EStyleSheet.create({
container: {
flex: 1,
top: StatusBar.currentHeight,
backgroundColor: '$primaryGrayBackground',
backgroundColor: '$primaryLightBackground',
},
content: {
backgroundColor: '$primaryGrayBackground',

View File

@ -114,7 +114,6 @@ class SettingsContainer extends Component {
break;
case 'button':
console.log(action + type);
break;
default:

View File

@ -1,485 +0,0 @@
import React, { Component } from 'react';
import { Text, Picker, View } from 'react-native';
import Slider from 'react-native-slider';
import {
Container, Button, Content, Card, Input,
} from 'native-base';
import { getUserData, getAuthStatus } from '../../realm/realm';
import {
getUser,
transferToken,
delegate,
globalProps,
transferToVesting,
withdrawVesting,
} from '../../providers/steem/dsteem';
import { decryptKey } from '../../utils/crypto';
class WalletPage extends Component {
constructor(props) {
super(props);
this.state = {
receiver: '',
amount: '',
asset: 'STEEM',
memo: '',
user: {},
avail: '',
globalProps: '',
vestSteem: '',
percent: 0.05,
value: 0.0,
};
}
async componentDidMount() {
let isLoggedIn;
let user;
let userData;
let avail;
let vestSteem;
let globalProperties;
await getAuthStatus().then((res) => {
isLoggedIn = res.isLoggedIn;
});
if (isLoggedIn) {
await getUserData().then((res) => {
userData = Array.from(res);
});
user = await getUser(userData[0].username);
await this.setState({
user,
});
globalProperties = await globalProps();
avail = parseFloat(this.state.user.vesting_shares)
- (parseFloat(this.state.user.to_withdraw)
- parseFloat(this.state.user.withdrawn))
/ 1e6
- parseFloat(this.state.user.delegated_vesting_shares);
vestSteem = parseFloat(
parseFloat(globalProperties.total_vesting_fund_steem)
* (parseFloat(avail)
/ parseFloat(globalProperties.total_vesting_shares)),
6,
);
console.log(avail);
console.log(vestSteem);
console.log(globalProperties);
console.log(
(parseFloat(globalProperties.total_vesting_fund_steem)
/ parseFloat(globalProperties.total_vesting_shares))
* parseFloat(avail * this.state.value),
);
await this.setState({
avail,
vestSteem,
globalProps: globalProperties,
});
}
}
sendSteem = async () => {
let userData;
let activeKey;
transferData = {
from: this.state.user.name,
to: this.state.receiver,
amount: `${this.state.amount} ${this.state.asset}`,
memo: this.state.memo,
};
await getUserData()
.then((result) => {
userData = Array.from(result);
activeKey = userData[0].activeKey;
console.log(userData);
console.log(activeKey);
})
.then(() => {
activeKey = decryptKey(activeKey, 'pinCode');
transferToken(transferData, activeKey);
})
.catch((error) => {
console.log(error);
});
};
delegateSP = async () => {
let userData;
let activeKey;
vestSteem = parseFloat(
parseFloat(this.state.globalProps.total_vesting_fund_steem)
* (parseFloat(this.state.avail * this.state.value)
/ parseFloat(this.state.globalProps.total_vesting_shares)),
6,
);
const toWithdraw = (vestSteem * 1e6)
/ (parseFloat(this.state.globalProps.total_vesting_fund_steem)
/ (parseFloat(this.state.globalProps.total_vesting_shares) / 1e6));
console.log(toWithdraw);
data = {
delegator: this.state.user.name,
delegatee: 'demo',
vesting_shares: `${toWithdraw.toFixed(6)} VESTS`,
};
await getUserData().then((res) => {
userData = Array.from(res);
});
activeKey = decryptKey(userData[0].activeKey, 'pinCode');
delegate(data, activeKey)
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
};
powerUpSteem = async () => {
let userData;
let activeKey;
await getUserData().then((res) => {
userData = Array.from(res);
});
activeKey = decryptKey(userData[0].activeKey, 'pinCode');
const data = {
from: this.state.user.name,
to: 'hsynterkr',
amount: '001.000 STEEM',
};
transferToVesting(data, activeKey)
.then((res) => {
console.log(res);
})
.catch((error) => {
console.log(error);
});
};
powerDownSteem = async () => {
let userData;
let activeKey;
let avail;
await getUserData().then((res) => {
userData = Array.from(res);
});
activeKey = decryptKey(userData[0].activeKey, 'pinCode');
avail = parseFloat(this.state.user.vesting_shares)
- (parseFloat(this.state.user.to_withdraw)
- parseFloat(this.state.user.withdrawn))
/ 1e6
- parseFloat(this.state.user.delegated_vesting_shares);
const vestSteem = parseFloat(
parseFloat(this.state.globalProps.total_vesting_fund_steem)
* (parseFloat(avail * this.state.value)
/ parseFloat(this.state.globalProps.total_vesting_shares)),
6,
);
const toWithdraw = (vestSteem * 1e6)
/ (parseFloat(this.state.globalProps.total_vesting_fund_steem)
/ (parseFloat(this.state.globalProps.total_vesting_shares) / 1e6));
const data = {
account: this.state.user.name,
vesting_shares: `${toWithdraw.toFixed(6)} VESTS`,
};
withdrawVesting(data, activeKey)
.then((result) => {
console.log(result);
})
.catch((error) => {
console.log(error);
});
};
render() {
return (
<Container>
<Content>
<Card>
<Text>
STEEM Balance:
{this.state.user.balance}
</Text>
</Card>
<Card>
<Text>
SBD Balance:
{this.state.user.sbd_balance}
</Text>
</Card>
<Card>
<Text>
STEEM Power:
{this.state.user.steem_power}
{' '}
SP
</Text>
<Text>
Received STEEM Power:
{' '}
{this.state.user.received_steem_power}
{' '}
SP
</Text>
<Text>
Delegated Power Power:
{' '}
{this.state.user.delegated_steem_power}
{' '}
SP
</Text>
</Card>
<Card>
<Text>
Saving STEEM Balance:
{this.state.user.savings_balance}
</Text>
<Text>
Saving STEEM Balance:
{' '}
{this.state.user.savings_sbd_balance}
</Text>
</Card>
<Card>
<Input
style={{
borderColor: 'lightgray',
borderWidth: 1,
borderRadius: 20,
margin: 10,
}}
autoCapitalize="none"
placeholder="Recipient"
onChangeText={user => this.setState({ receiver: user })}
value={this.state.receiver}
/>
<Input
style={{
borderColor: 'lightgray',
borderWidth: 1,
borderRadius: 20,
margin: 10,
}}
placeholder="amount"
onChangeText={amount => this.setState({ amount })}
value={this.state.amount}
/>
<Input
style={{
borderColor: 'lightgray',
borderWidth: 1,
borderRadius: 20,
margin: 10,
}}
placeholder="memo"
onChangeText={memo => this.setState({ memo })}
value={this.state.memo}
/>
<View style={{ flexDirection: 'row' }}>
<Picker
note
mode="dropdown"
style={{ width: 120, flex: 0.5 }}
selectedValue={this.state.asset}
onValueChange={(itemValue, itemIndex) => this.setState({ asset: itemValue })
}
>
<Picker.Item label="STEEM" value="STEEM" />
<Picker.Item label="SBD" value="SBD" />
</Picker>
<Button onPress={this.sendSteem} style={{ margin: 10 }}>
<Text style={{ color: 'white' }}>Send</Text>
</Button>
</View>
<View
style={{
margin: 5,
padding: 5,
borderWidth: 1,
borderColor: 'gray',
borderRadius: 10,
}}
>
<Slider
style={{ flex: 0.75 }}
minimumTrackTintColor="#13a9d6"
trackStyle={{ height: 2, borderRadius: 1 }}
thumbStyle={{
width: 30,
height: 30,
borderRadius: 15,
backgroundColor: 'white',
shadowColor: 'black',
shadowOffset: { width: 0, height: 2 },
shadowRadius: 2,
shadowOpacity: 0.35,
}}
thumbTintColor="#007ee5"
value={this.state.value}
onValueChange={(value) => {
this.setState({
value,
percent: Math.floor(value.toFixed(2) * 100),
});
}}
/>
<Text>
Total:
{' '}
{(parseInt(this.state.vestSteem) * this.state.percent) / 100}
{' '}
SP
</Text>
<Text>
{Math.floor(this.state.value * 100)}
%
</Text>
<Button
onPress={this.delegateSP}
style={{ margin: 10, alignSelf: 'flex-end' }}
>
<Text style={{ color: 'white' }}>Delegate</Text>
</Button>
</View>
<View
style={{
margin: 5,
padding: 5,
borderWidth: 1,
borderColor: 'gray',
borderRadius: 10,
}}
>
<Button
onPress={this.powerUpSteem}
style={{ margin: 10, alignSelf: 'flex-start' }}
>
<Text style={{ color: 'white' }}>Power Up</Text>
</Button>
</View>
<View
style={{
margin: 5,
padding: 5,
borderWidth: 1,
borderColor: 'gray',
borderRadius: 10,
}}
>
<Slider
style={{ flex: 0.75 }}
minimumTrackTintColor="#13a9d6"
trackStyle={{ height: 2, borderRadius: 1 }}
thumbStyle={{
width: 30,
height: 30,
borderRadius: 15,
backgroundColor: 'white',
shadowColor: 'black',
shadowOffset: { width: 0, height: 2 },
shadowRadius: 2,
shadowOpacity: 0.35,
}}
thumbTintColor="#007ee5"
value={this.state.value}
onValueChange={(value) => {
this.setState(
{
value,
percent: Math.floor(value.toFixed(2) * 100),
},
() => {
const avail = parseFloat(this.state.user.vesting_shares)
- (parseFloat(this.state.user.to_withdraw)
- parseFloat(this.state.user.withdrawn))
/ 1e6
- parseFloat(this.state.user.delegated_vesting_shares);
const vestSteem = parseFloat(
parseFloat(
this.state.globalProps.total_vesting_fund_steem,
)
* (parseFloat(avail * this.state.value)
/ parseFloat(
this.state.globalProps.total_vesting_shares,
)),
6,
);
console.log(vestSteem);
console.log(
(vestSteem * 1e6)
/ (parseFloat(
this.state.globalProps.total_vesting_fund_steem,
)
/ (parseFloat(
this.state.globalProps.total_vesting_shares,
)
/ 1e6)),
);
},
);
}}
/>
<Text>
Total Steem Power:
{' '}
{(parseInt(this.state.vestSteem) * this.state.percent) / 100}
{' '}
SP
</Text>
<Text>
Estimated Weekly:
{' '}
{Math.floor(
((
(parseInt(this.state.vestSteem) * this.state.percent)
/ 100
).toFixed(0)
/ 13)
* 100,
) / 100}
{' '}
SP
</Text>
<Text>
{Math.floor(this.state.value * 100)}
%
</Text>
<Button
onPress={this.powerDownSteem}
style={{ margin: 10, alignSelf: 'flex-end' }}
>
<Text style={{ color: 'white' }}>Power Down</Text>
</Button>
</View>
</Card>
</Content>
</Container>
);
}
}
export default WalletPage;

View File

@ -1,15 +0,0 @@
import EStyleSheet from 'react-native-extended-stylesheet';
export default EStyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
input: {
backgroundColor: '$primaryGray',
borderRadius: 5,
padding: 15,
minWidth: '$deviceWidth / 2',
},
});

174
yarn.lock
View File

@ -823,7 +823,7 @@ ansi-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
ansi-styles@^2.1.0, ansi-styles@^2.2.1:
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
@ -1418,11 +1418,6 @@ bl@^1.0.0:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
blueimp-md5@^2.5.0:
version "2.10.0"
resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.10.0.tgz#02f0843921f90dca14f5b8920a38593201d6964d"
integrity sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ==
bn.js@^4.11.3, bn.js@^4.4.0:
version "4.11.8"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
@ -1662,17 +1657,6 @@ caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
chalk@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.1.tgz#509afb67066e7499f7eb3535c77445772ae2d019"
integrity sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=
dependencies:
ansi-styles "^2.1.0"
escape-string-regexp "^1.0.2"
has-ansi "^2.0.0"
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@ -1804,7 +1788,7 @@ collection-visit@^1.0.0:
map-visit "^1.0.0"
object-visit "^1.0.0"
color-convert@^1.8.2, color-convert@^1.9.0:
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@ -1816,32 +1800,11 @@ color-name@1.1.3:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
color-name@^1.0.0:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-string@^1.4.0:
version "1.5.3"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
color@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/color/-/color-1.0.3.tgz#e48e832d85f14ef694fb468811c2d5cfe729b55d"
integrity sha1-5I6DLYXxTvaU+0aIEcLVz+cptV0=
dependencies:
color-convert "^1.8.2"
color-string "^1.4.0"
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
@ -3277,14 +3240,6 @@ fs-extra@^1.0.0:
jsonfile "^2.1.0"
klaw "^1.0.0"
fs-extra@^2.0.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35"
integrity sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=
dependencies:
graceful-fs "^4.1.2"
jsonfile "^2.1.0"
fs-extra@^4.0.2:
version "4.0.3"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
@ -3581,11 +3536,6 @@ hmac-drbg@^1.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
hoist-non-react-statics@^1.0.5:
version "1.2.0"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb"
integrity sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=
hoist-non-react-statics@^2.2.0, hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0, hoist-non-react-statics@^2.5.5:
version "2.5.5"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
@ -3865,11 +3815,6 @@ is-arrayish@^0.2.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
is-arrayish@^0.3.1:
version "0.3.2"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@ -4421,11 +4366,6 @@ jest-mock@^23.2.0:
resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134"
integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=
jest-react-native@^18.0.0:
version "18.0.0"
resolved "https://registry.yarnpkg.com/jest-react-native/-/jest-react-native-18.0.0.tgz#77dd909f069324599f227c58c61c2e62168726ba"
integrity sha1-d92QnwaTJFmfInxYxhwuYhaHJro=
jest-regex-util@^23.3.0:
version "23.3.0"
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"
@ -4956,12 +4896,7 @@ lodash.unescape@4.0.1:
resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
lodash@4.17.10:
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==
lodash@^4.0.0, lodash@^4.10.1, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1:
lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
@ -5532,36 +5467,6 @@ nanomatch@^1.2.9:
snapdragon "^0.8.1"
to-regex "^3.0.1"
native-base-shoutem-theme@0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/native-base-shoutem-theme/-/native-base-shoutem-theme-0.2.2.tgz#5823310455fe391adf72236469c039fd44f56a20"
integrity sha1-WCMxBFX+ORrfciNkacA5/UT1aiA=
dependencies:
hoist-non-react-statics "^1.0.5"
lodash "^4.10.1"
prop-types "^15.5.10"
native-base@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/native-base/-/native-base-2.8.1.tgz#8004a9dcfb69284137741857c3db880788f65581"
integrity sha512-PCAJ2I8gnUia+HV9deT4CusX8Uk+w52xgPLHuo0OQOgo7cZjw7EAaCGWSFlUk7cBsDjswV5PvLzPMujYh8TkwQ==
dependencies:
blueimp-md5 "^2.5.0"
clamp "^1.0.1"
color "~1.0.3"
fs-extra "^2.0.0"
jest-react-native "^18.0.0"
lodash "4.17.10"
native-base-shoutem-theme "0.2.2"
print-message "^2.1.0"
prop-types "^15.5.10"
react-native-drawer "2.5.0"
react-native-easy-grid "0.2.0"
react-native-keyboard-aware-scroll-view "0.5.0"
react-native-vector-icons "4.6.0"
react-tween-state "^0.1.5"
tween-functions "^1.0.1"
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@ -6215,13 +6120,6 @@ pretty-format@^4.2.1:
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.3.1.tgz#530be5c42b3c05b36414a7a2a4337aa80acd0e8d"
integrity sha1-UwvlxCs8BbNkFKeipDN6qArNDo0=
print-message@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/print-message/-/print-message-2.1.0.tgz#b5588ed08b0e1bf77ac7bcb5cb78004afaf9a891"
integrity sha1-tViO0IsOG/d6x7y1y3gASvr5qJE=
dependencies:
chalk "1.1.1"
private@^0.1.6, private@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@ -6316,13 +6214,6 @@ querystringify@^2.0.0:
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef"
integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==
raf@^3.1.0:
version "3.4.1"
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
dependencies:
performance-now "^2.1.0"
randomatic@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
@ -6386,6 +6277,11 @@ react-lifecycles-compat@^3, react-lifecycles-compat@^3.0.0, react-lifecycles-com
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-native-actionsheet@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/react-native-actionsheet/-/react-native-actionsheet-2.4.2.tgz#6a00dd51a75ef2c8974312130e405af73191500f"
integrity sha512-DBoWIvVwuWXuptF4t46pBqkFxaUxS+rsIdHiA05t0n4BdTIDV2R4s9bLEUVOGzb94D7VxIamsXZPA/3mmw+SXg==
react-native-animatable@^1.2.4:
version "1.3.0"
resolved "https://registry.yarnpkg.com/react-native-animatable/-/react-native-animatable-1.3.0.tgz#b5c3940fc758cfd9b2fe54613a457c4b6962b46e"
@ -6417,21 +6313,6 @@ react-native-drawer-layout@1.3.2:
dependencies:
react-native-dismiss-keyboard "1.0.0"
react-native-drawer@2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/react-native-drawer/-/react-native-drawer-2.5.0.tgz#022cba5c0516126a9fc9cce3185cb46c644b51c4"
integrity sha512-I8rGv0EM6PxRWeq8g463OBt4DYoTri7v9rh98Qpg9q/JToZYTIjavjY0BwchDwyV7J5LdAg7IPbfZUYBkZJsZQ==
dependencies:
prop-types "^15.5.8"
tween-functions "^1.0.1"
react-native-easy-grid@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/react-native-easy-grid/-/react-native-easy-grid-0.2.0.tgz#4718031aa1baaa2613b829fc807da288eb0d2797"
integrity sha512-ZTi84+nJq2wwov55s1rHez0twk/8bs/AGnA5ERF8eYsMbOhBhOzzclj+TyY+/woB/2REAd9QQmWmIT/L999n6Q==
dependencies:
lodash "^4.11.1"
react-native-extended-stylesheet@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/react-native-extended-stylesheet/-/react-native-extended-stylesheet-0.10.0.tgz#bc77caf7494dcc67f681128dd8cb5e07dacef9dd"
@ -6471,19 +6352,11 @@ react-native-image-crop-picker@^0.21.3:
resolved "https://registry.yarnpkg.com/react-native-image-crop-picker/-/react-native-image-crop-picker-0.21.3.tgz#04457a3f2a888949f51be4a670dcf2520b9994f8"
integrity sha512-qzY8aSYZxH4L9XYRk4V1n8x1gfq+ykNG0Kc0a9ne+JWwAQkf2P8aTKeNd4noNFZEOSJBiD4XXE/pbX55dQ5F3g==
react-native-iphone-x-helper@^1.0.1, react-native-iphone-x-helper@^1.0.3:
react-native-iphone-x-helper@^1.0.3:
version "1.2.0"
resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.0.tgz#9f8a376eb00bc712115abff4420318a0063fa796"
integrity sha512-xIeTo4s77wwKgBZLVRIZC9tM9/PkXS46Ul76NXmvmixEb3ZwqGdQesR3zRiLMOoIdfOURB6N9bba9po7+x9Bag==
react-native-keyboard-aware-scroll-view@0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.5.0.tgz#57ab933089375bf62f4324797e8be949ad97849d"
integrity sha512-nGXsACZBCiWuwRrZy+UjiSJqb4tZ/6ePHUSY8M+09g4VfNm/ogvvWpwBa6B999NZ6DwhZTKBjVWeZxX9XG8bbQ==
dependencies:
prop-types "^15.6.0"
react-native-iphone-x-helper "^1.0.1"
react-native-keyboard-aware-scroll-view@^0.7.2:
version "0.7.4"
resolved "https://registry.yarnpkg.com/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.7.4.tgz#80fb4b56f3c5cb399da0c6832ec52729856ac08a"
@ -6576,15 +6449,6 @@ react-native-tab-view@^1.0.0:
dependencies:
prop-types "^15.6.1"
react-native-vector-icons@4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/react-native-vector-icons/-/react-native-vector-icons-4.6.0.tgz#e4014311ffa6de397d914ffc31b7097a874cc8d5"
integrity sha512-rpfhfPiXCK2PX1nrNhdxSMrEGB/Gw/SvKoPM0G2wAkSoqynnes19K0VYI+Up7DqR1rFIpE4hP2erpT1tNx2tfg==
dependencies:
lodash "^4.0.0"
prop-types "^15.5.10"
yargs "^8.0.2"
react-native-vector-icons@^6.0.2:
version "6.1.0"
resolved "https://registry.yarnpkg.com/react-native-vector-icons/-/react-native-vector-icons-6.1.0.tgz#770a3f8ced692d75deb3afbb9829195ceed1eedd"
@ -6756,14 +6620,6 @@ react-transform-hmr@^1.0.4:
global "^4.3.0"
react-proxy "^1.1.7"
react-tween-state@^0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/react-tween-state/-/react-tween-state-0.1.5.tgz#e98b066551efb93cb92dd1be14995c2e3deae339"
integrity sha1-6YsGZVHvuTy5LdG+FJlcLj3q4zk=
dependencies:
raf "^3.1.0"
tween-functions "^1.0.1"
react@^16.6.0-alpha.8af6728:
version "16.6.3"
resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c"
@ -7416,13 +7272,6 @@ simple-plist@^0.2.1:
bplist-parser "0.1.1"
plist "2.0.1"
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
dependencies:
is-arrayish "^0.3.1"
sisteransi@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
@ -8012,11 +7861,6 @@ tunnel-agent@^0.6.0:
dependencies:
safe-buffer "^5.0.1"
tween-functions@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/tween-functions/-/tween-functions-1.2.0.tgz#1ae3a50e7c60bb3def774eac707acbca73bbc3ff"
integrity sha1-GuOlDnxguz3vd06scHrLynO7w/8=
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"