From 03bf51206bc7d7b1b10a8efa28bcd15ccbc9b938 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 9 Jun 2025 17:16:44 -0500 Subject: [PATCH] Fix up no-unauthenticated posts --- src/components/Skeleton.tsx | 11 ++- .../ThreadItemAnchorNoUnauthenticated.tsx | 32 ++++++++ .../ThreadItemPostNoUnauthenticated.tsx | 74 +++++++++++++++++++ src/screens/PostThread/index.tsx | 8 ++ src/state/queries/usePostThread/traversal.ts | 15 +++- src/state/queries/usePostThread/types.ts | 4 + src/state/queries/usePostThread/utils.ts | 20 +++++ src/state/queries/usePostThread/views.ts | 2 + src/view/screens/PostThread.tsx | 2 +- 9 files changed, 161 insertions(+), 7 deletions(-) create mode 100644 src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx create mode 100644 src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx diff --git a/src/components/Skeleton.tsx b/src/components/Skeleton.tsx index 11cd63d0e8..14c3177c54 100644 --- a/src/components/Skeleton.tsx +++ b/src/components/Skeleton.tsx @@ -1,3 +1,4 @@ +import {type ReactNode} from 'react' import {View} from 'react-native' import { @@ -44,14 +45,17 @@ export function Text({blend, style}: TextStyleProp & SkeletonProps) { } export function Circle({ + children, size, blend, style, -}: ViewStyleProp & {size: number} & SkeletonProps) { +}: ViewStyleProp & {children?: ReactNode; size: number} & SkeletonProps) { const t = useTheme() return ( + ]}> + {children} + ) } diff --git a/src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx b/src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx new file mode 100644 index 0000000000..ef62cd6869 --- /dev/null +++ b/src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx @@ -0,0 +1,32 @@ +import {View} from 'react-native' +import {Trans} from '@lingui/macro' + +import {atoms as a, useTheme} from '#/alf' +import {Lock_Stroke2_Corner0_Rounded as LockIcon} from '#/components/icons/Lock' +import * as Skele from '#/components/Skeleton' +import {Text} from '#/components/Typography' + +export function ThreadItemAnchorNoUnauthenticated() { + const t = useTheme() + + return ( + + + + + + + + + + + + + + + You must sign-in to view this post. + + + + ) +} diff --git a/src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx b/src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx new file mode 100644 index 0000000000..1e87497156 --- /dev/null +++ b/src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx @@ -0,0 +1,74 @@ +import {View} from 'react-native' +import {Trans} from '@lingui/macro' + +import {type ThreadItem} from '#/state/queries/usePostThread/types' +import { + LINEAR_AVI_WIDTH, + OUTER_SPACE, + REPLY_LINE_WIDTH, +} from '#/screens/PostThread/const' +import {atoms as a, useTheme} from '#/alf' +import {Lock_Stroke2_Corner0_Rounded as LockIcon} from '#/components/icons/Lock' +import * as Skele from '#/components/Skeleton' +import {Text} from '#/components/Typography' + +export function ThreadItemPostNoUnauthenticated({ + item, +}: { + item: Extract +}) { + const t = useTheme() + + return ( + + + + {item.ui.showParentReplyLine && ( + + )} + + + + + + + + + You must sign-in to view this post. + + + + {item.ui.showChildReplyLine && ( + + )} + + + ) +} diff --git a/src/screens/PostThread/index.tsx b/src/screens/PostThread/index.tsx index 7dc3a0fffc..f067dd3e33 100644 --- a/src/screens/PostThread/index.tsx +++ b/src/screens/PostThread/index.tsx @@ -20,10 +20,12 @@ import { ThreadAnchorSkeleton, } from '#/screens/PostThread/components/ThreadAnchor' import {ThreadError} from '#/screens/PostThread/components/ThreadError' +import {ThreadItemAnchorNoUnauthenticated} from '#/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated' import { ThreadItemPost, ThreadItemPostSkeleton, } from '#/screens/PostThread/components/ThreadItemPost' +import {ThreadItemPostNoUnauthenticated} from '#/screens/PostThread/components/ThreadItemPostNoUnauthenticated' import {ThreadItemPostTombstone} from '#/screens/PostThread/components/ThreadItemPostTombstone' import {ThreadItemReadMore} from '#/screens/PostThread/components/ThreadItemReadMore' import {ThreadItemReadMoreUp} from '#/screens/PostThread/components/ThreadItemReadMoreUp' @@ -400,6 +402,12 @@ export function Inner({uri}: {uri: string | undefined}) { ) } } + } else if (item.type === 'threadPostNoUnauthenticated') { + if (item.depth < 0) { + return + } else if (item.depth === 0) { + return + } } else if (item.type === 'readMore') { return ( 0) { /* diff --git a/src/state/queries/usePostThread/types.ts b/src/state/queries/usePostThread/types.ts index 223df7577a..fee9216ca0 100644 --- a/src/state/queries/usePostThread/types.ts +++ b/src/state/queries/usePostThread/types.ts @@ -68,6 +68,10 @@ export type ThreadItem = uri: string depth: number value: AppBskyUnspeccedDefs.ThreadItemNoUnauthenticated + ui: { + showParentReplyLine: boolean + showChildReplyLine: boolean + } } | { type: 'threadPostNotFound' diff --git a/src/state/queries/usePostThread/utils.ts b/src/state/queries/usePostThread/utils.ts index 2e5a8e2521..423a063f8e 100644 --- a/src/state/queries/usePostThread/utils.ts +++ b/src/state/queries/usePostThread/utils.ts @@ -154,3 +154,23 @@ export function getThreadPostUI({ precedesChildReadMore: precedesChildReadMore ?? false, } } + +export function getThreadPostNoUnauthenticatedUI({ + depth, + prevItemDepth, + nextItemDepth, +}: { + depth: number + prevItemDepth?: number + nextItemDepth?: number +}): Extract['ui'] { + console.log('getThreadPostNoUnauthenticatedUI', { + depth, + prevItemDepth, + nextItemDepth, + }) + return { + showChildReplyLine: depth < 0, + showParentReplyLine: Boolean(prevItemDepth && prevItemDepth < depth), + } +} diff --git a/src/state/queries/usePostThread/views.ts b/src/state/queries/usePostThread/views.ts index 1028cd847e..71acfc77bc 100644 --- a/src/state/queries/usePostThread/views.ts +++ b/src/state/queries/usePostThread/views.ts @@ -27,6 +27,8 @@ export function threadPostNoUnauthenticated({ uri, depth, value: value as AppBskyUnspeccedDefs.ThreadItemNoUnauthenticated, + // @ts-ignore populated by the traversal + ui: {}, } } diff --git a/src/view/screens/PostThread.tsx b/src/view/screens/PostThread.tsx index 430194e311..8c50f17f46 100644 --- a/src/view/screens/PostThread.tsx +++ b/src/view/screens/PostThread.tsx @@ -28,7 +28,7 @@ export function PostThreadScreen({route}: Props) { return ( - {gate('post_threads_v2_unspecced') ? ( + {gate('post_threads_v2_unspecced') || __DEV__ ? ( ) : (