diff --git a/web/modals/threads/settings/thread-settings-general-tab.react.js b/web/modals/threads/settings/thread-settings-general-tab.react.js
--- a/web/modals/threads/settings/thread-settings-general-tab.react.js
+++ b/web/modals/threads/settings/thread-settings-general-tab.react.js
@@ -3,7 +3,7 @@
import * as React from 'react';
import tinycolor from 'tinycolor2';
-import { threadHasPermission } from 'lib/shared/thread-utils.js';
+import { useThreadHasPermission } from 'lib/shared/thread-utils.js';
import { type SetState } from 'lib/types/hook-types.js';
import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js';
import { threadPermissions } from 'lib/types/thread-permission-types.js';
@@ -80,11 +80,13 @@
[setQueuedChanges, threadInfo.color],
);
- const threadNameInputDisabled = !threadHasPermission(
+ const canEditThreadName = useThreadHasPermission(
threadInfo,
threadPermissions.EDIT_THREAD_NAME,
);
+ const threadNameInputDisabled = !canEditThreadName;
+
return (
diff --git a/web/modals/threads/settings/thread-settings-modal.react.js b/web/modals/threads/settings/thread-settings-modal.react.js
--- a/web/modals/threads/settings/thread-settings-modal.react.js
+++ b/web/modals/threads/settings/thread-settings-modal.react.js
@@ -13,8 +13,8 @@
import { getAvailableRelationshipButtons } from 'lib/shared/relationship-utils.js';
import {
getSingleOtherUser,
- threadHasPermission,
threadUIName,
+ useThreadHasPermission,
} from 'lib/shared/thread-utils.js';
import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js';
import type { RelationshipButton } from 'lib/types/relationship-types.js';
@@ -97,43 +97,61 @@
return getAvailableRelationshipButtons(otherUserInfo);
}, [otherUserInfo]);
+ const canEditThreadName = useThreadHasPermission(
+ threadInfo,
+ threadPermissions.EDIT_THREAD_NAME,
+ );
+ const canEditThreadColor = useThreadHasPermission(
+ threadInfo,
+ threadPermissions.EDIT_THREAD_COLOR,
+ );
+ const canEditThreadDescription = useThreadHasPermission(
+ threadInfo,
+ threadPermissions.EDIT_THREAD_DESCRIPTION,
+ );
+ const canEditThreadPermissions = useThreadHasPermission(
+ threadInfo,
+ threadPermissions.EDIT_PERMISSIONS,
+ );
+ const canDeleteThread = useThreadHasPermission(
+ threadInfo,
+ threadPermissions.DELETE_THREAD,
+ );
+
const hasPermissionForTab = React.useCallback(
// ESLint doesn't recognize that invariant always throws
// eslint-disable-next-line consistent-return
- (thread: ThreadInfo, tab: TabType) => {
+ (tab: TabType) => {
if (tab === 'general') {
return (
- threadHasPermission(thread, threadPermissions.EDIT_THREAD_NAME) ||
- threadHasPermission(thread, threadPermissions.EDIT_THREAD_COLOR) ||
- threadHasPermission(
- thread,
- threadPermissions.EDIT_THREAD_DESCRIPTION,
- )
+ canEditThreadName || canEditThreadColor || canEditThreadDescription
);
} else if (tab === 'privacy') {
- return threadHasPermission(
- thread,
- threadPermissions.EDIT_PERMISSIONS,
- );
+ return canEditThreadPermissions;
} else if (tab === 'delete') {
- return threadHasPermission(thread, threadPermissions.DELETE_THREAD);
+ return canDeleteThread;
} else if (tab === 'relationship') {
return true;
}
invariant(false, `invalid tab: ${tab}`);
},
- [],
+ [
+ canEditThreadName,
+ canEditThreadColor,
+ canEditThreadDescription,
+ canEditThreadPermissions,
+ canDeleteThread,
+ ],
);
React.useEffect(() => {
if (
- threadInfo &&
currentTabType !== 'general' &&
- !hasPermissionForTab(threadInfo, currentTabType)
+ !hasPermissionForTab(currentTabType)
) {
setCurrentTabType('general');
}
- }, [currentTabType, hasPermissionForTab, threadInfo]);
+ }, [currentTabType, hasPermissionForTab]);
React.useEffect(() => () => setErrorMessage(''), [currentTabType]);
@@ -162,7 +180,7 @@
result.push({ id: 'relationship', header: 'Relationship' });
}
- if (hasPermissionForTab(threadInfo, 'delete')) {
+ if (hasPermissionForTab('delete')) {
result.push({ id: 'delete', header: 'Delete' });
}