diff options
Diffstat (limited to 'src/view')
-rw-r--r-- | src/view/com/feed/FeedItem.tsx | 49 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThread.tsx | 2 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThreadItem.tsx | 49 | ||||
-rw-r--r-- | src/view/index.ts | 2 | ||||
-rw-r--r-- | src/view/lib/styles.ts | 3 |
5 files changed, 86 insertions, 19 deletions
diff --git a/src/view/com/feed/FeedItem.tsx b/src/view/com/feed/FeedItem.tsx index 5e5a82a77..6ba1401c9 100644 --- a/src/view/com/feed/FeedItem.tsx +++ b/src/view/com/feed/FeedItem.tsx @@ -30,6 +30,16 @@ export const FeedItem = observer(function FeedItem({ name: item.author.name, }) } + const onPressToggleRepost = () => { + item + .toggleRepost() + .catch(e => console.error('Failed to toggle repost', record, e)) + } + const onPressToggleLike = () => { + item + .toggleLike() + .catch(e => console.error('Failed to toggle like', record, e)) + } return ( <TouchableOpacity style={styles.outer} onPress={onPressOuter}> @@ -75,21 +85,34 @@ export const FeedItem = observer(function FeedItem({ /> <Text>{item.replyCount}</Text> </View> - <View style={styles.ctrl}> + <TouchableOpacity style={styles.ctrl} onPress={onPressToggleRepost}> <FontAwesomeIcon - style={styles.ctrlIcon} + style={ + item.myState.hasReposted + ? styles.ctrlIconReposted + : styles.ctrlIcon + } icon="retweet" size={22} /> - <Text>{item.repostCount}</Text> - </View> - <View style={styles.ctrl}> + <Text + style={ + item.myState.hasReposted ? [s.bold, s.green] : undefined + }> + {item.repostCount} + </Text> + </TouchableOpacity> + <TouchableOpacity style={styles.ctrl} onPress={onPressToggleLike}> <FontAwesomeIcon - style={styles.ctrlIcon} - icon={['far', 'heart']} + style={ + item.myState.hasLiked ? styles.ctrlIconLiked : styles.ctrlIcon + } + icon={[item.myState.hasLiked ? 'fas' : 'far', 'heart']} /> - <Text>{item.likeCount}</Text> - </View> + <Text style={item.myState.hasLiked ? [s.bold, s.red] : undefined}> + {item.likeCount} + </Text> + </TouchableOpacity> <View style={styles.ctrl}> <FontAwesomeIcon style={styles.ctrlIcon} @@ -158,4 +181,12 @@ const styles = StyleSheet.create({ marginRight: 5, color: 'gray', }, + ctrlIconReposted: { + marginRight: 5, + color: 'green', + }, + ctrlIconLiked: { + marginRight: 5, + color: 'red', + }, }) diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx index 3623abde4..8f70e1493 100644 --- a/src/view/com/post-thread/PostThread.tsx +++ b/src/view/com/post-thread/PostThread.tsx @@ -56,7 +56,7 @@ export const PostThread = observer(function PostThread({ // loaded // = - const posts = Array.from(flattenThread(view.thread)) + const posts = view.thread ? Array.from(flattenThread(view.thread)) : [] const renderItem = ({item}: {item: PostThreadViewPostModel}) => ( <PostThreadItem item={item} onNavigateContent={onNavigateContent} /> ) diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 8628f67c1..896eab89f 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -40,6 +40,16 @@ export const PostThreadItem = observer(function PostThreadItem({ name: item.author.name, }) } + const onPressToggleRepost = () => { + item + .toggleRepost() + .catch(e => console.error('Failed to toggle repost', record, e)) + } + const onPressToggleLike = () => { + item + .toggleLike() + .catch(e => console.error('Failed to toggle like', record, e)) + } return ( <TouchableOpacity style={styles.outer} onPress={onPressOuter}> @@ -108,21 +118,34 @@ export const PostThreadItem = observer(function PostThreadItem({ /> <Text>{item.replyCount}</Text> </View> - <View style={styles.ctrl}> + <TouchableOpacity style={styles.ctrl} onPress={onPressToggleRepost}> <FontAwesomeIcon - style={styles.ctrlIcon} + style={ + item.myState.hasReposted + ? styles.ctrlIconReposted + : styles.ctrlIcon + } icon="retweet" size={22} /> - <Text>{item.repostCount}</Text> - </View> - <View style={styles.ctrl}> + <Text + style={ + item.myState.hasReposted ? [s.bold, s.green] : undefined + }> + {item.repostCount} + </Text> + </TouchableOpacity> + <TouchableOpacity style={styles.ctrl} onPress={onPressToggleLike}> <FontAwesomeIcon - style={styles.ctrlIcon} - icon={['far', 'heart']} + style={ + item.myState.hasLiked ? styles.ctrlIconLiked : styles.ctrlIcon + } + icon={[item.myState.hasLiked ? 'fas' : 'far', 'heart']} /> - <Text>{item.likeCount}</Text> - </View> + <Text style={item.myState.hasLiked ? [s.bold, s.red] : undefined}> + {item.likeCount} + </Text> + </TouchableOpacity> <View style={styles.ctrl}> <FontAwesomeIcon style={styles.ctrlIcon} @@ -205,4 +228,12 @@ const styles = StyleSheet.create({ marginRight: 5, color: 'gray', }, + ctrlIconReposted: { + marginRight: 5, + color: 'green', + }, + ctrlIconLiked: { + marginRight: 5, + color: 'red', + }, }) diff --git a/src/view/index.ts b/src/view/index.ts index 8e3b00798..c80e929c1 100644 --- a/src/view/index.ts +++ b/src/view/index.ts @@ -6,6 +6,7 @@ import {faBars} from '@fortawesome/free-solid-svg-icons/faBars' import {faBell} from '@fortawesome/free-solid-svg-icons/faBell' import {faComment} from '@fortawesome/free-regular-svg-icons/faComment' import {faHeart} from '@fortawesome/free-regular-svg-icons/faHeart' +import {faHeart as fasHeart} from '@fortawesome/free-solid-svg-icons/faHeart' import {faHouse} from '@fortawesome/free-solid-svg-icons/faHouse' import {faMagnifyingGlass} from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass' import {faShareFromSquare} from '@fortawesome/free-solid-svg-icons/faShareFromSquare' @@ -38,6 +39,7 @@ export function setup() { faBell, faComment, faHeart, + fasHeart, faHouse, faMagnifyingGlass, faRetweet, diff --git a/src/view/lib/styles.ts b/src/view/lib/styles.ts index d80e2d030..f0796723c 100644 --- a/src/view/lib/styles.ts +++ b/src/view/lib/styles.ts @@ -34,6 +34,9 @@ export const s = StyleSheet.create({ // colors black: {color: 'black'}, gray: {color: 'gray'}, + blue: {color: 'blue'}, + green: {color: 'green'}, + red: {color: 'red'}, // margins mr2: {marginRight: 2}, |