import * as React from 'react'; import { Pressable, View, Text, Image, StyleSheet, ImageBackground } from 'react-native'; import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; import Loading from './Components/Loading' import Profile from './Components/Profile' import Repo from './Components/Repo' import Unfound from './Components/Unfound' import DataGenerator from './Components/DataGenerator' const Stack = createStackNavigator(); const styles = StyleSheet.create({ viewStyleVertical : { alignItems: 'center', justifyContent: 'center', margin: '10%' }, viewStyleHorizon : { flex: 1, flexDirection: 'row', justifyContent: 'space-between'}, pressableStyle : {flex: 1, flexDirection: 'row', justifyContent: 'space-between', backgroundColor:'lavender', paddingHorizontal:20, paddingVertical:10, borderColor:'thistle', borderWidth:2, borderRadius:5, marginHorizontal: 10, marginTop: 10}, image: { flex: 1, resizeMode: "cover", justifyContent: "center"}, container : {flex: 1}, textBox : {flex: 1, marginTop: 20, backgroundColor:'white', borderColor:'black', borderWidth:2, borderRadius:5, marginHorizontal: 10, paddingVertical:10, paddingHorizontal: 50, alignItems: 'flex-start'} }); function generateData(route, navigation) { const {name, login, avatarUrl, bio, createdAt, email, websiteUrl, repositories} = route.params; const dataFile = {} dataFile['navi'] = navigation dataFile['nameContent'] = 'Name: \n' + name dataFile['userNameContent'] = 'UserName\n: ' + login dataFile['bioContent'] = 'Bio: \n' + bio dataFile['createDate'] = 'Create at: \n' + createdAt dataFile['emailContent'] = 'Email: \n' + email dataFile['websiteLink'] = 'Website: \n' + websiteUrl dataFile['repoCount'] = 'Repository count: ' + repositories['nodes'].length var iconUrl if (avatarUrl != null) { iconUrl = { uri: avatarUrl } } else { iconUrl = require('C:/Coding/cs242-assignment3/GitView/assets/default.png') } dataFile['iconUrl'] = iconUrl return dataFile } /** Home page **/ function HomeScreen({ navigation }) { return ( <View style={styles.container}> <ImageBackground source={require('C:/Coding/cs242-assignment3/GitView/assets/ice.jpg')} style={styles.image}> <View style={styles.viewStyleVertical}> <Pressable style={styles.pressableStyle} onPress={() => navigation.navigate('LoadingProfile')}> <Text> Start </Text> </Pressable> </View> </ImageBackground> </View> ); } /** Profile page **/ function ProfileScreen({ route, navigation }) { var dataFile = generateData(route, navigation) return ( <Profile data={dataFile}/> ); } /** Repo page **/ function RepoScreen({ route, navigation }) { const {nodes} = route.params let cards = []; for (let i = 0; i < nodes.length; i++) { var repoName = 'Repo name: \n' + nodes[i]['name'] + '\n' var repoDescription = 'Repo description: \n' + nodes[i]['description'] + '\n' var repoOwner = 'Repo owner: \n' + nodes[i]['owner']['login'] + '\n' var nativeID = 'repo#' + i cards.push( <View style={styles.textBox} nativeID={nativeID}> <Text> {repoName} </Text> <Text> {repoDescription} </Text> <Text> {repoOwner} </Text> </View> ) } const dataFile = {} dataFile['cards'] = cards dataFile['navi'] = navigation return ( <Repo data={dataFile}/> ); } /** Unfound page **/ function UnfoundScreen({ route, navigation }) { const {errorMsg} = route.params console.error(errorMsg) const dataFile = {} dataFile['navi'] = navigation return ( <Unfound data={dataFile}/> ); } /** Loading Profile page **/ function LoadProfileScreen({navigation}) { const dataJson = require('C:/Coding/cs242-assignment3/env.json'); fetch(dataJson['endPoint'], { method: 'POST', headers: { "Content-Type": "application/json", "Authorization": dataJson['token'] }, body: JSON.stringify({ query: ` query { viewer { name login avatarUrl bio createdAt email websiteUrl repositories(last:100, privacy:PUBLIC){ nodes{ name } } } } ` }) }) .then(res => res.json()) .then((data)=> { navigation.navigate('Profile', data['data']['viewer']) }) .catch(error => { console.error('Error:', error) navigation.navigate('Unfound', {errorMsg: error}) }) return ( <Loading/> ); } /** Loading Repo page **/ function LoadRepoScreen({navigation}) { // setTimeout(function(){ // navigation.navigate('Unfound'); // }, 1000) const dataJson = require('C:/Coding/cs242-assignment3/env.json'); fetch(dataJson['endPoint'], { method: 'POST', headers: { "Content-Type": "application/json", "Authorization": dataJson['token'] }, body: JSON.stringify({ query: ` query { viewer{ repositories(last:100, privacy:PUBLIC){ nodes{ name owner{ login } description } } } } ` }) }) .then(res => res.json()) // .then((data) => console.log(data['data']['viewer']['repositories']['nodes'])) // .then((data) => console.log(data)) .then((data)=> { navigation.navigate('Repo', data['data']['viewer']['repositories']) }) .catch(error => { console.error('Error:', error) navigation.navigate('Unfound', {errorMsg: error}) }) return ( <Loading/> ); } /** Page loader **/ function App() { return ( <NavigationContainer> <Stack.Navigator initialRouteName="Home"> <Stack.Screen name="Home" component={HomeScreen} options={{ title: 'Github User Info' }}/> <Stack.Screen name="Profile" component={ProfileScreen} /> <Stack.Screen name="Repo" component={RepoScreen} options={{ title: 'Repositories' }}/> <Stack.Screen name="LoadingProfile" component={LoadProfileScreen} /> <Stack.Screen name="LoadingRepo" component={LoadRepoScreen} /> <Stack.Screen name="Unfound" component={UnfoundScreen} options={{ title: 'Error' }}/> </Stack.Navigator> </NavigationContainer> ); } export default App;