123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- import React, { useEffect, useState } from 'react';
- import { Transition } from '@douyinfe/semi-animation-react';
- import PropTypes from 'prop-types';
- const formatStyle = function formatStyle({ rotate = 0 }) {
- return {
- transform: `rotate(${Math.ceil(rotate)}deg)`,
- };
- };
- export interface OpenIconTransitionProps {
- children?: React.ReactNode;
- isOpen?: boolean;
- }
- function OpenIconTransition(props: OpenIconTransitionProps = {}) {
- const { children, isOpen } = props;
- const [immediate, setImmediate] = useState(true);
- useEffect(() => {
- setImmediate(false);
- }, []);
- return (
- <Transition
- immediate={immediate}
- state={isOpen ? 'enter' : 'leave'}
- from={{ rotate: 0 }}
- enter={{ rotate: { val: 180, duration: 200, easing: 'cubic-bezier(.62, .05, .36, .95)' } }}
- leave={{ rotate: { val: 0, duration: 200, easing: 'cubic-bezier(.62, .05, .36, .95)' } }}
- >
- {(transitionStyle: any) => {
- const formatedStyle = formatStyle(transitionStyle);
- if (typeof children === 'function') {
- return children(formatedStyle);
- }
- if (React.isValidElement(children)) {
- return React.cloneElement(children, {
- style: {
- ...(children.props && children.props.style),
- ...formatedStyle,
- },
- });
- }
- return children;
- }}
- </Transition>
- );
- }
- OpenIconTransition.propTypes = {
- isOpen: PropTypes.bool.isRequired,
- children: PropTypes.any.isRequired,
- };
- export default OpenIconTransition;
|