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/234 #259

Merged
merged 10 commits into from
May 23, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
}

&.medium {
height: 185px;
height: 140px;
Copy link
Contributor

Choose a reason for hiding this comment

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

이 컴포넌트가 여기서만 쓰이는 게 아닌데 css를 이렇게 수정하면 기존에 사용하고 있던 부분의 스타일도 바뀌잖아요.
그래서 클래스를 하나 만드는 게 더 좋은 방법이라는 생각이 드네요.

Copy link
Member Author

Choose a reason for hiding this comment

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

수정했습니다. fe6156c

}

.txt_brand_name {
Expand Down
20 changes: 20 additions & 0 deletions src/layouts/Home/Thema/ThemaList/index.module.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
@import 'styles/mixins.module';

.area_thema {
padding-top: 120px;

.txt_title {
@include font(35px, 700);

display: block;
padding-bottom: 40px;
text-align: center;
line-height: 51px;
}

.wrapper_item {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 50px 20px;
}
}
35 changes: 35 additions & 0 deletions src/layouts/Home/Thema/ThemaList/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { useQuery } from '@tanstack/react-query';

import ColumnProductItem from 'components/feature/ProductItem/ColumnProductItem';
import Spinner from 'components/ui/Spinner';

import { getThemaItems } from 'services/api/v1/thema';

import styles from './index.module.scss';

type ThemaListProps = { categoryId: number; title: string };

const ThemaList = ({ categoryId, title }: ThemaListProps) => {
const { data: themaItems, isLoading } = useQuery({
queryKey: ['themaItems', categoryId],
queryFn: () => getThemaItems(categoryId),
});

if (isLoading) return <Spinner />;
return (
themaItems && (
<section className={styles.area_thema}>
<strong className={styles.txt_title}>{title}</strong>
<ul className={styles.wrapper_item}>
{themaItems.map((item) => (
<li key={item.productId}>
<ColumnProductItem product={item} size="medium" />
</li>
))}
</ul>
</section>
)
);
};

export default ThemaList;
51 changes: 50 additions & 1 deletion src/layouts/Home/Thema/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,54 @@
import ThemaList from './ThemaList';

const TITLE = [
'전하고픈 마음 가득 담아',
'센스 넘치는 선물',
'이런 선물 어때요 ?',
'남녀노소 모두 좋아하는 선물',
'반짝반짝 빛나는 마음',

'부담 없이 마음을 전해요',
'말없이 응원하고 싶을 때🍀',
'이런 선물도 좋을 것 같아요.',
'귀여운 게 최고야',
'달콤한 진심을 전하는 선물',

'고마운 사람들에게 전해요🎁',
'변치 않는 마음을 전해요',
'지금 안 사면 손해입니다 🚨',
'전하고픈 마음 가득 담아',
'활용도 높은 집들이 선물',

'마음을 전하는 빛나는 선물',
];
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
Member Author

Choose a reason for hiding this comment

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

반영했습니다. 857c48f


const CATEGORY_ID = [
170, 171, 172, 176, 177, 178, 179, 181, 182, 184, 185, 188, 192, 194, 195,
196, 202, 203, 204, 205,
];
Comment on lines +22 to +25
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
Member Author

Choose a reason for hiding this comment

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

ㅠㅠ 개인적으로 프론트에서 카테고리 id를 랜덤으로 선택해서 보내는게 애매하다는 생각이 들지만 아예 다른부분의 api를 가져다 쓰고있기 때문에 어쩔수 없네요..


const getRandomCategoryId = () => {
const categoryIdx = Math.floor(Math.random() * CATEGORY_ID.length);
return CATEGORY_ID[categoryIdx];
};

const getRandomTitle = () => {
const titleIdx = Math.floor(Math.random() * TITLE.length);
return TITLE[titleIdx];
};
Comment on lines +27 to +35
Copy link
Contributor

Choose a reason for hiding this comment

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

utils/generate에 난수 생성하는 함수가 있는데 참고하셔두 좋을 것 같습니다 (굳이 바꿀 필요까지는 없어보이지만요)


const Thema = () => {
return <>이런 선물 어때요?</>;
return (
<>
<ThemaList categoryId={getRandomCategoryId()} title={getRandomTitle()} />
<ThemaList categoryId={getRandomCategoryId()} title={getRandomTitle()} />
<ThemaList categoryId={getRandomCategoryId()} title={getRandomTitle()} />
<ThemaList categoryId={getRandomCategoryId()} title={getRandomTitle()} />
<ThemaList categoryId={getRandomCategoryId()} title={getRandomTitle()} />
<ThemaList categoryId={getRandomCategoryId()} title={getRandomTitle()} />
<ThemaList categoryId={getRandomCategoryId()} title={getRandomTitle()} />
</>
);
};

export default Thema;
3 changes: 3 additions & 0 deletions src/pages/Home/index.module.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.area_home {
padding-bottom: 200px;
}
10 changes: 5 additions & 5 deletions src/pages/Home/index.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import MainWrapper from 'components/ui/MainWrapper';
import MainBrands from 'layouts/Home/MainBrands';
import MainProducts from 'layouts/Home/MainProducts';
import NowTrending from 'layouts/Home/NowTrending';
import Receiver from 'layouts/Home/Receiver';
import Thema from 'layouts/Home/Thema';
// import MainBrands from 'layouts/Home/MainBrands';
// import MainProducts from 'layouts/Home/MainProducts';
// import NowTrending from 'layouts/Home/NowTrending';

import styles from './index.module.scss';

Expand All @@ -13,9 +13,9 @@ const Home = () => {
<Receiver />
<MainWrapper>
<Thema />
<NowTrending />
{/* <NowTrending />
<MainBrands />
<MainProducts />
<MainProducts /> */}
</MainWrapper>
</section>
);
Expand Down
15 changes: 15 additions & 0 deletions src/services/api/v1/thema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import axios from 'axios';

import { ProductItem } from 'types/productItem';

const productApi = axios.create({
baseURL: import.meta.env.VITE_SERVER_URL,
});
Copy link
Contributor

Choose a reason for hiding this comment

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

각 파일마다 axios 인스턴스를 만들어서 사용하고 있는데요.
각 인스턴스가 다 동일한 역할을 하고 있기 때문에, 하나를 만들어놓고 import해서 가져다 쓰는 게 좋을 것 같습니다.

Copy link
Member Author

Choose a reason for hiding this comment

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

수정했습니다. 9f6377c


export const getThemaItems = async (categoryId: number) => {
const themaItem = await productApi.get(
`/products?size=4&categoryId=${categoryId}`,
);

return themaItem.data.content as ProductItem[];
};