Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat] input supportingText 구현 #41

Merged
merged 11 commits into from
Jul 8, 2024

Conversation

Bowoon1216
Copy link
Contributor

@Bowoon1216 Bowoon1216 commented Jul 7, 2024

해당 이슈 번호

closed #32


체크리스트

  • 🔀 PR 제목의 형식을 잘 작성했나요? e.g. [feat] PR을 등록한다.
  • 💯 테스트는 잘 통과했나요?
  • 🏗️ 빌드는 성공했나요?
  • 🧹 불필요한 코드는 제거했나요?
  • ✅ 컨벤션을 지켰나요?
  • 💭 이슈는 등록했나요?
  • 🏷️ 라벨은 등록했나요?
  • 💻 git rebase를 사용했나요?
  • 🙇‍♂️ 리뷰어를 지정했나요?
  • ✨ 저는 common로 분리했어요.

📌 내가 알게 된 부분

  • 텍스트 넘어갈 때 아래로 내려주는 css 태그
    wordBreak를 알게되었다!

📌사용법

Input 사용할 때, 속성으로 isError, isNotice, supportingText로 Supporting text를 사용할 수 있습니다.
isError 는 빨간색으로, isNotice는 파란색으로, 둘다 아무런 입력이 없으면 모두 false가 기본이고, 둘다 false인데 supporitngText가 있으면 회색으로 나오게 됩니다.
즉,
빨강: isError == true
파랑: isNotice == true
회색: isNotice & isError == false

{LeftIcon && <LeftIcon />}
<input css={inputStyle} {...props} />
</div>
{supportingText && <SupportingText text={supportingText} isError={isError} isNotice={isNotice} />}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서 SupportingText한테 텍스트는 children으로 넘겨준다면 더 깔끔할 것 같다고 생각이 들어요 !

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이말을 듣고 children에 대해서 알아보고 적용하였습니다!
children이 사용하기 훨씬 편할 것 같다는 생각이 드네욤 🙇‍♀️
좋은 지적 감사합니다 💟

Comment on lines 37 to 42

'::placeholder': {
color: theme.colors.gray_500,
...theme.text.body03,
},
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 스토리북으로 안 사실인데, input안의 텍스트에 대한 폰트 사이즈와 라인 헤이트도 설정해주셔야 될 것 같습니다 ! GUI 보구요 !

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오오! 알려주셔서 넘 감사합니다! 수정완료했습니다 !! 💯

Comment on lines 11 to 12
const textColor = isError ? theme.colors.red : isNotice ? theme.colors.blue_900 : theme.colors.gray_400;
return <p css={textStyle(textColor)}>{text}</p>;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요론거 가독성 좋게 return 문은 한 칸 띄워주시면 어떨지..!

그리고 isErrorisNoticetextStyle 함수에 바로 넘겨주고, 색깔 정하는 삼항연산자는 스타일 함수 내에서 수행하게 하는 건 어떠신가요 ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵!
textStyle에 많은 인자를 넣는 게 깔끔해보이지 않아서 저렇게 밖에서 했는데
주용님 말 들어보니까 스타일은 스타일 함수에서 수행하게 하는 것이 더 깔끔한 방법일 것 같네요!!! 👍
감사합니다 !!

Copy link
Contributor

@wuzoo wuzoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정말 고생하셨습니다 ~! 진짜 실력이 일취월장 하는 모습이 너무 훤히 보여요 !

제가 다 기쁘네용! 반영해주실 것만 반영해주시면 될것 같습니다.

Copy link
Contributor

@wuzoo wuzoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 ㅎㅎ 마지막 반영만 !!!!

