mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at verify-code 4.1 kB view raw
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 variant="ghost" 109 color="secondary"> 110 <RepostInner 111 isReposted={isReposted} 112 color={color} 113 repostCount={repostCount} 114 big={big} 115 /> 116 </Button> 117 ) 118} 119 120const RepostInner = ({ 121 isReposted, 122 color, 123 repostCount, 124 big, 125}: { 126 isReposted: boolean 127 color: {color: string} 128 repostCount?: number 129 big?: boolean 130}) => { 131 const {i18n} = useLingui() 132 return ( 133 <View style={[a.flex_row, a.align_center, a.gap_xs, {padding: 5}]}> 134 <Repost style={color} width={big ? 22 : 18} /> 135 {typeof repostCount !== 'undefined' && repostCount > 0 ? ( 136 <Text 137 testID="repostCount" 138 style={[ 139 color, 140 big ? a.text_md : {fontSize: 15}, 141 isReposted && [a.font_bold], 142 a.user_select_none, 143 ]}> 144 {formatCount(i18n, repostCount)} 145 </Text> 146 ) : undefined} 147 </View> 148 ) 149}