Skip to content

Commit 7d1d143

Browse files
committed
Add ChapterScreen and SECTIONS_QUERY
1 parent 0839294 commit 7d1d143

File tree

3 files changed

+83
-6
lines changed

3 files changed

+83
-6
lines changed

App.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { createStackNavigator } from '@react-navigation/stack'
55
import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client'
66

77
import HomeScreen from './src/HomeScreen'
8+
import ChapterScreen from './src/ChapterScreen'
89
import { screenOptions } from './src/styles'
910

1011
const Stack = createStackNavigator()
@@ -24,6 +25,19 @@ export default function App() {
2425
component={HomeScreen}
2526
options={{ title: '📖 The GraphQL Guide' }}
2627
/>
28+
<Stack.Screen
29+
name="Chapter"
30+
component={ChapterScreen}
31+
options={({
32+
route: {
33+
params: {
34+
chapter: { number, title },
35+
},
36+
},
37+
}) => ({
38+
title: number ? `Chapter ${number}: ${title}` : title,
39+
})}
40+
/>
2741
</Stack.Navigator>
2842
<StatusBar style="light" />
2943
</NavigationContainer>

src/ChapterScreen.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import React from 'react'
2+
import { View, Text, FlatList } from 'react-native'
3+
import { gql, useQuery } from '@apollo/client'
4+
5+
import styles from './styles'
6+
import Loading from './Loading'
7+
8+
const SECTIONS_QUERY = gql`
9+
query Sections($id: Int!) {
10+
chapter(id: $id) {
11+
sections {
12+
number
13+
title
14+
}
15+
}
16+
}
17+
`
18+
19+
const SectionItem = ({ section, chapter }) => (
20+
<View style={styles.item}>
21+
<Text style={styles.header}>
22+
{chapter.number}.{section.number}: {section.title}
23+
</Text>
24+
</View>
25+
)
26+
27+
export default ({ route }) => {
28+
const { data, loading } = useQuery(SECTIONS_QUERY, {
29+
variables: { id: route.params.chapter.id },
30+
})
31+
32+
if (loading) {
33+
return <Loading />
34+
}
35+
36+
const {
37+
chapter: { sections },
38+
} = data
39+
40+
if (sections.length === 1) {
41+
return (
42+
<View style={styles.centered}>
43+
<Text>No sections</Text>
44+
</View>
45+
)
46+
}
47+
48+
return (
49+
<FlatList
50+
data={sections}
51+
renderItem={({ item }) => (
52+
<SectionItem section={item} chapter={route.params.chapter} />
53+
)}
54+
keyExtractor={(section) => section.number.toString()}
55+
initialNumToRender={15}
56+
/>
57+
)
58+
}

src/HomeScreen.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React from 'react'
22
import { Text, FlatList, Pressable } from 'react-native'
33
import { gql, useQuery } from '@apollo/client'
4+
import { AppLoading } from 'expo'
45

5-
import Loading from './Loading'
66
import styles from './styles'
77

88
const CHAPTERS_QUERY = gql`
@@ -15,7 +15,7 @@ const CHAPTERS_QUERY = gql`
1515
}
1616
`
1717

18-
const ChapterItem = ({ chapter }) => {
18+
const ChapterItem = ({ chapter, onPress }) => {
1919
const { number, title } = chapter
2020
let header, subheader
2121

@@ -27,24 +27,29 @@ const ChapterItem = ({ chapter }) => {
2727
}
2828

2929
return (
30-
<Pressable style={styles.item}>
30+
<Pressable style={styles.item} onPress={onPress}>
3131
<Text style={styles.header}>{header}</Text>
3232
{subheader && <Text style={styles.subheader}>{subheader}</Text>}
3333
</Pressable>
3434
)
3535
}
3636

37-
export default () => {
37+
export default ({ navigation }) => {
3838
const { data, loading } = useQuery(CHAPTERS_QUERY)
3939

4040
if (loading) {
41-
return <Loading />
41+
return <AppLoading />
4242
}
4343

4444
return (
4545
<FlatList
4646
data={data.chapters}
47-
renderItem={({ item }) => <ChapterItem chapter={item} />}
47+
renderItem={({ item }) => (
48+
<ChapterItem
49+
chapter={item}
50+
onPress={() => navigation.navigate('Chapter', { chapter: item })}
51+
/>
52+
)}
4853
keyExtractor={(chapter) => chapter.id.toString()}
4954
/>
5055
)

0 commit comments

Comments
 (0)