Skip to content

Commit 14cdb43

Browse files
author
Setsun
authored
feat(factory): Simplify API for v2 Alpha (#14)
Simplify the factory function signature, and ability to delay transitions
1 parent c414eac commit 14cdb43

File tree

5 files changed

+72
-70
lines changed

5 files changed

+72
-70
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-transition-factory",
3-
"version": "1.1.0",
3+
"version": "2.0.0-alpha.1",
44
"description": "Simple transition / animation component creation for React",
55
"license": "MIT",
66
"repository": {

src/factory/index.js

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -34,91 +34,87 @@ const getStyleString = (
3434
? `${currentStyle} ${style}`
3535
: style;
3636

37-
const transitionFactory = (
38-
transitionConfigs: Array<TransitionConfig>,
39-
staticStyles?: Object,
40-
defaultProps?: TransitionProps
41-
) => {
37+
const transitionFactory = (...args: Array<any>) => {
38+
const transitions: Array<TransitionConfig> = [...args];
39+
4240
return class extends React.Component<TransitionProps> {
41+
static transitions = transitions;
42+
4343
static defaultProps = {
4444
timeout: 300,
45+
delay: 0,
4546
easing: 'ease-in-out',
46-
...defaultProps,
4747
};
4848

49-
constructor(props: TransitionProps) {
50-
super(props);
51-
const { timeout, easing, start, end } = props;
52-
53-
// warm up cache
54-
this.getFinalStyle('entering', timeout, easing, start, end);
55-
this.getFinalStyle('entered', timeout, easing, start, end);
56-
this.getFinalStyle('exiting', timeout, easing, start, end);
57-
this.getFinalStyle('exited', timeout, easing, start, end);
58-
}
59-
60-
getGlobalTimeout = naiveMemoize((timeout: number): number => {
61-
return Array.isArray(timeout) ? Math.max(...timeout) : timeout;
62-
});
49+
getGlobalTimeout = naiveMemoize(
50+
(timeout: number, delay: number): number =>
51+
(Array.isArray(timeout) ? Math.max(...timeout) : timeout) +
52+
(Array.isArray(delay) ? Math.max(...delay) : delay)
53+
);
6354

64-
getTransitionProperty = (timeout: number, easing: string): string => {
65-
return transitionConfigs
66-
.map((config, index) => {
55+
getTransitionProperty = (
56+
timeout: number,
57+
delay: number,
58+
easing: string
59+
): string => {
60+
return transitions
61+
.map((transition, index) => {
6762
const timeoutVal = getPrimitiveValue(timeout, index);
63+
const delayVal = getPrimitiveValue(delay, index);
6864
const easingVal = getPrimitiveValue(easing, index);
69-
return `${config.transition} ${timeoutVal}ms ${easingVal}`;
65+
return `${
66+
transition.transition
67+
} ${timeoutVal}ms ${easingVal} ${delayVal}ms`;
7068
})
7169
.join(',');
7270
};
7371

7472
getDefaultStyle = (
7573
timeout: number,
74+
delay: number,
7675
easing: string,
7776
start: ArrayOrValue
7877
): Object => {
7978
return {
80-
transition: this.getTransitionProperty(timeout, easing),
81-
...(this.props.staticStyles || staticStyles),
82-
...transitionConfigs.reduce((style, config, index) => {
79+
transition: this.getTransitionProperty(timeout, delay, easing),
80+
...transitions.reduce((style, transition, index) => {
8381
const startVal = getPrimitiveValue(start, index);
84-
const transitionName = camelCase(config.transition);
82+
const transitionName = camelCase(transition.transition);
8583

8684
style[transitionName] = getStyleString(
8785
transitionName,
8886
style[transitionName],
89-
config.getStartStyle(startVal)
87+
transition.getStartStyle(startVal)
9088
);
9189
return style;
9290
}, {}),
9391
};
9492
};
9593

9694
getTransitionStates = (
97-
timeout: number,
98-
easing: string,
9995
start: ArrayOrValue,
10096
end: ArrayOrValue
10197
): TransitionStates => {
102-
return transitionConfigs.reduce(
103-
(styles, config, index) => {
98+
return transitions.reduce(
99+
(styles, transition, index) => {
104100
const startVal = getPrimitiveValue(start, index);
105101
const endVal = getPrimitiveValue(end, index);
106-
const transitionName = camelCase(config.transition);
102+
const transitionName = camelCase(transition.transition);
107103

108104
styles.entering[transitionName] = getStyleString(
109105
transitionName,
110106
styles.entering[transitionName],
111-
config.getStartStyle(startVal)
107+
transition.getStartStyle(startVal)
112108
);
113109
styles.entered[transitionName] = getStyleString(
114110
transitionName,
115111
styles.entered[transitionName],
116-
config.getEndStyle(endVal)
112+
transition.getEndStyle(endVal)
117113
);
118114
styles.exiting[transitionName] = getStyleString(
119115
transitionName,
120116
styles.exiting[transitionName],
121-
config.getStartStyle(startVal)
117+
transition.getStartStyle(startVal)
122118
);
123119
styles.exited[transitionName] = styles.entering[transitionName];
124120
return styles;
@@ -136,33 +132,43 @@ const transitionFactory = (
136132
(
137133
state: string,
138134
timeout: number,
135+
delay: number,
139136
easing: string,
140137
start: ArrayOrValue,
141138
end: ArrayOrValue
142139
): Object => {
143140
return {
144-
...this.getDefaultStyle(timeout, easing, start),
145-
...this.getTransitionStates(timeout, easing, start, end)[state],
141+
...this.getDefaultStyle(timeout, delay, easing, start),
142+
...this.getTransitionStates(start, end)[state],
146143
};
147144
}
148145
);
149146

150147
render() {
151-
const { children, timeout, easing, start, end, ...rest } = this.props;
148+
const {
149+
children,
150+
timeout,
151+
delay,
152+
easing,
153+
start,
154+
end,
155+
...rest
156+
} = this.props;
152157

153158
return (
154159
<Transition
155160
in
156161
appear
157162
mountOnEnter
158163
unmountOnExit
159-
timeout={this.getGlobalTimeout(timeout)}
164+
timeout={this.getGlobalTimeout(timeout, delay)}
160165
{...rest}
161166
>
162167
{(state, childProps) => {
163168
const style = this.getFinalStyle(
164169
state,
165170
timeout,
171+
delay,
166172
easing,
167173
start,
168174
end

src/factory/spec/transitionFactory.spec.js

Whitespace-only changes.

src/types/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ export type TransitionConfig = {
2020

2121
export type TransitionProps = {
2222
children: Function | Node,
23-
staticStyles?: Object,
23+
timeout: Array<number | { enter?: number, exit?: number }> | number,
24+
delay: Array<number | { enter?: number, exit?: number }> | number,
25+
easing: ArrayOrString,
2426
start?: ArrayOrValue,
2527
end?: ArrayOrValue,
26-
timeout: ArrayOrNumber,
27-
easing: ArrayOrString,
2828
};

stories/index.js

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,39 @@ import { storiesOf } from '@storybook/react';
55
import { action } from '@storybook/addon-actions';
66
import { linkTo } from '@storybook/addon-links';
77

8-
import FadeTransition from '../src/components/FadeTransition';
9-
import FlipTransition from '../src/components/FlipTransition';
10-
import ExpandTransition from '../src/components/ExpandTransition';
11-
import ScaleTransition from '../src/components/ScaleTransition';
12-
import SlideTransition from '../src/components/SlideTransition';
13-
import RotateTransition from '../src/components/RotateTransition';
14-
158
import TransitionGroupDecorator from './decorators/TransitionGroupDecorator';
169
import KatPersona from './components/KatPersona';
1710
import WarningMessage from './components/WarningMessage';
1811

1912
import './index.css';
2013
import transitionFactory from '../src/factory';
21-
import { opacity, translate, rotate, scale } from '../src/presets/index';
14+
import {
15+
opacity,
16+
translate,
17+
rotate,
18+
rotate3d,
19+
scale,
20+
} from '../src/presets/index';
21+
22+
const FadeTransition = transitionFactory(opacity);
23+
const SlideTransition = transitionFactory(translate.top);
24+
const ExpandTransition = transitionFactory(scale.vertical);
25+
const FlipTransition = transitionFactory(rotate3d.top);
26+
const RotateTransition = transitionFactory(rotate);
27+
const ScaleTransition = transitionFactory(scale.all);
2228

23-
const BatmanWipeTransition = transitionFactory([opacity, rotate, scale.all]);
29+
const BatmanWipeTransition = transitionFactory(opacity, rotate, scale.all);
2430

25-
const SwipeInTransition = transitionFactory(
26-
[
27-
{
28-
transition: 'max-width',
29-
getStartStyle: () => 0,
30-
getEndStyle: () => 400,
31-
},
32-
],
33-
{
34-
overflow: 'hidden',
35-
}
36-
);
31+
const SwipeInTransition = transitionFactory({
32+
transition: 'max-width',
33+
getStartStyle: () => 0,
34+
getEndStyle: () => 400,
35+
});
3736

3837
storiesOf('Standard Transitions', module)
3938
.addDecorator(TransitionGroupDecorator)
4039
.add('Fade', () => (
41-
<FadeTransition
42-
onEnter={(...args) => console.log(args)}
43-
transitionId="fade-transition"
44-
>
40+
<FadeTransition onEnter={(...args) => console.log(args)} delay={1000}>
4541
<KatPersona />
4642
</FadeTransition>
4743
))

0 commit comments

Comments
 (0)