generated from pricelees/issue-pr-template
<!-- 제목 양식 --> <!-- [이슈번호] 작업 요약 (예시: [#10] Gitea 템플릿 생성) --> ## 📝 관련 이슈 및 PR **PR과 관련된 이슈 번호** - #22 ## ✨ 작업 내용 <!-- 어떤 작업을 했는지 알려주세요! --> - 기존 Thymeleaf 기반의 프론트엔드 코드를 React + Typescript 기반으로 마이그레이션 - 프론트엔드 분리에 따른 인증 API 수정 및 회원가입 API 추가 ## 🧪 테스트 <!-- 어떤 테스트를 생각했고 진행했는지 알려주세요! --> - 새로 추가된 API, 변경된 API 테스트 반영 ## 📚 참고 자료 및 기타 <!-- 참고한 자료, 또는 논의할 사항이 있다면 알려주세요! --> 프론트엔드 코드는 Gemini CLI가 구현하였고, API 관련 코드(ee21782ef9, frontend/src/api/**) 만 직접 구성 Reviewed-on: #23 Co-authored-by: pricelees <priceelees@gmail.com> Co-committed-by: pricelees <priceelees@gmail.com>
34 lines
1.0 KiB
TypeScript
34 lines
1.0 KiB
TypeScript
import React, { useEffect, useState } from 'react';
|
|
import { mostReservedThemes } from '@_api/theme/themeAPI';
|
|
|
|
const HomePage: React.FC = () => {
|
|
const [ranking, setRanking] = useState<any[]>([]);
|
|
|
|
useEffect(() => {
|
|
const fetchData = async () => {
|
|
await mostReservedThemes(10).then(response => setRanking(response.themes))
|
|
};
|
|
|
|
fetchData().catch(err => console.error('Error fetching ranking:', err));
|
|
}, []);
|
|
|
|
return (
|
|
<div className="content-container">
|
|
<h2 className="content-container-title">인기 테마</h2>
|
|
<ul className="list-unstyled" id="theme-ranking">
|
|
{ranking.map(theme => (
|
|
<li key={theme.id} className="d-flex my-4">
|
|
<img className="me-3 img-thumbnail" src={theme.thumbnail} alt={theme.name} style={{ width: '150px' }} />
|
|
<div className="media-body">
|
|
<h5 className="mt-0 mb-1">{theme.name}</h5>
|
|
{theme.description}
|
|
</div>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default HomePage;
|