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/#11/social login button #20

Merged
merged 20 commits into from
Jul 7, 2024

Conversation

sean2337
Copy link
Collaborator

@sean2337 sean2337 commented Jul 6, 2024

소셜 로그인 버튼 컴포넌트 생성


🏄🏼‍♂️‍ Summary (요약)

  • 소셜 로그인 버튼을 위한 개발을 진행했습니다.

🫨 Describe your Change (변경사항)

  • 버튼 default CSS 추가 (global css에 생성)
  • 소셜 로그인 로고 이미지 Sprite 기법 적용
  • 소셜 로그인 컴포넌트를 위한 type 정의 및 개발
  • SocialLoginButton Props
  1. type : kakao | google => 로그인 버튼의 종류를 입력합니다.
  2. handler : 클릭했을 때, 실행할 함수를 입력합니다.
<SocialLoginButton
    type="kakao"
    handler={() => {
      console.log("kakao Login");
    }}
/> 

🧐 Issue number and link (참고)

📚 Reference (참조)

  • Sprite 기법
    이미지 사용할 때 제가 자주 쓰는 최적화 기법인데, 궁금하신 분들은 아래 참조 보셔서 확인해보시면 좋을 것 같아요!!
    SVG Sprite 기법 적용 사례

@sean2337 sean2337 self-assigned this Jul 6, 2024
@sean2337 sean2337 added the 🚀 feature New feature or request label Jul 6, 2024
@sean2337 sean2337 added this to the v1.0.0 milestone Jul 6, 2024
Comment on lines 1 to 8
export type loginType = {
type: "google" | "kakao";
};

