프로젝트 소개

현재 협업 중인 사이드 프로젝트에서는 쉽고 간편한 검색과 다양한 추천 서비스를 제공하는 OTT 정보 플랫폼 서비스의 프론트엔드(FE) 개발을 진행하고 있습니다. 사용자에게 최적의 경험을 제공하기 위해 일관된 UI 컴포넌트와 효율적인 코드 구조를 구축하는 것을 목표로 합니다. 이를 위해 프론트엔드 팀원(저를 포함해 3명)분들과 함께 공통으로 사용할 UI 컴포넌트를 개발하고 있습니다.

문제 상황

before.mp4

문제 해결 과정

1. 이슈 분석

2. 해결 방안 설계

3. 코드 구현


// 중략

const SectionSlider: React.FC<SectionSliderProps> = ({
  sectionSlides,
  showActionBar,
}) => {
  const [isDragging, setIsDragging] = useState(false);
  const [startX, setStartX] = useState(0);

  const handleMouseDown = (e: React.MouseEvent) => {
    setIsDragging(false);
    setStartX(e.clientX);
  };

  const handleMouseMove = (e: React.MouseEvent) => {
    if (e.buttons !== 1) return; // 마우스 왼쪽 버튼이 눌려 있지 않으면 종료
    const moveX = Math.abs(e.clientX - startX);
    if (moveX > 5) { // 드래그 거리가 5px 이상이면 드래그로 인식
      setIsDragging(true);
    }
  };

  const handleMouseUp = () => {
    // 드래그가 끝났으므로 상태를 false로 변경
    setTimeout(() => {
      setIsDragging(false);
    }, 50);
  };

  const settings = {
    infinite: true,
    speed: 500,
    slidesToShow: 8,
    slidesToScroll: 1,
    swipeToSlide: true,
  };

  return (
    <div className={styles.container}>
      <div className={`${styles.slider} section-slider`}>
        <Slider {...settings}>
          {sectionSlides.map((sectionSlide, index) => (
            <div
              key={index}
              onMouseDown={handleMouseDown}
              onMouseMove={handleMouseMove}
              onMouseUp={handleMouseUp}
            >
              <Link
                href={sectionSlide.detailUrl}
                className={styles.cardLink}
                onClick={(e) => {
                  // 드래그 중일 때만 클릭 이벤트 방지
                  if (isDragging) {
                    e.preventDefault();
                  }
                }}
              >
                /* 중략 */
              </Link>
            </div>
          ))}
        </Slider>
      </div>
    </div>
  );
};

export default SectionSlider;