UNPKG

reblend-ui

Version:

Utilities for creating robust overlay components

84 lines (83 loc) 2.93 kB
"use strict"; exports.__esModule = true; exports.default = useRTGTransitionProps; var _reblendjs = require("reblendjs"); var _reblendHooks = require("reblend-hooks"); var _utils = require("./utils"); /** * Normalizes RTG transition callbacks with nodeRef to better support * strict mode. * * @param props Transition props. * @returns Normalized transition props. */ function useRTGTransitionProps({ onEnter, onEntering, onEntered, onExit, onExiting, onExited, addEndListener, children, ...props }) { const nodeRef = _reblendjs.useRef.bind(this)(null); this.state.nodeRef = nodeRef; const mergedRef = _reblendHooks.useMergedRefs.bind(this)(this.state.nodeRef, (0, _utils.getChildRef)(children)); this.state.mergedRef = mergedRef; const normalize = callback => param => { if (callback && this.state.nodeRef.current) { callback(this.state.nodeRef.current, param); } }; this.state.normalize = normalize; const handleEnter = _reblendjs.useCallback.bind(this)(this.state.normalize(onEnter), [onEnter]); this.state.handleEnter = handleEnter; const handleEntering = _reblendjs.useCallback.bind(this)(this.state.normalize(onEntering), [onEntering]); this.state.handleEntering = handleEntering; const handleEntered = _reblendjs.useCallback.bind(this)(this.state.normalize(onEntered), [onEntered]); this.state.handleEntered = handleEntered; const handleExit = _reblendjs.useCallback.bind(this)(this.state.normalize(onExit), [onExit]); this.state.handleExit = handleExit; const handleExiting = _reblendjs.useCallback.bind(this)(this.state.normalize(onExiting), [onExiting]); this.state.handleExiting = handleExiting; const handleExited = _reblendjs.useCallback.bind(this)(this.state.normalize(onExited), [onExited]); this.state.handleExited = handleExited; const handleAddEndListener = _reblendjs.useCallback.bind(this)(this.state.normalize(addEndListener), [addEndListener]); this.state.handleAddEndListener = handleAddEndListener; return { ...props, nodeRef: this.state.nodeRef, ...(onEnter && { onEnter: this.state.handleEnter }), ...(onEntering && { onEntering: this.state.handleEntering }), ...(onEntered && { onEntered: this.state.handleEntered }), ...(onExit && { onExit: this.state.handleExit }), ...(onExiting && { onExiting: this.state.handleExiting }), ...(onExited && { onExited: this.state.handleExited }), ...(addEndListener && { addEndListener: this.state.handleAddEndListener }), children: typeof children === 'function' ? (status, innerProps) => // TODO: Types for RTG missing innerProps, so need to cast. children(status, { ...innerProps, ref: this.state.mergedRef }) : (0, _reblendjs.cloneElement)(children, { ref: this.state.mergedRef }) }; } /* @Reblend: Transformed from function to class */