@@ -5,6 +5,7 @@ import { Query, Mutation } from 'react-apollo'
5
5
import gql from 'graphql-tag'
6
6
import { withRouter } from 'react-router'
7
7
import get from 'lodash/get'
8
+ import debounce from 'lodash/debounce'
8
9
9
10
import { deslugify } from '../lib/helpers'
10
11
@@ -21,16 +22,44 @@ class Section extends Component {
21
22
} , 2000 )
22
23
}
23
24
25
+ updateScrollPosition = ( ) => {
26
+ window . scrollTo ( 0 , this . props . section . scrollY )
27
+ }
28
+
24
29
componentDidMount ( ) {
25
30
this . viewedSection ( get ( this , 'props.section.id' ) )
31
+ window . addEventListener ( 'scroll' , this . handleScroll )
32
+ this . updateScrollPosition ( )
33
+ }
34
+
35
+ componentWillUnmount ( ) {
36
+ window . removeEventListener ( 'scroll' , this . handleScroll )
26
37
}
27
38
39
+ handleScroll = debounce ( ( ) => {
40
+ if ( this . props . section . scrollY === window . scrollY ) {
41
+ return
42
+ }
43
+
44
+ this . props . setScrollPosition ( {
45
+ variables : {
46
+ id : this . props . section . id ,
47
+ scrollY : window . scrollY
48
+ }
49
+ } )
50
+ } , 1000 )
51
+
28
52
componentDidUpdate ( prevProps ) {
53
+ if ( ! this . props . section ) {
54
+ return
55
+ }
56
+
29
57
const { id } = this . props . section
30
58
const sectionChanged = get ( prevProps , 'section.id' ) !== id
31
59
32
60
if ( sectionChanged ) {
33
61
this . viewedSection ( id )
62
+ this . updateScrollPosition ( )
34
63
}
35
64
}
36
65
@@ -93,14 +122,16 @@ Section.propTypes = {
93
122
title : PropTypes . string ,
94
123
number : PropTypes . number ,
95
124
content : PropTypes . string ,
96
- views : PropTypes . number
125
+ views : PropTypes . number ,
126
+ scrollY : PropTypes . number
97
127
} ) ,
98
128
chapter : PropTypes . shape ( {
99
129
title : PropTypes . string ,
100
130
number : PropTypes . number
101
131
} ) ,
102
132
loading : PropTypes . bool . isRequired ,
103
- viewedSection : PropTypes . func . isRequired
133
+ viewedSection : PropTypes . func . isRequired ,
134
+ setScrollPosition : PropTypes . func . isRequired
104
135
}
105
136
106
137
const SECTION_BY_ID_QUERY = gql `
@@ -109,6 +140,7 @@ const SECTION_BY_ID_QUERY = gql`
109
140
id
110
141
content
111
142
views
143
+ scrollY @client
112
144
}
113
145
}
114
146
`
@@ -121,6 +153,7 @@ const SECTION_BY_CHAPTER_TITLE_QUERY = gql`
121
153
id
122
154
content
123
155
views
156
+ scrollY @client
124
157
}
125
158
}
126
159
}
@@ -136,6 +169,7 @@ const SECTION_BY_NUMBER_QUERY = gql`
136
169
title
137
170
content
138
171
views
172
+ scrollY @client
139
173
}
140
174
}
141
175
}
@@ -150,6 +184,12 @@ const VIEWED_SECTION_MUTATION = gql`
150
184
}
151
185
`
152
186
187
+ const SET_SECTION_SCROLL_MUTATION = gql `
188
+ mutation SetSectionScroll($id: String!, $scrollY: Int!) {
189
+ setSectionScroll(id: $id, scrollY: $scrollY) @client
190
+ }
191
+ `
192
+
153
193
const SectionWithData = ( { location : { state, pathname } } ) => {
154
194
const page = deslugify ( pathname )
155
195
@@ -162,7 +202,8 @@ const SectionWithData = ({ location: { state, pathname } }) => {
162
202
section : {
163
203
...state . section ,
164
204
content : get ( data , 'section.content' ) ,
165
- views : get ( data , 'section.views' )
205
+ views : get ( data , 'section.views' ) ,
206
+ scrollY : get ( data , 'section.scrollY' )
166
207
} ,
167
208
chapter : state . chapter ,
168
209
loading
@@ -193,10 +234,15 @@ const SectionWithData = ({ location: { state, pathname } }) => {
193
234
{ queryInfo => (
194
235
< Mutation mutation = { VIEWED_SECTION_MUTATION } >
195
236
{ viewedSection => (
196
- < Section
197
- { ...createProps ( queryInfo ) }
198
- viewedSection = { viewedSection }
199
- />
237
+ < Mutation mutation = { SET_SECTION_SCROLL_MUTATION } >
238
+ { setScrollPosition => (
239
+ < Section
240
+ { ...createProps ( queryInfo ) }
241
+ viewedSection = { viewedSection }
242
+ setScrollPosition = { setScrollPosition }
243
+ />
244
+ ) }
245
+ </ Mutation >
200
246
) }
201
247
</ Mutation >
202
248
) }
0 commit comments