Merge pull request #1470 from esteemapp/more

More fixes
This commit is contained in:
Feruz M 2020-01-09 09:53:40 +02:00 committed by GitHub
commit b127e797aa
15 changed files with 283 additions and 151 deletions

View File

@ -23,7 +23,7 @@
},
"dependencies": {
"@babel/runtime": "^7.5.5",
"@esteemapp/esteem-render-helpers": "^1.2.9",
"@esteemapp/esteem-render-helpers": "^1.3.0",
"@esteemapp/react-native-autocomplete-input": "^4.2.1",
"@esteemapp/react-native-multi-slider": "^1.1.0",
"@esteemapp/react-native-render-html": "^4.1.5",

View File

@ -1,4 +1,4 @@
import React, { Component } from 'react';
import React, { useState, useEffect, useCallback } from 'react';
import { withNavigation } from 'react-navigation';
import { connect } from 'react-redux';
import { injectIntl } from 'react-intl';
@ -17,31 +17,49 @@ import ROUTES from '../../../constants/routeNames';
// Component
import CommentsView from '../view/commentsView';
/*
* Props Name Description Value
*@props --> props name here description here Value Type Here
*
*/
const CommentsContainer = ({
author,
permlink,
selectedFilter,
currentAccount: { name },
isOwnProfile,
fetchPost,
navigation,
content,
currentAccount,
pinCode,
comments,
dispatch,
intl,
commentCount,
isLoggedIn,
commentNumber,
isShowMoreButton,
mainAuthor,
selectedPermlink: _selectedPermlink,
isHideImage,
isShowSubComments,
hasManyComments,
showAllComments,
hideManyCommentsButton,
}) => {
const [lcomments, setLComments] = useState([]);
const [selectedPermlink, setSelectedPermlink] = useState('');
class CommentsContainer extends Component {
constructor(props) {
super(props);
this.state = {
comments: [],
};
}
useEffect(() => {
_getComments();
}, []);
// Component Life Cycle Functions
componentDidMount() {
this._getComments();
}
useEffect(() => {
_getComments();
const shortedComments = _shortComments(selectedFilter);
setLComments(shortedComments);
}, [commentCount, selectedFilter]);
// Component Functions
_shortComments = (sortOrder, comments) => {
const { comments: parent } = this.state;
const sortedComments = comments || parent;
const _shortComments = (sortOrder, _comments) => {
const sortedComments = _comments || lcomments;
const allPayout = c =>
parseFloat(get(c, 'pending_payout_value').split(' ')[0]) +
@ -122,39 +140,24 @@ class CommentsContainer extends Component {
return sortedComments;
};
_getComments = async () => {
const {
author,
permlink,
selectedFilter,
currentAccount: { name },
isOwnProfile,
fetchPost,
} = this.props;
const _getComments = async () => {
if (isOwnProfile) {
fetchPost();
} else if (author && permlink) {
await getComments(author, permlink, name)
.then(comments => {
.then(__comments => {
if (selectedFilter) {
const sortComments = this._shortComments(selectedFilter, comments);
this.setState({
comments: sortComments,
});
const sortComments = _shortComments(selectedFilter, __comments);
setLComments(sortComments);
} else {
this.setState({
comments,
});
setLComments(__comments);
}
})
.catch(() => {});
}
};
_handleOnReplyPress = item => {
const { navigation, fetchPost } = this.props;
const _handleOnReplyPress = item => {
navigation.navigate({
routeName: ROUTES.SCREENS.EDITOR,
params: {
@ -165,9 +168,7 @@ class CommentsContainer extends Component {
});
};
_handleOnVotersPress = activeVotes => {
const { navigation, content } = this.props;
const _handleOnVotersPress = activeVotes => {
navigation.navigate({
routeName: ROUTES.SCREENS.VOTERS,
params: {
@ -177,38 +178,32 @@ class CommentsContainer extends Component {
});
};
_handleOnEditPress = item => {
const { navigation } = this.props;
const _handleOnEditPress = item => {
navigation.navigate({
routeName: ROUTES.SCREENS.EDITOR,
params: {
isEdit: true,
isReply: true,
post: item,
fetchPost: this._getComments,
fetchPost: _getComments,
},
});
};
_handleDeleteComment = permlink => {
const { currentAccount, pinCode, comments } = this.props;
const { comments: _comments } = this.state;
const _handleDeleteComment = _permlink => {
let filteredComments;
deleteComment(currentAccount, pinCode, permlink).then(() => {
if (_comments.length > 0) {
filteredComments = _comments.filter(item => item.permlink !== permlink);
deleteComment(currentAccount, pinCode, _permlink).then(() => {
if (lcomments.length > 0) {
filteredComments = lcomments.filter(item => item.permlink !== _permlink);
} else {
filteredComments = comments.filter(item => item.permlink !== permlink);
filteredComments = comments.filter(item => item.permlink !== _permlink);
}
this.setState({ comments: filteredComments });
setLComments(filteredComments);
});
};
_handleOnPressCommentMenu = (index, selectedComment) => {
const { dispatch, intl, navigation, isOwnProfile } = this.props;
const _handleOnPressCommentMenu = (index, selectedComment) => {
if (index === 0) {
writeToClipboard(`https://esteem.app${get(selectedComment, 'url')}`).then(() => {
dispatch(
@ -231,70 +226,34 @@ class CommentsContainer extends Component {
}
};
UNSAFE_componentWillReceiveProps(nextProps) {
const { commentCount, selectedFilter } = this.props;
if (nextProps.commentCount > commentCount) {
this._getComments();
}
if (selectedFilter !== get(nextProps, 'selectedFilter') && get(nextProps, 'selectedFilter')) {
const shortedComments = this._shortComments(get(nextProps, 'selectedFilter'));
this.setState({ comments: shortedComments });
}
}
render() {
const { comments: _comments, selectedPermlink } = this.state;
const {
isLoggedIn,
commentCount,
author,
currentAccount,
commentNumber,
comments,
fetchPost,
isShowMoreButton,
selectedFilter,
mainAuthor,
selectedPermlink: _selectedPermlink,
isOwnProfile,
isHideImage,
isShowSubComments,
hasManyComments,
showAllComments,
hideManyCommentsButton,
} = this.props;
return (
<CommentsView
key={selectedFilter}
hasManyComments={hasManyComments}
hideManyCommentsButton={hideManyCommentsButton}
selectedFilter={selectedFilter}
selectedPermlink={_selectedPermlink || selectedPermlink}
author={author}
mainAuthor={mainAuthor}
isShowMoreButton={isShowMoreButton}
commentNumber={commentNumber || 1}
commentCount={commentCount}
comments={_comments.length > 0 ? _comments : comments}
currentAccountUsername={currentAccount.name}
handleOnEditPress={this._handleOnEditPress}
handleOnReplyPress={this._handleOnReplyPress}
isLoggedIn={isLoggedIn}
fetchPost={fetchPost}
handleDeleteComment={this._handleDeleteComment}
handleOnPressCommentMenu={this._handleOnPressCommentMenu}
isOwnProfile={isOwnProfile}
isHideImage={isHideImage}
handleOnVotersPress={this._handleOnVotersPress}
isShowSubComments={isShowSubComments}
showAllComments={showAllComments}
/>
);
}
}
return (
<CommentsView
key={selectedFilter}
hasManyComments={hasManyComments}
hideManyCommentsButton={hideManyCommentsButton}
selectedFilter={selectedFilter}
selectedPermlink={_selectedPermlink || selectedPermlink}
author={author}
mainAuthor={mainAuthor}
isShowMoreButton={isShowMoreButton}
commentNumber={commentNumber || 1}
commentCount={commentCount}
comments={lcomments.length > 0 ? lcomments : comments}
currentAccountUsername={currentAccount.name}
handleOnEditPress={_handleOnEditPress}
handleOnReplyPress={_handleOnReplyPress}
isLoggedIn={isLoggedIn}
fetchPost={fetchPost}
handleDeleteComment={_handleDeleteComment}
handleOnPressCommentMenu={_handleOnPressCommentMenu}
isOwnProfile={isOwnProfile}
isHideImage={isHideImage}
handleOnVotersPress={_handleOnVotersPress}
isShowSubComments={isShowSubComments}
showAllComments={showAllComments}
/>
);
};
const mapStateToProps = state => ({
isLoggedIn: state.application.isLoggedIn,

View File

@ -1,5 +1,6 @@
import SummaryArea from './summaryArea/view/summaryAreaView';
import TagArea from './tagArea/view/tagAreaView';
import TitleArea from './titleArea/view/titleAreaView';
import TagInput from './tagInput/view/tagInputView';
export { SummaryArea, TagArea, TitleArea };
export { SummaryArea, TagArea, TitleArea, TagInput };

View File

@ -0,0 +1,14 @@
import EStyleSheet from 'react-native-extended-stylesheet';
export default EStyleSheet.create({
textInput: {
color: '$primaryBlack',
fontSize: 15,
fontFamily: '$editorFont',
backgroundColor: '$primaryBackgroundColor',
borderTopWidth: 1,
borderTopColor: '$primaryLightGray',
borderBottomWidth: 1,
borderBottomColor: '$primaryLightGray',
},
});

View File

@ -0,0 +1,115 @@
import React, { useState, useEffect } from 'react';
import { View, Alert } from 'react-native';
// Constants
// Components
import { TextInput } from '../../../textInput';
// Styles
import styles from './tagInputStyles';
import globalStyles from '../../../../globalStyles';
const TagInput = ({
value,
onChange,
handleIsValid,
componentID,
handleTagChanged,
intl,
isPreviewActive,
autoFocus,
}) => {
const [text, setText] = useState('');
const [height, setHeight] = useState(0);
useEffect(() => {
if (typeof value === 'string') {
setText(value);
} else {
setText(value.join(' '));
}
}, [value]);
// Component Functions
const _handleOnChange = _text => {
setText(_text.replace(/,/g, ' ').replace(/#/g, ''));
};
const _handleOnBlur = () => {
if (onChange) {
let cats = text.trim().split(' ');
if (handleTagChanged && cats.length > 0) {
cats.length > 10
? Alert.alert(
intl.formatMessage({ id: 'alert.error' }),
intl.formatMessage({ id: 'editor.limited_tags' }),
)
: cats.find(c => c.length > 24)
? Alert.alert(
intl.formatMessage({ id: 'alert.error' }),
intl.formatMessage({ id: 'editor.limited_length' }),
)
: cats.find(c => c.split('-').length > 2)
? Alert.alert(
intl.formatMessage({ id: 'alert.error' }),
intl.formatMessage({ id: 'editor.limited_dash' }),
)
: cats.find(c => c.indexOf(',') >= 0)
? Alert.alert(
intl.formatMessage({ id: 'alert.error' }),
intl.formatMessage({ id: 'editor.limited_space' }),
)
: cats.find(c => /[A-Z]/.test(c))
? Alert.alert(
intl.formatMessage({ id: 'alert.error' }),
intl.formatMessage({ id: 'editor.limited_lowercase' }),
)
: cats.find(c => !/^[a-z0-9-#]+$/.test(c))
? Alert.alert(
intl.formatMessage({ id: 'alert.error' }),
intl.formatMessage({ id: 'editor.limited_characters' }),
)
: cats.find(c => !/^[a-z-#]/.test(c))
? Alert.alert(
intl.formatMessage({ id: 'alert.error' }),
intl.formatMessage({ id: 'editor.limited_firstchar' }),
)
: cats.find(c => !/[a-z0-9]$/.test(c))
? Alert.alert(
intl.formatMessage({ id: 'alert.error' }),
intl.formatMessage({ id: 'editor.limited_lastchar' }),
)
: null;
handleTagChanged([...cats]);
}
onChange(text);
}
if (handleIsValid) {
handleIsValid(componentID, !!(text && text.length));
}
};
return (
<View style={[globalStyles.containerHorizontal16, { height: Math.max(35, height) }]}>
<TextInput
style={[styles.textInput, { height: Math.max(35, height) }]}
placeholderTextColor="#c1c5c7"
editable={!isPreviewActive}
maxLength={100}
placeholder={intl.formatMessage({
id: 'editor.tags',
})}
multiline
numberOfLines={2}
onContentSizeChange={event => {
setHeight(event.nativeEvent.contentSize.height);
}}
autoFocus={autoFocus}
onChangeText={textT => _handleOnChange(textT)}
onBlur={() => _handleOnBlur()}
value={text}
/>
</View>
);
};
export default TagInput;

View File

@ -38,7 +38,7 @@ import { SearchModal } from './searchModal';
import { SettingsItem } from './settingsItem';
import { SideMenu } from './sideMenu';
import { SummaryArea, TagArea, TitleArea } from './editorElements';
import { SummaryArea, TagArea, TitleArea, TagInput } from './editorElements';
import { TabBar } from './tabBar';
import { TextInput } from './textInput';
import { ToastNotification } from './toastNotification';
@ -170,6 +170,7 @@ export {
TabBar,
Tag,
TagArea,
TagInput,
Tags,
TextButton,
TextInput,

View File

@ -156,7 +156,7 @@ const CommentBody = ({
</TouchableOpacity>
);
},
br: (htmlAttribs, children, passProps) => {
br: (htmlAttribs, children, convertedCSSStyles, passProps) => {
return <Text {...passProps}>{'\n'}</Text>;
},
};
@ -166,7 +166,6 @@ const CommentBody = ({
return (
<HTML
html={body}
key={`key-${created.toString()}`}
onLinkPress={(evt, href, hrefAtr) => _handleOnLinkPress(evt, href, hrefAtr)}
containerStyle={styles.commentContainer}
textSelectable={textSelectable}

View File

@ -7,6 +7,7 @@ for (i = 0; i < images.length; i++) {
}
var resultStr = JSON.stringify(JSON.stringify(result)); // workaround
var message = 'window.ReactNativeWebView.postMessage(' + resultStr + ')';
images[i].setAttribute("onClick", message);
}

View File

@ -260,10 +260,26 @@ const PostBody = ({
}
.markdown-video-link {
max-width: 100%;
position: relative;
}
.markdown-video-play {
position: absolute;
width: 100px;
height: 100px;
background: url('data:image/png;base64,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') no-repeat center center;
z-index: 20;
opacity: 0.9;
left: 50%;
top: 50%;
margin-top: -100px;
transform: translateX(-50%) translateY(-50%);
-webkit-transform: translateX(-50%) translateY(-50%);
-moz-transform: translateX(-50%) translateY(-50%);
}
iframe {
width: 100%;
height: 320px;
height: 240px;
}
.pull-right {
float: right;

View File

@ -1,5 +1,5 @@
import React, { useEffect, useRef, useState, Fragment } from 'react';
import { View, Text, ScrollView, Dimensions, SafeAreaView } from 'react-native';
import React, { useCallback, useEffect, useRef, useState, Fragment } from 'react';
import { View, Text, ScrollView, Dimensions, SafeAreaView, RefreshControl } from 'react-native';
import { injectIntl } from 'react-intl';
import get from 'lodash/get';
import ActionSheet from 'react-native-actionsheet';
@ -43,6 +43,7 @@ const PostDisplayView = ({
const [scrollHeight, setScrollHeight] = useState(0);
const [isLoadedComments, setIsLoadedComments] = useState(false);
const actionSheet = useRef(null);
const [refreshing, setRefreshing] = useState(false);
// Component Life Cycles
useEffect(() => {
@ -52,6 +53,11 @@ const PostDisplayView = ({
}, []);
// Component Functions
const onRefresh = useCallback(() => {
setRefreshing(true);
fetchPost().then(() => setRefreshing(false));
}, [refreshing]);
const _handleOnScroll = event => {
const { y } = event.nativeEvent.contentOffset;
@ -164,6 +170,7 @@ const PostDisplayView = ({
style={styles.scroll}
onScroll={event => _handleOnScroll(event)}
scrollEventThrottle={16}
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />}
>
{parentPost && <ParentPost post={parentPost} />}

View File

@ -246,13 +246,21 @@
},
"editor": {
"title": "Title",
"tags": "tags",
"tags": "Tags (separate by space)",
"default_placeholder": "What would you like to write about today?",
"reply_placeholder": "What would you like to write about above post?",
"publish": "Publish",
"reply": "Reply",
"open_gallery": "Open Gallery",
"capture_photo": "Capture a photo"
"capture_photo": "Capture a photo",
"limited_tags": "Only 10 tags allowed, remove some",
"limited_length": "Maximum length of each tag should be 24",
"limited_dash": "Use one dash in each tag",
"limited_space": "Use space to separate tags",
"limited_lowercase": "Only use lower letters in tag",
"limited_characters": "Use only allowed characters in tag",
"limited_firstchar": "Tag must start with a letter",
"limited_lastchar": "Tag must end with letter or number"
},
"pincode": {
"enter_text": "Enter PIN to unlock",

View File

@ -79,11 +79,10 @@ import lightTheme from '../../../themes/lightTheme';
let previousAppState = 'background';
export const setPreviousAppState = () => {
previousAppState = AppState.currentState;
/*const appStateTimeout = setTimeout(() => {
console.log('current appstate timeout', AppState.currentState);
const appStateTimeout = setTimeout(() => {
previousAppState = AppState.currentState;
clearTimeout(appStateTimeout);
}, 2000);*/
}, 2000);
};
class ApplicationContainer extends Component {

View File

@ -11,6 +11,7 @@ import {
BasicHeader,
TitleArea,
TagArea,
TagInput,
SummaryArea,
PostForm,
MarkdownEditor,
@ -44,7 +45,6 @@ class EditorScreen extends Component {
// Component Life Cycles
UNSAFE_componentWillReceiveProps = async nextProps => {
const { draftPost, isUploading } = this.props;
if (nextProps.draftPost && draftPost !== nextProps.draftPost) {
await this.setState(prevState => ({
fields: {
@ -147,6 +147,8 @@ class EditorScreen extends Component {
fields.body = content;
} else if (componentID === 'title') {
fields.title = content;
} else if (componentID === 'tag-area') {
fields.tags = content;
}
if (
@ -167,11 +169,11 @@ class EditorScreen extends Component {
const { fields: _fields } = this.state;
const _tags = tags.filter(tag => tag && tag !== ' ');
const __tags = _tags.map(t => t.toLowerCase());
const __fields = { ..._fields, tags: [...__tags] };
const fields = { ..._fields, tags: [...__tags] };
await this.setState({ fields, isRemoveTag: false });
this._handleFormUpdate();
this.setState({ fields: __fields, isRemoveTag: false }, () => {
this._handleFormUpdate('tag-area', __fields.tags);
});
};
render() {
@ -222,14 +224,15 @@ class EditorScreen extends Component {
isPreviewActive={isPreviewActive}
>
{isReply && !isEdit && <SummaryArea summary={post.summary} />}
{!isReply && <TitleArea value={fields.title} componentID="title" intl={intl} />}
{!isReply && (
<TagArea
draftChips={fields.tags.length > 0 ? fields.tags : null}
isRemoveTag={isRemoveTag}
<TitleArea value={fields.title} componentID="title" intl={intl} autoFocus={true} />
)}
{!isReply && (
<TagInput
value={fields.tags}
componentID="tag-area"
handleTagChanged={this._handleOnTagAdded}
intl={intl}
handleTagChanged={this._handleOnTagAdded}
/>
)}
<MarkdownEditor
@ -253,3 +256,12 @@ class EditorScreen extends Component {
}
export default injectIntl(EditorScreen);
/*
<TagArea
draftChips={fields.tags.length > 0 ? fields.tags : null}
isRemoveTag={isRemoveTag}
componentID="tag-area"
handleTagChanged={this._handleOnTagAdded}
intl={intl}
/>
*/

View File

@ -1113,10 +1113,10 @@
exec-sh "^0.3.2"
minimist "^1.2.0"
"@esteemapp/esteem-render-helpers@^1.2.9":
version "1.2.9"
resolved "https://registry.yarnpkg.com/@esteemapp/esteem-render-helpers/-/esteem-render-helpers-1.2.9.tgz#b4b6bd7e346e323a8d99bfce84928770443316b1"
integrity sha512-mQ/rweQQYiVfMU++SkAILrn8s34PtaKR+5wVmfq1qh1JHDVFLqw0PjIPjw/kNphKo55J4zIooKMNKYfkwmzlfQ==
"@esteemapp/esteem-render-helpers@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@esteemapp/esteem-render-helpers/-/esteem-render-helpers-1.3.0.tgz#a109eb8ff045aae7dd0bc7462a79123928c3f8ff"
integrity sha512-hIe5Q6e6rw4y7nHfVcryeKJFrlyW5JXnhxcg65gMHE29fqV4M+iH4wzrMLQuFZFA9SSKL1yYZHuVVrN2/MMdHQ==
dependencies:
he "^1.2.0"
path "^0.12.7"