export type loginBtnType = {
type: "google" | "kakao";
handler: () => void;
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

IMO

소셜 로그인 타입은 프로바이더의 추가 또는 삭제 되는 경우와
다른 화면에서 로그인한 경로 확인이 필요한 경우 등
동일한 기준으로 다양한 사용처를 갖고 있다고 생각됩니다

따라서, 소셜로그인의 경로 ( 지원중인 프로바이더 목록 ) 을 enum 또는 상수로 관리하는 것이 좋아 보입니다

Copy link
Collaborator

@donghunee donghunee Jul 6, 2024

Choose a reason for hiding this comment

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

Enum도 좋지만 Union 타입으로 선언하는 것도 좋아보입니다.
Enum의 경우 js객체로 변환되기 때문에 전체적인 코드 사이즈가 증가할 수 있다는 이유로 Union 타입을 선호하는 편입니다.
현재는 객체로 설정 되어 있지만 key 값이 한 개라 수정했습니다.
Type의 명명은 파스칼로 통일하는 것이 좋아보입니다.

 export type SocialLoginType = "google" | "kakao";


// SocialLoginButton.tsx
interface Props {
 type: SocialLoginType,
 handler: () => void;
}

Copy link
Member

Choose a reason for hiding this comment

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

흠 저는 잘 몰라서 그러는데, 혹시 enum 처리한다는 것이 객체를 만든다는 것과 같은 얘기인가요 ?? 저는 객체로 프로바이더들을 정의하면 좋을 것 같다는 생각입니다!
각 프로바이더를 예를 들어 'APPLE': '애플'과 같은 프로퍼티로 객체를 정의하면, 타입도 keyof 연산자를 써면 알아서 유니온 처리해주니까 관리하기 용이할 것 같아요. (용현님이 말씀하신 게 이런 방향이 맞는지는 모르겠지만..)
또 지금은 버튼에 나타낼 텍스트에 삼항연산자를 사용해주셨는데 두개보다 더 많아질 경우에는 사용하기 힘들어질 수 있을 것 같아서요!

Comment on lines 11 to 26
const SocialLoginButton = ({ type, handler }: loginBtnType) => {
return (
<button
css={css`
width: 100%;
height: 4.8rem;
border-radius: 0.8rem;
background-color: ${backgroundColors[type]};
text-align: center;
position: relative;
border: ${type === "google" ? "0.01rem solid rgba(0, 0, 0, 0.08)" : "none"};
`}
onClick={() => {
handler();
}}
>
Copy link
Collaborator

Choose a reason for hiding this comment

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

IMO

후술한 소셜 로그인 경로를 관리할 경우, 각 경로 별 버튼을 정의하여 사용할 수 있을 것 같아요

google: "#FFFFFF",
};

const SocialLoginButton = ({ type, handler }: loginBtnType) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

IMO

반환값 ( 랜더링 되는 컴포넌트 ) 기준 최상위 엘레멘트를 중심으로 props를 전달하는 경우, 해당 DOM요소의 기본 속성값을 갖는 타입을 상속하여 사용가능합니다 .
e.g) ComponentPropsWithoutRef<T = "target DOM Element">, HTMLAttribute<HTMLDomElement>

Copy link
Member

@klmhyeonwoo klmhyeonwoo left a comment

Choose a reason for hiding this comment

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

svg형태의 스프라이트 이미지를 사용하는 방식은 되게 신기하네요 🫨 너무너무 잘 봤습니다!
컴포넌트를 구현하실 때 궁금한 점이 있어요! 지금은 구글이랑 카카오만 구현이 되어있는데, 추후에 앱스토어에 올리게 되었을때도 가정을 하면 자체 로그인이 없는 상태에서 애플 로그인이 들어갈 경우도 생기는데 현재 코드는 카카오와 구글에만 종속되어있는 형태 같아서 이 부분에 대해서는 추후 수정하실 생각이신지 궁금합니다! 나중에 추가된다고 하면 지금보다 수정사항이 조금 더 발생할 수도 있을 것 같아서요!

Copy link
Member

@leeminhee119 leeminhee119 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다 !!

오호 Sprite 쓰는 게 그냥 svg 쓰는 것과 다른가요?? 그냥 항상 svg만 썼었는데 요런 기법 들어보기만 했는데 이번에 저도 사용해보겠습니다! 공유 감사해요 👍

Comment on lines 1 to 8
export type loginType = {
type: "google" | "kakao";
};

export type loginBtnType = {
type: "google" | "kakao";
handler: () => void;
};
Copy link
Member

Choose a reason for hiding this comment

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

흠 저는 잘 몰라서 그러는데, 혹시 enum 처리한다는 것이 객체를 만든다는 것과 같은 얘기인가요 ?? 저는 객체로 프로바이더들을 정의하면 좋을 것 같다는 생각입니다!
각 프로바이더를 예를 들어 'APPLE': '애플'과 같은 프로퍼티로 객체를 정의하면, 타입도 keyof 연산자를 써면 알아서 유니온 처리해주니까 관리하기 용이할 것 같아요. (용현님이 말씀하신 게 이런 방향이 맞는지는 모르겠지만..)
또 지금은 버튼에 나타낼 텍스트에 삼항연산자를 사용해주셨는데 두개보다 더 많아질 경우에는 사용하기 힘들어질 수 있을 것 같아서요!

>
<LoginSpriteSvg type={type} />
</div>
{type === "kakao" ? "카카오로" : "구글"} 로그인
Copy link
Member

Choose a reason for hiding this comment

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

요기! 두개 이상이 되는 경우에 힘들어질 수 있을 것 같아요!

Copy link
Member

@klmhyeonwoo klmhyeonwoo left a comment

Choose a reason for hiding this comment

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

고생하셨습니다 ✨

Comment on lines +23 to +25
onClick={() => {
handler();
}}
Copy link
Member

Choose a reason for hiding this comment

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

기존 onClick 이벤트를 handler로 정의하신 이유가 궁금합니다!

Copy link
Collaborator Author

@sean2337 sean2337 Jul 7, 2024

Choose a reason for hiding this comment

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

로그인 버튼에 onClick으로 로그인 로직을 넣는 것보단 handler라는 이름에 대입 하는게 직관적이라고 생각해서 위와 같이 정의하게 되었습니다!!

@sean2337 sean2337 merged commit e7ca080 into depromeet:develop Jul 7, 2024
1 check passed
@sean2337 sean2337 deleted the feat/#11/socialLoginButton branch July 7, 2024 23:47
@klmhyeonwoo klmhyeonwoo mentioned this pull request Jul 8, 2024
14 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🚀 feature New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants