Merge remote-tracking branch 'origin/main' into hailey/referrer-sync
This commit is contained in:
@@ -1,11 +1,13 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import Picker from '@emoji-mart/react'
|
|
||||||
import {
|
import {
|
||||||
StyleSheet,
|
GestureResponderEvent,
|
||||||
TouchableWithoutFeedback,
|
TouchableWithoutFeedback,
|
||||||
useWindowDimensions,
|
useWindowDimensions,
|
||||||
View,
|
View,
|
||||||
} from 'react-native'
|
} from 'react-native'
|
||||||
|
import Picker from '@emoji-mart/react'
|
||||||
|
|
||||||
|
import {atoms as a} from '#/alf'
|
||||||
import {textInputWebEmitter} from '../TextInput.web'
|
import {textInputWebEmitter} from '../TextInput.web'
|
||||||
|
|
||||||
const HEIGHT_OFFSET = 40
|
const HEIGHT_OFFSET = 40
|
||||||
@@ -96,12 +98,29 @@ export function EmojiPicker({state, close}: IProps) {
|
|||||||
|
|
||||||
if (!state.isOpen) return null
|
if (!state.isOpen) return null
|
||||||
|
|
||||||
|
const onPressBackdrop = (e: GestureResponderEvent) => {
|
||||||
|
// @ts-ignore web only
|
||||||
|
if (e.nativeEvent?.pointerId === -1) return
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TouchableWithoutFeedback
|
<TouchableWithoutFeedback
|
||||||
accessibilityRole="button"
|
accessibilityRole="button"
|
||||||
onPress={close}
|
onPress={onPressBackdrop}
|
||||||
accessibilityViewIsModal>
|
accessibilityViewIsModal>
|
||||||
<View style={styles.mask}>
|
<View
|
||||||
|
style={[
|
||||||
|
a.fixed,
|
||||||
|
a.w_full,
|
||||||
|
a.h_full,
|
||||||
|
a.align_center,
|
||||||
|
{
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
},
|
||||||
|
]}>
|
||||||
{/* eslint-disable-next-line react-native-a11y/has-valid-accessibility-descriptors */}
|
{/* eslint-disable-next-line react-native-a11y/has-valid-accessibility-descriptors */}
|
||||||
<TouchableWithoutFeedback onPress={e => e.stopPropagation()}>
|
<TouchableWithoutFeedback onPress={e => e.stopPropagation()}>
|
||||||
<View style={[{position: 'absolute'}, position]}>
|
<View style={[{position: 'absolute'}, position]}>
|
||||||
@@ -118,20 +137,3 @@ export function EmojiPicker({state, close}: IProps) {
|
|||||||
</TouchableWithoutFeedback>
|
</TouchableWithoutFeedback>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
mask: {
|
|
||||||
// @ts-ignore web ony
|
|
||||||
position: 'fixed',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
right: 0,
|
|
||||||
width: '100%',
|
|
||||||
height: '100%',
|
|
||||||
alignItems: 'center',
|
|
||||||
},
|
|
||||||
picker: {
|
|
||||||
marginHorizontal: 'auto',
|
|
||||||
paddingRight: 50,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {useQueryClient} from '@tanstack/react-query'
|
|||||||
import {moderatePost_wrapped as moderatePost} from '#/lib/moderatePost_wrapped'
|
import {moderatePost_wrapped as moderatePost} from '#/lib/moderatePost_wrapped'
|
||||||
import {POST_TOMBSTONE, Shadow, usePostShadow} from '#/state/cache/post-shadow'
|
import {POST_TOMBSTONE, Shadow, usePostShadow} from '#/state/cache/post-shadow'
|
||||||
import {useModerationOpts} from '#/state/preferences/moderation-opts'
|
import {useModerationOpts} from '#/state/preferences/moderation-opts'
|
||||||
|
import {useSession} from '#/state/session'
|
||||||
import {useComposerControls} from '#/state/shell/composer'
|
import {useComposerControls} from '#/state/shell/composer'
|
||||||
import {MAX_POST_LINES} from 'lib/constants'
|
import {MAX_POST_LINES} from 'lib/constants'
|
||||||
import {usePalette} from 'lib/hooks/usePalette'
|
import {usePalette} from 'lib/hooks/usePalette'
|
||||||
@@ -145,6 +146,9 @@ function PostInner({
|
|||||||
precacheProfile(queryClient, post.author)
|
precacheProfile(queryClient, post.author)
|
||||||
}, [queryClient, post.author])
|
}, [queryClient, post.author])
|
||||||
|
|
||||||
|
const {currentAccount} = useSession()
|
||||||
|
const isMe = replyAuthorDid === currentAccount?.did
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Link
|
<Link
|
||||||
href={itemHref}
|
href={itemHref}
|
||||||
@@ -187,6 +191,9 @@ function PostInner({
|
|||||||
style={[pal.textLight, s.mr2]}
|
style={[pal.textLight, s.mr2]}
|
||||||
lineHeight={1.2}
|
lineHeight={1.2}
|
||||||
numberOfLines={1}>
|
numberOfLines={1}>
|
||||||
|
{isMe ? (
|
||||||
|
<Trans context="description">Reply to you</Trans>
|
||||||
|
) : (
|
||||||
<Trans context="description">
|
<Trans context="description">
|
||||||
Reply to{' '}
|
Reply to{' '}
|
||||||
<ProfileHoverCard inline did={replyAuthorDid}>
|
<ProfileHoverCard inline did={replyAuthorDid}>
|
||||||
@@ -198,6 +205,7 @@ function PostInner({
|
|||||||
/>
|
/>
|
||||||
</ProfileHoverCard>
|
</ProfileHoverCard>
|
||||||
</Trans>
|
</Trans>
|
||||||
|
)}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import {Text} from '../util/text/Text'
|
|||||||
import {PreviewableUserAvatar} from '../util/UserAvatar'
|
import {PreviewableUserAvatar} from '../util/UserAvatar'
|
||||||
import {AviFollowButton} from './AviFollowButton'
|
import {AviFollowButton} from './AviFollowButton'
|
||||||
import hairlineWidth = StyleSheet.hairlineWidth
|
import hairlineWidth = StyleSheet.hairlineWidth
|
||||||
|
import {useSession} from '#/state/session'
|
||||||
import {Repost_Stroke2_Corner2_Rounded as Repost} from '#/components/icons/Repost'
|
import {Repost_Stroke2_Corner2_Rounded as Repost} from '#/components/icons/Repost'
|
||||||
|
|
||||||
interface FeedItemProps {
|
interface FeedItemProps {
|
||||||
@@ -200,6 +201,11 @@ let FeedItemInner = ({
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const {currentAccount} = useSession()
|
||||||
|
const isOwner =
|
||||||
|
AppBskyFeedDefs.isReasonRepost(reason) &&
|
||||||
|
reason.by.did === currentAccount?.did
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Link
|
<Link
|
||||||
testID={`feedItem-by-${post.author.handle}`}
|
testID={`feedItem-by-${post.author.handle}`}
|
||||||
@@ -250,11 +256,15 @@ let FeedItemInner = ({
|
|||||||
<Link
|
<Link
|
||||||
style={styles.includeReason}
|
style={styles.includeReason}
|
||||||
href={makeProfileLink(reason.by)}
|
href={makeProfileLink(reason.by)}
|
||||||
title={_(
|
title={
|
||||||
|
isOwner
|
||||||
|
? _(msg`Reposted by you`)
|
||||||
|
: _(
|
||||||
msg`Reposted by ${sanitizeDisplayName(
|
msg`Reposted by ${sanitizeDisplayName(
|
||||||
reason.by.displayName || reason.by.handle,
|
reason.by.displayName || reason.by.handle,
|
||||||
)}`,
|
)}`,
|
||||||
)}
|
)
|
||||||
|
}
|
||||||
onBeforePress={onOpenReposter}>
|
onBeforePress={onOpenReposter}>
|
||||||
<Repost
|
<Repost
|
||||||
style={{color: pal.colors.textLight, marginRight: 3}}
|
style={{color: pal.colors.textLight, marginRight: 3}}
|
||||||
@@ -266,6 +276,9 @@ let FeedItemInner = ({
|
|||||||
style={pal.textLight}
|
style={pal.textLight}
|
||||||
lineHeight={1.2}
|
lineHeight={1.2}
|
||||||
numberOfLines={1}>
|
numberOfLines={1}>
|
||||||
|
{isOwner ? (
|
||||||
|
<Trans>Reposted by you</Trans>
|
||||||
|
) : (
|
||||||
<Trans>
|
<Trans>
|
||||||
Reposted by{' '}
|
Reposted by{' '}
|
||||||
<ProfileHoverCard inline did={reason.by.did}>
|
<ProfileHoverCard inline did={reason.by.did}>
|
||||||
@@ -284,6 +297,7 @@ let FeedItemInner = ({
|
|||||||
/>
|
/>
|
||||||
</ProfileHoverCard>
|
</ProfileHoverCard>
|
||||||
</Trans>
|
</Trans>
|
||||||
|
)}
|
||||||
</Text>
|
</Text>
|
||||||
</Link>
|
</Link>
|
||||||
) : null}
|
) : null}
|
||||||
@@ -421,6 +435,9 @@ function ReplyToLabel({
|
|||||||
blocked?: boolean
|
blocked?: boolean
|
||||||
}) {
|
}) {
|
||||||
const pal = usePalette('default')
|
const pal = usePalette('default')
|
||||||
|
const {currentAccount} = useSession()
|
||||||
|
const isMe = profile.did === currentAccount?.did
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={[s.flexRow, s.mb2, s.alignCenter]}>
|
<View style={[s.flexRow, s.mb2, s.alignCenter]}>
|
||||||
<FontAwesomeIcon
|
<FontAwesomeIcon
|
||||||
@@ -433,7 +450,9 @@ function ReplyToLabel({
|
|||||||
style={[pal.textLight, s.mr2]}
|
style={[pal.textLight, s.mr2]}
|
||||||
lineHeight={1.2}
|
lineHeight={1.2}
|
||||||
numberOfLines={1}>
|
numberOfLines={1}>
|
||||||
{blocked ? (
|
{isMe ? (
|
||||||
|
<Trans context="description">Reply to you</Trans>
|
||||||
|
) : blocked ? (
|
||||||
<Trans context="description">Reply to a blocked post</Trans>
|
<Trans context="description">Reply to a blocked post</Trans>
|
||||||
) : (
|
) : (
|
||||||
<Trans context="description">
|
<Trans context="description">
|
||||||
|
|||||||
Reference in New Issue
Block a user