diff --git a/GitView b/GitView new file mode 160000 index 0000000000000000000000000000000000000000..690282746b8a50666215d24d2bf4c8cb7801b9de --- /dev/null +++ b/GitView @@ -0,0 +1 @@ +Subproject commit 690282746b8a50666215d24d2bf4c8cb7801b9de diff --git a/View.png b/View.png new file mode 100644 index 0000000000000000000000000000000000000000..99593adae9b0be79a8328df54a83b14dfab7501f Binary files /dev/null and b/View.png differ diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000000000000000000000000000000000000..fdc4270fcbb337f71d1ff06471019d504d6be49c --- /dev/null +++ b/src/App.js @@ -0,0 +1,210 @@ +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; diff --git a/src/Components/DataGenerator.js b/src/Components/DataGenerator.js new file mode 100644 index 0000000000000000000000000000000000000000..744ec6363685848ca9b2305f924ed102ef6b5420 --- /dev/null +++ b/src/Components/DataGenerator.js @@ -0,0 +1,23 @@ + +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 + } + +module.exports = generateData; \ No newline at end of file diff --git a/src/Components/Loading.js b/src/Components/Loading.js new file mode 100644 index 0000000000000000000000000000000000000000..2e3ee0ca643c90383c19dabe92d37dfea733c5b6 --- /dev/null +++ b/src/Components/Loading.js @@ -0,0 +1,29 @@ +import * as React from 'react'; +import { Pressable, View, Text, Image, StyleSheet, ImageBackground } from 'react-native'; + +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'} +}); + +const Loading = () => { + const pic = require('C:/Coding/cs242-assignment3/GitView/assets/loading.png') + return ( + <View style={styles.container}> + <ImageBackground source={require('C:/Coding/cs242-assignment3/GitView/assets/ice.jpg')} style={styles.image}> + <View style={styles.viewStyleVertical}> + <Text style={{ fontSize: 30 }}>Loading......</Text> + <Image source={pic} style={{width: 200, height: 200}}/> + </View> + </ImageBackground> + </View> + ) +} + +export default Loading; \ No newline at end of file diff --git a/src/Components/Profile.js b/src/Components/Profile.js new file mode 100644 index 0000000000000000000000000000000000000000..a6d95f8cb944ad07129eea719d39ba64d697e617 --- /dev/null +++ b/src/Components/Profile.js @@ -0,0 +1,62 @@ +import * as React from 'react'; +import { Pressable, View, Text, Image, StyleSheet, ImageBackground } from 'react-native'; +import { createStackNavigator } from '@react-navigation/stack'; + +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'} +}); + +const Profile = (props) => { + const file = props.data + const iconUrl = file['iconUrl'] + const nameContent = file['nameContent'] + const userNameContent = file['userNameContent'] + const bioContent = file['bioContent'] + const websiteLink = file['websiteLink'] + const emailContent = file['emailContent'] + const createDate = file['createDate'] + const repoCount = file['repoCount'] + const navigation = file['navi'] + return ( + <View style={styles.container}> + <ImageBackground source={require('C:/Coding/cs242-assignment3/GitView/assets/ice.jpg')} style={styles.image}> + <View style={styles.viewStyleVertical}> + <View style={styles.viewStyleVertical}> + <Image style={{width: 100, height: 100}} source={iconUrl} /> + </View> + <View style={styles.viewStyleHorizon}> + <Pressable style={styles.pressableStyle}> + <Text> Followers </Text> + </Pressable> + <Pressable style={styles.pressableStyle}> + <Text> Followings </Text> + </Pressable> + </View> + <View style={styles.viewStyleVertical} > + <Text style={styles.textBox}> {nameContent} </Text> + <Text style={styles.textBox}> {userNameContent} </Text> + <Text style={styles.textBox}> {bioContent} </Text> + <Text style={styles.textBox}> {websiteLink} </Text> + <Text style={styles.textBox}> {emailContent} </Text> + <Text style={styles.textBox}> {createDate} </Text> + </View> + <View style={styles.viewStyleVertical} > + <Pressable style={styles.pressableStyle} onPress={() => navigation.navigate('LoadingRepo')}> + <Text> {repoCount} </Text> + </Pressable> + </View> + </View> + </ImageBackground> + </View> + ) +} + +export default Profile; \ No newline at end of file diff --git a/src/Components/Repo.js b/src/Components/Repo.js new file mode 100644 index 0000000000000000000000000000000000000000..05b44e6cdac3d6bdebb7b1103ff6901330aca894 --- /dev/null +++ b/src/Components/Repo.js @@ -0,0 +1,35 @@ +import * as React from 'react'; +import { Pressable, View, Text, Image, StyleSheet, ImageBackground } from 'react-native'; +import { createStackNavigator } from '@react-navigation/stack'; + +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'} +}); + +const Repo = (props) => { + const file = props.data + const cards = file['cards'] + const navigation = file['navi'] + return ( + <View style={styles.container}> + <ImageBackground source={require('C:/Coding/cs242-assignment3/GitView/assets/ice.jpg')} style={styles.image}> + <View style={styles.viewStyleVertical}> + {cards} + <Pressable style={styles.pressableStyle} onPress={() => navigation.navigate('Profile')}> + <Text> Go to Profile </Text> + </Pressable> + </View> + </ImageBackground> + </View> + ) +} + +export default Repo; \ No newline at end of file diff --git a/src/Components/Unfound.js b/src/Components/Unfound.js new file mode 100644 index 0000000000000000000000000000000000000000..1bfc4a9715547d06d58d3e929b91d1fbaeb7b0af --- /dev/null +++ b/src/Components/Unfound.js @@ -0,0 +1,35 @@ +import * as React from 'react'; +import { Pressable, View, Text, Image, StyleSheet, ImageBackground } from 'react-native'; +import { createStackNavigator } from '@react-navigation/stack'; + +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'} +}); + +const Unfound = (props) => { + const dataFile = props.data + const navigation = dataFile['navi'] + return ( + <View style={styles.container}> + <ImageBackground source={require('C:/Coding/cs242-assignment3/GitView/assets/ice.jpg')} style={styles.image}> + <View style={styles.viewStyleVertical}> + <Text style={{ fontSize: 30 }}> Error! Check log to see details </Text> + <Image style={{width: 200, height: 200}} source={require('C:/Coding/cs242-assignment3/GitView/assets/warn.png')} /> + <Pressable style={styles.pressableStyle} onPress={() => navigation.navigate('Home')}> + <Text> Go back to Home Page </Text> + </Pressable> + </View> + </ImageBackground> + </View> + ) +} + +export default Unfound; \ No newline at end of file diff --git a/src/__mocks__/fileMock.js b/src/__mocks__/fileMock.js new file mode 100644 index 0000000000000000000000000000000000000000..84c1da6fdcb26b510616f8dbbec6416945fd4104 --- /dev/null +++ b/src/__mocks__/fileMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub'; \ No newline at end of file diff --git a/src/__mocks__/styleMock.js b/src/__mocks__/styleMock.js new file mode 100644 index 0000000000000000000000000000000000000000..a0995453769c8a76594b879c09c58064530c155a --- /dev/null +++ b/src/__mocks__/styleMock.js @@ -0,0 +1 @@ +module.exports = {}; \ No newline at end of file diff --git a/src/__tests__/App-test.js b/src/__tests__/App-test.js new file mode 100644 index 0000000000000000000000000000000000000000..79c4721138f1ec19a2b1b602a773699cfb9b03c3 --- /dev/null +++ b/src/__tests__/App-test.js @@ -0,0 +1,65 @@ +import 'react-native'; +import React from 'react'; +import Profile from '../Components/Profile'; +import App from '../App' +import renderer from 'react-test-renderer'; +import Loading from '../Components/Loading'; +import Repo from '../Components/Repo'; +import { createStackNavigator } from '@react-navigation/stack'; +import { NavigationContainer } from '@react-navigation/native'; +import Unfound from '../Components/Unfound'; + +const Stack = createStackNavigator(); + +test('renders correctly', () => { + const tree = renderer.create( + <Loading /> + ).toJSON(); + expect(tree).toMatchSnapshot(); + }); + + test('renders correctly', ({navigation}) => { + const dataFile = { + iconUrl: "https://avatars.githubusercontent.com/u/42978932?u=b4a7beb2752bb6059cd13d12ca26d097767abf77&v=4", + nameContent: null, + userNameContent: null, + bioContent: null, + websiteLink: null, + emailContent: null, + createData: null, + repoCount: 0, + navi: navigation + } + const tree = renderer.create( + <Profile data={dataFile}/> + ).toJSON(); + expect(tree).toMatchSnapshot(); + }); + + test('renders correctly', ({navigation}) => { + const dataFile = { + iconUrl: "https://avatars.githubusercontent.com/u/42978932?u=b4a7beb2752bb6059cd13d12ca26d097767abf77&v=4", + nameContent: null, + userNameContent: null, + bioContent: null, + websiteLink: null, + emailContent: null, + createData: null, + repoCount: 0, + navi: navigation + } + const tree = renderer.create( + <Repo data={dataFile}/> + ).toJSON(); + expect(tree).toMatchSnapshot(); + }); + + test('renders correctly', ({navigation}) => { + const dataFile = { + navi: navigation + } + const tree = renderer.create( + <Unfound data={dataFile}/> + ).toJSON(); + expect(tree).toMatchSnapshot(); + }); \ No newline at end of file diff --git a/src/__tests__/UnitTest.js b/src/__tests__/UnitTest.js new file mode 100644 index 0000000000000000000000000000000000000000..2a52498cac4316899884e347f2a45ef6faa88568 --- /dev/null +++ b/src/__tests__/UnitTest.js @@ -0,0 +1,14 @@ +import 'react-native'; +import React from 'react'; +import Profile from '../Components/Profile'; +import App from '../App' +import renderer from 'react-test-renderer'; +import Loading from '../Components/Loading'; +import Repo from '../Components/Repo'; +import { createStackNavigator } from '@react-navigation/stack'; +import { NavigationContainer } from '@react-navigation/native'; +import Unfound from '../Components/Unfound'; + +const Stack = createStackNavigator(); + +const generateData = require() \ No newline at end of file diff --git a/src/__tests__/__snapshots__/App-test.js.snap b/src/__tests__/__snapshots__/App-test.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..365ee0e77e7228c48f517b3cd3b2f31f19c0011c --- /dev/null +++ b/src/__tests__/__snapshots__/App-test.js.snap @@ -0,0 +1,305 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders correctly 1`] = ` +<View + style={ + Object { + "flex": 1, + } + } +> + <View + accessibilityIgnoresInvertColors={true} + style={ + Object { + "flex": 1, + "justifyContent": "center", + "resizeMode": "cover", + } + } + > + <Image + source="test-file-stub" + style={ + Array [ + Object { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + }, + Object { + "height": undefined, + "width": undefined, + }, + undefined, + ] + } + /> + <View + style={ + Object { + "alignItems": "center", + "justifyContent": "center", + "margin": "10%", + } + } + > + <View + style={ + Object { + "alignItems": "center", + "justifyContent": "center", + "margin": "10%", + } + } + > + <Image + source="test-file-stub" + style={ + Object { + "height": 100, + "width": 100, + } + } + /> + </View> + <View + style={ + Object { + "flex": 1, + "flexDirection": "row", + "justifyContent": "space-between", + } + } + > + <View + accessible={true} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + Object { + "backgroundColor": "lavender", + "borderColor": "thistle", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "flexDirection": "row", + "justifyContent": "space-between", + "marginHorizontal": 10, + "marginTop": 10, + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <Text> + Followers + </Text> + </View> + <View + accessible={true} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + Object { + "backgroundColor": "lavender", + "borderColor": "thistle", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "flexDirection": "row", + "justifyContent": "space-between", + "marginHorizontal": 10, + "marginTop": 10, + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <Text> + Followings + </Text> + </View> + </View> + <View + style={ + Object { + "alignItems": "center", + "justifyContent": "center", + "margin": "10%", + } + } + > + <Text + style={ + Object { + "alignItems": "flex-start", + "backgroundColor": "white", + "borderColor": "black", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "marginHorizontal": 10, + "marginTop": 20, + "paddingHorizontal": 50, + "paddingVertical": 10, + } + } + > + nameContent + </Text> + <Text + style={ + Object { + "alignItems": "flex-start", + "backgroundColor": "white", + "borderColor": "black", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "marginHorizontal": 10, + "marginTop": 20, + "paddingHorizontal": 50, + "paddingVertical": 10, + } + } + > + userNameContent + </Text> + <Text + style={ + Object { + "alignItems": "flex-start", + "backgroundColor": "white", + "borderColor": "black", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "marginHorizontal": 10, + "marginTop": 20, + "paddingHorizontal": 50, + "paddingVertical": 10, + } + } + > + bioContent + </Text> + <Text + style={ + Object { + "alignItems": "flex-start", + "backgroundColor": "white", + "borderColor": "black", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "marginHorizontal": 10, + "marginTop": 20, + "paddingHorizontal": 50, + "paddingVertical": 10, + } + } + > + websiteLink + </Text> + <Text + style={ + Object { + "alignItems": "flex-start", + "backgroundColor": "white", + "borderColor": "black", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "marginHorizontal": 10, + "marginTop": 20, + "paddingHorizontal": 50, + "paddingVertical": 10, + } + } + > + emailContent + </Text> + <Text + style={ + Object { + "alignItems": "flex-start", + "backgroundColor": "white", + "borderColor": "black", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "marginHorizontal": 10, + "marginTop": 20, + "paddingHorizontal": 50, + "paddingVertical": 10, + } + } + > + createDate + </Text> + </View> + <View + style={ + Object { + "alignItems": "center", + "justifyContent": "center", + "margin": "10%", + } + } + > + <View + accessible={true} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + Object { + "backgroundColor": "lavender", + "borderColor": "thistle", + "borderRadius": 5, + "borderWidth": 2, + "flex": 1, + "flexDirection": "row", + "justifyContent": "space-between", + "marginHorizontal": 10, + "marginTop": 10, + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <Text> + repoCount + </Text> + </View> + </View> + </View> + </View> +</View> +`; diff --git a/src/assets/adaptive-icon.png b/src/assets/adaptive-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03d6f6b6c6727954aec1d8206222769afd178d8d Binary files /dev/null and b/src/assets/adaptive-icon.png differ diff --git a/src/assets/default.png b/src/assets/default.png new file mode 100644 index 0000000000000000000000000000000000000000..7284d396a4c589f887c952a760616fecfe734b5b Binary files /dev/null and b/src/assets/default.png differ diff --git a/src/assets/favicon.png b/src/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..e75f697b1801871ad8cd9309b05e8ffe8c6b6d01 Binary files /dev/null and b/src/assets/favicon.png differ diff --git a/src/assets/ice.jpg b/src/assets/ice.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae36dd1e6687f10a20c552c269cf65e7c111c9c1 Binary files /dev/null and b/src/assets/ice.jpg differ diff --git a/src/assets/icon.png b/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b1526fc7b78680fd8d733dbc6113e1af695487 Binary files /dev/null and b/src/assets/icon.png differ diff --git a/src/assets/loading.png b/src/assets/loading.png new file mode 100644 index 0000000000000000000000000000000000000000..110b65163b7a69485ccfca66ea61e5ff35a02d73 Binary files /dev/null and b/src/assets/loading.png differ diff --git a/src/assets/splash.png b/src/assets/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..6f47774733be408640c3db372cf91117354b0479 Binary files /dev/null and b/src/assets/splash.png differ diff --git a/src/assets/warn.png b/src/assets/warn.png new file mode 100644 index 0000000000000000000000000000000000000000..3c13a9627d5d9db54c3d4f72ef1244e7dba01f46 Binary files /dev/null and b/src/assets/warn.png differ diff --git a/src/package.json b/src/package.json new file mode 100644 index 0000000000000000000000000000000000000000..87fc242d355b276e01b759058495c5cab6227626 --- /dev/null +++ b/src/package.json @@ -0,0 +1,42 @@ +{ + "main": "node_modules/expo/AppEntry.js", + "scripts": { + "start": "expo start", + "android": "expo start --android", + "ios": "expo start --ios", + "web": "expo start --web", + "eject": "expo eject", + "test": "jest" + }, + "jest": { + "preset": "react-native", + "setupFiles": [ + "./node_modules/react-native-gesture-handler/jestSetup.js" + ], + "moduleNameMapper": { + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js", + "\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js" + } + }, + "dependencies": { + "@react-native-community/masked-view": "0.1.10", + "@react-navigation/native": "^5.9.3", + "@react-navigation/stack": "^5.14.3", + "expo": "~40.0.0", + "expo-status-bar": "~1.0.3", + "react": "16.13.1", + "react-dom": "16.13.1", + "react-native": "https://github.com/expo/react-native/archive/sdk-40.0.1.tar.gz", + "react-native-gesture-handler": "~1.8.0", + "react-native-reanimated": "~1.13.0", + "react-native-safe-area-context": "3.1.9", + "react-native-screens": "~2.15.2", + "react-native-web": "~0.13.12", + "react-test-renderer": "^17.0.2" + }, + "devDependencies": { + "@babel/core": "~7.9.0", + "jest": "^26.6.3" + }, + "private": true +}