diff options
author | dan <dan.abramov@gmail.com> | 2024-07-25 19:53:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-25 19:53:12 +0100 |
commit | 4291711f1d4bf3921b1e805d7726b0764757f257 (patch) | |
tree | 37e9a0c20dbe2b723fe2bcf722b3550a94b5b8d8 /src/view | |
parent | fac1af43b0300e9d9be16641afc4fbeef0a91ccf (diff) | |
download | voidsky-4291711f1d4bf3921b1e805d7726b0764757f257.tar.zst |
Fix sloppy filter(Boolean) types (#4830)
* Fix sloppy filter(Boolean) in threadgate * Fix sloppy filter(Boolean) in Explore * Fix sloppy filter(Boolean) in post-feed * Harden FeedPostSliceItem.reason type def * Harden parentAuthor types * Fix lying component types, handle blocks
Diffstat (limited to 'src/view')
-rw-r--r-- | src/view/com/posts/FeedItem.tsx | 76 | ||||
-rw-r--r-- | src/view/screens/Search/Explore.tsx | 17 |
2 files changed, 56 insertions, 37 deletions
diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx index a59eeea52..dbc5796db 100644 --- a/src/view/com/posts/FeedItem.tsx +++ b/src/view/com/posts/FeedItem.tsx @@ -48,7 +48,11 @@ import {Repost_Stroke2_Corner2_Rounded as Repost} from '#/components/icons/Repos interface FeedItemProps { record: AppBskyFeedPost.Record - reason: AppBskyFeedDefs.ReasonRepost | ReasonFeedSource | undefined + reason: + | AppBskyFeedDefs.ReasonRepost + | ReasonFeedSource + | {[k: string]: unknown; $type: string} + | undefined moderation: ModerationDecision parentAuthor: AppBskyActorDefs.ProfileViewBasic | undefined showReplyTo: boolean @@ -337,9 +341,11 @@ let FeedItemInner = ({ postHref={href} onOpenAuthor={onOpenAuthor} /> - {!isThreadChild && showReplyTo && parentAuthor && ( - <ReplyToLabel blocked={isParentBlocked} profile={parentAuthor} /> - )} + {!isThreadChild && + showReplyTo && + (parentAuthor || isParentBlocked) && ( + <ReplyToLabel blocked={isParentBlocked} profile={parentAuthor} /> + )} <LabelsOnMyPost post={post} /> <PostContent moderation={moderation} @@ -431,12 +437,46 @@ function ReplyToLabel({ profile, blocked, }: { - profile: AppBskyActorDefs.ProfileViewBasic + profile: AppBskyActorDefs.ProfileViewBasic | undefined blocked?: boolean }) { const pal = usePalette('default') const {currentAccount} = useSession() - const isMe = profile.did === currentAccount?.did + + let label + if (blocked) { + label = <Trans context="description">Reply to a blocked post</Trans> + } else if (profile != null) { + const isMe = profile.did === currentAccount?.did + if (isMe) { + label = <Trans context="description">Reply to you</Trans> + } else { + label = ( + <Trans context="description"> + Reply to{' '} + <ProfileHoverCard inline did={profile.did}> + <TextLinkOnWebOnly + type="md" + style={pal.textLight} + lineHeight={1.2} + numberOfLines={1} + href={makeProfileLink(profile)} + text={ + profile.displayName + ? sanitizeDisplayName(profile.displayName) + : sanitizeHandle(profile.handle) + } + /> + </ProfileHoverCard> + </Trans> + ) + } + } + + if (!label) { + // Should not happen. + return null + } return ( <View style={[s.flexRow, s.mb2, s.alignCenter]}> @@ -450,29 +490,7 @@ function ReplyToLabel({ style={[pal.textLight, s.mr2]} lineHeight={1.2} numberOfLines={1}> - {isMe ? ( - <Trans context="description">Reply to you</Trans> - ) : blocked ? ( - <Trans context="description">Reply to a blocked post</Trans> - ) : ( - <Trans context="description"> - Reply to{' '} - <ProfileHoverCard inline did={profile.did}> - <TextLinkOnWebOnly - type="md" - style={pal.textLight} - lineHeight={1.2} - numberOfLines={1} - href={makeProfileLink(profile)} - text={ - profile.displayName - ? sanitizeDisplayName(profile.displayName) - : sanitizeHandle(profile.handle) - } - /> - </ProfileHoverCard> - </Trans> - )} + {label} </Text> </View> ) diff --git a/src/view/screens/Search/Explore.tsx b/src/view/screens/Search/Explore.tsx index 05fd85eff..e9b744527 100644 --- a/src/view/screens/Search/Explore.tsx +++ b/src/view/screens/Search/Explore.tsx @@ -75,17 +75,17 @@ function SuggestedItemsHeader({ ) } -type LoadMoreItems = +type LoadMoreItem = | { type: 'profile' key: string - avatar: string + avatar: string | undefined moderation: ModerationDecision } | { type: 'feed' key: string - avatar: string + avatar: string | undefined moderation: undefined } @@ -98,27 +98,28 @@ function LoadMore({ }) { const t = useTheme() const {_} = useLingui() - const items = React.useMemo(() => { + const items: LoadMoreItem[] = React.useMemo(() => { return item.items .map(_item => { + let loadMoreItem: LoadMoreItem | undefined if (_item.type === 'profile') { - return { + loadMoreItem = { type: 'profile', key: _item.profile.did, avatar: _item.profile.avatar, moderation: moderateProfile(_item.profile, moderationOpts!), } } else if (_item.type === 'feed') { - return { + loadMoreItem = { type: 'feed', key: _item.feed.uri, avatar: _item.feed.avatar, moderation: undefined, } } - return undefined + return loadMoreItem }) - .filter(Boolean) as LoadMoreItems[] + .filter(<T,>(n?: T): n is T => Boolean(n)) }, [item.items, moderationOpts]) if (items.length === 0) return null |