diff --git a/lib/shared/community-utils.js b/lib/shared/community-utils.js
--- a/lib/shared/community-utils.js
+++ b/lib/shared/community-utils.js
@@ -2,6 +2,7 @@
import * as React from 'react';
+import { useThreadHasPermission } from './thread-utils.js';
import {
createOrUpdateFarcasterChannelTagActionTypes,
useCreateOrUpdateFarcasterChannelTag,
@@ -10,6 +11,10 @@
} from '../actions/community-actions.js';
import { createLoadingStatusSelector } from '../selectors/loading-selectors.js';
import type { SetState } from '../types/hook-types.js';
+import type { ThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js';
+import { threadPermissions } from '../types/thread-permission-types.js';
+import { threadTypes } from '../types/thread-types-enum.js';
+import { useCurrentUserFID } from '../utils/farcaster-utils.js';
import { useDispatchActionPromise } from '../utils/redux-promise-utils.js';
import { useSelector } from '../utils/redux-utils.js';
@@ -140,10 +145,26 @@
};
}
+function useCanManageFarcasterChannelTag(community: ThreadInfo): boolean {
+ const fid = useCurrentUserFID();
+
+ const canManageFarcasterChannelTag = useThreadHasPermission(
+ community,
+ threadPermissions.MANAGE_FARCASTER_CHANNEL_TAGS,
+ );
+
+ return (
+ canManageFarcasterChannelTag &&
+ !!fid &&
+ community.type !== threadTypes.GENESIS
+ );
+}
+
export {
tagFarcasterChannelCopy,
tagFarcasterChannelErrorMessages,
farcasterChannelTagBlobHash,
useCreateFarcasterChannelTag,
useRemoveFarcasterChannelTag,
+ useCanManageFarcasterChannelTag,
};
diff --git a/native/components/community-actions-button.react.js b/native/components/community-actions-button.react.js
--- a/native/components/community-actions-button.react.js
+++ b/native/components/community-actions-button.react.js
@@ -7,11 +7,10 @@
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { primaryInviteLinksSelector } from 'lib/selectors/invite-links-selectors.js';
+import { useCanManageFarcasterChannelTag } from 'lib/shared/community-utils.js';
import { useThreadHasPermission } from 'lib/shared/thread-utils.js';
import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js';
import { threadPermissions } from 'lib/types/thread-permission-types.js';
-import { threadTypes } from 'lib/types/thread-types-enum.js';
-import { useCurrentUserFID } from 'lib/utils/farcaster-utils.js';
import SWMansionIcon from './swmansion-icon.react.js';
import {
@@ -36,8 +35,6 @@
const { navigate } = useNavigation();
- const fid = useCurrentUserFID();
-
const navigateToInviteLinksView = React.useCallback(() => {
if (!inviteLink || !community) {
return;
@@ -92,10 +89,8 @@
community,
threadPermissions.CHANGE_ROLE,
);
- const canManageFarcasterChannelTag = useThreadHasPermission(
- community,
- threadPermissions.MANAGE_FARCASTER_CHANNEL_TAGS,
- );
+ const canManageFarcasterChannelTag =
+ useCanManageFarcasterChannelTag(community);
const { showActionSheetWithOptions } = useActionSheet();
const actions = React.useMemo(() => {
@@ -125,12 +120,7 @@
});
}
- const canTagFarcasterChannel =
- canManageFarcasterChannelTag &&
- fid &&
- community.type !== threadTypes.GENESIS;
-
- if (canTagFarcasterChannel) {
+ if (canManageFarcasterChannelTag) {
result.push({
label: 'Tag Farcaster channel',
action: navigateToTagFarcasterChannel,
@@ -147,7 +137,6 @@
inviteLink,
canChangeRoles,
canManageFarcasterChannelTag,
- fid,
navigateToManagePublicLinkView,
navigateToInviteLinksView,
navigateToCommunityRolesScreen,
diff --git a/web/components/community-actions-menu.react.js b/web/components/community-actions-menu.react.js
--- a/web/components/community-actions-menu.react.js
+++ b/web/components/community-actions-menu.react.js
@@ -6,6 +6,7 @@
import SWMansionIcon from 'lib/components/swmansion-icon.react.js';
import { primaryInviteLinksSelector } from 'lib/selectors/invite-links-selectors.js';
import { threadInfoSelector } from 'lib/selectors/thread-selectors.js';
+import { useCanManageFarcasterChannelTag } from 'lib/shared/community-utils.js';
import { useThreadHasPermission } from 'lib/shared/thread-utils.js';
import type { InviteLink } from 'lib/types/link-types.js';
import { threadPermissions } from 'lib/types/thread-permission-types.js';
@@ -18,6 +19,7 @@
import ViewInviteLinkModal from '../invite-links/view-invite-link-modal.react.js';
import { useSelector } from '../redux/redux-utils.js';
import CommunityRolesModal from '../roles/community-roles-modal.react.js';
+import TagFarcasterChannelModal from '../tag-farcaster-channel/tag-farcaster-channel-modal.react.js';
import { AddLink } from '../vectors.react.js';
type Props = {
@@ -42,6 +44,8 @@
community,
threadPermissions.CHANGE_ROLE,
);
+ const canManageFarcasterChannelTag =
+ useCanManageFarcasterChannelTag(community);
const openViewInviteLinkModal = React.useCallback(() => {
if (!inviteLink) {
@@ -58,6 +62,10 @@
() => pushModal(),
[community, pushModal],
);
+ const openFarcasterChannelTagModal = React.useCallback(
+ () => pushModal(),
+ [communityID, pushModal],
+ );
const items = React.useMemo(() => {
const itemSpecs: MenuItemProps[] = [];
@@ -86,14 +94,24 @@
});
}
+ if (canManageFarcasterChannelTag) {
+ itemSpecs.push({
+ text: 'Tag Farcaster channel',
+ icon: 'tag',
+ onClick: openFarcasterChannelTagModal,
+ });
+ }
+
return itemSpecs;
}, [
canManageLinks,
inviteLink,
+ canChangeRoles,
+ canManageFarcasterChannelTag,
openManageInviteLinksModal,
openViewInviteLinkModal,
- canChangeRoles,
openCommunityRolesModal,
+ openFarcasterChannelTagModal,
]);
const menuItems = React.useMemo(