토이프로젝트 - 프로필 페이지 만들기

프로필 페이지 만들기 (6) - Header Item Refactoring

vitamin3000 2025. 2. 7. 16:54

 

이번 포스트에서는 이전에 작성한 Header Item에 대한 내용이다.

 

메인 페이지를 구현하다보니 아래 사진과 같이 More이라는 버튼을 만들게 되었다.

 

근데 이것이 Header Item과 같이 사용할 수 있을것 같았고, 다양한 곳에서 사용할 수 있을 것 같았다

 

따라서! 다음과 같이 Button으로 컴포넌트를 분리하였다.

import { colors } from '@/styles';
import React from 'react';
import styled from 'styled-components';

type ButtonProps = {
  color?: string;
  size?: 'small' | 'medium' | 'large'; 
  active?: string;
  children: React.ReactNode;
  onClick?: React.MouseEventHandler<HTMLButtonElement>;
};

const Button = ({
  color,
  size = 'medium',
  active = 'false',
  children,
  onClick,
}: ButtonProps) => {
  return (
    <S.Button color={color} size={size} active={active} onClick={onClick}>
      {children}
    </S.Button>
  );
};

const S = {
  Button: styled.button<ButtonProps>`
    width: ${(props) => {
      switch (props.size) {
        case 'small':
          return '10%';
        case 'medium':
          return '15%';
        case 'large':
          return '20%';
        default:
          return '15%';
      }
    }};
    height: ${(props) => {
      switch (props.size) {
        case 'small':
          return '3vh';
        case 'medium':
          return '4vh';
        case 'large':
          return '5vh';
        default:
          return '4vh';
      }
    }};

    display: flex;
    justify-content: center;
    align-items: center;
    cursor: pointer;
    font-size: 1.2rem;
    border-radius: 4px;
    padding: 4px;
    background-color: ${(props) =>
      props.active === 'true' ? colors.semantic.secondary : ''};
    color: ${(props) =>
      props.active === 'true'
        ? colors.semantic.text.light
        : colors.semantic.text.dark};
    &:hover {
      color: ${colors.semantic.text.light};
    }

    p {
      cursor: pointer;
    }
  `,
};

export default Button;

 

초기값을 리터럴 또는 문자열로 작성하고, props에 따른 처리는 switch로 작성하였다.

 

크기 등의 CSS 처리는 이전 Header Item을 그대로 갖고 왔다.

 

 

+ ) 

 

정보 및 페이지 이동의 버튼과 모달창을 띄우는 More의 기능이 서로 달라서

아마 type을 props로 받아서 다르게 나타내야 할 것 같다