@@ -22,6 +22,18 @@ const USER_AGENT_FOR_PRERENDERING: &str = "ReactSnap";
2222const STATIC_PATH : & str = "static" ;
2323const IMAGES_PATH : & str = "static/images" ;
2424
25+ // ------ ------
26+ // Before Mount
27+ // ------ ------
28+
29+ fn before_mount ( _: Url ) -> BeforeMount {
30+ BeforeMount :: new ( ) . mount_type ( MountType :: Takeover )
31+ }
32+
33+ // ------ ------
34+ // Model
35+ // ------ ------
36+
2537#[ derive( Clone , Copy , Eq , PartialEq ) ]
2638pub enum Visibility {
2739 Visible ,
@@ -37,10 +49,6 @@ impl Visibility {
3749 }
3850}
3951
40- // ------ ------
41- // Model
42- // ------ ------
43-
4452// We need at least 3 last values to detect scroll direction,
4553// because neighboring ones are sometimes equal.
4654type ScrollHistory = FixedVecDeque < [ i32 ; 3 ] > ;
@@ -52,6 +60,8 @@ pub struct Model {
5260 pub in_prerendering : bool ,
5361}
5462
63+ // ------ Page ------
64+
5565#[ derive( Clone , Copy , Eq , PartialEq ) ]
5666pub enum Page {
5767 Home ,
@@ -80,10 +90,10 @@ impl From<Url> for Page {
8090}
8191
8292// ------ ------
83- // Init
93+ // After Mount
8494// ------ ------
8595
86- pub fn init ( url : Url , orders : & mut impl Orders < Msg > ) -> Init < Model > {
96+ fn after_mount ( url : Url , orders : & mut impl Orders < Msg > ) -> AfterMount < Model > {
8797 orders. send_msg ( Msg :: UpdatePageTitle ) ;
8898
8999 let model = Model {
@@ -93,11 +103,7 @@ pub fn init(url: Url, orders: &mut impl Orders<Msg>) -> Init<Model> {
93103 in_prerendering : is_in_prerendering ( ) ,
94104 } ;
95105
96- Init {
97- model,
98- url_handling : UrlHandling :: None ,
99- mount_type : MountType :: Takeover ,
100- }
106+ AfterMount :: new ( model) . url_handling ( UrlHandling :: None )
101107}
102108
103109fn is_in_prerendering ( ) -> bool {
@@ -119,6 +125,25 @@ pub fn routes(url: Url) -> Option<Msg> {
119125 Some ( Msg :: RouteChanged ( url) )
120126}
121127
128+ // ------ ------
129+ // Window Events
130+ // ------ ------
131+
132+ pub fn window_events ( _: & Model ) -> Vec < Listener < Msg > > {
133+ vec ! [ raw_ev( Ev :: Scroll , |_| {
134+ // Some browsers use `document.body.scrollTop`
135+ // and other ones `document.documentElement.scrollTop`.
136+ let mut position = body( ) . scroll_top( ) ;
137+ if position == 0 {
138+ position = document( )
139+ . document_element( )
140+ . expect( "cannot get document element" )
141+ . scroll_top( )
142+ }
143+ Msg :: Scrolled ( position)
144+ } ) ]
145+ }
146+
122147// ------ ------
123148// Update
124149// ------ ------
@@ -199,25 +224,6 @@ pub fn asset_path(asset: &str) -> String {
199224 format ! ( "{}/{}" , STATIC_PATH , asset)
200225}
201226
202- // ------ ------
203- // Window Events
204- // ------ ------
205-
206- pub fn window_events ( _: & Model ) -> Vec < Listener < Msg > > {
207- vec ! [ raw_ev( Ev :: Scroll , |_| {
208- // Some browsers use `document.body.scrollTop`
209- // and other ones `document.documentElement.scrollTop`.
210- let mut position = body( ) . scroll_top( ) ;
211- if position == 0 {
212- position = document( )
213- . document_element( )
214- . expect( "cannot get document element" )
215- . scroll_top( )
216- }
217- Msg :: Scrolled ( position)
218- } ) ]
219- }
220-
221227// ------ ------
222228// Start
223229// ------ ------
@@ -226,7 +232,9 @@ pub fn window_events(_: &Model) -> Vec<Listener<Msg>> {
226232pub fn run ( ) {
227233 log ! ( "Starting app..." ) ;
228234
229- App :: build ( init, update, view)
235+ App :: builder ( update, view)
236+ . before_mount ( before_mount)
237+ . after_mount ( after_mount)
230238 . routes ( routes)
231239 . window_events ( window_events)
232240 . build_and_start ( ) ;
0 commit comments