Implement like and repost
This commit is contained in:
parent
cc8a170204
commit
0ec0ba996f
12 changed files with 307 additions and 40 deletions
|
@ -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',
|
||||
},
|
||||
})
|
||||
|
|
|
@ -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} />
|
||||
)
|
||||
|
|
|
@ -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',
|
||||
},
|
||||
})
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue