Skip to content

Commit 8994010

Browse files
committed
feat: add delay prop to <Render> and <RenderInterv
1 parent 6ebce5e commit 8994010

File tree

5 files changed

+151
-69
lines changed

5 files changed

+151
-69
lines changed

src/Render/__story__/story.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {Render} from '..';
66
import ShowDocs from '../../../.storybook/ShowDocs'
77

88
storiesOf('Animation/Render', module)
9-
// .add('Documentation', () => h(ShowDocs, {md: require('../../../docs/en/Overlay.md')}))
9+
.add('Documentation', () => h(ShowDocs, {md: require('../../../docs/en/Render.md')}))
1010
.add('Defaults', () =>
1111
<div>
1212
<Render>{({value}) =>
@@ -21,9 +21,24 @@ storiesOf('Animation/Render', module)
2121
width: 100,
2222
height: 100,
2323
background: 'tomato',
24-
opacity: value,
24+
opacity: .1 + .9 * value,
2525
position: 'relative',
26-
top: (value * 100) - 100,
26+
top: (value * 100),
27+
left: 100
28+
}}>{value}</div>
29+
}</Render>
30+
</div>
31+
)
32+
.add('Entry with delay', () =>
33+
<div>
34+
<Render delay={1000} ms={2000}>{({value}) =>
35+
<div style={{
36+
width: 100,
37+
height: 100,
38+
background: 'tomato',
39+
opacity: .1 + .9 * value,
40+
position: 'relative',
41+
top: (value * 100),
2742
left: 100
2843
}}>{value}</div>
2944
}</Render>

src/Render/index.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {render, createEnhancer} from 'react-universal-interface';
33
import {h} from '../util';
44

55
export interface IRenderProps {
6+
delay?: number;
67
ms?: number;
78
}
89

@@ -17,6 +18,7 @@ export class Render extends Component<IRenderProps, IRenderState> {
1718
ms: 300
1819
};
1920

21+
timeout = null;
2022
frame = null;
2123

2224
state = {
@@ -26,6 +28,21 @@ export class Render extends Component<IRenderProps, IRenderState> {
2628
};
2729

2830
componentDidMount () {
31+
const {delay} = this.props;
32+
33+
if (delay) {
34+
this.timeout = setTimeout(this.start, delay);
35+
} else {
36+
this.start();
37+
}
38+
}
39+
40+
componentWillUnmount () {
41+
cancelAnimationFrame(this.frame);
42+
clearTimeout(this.timeout);
43+
}
44+
45+
start = () => {
2946
const now = Date.now();
3047

3148
this.setState({
@@ -37,10 +54,6 @@ export class Render extends Component<IRenderProps, IRenderState> {
3754
});
3855
}
3956

40-
componentWillUnmount () {
41-
cancelAnimationFrame(this.frame);
42-
}
43-
4457
onFrame = () => {
4558
const now = Date.now();
4659
const value = Math.min((now - this.state.start) / this.props.ms, 1);

src/RenderInterval/__story__/story.tsx

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,56 @@ import {RenderInterval} from '..';
66
import ShowDocs from '../../../.storybook/ShowDocs'
77

88
storiesOf('Animation/RenderInterval', module)
9-
// .add('Documentation', () => h(ShowDocs, {md: require('../../../docs/en/Overlay.md')}))
9+
.add('Documentation', () => h(ShowDocs, {md: require('../../../docs/en/RenderInterval.md')}))
1010
.add('Defaults', () =>
11-
<div>
12-
<RenderInterval>{({value}) =>
13-
<div>{value}</div>
14-
}</RenderInterval>
15-
</div>
16-
)
17-
.add('Entry animation', () =>
18-
<div>
19-
<RenderInterval ms={2000}>{({value}) =>
20-
<div style={{
21-
width: 100,
22-
height: 100,
23-
background: 'tomato',
24-
opacity: value,
25-
position: 'relative',
26-
top: (value * 100) - 100,
27-
left: 100
28-
}}>{value}</div>
29-
}</RenderInterval>
30-
</div>
31-
)
11+
<div>
12+
<RenderInterval>{({value}) =>
13+
<div>{value}</div>
14+
}</RenderInterval>
15+
</div>
16+
)
17+
.add('Entry animation', () =>
18+
<div>
19+
<RenderInterval ms={2000}>{({value}) =>
20+
<div style={{
21+
width: 100,
22+
height: 100,
23+
background: 'tomato',
24+
opacity: .1 + .9 * value,
25+
position: 'relative',
26+
top: (value * 100),
27+
left: 100
28+
}}>{value}</div>
29+
}</RenderInterval>
30+
</div>
31+
)
32+
.add('Entry with delay', () =>
33+
<div>
34+
<RenderInterval delay={1000} ms={2000}>{({value}) =>
35+
<div style={{
36+
width: 100,
37+
height: 100,
38+
background: 'tomato',
39+
opacity: .1 + .9 * value,
40+
position: 'relative',
41+
top: (value * 100),
42+
left: 100
43+
}}>{value}</div>
44+
}</RenderInterval>
45+
</div>
46+
)
47+
.add('Custom fps', () =>
48+
<div>
49+
<RenderInterval fps={10} ms={2000}>{({value}) =>
50+
<div style={{
51+
width: 100,
52+
height: 100,
53+
background: 'tomato',
54+
opacity: .1 + .9 * value,
55+
position: 'relative',
56+
top: (value * 100),
57+
left: 100
58+
}}>{value}</div>
59+
}</RenderInterval>
60+
</div>
61+
)

src/RenderInterval/index.ts

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import {Component} from 'react';
22
import {render, createEnhancer} from 'react-universal-interface';
33
import {h} from '../util';
4+
import {IRenderProps, IRenderState} from '../Render';
45

5-
export interface IRenderIntervalProps {
6+
export interface IRenderIntervalProps extends IRenderProps {
67
fps?: number;
7-
ms?: number;
88
}
99

10-
export interface IRenderIntervalState {
11-
start?: number;
12-
now?: number;
13-
value?: number;
10+
export interface IRenderIntervalState extends IRenderState {
1411
}
1512

1613
export class RenderInterval extends Component<IRenderIntervalProps, IRenderIntervalState> {
@@ -19,8 +16,9 @@ export class RenderInterval extends Component<IRenderIntervalProps, IRenderInter
1916
ms: 300
2017
};
2118

22-
delay: number = 50;
19+
interval: number = 50;
2320
timeout = null;
21+
timeoutDelay = null;
2422

2523
state = {
2624
start: 0,
@@ -29,27 +27,38 @@ export class RenderInterval extends Component<IRenderIntervalProps, IRenderInter
2927
};
3028

3129
componentDidMount () {
30+
const {delay} = this.props;
31+
32+
if (delay) {
33+
this.timeoutDelay = setTimeout(this.start, delay);
34+
} else {
35+
this.start();
36+
}
37+
}
38+
39+
start = () => {
3240
const now = Date.now();
3341

34-
this.delay = 1000 / this.props.fps;
42+
this.interval = 1000 / this.props.fps;
3543

3644
this.setState({
3745
start: now,
3846
now,
3947
value: 0
4048
}, () => {
41-
this.timeout = setTimeout(this.onFrame, this.delay);
49+
this.timeout = setTimeout(this.onFrame, this.interval);
4250
});
4351
}
4452

4553
componentDidUpdate (props) {
4654
if (props.fps !== this.props.fps) {
47-
this.delay = 1000 / this.props.fps;
55+
this.interval = 1000 / this.props.fps;
4856
}
4957
}
5058

5159
componentWillUnmount () {
5260
clearTimeout(this.timeout);
61+
clearTimeout(this.timeoutDelay);
5362
}
5463

5564
onFrame = () => {
@@ -59,7 +68,7 @@ export class RenderInterval extends Component<IRenderIntervalProps, IRenderInter
5968

6069
if (value < 1) {
6170
onState = () => {
62-
this.timeout = setTimeout(this.onFrame, this.delay);
71+
this.timeout = setTimeout(this.onFrame, this.interval);
6372
};
6473
}
6574

0 commit comments

Comments
 (0)