diff options
author | Paul Frazee <pfrazee@gmail.com> | 2022-09-28 15:36:25 -0500 |
---|---|---|
committer | Paul Frazee <pfrazee@gmail.com> | 2022-09-28 15:36:25 -0500 |
commit | b4ad0cff4bbf77448b7bb49e1421ef2ab3271b66 (patch) | |
tree | 33f1f1045fabb2859909c2ffa2c4acc2cf4b8851 /src | |
parent | a21a0d29884dfa5a21f15a8a3684c48ecdf90b40 (diff) | |
download | voidsky-b4ad0cff4bbf77448b7bb49e1421ef2ab3271b66.tar.zst |
Add reply information to feed items
Diffstat (limited to 'src')
-rw-r--r-- | src/view/com/posts/FeedItem.tsx | 24 | ||||
-rw-r--r-- | src/view/com/util/UserInfoText.tsx | 48 |
2 files changed, 72 insertions, 0 deletions
diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx index 684b261a8..53abc4309 100644 --- a/src/view/com/posts/FeedItem.tsx +++ b/src/view/com/posts/FeedItem.tsx @@ -8,6 +8,7 @@ import {FeedViewItemModel} from '../../../state/models/feed-view' import {ComposePostModel, SharePostModel} from '../../../state/models/shell' import {Link} from '../util/Link' import {PostDropdownBtn} from '../util/DropdownBtn' +import {UserInfoText} from '../util/UserInfoText' import {s, colors} from '../../lib/styles' import {ago} from '../../lib/strings' import {DEF_AVATER} from '../../lib/assets' @@ -26,6 +27,16 @@ export const FeedItem = observer(function FeedItem({ }, [item.uri, item.author.name]) const itemTitle = `Post by ${item.author.name}` const authorHref = `/profile/${item.author.name}` + const replyAuthorDid = useMemo(() => { + if (!record.reply) return '' + const urip = new AdxUri(record.reply.parent || record.reply.root) + return urip.hostname + }, [record.reply]) + const replyHref = useMemo(() => { + if (!record.reply) return '' + const urip = new AdxUri(record.reply.parent || record.reply.root) + return `/profile/${urip.hostname}/post/${urip.recordKey}` + }, [record.reply]) const onPressReply = () => { store.shell.openModal(new ComposePostModel(item.uri)) @@ -90,6 +101,19 @@ export const FeedItem = observer(function FeedItem({ /> </PostDropdownBtn> </View> + {replyHref !== '' && ( + <View style={[s.flexRow, s.mb2, {alignItems: 'center'}]}> + <FontAwesomeIcon icon="reply" size={9} style={[s.gray4, s.mr5]} /> + <Text style={[s.gray4, s.f12, s.mr2]}>Reply to</Text> + <Link href={replyHref} title="Parent post"> + <UserInfoText + did={replyAuthorDid} + style={[s.f12, s.gray5]} + prefix="@" + /> + </Link> + </View> + )} <Text style={[styles.postText, s.f15, s['lh15-1.3']]}> {record.text} </Text> diff --git a/src/view/com/util/UserInfoText.tsx b/src/view/com/util/UserInfoText.tsx new file mode 100644 index 000000000..39aef3306 --- /dev/null +++ b/src/view/com/util/UserInfoText.tsx @@ -0,0 +1,48 @@ +import React, {useState, useEffect} from 'react' +import * as TodoSocialGetProfile from '../../../third-party/api/src/types/todo/social/getProfile' +import {StyleProp, Text, TextStyle} from 'react-native' +import {useStores} from '../../../state' + +export function UserInfoText({ + did, + attr, + loading, + failed, + prefix, + style, +}: { + did: string + attr?: keyof TodoSocialGetProfile.OutputSchema + loading?: string + failed?: string + prefix?: string + style?: StyleProp<TextStyle> +}) { + attr = attr || 'name' + loading = loading || '...' + failed = failed || 'user' + + const store = useStores() + const [profile, setProfile] = useState< + undefined | TodoSocialGetProfile.OutputSchema + >(undefined) + const [didFail, setFailed] = useState<boolean>(false) + + useEffect(() => { + // TODO use caching to reduce loads + store.api.todo.social.getProfile({user: did}).then( + v => { + setProfile(v.data) + }, + _err => { + setFailed(true) + }, + ) + }, [did, store.api.todo.social]) + + return ( + <Text style={style}> + {didFail ? failed : profile ? `${prefix}${profile[attr]}` : loading} + </Text> + ) +} |