diff options
author | Paul Frazee <pfrazee@gmail.com> | 2022-11-28 09:49:41 -0600 |
---|---|---|
committer | Paul Frazee <pfrazee@gmail.com> | 2022-11-28 09:49:41 -0600 |
commit | 490a3bb751d95ccb7313a0805baf78ab6e62d944 (patch) | |
tree | 2aa147d1cf7719c180b8f8c072eb9df669efd80a | |
parent | b978a2f18bbe906e628a065f6c690073f6d10a3a (diff) | |
download | voidsky-490a3bb751d95ccb7313a0805baf78ab6e62d944.tar.zst |
Tune post-thread expanded view: add reply prompt, fix spacing and sizing
-rw-r--r-- | src/view/com/composer/Prompt.tsx | 40 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThreadItem.tsx | 205 | ||||
-rw-r--r-- | src/view/com/util/PostCtrls.tsx | 62 |
3 files changed, 172 insertions, 135 deletions
diff --git a/src/view/com/composer/Prompt.tsx b/src/view/com/composer/Prompt.tsx index f9fd7e7d3..7805e00dd 100644 --- a/src/view/com/composer/Prompt.tsx +++ b/src/view/com/composer/Prompt.tsx @@ -1,29 +1,42 @@ import React from 'react' import {StyleSheet, Text, TouchableOpacity, View} from 'react-native' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {colors} from '../../lib/styles' import {useStores} from '../../../state' import {UserAvatar} from '../util/UserAvatar' -export function ComposePrompt({onPressCompose}: {onPressCompose: () => void}) { +export function ComposePrompt({ + noAvi = false, + text = "What's up?", + btn = 'Post', + onPressCompose, +}: { + noAvi?: boolean + text?: string + btn?: string + onPressCompose: () => void +}) { const store = useStores() const onPressAvatar = () => { store.nav.navigate(`/profile/${store.me.handle}`) } return ( - <TouchableOpacity style={styles.container} onPress={onPressCompose}> - <TouchableOpacity style={styles.avatar} onPress={onPressAvatar}> - <UserAvatar - size={50} - handle={store.me.handle || ''} - displayName={store.me.displayName} - /> - </TouchableOpacity> + <TouchableOpacity + style={[styles.container, noAvi ? styles.noAviContainer : undefined]} + onPress={onPressCompose}> + {!noAvi ? ( + <TouchableOpacity style={styles.avatar} onPress={onPressAvatar}> + <UserAvatar + size={50} + handle={store.me.handle || ''} + displayName={store.me.displayName} + /> + </TouchableOpacity> + ) : undefined} <View style={styles.textContainer}> - <Text style={styles.text}>What's up?</Text> + <Text style={styles.text}>{text}</Text> </View> <View style={styles.btn}> - <Text style={styles.btnText}>Post</Text> + <Text style={styles.btnText}>{btn}</Text> </View> </TouchableOpacity> ) @@ -40,6 +53,9 @@ const styles = StyleSheet.create({ alignItems: 'center', backgroundColor: colors.white, }, + noAviContainer: { + paddingVertical: 14, + }, avatar: { width: 50, }, diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 8a2d5068e..3eefeae96 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -16,6 +16,7 @@ import {useStores} from '../../../state' import {PostMeta} from '../util/PostMeta' import {PostEmbeds} from '../util/PostEmbeds' import {PostCtrls} from '../util/PostCtrls' +import {ComposePrompt} from '../composer/Prompt' const PARENT_REPLY_LINE_LENGTH = 8 const REPLYING_TO_LINE_LENGTH = 6 @@ -93,116 +94,122 @@ export const PostThreadItem = observer(function PostThreadItem({ if (item._isHighlightedPost) { return ( - <View style={styles.outer}> - <View style={styles.layout}> - <View style={styles.layoutAvi}> - <Link href={authorHref} title={authorTitle}> - <UserAvatar - size={50} - displayName={item.author.displayName} - handle={item.author.handle} - /> - </Link> - </View> - <View style={styles.layoutContent}> - <View style={[styles.meta, {paddingTop: 5, paddingBottom: 0}]}> - <Link - style={styles.metaItem} - href={authorHref} - title={authorTitle}> - <Text style={[s.f16, s.bold]} numberOfLines={1}> - {item.author.displayName || item.author.handle} - </Text> - </Link> - <Text style={[styles.metaItem, s.f15, s.gray5]}> - · {ago(item.indexedAt)} - </Text> - <View style={s.flex1} /> - <PostDropdownBtn - style={styles.metaItem} - itemHref={itemHref} - itemTitle={itemTitle} - isAuthor={item.author.did === store.me.did} - onDeletePost={onDeletePost}> - <FontAwesomeIcon - icon="ellipsis-h" - size={14} - style={[s.mt2, s.mr5]} + <> + <View style={styles.outer}> + <View style={styles.layout}> + <View style={styles.layoutAvi}> + <Link href={authorHref} title={authorTitle}> + <UserAvatar + size={50} + displayName={item.author.displayName} + handle={item.author.handle} /> - </PostDropdownBtn> - </View> - <View style={styles.meta}> - <Link - style={styles.metaItem} - href={authorHref} - title={authorTitle}> - <Text style={[s.f15, s.gray5]} numberOfLines={1}> - @{item.author.handle} - </Text> </Link> </View> - </View> - </View> - <View style={[s.pl10, s.pr10, s.pb10]}> - <View - style={[styles.postTextContainer, styles.postTextLargeContainer]}> - <RichText - text={record.text} - entities={record.entities} - style={[styles.postText, styles.postTextLarge]} - /> - </View> - <PostEmbeds entities={record.entities} /> - {item._isHighlightedPost && hasEngagement ? ( - <View style={styles.expandedInfo}> - {item.repostCount ? ( + <View style={styles.layoutContent}> + <View style={[styles.meta, {paddingTop: 5, paddingBottom: 0}]}> <Link - style={styles.expandedInfoItem} - href={repostsHref} - title={repostsTitle}> - <Text style={[s.gray5, s.semiBold, s.f18]}> - <Text style={[s.bold, s.black, s.f18]}> - {item.repostCount} - </Text>{' '} - {pluralize(item.repostCount, 'repost')} + style={styles.metaItem} + href={authorHref} + title={authorTitle}> + <Text style={[s.f16, s.bold]} numberOfLines={1}> + {item.author.displayName || item.author.handle} </Text> </Link> - ) : ( - <></> - )} - {item.upvoteCount ? ( + <Text style={[styles.metaItem, s.f15, s.gray5]}> + · {ago(item.indexedAt)} + </Text> + <View style={s.flex1} /> + <PostDropdownBtn + style={styles.metaItem} + itemHref={itemHref} + itemTitle={itemTitle} + isAuthor={item.author.did === store.me.did} + onDeletePost={onDeletePost}> + <FontAwesomeIcon + icon="ellipsis-h" + size={14} + style={[s.mt2, s.mr5]} + /> + </PostDropdownBtn> + </View> + <View style={styles.meta}> <Link - style={styles.expandedInfoItem} - href={upvotesHref} - title={upvotesTitle}> - <Text style={[s.gray5, s.semiBold, s.f18]}> - <Text style={[s.bold, s.black, s.f18]}> - {item.upvoteCount} - </Text>{' '} - {pluralize(item.upvoteCount, 'upvote')} + style={styles.metaItem} + href={authorHref} + title={authorTitle}> + <Text style={[s.f15, s.gray5]} numberOfLines={1}> + @{item.author.handle} </Text> </Link> - ) : ( - <></> - )} + </View> + </View> + </View> + <View style={[s.pl10, s.pr10, s.pb10]}> + <View + style={[styles.postTextContainer, styles.postTextLargeContainer]}> + <RichText + text={record.text} + entities={record.entities} + style={[styles.postText, styles.postTextLarge]} + /> + </View> + <PostEmbeds entities={record.entities} style={s.mb10} /> + {item._isHighlightedPost && hasEngagement ? ( + <View style={styles.expandedInfo}> + {item.repostCount ? ( + <Link + style={styles.expandedInfoItem} + href={repostsHref} + title={repostsTitle}> + <Text style={[s.gray5, s.semiBold, s.f17]}> + <Text style={[s.bold, s.black, s.f17]}> + {item.repostCount} + </Text>{' '} + {pluralize(item.repostCount, 'repost')} + </Text> + </Link> + ) : ( + <></> + )} + {item.upvoteCount ? ( + <Link + style={styles.expandedInfoItem} + href={upvotesHref} + title={upvotesTitle}> + <Text style={[s.gray5, s.semiBold, s.f17]}> + <Text style={[s.bold, s.black, s.f17]}> + {item.upvoteCount} + </Text>{' '} + {pluralize(item.upvoteCount, 'upvote')} + </Text> + </Link> + ) : ( + <></> + )} + </View> + ) : ( + <></> + )} + <View style={[s.pl10, s.pb5]}> + <PostCtrls + big + isReposted={!!item.myState.repost} + isUpvoted={!!item.myState.upvote} + onPressReply={onPressReply} + onPressToggleRepost={onPressToggleRepost} + onPressToggleUpvote={onPressToggleUpvote} + /> </View> - ) : ( - <></> - )} - <View style={[s.pl10]}> - <PostCtrls - replyCount={item.replyCount} - repostCount={item.repostCount} - upvoteCount={item.upvoteCount} - isReposted={!!item.myState.repost} - isUpvoted={!!item.myState.upvote} - onPressReply={onPressReply} - onPressToggleRepost={onPressToggleRepost} - onPressToggleUpvote={onPressToggleUpvote} - /> </View> </View> - </View> + <ComposePrompt + noAvi + text="Write your reply" + btn="Reply" + onPressCompose={onPressReply} + /> + </> ) } else { return ( @@ -371,7 +378,7 @@ const styles = StyleSheet.create({ borderTopWidth: 1, borderBottomWidth: 1, marginTop: 5, - marginBottom: 10, + marginBottom: 15, }, expandedInfoItem: { marginRight: 10, diff --git a/src/view/com/util/PostCtrls.tsx b/src/view/com/util/PostCtrls.tsx index a316d8959..36a67b53d 100644 --- a/src/view/com/util/PostCtrls.tsx +++ b/src/view/com/util/PostCtrls.tsx @@ -12,9 +12,10 @@ import {UpIcon, UpIconSolid} from '../../lib/icons' import {s, colors} from '../../lib/styles' interface PostCtrlsOpts { - replyCount: number - repostCount: number - upvoteCount: number + big?: boolean + replyCount?: number + repostCount?: number + upvoteCount?: number isReposted: boolean isUpvoted: boolean onPressReply: () => void @@ -62,9 +63,11 @@ export function PostCtrls(opts: PostCtrlsOpts) { <FontAwesomeIcon style={styles.ctrlIcon} icon={['far', 'comment']} - size={14} + size={opts.big ? 20 : 14} /> - <Text style={[sRedgray, s.ml5, s.f16]}>{opts.replyCount}</Text> + {typeof opts.replyCount !== 'undefined' ? ( + <Text style={[sRedgray, s.ml5, s.f16]}>{opts.replyCount}</Text> + ) : undefined} </TouchableOpacity> </View> <View style={s.flex1}> @@ -77,17 +80,19 @@ export function PostCtrls(opts: PostCtrlsOpts) { opts.isReposted ? styles.ctrlIconReposted : styles.ctrlIcon } icon="retweet" - size={18} + size={opts.big ? 22 : 18} /> </Animated.View> - <Text - style={ - opts.isReposted - ? [s.bold, s.green3, s.f16, s.ml5] - : [sRedgray, s.f16, s.ml5] - }> - {opts.repostCount} - </Text> + {typeof opts.repostCount !== 'undefined' ? ( + <Text + style={ + opts.isReposted + ? [s.bold, s.green3, s.f16, s.ml5] + : [sRedgray, s.f16, s.ml5] + }> + {opts.repostCount} + </Text> + ) : undefined} </TouchableOpacity> </View> <View style={s.flex1}> @@ -96,19 +101,28 @@ export function PostCtrls(opts: PostCtrlsOpts) { onPress={onPressToggleUpvoteWrapper}> <Animated.View style={anim2Style}> {opts.isUpvoted ? ( - <UpIconSolid style={[styles.ctrlIconUpvoted]} size={18} /> + <UpIconSolid + style={[styles.ctrlIconUpvoted]} + size={opts.big ? 22 : 18} + /> ) : ( - <UpIcon style={[styles.ctrlIcon]} size={18} strokeWidth={1.5} /> + <UpIcon + style={[styles.ctrlIcon]} + size={opts.big ? 22 : 18} + strokeWidth={1.5} + /> )} </Animated.View> - <Text - style={ - opts.isUpvoted - ? [s.bold, s.red3, s.f16, s.ml5] - : [sRedgray, s.f16, s.ml5] - }> - {opts.upvoteCount} - </Text> + {typeof opts.upvoteCount !== 'undefined' ? ( + <Text + style={ + opts.isUpvoted + ? [s.bold, s.red3, s.f16, s.ml5] + : [sRedgray, s.f16, s.ml5] + }> + {opts.upvoteCount} + </Text> + ) : undefined} </TouchableOpacity> </View> <View style={s.flex1}></View> |