@@ -3,10 +3,11 @@ import Link from './Link'
3
3
import { Query } from 'react-apollo'
4
4
import gql from 'graphql-tag'
5
5
import LinkListSubscriptions from './LinkListSubscriptions'
6
+ import { LINKS_PER_PAGE } from '../constants'
6
7
7
8
export const FEED_QUERY = gql `
8
- {
9
- feed {
9
+ query FeedQuery($first: Int, $skip: Int, $orderBy: LinkOrderByInput) {
10
+ feed(first: $first, skip: $skip, orderBy: $orderBy) {
10
11
links {
11
12
id
12
13
createdAt
@@ -23,27 +24,65 @@ export const FEED_QUERY = gql`
23
24
}
24
25
}
25
26
}
27
+ count
26
28
}
27
29
}
28
30
`
29
31
30
- const updateCacheAfterVote = ( store , createVote , linkId ) => {
31
- const data = store . readQuery ( { query : FEED_QUERY } )
32
+ const updateCacheAfterVote = ( page , isNewPage , cache , createVote , linkId ) => {
33
+ const skip = isNewPage ? ( page - 1 ) * LINKS_PER_PAGE : 0
34
+ const first = isNewPage ? LINKS_PER_PAGE : 100
35
+ const orderBy = isNewPage ? 'createdAt_DESC' : null
36
+ const data = cache . readQuery ( {
37
+ query : FEED_QUERY ,
38
+ variables : { first, skip, orderBy }
39
+ } )
32
40
33
41
const votedLink = data . feed . links . find ( link => link . id === linkId )
34
42
votedLink . votes = createVote . link . votes
43
+ cache . writeQuery ( { query : FEED_QUERY , data } )
44
+ }
45
+
46
+ const getQueryVariables = ( page , isNewPage ) => {
47
+ const skip = isNewPage ? ( page - 1 ) * LINKS_PER_PAGE : 0
48
+ const first = isNewPage ? LINKS_PER_PAGE : 100
49
+ const orderBy = isNewPage ? 'createdAt_DESC' : null
50
+ return { first, skip, orderBy }
51
+ }
52
+
53
+ const getLinksToRender = ( isNewPage , data ) => {
54
+ if ( isNewPage ) {
55
+ return data . feed . links
56
+ }
57
+ const rankedLinks = data . feed . links . slice ( )
58
+ rankedLinks . sort ( ( l1 , l2 ) => l2 . votes . length - l1 . votes . length )
59
+ return rankedLinks
60
+ }
35
61
36
- store . writeQuery ( { query : FEED_QUERY , data } )
62
+ const nextPage = ( page , data , history ) => {
63
+ if ( page <= data . feed . count / LINKS_PER_PAGE ) {
64
+ const nextPage = page + 1
65
+ history . push ( `/new/${ nextPage } ` )
66
+ }
67
+ }
68
+
69
+ const previousPage = ( page , history ) => {
70
+ if ( page > 1 ) {
71
+ const previousPage = page - 1
72
+ history . push ( `/new/${ previousPage } ` )
73
+ }
37
74
}
38
75
39
- export default ( ) => {
76
+ export default ( { match, location, history } ) => {
77
+ const isNewPage = location . pathname . includes ( 'new' )
78
+ const page = parseInt ( match . params . page , 10 )
40
79
return (
41
- < Query query = { FEED_QUERY } >
80
+ < Query query = { FEED_QUERY } variables = { getQueryVariables ( page , isNewPage ) } >
42
81
{ ( { loading, error, data, subscribeToMore } ) => {
43
82
if ( loading ) return < div > Fetching</ div >
44
83
if ( error ) return < div > Error</ div >
45
84
46
- const linksToRender = data . feed . links
85
+ const linksToRender = getLinksToRender ( isNewPage , data )
47
86
48
87
return (
49
88
< LinkListSubscriptions subscribeToMore = { subscribeToMore } >
@@ -52,9 +91,29 @@ export default () => {
52
91
key = { link . id }
53
92
link = { link }
54
93
index = { index }
55
- updateStoreAfterVote = { updateCacheAfterVote }
94
+ updateStoreAfterVote = { updateCacheAfterVote . bind (
95
+ this ,
96
+ page ,
97
+ isNewPage
98
+ ) }
56
99
/>
57
100
) ) }
101
+ { isNewPage && (
102
+ < div className = "flex ml4 mv3 gray" >
103
+ < div
104
+ className = "pointer mr2"
105
+ onClick = { ( ) => previousPage ( page , history ) }
106
+ >
107
+ Previous
108
+ </ div >
109
+ < div
110
+ className = "pointer"
111
+ onClick = { ( ) => nextPage ( page , data , history ) }
112
+ >
113
+ Next
114
+ </ div >
115
+ </ div >
116
+ ) }
58
117
</ LinkListSubscriptions >
59
118
)
60
119
} }
0 commit comments