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

기본 기능 구현 완료 dev 브랜치 머지 #1

Merged
merged 22 commits into from
Oct 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
6d7ded7
feat: 대시보드 Navbar 및 초기 화면 구현
YerangPark Sep 11, 2024
35da9a3
feat: 로그인 인증 수단으로 JWT 토큰 구현
YerangPark Sep 20, 2024
3d30afd
feat: 라우팅 네비게이션으로 수정
YerangPark Sep 24, 2024
05288aa
feat: 포트폴리오 제거 모달 및 내보내기 알림창 구현
YerangPark Sep 25, 2024
c747ddb
feat: 포트폴리오 생성 페이지 인풋 구현
YerangPark Sep 26, 2024
0d5a5a7
feat: 대시보드에 포트폴리오 만들기 버튼 추가 및 클립보드 카피 기능 구현
YerangPark Sep 26, 2024
e334985
feat: 포트폴리오 생성 페이지 기술 스택란 구현
YerangPark Sep 26, 2024
03e5d31
feat: 포트폴리오 생성페이지 설명 박스 추가
YerangPark Sep 27, 2024
028b6d5
feat: 사용자 정보 수정 페이지 구현 및 컴포넌트화
YerangPark Sep 27, 2024
896ab5d
feat: ESLint 수정
YerangPark Sep 28, 2024
508e36e
feat: ESLint 수정2
YerangPark Sep 29, 2024
3828bed
feat: 토큰 인증 처리 추가
YerangPark Sep 29, 2024
993028f
feat: 계정 수정 페이지 확장자 변경
YerangPark Sep 29, 2024
6dede86
feat: 포트폴리오 미리보기 페이지 추가
YerangPark Sep 29, 2024
b8d785b
feat: 포트폴리오 수정 및 생성 페이지 추가
YerangPark Sep 30, 2024
122ef23
feat: 포트폴리오 생성 페이지 컴포넌트 구현
YerangPark Oct 1, 2024
afc8bea
feat: 포트폴리오 수정 페이지 구현
YerangPark Oct 1, 2024
62bb196
feat: 포트폴리오 미리보기 페이지 구현
YerangPark Oct 2, 2024
af483f6
fix: ESLint 관련 오류 수정
YerangPark Oct 8, 2024
e6a65e1
Merge branch 'main' into dev
YerangPark Oct 8, 2024
0287124
fix: ESLint 관련 문제 해결
YerangPark Oct 8, 2024
ce3928c
fix: ESLint 관련 문제 해결2
YerangPark Oct 8, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 37 additions & 20 deletions .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,37 +6,54 @@
"project": "./tsconfig.json",
"createDefaultProgram": true
},
"env": { // 전역객체를 eslint가 인식하는 구간
"browser": true, // document나 window 인식되게 함
"env": {
"browser": true,
"node": true,
"es6": true
},
"ignorePatterns": ["node_modules/"], // eslint 미적용될 폴더나 파일 명시
"ignorePatterns": ["node_modules/"],
"extends": [
"airbnb",
"airbnb-typescript",
"airbnb/hooks",
"next/core-web-vitals",
"plugin:@typescript-eslint/recommended", // ts 권장
"plugin:prettier/recommended", // eslint의 포매팅을 prettier로 사용.
"prettier" // eslint-config-prettier prettier와 중복된 eslint 규칙 제거
"plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended",
"prettier"
],
"rules": {
"react/react-in-jsx-scope": "off", // react 17부턴 import 안해도돼서 기능 끔
// 경고표시, 파일 확장자를 .ts나 .tsx 모두 허용함
"react/react-in-jsx-scope": "off",
"react/jsx-filename-extension": ["warn", { "extensions": [".ts", ".tsx"] }],
"no-useless-catch": "off", // 불필요한 catch 못쓰게 하는 기능 끔
"react/function-component-definition":[
"no-useless-catch": "off",
"react/function-component-definition": [
2,
{ "namedComponents": [
"arrow-function",
"function-declaration"
] }
{ "namedComponents": ["arrow-function", "function-declaration"] }
],
"react/require-default-props": "off",
"max-len": ["error", { "code": 120 }], // 최대 줄 길이를 120자로 설정
"jsx-a11y/label-has-associated-control": [ 2, { // 라벨이 입력폼과 연결이 되어있는지에 대한 옵션. 심각도 2(에러)로 설정.
"some": [ "nesting", "id" ] // 감싸거나 아이디를 연결해주면 되도록 설정.
}],
}
}
"max-len": ["error", { "code": 120 }],
"jsx-a11y/label-has-associated-control": [
2,
{
"some": ["nesting", "id"]
}
],
"no-param-reassign": [
"error",
{
"props": true,
"ignorePropertyModificationsFor": ["state"]
}
],
"react/jsx-props-no-spreading": "off",
"@typescript-eslint/no-explicit-any": "off"
},
"overrides": [
{
"files": ["*.js"],
"rules": {
"@typescript-eslint/no-var-requires": "off",
"@typescript-eslint/explicit-function-return-type": "off"
}
}
]
}
4 changes: 3 additions & 1 deletion .github/workflows/docker-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,6 @@ jobs:
docker stop frontend-container || true
docker rm frontend-container || true

