SelectPhoto.js 4.62 KB
import React, {useEffect, useState} from 'react';
import * as MediaLibrary from 'expo-media-library';
import * as Permission from 'expo-permissions';
import {Image, ImageBackground, ScrollView, View, Text, TouchableOpacity} from "react-native";
import {useNavigation} from '@react-navigation/native';
import LoadingComponent from "../components/LoadingComponent";
import screen from '../constants/layout';
import {UploadPhoto} from './UploadPhoto';

const SelectPhoto = (props) => {
    const navigation = useNavigation();
    const [loading, setLoading] = useState(false);
    const [hasPermission, setHasPermission] = useState(true);
    const [selectedPhoto, setSelectedPhoto] = useState([]);
    const [allPhotos, setAllPhotos] = useState([]);

    const getPhotos = async () => {
        try {
            const {assets} = await MediaLibrary.getAssetsAsync();
            const [firstPhoto] = assets;
            setSelectedPhoto([firstPhoto]);
            setAllPhotos(assets);
        } catch (e) {
            console.error(e)
        } finally {
            setLoading(false);
        }
    };

    const askPermission = async () => {
        try {
            setLoading(true);
            const {status} = await Permission.askAsync(Permission.CAMERA_ROLL);
            console.log(status);
            if (status === 'granted') {
                setHasPermission(true);
                await getPhotos();
            }
        } catch (e) {
            console.error(e);
            setHasPermission(false);
        }
    };

    const changeSelectedPhoto = (photo) => {
        setSelectedPhoto([photo]);
    };

    const uploadPhoto = () => {
        navigation.navigate('UploadPhoto', {photos: selectedPhoto})
    };

    useEffect(() => {
        askPermission();
        return () => {
            setLoading(true);
            setHasPermission(false);
            setSelectedPhoto([]);
            setAllPhotos([]);
        }
    }, []);

    return (
        <View>
            {loading
                ?
                <LoadingComponent/>
                :
                hasPermission
                    ?
                    selectedPhoto[0]
                        ?
                        <>
                            <ImageBackground
                                style={{width: screen.width, height: screen.height / 2}}
                                source={{uri: selectedPhoto[0].uri}}
                            >
                                <TouchableOpacity
                                    style={{
                                        justifyContent: 'center',
                                        alignItems: 'center',
                                    }}
                                    key={selectedPhoto.id}
                                    onPress={uploadPhoto}
                                >
                                    <Text>선택</Text>
                                </TouchableOpacity>
                            </ImageBackground>

                            <ScrollView>

                                <>
                                    <ScrollView horizontal contentContainerStyle={{flexDirection: 'row'}}>
                                        {allPhotos.map(photo => {
                                                return (
                                                    <TouchableOpacity
                                                        key={photo.id}
                                                        onPress={() => changeSelectedPhoto(photo)}>
                                                        <Image
                                                            source={{uri: photo.uri}}
                                                            style={{
                                                                width: screen.width / 3,
                                                                height: screen.height / 4,
                                                                opacity: photo.id === selectedPhoto[0].id ? 0.6 : 1
                                                            }}/>
                                                    </TouchableOpacity>
                                                )
                                            }
                                        )}
                                    </ScrollView>
                                </>

                            </ScrollView>
                        </>
                        :
                        null
                    :
                    <Text>사용자 권한이 없습니다</Text>
            }
        </View>
    )
};

export default SelectPhoto;