mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React from 'react' 2import {Pressable, View} from 'react-native' 3import {msg} from '@lingui/macro' 4import {useLingui} from '@lingui/react' 5 6import {useRequireAuth} from '#/state/session' 7import {useSession} from '#/state/session' 8import {atoms as a, useTheme} from '#/alf' 9import {Button} from '#/components/Button' 10import {CloseQuote_Stroke2_Corner1_Rounded as Quote} from '#/components/icons/Quote' 11import {Repost_Stroke2_Corner2_Rounded as Repost} from '#/components/icons/Repost' 12import * as Menu from '#/components/Menu' 13import {Text} from '#/components/Typography' 14import {EventStopper} from '../EventStopper' 15import {formatCount} from '../numeric/format' 16 17interface Props { 18 isReposted: boolean 19 repostCount?: number 20 onRepost: () => void 21 onQuote: () => void 22 big?: boolean 23 embeddingDisabled: boolean 24} 25 26export const RepostButton = ({ 27 isReposted, 28 repostCount, 29 onRepost, 30 onQuote, 31 big, 32 embeddingDisabled, 33}: Props) => { 34 const t = useTheme() 35 const {_} = useLingui() 36 const {hasSession} = useSession() 37 const requireAuth = useRequireAuth() 38 39 const color = React.useMemo( 40 () => ({ 41 color: isReposted ? t.palette.positive_600 : t.palette.contrast_500, 42 }), 43 [t, isReposted], 44 ) 45 46 return hasSession ? ( 47 <EventStopper onKeyDown={false}> 48 <Menu.Root> 49 <Menu.Trigger label={_(msg`Repost or quote post`)}> 50 {({props, state}) => { 51 return ( 52 <Pressable 53 {...props} 54 style={[ 55 a.rounded_full, 56 (state.hovered || state.pressed) && { 57 backgroundColor: t.palette.contrast_25, 58 }, 59 ]}> 60 <RepostInner 61 isReposted={isReposted} 62 color={color} 63 repostCount={repostCount} 64 big={big} 65 /> 66 </Pressable> 67 ) 68 }} 69 </Menu.Trigger> 70 <Menu.Outer style={{minWidth: 170}}> 71 <Menu.Item 72 label={isReposted ? _(msg`Undo repost`) : _(msg`Repost`)} 73 testID="repostDropdownRepostBtn" 74 onPress={onRepost}> 75 <Menu.ItemText> 76 {isReposted ? _(msg`Undo repost`) : _(msg`Repost`)} 77 </Menu.ItemText> 78 <Menu.ItemIcon icon={Repost} position="right" /> 79 </Menu.Item> 80 <Menu.Item 81 disabled={embeddingDisabled} 82 label={ 83 embeddingDisabled 84 ? _(msg`Quote posts disabled`) 85 : _(msg`Quote post`) 86 } 87 testID="repostDropdownQuoteBtn" 88 onPress={onQuote}> 89 <Menu.ItemText> 90 {embeddingDisabled 91 ? _(msg`Quote posts disabled`) 92 : _(msg`Quote post`)} 93 </Menu.ItemText> 94 <Menu.ItemIcon icon={Quote} position="right" /> 95 </Menu.Item> 96 </Menu.Outer> 97 </Menu.Root> 98 </EventStopper> 99 ) : ( 100 <Button 101 onPress={() => { 102 requireAuth(() => {}) 103 }} 104 label={_(msg`Repost or quote post`)} 105 style={{padding: 0}} 106 hoverStyle={t.atoms.bg_contrast_25} 107 shape="round"> 108 <RepostInner 109 isReposted={isReposted} 110 color={color} 111 repostCount={repostCount} 112 big={big} 113 /> 114 </Button> 115 ) 116} 117 118const RepostInner = ({ 119 isReposted, 120 color, 121 repostCount, 122 big, 123}: { 124 isReposted: boolean 125 color: {color: string} 126 repostCount?: number 127 big?: boolean 128}) => { 129 const {i18n} = useLingui() 130 return ( 131 <View style={[a.flex_row, a.align_center, a.gap_xs, {padding: 5}]}> 132 <Repost style={color} width={big ? 22 : 18} /> 133 {typeof repostCount !== 'undefined' && repostCount > 0 ? ( 134 <Text 135 testID="repostCount" 136 style={[ 137 color, 138 big ? a.text_md : {fontSize: 15}, 139 isReposted && [a.font_bold], 140 a.user_select_none, 141 ]}> 142 {formatCount(i18n, repostCount)} 143 </Text> 144 ) : undefined} 145 </View> 146 ) 147}