Implement like and repost

This commit is contained in:
Paul Frazee 2022-07-22 11:18:47 -05:00
parent cc8a170204
commit 0ec0ba996f
12 changed files with 307 additions and 40 deletions

View file

@ -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',
},
})

View file

@ -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} />
)

View file

@ -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',
},
})

View file

@ -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,

View file

@ -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},