diff --git a/native/components/edit-avatar.react.js b/native/components/edit-avatar.react.js
index fa469aef5..37d59fd7e 100644
--- a/native/components/edit-avatar.react.js
+++ b/native/components/edit-avatar.react.js
@@ -1,68 +1,142 @@
// @flow
+import { useActionSheet } from '@expo/react-native-action-sheet';
import * as React from 'react';
-import { View, TouchableOpacity } from 'react-native';
+import { View, TouchableOpacity, Platform } from 'react-native';
+import { useSafeAreaInsets } from 'react-native-safe-area-context';
+import CommIcon from '../components/comm-icon.react.js';
import SWMansionIcon from '../components/swmansion-icon.react.js';
import { useColors, useStyles } from '../themes/colors.js';
type Props = {
+children: React.Node,
+onPressEmojiAvatarFlow: () => mixed,
+disabled?: boolean,
};
function EditAvatar(props: Props): React.Node {
const { onPressEmojiAvatarFlow, children, disabled } = props;
+ const { showActionSheetWithOptions } = useActionSheet();
+
const colors = useColors();
const styles = useStyles(unboundStyles);
+ const editAvatarOptions = React.useMemo(() => {
+ const options = [
+ {
+ id: 'emoji',
+ text: 'Use Emoji',
+ onPress: onPressEmojiAvatarFlow,
+ icon: (
+
+ ),
+ },
+ ];
+
+ if (Platform.OS === 'ios') {
+ options.push({
+ id: 'cancel',
+ text: 'Cancel',
+ isCancel: true,
+ });
+ }
+ return options;
+ }, [onPressEmojiAvatarFlow, styles.bottomSheetIcon]);
+
+ const insets = useSafeAreaInsets();
+
+ const onPressEditAvatar = React.useCallback(() => {
+ const texts = editAvatarOptions.map(option => option.text);
+
+ const cancelButtonIndex = editAvatarOptions.findIndex(
+ option => option.isCancel,
+ );
+
+ const containerStyle = {
+ paddingBottom: insets.bottom,
+ };
+
+ const icons = editAvatarOptions.map(option => option.icon);
+
+ const onPressAction = (selectedIndex: ?number) => {
+ if (
+ selectedIndex === null ||
+ selectedIndex === undefined ||
+ selectedIndex < 0
+ ) {
+ return;
+ }
+ const option = editAvatarOptions[selectedIndex];
+ if (option.onPress) {
+ option.onPress();
+ }
+ };
+
+ showActionSheetWithOptions(
+ {
+ options: texts,
+ cancelButtonIndex,
+ containerStyle,
+ icons,
+ },
+ onPressAction,
+ );
+ }, [editAvatarOptions, insets.bottom, showActionSheetWithOptions]);
+
const editBadge = React.useMemo(() => {
if (disabled) {
return null;
}
return (
);
}, [
colors.floatingButtonLabel,
disabled,
styles.editAvatarIcon,
styles.editAvatarIconContainer,
]);
return (
-
+
{children}
{editBadge}
);
}
const unboundStyles = {
editAvatarIconContainer: {
position: 'absolute',
bottom: 0,
right: 0,
borderWidth: 2,
borderColor: 'panelForeground',
borderRadius: 18,
width: 36,
height: 36,
backgroundColor: 'purpleButton',
justifyContent: 'center',
},
editAvatarIcon: {
textAlign: 'center',
},
+ bottomSheetIcon: {
+ color: '#000000',
+ },
};
export default EditAvatar;