Skip to content

Commit f2dbff3

Browse files
committed
add: trendStore.ts with Axios and zustand, TrendList component, TrendItem component, CategorySlider component, and RankingPage.tsx page
1 parent eb25c57 commit f2dbff3

File tree

10 files changed

+270
-10
lines changed

10 files changed

+270
-10
lines changed

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@
1010
"preview": "vite preview",
1111
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md}\"",
1212
"start": "vite"
13-
1413
},
1514
"dependencies": {
1615
"autoprefixer": "^10.4.19",
16+
"axios": "^1.7.2",
1717
"postcss": "^8.4.39",
1818
"react": "^18.3.1",
1919
"react-dom": "^18.3.1",
2020
"react-router-dom": "^6.24.0",
21-
"tailwindcss": "^3.4.4"
21+
"tailwindcss": "^3.4.4",
22+
"zustand": "^4.5.4"
2223
},
2324
"devDependencies": {
2425
"@types/react": "^18.3.3",

pnpm-lock.yaml

+107
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ import Login from './pages/LoginPage/LoginPage';
88
import Profile from './pages/ProfilePage/ProfilePage';
99
import ParticipatedDebates from './pages/MyPage/ParticipatedDebate';
1010
import Debate from './pages/MyPage/Debate';
11+
import RankingPage from './pages/RankingPage/RankingPage';
1112

1213
ReactDOM.createRoot(document.getElementById('root')!).render(
1314
<React.StrictMode>
1415
<BrowserRouter>
16+
<RankingPage/>
1517
<Profile/>
1618
<Login/>
1719
<Debate/>

src/pages/RankingPage/.gitkeep

Whitespace-only changes.

src/pages/RankingPage/RankingPage.tsx

+57-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,60 @@
1-
const RangkingPage=()=>{
2-
return (
3-
<div className="flex items-center justify-center min-h-screen bg-gray-100">
4-
<h2 className="text-4xl font-bold text-blue-600">Ranking test1</h2>
5-
</div>
6-
);
7-
}
1+
import React, { useEffect } from 'react';
2+
import CategorySlider from './components/CategorySlider';
3+
import TrendList from './components/TrendList';
4+
import { useTrendStore } from '../../store/trendStore';
85

9-
export default RangkingPage;
6+
const RankingPage: React.FC = () => {
7+
const { menuType, setMenuType, date, setDate, fetchTrends } = useTrendStore();
108

9+
useEffect(() => {
10+
fetchTrends();
11+
}, [menuType, date]);
1112

13+
const handleDateChange = (direction: 'prev' | 'next') => {
14+
const currentDate = new Date(date);
15+
if (menuType === 'daily') {
16+
currentDate.setDate(currentDate.getDate() + (direction === 'prev' ? -1 : 1));
17+
} else if (menuType === 'weekly') {
18+
currentDate.setDate(currentDate.getDate() + (direction === 'prev' ? -7 : 7));
19+
}
20+
setDate(currentDate.toISOString().split('T')[0]);
21+
};
22+
23+
return (
24+
<div>
25+
<header className="p-4 bg-gray-100 flex justify-between">
26+
<button
27+
className={`px-4 py-2 ${menuType === 'realTime' ? 'bg-blue-500 text-white' : 'bg-white text-blue-500'} rounded`}
28+
onClick={() => setMenuType('realTime')}
29+
>
30+
실시간
31+
</button>
32+
<button
33+
className={`px-4 py-2 ${menuType === 'daily' ? 'bg-blue-500 text-white' : 'bg-white text-blue-500'} rounded`}
34+
onClick={() => setMenuType('daily')}
35+
>
36+
일간
37+
</button>
38+
<button
39+
className={`px-4 py-2 ${menuType === 'weekly' ? 'bg-blue-500 text-white' : 'bg-white text-blue-500'} rounded`}
40+
onClick={() => setMenuType('weekly')}
41+
>
42+
주간
43+
</button>
44+
</header>
45+
{menuType !== 'realTime' && (
46+
<div className="flex justify-between items-center my-4">
47+
<button onClick={() => handleDateChange('prev')}>&lt;</button>
48+
<span>{menuType === 'daily' ? date : `2024.${date}`}</span>
49+
<button onClick={() => handleDateChange('next')}>&gt;</button>
50+
</div>
51+
)}
52+
<main className="container mx-auto p-4">
53+
<CategorySlider />
54+
<TrendList />
55+
</main>
56+
</div>
57+
);
58+
};
59+
60+
export default RankingPage;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import React, { useState } from 'react';
2+
3+
const categories = ['통합', '나무위키', '트위터', '다음카페', '커뮤니티'];
4+
5+
const CategorySlider: React.FC = () => {
6+
const [activeIndex, setActiveIndex] = useState(0);
7+
8+
return (
9+
<div className="flex overflow-x-auto whitespace-nowrap bg-gray-100 p-4 mt-6">
10+
{categories.map((category, index) => (
11+
<div
12+
key={index}
13+
className={`px-4 py-2 rounded-full cursor-pointer text-sm border ${index === activeIndex ? 'bg-red-500 text-white border-red-500' : 'bg-white text-gray-800 border-gray-300'} transition-all duration-300 mx-2`}
14+
onClick={() => setActiveIndex(index)}
15+
>
16+
{category}
17+
</div>
18+
))}
19+
</div>
20+
);
21+
};
22+
23+
export default CategorySlider;

0 commit comments

Comments
 (0)