Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
50e4640
refactor: useMemo를 통한 불필요한 리렌더링 제거
tkyoun0421 Jun 26, 2025
3c3dff3
chore: 병합 전 커밋
tkyoun0421 Jun 26, 2025
d745a7c
Merge branch 'develop' into feat/search
tkyoun0421 Jun 26, 2025
8ce9655
Merge branch 'develop' into feat/search
tkyoun0421 Jun 26, 2025
6baf9be
refactor: 스타일드 컴포넌트로 변경
namee-h Jun 26, 2025
4e9028e
Merge branch 'develop' into feat/search
tkyoun0421 Jun 26, 2025
b758613
Merge branch 'develop' into feat/profile
namee-h Jun 26, 2025
376ff44
refactor: 좋아요 에러 개선 및 공유하기 기능 추가
czmcm5 Jun 26, 2025
33031e1
style: 프로필카드 UI 수정
namee-h Jun 26, 2025
8957a10
refactor: 프로필카드 이메일 위치 수정
namee-h Jun 26, 2025
fd1a1b8
feat: search 기능 및 페이지 완성
tkyoun0421 Jun 26, 2025
72987bb
resolve: 빌드 오류 제거
tkyoun0421 Jun 26, 2025
14353d4
feat: topTitle과 stepBox 컴포넌트 ui 개선 및 반응형 대응
MINYOUNG-SEOK Jun 26, 2025
af4e428
chore: pagination ui 폴더로 이동
tkyoun0421 Jun 26, 2025
ed9c164
chore: build error 제거
tkyoun0421 Jun 26, 2025
aac3539
feat: 유저 프로젝트 리스트 아이템 삭제 기능 및 스낵바 알림 추가
namee-h Jun 26, 2025
4b6806a
feat: 검색어 히스토리 기능 추가
tkyoun0421 Jun 26, 2025
1aa7731
feat: useCountdown 훅 도입 및 UserNotFound 카운트다운 UX 개선
namee-h Jun 26, 2025
eb2137a
refactor: search ui 리팩토링
tkyoun0421 Jun 26, 2025
70b1dea
chore: console.log 제거
tkyoun0421 Jun 26, 2025
3cb0f71
refactor: 코드리뷰 수정사항 관련 수정
tkyoun0421 Jun 26, 2025
e9fb5a8
chore: useProjectListPage 이름 변경 후 리팩토링
tkyoun0421 Jun 26, 2025
4af7a6c
feat: header, fallback loading 구현
tkyoun0421 Jun 26, 2025
54d5949
chore: styled 분리
tkyoun0421 Jun 26, 2025
901f893
refactor: 일관된 이름으로 변경
tkyoun0421 Jun 26, 2025
3a07518
refactor: searchListResultHandler 로직 분리
tkyoun0421 Jun 26, 2025
18e8d49
feat: step2 메인 레이아웃 구성 및 카드 컴포넌트 전체 구현 완료
MINYOUNG-SEOK Jun 27, 2025
326cfa0
feat: step2 컴포넌트 연동 처리
MINYOUNG-SEOK Jun 27, 2025
ade180c
feat: step2 상태 관리 및 스크롤 처리 추가
MINYOUNG-SEOK Jun 27, 2025
32b800c
fix: eslint 함수 반환 타입 경고 해결
MINYOUNG-SEOK Jun 27, 2025
7d660b4
fix: step2 타입 오류 및 빌드 에러 해결
MINYOUNG-SEOK Jun 27, 2025
2cfdd57
fix: projectTeamSizeCard 타입 오류 해결
MINYOUNG-SEOK Jun 27, 2025
276cdf2
style: techstack 입력 요소 인풋창과 버튼 높이 맞춤
MINYOUNG-SEOK Jun 27, 2025
5044055
style: 상세페이지 로딩 스피너 및 프로젝트 수정버튼 추가
czmcm5 Jun 27, 2025
bb1419c
Merge pull request #52 from czmcm5/feat/detail
tkyoun0421 Jun 27, 2025
ec6112d
Merge pull request #54 from namee-h/feat/profile
tkyoun0421 Jun 27, 2025
56b4dc0
refactor: projectSearchApi 리팩
tkyoun0421 Jun 27, 2025
e781c25
Merge pull request #55 from MINYOUNG-SEOK/feat/insert
tkyoun0421 Jun 27, 2025
ad62cc7
Merge pull request #53 from amicable-development-center/feat/search
tkyoun0421 Jun 27, 2025
49fb9b1
refactor: 등록 단계를 각각 훅으로 분리 (Step1, Step2)
czmcm5 Jun 27, 2025
3e94086
Merge remote-tracking branch 'upstream/develop' into feat/insert
MINYOUNG-SEOK Jun 27, 2025
80ddead
Merge pull request #56 from czmcm5/feat/insert/czmcm5
tkyoun0421 Jun 27, 2025
ecac7d3
refactor: 불필요한 콘솔 제거 및 소셜로그인 훅 리팩토링
namee-h Jun 27, 2025
623117a
Merge branch 'develop' of https://github.com/MINYOUNG-SEOK/project-ja…
MINYOUNG-SEOK Jun 27, 2025
5104f48
feat: 유저프로필 수정기능 추가
namee-h Jun 27, 2025
ea9dfef
feat: users에 내가 등록한 프로젝트 리스트 추가
czmcm5 Jun 27, 2025
40944e8
Merge pull request #57 from czmcm5/feat/insert/czmcm5
tkyoun0421 Jun 27, 2025
c515201
Merge branch 'develop' into feat/profile
namee-h Jun 27, 2025
3a1674f
refactor: useUserProfile 및 userApi 참조 주소변경 및 이전 파일 삭제
namee-h Jun 27, 2025
acf4819
feat: 좋아요 기능 구현
tkyoun0421 Jun 27, 2025
b2dd91a
feat: 내가 좋아요 누른 프로젝트들 가져오는 기능 구현
tkyoun0421 Jun 27, 2025
40690e3
feat: 등록 페이지 step3 전체 컴포넌트 및 카드 컴포넌트 구현
MINYOUNG-SEOK Jun 27, 2025
cfd9b95
feat: 등록 페이지 step4 전체 컴포넌트 및 카드 컴포넌트 구현
MINYOUNG-SEOK Jun 27, 2025
ffcf6f4
feat: 프로젝트 삭제 대신 모집 마감 버튼 추가
czmcm5 Jun 27, 2025
0cc98d0
fix: 누락된 Step4 컴포넌트 파일 추가
MINYOUNG-SEOK Jun 27, 2025
b894bd3
Merge branch 'develop' into feat/insert
MINYOUNG-SEOK Jun 27, 2025
11d6ea5
chore: useProjectInsertForm.ts 포맷팅 적용
MINYOUNG-SEOK Jun 27, 2025
120ed5d
fix: type error - Schedule period를 ExpectedPeriod로 변경
MINYOUNG-SEOK Jun 27, 2025
6cc3fb0
feat: 좋아요 기능 구현 및 페이지네이션 구현
tkyoun0421 Jun 27, 2025
e40f32c
chore: 기존 구조 유지
tkyoun0421 Jun 27, 2025
e8643d7
fix: eslint error - unused import 제거
MINYOUNG-SEOK Jun 27, 2025
5d51d01
resolve: 새로고침시 로그인페이지 리다이렉트 문제 isLoading 추가
namee-h Jun 27, 2025
e403260
fix: 회원가입 페이지 비정상 접근 시 스낵바 알림 후 홈으로 리다이렉트 처리
namee-h Jun 27, 2025
03911ff
feat: projectOwnerID 필드 추가 및 등록 훅 반영
namee-h Jun 27, 2025
7f7ab08
feat: 좋아요 기능 구현
tkyoun0421 Jun 27, 2025
125328b
feat: 좋아요 기능 구현
tkyoun0421 Jun 27, 2025
be9d602
resolve: 린트 에러 제거
tkyoun0421 Jun 27, 2025
9769602
Merge pull request #58 from namee-h/feat/profile
tkyoun0421 Jun 27, 2025
9da00bd
Merge pull request #59 from czmcm5/feat/detail
tkyoun0421 Jun 27, 2025
aec4017
Merge pull request #60 from MINYOUNG-SEOK/feat/insert
tkyoun0421 Jun 27, 2025
1d91391
chore: 병합 린트 에러
tkyoun0421 Jun 27, 2025
659dcdb
resolve: 린트 오류 제거
tkyoun0421 Jun 27, 2025
8de4ae6
Merge pull request #61 from amicable-development-center/feat/animation
tkyoun0421 Jun 27, 2025
7f97aaa
style: 등록페이지 step1 카드 컴포넌트 레이아웃 통일
MINYOUNG-SEOK Jun 27, 2025
939e4b6
fix: step1 입력/셀렉트 핸들러 타입 일치 및 타입-only import 적용
MINYOUNG-SEOK Jun 27, 2025
501abd4
chore: lint error 수정
MINYOUNG-SEOK Jun 27, 2025
f85d13a
chore: lint error 수정
MINYOUNG-SEOK Jun 27, 2025
38c8185
Merge pull request #62 from MINYOUNG-SEOK/feat/insert
tkyoun0421 Jun 27, 2025
123160c
feat: application db 연결 및 기능 구현
tkyoun0421 Jun 27, 2025
9d15ceb
Merge branch 'develop' into feat/apply
tkyoun0421 Jun 27, 2025
920ffda
chore: 불필요한 코드 삭제
tkyoun0421 Jun 27, 2025
643e5b7
Merge pull request #63 from amicable-development-center/feat/apply
tkyoun0421 Jun 27, 2025
4ea84ca
feat: 프로필 좋아요삭제기능 및 탭이름 타입 enum으로 변경
namee-h Jun 27, 2025
b59a896
chore: 불필요한 파일 삭제 entities>projects 로 이동함
namee-h Jun 27, 2025
fe96bed
Merge branch 'develop' into feat/profile
namee-h Jun 27, 2025
a2f3b11
refactor: 프로젝트 등록 단계별 훅으로 분리
czmcm5 Jun 27, 2025
87b5e03
docs: 지원하기 훅을 ts파일로 수정
czmcm5 Jun 27, 2025
7d5a5b3
feat: scroll 기능 구현
tkyoun0421 Jun 27, 2025
ec6c4ad
refactor: 등록폼 전체 업데이트 함수 통일
czmcm5 Jun 27, 2025
c566003
refactor: 다음 이동, 프로젝트 등록 함수 합침
czmcm5 Jun 27, 2025
1507b1b
feat: 프로필페이지 지원프로젝트 삭제 기능 추가
namee-h Jun 27, 2025
8c6d7ff
refactor: 내부 함수 가독성 개선
czmcm5 Jun 27, 2025
8dc9bff
feat: project-card 지원 인원 추가
tkyoun0421 Jun 27, 2025
1e6f3ec
feat: 만든프로젝트 삭제기능 추가
namee-h Jun 27, 2025
46cc7c2
refactor: 프로젝트 등록하기 페이지 관심사 분리 최종
czmcm5 Jun 27, 2025
b97bd77
feat: 모바일버전 카드레이아웃 변경
namee-h Jun 27, 2025
adc5525
refactor: deleteProjectsEverywhere 병렬 처리 리팩토링
namee-h Jun 27, 2025
3edae20
refactor: 위젯에 있는 로고박스 공용컴포넌트로 분리 및 login에 적용
namee-h Jun 27, 2025
bf10121
feat: 전역 에러 관리를 위한 스낵바 zustand 스토어 및 글로벌 스낵바 컴포넌트 추가
namee-h Jun 27, 2025
29601bf
refactor: 불필요한 콘솔 제거
namee-h Jun 27, 2025
5455c5a
feat: firebase 토큰 갱신 및 만료 처리 기능 구현
namee-h Jun 28, 2025
b14b890
refactor: 로딩중.. 로딩스피너 컴포넌트 대체
namee-h Jun 28, 2025
18d030a
Merge pull request #64 from namee-h/feat/profile
tkyoun0421 Jun 28, 2025
ace82eb
chore: vite hmr 테스트 추가
tkyoun0421 Jun 28, 2025
22b41b8
Merge branch 'develop' into feat/apply
tkyoun0421 Jun 28, 2025
21f8f1b
Merge branch 'develop' into feat/insert/czmcm5
czmcm5 Jun 28, 2025
25a6341
Merge pull request #65 from czmcm5/feat/insert/czmcm5
tkyoun0421 Jun 28, 2025
59f1a94
resolve: 병합 충돌 해결
tkyoun0421 Jun 28, 2025
4bd1abc
resolve: 주석 추가
tkyoun0421 Jun 28, 2025
a528084
Merge pull request #66 from amicable-development-center/feat/apply
tkyoun0421 Jun 28, 2025
dd7131f
chore: 좋아요, 지원하기 컬렉션 필드 변경된 부분 적용하여 코드 변경
tkyoun0421 Jun 28, 2025
6f84026
fix: timestamp를 date input 형식으로 변환하여 모집 마감일 표시 오류 해결
MINYOUNG-SEOK Jun 28, 2025
a55642e
refactor: 사용하지 않는 코드들 제거
tkyoun0421 Jun 28, 2025
45f30c8
chore: 사용하지 않는 docs 제거
tkyoun0421 Jun 28, 2025
aecdc73
resolve: 린트 에러 제거
tkyoun0421 Jun 28, 2025
46e0946
resolve: lint 제거
tkyoun0421 Jun 28, 2025
9073d51
resolve: git 대소문자 구분 변경 못하는거 해결
tkyoun0421 Jun 28, 2025
c0816ef
docs: readme 삭제
tkyoun0421 Jun 28, 2025
846ca59
fix: 인풋 포커스/호버 보더 색상을 검정색으로 통일
MINYOUNG-SEOK Jun 28, 2025
e2a3a70
fix: 상태 업데이트 반영 위해 submit 지연 처리 추가
MINYOUNG-SEOK Jun 28, 2025
3358810
feat: 모집 마감일 timestamp를 input date 형식으로 변환하는 유틸 추가
MINYOUNG-SEOK Jun 28, 2025
4ad3836
feat: 입력값 유효성 검사 및 상태 업데이트 로직 추가
MINYOUNG-SEOK Jun 28, 2025
8eca1b2
refactor: 지원하기, 좋아요 hook 리팩토링
czmcm5 Jun 28, 2025
f07fdab
style: body 배경색 추가
czmcm5 Jun 28, 2025
5492bcc
feat: 등록페이지 step2 입력값 유효성 검사
MINYOUNG-SEOK Jun 28, 2025
6f023d7
feat: 등록페이지 step3 입력값 유효성 검사
MINYOUNG-SEOK Jun 28, 2025
542d32b
feat: 등록페이지 step4 입력값 유효성 검사
MINYOUNG-SEOK Jun 28, 2025
1e7c43d
fix: fsd 위반 해결 - app 계층 import 제거
MINYOUNG-SEOK Jun 28, 2025
4632f07
feat: 풋터 추가 반응형 ui 구현
namee-h Jun 28, 2025
64a7f64
refactor: 보더 삭제
namee-h Jun 28, 2025
47bbb5f
refactor: 스낵바를 헤더 아래로 위치 조정
namee-h Jun 28, 2025
9f481ab
feat: 메인홈 어떻게 시작하나요? 상자 추가
czmcm5 Jun 28, 2025
83c0eaf
feat: 모바일버전 헤더 추가
namee-h Jun 28, 2025
ec3c1e4
feat: 메인홈 지금 바로 시작해보세요! 박스 추가
czmcm5 Jun 28, 2025
0874a94
refactor: 데스크탑버전 헤더 반응형 수정
namee-h Jun 28, 2025
e6532ff
style: 메인홈 카드 스타일 변경
czmcm5 Jun 28, 2025
f23e782
style: 유저 프로필 상태박스 배경색 수정
czmcm5 Jun 28, 2025
8b38710
Merge pull request #67 from amicable-development-center/feat/apply
tkyoun0421 Jun 28, 2025
0b506ea
Merge branch 'develop' into feat/detail
czmcm5 Jun 28, 2025
42cd09f
chore: 빌드에러 수정
czmcm5 Jun 28, 2025
5af6cde
chore: 죄송합니다
czmcm5 Jun 28, 2025
0b96540
Merge pull request #68 from czmcm5/feat/detail
tkyoun0421 Jun 28, 2025
787fb1d
Merge branch 'develop' into feat/insert
MINYOUNG-SEOK Jun 28, 2025
cc2156a
style: 등록페이지 step1,2 반응형 추가
MINYOUNG-SEOK Jun 28, 2025
d789cc4
Merge pull request #69 from MINYOUNG-SEOK/feat/insert
tkyoun0421 Jun 28, 2025
8c8e747
Merge pull request #70 from namee-h/feat/profile
tkyoun0421 Jun 28, 2025
3848b39
Merge branch 'develop' into feat/home/czmcm5
czmcm5 Jun 28, 2025
ec2a571
Merge pull request #71 from czmcm5/feat/home/czmcm5
tkyoun0421 Jun 28, 2025
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
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"Neue",
"Pretendard",
"Segoe",
"treemap",
"TTFB"
],
"css.lint.unknownAtRules": "ignore",
Expand Down
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@
"prepare-commit": "lint-staged",
"preview": "vite preview",
"preinstall": "npx only-allow pnpm",
"prepare": "husky"
"prepare": "husky",
"dev:debug": "vite --debug --force",
"dev:profile": "vite --debug hmr",
"dev:verbose": "vite --logLevel info"
},
"lint-staged": {
"src/**/*.{js,jsx,ts,tsx}": [
Expand Down
File renamed without changes
5 changes: 5 additions & 0 deletions src/app/entry/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ import "@app/styles/global.css";

import queryClient from "@shared/react-query/queryClient";

// HMR 성능 모니터 (개발 환경에서만)
if (import.meta.env.DEV) {
import("@shared/libs/utils/measureHmr");
}

createRoot(document.getElementById("root")!).render(
<StrictMode>
<QueryClientProvider client={queryClient}>
Expand Down
4 changes: 2 additions & 2 deletions src/app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<html lang="ko">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="./assets/icon.svg" />
<link rel="icon" type="image/svg+xml" href="./public/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="description"
Expand All @@ -28,7 +28,7 @@
name="og:description"
content="프로젝트 잼 - 함께 만들어가는 사이드 프로젝트"
/>
<meta name="og:image" content="./assets/icon.svg" />
<meta name="og:image" content="./public/logo.svg" />
<meta name="og:url" content="https://project-jam-gamma.vercel.app/" />
<meta name="og:site_name" content="프로젝트 잼" />
<meta name="og:type" content="website" />
Expand Down
9 changes: 9 additions & 0 deletions src/app/public/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
87 changes: 50 additions & 37 deletions src/app/routes/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import MainLayout from "@app/routes/MainLayout";
import PrivateRoute from "@app/routes/PrivateRoute";

import { useAuthObserver } from "@shared/hooks/useAuthObserver";
import LoadingSpinner from "@shared/ui/loading-spinner/LoadingSpinner";
import { useLoadingCursor } from "@shared/hooks/useLoadingCursor";
import GlobalSnackbar from "@shared/ui/GlobalSnackbar";
import PageTransitionLoader from "@shared/ui/loading-spinner/PageTransitionLoader";
import ScrollToTop from "@shared/ui/ScrollToTop";

const HomePage = lazy(() => import("@pages/home/ui/HomePage"));
const NotFoundPage = lazy(() => import("@pages/not-found/ui/NotFoundPage"));
Expand All @@ -26,47 +29,57 @@ const ProjectListPage = lazy(
() => import("@pages/project-list/ui/ProjectListPage")
);

function AppContent(): JSX.Element {
useLoadingCursor();

return (
<Suspense fallback={<PageTransitionLoader />}>
<ScrollToTop />
<Routes>
{/* 헤더 없는 레이아웃 (로그인/회원가입 전용) */}
<Route element={<AuthLayout />}>
<Route path="/login" element={<LoginPage />} />
<Route path="/signup" element={<SignUpPage />} />
</Route>

{/* 헤더 포함 레이아웃 (메인 페이지) */}
<Route element={<MainLayout />}>
{/* 공개 페이지 */}
<Route path="/" element={<HomePage />} />
<Route path="/project" element={<ProjectListPage />} />
<Route path="/project/:id" element={<ProjectDetailPage />} />
<Route path="*" element={<NotFoundPage />} />

{/* 비공개 페이지 */}
<Route
path="/profile"
element={
<PrivateRoute>
<UserProfilePage />
</PrivateRoute>
}
/>
<Route
path="/project/insert"
element={
<PrivateRoute>
<ProjectInsertPage />
</PrivateRoute>
}
/>
</Route>
</Routes>
</Suspense>
);
}

function App(): JSX.Element {
useAuthObserver();

return (
<BrowserRouter basename="/">
<Suspense fallback={<LoadingSpinner />}>
<Routes>
{/* 헤더 없는 레이아웃 (로그인/회원가입 전용) */}
<Route element={<AuthLayout />}>
<Route path="/login" element={<LoginPage />} />
<Route path="/signup" element={<SignUpPage />} />
</Route>

{/* 헤더 포함 레이아웃 (메인 페이지) */}
<Route element={<MainLayout />}>
{/* 공개 페이지 */}
<Route path="/" element={<HomePage />} />
<Route path="/project" element={<ProjectListPage />} />
<Route path="/project/:id" element={<ProjectDetailPage />} />
<Route path="*" element={<NotFoundPage />} />

{/* 비공개 페이지 */}
<Route
path="/profile"
element={
<PrivateRoute>
<UserProfilePage />
</PrivateRoute>
}
/>
<Route
path="/project/insert"
element={
<PrivateRoute>
<ProjectInsertPage />
</PrivateRoute>
}
/>
</Route>
</Routes>
</Suspense>
<AppContent />
<GlobalSnackbar />
</BrowserRouter>
);
}
Expand Down
2 changes: 2 additions & 0 deletions src/app/routes/MainLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { JSX } from "react";
import { Outlet } from "react-router-dom";

import Footer from "@widgets/Footer";
import Header from "@widgets/Header/Header";

const MainLayout = (): JSX.Element => {
Expand All @@ -10,6 +11,7 @@ const MainLayout = (): JSX.Element => {
<main>
<Outlet />
</main>
<Footer />
</>
);
};
Expand Down
6 changes: 6 additions & 0 deletions src/app/routes/PrivateRoute.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@ import React, { type JSX } from "react";
import { Navigate, useLocation } from "react-router-dom";

import { useAuthStore } from "@shared/stores/authStore";
import LoadingSpinner from "@shared/ui/loading-spinner/LoadingSpinner";

const PrivateRoute = ({
children,
}: {
children: React.ReactNode;
}): JSX.Element => {
const user = useAuthStore((state) => state.user);
const isLoading = useAuthStore((state) => state.isLoading);
const location = useLocation();

if (isLoading) {
return <LoadingSpinner variant="overlay" message="인증 확인 중..." />;
}

if (!user) {
return <Navigate to={`/login?redirect=${location.pathname}`} replace />;
}
Expand Down
9 changes: 9 additions & 0 deletions src/app/styles/global.css
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,19 @@ body {
"Droid Sans",
"Helvetica Neue",
sans-serif;
background-color: #f8fafc;
}

*,
*::before,
*::after {
box-sizing: inherit;
}

body.page-loading {
cursor: wait;
}

body.page-loading * {
cursor: wait !important;
}
Loading