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__ ? (
) : (