diff options
Diffstat (limited to 'src/view/com/notifications/FeedItem.tsx')
-rw-r--r-- | src/view/com/notifications/FeedItem.tsx | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/src/view/com/notifications/FeedItem.tsx b/src/view/com/notifications/FeedItem.tsx index 9cd7a2917..2f8d65a1d 100644 --- a/src/view/com/notifications/FeedItem.tsx +++ b/src/view/com/notifications/FeedItem.tsx @@ -52,7 +52,16 @@ import {TimeElapsed} from '../util/TimeElapsed' import {PreviewableUserAvatar, UserAvatar} from '../util/UserAvatar' import hairlineWidth = StyleSheet.hairlineWidth +import {useNavigation} from '@react-navigation/native' + import {parseTenorGif} from '#/lib/strings/embed-player' +import {logger} from '#/logger' +import {NavigationProp} from 'lib/routes/types' +import {DM_SERVICE_HEADERS} from 'state/queries/messages/const' +import {useAgent} from 'state/session' +import {Button, ButtonText} from '#/components/Button' +import {StarterPack} from '#/components/icons/StarterPack' +import {Notification as StarterPackCard} from '#/components/StarterPack/StarterPackCard' const MAX_AUTHORS = 5 @@ -89,7 +98,10 @@ let FeedItem = ({ } else if (item.type === 'reply') { const urip = new AtUri(item.notification.uri) return `/profile/${urip.host}/post/${urip.rkey}` - } else if (item.type === 'feedgen-like') { + } else if ( + item.type === 'feedgen-like' || + item.type === 'starterpack-joined' + ) { if (item.subjectUri) { const urip = new AtUri(item.subjectUri) return `/profile/${urip.host}/feed/${urip.rkey}` @@ -176,6 +188,13 @@ let FeedItem = ({ icon = <PersonPlusIcon size="xl" style={{color: t.palette.primary_500}} /> } else if (item.type === 'feedgen-like') { action = _(msg`liked your custom feed`) + } else if (item.type === 'starterpack-joined') { + icon = ( + <View style={{height: 30, width: 30}}> + <StarterPack width={30} gradient="sky" /> + </View> + ) + action = _(msg`signed up with your starter pack`) } else { return null } @@ -289,6 +308,20 @@ let FeedItem = ({ showLikes /> ) : null} + {item.type === 'starterpack-joined' ? ( + <View> + <View + style={[ + a.border, + a.p_sm, + a.rounded_sm, + a.mt_sm, + t.atoms.border_contrast_low, + ]}> + <StarterPackCard starterPack={item.subject} /> + </View> + </View> + ) : null} </View> </Link> ) @@ -319,14 +352,63 @@ function ExpandListPressable({ } } +function SayHelloBtn({profile}: {profile: AppBskyActorDefs.ProfileViewBasic}) { + const {_} = useLingui() + const agent = useAgent() + const navigation = useNavigation<NavigationProp>() + const [isLoading, setIsLoading] = React.useState(false) + + if ( + profile.associated?.chat?.allowIncoming === 'none' || + (profile.associated?.chat?.allowIncoming === 'following' && + !profile.viewer?.followedBy) + ) { + return null + } + + return ( + <Button + label={_(msg`Say hello!`)} + variant="ghost" + color="primary" + size="xsmall" + style={[a.self_center, {marginLeft: 'auto'}]} + disabled={isLoading} + onPress={async () => { + try { + setIsLoading(true) + const res = await agent.api.chat.bsky.convo.getConvoForMembers( + { + members: [profile.did, agent.session!.did!], + }, + {headers: DM_SERVICE_HEADERS}, + ) + navigation.navigate('MessagesConversation', { + conversation: res.data.convo.id, + }) + } catch (e) { + logger.error('Failed to get conversation', {safeMessage: e}) + } finally { + setIsLoading(false) + } + }}> + <ButtonText> + <Trans>Say hello!</Trans> + </ButtonText> + </Button> + ) +} + function CondensedAuthorsList({ visible, authors, onToggleAuthorsExpanded, + showDmButton = true, }: { visible: boolean authors: Author[] onToggleAuthorsExpanded: () => void + showDmButton?: boolean }) { const pal = usePalette('default') const {_} = useLingui() @@ -355,7 +437,7 @@ function CondensedAuthorsList({ } if (authors.length === 1) { return ( - <View style={styles.avis}> + <View style={[styles.avis]}> <PreviewableUserAvatar size={35} profile={authors[0].profile} @@ -363,6 +445,7 @@ function CondensedAuthorsList({ type={authors[0].profile.associated?.labeler ? 'labeler' : 'user'} accessible={false} /> + {showDmButton ? <SayHelloBtn profile={authors[0].profile} /> : null} </View> ) } |