Page MenuHomePhabricator

D12024.diff
No OneTemporary

D12024.diff

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

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)

Event Timeline