What I did.

  • 인앱약정 프로젝트에 투입되기 전, 기존에 구현된 웹 페이지 이동이 딱딱 끊긴다는 부자연스럽다는 피드백이 있었습니다.
  • 필수 QA 사항은 아니었지만, 사용성 개선을 위해 App-like한 애니메이션이 필요하다고 생각하여 자진하여 웹뷰 애니메이션을 수정하였습니다.
  • react-spring의 useTransition을 이용하여 우측으로 넘기는 모션과 좌측으로 넘기는 모션을 적용하여 애니웹에서도 앱처럼 자연스러운 모션으로 이동할 수 있도록 사용성을 개선하였습니다.

Before

* 예시 코드입니다.

  // 기존에 모든 웹뷰는 transition 없이 페이지 전환됨
  function ContractLayout({ children, className = '' }: Props) {
    return (
      <div className="layout"> 
        {children}
      </div>
    )
  }

After

* 예시 코드입니다.

  import { useSelector } from 'react-redux';
  import { useTransition, animated } from 'react-spring';

  import { contractSelector } from '@/selectors';


  function ContractLayout({ children, className = '' }: Props) {

    // 현재 페이지가 뒤로가는 모션인지, 다음 페이지를 가는 모션인지 구분하여 다른 transition을 줌
    const { back } = useSelector(contractSelector);

    // react-spring의 useTransition를 사용해 페이지 모션 추가
    const transitions = useTransition(router, (location) => location.pathname, {
      from: { opacity: 0, transform: back ? 'translate3d(-50%, 0, 0)' : 'translate3d(100%, 0, 0)' },
      enter: { opacity: 1, transform: 'translate3d(0%, 0, 0)' },
      leave: { opacity: 0, transform: back ? 'translate3d(100%, 0, 0)' : 'translate3d(-50%, 0, 0)' },
    });

    return (
      {transitions.map(({ item, props, key }) => (
        <animated.div key={key} style={props}>
          <div
            className="layout"
          >
            {children}
          </div>
        </animated.div>
      ))}
    )
  }