Skip to content

Commit 113d4ca

Browse files
authored
Merge pull request #95 from oodd-team/dev
디자인 수정 및 v1.0 배포
2 parents 2a18e24 + 056002c commit 113d4ca

442 files changed

Lines changed: 8382 additions & 9140 deletions

File tree

Some content is hidden

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

.github/workflows/dev_cicd.yml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: CI/CD for Development
2+
3+
on:
4+
push:
5+
branches:
6+
- dev
7+
pull_request:
8+
branches:
9+
- dev
10+
11+
jobs:
12+
cicd:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- uses: actions/checkout@v3
16+
- uses: actions/setup-node@v3
17+
with:
18+
node-version: 20.10.0
19+
cache: yarn
20+
- run: yarn install
21+
22+
- name: Create .env file
23+
run: |
24+
echo "VITE_NEW_API_URL=${{ secrets.VITE_DEV_API_URL }}" > .env
25+
echo "VITE_DOMAIN=${{ secrets.VITE_DEV_DOMAIN }}" >> .env
26+
echo "VITE_FIREBASE_API_KEY=${{ secrets.VITE_FIREBASE_API_KEY }}" >> .env
27+
echo "VITE_FIREBASE_AUTH_DOMAIN=${{ secrets.VITE_FIREBASE_AUTH_DOMAIN }}" >> .env
28+
echo "VITE_FIREBASE_PROJECT_ID=${{ secrets.VITE_FIREBASE_PROJECT_ID }}" >> .env
29+
echo "VITE_FIREBASE_STORAGE_BUCKET=${{ secrets.VITE_FIREBASE_STORAGE_BUCKET }}" >> .env
30+
echo "VITE_FIREBASE_MESSAGIN_ID=${{ secrets.VITE_FIREBASE_MESSAGIN_ID }}" >> .env
31+
echo "VITE_FIREBASE_APP_ID=${{ secrets.VITE_FIREBASE_APP_ID }}" >> .env
32+
echo "VITE_FIREBASE_MEASURENMENT_ID=${{ secrets.VITE_FIREBASE_MEASURENMENT_ID }}" >> .env
33+
echo "VITE_KAKAO_REST_API_KEY=${{ secrets.VITE_KAKAO_REST_API_KEY }}" >> .env
34+
echo "VITE_NAVER_CLIENT_ID=${{ secrets.VITE_NAVER_CLIENT_ID }}" >> .env
35+
echo "VITE_NAVER_CLIENT_SECRET=${{ secrets.VITE_NAVER_CLIENT_SECRET }}" >> .env
36+
echo "VITE_GOOGLE_CLIENT_ID=${{ secrets.VITE_GOOGLE_CLIENT_ID }}" >> .env
37+
echo "VITE_GOOGLE_CLIENT_SECRET=${{ secrets.VITE_GOOGLE_CLIENT_SECRET }}" >> .env
38+
39+
- run: yarn build-dev
40+
41+
- name: deploy to s3
42+
if: github.event_name == 'push'
43+
uses: jakejarvis/s3-sync-action@master
44+
with:
45+
args: --delete
46+
env:
47+
AWS_S3_BUCKET: ${{ secrets.DEV_AWS_S3_BUCKET }}
48+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
49+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
50+
AWS_REGION: ${{ secrets.AWS_REGION }}
51+
SOURCE_DIR: ${{ secrets.DEV_SOURCE_DIR }}

