Merge branch 'development' into bugfix/navigation

This commit is contained in:
Feruz M 2019-12-13 14:11:54 +02:00 committed by GitHub
commit 5af359bf66
21 changed files with 576 additions and 539 deletions

View File

@ -929,7 +929,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = app.esteem.mobile.ios;
PRODUCT_NAME = eSteem;
PROVISIONING_PROFILE_SPECIFIER = dev09Dec;
PROVISIONING_PROFILE_SPECIFIER = dev;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};

View File

@ -4,7 +4,5 @@
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.associated-domains</key>
<array/>
</dict>
</plist>

View File

@ -67,7 +67,6 @@
"react-native-navigation-bar-color": "^0.1.0",
"react-native-reanimated": "^1.3.0",
"react-native-render-html": "^4.1.2",
"react-native-screens": "^2.0.0-alpha.16",
"react-native-scrollable-tab-view": "esteemapp/react-native-scrollable-tab-view",
"react-native-slider": "^0.11.0",
"react-native-snap-carousel": "^3.8.0",

View File

@ -37,6 +37,7 @@ export default EStyleSheet.create({
position: 'absolute',
right: 0,
bottom: -10,
padding: 10,
},
voteCountText: {
alignSelf: 'center',

View File

@ -1,7 +1,7 @@
import React, { PureComponent, Fragment } from 'react';
import React, { Fragment, useState, useRef } from 'react';
import { View, TouchableWithoutFeedback } from 'react-native';
import ActionSheet from 'react-native-actionsheet';
import { injectIntl } from 'react-intl';
import { useIntl } from 'react-intl';
import get from 'lodash/get';
import { getTimeFromNow } from '../../../utils/time';
@ -17,177 +17,162 @@ import { TextWithIcon } from '../../basicUIElements';
// Styles
import styles from './commentStyles';
class CommentView extends PureComponent {
/* Props
* ------------------------------------------------
* @prop { type } name - Description....
*/
constructor(props) {
super(props);
this.state = {
isShowSubComments: props.isShowSubComments || false,
isPressedShowButton: false,
};
}
// Component Life Cycles
// Component Functions
_showSubCommentsToggle = () => {
const { isShowSubComments } = this.state;
this.setState({ isShowSubComments: !isShowSubComments, isPressedShowButton: true });
const CommentView = ({
avatarSize,
comment,
commentNumber,
currentAccountUsername,
fetchPost,
handleDeleteComment,
handleOnEditPress,
handleOnLongPress,
handleOnReplyPress,
handleOnUserPress,
handleOnVotersPress,
isLoggedIn,
isShowComments,
isShowMoreButton,
marginLeft,
voteCount,
mainAuthor = { mainAuthor },
isHideImage,
showAllComments,
isShowSubComments,
hideManyCommentsButton,
}) => {
const [_isShowSubComments, setIsShowSubComments] = useState(isShowSubComments || false);
const [isPressedShowButton, setIsPressedShowButton] = useState(false);
const intl = useIntl();
const actionSheet = useRef(null);
const _showSubCommentsToggle = () => {
setIsShowSubComments(!_isShowSubComments);
setIsPressedShowButton(true);
};
render() {
const {
avatarSize,
comment,
commentNumber,
currentAccountUsername,
fetchPost,
handleDeleteComment,
handleOnEditPress,
handleOnLongPress,
handleOnReplyPress,
handleOnUserPress,
handleOnVotersPress,
isLoggedIn,
isShowComments,
isShowMoreButton,
marginLeft,
voteCount,
intl,
mainAuthor = { mainAuthor },
isHideImage,
} = this.props;
const { isShowSubComments, isPressedShowButton } = this.state;
return (
<TouchableWithoutFeedback onLongPress={handleOnLongPress}>
<View>
<PostHeaderDescription
key={comment.permlink}
date={getTimeFromNow(comment.created)}
name={comment.author}
reputation={comment.author_reputation}
size={avatarSize || 24}
currentAccountUsername={currentAccountUsername}
isShowOwnerIndicator={mainAuthor === comment.author}
isHideImage={isHideImage}
return (
<TouchableWithoutFeedback onLongPress={handleOnLongPress}>
<View>
<PostHeaderDescription
key={comment.permlink}
date={getTimeFromNow(comment.created)}
name={comment.author}
reputation={comment.author_reputation}
size={avatarSize || 24}
currentAccountUsername={currentAccountUsername}
isShowOwnerIndicator={mainAuthor === comment.author}
isHideImage={isHideImage}
/>
<View style={[{ marginLeft: marginLeft || 29 }, styles.bodyWrapper]}>
<PostBody
isComment
commentDepth={comment.depth}
handleOnUserPress={handleOnUserPress}
body={comment.body}
textSelectable={false}
/>
<View style={[{ marginLeft: marginLeft || 29 }, styles.bodyWrapper]}>
<PostBody
isComment
commentDepth={comment.depth}
handleOnUserPress={handleOnUserPress}
body={comment.body}
textSelectable={false}
/>
<View style={styles.footerWrapper}>
{isLoggedIn && (
<Fragment>
<Upvote isShowPayoutValue content={comment} />
<TextWithIcon
iconName="heart-outline"
iconSize={20}
wrapperStyle={styles.leftButton}
iconType="MaterialCommunityIcons"
isClickable
onPress={() =>
handleOnVotersPress &&
voteCount > 0 &&
handleOnVotersPress(get(comment, 'active_votes'))
}
text={voteCount}
textMarginLeft={20}
textStyle={styles.voteCountText}
/>
<IconButton
size={20}
iconStyle={styles.leftIcon}
style={styles.leftButton}
name="comment-outline"
onPress={() => handleOnReplyPress && handleOnReplyPress(comment)}
iconType="MaterialCommunityIcons"
/>
{currentAccountUsername === comment.author && (
<Fragment>
<IconButton
size={20}
iconStyle={styles.leftIcon}
style={styles.leftButton}
name="create"
onPress={() => handleOnEditPress && handleOnEditPress(comment)}
iconType="MaterialIcons"
/>
{!comment.children && !voteCount && (
<Fragment>
<IconButton
size={20}
iconStyle={styles.leftIcon}
style={styles.leftButton}
name="delete-forever"
onPress={() => this.ActionSheet.show()}
iconType="MaterialIcons"
/>
<ActionSheet
// eslint-disable-next-line no-return-assign
ref={o => (this.ActionSheet = o)}
options={[
intl.formatMessage({ id: 'alert.delete' }),
intl.formatMessage({ id: 'alert.cancel' }),
]}
title={intl.formatMessage({ id: 'alert.delete' })}
destructiveButtonIndex={0}
cancelButtonIndex={1}
onPress={index => {
index === 0 ? handleDeleteComment(comment.permlink) : null;
}}
/>
</Fragment>
)}
</Fragment>
)}
</Fragment>
)}
{isShowMoreButton && (
<View style={styles.rightButtonWrapper}>
<TextWithIcon
wrapperStyle={styles.rightButton}
iconName={isShowSubComments ? 'keyboard-arrow-up' : 'keyboard-arrow-down'}
textStyle={!isPressedShowButton && styles.moreText}
iconType="MaterialIcons"
isClickable
iconStyle={styles.iconStyle}
iconSize={16}
onPress={() => this._showSubCommentsToggle()}
text={!isPressedShowButton ? `${comment.children} more replies` : ''}
/>
</View>
)}
</View>
{isShowSubComments && commentNumber > 0 && (
<Comments
isShowComments={isShowComments}
commentNumber={commentNumber && commentNumber * 2}
marginLeft={20}
isShowSubComments={isShowSubComments}
avatarSize={avatarSize || 16}
author={comment.author}
permlink={comment.permlink}
commentCount={comment.children}
isShowMoreButton={false}
fetchPost={fetchPost}
mainAuthor={mainAuthor}
/>
<View style={styles.footerWrapper}>
{isLoggedIn && (
<Fragment>
<Upvote isShowPayoutValue content={comment} />
<TextWithIcon
iconName="people"
iconSize={20}
wrapperStyle={styles.leftButton}
iconType="MaterialIcons"
isClickable
onPress={() =>
handleOnVotersPress &&
voteCount > 0 &&
handleOnVotersPress(get(comment, 'active_votes'))
}
text={voteCount}
textMarginLeft={20}
textStyle={styles.voteCountText}
/>
<IconButton
size={20}
iconStyle={styles.leftIcon}
style={styles.leftButton}
name="reply"
onPress={() => handleOnReplyPress && handleOnReplyPress(comment)}
iconType="MaterialIcons"
/>
{currentAccountUsername === comment.author && (
<Fragment>
<IconButton
size={20}
iconStyle={styles.leftIcon}
style={styles.leftButton}
name="create"
onPress={() => handleOnEditPress && handleOnEditPress(comment)}
iconType="MaterialIcons"
/>
{!comment.children && !voteCount && (
<Fragment>
<IconButton
size={20}
iconStyle={styles.leftIcon}
style={styles.leftButton}
name="delete-forever"
onPress={() => actionSheet.current.show()}
iconType="MaterialIcons"
/>
<ActionSheet
ref={actionSheet}
options={[
intl.formatMessage({ id: 'alert.delete' }),
intl.formatMessage({ id: 'alert.cancel' }),
]}
title={intl.formatMessage({ id: 'alert.delete' })}
destructiveButtonIndex={0}
cancelButtonIndex={1}
onPress={index => {
index === 0 ? handleDeleteComment(comment.permlink) : null;
}}
/>
</Fragment>
)}
</Fragment>
)}
</Fragment>
)}
{!showAllComments && isShowMoreButton && (
<View style={styles.rightButtonWrapper}>
<TextWithIcon
wrapperStyle={styles.rightButton}
iconName={_isShowSubComments ? 'keyboard-arrow-up' : 'keyboard-arrow-down'}
textStyle={!isPressedShowButton && styles.moreText}
iconType="MaterialIcons"
isClickable
iconStyle={styles.iconStyle}
iconSize={16}
onPress={() => _showSubCommentsToggle()}
text={!isPressedShowButton ? `${comment.children} more replies` : ''}
/>
</View>
)}
</View>
{_isShowSubComments && commentNumber > 0 && (
<Comments
isShowComments={isShowComments}
commentNumber={commentNumber + 1}
marginLeft={20}
isShowSubComments={true}
avatarSize={avatarSize || 16}
author={comment.author}
permlink={comment.permlink}
commentCount={comment.children}
isShowMoreButton={false}
hasManyComments={commentNumber === 5 && get(comment, 'children') > 0}
fetchPost={fetchPost}
hideManyCommentsButton={hideManyCommentsButton}
mainAuthor={mainAuthor}
/>
)}
</View>
</TouchableWithoutFeedback>
);
}
}
</View>
</TouchableWithoutFeedback>
);
};
export default injectIntl(CommentView);
export default CommentView;

View File

@ -261,11 +261,16 @@ class CommentsContainer extends Component {
isOwnProfile,
isHideImage,
isShowSubComments,
hasManyComments,
showAllComments,
hideManyCommentsButton,
} = this.props;
return (
<CommentsView
key={selectedFilter}
hasManyComments={hasManyComments}
hideManyCommentsButton={hideManyCommentsButton}
selectedFilter={selectedFilter}
selectedPermlink={_selectedPermlink || selectedPermlink}
author={author}
@ -285,6 +290,7 @@ class CommentsContainer extends Component {
isHideImage={isHideImage}
handleOnVotersPress={this._handleOnVotersPress}
isShowSubComments={isShowSubComments}
showAllComments={showAllComments}
/>
);
}

View File

@ -4,4 +4,18 @@ export default EStyleSheet.create({
list: {
marginBottom: 20,
},
moreRepliesButtonWrapper: {
backgroundColor: '$iconColor',
height: 18,
justifyContent: 'center',
alignItems: 'center',
borderRadius: 20,
marginTop: 15,
minWidth: 40,
maxWidth: 170,
},
moreRepliesText: {
color: '$white',
fontSize: 10,
},
});

View File

@ -1,114 +1,122 @@
import React, { Component, Fragment } from 'react';
import React, { useState, Fragment, useRef } from 'react';
import { FlatList } from 'react-native';
import ActionSheet from 'react-native-actionsheet';
import get from 'lodash/get';
import { injectIntl } from 'react-intl';
import { useIntl } from 'react-intl';
import { navigate } from '../../../navigation/service';
// Components
// eslint-disable-next-line import/no-cycle
import { Comment } from '../../comment';
import { Comment, TextButton } from '../..';
// Constants
import ROUTES from '../../../constants/routeNames';
// Styles
import styles from './commentStyles';
class CommentsView extends Component {
/* Props
* ------------------------------------------------
* @prop { type } name - Description....
*/
const CommentsView = ({
avatarSize,
commentCount,
commentNumber,
comments,
currentAccountUsername,
fetchPost,
handleDeleteComment,
handleOnEditPress,
handleOnPressCommentMenu,
handleOnReplyPress,
handleOnUserPress,
handleOnVotersPress,
hasManyComments,
isHideImage,
isLoggedIn,
isOwnProfile,
isShowSubComments,
mainAuthor,
marginLeft,
isShowMoreButton,
showAllComments,
hideManyCommentsButton,
}) => {
const [selectedComment, setSelectedComment] = useState(null);
const intl = useIntl();
const commentMenu = useRef();
constructor(props) {
super(props);
this.state = {
selectedComment: null,
};
this.commentMenu = React.createRef();
}
const _keyExtractor = item => get(item, 'permlink');
// Component Life Cycles
// Component Functions
_keyExtractor = item => item.permlink;
_openCommentMenu = item => {
this.setState({ selectedComment: item });
this.commentMenu.current.show();
const _openCommentMenu = item => {
setSelectedComment(item);
commentMenu.current.show();
};
render() {
const {
mainAuthor,
avatarSize,
commentCount,
commentNumber,
comments,
currentAccountUsername,
fetchPost,
handleOnEditPress,
handleOnReplyPress,
handleOnUserPress,
isLoggedIn,
isShowSubComments,
marginLeft,
handleDeleteComment,
handleOnPressCommentMenu,
handleOnVotersPress,
intl,
isOwnProfile,
isHideImage,
} = this.props;
const { selectedComment } = this.state;
const _readMoreComments = () => {
navigate({
routeName: ROUTES.SCREENS.COMMENTS,
params: { comments, fetchPost, handleOnVotersPress },
});
};
const menuItems = isOwnProfile
? [
intl.formatMessage({ id: 'post.copy_link' }),
intl.formatMessage({ id: 'post.open_thread' }),
intl.formatMessage({ id: 'alert.cancel' }),
]
: [intl.formatMessage({ id: 'post.copy_link' }), intl.formatMessage({ id: 'alert.cancel' })];
const menuItems = isOwnProfile
? [
intl.formatMessage({ id: 'post.copy_link' }),
intl.formatMessage({ id: 'post.open_thread' }),
intl.formatMessage({ id: 'alert.cancel' }),
]
: [intl.formatMessage({ id: 'post.copy_link' }), intl.formatMessage({ id: 'alert.cancel' })];
if (!hideManyCommentsButton && hasManyComments) {
return (
<Fragment>
<FlatList
style={styles.list}
data={comments}
keyExtractor={this._keyExtractor}
renderItem={({ item }) => (
<Comment
mainAuthor={mainAuthor}
avatarSize={avatarSize}
comment={item}
commentCount={commentCount || get(item.children)}
commentNumber={commentNumber}
handleDeleteComment={handleDeleteComment}
currentAccountUsername={currentAccountUsername}
fetchPost={fetchPost}
handleOnEditPress={handleOnEditPress}
handleOnReplyPress={handleOnReplyPress}
handleOnUserPress={handleOnUserPress}
handleOnVotersPress={handleOnVotersPress}
isHideImage={isHideImage}
isLoggedIn={isLoggedIn}
isShowMoreButton={commentNumber === 1 && get(item, 'children') > 0}
voteCount={get(item, 'vote_count')}
isShowSubComments={isShowSubComments}
key={item.permlink}
marginLeft={marginLeft}
handleOnLongPress={() => this._openCommentMenu(item)}
/>
)}
/>
<ActionSheet
ref={this.commentMenu}
options={menuItems}
title={get(selectedComment, 'summary')}
cancelButtonIndex={isOwnProfile ? 2 : 1}
onPress={index => handleOnPressCommentMenu(index, selectedComment)}
/>
</Fragment>
<TextButton
style={styles.moreRepliesButtonWrapper}
textStyle={styles.moreRepliesText}
onPress={() => _readMoreComments()}
text="Read more comments"
/>
);
}
}
export default injectIntl(CommentsView);
return (
<Fragment>
<FlatList
style={styles.list}
data={comments}
keyExtractor={_keyExtractor}
renderItem={({ item }) => (
<Comment
mainAuthor={mainAuthor}
avatarSize={avatarSize}
hideManyCommentsButton={hideManyCommentsButton}
comment={item}
commentCount={commentCount || get(item, 'children')}
commentNumber={commentNumber}
handleDeleteComment={handleDeleteComment}
currentAccountUsername={currentAccountUsername}
fetchPost={fetchPost}
handleOnEditPress={handleOnEditPress}
handleOnReplyPress={handleOnReplyPress}
handleOnUserPress={handleOnUserPress}
handleOnVotersPress={handleOnVotersPress}
isHideImage={isHideImage}
isLoggedIn={isLoggedIn}
isShowMoreButton={commentNumber === 1 && get(item, 'children') > 0}
showAllComments={showAllComments}
voteCount={get(item, 'vote_count')}
isShowSubComments={isShowSubComments}
key={get(item, 'permlink')}
marginLeft={marginLeft}
handleOnLongPress={() => _openCommentMenu(item)}
/>
)}
/>
<ActionSheet
ref={commentMenu}
options={menuItems}
title={get(selectedComment, 'summary')}
cancelButtonIndex={isOwnProfile ? 2 : 1}
onPress={index => handleOnPressCommentMenu(index, selectedComment)}
/>
</Fragment>
);
};
export default CommentsView;

View File

@ -222,25 +222,29 @@ class ProfileView extends PureComponent {
/>
)}
</View>
<View
tabLabel={
estimatedWalletValue
? `${currencySymbol} ${(estimatedWalletValue * currencyRate).toFixed()}`
: intl.formatMessage({
id: 'profile.wallet',
})
}
>
{selectedUser ? (
<Wallet
setEstimatedWalletValue={value => this.setState({ estimatedWalletValue: value })}
selectedUser={selectedUser}
handleOnScroll={isSummaryOpen ? this._handleOnScroll : null}
/>
) : (
<WalletDetailsPlaceHolder />
)}
</View>
{!isOwnProfile && (
<View
tabLabel={
estimatedWalletValue
? `${currencySymbol} ${(estimatedWalletValue * currencyRate).toFixed()}`
: intl.formatMessage({
id: 'profile.wallet',
})
}
>
{selectedUser ? (
<Wallet
setEstimatedWalletValue={value =>
this.setState({ estimatedWalletValue: value })
}
selectedUser={selectedUser}
handleOnScroll={isSummaryOpen ? this._handleOnScroll : null}
/>
) : (
<WalletDetailsPlaceHolder />
)}
</View>
)}
</ScrollableTabView>
</SafeAreaView>
</Fragment>

View File

@ -430,5 +430,8 @@
"current_time": "Current time;",
"information": "We noticed that your device has incorrect date or time. Please fix Date & Time or Set Automatically and try again."
}
},
"comments": {
"title": "Comments"
}
}

View File

@ -1,13 +1,13 @@
{
"wallet": {
"curation_reward": "Curation Reward",
"author_reward": "Xelata Nivîskarî",
"curation_reward": "Xelata Kuratorê",
"author_reward": "Xelata Nivîskêr",
"comment_benefactor_reward": "Comment Benefactor Reward",
"claim_reward_balance": "Claim Reward Balance",
"transfer": "Transfer",
"transfer": "Veguheztin",
"transfer_to_vesting": "Transfer To Vesting",
"transfer_from_savings": "Transfer From Savings",
"withdraw_vesting": "Power Down",
"withdraw_vesting": "Kêmhêz Bike",
"fill_order": "Fill Order",
"post": "Şandî",
"comment": "Şîrove",
@ -19,7 +19,7 @@
"outgoing_transfer_title": "Outgoing transfer",
"checkin_extra": "Bonus",
"delegation": "Şande",
"delegations": "Delegations",
"delegations": "Şande",
"delegation_title": "Xelata şandeyê",
"delegation_desc": "Earn ESTM everyday for delegation",
"post_title": "Puanên ji bo şandiyê",
@ -39,30 +39,30 @@
"reblog_desc": "Share what post you like with your friends and earn points.",
"login_desc": "When you login into app first time you earn 100 points.",
"checkin_extra_desc": "Consistent use of app gives you extra chances to earn more points, be more active and earn more.",
"dropdown_transfer": "Gift",
"dropdown_transfer": "Diyarî",
"dropdown_promote": "Promote",
"dropdown_boost": "Boost",
"from": "From",
"to": "To",
"dropdown_boost": "Zêde bike",
"from": "Ji",
"to": "Bo",
"estimated_value_desc": "Determined by purchase value",
"estimated_value": "Estimated value",
"estimated_amount": "Vote value",
"estimated_amount": "Rêjeya dengan",
"amount_information": "Drag the slider to adjust the amount",
"amount": "Amount",
"memo": "Memo",
"amount": "Pîvan",
"memo": "Bîrname",
"information": "Are you sure to transfer funds?",
"amount_desc": "Balance",
"memo_desc": "This memo is public",
"to_placeholder": "Username",
"memo_placeholder": "Enter your notes here",
"to_placeholder": "Navê bikarhêner",
"memo_placeholder": "Notên xwe li vir binivîse",
"transfer_token": "Transfer",
"points": "Gift ESTM to someone",
"transfer_to_saving": "Transfer To Saving",
"powerUp": "Power Up",
"powerUp": "Bihêz Bike",
"withdraw_to_saving": "Withdraw To Saving",
"steemconnect_title": "Steemconnect Transfer",
"next": "NEXT",
"delegate": "Delegate",
"steemconnect_title": "Veguheztina Steemconnectê",
"next": "PÊŞVE",
"delegate": "Şande",
"power_down": "Power Down",
"withdraw_steem": "Withdraw Steem",
"withdraw_sbd": "Withdraw Steem Dollar",
@ -89,14 +89,14 @@
},
"steem": {
"title": "STEEM",
"buy": "GET STEEM"
"buy": "STEEMê BISTÎNE"
},
"sbd": {
"title": "SBD",
"buy": "GET SBD"
"buy": "SBDê BISTÎNE"
},
"steem_power": {
"title": "STEEM POWER"
"title": "HÊZA STEEMê"
}
},
"notification": {
@ -120,9 +120,9 @@
"older_then": "Older Than A Month"
},
"leaderboard": {
"daily": "DAILY",
"weekly": "WEEKLY",
"monthly": "MONTHLY"
"daily": "ROJANE",
"weekly": "HEFTANE",
"monthly": "MEHANE"
},
"messages": {
"comingsoon": "Di nêz de taybetiya peyaman li vir e!"
@ -130,7 +130,7 @@
"profile": {
"following": "Şopandin",
"follower": "Şopîner",
"post": "Post",
"post": "Şandî",
"details": "Hûrgiliyên Profîlê",
"comments": "Şîrove",
"replies": "Bersiv",
@ -145,15 +145,15 @@
"havent_posted": "heta niha ti tişt parve nebûye",
"steem_power": "Hêza Steemê",
"next_power_text": "Next power down is in",
"days": "days",
"day": "day",
"days": "roj",
"day": "roj",
"steem_dollars": "Dolarên Steemê",
"savings": "Savings",
"savings": "Berhev bike",
"edit": {
"display_name": "Display Name",
"about": "About",
"location": "Location",
"website": "Website"
"about": "Derbar",
"location": "Cîgeh",
"website": "Malper"
}
},
"settings": {
@ -177,30 +177,30 @@
"reset": "Nûsaz bike",
"nsfw_content": "NSFW",
"send_feedback": "Paşragihandin Bişîne",
"send": "Send",
"send": "Bişîne",
"default_footer": "Default Footer",
"nsfw": {
"always_show": "Always show",
"always_hide": "Always hide",
"always_warn": "Always warn"
"always_show": "Her tim nîşan bide",
"always_hide": "Her tim veşêre",
"always_warn": "Her tim hişyar bike"
},
"feedback_success": "Email successfully open",
"feedback_fail": "Email client could not open",
"feedback_success": "Epeyam bi serkeftî vebû",
"feedback_fail": "Stînera epeyamê venebû",
"server_fail": "Server not available"
},
"voters": {
"voters_info": "Voters Info",
"no_user": "User is not found."
"voters_info": "Agahiya Dengdêran",
"no_user": "Bikarhêner nehate dîtin."
},
"login": {
"signin": "Sign in",
"signup": "Sign up",
"signin": "Têketin",
"signup": "Tomar bibe",
"signin_title": "To get all the benefits of using eSteem",
"username": "Username",
"password": "Password or WIF",
"username": "Navê bikarhêner",
"password": "Pêborîn an WIF",
"description": "User credentials are kept locally on the device. Credentials are removed upon logout!",
"cancel": "cancel",
"login": "LOGIN",
"cancel": "betal",
"login": "TÊKETIN",
"steemconnect_description": "If you don't want to keep your password encrypted and saved on your device, you can use Steemconnect.",
"steemconnect_fee_description": "Steemconnect may charge some fees from your reward transactions"
},
@ -242,8 +242,8 @@
"capture_photo": "Wêneyekî bigire"
},
"pincode": {
"enter_text": "Enter pin to unlock",
"set_new": "Set new pin",
"enter_text": "Ji bo vekirinê PIN têxîne",
"set_new": "PINa nû saz bike",
"write_again": "Dîsa binivîsîne",
"forgot_text": "Wey, Min ji bîr kir..."
},
@ -253,17 +253,17 @@
"allRead": "Hemû danezanan wekî xwendî nîşan bike",
"claim_reward_balance_ok": "Reward balance claimed",
"fail": "Biserneket!",
"move": "Move",
"move_question": "Are you sure to move to drafts?",
"success_shared": "Your post successfully shared",
"success_moved": "Moved to draft",
"permission_denied": "Permission denied",
"permission_text": "Please, go to phone Settings and change eSteem app permissions.",
"success_rebloged": "Rebloged!",
"move": "Veguhezîne",
"move_question": "Bi rastî jî tu dixwazî reşnivîsan veguhezînî?",
"success_shared": "Şandiya te bi serkeftî hate parvekirin",
"success_moved": "Veguhezî reşnivîsê bû",
"permission_denied": "Destûr hate redkirin",
"permission_text": "Ji kerema xwe, biçe Sazkariyên telefonê û destûrên eSteemê veke.",
"success_rebloged": "Reblog!",
"already_rebloged": "You have already reblogged!",
"warning": "Warning",
"invalid_pincode": "Invalid pin code, please check and try again.",
"remove_alert": "Are you sure want to remove?",
"warning": "Hişyarî",
"invalid_pincode": "Koda PINê nederbasdar e, kontrol bike û dîsa biceribîne.",
"remove_alert": "Bi rastî jî tu dixwazî rake?",
"clear_alert": "Bi rastî jî tu dixwazî paqij bike?",
"clear_user_alert": "Tu dixwazî hemû daneyên bikarhêner paqij bike?",
"clear": "Paqij bike",
@ -274,11 +274,11 @@
"confirm": "Bipejirîne",
"removed": "Hate rakirin",
"same_user": "This user already added to list",
"unknow_error": "An error occurred",
"error": "Error",
"fetch_error": "Fetching data failed, please try again or notify us at info@esteem.app",
"connection_fail": "Connection Failed!",
"connection_success": "Successfully connected!",
"unknow_error": "Çêwtiyek çêbû",
"error": "Çewtî",
"fetch_error": "Anîna daneyê biserneket, ji kerema xwe dîsa biceribîne an jî ji ser info@esteem.app me agahdar bike",
"connection_fail": "Girêdan Biserneket!",
"connection_success": "Bi serkeftî hate girêdan!",
"checking": "Checking...",
"not_existing_post": "The post does not exist! Please check permlink and author.",
"google_play_version": "We noticed that your device has old version of Google Play. Please update Google Play services and try again!"
@ -286,45 +286,45 @@
"post": {
"reblog_alert": "Are you sure, you want to reblog?",
"removed_hint": "The post was removed by",
"copy_link": "Copy Link",
"copy_link": "Girêdanê kopî bike",
"reblogged": "reblogged by",
"sponsored": "SPONSORED",
"open_thread": "Open Thread"
"sponsored": "SPONSORKIRÎ",
"open_thread": "Mijara Vekirî"
},
"drafts": {
"title": "Drafts",
"load_error": "Could not load drafts",
"empty_list": "Nothing here",
"deleted": "Draft deleted"
"title": "Reşnivîs",
"load_error": "Reşnivîs bar nebûn",
"empty_list": "Li vir ti tişt tine ye",
"deleted": "Reşnivîs hate jêbirin"
},
"schedules": {
"title": "Schedules",
"empty_list": "Nothing here",
"deleted": "Scheduled post deleted",
"move": "Move to drafts",
"moved": "Moved to drafts"
"empty_list": "Li vir ti tişt tine ye",
"deleted": "Şandiya demsazkirî hate jêbirin",
"move": "Veguhezîne reşnivîsan",
"moved": "Veguhezî reşnivîsan bû"
},
"bookmarks": {
"title": "Bookmarks",
"load_error": "Could not load bookmarks",
"empty_list": "Nothing here",
"empty_list": "Li vir ti tişt tine ye",
"deleted": "Bookmark removed",
"search": "Search in bookmarks",
"added": "Added to bookmarks",
"add": "Add to bookmarks"
},
"favorites": {
"title": "Favorites",
"load_error": "Could not load favorites",
"empty_list": "Nothing here",
"search": "Search in favorites"
"title": "Bijardeyên min",
"load_error": "Bijarde bar nebûn",
"empty_list": "Li vir ti tişt tine ye",
"search": "Di bijardeyan de bigere"
},
"auth": {
"invalid_pin": "Invalid pin code, please check and try again",
"invalid_username": "Invalid username, please check and try again",
"already_logged": "You are already logged in, please try to add another account",
"invalid_username": "Navê bikarhêner nederbasdar e, kontrol bike û dîsa biceribîne",
"already_logged": "Jixwe tu têketî ye, ji kerema xwe tevlîkirina hesabekî din biceribîne",
"invalid_credentials": "Invalid credentials, please check and try again",
"unknow_error": "Unknown error, please contact us at support@esteem.app"
"unknow_error": "Çewtiya nenas, ji ser support@esteem.app bi me re têkilî deyne"
},
"payout": {
"potential_payout": "Potential Payout",
@ -337,89 +337,89 @@
"breakdown": "Breakdown"
},
"post_dropdown": {
"copy": "copy link",
"copy": "kopî bike",
"reblog": "reblog",
"reply": "reply",
"share": "share",
"reply": "bibersivîne",
"share": "parve bike",
"bookmarks": "add to bookmarks",
"promote": "promote",
"boost": "boost"
"boost": "zêde bike"
},
"deep_link": {
"no_existing_user": "No existing user",
"no_existing_post": "No existing post"
"no_existing_user": "Bikarhêner tine ye",
"no_existing_post": "Şandî tine ye"
},
"search": {
"posts": "Posts",
"comments": "Comments"
"posts": "Şandî",
"comments": "Şîrove"
},
"comment_filter": {
"trending": "TOP",
"trending": "SEREKE",
"reputation": "REPUTATION",
"votes": "VOTE",
"age": "AGE",
"top": "TOP",
"time": "TIME"
"votes": "DENG",
"age": "TEMEN",
"top": "SEREKE",
"time": "DEM"
},
"transfer": {
"from": "From",
"to": "To",
"from": "Ji",
"to": "Bo",
"amount_information": "Drag the slider to adjust the amount",
"amount": "Amount",
"memo": "Memo",
"amount": "Pîvan",
"memo": "Bîrname",
"information": "Are you sure to transfer funds?",
"amount_desc": "Balance",
"memo_desc": "This memo is public",
"to_placeholder": "Username",
"memo_placeholder": "Enter your notes here",
"transfer_token": "Transfer",
"to_placeholder": "Navê bikarhêner",
"memo_placeholder": "Notên xwe li vir binivîse",
"transfer_token": "Veguheztin",
"points": "Gift ESTM to someone",
"transfer_to_saving": "Transfer To Saving",
"powerUp": "Power Up",
"powerUp": "Bihêz Bike",
"withdraw_to_saving": "Withdraw To Saving",
"steemconnect_title": "Steemconnect Transfer",
"estimated_weekly": "Estimated Weekly",
"destination_accounts": "Destination Accounts",
"steemconnect_title": "Veguheztina Steemconnectê",
"estimated_weekly": "Texmînkirina Heftane",
"destination_accounts": "Hesabên Armanc",
"stop_information": "Are you sure want to stop?",
"percent": "Percent",
"auto_vests": "Auto Vests",
"save": "SAVE",
"percent_information": "Percent info",
"next": "NEXT",
"delegate": "Delegate",
"power_down": "Power Down",
"save": "TOMAR BIKE",
"percent_information": "Agahiya rêjeyê",
"next": "PÊŞVE",
"delegate": "Şande",
"power_down": "Kêmhêz Bike",
"withdraw_steem": "Withdraw Steem",
"withdraw_sbd": "Withdraw Steem Dollar",
"incoming_funds": "Incoming Funds",
"stop": "Stop"
"incoming_funds": "Fonên Tên",
"stop": "Rawestîne"
},
"boost": {
"title": "Get eSteem Points",
"buy": "GET ESTM",
"next": "NEXT"
"next": "PÊŞVE"
},
"free_estm": {
"title": "Free ESTM",
"button": "SPIN & WIN",
"get_spin": "5 SPINS",
"spin_right": "Spin Left",
"title": "ESTM ya Belaş",
"button": "BIZÎVIRÎNE Û QEZENC BIKE",
"get_spin": "5 ZÎVIR",
"spin_right": "Bizîvirîne Çepê",
"timer_text": "Next free spin in"
},
"promote": {
"title": "Promote",
"days": "days",
"user": "User",
"permlink": "Post",
"days": "roj",
"user": "Bikarhêner",
"permlink": "Şandî",
"permlinkPlaceholder": "author/permlink",
"information": "Are you sure to promote?"
},
"boostPost": {
"title": "Boost"
"title": "Zêde bike"
},
"voters_dropdown": {
"rewards": "REWARDS",
"percent": "PERCENT",
"time": "TIME"
"rewards": "XELAT",
"percent": "JI SEDÎ",
"time": "DEM"
},
"reblog": {
"title": "Reblog Info"

View File

@ -24,6 +24,7 @@ export default {
STEEM_CONNECT: `SteemConnect${SCREEN_SUFFIX}`,
TRANSFER: `Transfer${SCREEN_SUFFIX}`,
VOTERS: `Voters${SCREEN_SUFFIX}`,
COMMENTS: `Comments${SCREEN_SUFFIX}`,
},
DRAWER: {
MAIN: `Main${DRAWER_SUFFIX}`,

View File

@ -3,15 +3,12 @@ import 'react-native-gesture-handler';
import { Provider, connect } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react';
import { IntlProvider } from 'react-intl';
import { enableScreens } from 'react-native-screens';
import { flattenMessages } from './utils/flattenMessages';
import messages from './config/locales';
import Application from './screens/application';
import { store, persistor } from './redux/store/store';
enableScreens();
const _renderApp = ({ locale }) => (
<PersistGate loading={null} persistor={persistor}>
<IntlProvider locale={locale} messages={flattenMessages(messages[locale])}>

View File

@ -58,7 +58,12 @@ const BaseNavigator = createBottomTabNavigator(
screen: Profile,
navigationOptions: () => ({
tabBarIcon: ({ tintColor }) => (
<Icon iconType="MaterialIcons" name="person" color={tintColor} size={scalePx(26)} />
<Icon
iconType="MaterialIcons"
name="person-outline"
color={tintColor}
size={scalePx(26)}
/>
),
}),
},

View File

@ -1 +0,0 @@
export * from './baseNavigator';

View File

@ -1,19 +1,28 @@
import React from 'react';
import { createSwitchNavigator } from 'react-navigation';
import { createBottomTabNavigator } from 'react-navigation-tabs';
import { createDrawerNavigator } from 'react-navigation-drawer';
import { createStackNavigator } from 'react-navigation-stack';
import { BaseNavigator } from './baseNavigator';
// Constants
import ROUTES from '../constants/routeNames';
import scalePx from '../utils/scalePx';
// Components
import { Icon, IconContainer } from '../components/icon';
import { PostButton, BottomTabBar, SideMenu } from '../components';
// Screens
import {
Bookmarks,
Boost,
Comments,
Drafts,
Editor,
Feed,
Follows,
SpinGame,
Login,
PinCode,
Notification,
Post,
Profile,
ProfileEdit,
@ -21,132 +30,104 @@ import {
Redeem,
SearchResult,
Settings,
SteemConnect,
SpinGame,
Transfer,
Voters,
Wallet,
} from '../screens';
// Components
import { SideMenu } from '../components';
const mainNavigation = createDrawerNavigator(
const bottomTabNavigator = createBottomTabNavigator(
{
[ROUTES.SCREENS.FEED]: {
screen: BaseNavigator,
[ROUTES.TABBAR.FEED]: {
screen: Feed,
navigationOptions: () => ({
tabBarIcon: ({ tintColor }) => (
<Icon iconType="MaterialIcons" name="view-day" color={tintColor} size={scalePx(26)} />
),
}),
},
[ROUTES.TABBAR.NOTIFICATION]: {
screen: Notification,
navigationOptions: () => ({
tabBarIcon: ({ tintColor }) => (
<IconContainer
isBadge
badgeType="notification"
iconType="MaterialIcons"
name="notifications"
color={tintColor}
size={scalePx(26)}
/>
),
}),
},
[ROUTES.TABBAR.POST_BUTTON]: {
screen: () => null,
navigationOptions: {
tabBarIcon: () => <PostButton />,
},
},
[ROUTES.TABBAR.WALLET]: {
screen: Wallet,
navigationOptions: () => ({
tabBarIcon: ({ tintColor }) => (
<Icon
iconType="MaterialIcons"
name="account-balance-wallet"
color={tintColor}
size={scalePx(26)}
/>
),
}),
},
[ROUTES.TABBAR.PROFILE]: {
screen: Profile,
navigationOptions: () => ({
tabBarIcon: ({ tintColor }) => (
<Icon iconType="MaterialIcons" name="person" color={tintColor} size={scalePx(26)} />
),
}),
},
},
{
contentComponent: SideMenu,
tabBarComponent: props => <BottomTabBar {...props} />,
tabBarOptions: {
showLabel: false,
activeTintColor: '#f6f6f6',
inactiveTintColor: '#c1c5c7',
},
},
);
const mainNavigation = createDrawerNavigator(
{ [ROUTES.SCREENS.FEED]: { screen: bottomTabNavigator } },
{ contentComponent: SideMenu },
);
const stackNavigator = createStackNavigator(
{
[ROUTES.DRAWER.MAIN]: {
screen: mainNavigation,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.PROFILE]: {
screen: Profile,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.PROFILE_EDIT]: {
screen: ProfileEdit,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.POST]: {
screen: Post,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.EDITOR]: {
screen: Editor,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.VOTERS]: {
screen: Voters,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.FOLLOWS]: {
screen: Follows,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.SETTINGS]: {
screen: Settings,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.DRAFTS]: {
screen: Drafts,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.BOOKMARKS]: {
screen: Bookmarks,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.SEARCH_RESULT]: {
screen: SearchResult,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.TRANSFER]: {
screen: Transfer,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.BOOST]: {
screen: Boost,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.REDEEM]: {
screen: Redeem,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.REBLOGS]: {
screen: Reblogs,
navigationOptions: {
header: () => null,
},
},
[ROUTES.SCREENS.SPIN_GAME]: {
screen: SpinGame,
navigationOptions: {
header: () => null,
},
},
},
{
headerMode: 'none',
[ROUTES.DRAWER.MAIN]: { screen: mainNavigation },
[ROUTES.SCREENS.PROFILE]: { screen: Profile },
[ROUTES.SCREENS.PROFILE_EDIT]: { screen: ProfileEdit },
[ROUTES.SCREENS.POST]: { screen: Post },
[ROUTES.SCREENS.EDITOR]: { screen: Editor },
[ROUTES.SCREENS.VOTERS]: { screen: Voters },
[ROUTES.SCREENS.FOLLOWS]: { screen: Follows },
[ROUTES.SCREENS.SETTINGS]: { screen: Settings },
[ROUTES.SCREENS.DRAFTS]: { screen: Drafts },
[ROUTES.SCREENS.BOOKMARKS]: { screen: Bookmarks },
[ROUTES.SCREENS.SEARCH_RESULT]: { screen: SearchResult },
[ROUTES.SCREENS.TRANSFER]: { screen: Transfer },
[ROUTES.SCREENS.BOOST]: { screen: Boost },
[ROUTES.SCREENS.REDEEM]: { screen: Redeem },
[ROUTES.SCREENS.REBLOGS]: { screen: Reblogs },
[ROUTES.SCREENS.SPIN_GAME]: { screen: SpinGame },
[ROUTES.SCREENS.COMMENTS]: { screen: Comments },
},
{ headerMode: 'none' },
);
export default createSwitchNavigator({
stackNavigator,
[ROUTES.SCREENS.LOGIN]: { screen: Login },
[ROUTES.SCREENS.PINCODE]: { screen: PinCode },
[ROUTES.SCREENS.STEEM_CONNECT]: { screen: SteemConnect },
});

View File

@ -0,0 +1,41 @@
import React from 'react';
import { View } from 'react-native';
import { useIntl } from 'react-intl';
import { BasicHeader, Comments } from '../../../components';
// Styles
import globalStyles from '../../../globalStyles';
const CommentsScreen = ({ navigation }) => {
const intl = useIntl();
const comments = navigation.getParam('comments', [{}])[0];
return (
<View style={globalStyles.container}>
<BasicHeader
title={intl.formatMessage({
id: 'comments.title',
})}
/>
<View style={globalStyles.containerHorizontal16}>
<Comments
isShowComments
author={comments.author}
mainAuthor={comments.author}
permlink={comments.permlink}
commentCount={comments.children}
isShowMoreButton={true}
isShowSubComments
showAllComments
fetchPost={navigation.getParam('fetchPost', null)}
handleOnVotersPress={navigation.getParam('handleOnVotersPress', null)}
hasManyComments={false}
hideManyCommentsButton
/>
</View>
</View>
);
};
export { CommentsScreen as Comments };

View File

@ -1,17 +1,18 @@
import { Bookmarks } from './bookmarks';
import { Comments } from './comments/screen/commentsScreen';
import { Drafts } from './drafts';
import { Editor } from './editor';
import { Follows } from './follows';
import { Feed } from './feed';
import { Follows } from './follows';
import { Launch } from './launch';
import { Login } from './login';
import { Notification } from './notification';
import { PinCode } from './pinCode';
import { Wallet } from './wallet';
import { Post } from './post';
import { SearchResult } from './searchResult';
import { Settings } from './settings';
import { SpinGame } from './spinGame/screen/spinGameScreen';
import { Wallet } from './wallet';
import Boost from './boost/screen/boostScreen';
import Profile from './profile/screen/profileScreen';
import ProfileEdit from './profileEdit/screen/profileEditScreen';
@ -24,15 +25,15 @@ import Voters from './voters';
export {
Bookmarks,
Boost,
Comments,
Drafts,
Editor,
Follows,
Feed,
Follows,
Launch,
Login,
Notification,
PinCode,
Wallet,
Post,
Profile,
ProfileEdit,
@ -44,4 +45,5 @@ export {
SteemConnect,
Transfer,
Voters,
Wallet,
};

View File

@ -7705,13 +7705,6 @@ react-native-safe-modules@^1.0.0:
dependencies:
debounce "^1.2.0"
react-native-screens@^2.0.0-alpha.16:
version "2.0.0-alpha.18"
resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.0.0-alpha.18.tgz#70c116cc96069ad1d930f2984bbec7d66856a1ee"
integrity sha512-ML5MVFMWsw7x4GdAA6xWMnFUp37Rk4dpNb5MKrRIPqOTYTS+cN+eyo7UCqICEa6KwYKCtGN6Kq7xrKOtboWPMg==
dependencies:
debounce "^1.2.0"
react-native-scrollable-tab-view@esteemapp/react-native-scrollable-tab-view:
version "0.10.0"
resolved "https://codeload.github.com/esteemapp/react-native-scrollable-tab-view/tar.gz/a86ddabbda728b86eb16656b8e8e71655a38400e"