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