From 6471e809aa28f0319bde4aa1f362679e3723d298 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 12 Nov 2024 21:02:41 +0000 Subject: Add backdated post indicator (#6156) * add backdate indicator * pill style * add indexedAt * update indicator - new copy, date in pill * complete alf migration * accidentally committed the missing indexedAt *again*! * copy tweak --- src/view/com/post-thread/PostThreadItem.tsx | 233 ++++++++++++++++++++-------- 1 file changed, 165 insertions(+), 68 deletions(-) (limited to 'src/view/com/post-thread/PostThreadItem.tsx') diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 5044f9621..9edca4335 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -1,5 +1,5 @@ import React, {memo, useMemo} from 'react' -import {StyleSheet, View} from 'react-native' +import {StyleSheet, Text as RNText, View} from 'react-native' import { AppBskyFeedDefs, AppBskyFeedPost, @@ -8,7 +8,6 @@ import { ModerationDecision, RichText as RichTextAPI, } from '@atproto/api' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg, Plural, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -21,6 +20,7 @@ import {sanitizeHandle} from '#/lib/strings/handles' import {countLines} from '#/lib/strings/helpers' import {niceDate} from '#/lib/strings/time' import {s} from '#/lib/styles' +import {getTranslatorLink, isPostInLanguage} from '#/locale/helpers' import {POST_TOMBSTONE, Shadow, usePostShadow} from '#/state/cache/post-shadow' import {useLanguagePrefs} from '#/state/preferences' import {ThreadPost} from '#/state/queries/post-thread' @@ -28,26 +28,30 @@ import {useSession} from '#/state/session' import {useComposerControls} from '#/state/shell/composer' import {useMergedThreadgateHiddenReplies} from '#/state/threadgate-hidden-replies' import {PostThreadFollowBtn} from '#/view/com/post-thread/PostThreadFollowBtn' +import {ErrorMessage} from '#/view/com/util/error/ErrorMessage' +import {Link, TextLink} from '#/view/com/util/Link' +import {formatCount} from '#/view/com/util/numeric/format' +import {PostCtrls} from '#/view/com/util/post-ctrls/PostCtrls' +import {PostEmbeds, PostEmbedViewContext} from '#/view/com/util/post-embeds' +import {PostMeta} from '#/view/com/util/PostMeta' +import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme} from '#/alf' +import {colors} from '#/components/Admonition' +import {Button} from '#/components/Button' +import {CalendarClock_Stroke2_Corner0_Rounded as CalendarClockIcon} from '#/components/icons/CalendarClock' +import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRightIcon} from '#/components/icons/Chevron' +import {Trash_Stroke2_Corner0_Rounded as TrashIcon} from '#/components/icons/Trash' import {InlineLinkText} from '#/components/Link' +import {ContentHider} from '#/components/moderation/ContentHider' +import {LabelsOnMyPost} from '#/components/moderation/LabelsOnMe' +import {PostAlerts} from '#/components/moderation/PostAlerts' +import {PostHider} from '#/components/moderation/PostHider' import {AppModerationCause} from '#/components/Pills' +import * as Prompt from '#/components/Prompt' import {RichText} from '#/components/RichText' import {SubtleWebHover} from '#/components/SubtleWebHover' -import {Text as NewText} from '#/components/Typography' -import {ContentHider} from '../../../components/moderation/ContentHider' -import {LabelsOnMyPost} from '../../../components/moderation/LabelsOnMe' -import {PostAlerts} from '../../../components/moderation/PostAlerts' -import {PostHider} from '../../../components/moderation/PostHider' -import {WhoCanReply} from '../../../components/WhoCanReply' -import {getTranslatorLink, isPostInLanguage} from '../../../locale/helpers' -import {ErrorMessage} from '../util/error/ErrorMessage' -import {Link, TextLink} from '../util/Link' -import {formatCount} from '../util/numeric/format' -import {PostCtrls} from '../util/post-ctrls/PostCtrls' -import {PostEmbeds, PostEmbedViewContext} from '../util/post-embeds' -import {PostMeta} from '../util/PostMeta' -import {Text} from '../util/text/Text' -import {PreviewableUserAvatar} from '../util/UserAvatar' +import {Text} from '#/components/Typography' +import {WhoCanReply} from '#/components/WhoCanReply' export function PostThreadItem({ post, @@ -125,19 +129,20 @@ export function PostThreadItem({ } function PostThreadItemDeleted({hideTopBorder}: {hideTopBorder?: boolean}) { - const pal = usePalette('default') + const t = useTheme() return ( - - + + This post has been deleted. @@ -308,7 +313,7 @@ let PostThreadItemLoaded = ({ /> - @@ -317,10 +322,10 @@ let PostThreadItemLoaded = ({ sanitizeHandle(post.author.handle), moderation.ui('displayName'), )} - + - {sanitizeHandle(post.author.handle, '@')} - + {currentAccount?.did !== post.author.did && ( @@ -393,48 +398,48 @@ let PostThreadItemLoaded = ({ ]}> {post.repostCount != null && post.repostCount !== 0 ? ( - - + {formatCount(i18n, post.repostCount)} - {' '} + {' '} - + ) : null} {post.quoteCount != null && post.quoteCount !== 0 && !post.viewer?.embeddingDisabled ? ( - - + {formatCount(i18n, post.quoteCount)} - {' '} + {' '} - + ) : null} {post.likeCount != null && post.likeCount !== 0 ? ( - - + {formatCount(i18n, post.likeCount)} - {' '} + {' '} - + ) : null} @@ -617,13 +622,13 @@ let PostThreadItemLoaded = ({ href={postHref} title={itemTitle} noFeedback> - + More - ) : undefined} @@ -732,32 +737,124 @@ function ExpandedPostDetails({ }, [openLink, translatorUrl]) return ( - - - {niceDate(i18n, post.indexedAt)} - - {isRootPost && ( - - )} - {needsTranslation && ( - <> - - · - + + + + + {niceDate(i18n, post.indexedAt)} + + {isRootPost && ( + + )} + {needsTranslation && ( + <> + + · + - - Translate - - - )} + + Translate + + + )} + ) } +function BackdatedPostIndicator({post}: {post: AppBskyFeedDefs.PostView}) { + const t = useTheme() + const {_, i18n} = useLingui() + const control = Prompt.usePromptControl() + + const indexedAt = new Date(post.indexedAt) + const createdAt = AppBskyFeedPost.isRecord(post.record) + ? new Date(post.record.createdAt) + : new Date(post.indexedAt) + + // backdated if createdAt is 24 hours or more before indexedAt + const isBackdated = + indexedAt.getTime() - createdAt.getTime() > 24 * 60 * 60 * 1000 + + if (!isBackdated) return null + + const orange = t.name === 'light' ? colors.warning.dark : colors.warning.light + + return ( + <> + + + + + Archived post + + + + This post claims to have been created on{' '} + {niceDate(i18n, createdAt)}, + but was first seen by Bluesky on{' '} + {niceDate(i18n, indexedAt)}. + + + + + Bluesky cannot confirm the authenticity of the claimed date. + + + + {}} /> + + + + ) +} + function getThreadAuthor( post: AppBskyFeedDefs.PostView, record: AppBskyFeedPost.Record, -- cgit 1.4.1 From 017b7647b18cc67201c5b4e9c5da36a53257daa9 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 13 Nov 2024 14:25:56 +0000 Subject: Add subtle web hover to treeview replies (#6142) * add subtle web hover to treeview replies * don't highlight indentation * adjust position * clean up some styles --- src/view/com/post-thread/PostThreadItem.tsx | 40 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'src/view/com/post-thread/PostThreadItem.tsx') diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 9edca4335..e8fdc47f7 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -38,6 +38,7 @@ import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme} from '#/alf' import {colors} from '#/components/Admonition' import {Button} from '#/components/Button' +import {useInteractionState} from '#/components/hooks/useInteractionState' import {CalendarClock_Stroke2_Corner0_Rounded as CalendarClockIcon} from '#/components/icons/CalendarClock' import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRightIcon} from '#/components/icons/Chevron' import {Trash_Stroke2_Corner0_Rounded as TrashIcon} from '#/components/icons/Trash' @@ -656,26 +657,24 @@ function PostOuterWrapper({ hideTopBorder?: boolean }>) { const t = useTheme() - const [hover, setHover] = React.useState(false) + const { + state: hover, + onIn: onHoverIn, + onOut: onHoverOut, + } = useInteractionState() if (treeView && depth > 0) { return ( { - setHover(true) - }} - onPointerLeave={() => { - setHover(false) - }}> + onPointerEnter={onHoverIn} + onPointerLeave={onHoverOut}> {Array.from(Array(depth - 1)).map((_, n: number) => ( ))} - {children} + + + {children} + ) } return ( { - setHover(true) - }} - onPointerLeave={() => { - setHover(false) - }} + onPointerEnter={onHoverIn} + onPointerLeave={onHoverOut} style={[ a.border_t, a.px_sm, -- cgit 1.4.1 From c81e1497492e5e2e62ae8f35548ed7fcb0ca0c70 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Sat, 16 Nov 2024 20:06:24 +0000 Subject: use IAB for translate (#6421) --- src/components/dms/MessageMenu.tsx | 2 +- src/view/com/post-thread/PostThreadItem.tsx | 2 +- src/view/com/util/forms/PostDropdownBtn.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/view/com/post-thread/PostThreadItem.tsx') diff --git a/src/components/dms/MessageMenu.tsx b/src/components/dms/MessageMenu.tsx index c1867e727..90ee5b979 100644 --- a/src/components/dms/MessageMenu.tsx +++ b/src/components/dms/MessageMenu.tsx @@ -62,7 +62,7 @@ export let MessageMenu = ({ message.text, langPrefs.primaryLanguage, ) - openLink(translatorUrl) + openLink(translatorUrl, true) }, [langPrefs.primaryLanguage, message.text, openLink]) const onDelete = React.useCallback(() => { diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index e8fdc47f7..f2b719a84 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -737,7 +737,7 @@ function ExpandedPostDetails({ const isRootPost = !('reply' in post.record) const onTranslatePress = React.useCallback(() => { - openLink(translatorUrl) + openLink(translatorUrl, true) }, [openLink, translatorUrl]) return ( diff --git a/src/view/com/util/forms/PostDropdownBtn.tsx b/src/view/com/util/forms/PostDropdownBtn.tsx index 22751d8bf..1cd4841a5 100644 --- a/src/view/com/util/forms/PostDropdownBtn.tsx +++ b/src/view/com/util/forms/PostDropdownBtn.tsx @@ -241,7 +241,7 @@ let PostDropdownBtn = ({ }, [_, richText]) const onPressTranslate = React.useCallback(async () => { - await openLink(translatorUrl) + await openLink(translatorUrl, true) }, [openLink, translatorUrl]) const onHidePost = React.useCallback(() => { -- cgit 1.4.1 From d29599fa6cc2c402ae38417e114c0aee4db5d55b Mon Sep 17 00:00:00 2001 From: Frudrax Cheng Date: Sun, 24 Nov 2024 01:25:14 +0800 Subject: Fix translate button not working (#6657) * Update PostThreadItem.tsx * Fix in-app browser usage --------- Co-authored-by: Dan Abramov --- src/view/com/post-thread/PostThreadItem.tsx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src/view/com/post-thread/PostThreadItem.tsx') diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index f2b719a84..035f7a681 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -1,5 +1,10 @@ import React, {memo, useMemo} from 'react' -import {StyleSheet, Text as RNText, View} from 'react-native' +import { + GestureResponderEvent, + StyleSheet, + Text as RNText, + View, +} from 'react-native' import { AppBskyFeedDefs, AppBskyFeedPost, @@ -736,9 +741,14 @@ function ExpandedPostDetails({ const openLink = useOpenLink() const isRootPost = !('reply' in post.record) - const onTranslatePress = React.useCallback(() => { - openLink(translatorUrl, true) - }, [openLink, translatorUrl]) + const onTranslatePress = React.useCallback( + (e: GestureResponderEvent) => { + e.preventDefault() + openLink(translatorUrl, true) + return false + }, + [openLink, translatorUrl], + ) return ( @@ -757,7 +767,7 @@ function ExpandedPostDetails({ -- cgit 1.4.1