docker run -d --name frontend-container -p 3000:3000 ${{ secrets.DOCKERHUB_USERNAME }}/folio-frontend:latest
docker run -d --name frontend-container \
-p 3000:3000 ${{ secrets.DOCKERHUB_USERNAME }}/folio-frontend:latest \
-e NEXT_PUBLIC_API_BASE_URL=http://yrpark.duckdns.org:8080
116 changes: 111 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@
},
"dependencies": {
"@chakra-ui/react": "^2.8.2",
"@reduxjs/toolkit": "^2.2.7",
"date-fns": "^4.1.0",
"framer-motion": "^11.9.0",
"next": "14.2.5",
"react": "^18",
"react-dom": "^18",
"react-icons": "^5.3.0"
"react-icons": "^5.3.0",
"react-redux": "^9.1.2"
},
"devDependencies": {
"@types/node": "^20",
Expand Down
5 changes: 5 additions & 0 deletions src/app/account/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import AccountPage from '@/components/templates/AccountPage'

export default function Page() {
return <AccountPage />
}
44 changes: 40 additions & 4 deletions src/app/client-layout.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,44 @@
"use client";
'use client'

import { ChakraProvider } from '@chakra-ui/react';
import theme from '../theme';
import { ChakraProvider } from '@chakra-ui/react'
import { useEffect, useRef } from 'react'
import { Provider, useDispatch } from 'react-redux'
import { fetchSkills } from '@/features/skill/skillSlice'
import store, { AppDispatch } from '@/store'
import isTokenExpired from '@/utils/TokenExpiredChecker'
import { useRouter } from 'next/navigation'
import theme from '../theme'

function ClientComponentWrapper({ children }: { children: React.ReactNode }) {
const dispatch: AppDispatch = useDispatch()
const didFetchRef = useRef(false) // NOTE: 재랜더링해도 값이 저장되는 useRef를 이용해서 최초 1번 실행

useEffect(() => {
if (!didFetchRef.current) {
dispatch(fetchSkills())
didFetchRef.current = true
}
}, [dispatch])

return children
}

export default function ClientLayout({ children }: { children: React.ReactNode }) {
return <ChakraProvider theme={theme}>{children}</ChakraProvider>;
const router = useRouter()

useEffect(() => {
const token = localStorage.getItem('token')
if (!token || isTokenExpired(token)) {
localStorage.removeItem('token')
router.push('/')
}
}, [router])

return (
<Provider store={store}>
<ClientComponentWrapper>
<ChakraProvider theme={theme}>{children}</ChakraProvider>
</ClientComponentWrapper>
</Provider>
)
}
9 changes: 9 additions & 0 deletions src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,13 @@ a {
.fade-in.show {
opacity: 1;
transform: translateY(0); /* 원래 위치로 이동 */
}

.fixed-footer {
position: fixed;
bottom: 0;
width: 100%;
background-color: #f8f9fa;
text-align: center;
box-shadow: 0 -1px 5px rgba(0, 0, 0, 0.1);
}
6 changes: 2 additions & 4 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@ export default function RootLayout({ children }: { children: React.ReactNode })
return (
<html lang="en">
<body className={inter.className}>
<ClientLayout>
{children}
</ClientLayout>
<ClientLayout>{children}</ClientLayout>
</body>
</html>
)
}
}
6 changes: 2 additions & 4 deletions src/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import MainPage from '@/components/templates/MainPage';
import MainPage from '@/components/templates/MainPage'

export default function Home() {
return (
<MainPage />
)
return <MainPage />
}
14 changes: 14 additions & 0 deletions src/app/portfolio/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
'use client'

import PortfolioViewPage from '@/components/templates/PortfolioViewPage'
import { useParams } from 'next/navigation'

export default function Page() {
const params = useParams()
if (Array.isArray(params.id) || !params.id) {
return <div>올바르지 않은 접근입니다.</div>
}
const id = parseInt(params.id, 10)

return <PortfolioViewPage id={id} />
}
Loading
Loading