Skip to content

Commit

Permalink
refactor #67 : BaseButton이 아닌 Button에서 아이콘을 처리하도록 로직 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
minh0518 committed Feb 25, 2025
1 parent 2828802 commit 9055d06
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 23 deletions.
20 changes: 5 additions & 15 deletions src/common/components/base-button/base-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,15 @@ import * as styles from './base-button.styles';

export interface BaseButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
asChild?: boolean;
icon?: ReactNode;
iconPosition?: 'left' | 'right';
}

/** 기본 버튼 스타일 & 주입받은 props와 아이콘을 기반으로 최종 UI를 렌더링하는 컴포넌트 */
/** 주입받은 스타일이 기본 버튼 스타일 일부 오버라이딩 */
const BaseButton = forwardRef<HTMLButtonElement, BaseButtonProps>(
({ asChild, icon, iconPosition, children, ...props }, ref) => {
const Comp = asChild ? Slot : 'button';
/** 상황에 따라 주입받은 스타일이 기본 버튼 스타일에 대한 오버라이딩 가능 */
const BaseButton = forwardRef<HTMLButtonElement, BaseButtonProps>(({ asChild, ...props }, ref) => {
const Comp = asChild ? Slot : 'button';

return (
<Comp css={styles.button} ref={ref} {...props}>
{icon && iconPosition === 'left' && icon}
{children}
{icon && iconPosition === 'right' && icon}
</Comp>
);
},
);
return <Comp css={styles.button} ref={ref} {...props}></Comp>;
});
BaseButton.displayName = 'BaseButton';

export { BaseButton };
21 changes: 15 additions & 6 deletions src/common/components/button/Button.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { forwardRef } from 'react';
import { forwardRef, ReactNode } from 'react';

import { Usage, ButtonVariant, Size } from '@/assets/styles/button';
import { BaseButton, BaseButtonProps } from '@/common/components/base-button/base-button';
Expand All @@ -9,17 +9,26 @@ export interface ButtonProps extends BaseButtonProps {
size: Size;
usage: Usage;
variant: ButtonVariant;
icon?: ReactNode;
iconPosition?: 'left' | 'right';
}

const Button = forwardRef<HTMLButtonElement, ButtonProps>(
({ size, usage, variant, icon, ...props }, ref) => {
const buttonStyle = generateCss(size, usage, variant, icon !== undefined && usage === 'normal');
({ size, usage, variant, icon, children, iconPosition, ...props }, ref) => {
const isMultiButton = icon !== undefined && usage === 'normal';
const buttonStyle = generateCss(size, usage, variant, isMultiButton);

// 텍스트만 >> size, usage, variant
// 아이콘만 >> size, usage, variant, icon
// 텍스트+아이콘 >> size, usage, variant, icon, position

return <BaseButton ref={ref} css={buttonStyle} icon={icon} {...props} />;
// 텍스트+아이콘 >> size, usage, variant, icon, iconPosition

return (
<BaseButton ref={ref} css={buttonStyle} {...props}>
{isMultiButton && iconPosition === 'left' && icon}
{!isMultiButton && icon ? icon : children}
{isMultiButton && iconPosition === 'right' && icon}
</BaseButton>
);
},
);

Expand Down
2 changes: 0 additions & 2 deletions src/route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ export const router = createBrowserRouter([
path: '/',
element: (
<div>
{/* icon은 props로 넘겨주기 && 아이콘 정렬 방향 따로 지정 */}
<Button
size="large"
usage="normal"
Expand All @@ -27,7 +26,6 @@ export const router = createBrowserRouter([
usage="iconOnly"
variant="purlple"
icon={<Icon name="pin" width={24} />}
iconPosition="right"
/>

<Button size="large" usage="normal" variant="purlple">
Expand Down

0 comments on commit 9055d06

Please # to comment.