stories/ReplaceTransition.js (81 lines of code) (raw):

import { css } from 'astroturf'; import React, { useState } from 'react'; import { storiesOf } from '@storybook/react'; import ReplaceTransition from '../src/ReplaceTransition'; import CSSTransition from '../src/CSSTransition'; const FADE_TIMEOUT = 1000; const styles = css` .enter { opacity: 0.01; } .enter.enter-active { position: absolute; left: 0; right: 0; opacity: 1; transition: opacity ${FADE_TIMEOUT * 2}ms ease-in; transition-delay: ${FADE_TIMEOUT}ms; } .exit { opacity: 1; } .exit.exit-active { opacity: 0.01; transition: opacity ${FADE_TIMEOUT}ms ease-in; } .box { padding: 20px; background-color: #ccc; } .container { position: relative; } `; const defaultProps = { in: false, timeout: FADE_TIMEOUT * 2, }; function Fade(props) { return ( <CSSTransition {...props} className={styles.box} classNames={styles} /> ); } Fade.defaultProps = defaultProps; function Example({ children }) { const [show, setShow] = useState(false); return ( <div> <button onClick={() => { setShow(!show); }} > toggle (in: "{String(show)}") </button> {React.cloneElement(children, { in: show })} </div> ); } storiesOf('Replace Transition', module).add('Animates on all', () => { const firstNodeRef = React.createRef(); const secondNodeRef = React.createRef(); return ( <Example> <ReplaceTransition in={false} // `Example` is overriding this prop className={styles.container} onEnter={() => console.log('onEnter')} onEntering={() => console.log('onEntering')} onEntered={() => console.log('onEntered')} onExit={() => console.log('onExit')} onExiting={() => console.log('onExiting')} onExited={() => console.log('onExited')} > <Fade nodeRef={firstNodeRef}> <div ref={firstNodeRef}>in True</div> </Fade> <Fade nodeRef={secondNodeRef}> <div ref={secondNodeRef}>in False</div> </Fade> </ReplaceTransition> </Example> ); });