.github/workflows/prod_cicd.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
name: CI/CD for Production
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
jobs:
9+
cicd:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v3
13+
- uses: actions/setup-node@v3
14+
with:
15+
node-version: 20.10.0
16+
cache: yarn
17+
- run: yarn install
18+
19+
- name: Create .env file
20+
run: |
21+
echo "VITE_NEW_API_URL=${{ secrets.VITE_PROD_API_URL }}" > .env
22+
echo "VITE_DOMAIN=${{ secrets.VITE_PROD_DOMAIN }}" >> .env
23+
echo "VITE_FIREBASE_API_KEY=${{ secrets.VITE_FIREBASE_API_KEY }}" >> .env
24+
echo "VITE_FIREBASE_AUTH_DOMAIN=${{ secrets.VITE_FIREBASE_AUTH_DOMAIN }}" >> .env
25+
echo "VITE_FIREBASE_PROJECT_ID=${{ secrets.VITE_FIREBASE_PROJECT_ID }}" >> .env
26+
echo "VITE_FIREBASE_STORAGE_BUCKET=${{ secrets.VITE_FIREBASE_STORAGE_BUCKET }}" >> .env
27+
echo "VITE_FIREBASE_MESSAGIN_ID=${{ secrets.VITE_FIREBASE_MESSAGIN_ID }}" >> .env
28+
echo "VITE_FIREBASE_APP_ID=${{ secrets.VITE_FIREBASE_APP_ID }}" >> .env
29+
echo "VITE_FIREBASE_MEASURENMENT_ID=${{ secrets.VITE_FIREBASE_MEASURENMENT_ID }}" >> .env
30+
echo "VITE_KAKAO_REST_API_KEY=${{ secrets.VITE_KAKAO_REST_API_KEY }}" >> .env
31+
echo "VITE_NAVER_CLIENT_ID=${{ secrets.VITE_NAVER_CLIENT_ID }}" >> .env
32+
echo "VITE_NAVER_CLIENT_SECRET=${{ secrets.VITE_NAVER_CLIENT_SECRET }}" >> .env
33+
echo "VITE_GOOGLE_CLIENT_ID=${{ secrets.VITE_GOOGLE_CLIENT_ID }}" >> .env
34+
echo "VITE_GOOGLE_CLIENT_SECRET=${{ secrets.VITE_GOOGLE_CLIENT_SECRET }}" >> .env
35+
36+
- run: yarn build
37+
38+
- name: deploy to s3
39+
if: github.event_name == 'push'
40+
uses: jakejarvis/s3-sync-action@master
41+
with:
42+
args: --delete
43+
env:
44+
AWS_S3_BUCKET: ${{ secrets.PROD_AWS_S3_BUCKET }}
45+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
46+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
47+
AWS_REGION: ${{ secrets.AWS_REGION }}
48+
SOURCE_DIR: ${{ secrets.PROD_SOURCE_DIR }}

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,21 @@
1919
"dayjs": "^1.11.12",
2020
"express": "^4.19.2",
2121
"firebase": "^10.13.0",
22+
"heic2any": "^0.0.4",
2223
"js-cookie": "^3.0.5",
2324
"react": "^18.3.1",
2425
"react-dom": "^18.3.1",
26+
"react-error-overlay": "6.0.9",
27+
"react-responsive": "^10.0.0",
2528
"react-router-dom": "^6.24.1",
29+
"react-scripts": "4.0.3",
2630
"recoil": "^0.7.7",
2731
"recoil-persist": "^5.1.0",
2832
"request": "^2.88.2",
2933
"socket.io-client": "^4.7.5",
3034
"styled-components": "^6.1.11",
3135
"styled-reset": "^4.5.2",
32-
"swiper": "^11.1.8",
33-
"react-scripts": "4.0.3",
34-
"react-error-overlay": "6.0.9"
36+
"swiper": "^11.1.8"
3537
},
3638
"devDependencies": {
3739
"@types/express": "^4.17.21",

public/ProfileImg.svg

Lines changed: 0 additions & 10 deletions
This file was deleted.

public/Send.svg

Lines changed: 0 additions & 4 deletions
This file was deleted.

public/vite.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/App.tsx

Lines changed: 69 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,86 @@
11
import React from 'react';
2-
import { BrowserRouter, Route, Routes } from 'react-router-dom';
2+
import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom';
33
import Home from './pages/Home';
4-
import MyPage from './pages/Mypage';
5-
import MyPost from './pages/MyPost';
4+
import Login from './pages/Login';
5+
import SignUp from './pages/SignUp';
6+
import LoginComplete from './pages/Login/components/LoginComplete';
7+
import TermsAgreement from './pages/TermsAgreement';
8+
9+
import MyPage from './pages/MyPage';
610
import ProfileEdit from './pages/ProfileEdit';
711
import AccountSetting from './pages/AccountSetting';
812
import AccountEdit from './pages/AccountEdit';
913
import AccountCancel from './pages/AccountCancel';
1014
import Verification from './pages/verification';
11-
import Login from './pages/Login';
12-
import SignUp from './pages/SignUp';
15+
1316
import ProfileViewer from './pages/ProfileViewer';
17+
18+
import Post from './pages/Post';
19+
import MyPost from './pages/MyPost';
20+
import PostUpload from './pages/PostUpload';
21+
import PostImageSelect from './pages/PostImageSelect';
22+
import PostInstaConnect from './pages/PostInstaConnect';
23+
import PostInstaFeedSelect from './pages/PostInstaFeedSelect';
24+
1425
import Chats from './pages/Chats';
1526
import ChatRoom from './pages/Chats/ChatRoom';
16-
import Upload from './pages/Upload';
17-
import Post from './pages/Post';
18-
import KakaoCallback from './pages/Login/components/Kakao/KakaoCallback';
19-
import NaverCallback from './pages/Login/components/Naver/NaverCallback';
20-
import GoogleCallback from './pages/Login/components/Google/GoogleCallback';
27+
28+
import NotFound from './pages/NotFound';
29+
30+
const ProtectedRoute = ({ children }: { children: JSX.Element }) => {
31+
const isAuthenticated = Boolean(localStorage.getItem('new_jwt_token'));
32+
return isAuthenticated ? children : <Navigate to="/login" />;
33+
};
34+
35+
// 인증이 필요한 페이지 배열
36+
const protectedRoutes = [
37+
{ path: '/', element: <Home /> },
38+
39+
// 사용자 프로필 및 계정 관리
40+
{ path: '/mypage', element: <MyPage /> },
41+
{ path: '/profile/edit', element: <ProfileEdit /> },
42+
{ path: '/account-setting', element: <AccountSetting /> },
43+
{ path: '/account-edit', element: <AccountEdit /> },
44+
{ path: '/account-cancel', element: <AccountCancel /> },
45+
{ path: '/verification', element: <Verification /> },
46+
{ path: '/users/:userId', element: <ProfileViewer /> },
47+
48+
{ path: '/post/:postId', element: <Post /> },
49+
{ path: '/my-post/:postId', element: <MyPost /> },
50+
{ path: '/upload', element: <PostUpload /> },
51+
{ path: '/image-select', element: <PostImageSelect /> },
52+
{ path: '/insta-connect', element: <PostInstaConnect /> },
53+
{ path: '/insta-feed-select', element: <PostInstaFeedSelect /> },
54+
55+
// 메시지/채팅
56+
{ path: '/chats', element: <Chats /> },
57+
{ path: '/chats/:chatRoomId', element: <ChatRoom /> },
58+
];
59+
60+
// 인증이 필요 없는 페이지 배열
61+
const publicRoutes = [
62+
{ path: '/login', element: <Login /> },
63+
{ path: '/signup', element: <SignUp /> },
64+
{ path: '/login/complete', element: <LoginComplete /> },
65+
{ path: '/terms-agreement', element: <TermsAgreement /> },
66+
];
67+
2168
const App: React.FC = () => {
2269
return (
2370
<BrowserRouter>
2471
<Routes>
25-
<Route path="/" element={<Home />} />
26-
<Route path="/chats/:roomId" element={<ChatRoom />} />
27-
<Route path="/mypage" element={<MyPage />} />
28-
<Route path="/my-post/:postId" element={<MyPost />} />
29-
<Route path="/profile/edit" element={<ProfileEdit />} />
30-
<Route path="/account-setting" element={<AccountSetting />} />
31-
32-
<Route path="/account-edit" element={<AccountEdit />} />
33-
<Route path="/account-cancel" element={<AccountCancel />} />
34-
<Route path="/Verification" element={<Verification />} />
35-
<Route path="/login" element={<Login />} />
36-
<Route path="/chats" element={<Chats />} />
37-
<Route path="/upload" element={<Upload />} />
38-
<Route path="/post/:postId" element={<Post />} />
39-
<Route path="/users/:userId" element={<ProfileViewer />} />
40-
<Route path="signup" element={<SignUp />} />
41-
42-
<Route path="/auth/kakao/callback" element={<KakaoCallback />}></Route>
43-
<Route path="/auth/naver/callback" element={<NaverCallback />}></Route>
44-
<Route path="/auth/google/callback" element={<GoogleCallback />}></Route>
72+
{/* 인증이 필요한 페이지 */}
73+
{protectedRoutes.map(({ path, element }) => (
74+
<Route key={path} path={path} element={<ProtectedRoute>{element}</ProtectedRoute>} />
75+
))}
76+
77+
{/* 인증이 필요 없는 페이지 */}
78+
{publicRoutes.map(({ path, element }) => (
79+
<Route key={path} path={path} element={element} />
80+
))}
81+
82+
{/* 없는 페이지에 대한 처리 */}
83+
<Route path="*" element={<NotFound />} />
4584
</Routes>
4685
</BrowserRouter>
4786
);

src/apis/auth/dto.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { BaseSuccessResponse } from '../core/dto';
2+
3+
// jwt를 이용한 사용자 정보 조회 응답
4+
export type getUserInfoByJwtResponse = BaseSuccessResponse<getUserInfoByJwtData>;
5+
// jwt를 이용한 사용자 정보 조회 응답 데이터
6+
export interface getUserInfoByJwtData {
7+
userId: number;
8+
name: string;
9+
phoneNumber: string;
10+
email: string;
11+
nickname: string;
12+
profilePictureUrl: string;
13+
bio: string;
14+
}

src/apis/auth/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { getUserInfoByJwtResponse } from './dto';
2+
import { newRequest } from '../core';
3+
4+
// jwt로 사용자 정보 조회 api /auth/me
5+
export const getUserInfoByJwtApi = () => newRequest.get<getUserInfoByJwtResponse>('/auth/me');

src/apis/chat-room/dto.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)