@@ -4,70 +4,120 @@ import cloneWithProps from 'react/lib/cloneWithProps';
44import Radium from 'radium' ;
55import _ from 'lodash' ;
66
7+ import Presenter from './presenter' ;
8+
79React . initializeTouchEvents ( true ) ;
810
911const Style = Radium . Style ;
1012
11- const TransitionGroup = React . addons . TransitionGroup ;
13+ const TransitionGroup = Radium ( React . addons . TransitionGroup ) ;
1214
1315@Radium
1416class Deck extends React . Component {
1517 constructor ( props ) {
1618 super ( props ) ;
1719 this . _handleKeyPress = this . _handleKeyPress . bind ( this ) ;
1820 this . _handleClick = this . _handleClick . bind ( this ) ;
21+ this . _goToSlide = this . _goToSlide . bind ( this ) ;
1922 this . state = {
2023 lastSlide : null
2124 } ;
2225 }
2326 componentDidMount ( ) {
27+ let slide = 'slide' in this . context . router . state . params ?
28+ parseInt ( this . context . router . state . params . slide ) : 0 ;
2429 this . setState ( {
25- lastSlide : 'slide' in this . context . router . state . params ?
26- parseInt ( this . context . router . state . params . slide ) : 0
30+ lastSlide : slide
2731 } ) ;
32+ localStorage . setItem ( 'spectacle-slide' ,
33+ JSON . stringify ( { slide : slide , forward : false , time : Date . now ( ) } ) ) ;
2834 this . _attachEvents ( ) ;
2935 }
3036 componentWillUnmount ( ) {
3137 this . _detachEvents ( ) ;
3238 }
3339 _attachEvents ( ) {
40+ window . addEventListener ( 'storage' , this . _goToSlide ) ;
3441 window . addEventListener ( 'keydown' , this . _handleKeyPress ) ;
3542 }
3643 _detachEvents ( ) {
44+ window . removeEventListener ( 'storage' , this . _goToSlide ) ;
3745 window . removeEventListener ( 'keydown' , this . _handleKeyPress ) ;
3846 }
3947 _handleKeyPress ( e ) {
4048 let event = window . event ? window . event : e ;
4149 event . keyCode === 37 && this . _prevSlide ( ) ;
4250 event . keyCode === 39 && this . _nextSlide ( ) ;
4351 }
52+ _goToSlide ( e ) {
53+ if ( e . key === 'spectacle-slide' ) {
54+ let data = JSON . parse ( e . newValue ) ;
55+ let presenter = this . context . presenter ? '?presenter' : '' ;
56+ let slide = 'slide' in this . context . router . state . params ?
57+ parseInt ( this . context . router . state . params . slide ) : 0 ;
58+ this . setState ( {
59+ lastSlide : slide || 0
60+ } ) ;
61+ if ( this . _checkFragments ( slide , data . forward ) ) {
62+ this . context . router . replaceWith ( '/' + ( data . slide ) + presenter ) ;
63+ }
64+ }
65+ }
4466 _prevSlide ( ) {
4567 let slide = 'slide' in this . context . router . state . params ?
4668 parseInt ( this . context . router . state . params . slide ) : 0 ;
69+ let presenter = this . context . presenter ? '?presenter' : '' ;
4770 this . setState ( {
4871 lastSlide : slide
4972 } ) ;
5073 if ( this . _checkFragments ( slide , false ) ) {
5174 if ( slide > 0 ) {
52- this . context . router . replaceWith ( '/' + ( slide - 1 ) ) ;
75+ this . context . router . replaceWith ( '/' + ( slide - 1 ) + presenter ) ;
76+ localStorage . setItem ( 'spectacle-slide' ,
77+ JSON . stringify ( { slide : slide - 1 , forward : false , time : Date . now ( ) } ) ) ;
78+ }
79+ } else {
80+ if ( slide > 0 ) {
81+ localStorage . setItem ( 'spectacle-slide' ,
82+ JSON . stringify ( { slide : slide , forward : false , time : Date . now ( ) } ) ) ;
5383 }
5484 }
5585 }
5686 _nextSlide ( ) {
5787 let slide = 'slide' in this . context . router . state . params ?
5888 parseInt ( this . context . router . state . params . slide ) : 0 ;
89+ let presenter = this . context . presenter ? '?presenter' : '' ;
5990 this . setState ( {
6091 lastSlide : slide
6192 } ) ;
6293 if ( this . _checkFragments ( slide , true ) ) {
6394 if ( slide < this . props . children . length - 1 ) {
64- this . context . router . replaceWith ( '/' + ( slide + 1 ) ) ;
95+ this . context . router . replaceWith ( '/' + ( slide + 1 ) + presenter ) ;
96+ localStorage . setItem ( 'spectacle-slide' ,
97+ JSON . stringify ( { slide : slide + 1 , forward : true , time : Date . now ( ) } ) ) ;
98+ }
99+ } else {
100+ if ( slide < this . props . children . length - 1 ) {
101+ localStorage . setItem ( 'spectacle-slide' ,
102+ JSON . stringify ( { slide : slide , forward : true , time : Date . now ( ) } ) ) ;
65103 }
66104 }
67105 }
68106 _checkFragments ( slide , forward ) {
69107 let store = this . context . flux . stores . SlideStore ;
70108 let fragments = store . getState ( ) . fragments ;
109+ // Not proud of this at all. 0.14 Parent based contexts will fix this.
110+ if ( this . context . presenter ) {
111+ let main = document . querySelector ( '.spectacle-presenter-main' ) ;
112+ if ( main ) {
113+ let fragments = main . querySelectorAll ( '.appear' ) ;
114+ if ( ! fragments . length ) {
115+ return true ;
116+ }
117+ } else {
118+ return true ;
119+ }
120+ }
71121 if ( slide in fragments ) {
72122 let count = _ . size ( fragments [ slide ] ) ;
73123 let visible = _ . filter ( fragments [ slide ] , function ( s ) {
@@ -223,6 +273,9 @@ class Deck extends React.Component {
223273 exportMode = true ;
224274 }
225275
276+ let slide = 'slide' in this . context . router . state . params ?
277+ parseInt ( this . context . router . state . params . slide ) : 0 ;
278+
226279 let globals = exportMode ? {
227280 body : {
228281 minWidth : 1100 ,
@@ -232,24 +285,34 @@ class Deck extends React.Component {
232285 } : { } ;
233286
234287 let styles = {
235- position : 'absolute' ,
236- top : 0 ,
237- left : 0 ,
238- width : '100%' ,
239- height : '100%' ,
240- perspective : 1000 ,
241- transformStyle : 'preserve-3d'
288+ deck : {
289+ backgroundColor : this . context . presenter ? 'black' : '' ,
290+ position : 'absolute' ,
291+ top : 0 ,
292+ left : 0 ,
293+ width : '100%' ,
294+ height : '100%' ,
295+ perspective : 1000 ,
296+ transformStyle : 'preserve-3d'
297+ } ,
298+ transition : {
299+ height : '100%' ,
300+ width : '100%'
301+ }
242302 } ;
243303
244304 return (
245305 < div
246306 className = "spectacle-deck"
247- style = { [ styles ] }
307+ style = { [ styles . deck ] }
248308 onClick = { this . _handleClick }
249309 { ...this . _getTouchEvents ( ) } >
250- < TransitionGroup component = "div" style = { { height : '100%' } } >
251- { this . _renderSlide ( ) }
252- </ TransitionGroup >
310+ { this . context . presenter ?
311+ < Presenter slides = { this . props . children }
312+ slide = { slide } lastSlide = { this . state . lastSlide } /> :
313+ < TransitionGroup component = "div" style = { [ styles . transition ] } >
314+ { this . _renderSlide ( ) }
315+ </ TransitionGroup > }
253316 < Style rules = { assign ( this . context . styles . global , globals ) } />
254317 </ div >
255318 )
@@ -265,7 +328,8 @@ Deck.defaultProps = {
265328Deck . contextTypes = {
266329 styles : React . PropTypes . object ,
267330 router : React . PropTypes . object ,
268- flux : React . PropTypes . object
331+ flux : React . PropTypes . object ,
332+ presenter : React . PropTypes . bool
269333} ;
270334
271335export default Deck ;
0 commit comments