diff --git a/keyserver/src/push/send.js b/keyserver/src/push/send.js
--- a/keyserver/src/push/send.js
+++ b/keyserver/src/push/send.js
@@ -23,7 +23,7 @@
 import { notifTextsForMessageInfo } from 'lib/shared/notif-utils.js';
 import {
   rawThreadInfoFromServerThreadInfo,
-  threadInfoFromRawThreadInfo,
+  serverThreadInfoFromRawThreadInfo,
 } from 'lib/shared/thread-utils.js';
 import { hasMinCodeVersion } from 'lib/shared/version-utils.js';
 import type { Platform, PlatformDetails } from 'lib/types/device-types.js';
@@ -144,7 +144,11 @@
           'rawThreadInfo from rawThreadInfoFromServerThreadInfo must be ' +
             'minimallyEncoded when minimallyEncodePermissions option is set',
         );
-        return threadInfoFromRawThreadInfo(rawThreadInfo, userID, userInfos);
+        return serverThreadInfoFromRawThreadInfo(
+          rawThreadInfo,
+          userID,
+          userInfos,
+        );
       }),
       _pickBy(threadInfo => threadInfo),
     )(serverThreadInfos);
diff --git a/lib/selectors/thread-selectors.js b/lib/selectors/thread-selectors.js
--- a/lib/selectors/thread-selectors.js
+++ b/lib/selectors/thread-selectors.js
@@ -30,7 +30,7 @@
   threadInHomeChatList,
   threadInBackgroundChatList,
   threadInFilterList,
-  threadInfoFromRawThreadInfo,
+  serverThreadInfoFromRawThreadInfo,
   threadHasPermission,
   threadInChatList,
   threadHasAdminRole,
@@ -70,7 +70,7 @@
   (state: BaseAppState<>) => state.threadStore.threadInfos,
   (state: BaseAppState<>) => state.currentUserInfo && state.currentUserInfo.id,
   (state: BaseAppState<>) => state.userStore.userInfos,
-  threadInfoFromRawThreadInfo,
+  serverThreadInfoFromRawThreadInfo,
 );
 
 const communityThreadSelector: (
diff --git a/lib/shared/thread-utils.js b/lib/shared/thread-utils.js
--- a/lib/shared/thread-utils.js
+++ b/lib/shared/thread-utils.js
@@ -421,7 +421,7 @@
     userInfos[id] = { id, username };
   }
 
-  return threadInfoFromRawThreadInfo(rawThreadInfo, viewerID, userInfos);
+  return serverThreadInfoFromRawThreadInfo(rawThreadInfo, viewerID, userInfos);
 }
 
 type PendingPersonalThread = {
@@ -942,7 +942,7 @@
   };
 }
 
-function threadInfoFromRawThreadInfo(
+function serverThreadInfoFromRawThreadInfo(
   rawThreadInfo: RawThreadInfo,
   viewerID: ?string,
   userInfos: UserInfos,
@@ -961,6 +961,26 @@
   );
 }
 
+function clientThreadInfoFromRawThreadInfo(
+  rawThreadInfo: RawThreadInfo,
+  communityThread: ?RawThreadInfo,
+  viewerID: ?string,
+  userInfos: UserInfos,
+): ThreadInfo {
+  const currentUser = getMinimallyEncodedCurrentUser(
+    rawThreadInfo,
+    communityThread,
+    viewerID,
+    userInfos,
+  );
+  return baseThreadInfoFromRawThreadInfo(
+    rawThreadInfo,
+    viewerID,
+    userInfos,
+    currentUser,
+  );
+}
+
 function baseThreadInfoFromRawThreadInfo(
   rawThreadInfo: RawThreadInfo,
   viewerID: ?string,
@@ -1928,7 +1948,8 @@
   threadFrozenDueToViewerBlock,
   rawThreadInfoFromServerThreadInfo,
   threadUIName,
-  threadInfoFromRawThreadInfo,
+  serverThreadInfoFromRawThreadInfo,
+  clientThreadInfoFromRawThreadInfo,
   threadTypeDescriptions,
   memberHasAdminPowers,
   roleIsDefaultRole,
diff --git a/lib/shared/thread-utils.test.js b/lib/shared/thread-utils.test.js
--- a/lib/shared/thread-utils.test.js
+++ b/lib/shared/thread-utils.test.js
@@ -2,7 +2,7 @@
 
 import {
   parsePendingThreadID,
-  threadInfoFromRawThreadInfo,
+  serverThreadInfoFromRawThreadInfo,
 } from './thread-utils.js';
 import { threadInfoValidator } from '../permissions/minimally-encoded-thread-permissions-validators.js';
 import { specialRoles } from '../permissions/special-roles.js';
@@ -191,7 +191,7 @@
 
 describe('threadInfoFromRawThreadInfo', () => {
   it('should return correctly formed ThreadInfo from RawThreadInfo', () => {
-    const threadInfo = threadInfoFromRawThreadInfo(
+    const threadInfo = serverThreadInfoFromRawThreadInfo(
       rawThreadInfo,
       null,
       userInfos,