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

refactor: 기초 recipe item 컴포넌트 구현 #83

Merged
merged 17 commits into from
Apr 18, 2024
Merged

Conversation

hae-on
Copy link
Contributor

@hae-on hae-on commented Apr 12, 2024

Issue

✨ 구현한 기능

전체 레시피 아이템 컴포넌트를 잘게 나누었습니다.
현재, 이미지와 좋아요 아이콘은 모든 컴포넌트에 공통으로 들어가있기때문에 하나의 컴포넌트로 묶고,
그 안에 따로 children을 받게 해 사용한 상품 관련 컴포넌트를 받습니다.
처음에는 그냥 다 따로 했었는데, 이미지&좋아요 children으로 안 받으면 사용한 상품 컴포넌트가 부모 인식을 바깥으로 해서 안 되더라구요 😇

레시피 정보는 따로 context를 만들어 바로 가져올 수 있도록 했습니다.
아래 링크를 많이 참고했음.
근데 매번 모든 컴포넌트에서 const { recipe } = useRecipeItemValueContext()를 받아와야하는건 좀 거슬림.
더 생각해보도록 하겠음...!
참고한 링크

📢 논의하고 싶은 내용

얘는 TopBar랑 다르게 아예 recipeItem 내부에서 큰 덩어리로 컴포넌트화 하려고 하는데 어때요?
스토리북 보면 알겠지만, 중간에 제가 임의로 인라인 스타일 먹여서 묶어 놓고 그래서 좀 드럽거든요.

그리고 text에 추가 css 주는거

 <Text className={ellipsis} size="caption1" weight="semiBold" color="default">
      {title}
    </Text>

이런식으로 하면 안 되나요?? 제목이랑 내용보면 알겠지만, size랑 weight, color 같은게 아예 안 먹어서요...
className은 참고로 말줄임표에 관한 것들이라 size, weight, color랑 아무 상관이 없습니다...

🎸 기타

이게 디자인을 보면, 작성자 & 작성일자가 컴포넌트별로 색이 다르더라구요?
밑에 내용이 붙냐 아니냐에 따라서 다르게 한 듯?
조건문을 두거나 props로 색을 받을까 하다가, 우리 코드가 너무 더러워질 것 같아서 슬며시 그냥 검정색으로 뒀는데....
조금 더러워지더라도 디자인을 그대로 따르는게 좋나요 아니면 디자이너분께 바꾸는거 문의해볼까요??

마지막으로 여기서 레시피 아이템 컴포넌트 교체까지 다 완료하겠음...!

⏰ 일정

  • 추정 시간 : 2시간
  • 걸린 시간 : 3시간

@hae-on hae-on requested review from xodms0309 and Leejin-Yang April 12, 2024 16:06
@hae-on hae-on self-assigned this Apr 12, 2024
Copy link

🔗 배포된 storybook 주소: https://65f015a4aed45406385006ee-iimzmmdlxp.chromatic.com/

Copy link
Member

@xodms0309 xodms0309 left a comment

Choose a reason for hiding this comment

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

와아아ㅏ아우우우우우 해옹 코드 너무 깔끔하고 좋네요👍 참고한 링크도 봤는데 recipe를 계속 가져와야하는 건 어쩔 수 없는 부분인 것 같기도 해요

그리고 Text 컴포넌트에 className 안먹는건 feat/v2 pull 땡기면 괜찮아질거에요 확인해주세요!

그리고 디자이너분들이랑 충분히 논의해봐도 될 것 같습니다.

const author = 'author' in recipe ? recipe.author : null;
return (
<RecipeItemProvider recipe={recipe}>
<Link to={`${id}`}>{children}</Link>
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
<Link to={`${id}`}>{children}</Link>
<Link to={id}}>{children}</Link>

그냥 이렇게 적어도 될듯!!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

to가 string만 받을 수 있나봐요..!
'number' 형식은 'To' 형식에 할당할 수 없습니다.ts(2322)
요렇게 에러가 뜨네용?!?!

Comment on lines 30 to 33
<div style={{ display: 'flex', gap: '0.3rem' }}>
<RecipeItem.Author />
<RecipeItem.CreatedDate />
</div>
Copy link
Member

Choose a reason for hiding this comment

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

인라인 이런 말하는건가요?! 저는 얘네는 큰 컴포넌트로 묶어도 될 것 같아요!
그리고 Flex, Grid 컴포넌트 만들면 더 깔끔해지겠네요

Copy link
Contributor Author

Choose a reason for hiding this comment

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

좋슴니다 따로 묶어서 구현했습니다!
나중에 화면 작업 끝나면 바로 Flex랑 Grid랑 Heading 같은 애들 만듭시다~~

Copy link
Contributor

Choose a reason for hiding this comment

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

Flex, Grid, Heading 너무 필요..

Copy link

🔗 배포된 storybook 주소: https://65f015a4aed45406385006ee-gdfxxonbey.chromatic.com/

Copy link
Contributor

