Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3303124
D12024.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
11 KB
Referenced Files
None
Subscribers
None
D12024.diff
View Options
diff --git a/native/community-settings/tag-farcaster-channel/tag-farcaster-channel.react.js b/native/community-settings/tag-farcaster-channel/tag-channel-button.react.js
copy from native/community-settings/tag-farcaster-channel/tag-farcaster-channel.react.js
copy to native/community-settings/tag-farcaster-channel/tag-channel-button.react.js
--- a/native/community-settings/tag-farcaster-channel/tag-farcaster-channel.react.js
+++ b/native/community-settings/tag-farcaster-channel/tag-channel-button.react.js
@@ -1,9 +1,10 @@
// @flow
import { useActionSheet } from '@expo/react-native-action-sheet';
+import { useNavigation } from '@react-navigation/native';
import invariant from 'invariant';
import * as React from 'react';
-import { View, Text, Platform } from 'react-native';
+import { Text, View, Platform } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import {
@@ -12,33 +13,24 @@
} from 'lib/actions/community-actions.js';
import { NeynarClientContext } from 'lib/components/neynar-client-provider.react.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 type { TagFarcasterChannelNavigationProp } from './tag-farcaster-channel-navigator.react.js';
-import { tagFarcasterChannelErrorMessages } from './tag-farcaster-channel-utils.js';
-import RegistrationButton from '../../account/registration/registration-button.react.js';
-import {
- TagFarcasterChannelByNameRouteName,
- type NavigationRoute,
-} from '../../navigation/route-names.js';
+import Button from '../../components/button.react.js';
+import { TagFarcasterChannelByNameRouteName } from '../../navigation/route-names.js';
import { useSelector } from '../../redux/redux-utils.js';
import { useStyles } from '../../themes/colors.js';
-export type TagFarcasterChannelParams = {
- +communityID: string,
-};
-
type Props = {
- +navigation: TagFarcasterChannelNavigationProp<'TagFarcasterChannel'>,
- +route: NavigationRoute<'TagFarcasterChannel'>,
+ +communityID: string,
+ +setError: SetState<?string>,
};
-function TagFarcasterChannel(props: Props): React.Node {
- const { navigation, route } = props;
+function TagChannelButton(props: Props): React.Node {
+ const { communityID, setError } = props;
- const { navigate } = navigation;
- const { communityID } = route.params;
+ const { navigate } = useNavigation();
const styles = useStyles(unboundStyles);
@@ -49,8 +41,6 @@
$ReadOnlyArray<NeynarChannel>,
>([]);
- const [error, setError] = React.useState<?string>(null);
-
const neynarClientContext = React.useContext(NeynarClientContext);
invariant(neynarClientContext, 'NeynarClientContext is missing');
@@ -89,7 +79,7 @@
throw e;
}
},
- [communityID, createOrUpdateFarcasterChannelTag],
+ [communityID, createOrUpdateFarcasterChannelTag, setError],
);
const onOptionSelected = React.useCallback(
@@ -127,6 +117,7 @@
createCreateOrUpdateActionPromise,
dispatchActionPromise,
navigate,
+ setError,
],
);
@@ -162,82 +153,32 @@
showActionSheetWithOptions,
]);
- const errorMessage = React.useMemo(() => {
- if (!error) {
- return null;
- }
-
- return (
- <Text style={styles.error}>
- {tagFarcasterChannelErrorMessages[error] ?? 'Unknown error.'}
- </Text>
- );
- }, [error, styles.error]);
-
- const tagFarcasterChannel = React.useMemo(
- () => (
- <View>
- <View style={styles.panelSectionContainer}>
- <Text style={styles.sectionText}>
- Tag a Farcaster channel so followers can find your Comm community!
- </Text>
- </View>
- <Text style={styles.sectionHeaderText}>FARCASTER CHANNEL</Text>
- <View style={styles.panelSectionContainer}>
- <RegistrationButton
- onPress={onPressTag}
- label="Tag channel"
- variant="enabled"
- />
- </View>
- <View style={styles.errorContainer}>{errorMessage}</View>
+ return (
+ <Button style={styles.button} onPress={onPressTag}>
+ <View style={styles.buttonContainer}>
+ <Text style={styles.buttonText}>Tag channel</Text>
</View>
- ),
- [
- styles.panelSectionContainer,
- styles.sectionText,
- styles.sectionHeaderText,
- styles.errorContainer,
- onPressTag,
- errorMessage,
- ],
+ </Button>
);
-
- return tagFarcasterChannel;
}
const unboundStyles = {
- panelSectionContainer: {
- backgroundColor: 'panelForeground',
- padding: 16,
- borderBottomColor: 'panelSeparator',
- borderBottomWidth: 1,
- borderTopColor: 'panelSeparator',
- borderTopWidth: 1,
- },
- sectionText: {
- color: 'panelForegroundLabel',
- fontSize: 14,
+ button: {
+ borderRadius: 8,
+ paddingVertical: 12,
+ paddingHorizontal: 24,
+ backgroundColor: 'purpleButton',
},
- sectionHeaderText: {
- fontSize: 14,
- fontWeight: '400',
- lineHeight: 20,
- color: 'panelForegroundLabel',
- paddingHorizontal: 16,
- paddingBottom: 4,
- marginTop: 24,
- },
- errorContainer: {
- height: 18,
- },
- error: {
- fontSize: 12,
- fontWeight: '400',
- lineHeight: 18,
+ buttonText: {
+ color: 'whiteText',
textAlign: 'center',
- color: 'redText',
+ fontWeight: '500',
+ fontSize: 16,
+ lineHeight: 24,
+ },
+ buttonContainer: {
+ height: 24,
},
};
-export default TagFarcasterChannel;
+export default TagChannelButton;
diff --git a/native/community-settings/tag-farcaster-channel/tag-farcaster-channel.react.js b/native/community-settings/tag-farcaster-channel/tag-farcaster-channel.react.js
--- a/native/community-settings/tag-farcaster-channel/tag-farcaster-channel.react.js
+++ b/native/community-settings/tag-farcaster-channel/tag-farcaster-channel.react.js
@@ -1,28 +1,12 @@
// @flow
-import { useActionSheet } from '@expo/react-native-action-sheet';
-import invariant from 'invariant';
import * as React from 'react';
-import { View, Text, Platform } 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 type { NeynarChannel } from 'lib/types/farcaster-types.js';
-import { useCurrentUserFID } from 'lib/utils/farcaster-utils.js';
-import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js';
+import { View, Text } from 'react-native';
+import TagChannelButton from './tag-channel-button.react.js';
import type { TagFarcasterChannelNavigationProp } from './tag-farcaster-channel-navigator.react.js';
import { tagFarcasterChannelErrorMessages } from './tag-farcaster-channel-utils.js';
-import RegistrationButton from '../../account/registration/registration-button.react.js';
-import {
- TagFarcasterChannelByNameRouteName,
- type NavigationRoute,
-} from '../../navigation/route-names.js';
-import { useSelector } from '../../redux/redux-utils.js';
+import { type NavigationRoute } from '../../navigation/route-names.js';
import { useStyles } from '../../themes/colors.js';
export type TagFarcasterChannelParams = {
@@ -35,133 +19,14 @@
};
function TagFarcasterChannel(props: Props): React.Node {
- const { navigation, route } = props;
+ const { route } = props;
- const { navigate } = navigation;
const { communityID } = route.params;
const styles = useStyles(unboundStyles);
- const fid = useCurrentUserFID();
- invariant(fid, 'FID should be set');
-
- const [channelOptions, setChannelOptions] = React.useState<
- $ReadOnlyArray<NeynarChannel>,
- >([]);
-
const [error, setError] = React.useState<?string>(null);
- const neynarClientContext = React.useContext(NeynarClientContext);
- invariant(neynarClientContext, 'NeynarClientContext is missing');
-
- const { client } = neynarClientContext;
-
- React.useEffect(() => {
- void (async () => {
- const channels = await client.fetchFollowedFarcasterChannels(fid);
-
- const sortedChannels = channels.sort((a, b) => a.id.localeCompare(b.id));
-
- setChannelOptions(sortedChannels);
- })();
- }, [client, fid]);
-
- const activeTheme = useSelector(state => state.globalThemeInfo.activeTheme);
-
- const { showActionSheetWithOptions } = useActionSheet();
-
- 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],
- );
-
- const onOptionSelected = React.useCallback(
- (selectedIndex: ?number) => {
- if (
- selectedIndex === undefined ||
- selectedIndex === null ||
- selectedIndex > channelOptions.length
- ) {
- return;
- }
-
- setError(null);
-
- // This is the "Other" option
- if (selectedIndex === channelOptions.length) {
- navigate<'TagFarcasterChannelByName'>({
- name: TagFarcasterChannelByNameRouteName,
- params: { communityID },
- });
-
- return;
- }
-
- const channel = channelOptions[selectedIndex];
-
- void dispatchActionPromise(
- createOrUpdateFarcasterChannelTagActionTypes,
- createCreateOrUpdateActionPromise(channel.id),
- );
- },
- [
- channelOptions,
- communityID,
- createCreateOrUpdateActionPromise,
- dispatchActionPromise,
- navigate,
- ],
- );
-
- const onPressTag = React.useCallback(() => {
- const channelNames = [
- 'Other',
- ...channelOptions.map(channel => `/${channel.id}`),
- ];
-
- const options =
- Platform.OS === 'ios' ? [...channelNames, 'Cancel'] : channelNames;
-
- const cancelButtonIndex = Platform.OS === 'ios' ? options.length - 1 : -1;
-
- const containerStyle = {
- paddingBottom: insets.bottom,
- };
-
- showActionSheetWithOptions(
- {
- options,
- cancelButtonIndex,
- containerStyle,
- userInterfaceStyle: activeTheme ?? 'dark',
- },
- onOptionSelected,
- );
- }, [
- activeTheme,
- channelOptions,
- insets.bottom,
- onOptionSelected,
- showActionSheetWithOptions,
- ]);
-
const errorMessage = React.useMemo(() => {
if (!error) {
return null;
@@ -184,11 +49,7 @@
</View>
<Text style={styles.sectionHeaderText}>FARCASTER CHANNEL</Text>
<View style={styles.panelSectionContainer}>
- <RegistrationButton
- onPress={onPressTag}
- label="Tag channel"
- variant="enabled"
- />
+ <TagChannelButton communityID={communityID} setError={setError} />
</View>
<View style={styles.errorContainer}>{errorMessage}</View>
</View>
@@ -198,7 +59,7 @@
styles.sectionText,
styles.sectionHeaderText,
styles.errorContainer,
- onPressTag,
+ communityID,
errorMessage,
],
);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Nov 19, 10:28 AM (21 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2537728
Default Alt Text
D12024.diff (11 KB)
Attached To
Mode
D12024: [native] introduce TagChannelButton
Attached
Detach File
Event Timeline
Log In to Comment