1import { useState } from 'react'; 2import { StatusBar } from 'expo-status-bar'; 3import { StyleSheet, View } from 'react-native'; 4import * as ImagePicker from 'expo-image-picker'; 5import { GestureHandlerRootView } from 'react-native-gesture-handler'; 6 7import Button from './components/Button'; 8import ImageViewer from './components/ImageViewer'; 9import CircleButton from './components/CircleButton'; 10import IconButton from './components/IconButton'; 11import EmojiPicker from './components/EmojiPicker'; 12import EmojiList from './components/EmojiList'; 13import EmojiSticker from './components/EmojiSticker'; 14 15const PlaceholderImage = require('./assets/images/background-image.png'); 16 17export default function App() { 18 const [isModalVisible, setIsModalVisible] = useState(false); 19 const [showAppOptions, setShowAppOptions] = useState(false); 20 const [pickedEmoji, setPickedEmoji] = useState(null); 21 const [selectedImage, setSelectedImage] = useState(null); 22 23 const pickImageAsync = async () => { 24 let result = await ImagePicker.launchImageLibraryAsync({ 25 allowsEditing: true, 26 quality: 1, 27 }); 28 29 if (!result.canceled) { 30 setSelectedImage(result.assets[0].uri); 31 setShowAppOptions(true); 32 } else { 33 alert('You did not select any image.'); 34 } 35 }; 36 37 const onReset = () => { 38 setShowAppOptions(false); 39 }; 40 41 const onAddSticker = () => { 42 setIsModalVisible(true); 43 }; 44 45 const onModalClose = () => { 46 setIsModalVisible(false); 47 }; 48 49 const onSaveImageAsync = async () => { 50 // we will implement this later 51 }; 52 53 return ( 54 <GestureHandlerRootView style={styles.container}> 55 <View style={styles.imageContainer}> 56 <ImageViewer placeholderImageSource={PlaceholderImage} selectedImage={selectedImage} /> 57 {pickedEmoji !== null ? <EmojiSticker imageSize={40} stickerSource={pickedEmoji} /> : null} 58 </View> 59 {showAppOptions ? ( 60 <View style={styles.optionsContainer}> 61 <View style={styles.optionsRow}> 62 <IconButton icon="refresh" label="Reset" onPress={onReset} /> 63 <CircleButton onPress={onAddSticker} /> 64 <IconButton icon="save-alt" label="Save" onPress={onSaveImageAsync} /> 65 </View> 66 </View> 67 ) : ( 68 <View style={styles.footerContainer}> 69 <Button theme="primary" label="Choose a photo" onPress={pickImageAsync} /> 70 <Button 71 label="Use this photo" onPress={() => setShowAppOptions(true)} 72 /> 73 </View> 74 )} 75 <EmojiPicker isVisible={isModalVisible} onClose={onModalClose}> 76 <EmojiList onSelect={setPickedEmoji} onCloseModal={onModalClose} /> 77 </EmojiPicker> 78 <StatusBar style="auto" /> 79 </GestureHandlerRootView> 80 ); 81} 82 83const styles = StyleSheet.create({ 84 container: { 85 flex: 1, 86 backgroundColor: '#25292e', 87 alignItems: 'center', 88 }, 89 imageContainer: { 90 flex:1, 91 paddingTop: 58 92 }, 93 footerContainer: { 94 flex: 1 / 3, 95 alignItems: 'center', 96 }, 97 optionsContainer: { 98 position: 'absolute', 99 bottom: 80, 100 }, 101 optionsRow: { 102 alignItems: 'center', 103 flexDirection: 'row', 104 justifyContent: 'center', 105 }, 106}); 107