about summary refs log tree commit diff
diff options
context:
space:
mode:
authordan <dan.abramov@gmail.com>2024-08-06 17:12:27 +0100
committerGitHub <noreply@github.com>2024-08-06 17:12:27 +0100
commit5845e08eeea151deb75bb21ceaa33f7a973870e3 (patch)
treeb0e3e8437db37c4e52789182079fde4f68cd2f2b
parentb291a1ed8a1706f30f117d691d85508ffad342f2 (diff)
downloadvoidsky-5845e08eeea151deb75bb21ceaa33f7a973870e3.tar.zst
Show own replies before follows' replies in threads (#4882)
-rw-r--r--src/state/queries/post-thread.ts13
-rw-r--r--src/view/com/post-thread/PostThread.tsx9
2 files changed, 17 insertions, 5 deletions
diff --git a/src/state/queries/post-thread.ts b/src/state/queries/post-thread.ts
index db85e8a17..c01b96ed8 100644
--- a/src/state/queries/post-thread.ts
+++ b/src/state/queries/post-thread.ts
@@ -136,6 +136,7 @@ export function sortThread(
   node: ThreadNode,
   opts: UsePreferencesQueryResponse['threadViewPrefs'],
   modCache: ThreadModerationCache,
+  currentDid: string | undefined,
 ): ThreadNode {
   if (node.type !== 'post') {
     return node
@@ -159,6 +160,16 @@ export function sortThread(
         return 1 // op's own reply
       }
 
+      const aIsBySelf = a.post.author.did === currentDid
+      const bIsBySelf = b.post.author.did === currentDid
+      if (aIsBySelf && bIsBySelf) {
+        return a.post.indexedAt.localeCompare(b.post.indexedAt) // oldest
+      } else if (aIsBySelf) {
+        return -1 // current account's reply
+      } else if (bIsBySelf) {
+        return 1 // current account's reply
+      }
+
       const aBlur = Boolean(modCache.get(a)?.ui('contentList').blur)
       const bBlur = Boolean(modCache.get(b)?.ui('contentList').blur)
       if (aBlur !== bBlur) {
@@ -195,7 +206,7 @@ export function sortThread(
       }
       return b.post.indexedAt.localeCompare(a.post.indexedAt)
     })
-    node.replies.forEach(reply => sortThread(reply, opts, modCache))
+    node.replies.forEach(reply => sortThread(reply, opts, modCache, currentDid))
   }
   return node
 }
diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx
index a6c1a4648..b7eaedd36 100644
--- a/src/view/com/post-thread/PostThread.tsx
+++ b/src/view/com/post-thread/PostThread.tsx
@@ -89,7 +89,7 @@ export function PostThread({
   onCanReply: (canReply: boolean) => void
   onPressReply: () => unknown
 }) {
-  const {hasSession} = useSession()
+  const {hasSession, currentAccount} = useSession()
   const {_} = useLingui()
   const t = useTheme()
   const {isMobile, isTabletOrMobile} = useWebMediaQueries()
@@ -154,6 +154,7 @@ export function PostThread({
   // On the web this is not necessary because we can synchronously adjust the scroll in onContentSizeChange instead.
   const [deferParents, setDeferParents] = React.useState(isNative)
 
+  const currentDid = currentAccount?.did
   const threadModerationCache = React.useMemo(() => {
     const cache: ThreadModerationCache = new WeakMap()
     if (thread && moderationOpts) {
@@ -167,8 +168,8 @@ export function PostThread({
     if (!threadViewPrefs || !thread) return null
 
     return createThreadSkeleton(
-      sortThread(thread, threadViewPrefs, threadModerationCache),
-      hasSession,
+      sortThread(thread, threadViewPrefs, threadModerationCache, currentDid),
+      !!currentDid,
       treeView,
       threadModerationCache,
       hiddenRepliesState !== HiddenRepliesState.Hide,
@@ -176,7 +177,7 @@ export function PostThread({
   }, [
     thread,
     preferences?.threadViewPrefs,
-    hasSession,
+    currentDid,
     treeView,
     threadModerationCache,
     hiddenRepliesState,