const style = {
outline: {
boxShadow: ` 0px 0px 0px 1px ${theme.colors.gray_400}`,
boxShadow: ` 0px 0px 0px 1px ${borderColor}`,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요거 inset 추가해주어야 하지 않나요 ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inset 안하면 원래의 경계선에 shadow가 생기고 inset을 설정하면 경계선 안에 shadow가 생기더라구요!
underline 상태도 inset을 하지 않았기 때문에 outline도 inset설정하지 않았습니당

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

outline의 취지가 안에 border처럼 선이 생길려고 하는 의도가 맞지 않나요 ?? 지금처럼 작성해주면 말 그대로 box에 흐릿한 그림자가 생기는 것이라input의 의도상 inset이 맞지 않나 싶네요 !

그리고 추가적인 의견인데 outline 보다는 default 어떤가요 ? 저희 서비스 특징 상 input의 기본적인 형상이 outline이기 때문에 의견 한 번 내봅니다 !

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그리고 현재 boxShadow에 할당한 스트링에 맨 앞 공백 다 제거해주시면 감사하겠습니다 !

Comment on lines 27 to 36
const Input = ({
variant,
size = 'medium',
label,
LeftIcon,
isError = false,
isNotice = false,
supportingText,
...props
}: InputProps) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

특히 Input 컴포넌트는 forwardRef를 통해서 외부에서 ref를 전달받을 수 있도록 구현하는 것이 정말 좋아요 ! 왜냐하면 input이란 요소 자체가 ref를 통해 focusvalue 관련 기능을 많이 필요로 하기 때문입니다.

forwardRef는 말 그대로 부모 컴포넌트에게 ref를 전달할 수 있게끔 해주는 녀석이에요. Input은 순수 html 태그로 이루어진 jsx 요소가 아니기 때문에 원래는 ref를 전달하지 못하지만 다음과 같이 forwardRef를 사용하여 ref를 전달할 수 있어요.

const Input = ({
  ...
  
}: InputProps, ref: ForwardRef<HTMLInputElement>) => {
  return <input ref={ref} />;
}

export default forwardRef(Input)

이제 해당 Input 컴포넌트를 사용할 때도, 외부에서 ref를 prop으로 전달할 수 있게 되면서 하나의 DOM 노드로서 기능할 수 있도록 해준답니다 :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵! 알려주셔서 감사합니다~~!!
수정하였습니다!! 👍

Comment on lines 6 to 7
isError?: boolean; //red
isNotice?: boolean; //blue
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주석을 사용하실거라면 저렇게 red, blue 보다는 해당 prop이 어떤 용도로 쓰이는지를 적어주시는게 더 나을 것 같아요

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵! 이름에서 용도가 드러난다고 판단해서 주석 삭제하였습니당

Comment on lines 5 to 11
export const textStyle = ({ isError, isNotice }: { isError: boolean; isNotice: boolean }) => {
const textColor = isError ? theme.colors.red : isNotice ? theme.colors.blue_900 : theme.colors.gray_400;

const style: CSSObject = { color: textColor, wordBreak: 'break-word', ...theme.text.body04 };

return style;
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반환 객체의 타입을 따로 지정하지 않아도 동작하지 않나요 ?

CSSObject를 반환하는게 아니라 그냥 style을 css 함수로 작성하면 될 것 같습니다.

const style = css({
  ...
});

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

타입스크립트 css-in-js에서 color나 다른 속성들은 타입을 문자열로 받아도 유연하게 대처하는데 제가 사용한 wordBreak 속성은 css 표준에 정의된 특정값 (CSSObject 형태) 로 받아야 에러가 나지 않더라구요!
그래서 문자열로 보냈을 때 에러를해결하기 위해 CSSObject 키워드를 붙여줬습니다. !

Copy link
Contributor

@wuzoo wuzoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 ! 마지막 반영... !

const style = {
outline: {
boxShadow: ` 0px 0px 0px 1px ${theme.colors.gray_400}`,
boxShadow: ` 0px 0px 0px 1px ${borderColor}`,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

outline의 취지가 안에 border처럼 선이 생길려고 하는 의도가 맞지 않나요 ?? 지금처럼 작성해주면 말 그대로 box에 흐릿한 그림자가 생기는 것이라input의 의도상 inset이 맞지 않나 싶네요 !

그리고 추가적인 의견인데 outline 보다는 default 어떤가요 ? 저희 서비스 특징 상 input의 기본적인 형상이 outline이기 때문에 의견 한 번 내봅니다 !

const style = {
outline: {
boxShadow: ` 0px 0px 0px 1px ${theme.colors.gray_400}`,
boxShadow: ` 0px 0px 0px 1px ${borderColor}`,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그리고 현재 boxShadow에 할당한 스트링에 맨 앞 공백 다 제거해주시면 감사하겠습니다 !

Comment on lines 41 to 56
<article css={containerStyle}>
{label && <Label id={label}>{label}</Label>}
<div css={[inputWarpperStyle, variantStyle(variant), sizeStyle(size)]}>
{LeftIcon && <LeftIcon />}
<input css={[inputStyle]} {...props} />
<div css={inputSupportStyle}>
<div css={[warpperStyle, variantStyle({ variant, isError }), sizeStyle(size)]}>
{LeftIcon && <LeftIcon />}
<input ref={ref} css={inputStyle} {...props} />
</div>
{supportingText && (
<SupportingText isError={isError} isNotice={isNotice}>
{supportingText}
</SupportingText>
)}
</div>
</article>
);
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Label을 현재 inputSupportingStyle을 부여한 div안으로 넣어줄 수 있지 않나요 ? 그렇다면 최상위 컨테이너 요소인 article을 하나 더 적어줄 필요가 없을 것 같습니다.

<article>
  <Label>
  <div css={wrapperStyle}>
  {<LeftIcon />}
  <input />
  </div>
  <SupportingText>
</article>

구조로도 충분히 구현할 수 있을 것 같아요

Copy link
Member

@namdaeun namdaeun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

보운이 넘 고생하셨습니다 !! 코멘트만 해결해주시면 될 것 같아용

}

const Input = ({ variant, size = 'medium', label, LeftIcon, ...props }: InputProps) => {
const Input = ({
variant,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

스타일 적용한 거 보니까 Required로 variant 값을 가져왔던데, 그렇다면 variant 값을 옵셔널로 주는 방향으로 코드를 작성하는 게 맞는 것 같습니다 !

import { theme } from '@/common/style/theme/theme';

export const textStyle = ({ isError, isNotice }: { isError: boolean; isNotice: boolean }) => {
const textColor = isError ? theme.colors.red : isNotice ? theme.colors.blue_900 : theme.colors.gray_400;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

야무지다 !!!

@wuzoo wuzoo merged commit 7bc7c29 into develop Jul 8, 2024
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Input 공통 컴포넌트 Error 처리 + SupportingText
3 participants