@Leejin-Yang Leejin-Yang 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 114 to 115
const { recipe } = useRecipeItemValueContext();
const { title } = recipe;
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
const { recipe } = useRecipeItemValueContext();
const { title } = recipe;
const { recipe: { title } } = useRecipeItemValueContext();

너무 반복된다면 이렇게 할 수 있었던거 같은데 잘 기억이 안 나네요 ㅎㅎ

@xodms0309
Copy link
Member

이거 머지되면 제 검색에서 가져다 쓸게용

Copy link

🔗 배포된 storybook 주소: https://65f015a4aed45406385006ee-gyayghcmmj.chromatic.com/

@hae-on
Copy link
Contributor Author

hae-on commented Apr 15, 2024

@xodms0309 @Leejin-Yang

컴포넌트 만든 거 recipeItem에 추가했는데
일단 위치는 맨 밑으로 뒀거든요?
맨 위가 좋은가요 아님 맨 밑이 좋은가요?

그리고 컴포넌트 이름 추천 받습니다...
걍 막 지었는데 어떻게 지어야 할 지 모르겠어요 ㅠ_ㅠ,,,,,

Comment on lines 167 to 192
export const RecipeItemWithProductButton = () => {
return (
<RecipeItem>
<RecipeItem.ImageAndFavoriteButton>
<RecipeItem.ProductButton />
</RecipeItem.ImageAndFavoriteButton>
<div style={{ height: '8px' }} />
<RecipeItem.Title />
<RecipeItem.AuthorAndCreatedDate />
</RecipeItem>
);
};

export const RecipeItemWithProductCircleButton = () => {
return (
<RecipeItem>
<RecipeItem.ImageAndFavoriteButton>
<RecipeItem.ProductCircleButton />
</RecipeItem.ImageAndFavoriteButton>
<div style={{ height: '8px' }} />
<RecipeItem.Title />
<RecipeItem.Author />
<RecipeItem.Content />
</RecipeItem>
);
};
Copy link
Member

@xodms0309 xodms0309 Apr 15, 2024

Choose a reason for hiding this comment

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

ProductButton이 그 상자모양 icon이고 ProductCircleButton이 사용한 상품 이미지 맞죠?? 뭔가 헷갈려서
RecipeItemWithDiskIcon / RecipeItemWithProductDetailImage 이런식으로 짓는�건 어떤가요?! 버튼이라는 기능보다는 어떻게 생겼는지 보이면 쓰는 입장에서 더 좋을 것 같다는 의견 🤔 사실 잘 모르겠음 다른 분들도 의견 부탁.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

맞아여! 전 타미 말대로 바꾸는 거 괜춘한 거 같아요!!
그러면 RecipeItemWithDiskIconAndContent 이건 괜찮나여?
이름이 너무 기나 싶어서 ㅠ 근데 다른 점이 진짜 content 추가밖에 없음.... 😇
그리고 내부 이름(<RecipeItem.ProductCircleButton />)은 그대로 두고?!?!

Copy link
Member

@xodms0309 xodms0309 Apr 17, 2024

Choose a reason for hiding this comment

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

네이밍 진짜 어렵네여 .. 😇 근데 길어지더라도 다 전달되는게 나을 것 같긴 해요
내부도 바꾸면 좋을 것 같긴 해요 제 의견!!
아 근데 저 diskicon이 또 recipeproductbutton으로 컴포넌트화 되어있어서.. 차라리 recipeproductbutton을 넣는게 나으려나.... 해온이 잘 결정해주세요 🤔

Copy link

🔗 배포된 storybook 주소: https://65f015a4aed45406385006ee-evgjcyeckr.chromatic.com/

@hae-on
Copy link
Contributor Author

hae-on commented Apr 17, 2024

@xodms0309 @Leejin-Yang

컴포넌트 교체 했습니다!

스크린샷 2024-04-17 오후 6 25 26

위 이미지에서 체크된 부분만 변경했고,
검색의 경우에는 타미가 진행해주신다구 했구,
마이페이지는 제가 작업할 예정입니다!

진행 중에 문제점이 몇가지 있었는데요.

1. 이미지를 감싸고 있는 div 아래쪽에 보면 공간이 있는데 이 부분이 아래 요소를 밀어냅니다.

스크린샷 2024-04-17 오후 6 26 12

개발자 도구로 보는데, 대체 저 아래 부분이 어디서 나온건지 모르겠네요.
그래서 원래 이미지와 제목 사이의 여백이 8px인데 그냥 눈대중으로 줄여서 4px로 바꿨습니다.
혹시 저거 없애는 방법을 아신다면...
(margin 0, width 100%는 일단 안 됐음)

2. DiskIconButton의 bottom이 어디 기준으로 잡히는지 알 수 없습니다.

bottom이 이미지 하단 기준으로 원래 8px 떨어져야하는데요.
css를 따로 수정하지 않았는데, bottom이 변경되었습니다.
그래서 이것도 눈대중으로 bottom 값을 바꿨습니다....
그리고 원래 z-index도 있었는데, 얘가 하단 네비게이션 바 위에 둥둥 떠다녀서 없애버렸습니다.

3. type 문제

