reblend-ui
Version:
Utilities for creating robust overlay components
84 lines (83 loc) • 2.93 kB
JavaScript
"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 */