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
@@ -151,6 +151,30 @@
   return permissionLookup(threadInfo.currentUser.permissions, permission);
 }
 
+function useThreadHasPermission(
+  threadInfo: ?ThreadInfo,
+  permission: ThreadPermission,
+): boolean {
+  const loggedInUserInfo = useLoggedInUserInfo();
+  const userInfos = useSelector(state => state.userStore.userInfos);
+
+  return React.useMemo(() => {
+    if (!threadInfo) {
+      return false;
+    }
+
+    const permissions = threadFrozenDueToBlock(
+      threadInfo,
+      loggedInUserInfo?.id,
+      userInfos,
+    )
+      ? filterOutDisabledPermissions(threadInfo.currentUser.permissions)
+      : threadInfo.currentUser.permissions;
+
+    return hasPermission(permissions, permission);
+  }, [loggedInUserInfo?.id, permission, threadInfo, userInfos]);
+}
+
 function viewerIsMember(
   threadInfo: ?(ThreadInfo | LegacyRawThreadInfo | RawThreadInfo),
 ): boolean {
@@ -1850,6 +1874,7 @@
 
 export {
   threadHasPermission,
+  useThreadHasPermission,
   viewerIsMember,
   threadInChatList,
   threadIsTopLevel,
diff --git a/web/tooltips/tooltip-action-utils.js b/web/tooltips/tooltip-action-utils.js
--- a/web/tooltips/tooltip-action-utils.js
+++ b/web/tooltips/tooltip-action-utils.js
@@ -14,8 +14,8 @@
 import { createMessageReply } from 'lib/shared/message-utils.js';
 import { useCanCreateReactionFromMessage } from 'lib/shared/reaction-utils.js';
 import {
-  threadHasPermission,
   useSidebarExistsOrCanBeCreated,
+  useThreadHasPermission,
 } from 'lib/shared/thread-utils.js';
 import { messageTypes } from 'lib/types/message-types-enum.js';
 import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js';
@@ -179,11 +179,12 @@
   const inputState = React.useContext(InputStateContext);
   invariant(inputState, 'inputState is required');
   const { addReply } = inputState;
+  const currentUserIsVoiced = useThreadHasPermission(
+    threadInfo,
+    threadPermissions.VOICED,
+  );
   return React.useMemo(() => {
-    if (
-      item.messageInfo.type !== messageTypes.TEXT ||
-      !threadHasPermission(threadInfo, threadPermissions.VOICED)
-    ) {
+    if (item.messageInfo.type !== messageTypes.TEXT || !currentUserIsVoiced) {
       return null;
     }
     const buttonContent = <CommIcon icon="reply-filled" size={18} />;
@@ -200,7 +201,13 @@
       onClick,
       label: 'Reply',
     };
-  }, [popModal, addReply, item.messageInfo.type, messageInfo, threadInfo]);
+  }, [
+    popModal,
+    addReply,
+    item.messageInfo.type,
+    messageInfo,
+    currentUserIsVoiced,
+  ]);
 }
 
 const copiedMessageDurationMs = 2000;