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
@@ -3,6 +3,8 @@
 import * as React from 'react';
 
 import {
+  createOrUpdateFarcasterChannelTagActionTypes,
+  useCreateOrUpdateFarcasterChannelTag,
   deleteFarcasterChannelTagActionTypes,
   useDeleteFarcasterChannelTag,
 } from '../actions/community-actions.js';
@@ -15,6 +17,56 @@
   return `farcaster_channel_tag_${farcasterChannelID}`;
 }
 
+const createOrUpdateFarcasterChannelTagStatusSelector =
+  createLoadingStatusSelector(createOrUpdateFarcasterChannelTagActionTypes);
+function useCreateFarcasterChannelTag(
+  commCommunityID: string,
+  setError: SetState<?string>,
+): {
+  +createTag: (farcasterChannelID: string) => mixed,
+  +isLoading: boolean,
+} {
+  const dispatchActionPromise = useDispatchActionPromise();
+
+  const createOrUpdateFarcasterChannelTag =
+    useCreateOrUpdateFarcasterChannelTag();
+
+  const createCreateOrUpdateActionPromise = React.useCallback(
+    async (farcasterChannelID: string) => {
+      try {
+        return await createOrUpdateFarcasterChannelTag({
+          commCommunityID,
+          farcasterChannelID,
+        });
+      } catch (e) {
+        setError(e.message);
+        throw e;
+      }
+    },
+    [commCommunityID, createOrUpdateFarcasterChannelTag, setError],
+  );
+
+  const createTag = React.useCallback(
+    (farcasterChannelID: string) => {
+      void dispatchActionPromise(
+        createOrUpdateFarcasterChannelTagActionTypes,
+        createCreateOrUpdateActionPromise(farcasterChannelID),
+      );
+    },
+    [createCreateOrUpdateActionPromise, dispatchActionPromise],
+  );
+
+  const createOrUpdateFarcasterChannelTagStatus = useSelector(
+    createOrUpdateFarcasterChannelTagStatusSelector,
+  );
+  const isLoading = createOrUpdateFarcasterChannelTagStatus === 'loading';
+
+  return {
+    createTag,
+    isLoading,
+  };
+}
+
 const deleteFarcasterChannelTagStatusSelector = createLoadingStatusSelector(
   deleteFarcasterChannelTagActionTypes,
 );
@@ -65,4 +117,8 @@
   };
 }
 
-export { farcasterChannelTagBlobHash, useRemoveFarcasterChannelTag };
+export {
+  farcasterChannelTagBlobHash,
+  useCreateFarcasterChannelTag,
+  useRemoveFarcasterChannelTag,
+};
diff --git a/native/community-settings/tag-farcaster-channel/tag-channel-button.react.js b/native/community-settings/tag-farcaster-channel/tag-channel-button.react.js
--- a/native/community-settings/tag-farcaster-channel/tag-channel-button.react.js
+++ b/native/community-settings/tag-farcaster-channel/tag-channel-button.react.js
@@ -7,25 +7,17 @@
 import { Text, View, Platform, ActivityIndicator } from 'react-native';
 import { useSafeAreaInsets } from 'react-native-safe-area-context';
 
-import {
-  createOrUpdateFarcasterChannelTagActionTypes,
-  useCreateOrUpdateFarcasterChannelTag,
-} from 'lib/actions/community-actions.js';
 import { NeynarClientContext } from 'lib/components/neynar-client-provider.react.js';
-import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js';
+import { useCreateFarcasterChannelTag } from 'lib/shared/community-utils.js';
 import type { NeynarChannel } from 'lib/types/farcaster-types.js';
 import type { SetState } from 'lib/types/hook-types.js';
 import { useCurrentUserFID } from 'lib/utils/farcaster-utils.js';
-import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js';
 
 import Button from '../../components/button.react.js';
 import { TagFarcasterChannelByNameRouteName } from '../../navigation/route-names.js';
 import { useSelector } from '../../redux/redux-utils.js';
 import { useStyles, useColors } from '../../themes/colors.js';
 
-const createOrUpdateFarcasterChannelTagStatusSelector =
-  createLoadingStatusSelector(createOrUpdateFarcasterChannelTagActionTypes);
-
 type Props = {
   +communityID: string,
   +setError: SetState<?string>,
@@ -67,24 +59,9 @@
 
   const insets = useSafeAreaInsets();
 
-  const dispatchActionPromise = useDispatchActionPromise();
-
-  const createOrUpdateFarcasterChannelTag =
-    useCreateOrUpdateFarcasterChannelTag();
-
-  const createCreateOrUpdateActionPromise = React.useCallback(
-    async (channelID: string) => {
-      try {
-        return await createOrUpdateFarcasterChannelTag({
-          commCommunityID: communityID,
-          farcasterChannelID: channelID,
-        });
-      } catch (e) {
-        setError(e.message);
-        throw e;
-      }
-    },
-    [communityID, createOrUpdateFarcasterChannelTag, setError],
+  const { createTag, isLoading } = useCreateFarcasterChannelTag(
+    communityID,
+    setError,
   );
 
   const onOptionSelected = React.useCallback(
@@ -111,19 +88,9 @@
 
       const channel = channelOptions[selectedIndex];
 
-      void dispatchActionPromise(
-        createOrUpdateFarcasterChannelTagActionTypes,
-        createCreateOrUpdateActionPromise(channel.id),
-      );
+      createTag(channel.id);
     },
-    [
-      channelOptions,
-      communityID,
-      createCreateOrUpdateActionPromise,
-      dispatchActionPromise,
-      navigate,
-      setError,
-    ],
+    [channelOptions, communityID, createTag, navigate, setError],
   );
 
   const onPressTag = React.useCallback(() => {
@@ -158,32 +125,18 @@
     showActionSheetWithOptions,
   ]);
 
-  const createOrUpdateFarcasterChannelTagStatus = useSelector(
-    createOrUpdateFarcasterChannelTagStatusSelector,
-  );
-  const isLoadingCreateOrUpdateFarcasterChannelTag =
-    createOrUpdateFarcasterChannelTagStatus === 'loading';
-
   const buttonContent = React.useMemo(() => {
-    if (isLoadingCreateOrUpdateFarcasterChannelTag) {
+    if (isLoading) {
       return (
         <ActivityIndicator size="small" color={colors.panelForegroundLabel} />
       );
     }
 
     return <Text style={styles.buttonText}>Tag channel</Text>;
-  }, [
-    colors.panelForegroundLabel,
-    isLoadingCreateOrUpdateFarcasterChannelTag,
-    styles.buttonText,
-  ]);
+  }, [colors.panelForegroundLabel, isLoading, styles.buttonText]);
 
   return (
-    <Button
-      style={styles.button}
-      disabled={isLoadingCreateOrUpdateFarcasterChannelTag}
-      onPress={onPressTag}
-    >
+    <Button style={styles.button} disabled={isLoading} onPress={onPressTag}>
       <View style={styles.buttonContainer}>{buttonContent}</View>
     </Button>
   );