Skip to content

Commit f7521b2

Browse files
authored
Merge pull request #339 from Nexters/feature/profile
Feature/profile
2 parents 25e4984 + b36c625 commit f7521b2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2121
-1
lines changed

.pnp.cjs

Lines changed: 80 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/profile/.gitignore

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
pnpm-debug.log*
8+
lerna-debug.log*
9+
10+
node_modules
11+
dist
12+
dist-ssr
13+
*.local
14+
15+
# Editor directories and files
16+
.vscode/*
17+
!.vscode/extensions.json
18+
.idea
19+
.DS_Store
20+
*.suo
21+
*.ntvs*
22+
*.njsproj
23+
*.sln
24+
*.sw?

apps/profile/README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Profile - 불티 프로필 페이지
2+
3+
사용자 프로필을 보여주는 웹 애플리케이션입니다.
4+
5+
## URL 구조
6+
7+
- 프로필 페이지: `https://profile.boolti.in/{username}`
8+
- 개발 서버: `https://profile.dev.boolti.in:8082/{username}`
9+
10+
## 개발 서버 실행
11+
12+
```bash
13+
# 루트 디렉토리에서
14+
yarn workspace profile dev
15+
16+
# 또는 turbo 사용
17+
turbo dev --filter=profile
18+
```
19+
20+
## 빌드
21+
22+
```bash
23+
# 루트 디렉토리에서
24+
yarn workspace profile build
25+
26+
# 또는 turbo 사용
27+
turbo build --filter=profile
28+
```
29+
30+
## 기술 스택
31+
32+
- React 18
33+
- TypeScript
34+
- Vite
35+
- Emotion (CSS-in-JS)
36+
- React Router v6
37+
- React Helmet Async
38+
39+
## 사용하는 공통 패키지
40+
41+
- `@boolti/ui`: 공통 UI 컴포넌트
42+
- `@boolti/api`: API 호출 로직
43+
- `@boolti/icon`: 아이콘 컴포넌트
44+
45+
## 디렉토리 구조
46+
47+
```
48+
src/
49+
├── components/ # 재사용 가능한 컴포넌트
50+
├── pages/ # 페이지 컴포넌트
51+
├── App.tsx # 라우팅 설정
52+
├── main.tsx # 앱 진입점
53+
└── index.css # 전역 스타일
54+
```

apps/profile/index.html

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<!doctype html>
2+
<html lang="ko">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7+
8+
<!-- SEO -->
9+
<meta name="description" content="불티 프로필 페이지" />
10+
<meta property="og:type" content="website" />
11+
<meta property="og:site_name" content="불티" />
12+
<meta property="og:title" content="불티 프로필" />
13+
<meta property="og:description" content="불티 프로필 페이지" />
14+
<meta property="og:image" content="https://profile.boolti.in/og-image.png" />
15+
16+
<!-- Twitter Card -->
17+
<meta name="twitter:card" content="summary_large_image" />
18+
<meta name="twitter:title" content="불티 프로필" />
19+
<meta name="twitter:description" content="불티 프로필 페이지" />
20+
<meta name="twitter:image" content="https://profile.boolti.in/og-image.png" />
21+
22+
<title>불티 프로필</title>
23+
</head>
24+
<body>
25+
<div id="root"></div>
26+
<script type="module" src="/src/main.tsx"></script>
27+
</body>
28+
</html>

apps/profile/package.json

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"name": "profile",
3+
"private": true,
4+
"version": "0.0.0",
5+
"type": "module",
6+
"scripts": {
7+
"dev": "vite",
8+
"build": "tsc && vite build",
9+
"lint": "TIMING=1 eslint . --ext ts,tsx",
10+
"lint:fix": "TIMING=1 eslint . --ext ts,tsx --fix",
11+
"type-check": "tsc --noEmit",
12+
"preview": "vite preview"
13+
},
14+
"dependencies": {
15+
"@babel/runtime": "^7.28.4",
16+
"@boolti/api": "*",
17+
"@boolti/icon": "*",
18+
"@boolti/ui": "*",
19+
"@emotion/react": "^11.11.3",
20+
"@emotion/styled": "^11.11.0",
21+
"@tanstack/react-query": "^5.90.5",
22+
"date-fns": "^3.6.0",
23+
"react": "^18.2.0",
24+
"react-dom": "^18.2.0",
25+
"react-helmet-async": "^2.0.5",
26+
"react-router-dom": "^6.22.3",
27+
"swiper": "^12.0.3",
28+
"the-new-css-reset": "^1.11.2"
29+
},
30+
"devDependencies": {
31+
"@boolti/eslint-config": "*",
32+
"@boolti/typescript-config": "*",
33+
"@emotion/babel-plugin": "^11.11.0",
34+
"@types/react": "^18.2.43",
35+
"@types/react-dom": "^18.2.17",
36+
"@vitejs/plugin-react": "^4.2.1",
37+
"typescript": "^5.2.2",
38+
"vite": "^5.0.8"
39+
}
40+
}

apps/profile/public/favicon.svg

Lines changed: 4 additions & 0 deletions
Loading

apps/profile/src/App.tsx

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import './index.css';
2+
import 'the-new-css-reset/css/reset.css';
3+
import 'swiper/css';
4+
5+
import { BooltiUIProvider } from '@boolti/ui';
6+
import { QueryClientProvider } from '@boolti/api';
7+
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
8+
import { HelmetProvider } from 'react-helmet-async';
9+
10+
import ProfilePage from './pages/ProfilePage';
11+
import NotFound from './components/NotFound';
12+
import { ProfilePastShowsPage } from './pages/ProfilePastShowsPage';
13+
import { ProfileVideosPage } from './pages/ProfileVideosPage';
14+
import { ProfileLinkPage } from './pages/ProfileLinkPage';
15+
import { Suspense } from 'react';
16+
17+
const router = createBrowserRouter([
18+
{
19+
path: '/:userCode',
20+
element: <ProfilePage />,
21+
errorElement: <NotFound />,
22+
},
23+
{
24+
path: '/:userCode/shows',
25+
element: <ProfilePastShowsPage />,
26+
},
27+
{
28+
path: '/:userCode/videos',
29+
element: <ProfileVideosPage />,
30+
},
31+
{
32+
path: '/:userCode/links',
33+
element: <ProfileLinkPage />,
34+
},
35+
{
36+
path: '/',
37+
element: <NotFound />,
38+
},
39+
]);
40+
41+
const App = () => {
42+
return (
43+
<QueryClientProvider>
44+
<BooltiUIProvider>
45+
<HelmetProvider>
46+
<Suspense fallback={null}>
47+
<RouterProvider router={router} />
48+
</Suspense>
49+
</HelmetProvider>
50+
</BooltiUIProvider>
51+
</QueryClientProvider>
52+
);
53+
};
54+
55+
export default App;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { mq_lg } from '@boolti/ui';
2+
import styled from '@emotion/styled';
3+
4+
const Header = styled.div<{ hasTitle: boolean }>`
5+
height: 68px;
6+
display: flex;
7+
align-items: center;
8+
padding: 0 20px;
9+
color: ${({ theme }) => theme.palette.grey.g10};
10+
justify-content: ${({ hasTitle }) => (hasTitle ? 'space-between' : 'flex-end')};
11+
12+
${mq_lg} {
13+
padding: 0;
14+
}
15+
`;
16+
17+
const Left = styled.div`
18+
display: flex;
19+
align-items: center;
20+
`;
21+
22+
const BackButton = styled.button`
23+
cursor: pointer;
24+
`;
25+
26+
const HeaderTitle = styled.p`
27+
${({ theme }) => theme.typo.sh2};
28+
color: ${({ theme }) => theme.palette.grey.g10};
29+
margin-left: 12px;
30+
`;
31+
32+
export default {
33+
Header,
34+
Left,
35+
BackButton,
36+
HeaderTitle,
37+
};

0 commit comments

Comments
 (0)