Skip to content

Commit 5db2e59

Browse files
committed
Merge pull request #74 from FormidableLabs/feature-id-hash
Adds string hash capability
2 parents 3674b8b + c9e9153 commit 5db2e59

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

src/deck.jsx

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class Deck extends React.Component {
2929
};
3030
}
3131
componentDidMount() {
32-
const slide = this.context.slide;
32+
const slide = this._getSlideIndex();
3333
this.setState({
3434
lastSlide: slide
3535
});
@@ -85,7 +85,7 @@ class Deck extends React.Component {
8585
_goToSlide(e) {
8686
if (e.key === "spectacle-slide") {
8787
const data = JSON.parse(e.newValue);
88-
const slide = this.context.slide;
88+
const slide = this._getSlideIndex();
8989
this.setState({
9090
lastSlide: slide || 0
9191
});
@@ -95,13 +95,13 @@ class Deck extends React.Component {
9595
}
9696
}
9797
_prevSlide() {
98-
const slide = this.context.slide;
98+
const slide = this._getSlideIndex();
9999
this.setState({
100100
lastSlide: slide
101101
});
102-
if (this._checkFragments(slide, false) || this.context.overview) {
102+
if (this._checkFragments(this.context.slide, false) || this.context.overview) {
103103
if (slide > 0) {
104-
this.context.router.replaceWith("/" + (slide - 1) + this._getSuffix());
104+
this.context.router.replaceWith("/" + this._getHash(slide - 1) + this._getSuffix());
105105
localStorage.setItem("spectacle-slide",
106106
JSON.stringify({slide: slide - 1, forward: false, time: Date.now()}));
107107
}
@@ -111,13 +111,13 @@ class Deck extends React.Component {
111111
}
112112
}
113113
_nextSlide() {
114-
const slide = this.context.slide;
114+
const slide = this._getSlideIndex();
115115
this.setState({
116116
lastSlide: slide
117117
});
118-
if (this._checkFragments(slide, true) || this.context.overview) {
118+
if (this._checkFragments(this.context.slide, true) || this.context.overview) {
119119
if (slide < this.props.children.length - 1) {
120-
this.context.router.replaceWith("/" + (slide + 1) + this._getSuffix());
120+
this.context.router.replaceWith("/" + this._getHash(slide + 1) + this._getSuffix());
121121
localStorage.setItem("spectacle-slide",
122122
JSON.stringify({slide: slide + 1, forward: true, time: Date.now()}));
123123
}
@@ -126,6 +126,13 @@ class Deck extends React.Component {
126126
JSON.stringify({slide, forward: true, time: Date.now()}));
127127
}
128128
}
129+
_getHash(slide) {
130+
let hash = slide;
131+
if ('id' in this.props.children[slide].props) {
132+
hash = this.props.children[slide].props.id;
133+
}
134+
return hash;
135+
}
129136
_checkFragments(slide, forward) {
130137
const store = this.context.flux.stores.SlideStore;
131138
const fragments = store.getState().fragments;
@@ -252,11 +259,25 @@ class Deck extends React.Component {
252259

253260
return 0;
254261
}
262+
_getSlideIndex() {
263+
let index = 0;
264+
if (!parseInt(this.context.slide)) {
265+
this.props.children.forEach((slide, i) => {
266+
if (slide.props.id === this.context.slide) {
267+
index = i;
268+
}
269+
});
270+
} else {
271+
index = parseInt(this.context.slide);
272+
}
273+
return index;
274+
}
255275
_renderSlide() {
256-
const slide = this.context.slide;
276+
const slide = this._getSlideIndex();
257277
const child = this.props.children[slide];
258278
return cloneWithProps(child, {
259279
key: slide,
280+
hash: this.context.slide,
260281
slideIndex: slide,
261282
lastSlide: this.state.lastSlide,
262283
transition: child.props.transition.length ?
@@ -296,11 +317,11 @@ class Deck extends React.Component {
296317
let componentToRender;
297318
if (this.context.presenter) {
298319
componentToRender = (<Presenter slides={this.props.children}
299-
slide={this.context.slide} lastSlide={this.state.lastSlide} />);
320+
slide={this._getSlideIndex()} lastSlide={this.state.lastSlide} />);
300321
} else if (this.context.export) {
301322
componentToRender = <Export slides={this.props.children} />;
302323
} else if (this.context.overview) {
303-
componentToRender = <Overview slides={this.props.children} slide={this.context.slide} />;
324+
componentToRender = <Overview slides={this.props.children} slide={this._getSlideIndex()} />;
304325
} else {
305326
componentToRender = (<TransitionGroup component="div" style={[styles.transition]}>
306327
{this._renderSlide()}
@@ -316,7 +337,7 @@ class Deck extends React.Component {
316337
{componentToRender}
317338
{!this.context.export ? <Progress
318339
items={this.props.children}
319-
currentSlide={this.context.slide}
340+
currentSlide={this._getSlideIndex()}
320341
type={this.props.progress}/> : ""}
321342
<Style rules={assign(this.context.styles.global, globals)} />
322343
</div>

src/slide.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const Slide = React.createClass({
5757
Array.prototype.slice.call(frags, 0).forEach((frag, i) => {
5858
frag.dataset.fid = i;
5959
this.context.flux.actions.SlideActions.addFragment({
60-
slide: this.props.slideIndex,
60+
slide: this.props.hash,
6161
id: i,
6262
visible: this.props.lastSlide > this.props.slideIndex
6363
});

src/utils/context.jsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,18 @@ const context = function context(Component, params) {
2424
} else {
2525
styles = params.styles;
2626
}
27+
let slide = 0;
28+
if (this.props.params && "slide" in this.props.params) {
29+
slide = this.props.params.slide;
30+
}
2731
return {
2832
styles,
2933
flux: params.flux,
3034
presenter: location.query && "presenter" in location.query,
3135
overview: location.query && "overview" in location.query,
3236
export: location.query && "export" in location.query,
3337
print: location.query && "print" in location.query,
34-
slide: this.props.params && "slide" in this.props.params ?
35-
parseInt(this.props.params.slide) : 0
38+
slide: slide
3639
};
3740
},
3841

0 commit comments

Comments
 (0)