현재 레시피, 레시피 랭킹, 마이페이지 랭킹별로 따로 type을 설정해뒀는데,
이제 recipeItem 컴포넌트 자체 type을 Recipe로 받아버리면서 다른 타입을 받을 수가 없더라구요.
recipeContext에 들어오는 recipe type을

interface RecipeItemValue {
  recipe: Recipe | RecipeRanking | RecipeMember;
  children?: React.ReactNode;
}

뭐 이런식으로 할까 하다가
그냥 간단하게 recipe type을 군데군데 옵셔널로 바꾸고, 모두 recipe type을 받게 수정했습니다.
이 부분에 대해서는 좋은 아이디어가 있다면 말씀 부탁....!!!

Comment on lines +64 to +70
<img
className={recipeImage}
src={image ?? defaultImage}
alt={`조리된 ${title}`}
loading="lazy"
onLoad={() => image && setIsImageLoading(false)}
/>
Copy link
Member

Choose a reason for hiding this comment

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

뭔가 여기에 width, height 정의가 안돼서 div가 크게 잡히는 것 같기도 한데.. 구글링 해보니까 div에 line-height: 0 넣으면 해결된대요

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 +91 to +93
<div className={productButtonWrapper} onClick={(e) => e.preventDefault()}>
<RecipeProductButton isTranslucent products={products} />
</div>
Copy link
Member

Choose a reason for hiding this comment

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

이거 2번째 문제때문에 div로 추가적으로 감싸게 된건가요?!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

얘는 원래 있던 친구인데, 레시피 아이템에서만 위치 조정이 가능하게 하려구 감쌌어용~
요 친구는 다른 곳에서도 사용하니까 거기에서는 영향 안 받게 하려구!
line height 수정하니까 2번 문제도 같이 해결 됐슴니당~~ ><

@xodms0309
Copy link
Member

저는 타입 해온이 한 방식 괜찮은거 같아여~!~!

Copy link
Contributor

@Leejin-Yang Leejin-Yang left a comment

Choose a reason for hiding this comment

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

코멘트 확인해주세요 해온~
대규모 공사를 했네요.! 고생하셨슴다

그리고 원래 z-index도 있었는데, 얘가 하단 네비게이션 바 위에 둥둥 떠다녀서 없애버렸습니다.

제가 테스트하고 못 뺐는데 ㅎㅎ.. 감사함다

  1. DiskIconButton의 bottom이 어디 기준으로 잡히는지 알 수 없습니다.

productCircle은 바텀 수정 없고, productButton만 다르게 잡힌다는건가요?

const { id } = recipe;

return (
<RecipeItemProvider recipe={recipe}>
Copy link
Contributor

Choose a reason for hiding this comment

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

여기서 아래로 내려주니까

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 26 to 28
<RecipeItemProvider recipe={recipe}>
<DefaultRecipeItem />
</RecipeItemProvider>
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
<RecipeItemProvider recipe={recipe}>
<DefaultRecipeItem />
</RecipeItemProvider>
<DefaultRecipeItem recipe={recipe} />

props로 내려주고

Comment on lines 42 to 43
const RecipeItem = ({ children }: PropsWithChildren) => {
const { recipe } = useRecipeItemValueContext();
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
const RecipeItem = ({ children }: PropsWithChildren) => {
const { recipe } = useRecipeItemValueContext();
const RecipeItem = ({ recipe, children }: PropsWithChildren) => {


export default RecipeItem;

export const DefaultRecipeItem = () => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
export const DefaultRecipeItem = () => {
export const DefaultRecipeItem = ({recipe}) => {

이렇게.?

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 +27 to +28
content?: string;
products?: RecipeProduct[];
Copy link
Contributor

Choose a reason for hiding this comment

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

👍

RecipeItem.AuthorAndCreatedDate = AuthorAndCreatedDate;
RecipeItem.Content = Content;

export default RecipeItem;
Copy link
Contributor

Choose a reason for hiding this comment

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

얘는 외부에서 사용하지 않고 아래 친구들만 사용하는거죠?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

얍얍 그렇슴다!

Copy link

🔗 배포된 storybook 주소: https://65f015a4aed45406385006ee-mnrobvyytn.chromatic.com/

@hae-on
Copy link
Contributor Author

hae-on commented Apr 18, 2024

@Leejin-Yang

productCircle은 바텀 수정 없고, productButton만 다르게 잡힌다는건가요?

얘는 마이페이지에만 써서 아직 안 붙어봤는데 아마 바텀 위치 이상하게 잡혔을거에요 !
어쨌든 타미가 말해준 방법으로 해결해서 얘도 같이 고쳐졌을 듯!
이제 진짜 다 수정했습니다! 확인해주시고 이모지만 남겨주시면 바로 머지하고 다음 작업 진행하겠음~~

@hae-on hae-on merged commit bf46a51 into feat/v2 Apr 18, 2024
2 of 3 checks passed
@hae-on hae-on deleted the feat/issue-81 branch April 18, 2024 14:35
@Creative-Lee
Copy link

고생하셨습니다

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.

레시피 컴포넌트 개선
4 participants