mirror of
https://github.com/ecency/ecency-mobile.git
synced 2024-12-26 14:54:19 +03:00
Merge branch 'master' of https://github.com/esteemapp/esteem-mobile into nodelist
This commit is contained in:
commit
abf2213571
@ -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",
|
||||
|
@ -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 }}
|
||||
|
@ -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}
|
||||
|
@ -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,
|
||||
|
@ -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 => (
|
||||
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
@ -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()}
|
||||
|
@ -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)}
|
||||
|
@ -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;
|
@ -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>
|
||||
);
|
||||
}
|
||||
}
|
@ -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,
|
||||
|
@ -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 (
|
||||
|
@ -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,
|
||||
},
|
||||
});
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
});
|
||||
}}
|
||||
|
@ -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',
|
||||
];
|
||||
|
@ -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 = [
|
||||
|
@ -51,7 +51,7 @@ export default EStyleSheet.create({
|
||||
height: '$deviceHeight',
|
||||
},
|
||||
settingsContainer: {
|
||||
marginLeft: 48,
|
||||
marginLeft: 42,
|
||||
marginRight: 32,
|
||||
},
|
||||
});
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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) => {
|
||||
|
@ -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));
|
||||
};
|
||||
};
|
||||
|
@ -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) {
|
||||
|
@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -50,4 +50,9 @@ export default EStyleSheet.create({
|
||||
alignSelf: 'center',
|
||||
marginBottom: 25,
|
||||
},
|
||||
avatar: {
|
||||
width: 64,
|
||||
height: 64,
|
||||
borderRadius: 64 / 2,
|
||||
},
|
||||
});
|
||||
|
@ -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>
|
||||
);
|
||||
|
@ -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}
|
||||
|
@ -5,7 +5,7 @@ export default EStyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
top: StatusBar.currentHeight,
|
||||
backgroundColor: '$primaryGrayBackground',
|
||||
backgroundColor: '$primaryLightBackground',
|
||||
},
|
||||
content: {
|
||||
backgroundColor: '$primaryGrayBackground',
|
||||
|
@ -114,7 +114,6 @@ class SettingsContainer extends Component {
|
||||
break;
|
||||
|
||||
case 'button':
|
||||
console.log(action + type);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -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;
|
@ -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
174
yarn.lock
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user