Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
672 commits
Select commit Hold shift + click to select a range
60b1658
rename: useLoginFlow 파일명 변경
Seony777 Feb 4, 2026
3e26136
refactor: 로그아웃 후처리 함수 수정
Seony777 Feb 4, 2026
53b9482
refactor: getCombos의 enabled값 수정
Seony777 Feb 4, 2026
9493c59
refactor: redirectToLoginOnce 토큰 상태기반 리셋
Seony777 Feb 4, 2026
fb06fa6
refactor: interceptor.ts 주석 추가
Seony777 Feb 4, 2026
42a38e5
refactor: 온보딩 라우트 상수 auth에서 분리
Seony777 Feb 4, 2026
f59c05f
rename: 온보딩 페이지들 pages/onboarding으로 옮김
Seony777 Feb 4, 2026
6763e8c
feat: 라이프스타일 기기 응답 타입 및 api 함수 정의
waldls Feb 4, 2026
af199ae
feat: 라이프스타일 API 연동
waldls Feb 4, 2026
9599232
refactor: 호출부에서 성공여부 파악하도록 코드 수정
waldls Feb 4, 2026
82d533f
refactor: 라이프스타일 상수 매핑 constants 분리
waldls Feb 4, 2026
443c132
feat: 사용자 케이스에 따른, 온보딩 미실행 자 로직 구현
Feb 4, 2026
f41c535
design: 별 아이콘 위치 수정
Feb 4, 2026
c4d56f9
fix: 타입에러 해결
Feb 4, 2026
ef9326f
design: 조합리스트 스크롤 마진 수정, 조합 기기 전체 보기 그라데이션 수정
Feb 4, 2026
d788230
design: 조합 상세보기에서 이름 표시하도록 수정
Feb 4, 2026
f36a883
design: 기기 검색 페이지 product 기기명이 2줄을 넘어갈 경우 상세보기에서 스크롤 구현
Feb 4, 2026
1312581
design: 기기 전체보기 product 크기 수정
Feb 4, 2026
f5c4cc0
design: 조합 상세보기 버튼 하단 고정
Feb 4, 2026
a2d3a4e
design: 조합 상세보기, 제품 이름 2줄이상 ..표기
Feb 4, 2026
03448ae
design: 간략히보기,기기 전체보기 동작 부드럽게 수정
Feb 4, 2026
c6dead1
feat: AuthGuard 로딩 시 로딩스피너 구현
Seony777 Feb 4, 2026
cd787dc
Merge pull request #123 from DeviceLife-Official/feature/118-caselogic
H-un1 Feb 4, 2026
475b6f1
Merge branch 'develop' into design/124-search-css
Feb 4, 2026
c180830
feat: 가격 콤마 및 ₩ 포맷팅
waldls Feb 4, 2026
351d017
확인했습니다. 고생하셨습니다!
Seony777 Feb 4, 2026
c122e7f
design: 별 아이콘 -mt-3 으로 1 위로 조정
Feb 4, 2026
8e99bf4
refactor: 라이프스타일 상수들을 단일 config object로 정리
waldls Feb 4, 2026
7987ac5
refactor: 라이프스타일 타이머 언마운트 안정성 보강
waldls Feb 4, 2026
3d21114
design: 조합 상세보기, 기기 전체보기가 있을 경우 버튼 위치 수정하여 스크롤 안 뜨게 수정
Feb 4, 2026
bdfb69a
feat: 로그인 유무에 따른 온보딩 페이지네이션 클릭 방지
Seony777 Feb 4, 2026
7676056
comment: 주석수정
H-un1 Feb 4, 2026
cb430f5
feat: 로그인된 유저의 회원가입 페이지 접근시 홈으로 리다이렉트
Seony777 Feb 4, 2026
823644e
Merge pull request #125 from DeviceLife-Official/feature/108-lifestyl…
waldls Feb 4, 2026
82b27df
Merge pull request #126 from DeviceLife-Official/design/124-search-css
H-un1 Feb 4, 2026
8b0c9ad
fix: 빌드오류 해결
Seony777 Feb 4, 2026
d29a8f1
feat: 브랜드 API 연결
Feb 4, 2026
d3e2055
refactor: 비로그인 유저 401응답시 로그인 페이지 이동
Seony777 Feb 4, 2026
90b6f88
feat: 브랜드 API 연결
Feb 4, 2026
3a49bc5
refactor: getBrands.ts에서 queryKey 상수 사용
Feb 4, 2026
86388d2
design: 기기명이 2줄, 3줄 넘어갈 경우, 기기 상세보기 스펙을 사진과 같은 라인으로 맞추기
Feb 4, 2026
1e4c014
Merge pull request #120 from DeviceLife-Official/feature/112-logoutap…
waldls Feb 5, 2026
c97459b
feat: 마이페이지 좌측 내 정보 API 연동
waldls Feb 5, 2026
39c08f4
feat: 유저 라이프스타일 태그 API 연동
waldls Feb 5, 2026
2642f4b
refactor: 라이프스타일 # 태그 제거
waldls Feb 5, 2026
23ba355
feat: 최근에 본 기기 플로팅에 유저네임 연결
waldls Feb 5, 2026
2a3321f
chore: GNB 로그아웃 cursor-pointer 추가
waldls Feb 5, 2026
8adc1ac
design: 깨진 레이아웃 복구
Seony777 Feb 5, 2026
b691106
design: step 인디케이터 opacity제거
Seony777 Feb 5, 2026
2fc2bbc
feat: 중복확인 성공시 alert대신 성공 문구 띄우기
Seony777 Feb 5, 2026
da5b17b
fix: 뒤로가기나 인디케이터로 step1 돌아올 때 중복확인 입력창/버튼 비활성화되어 있는 오류 수정
Seony777 Feb 5, 2026
3d50e57
feat: 온보딩 완료유무 api 타입,함수 추가
Seony777 Feb 5, 2026
1d568d7
refactor: useAuth()에서 React Query를 구독하는 방식으로 변경
waldls Feb 5, 2026
8360215
Merge pull request #130 from DeviceLife-Official/feature/129-mypage_i…
waldls Feb 5, 2026
05b2a2d
Merge pull request #127 from DeviceLife-Official/feature/117-brand-api
waldls Feb 5, 2026
7dc7810
feat: 온보딩 완료 api연동
Seony777 Feb 5, 2026
dfab266
feat: 라이프스타일 태그 미선택 유저 온보딩 조합생성하기 페이지 접근 시 라이프스타일 선택 페이지로 이동
Seony777 Feb 5, 2026
68beebe
refactor: 온보딩 기기추천 페이지, OnboardingCompletedGuard로 이동
Seony777 Feb 5, 2026
df4a7bd
refactor: 온보딩 완료 시점 변경
Seony777 Feb 5, 2026
b47acd2
feat: 가드에 온보딩 완료 유무 적용
Seony777 Feb 5, 2026
53c515f
feat: 온보딩 완료 페이지는 온보딩 유무의 연결고리이므로 가드제거 + url로 바로 들어오는 사용자 방지
Seony777 Feb 5, 2026
a321df8
feat: useAuth적용
Seony777 Feb 5, 2026
56f5c01
feat: lifestyle api연동
Seony777 Feb 5, 2026
de33dee
feat: 원화 표시 추가
Seony777 Feb 5, 2026
5d993a3
feat: 프로필 수정에서 useAuth 기반 유저 정보 연동
waldls Feb 6, 2026
da67ab1
feat: 프로필 수정 요청, 응답, API 함수 작성
waldls Feb 6, 2026
0774c94
chore: 파일 대소문자 import 오류 해결
waldls Feb 6, 2026
753a3b4
fix: 라이프스타일 태그에 # 보이도록 수정
waldls Feb 6, 2026
2fd0ee7
feat: 프로필 수정 API 연동
waldls Feb 6, 2026
19313e8
chore: 파일 대소문자 경로 import 오류 해결
waldls Feb 6, 2026
4f70037
feat: 내조합에 담기 버튼 클릭 시 연동
Seony777 Feb 6, 2026
1d8a9fc
fix: 추천기기 3개 전부가 아닌 선택한 기기 1개만 담아지도록 변경
Seony777 Feb 6, 2026
110b282
feat: 기타 유저 ux개선
Seony777 Feb 6, 2026
f3694c4
fix: 정상적으로 진행시에도 애니메이션 작동 전에 리다이렉트되는 오류 수정
Seony777 Feb 6, 2026
d7f9902
rename: utils 구조 개선
Seony777 Feb 6, 2026
209a0ea
merge: 충돌 해결
Seony777 Feb 6, 2026
09a4085
Merge pull request #132 from DeviceLife-Official/feature/131-profile_…
waldls Feb 6, 2026
438cefd
remove: contexts 폴더 삭제
Seony777 Feb 6, 2026
3a14e36
Merge pull request #133 from DeviceLife-Official/feature/121-onboardi…
Seony777 Feb 6, 2026
c23328e
fix: 쿠키가 필요한 요청에만 쿠키가 가도록 전용 인스턴스 추가
Seony777 Feb 7, 2026
d290d91
feat: 구글 로그인 버튼 클릭 시 구글 인증 페이지로 이동
Seony777 Feb 7, 2026
cb7c5bd
feat: 구글 콜백 페이지 추가 및 라우트 연결
Seony777 Feb 7, 2026
23298e1
design: 콜백 페이지 로딩스피너 띄우기로 변경
Seony777 Feb 8, 2026
34faa3d
refactor: refreshToken을 일반/소셜 로그인 시 모두 httpOnly 쿠키로 받기로 함에 따른 수정
Seony777 Feb 8, 2026
d15f21d
refactor: 로컬 스토리지에서 accessToken만 사용하도록 함수명 authToken -> accessToken 변경
Seony777 Feb 8, 2026
b0c9622
feat: 콜백 페이지에서 로그인 완료 구현
Seony777 Feb 8, 2026
5bf2af5
feat: accessToken발급 성공 시 온보딩 유무에 따라 페이지 분기
Seony777 Feb 8, 2026
66d97ac
refactor: strictMode 고려와 온보딩 유무 캐시에서 확인
Seony777 Feb 8, 2026
527352a
refactor: 로그인 api응답 값에 따른 타입 변경
Seony777 Feb 8, 2026
b8da938
refactor: 구글 oauth 경로 상수화
Seony777 Feb 8, 2026
c8da72a
Merge pull request #136 from DeviceLife-Official/feature/134-googleLogin
Seony777 Feb 8, 2026
17528ed
chore: 프로필 수정 성공 시 마이페이지로 이동
waldls Feb 8, 2026
55b0ea3
feat: 비밀번호 수정 api 타입 및 함수 정의
waldls Feb 8, 2026
275d2be
feat: 최근에 본 기기 api함수,훅,타입 구현
Seony777 Feb 8, 2026
7d3478b
feat: 비밀번호 수정 api 연동 및 에러처리 세분화
waldls Feb 8, 2026
a6a7220
fix: 비밀번호 수정 검증 타이밍 및 서버 에러 표시 로직 개선
waldls Feb 8, 2026
9199bbd
Merge branch 'develop' of https://github.com/DeviceLife-Official/Fron…
Seony777 Feb 8, 2026
69a7ed0
refactor: 실제 응답 형식에 맞게 수정
Seony777 Feb 8, 2026
2b32da5
refactor: 쿼리키 이름 수정
Seony777 Feb 8, 2026
a62fa03
feat: 컴포넌트에 응답으로 받은 기기들 연결
Seony777 Feb 8, 2026
90d1ffe
refactor: staleTime 수정
Seony777 Feb 8, 2026
991951f
fix: 빌드 오류 해결
Seony777 Feb 8, 2026
b8c1392
Merge pull request #139 from DeviceLife-Official/feature/135-edit_pw-api
waldls Feb 9, 2026
3ac81ed
Merge pull request #140 from DeviceLife-Official/feature/137-recently…
Seony777 Feb 9, 2026
6bbddd7
feat: 조합평가 api 함수,훅,타입 생성
Seony777 Feb 9, 2026
0ab4f92
feat: 조합 평가 관련 상수, prop변환 함수 생성
Seony777 Feb 9, 2026
eafe055
refactor: 조합평가 카드 컴포넌트화
Seony777 Feb 9, 2026
ca7125a
refactor: 원래 있던 태그 스타일 사용 및 타입추론 강화
Seony777 Feb 9, 2026
190ab96
feat: 조합평가 폴링 훅 구현
Seony777 Feb 9, 2026
41c0d87
feat: 기기 추가/삭제 성공 시 polling 훅 실행
Seony777 Feb 9, 2026
2fcba09
feat: 조합평가 조회 훅 생성 및 실제 데이터 연동
Seony777 Feb 9, 2026
990901a
feat: 로딩 시 조합평가 부분 안보이게 처리
Seony777 Feb 9, 2026
6d71115
feat: 누락된 구글 어스 리다이렉트 추가
Seony777 Feb 9, 2026
9086cc3
feat: 라이프스타일 태그 추가
Seony777 Feb 10, 2026
302de33
refactor: 문구 수정
Seony777 Feb 10, 2026
16a43ae
comment: 주석 제거
Feb 10, 2026
6273513
feat: 기기검색 API 연동 ( 수정사항 일부 남아있음 )
Feb 10, 2026
31b3793
fix: 프로필 수정하지 않은 필드는 null 처리
waldls Feb 10, 2026
ad69e50
feat: 로그인 상태 유지 타입 추가 및 api호출 시 반영
Seony777 Feb 11, 2026
567465e
feat: 스토리지 구분 키 추가
Seony777 Feb 11, 2026
3332c17
feat: 로그인 관련함수에 keepLogin 인자 추가
Seony777 Feb 11, 2026
6eb5be3
feat: 스토리지 조작 함수 추가 및 수정
Seony777 Feb 11, 2026
bbcef35
fix: 타입 오류 수정
Seony777 Feb 11, 2026
5d0d042
feat: 검색할 때 새 데이터가 준비되면 로딩되도록 구현, (깜빡거림 해결)
Feb 11, 2026
861fea5
feat: 브랜드 이름 중복 해결
Feb 11, 2026
866978c
feat: 제품 사진 구현
Feb 11, 2026
944eca7
fix: 충전기 ( 로 인해 너비가 넓게 잡혀서, 19로 줄임
Feb 11, 2026
eabcd2a
refactor: 토큰 저장시 한군데에만 저장되게 수정
Seony777 Feb 11, 2026
41f1353
Merge pull request #144 from DeviceLife-Official/feature/141-combo_ev…
Seony777 Feb 11, 2026
c155d5f
Merge branch 'develop' of https://github.com/DeviceLife-Official/Fron…
Seony777 Feb 11, 2026
9b43188
design: RootLayout과의 css 문제를 뷰포트 이용하여 반응형 해결
Feb 11, 2026
3584139
fix: 구글 로그인 시 로그인 상태 유지
Seony777 Feb 11, 2026
f06c152
design: spinner 연결
Feb 11, 2026
dd15700
Merge pull request #148 from DeviceLife-Official/feature/147-login-st…
Seony777 Feb 11, 2026
84f643b
fix: merge conflict 해결
waldls Feb 11, 2026
7fad2c3
feat: 기기 상세보기 스펙: 색상 삭제, 충전방식 출시일 API 데이터로 변경
Feb 11, 2026
961b3dd
fix: 라이프스타일 리스트 비교 로직 안전하게 정렬 후 비교
waldls Feb 11, 2026
0434f8d
fix: refetch로 user가 갱신되어도 작성 중이면 유지되도록 수정
waldls Feb 11, 2026
49d71d2
fix: 기기 상세모달에서 사진 보이도록 수정
Feb 11, 2026
b488c98
design: 기기 상세보기 모달 라이프스타일 제거
Feb 11, 2026
f9e5ff7
feat: 기기 상세보기 스펙 넘어오지 않는 행 hidden
Feb 11, 2026
f2395df
feat: 기기 상세보기 스펙 인치 추가
Feb 11, 2026
7e9e42e
fix: 빌드에러 해결
Feb 11, 2026
3b311f7
Merge pull request #145 from DeviceLife-Official/feature/143-editprof…
waldls Feb 11, 2026
ac727b7
Merge pull request #149 from DeviceLife-Official/feature/117-brand-api
H-un1 Feb 11, 2026
b44f3e7
refactor: DeviceSearchPage.tsx 매핑 함수, 로직, 모달 UI 분리
Feb 11, 2026
2ad8d9c
fix: 첫 데이터 가져올 때 깜빡이는 현상 수정
Feb 11, 2026
20d97cb
fix: 카테고리 아이콘 재선택시 해제되도록 수정
Feb 11, 2026
dba376a
comment: 주석 제거
Feb 11, 2026
a4aa656
remove: 안쓰는 파일 및 코드 삭제
Seony777 Feb 11, 2026
d829ab1
docs: 리드미 프로젝트 소개 및 핵심 기능 수정
waldls Feb 11, 2026
c10f71e
refactor: 유저 프로필 사용방식 통일
Seony777 Feb 11, 2026
93acf5d
refactor: useAuth로 실제 온보딩 유무 제공
Seony777 Feb 11, 2026
d0307e0
Merge pull request #152 from DeviceLife-Official/refactor/150-search
H-un1 Feb 12, 2026
1d25408
refactor: 상수 & 유틸 정리
Feb 12, 2026
74628cd
refactor: 커스텀 훅 생성
Feb 12, 2026
9975d9a
refactor: 커스텀 훅 생성
Feb 12, 2026
289c6fc
refactor: 정렬로직
Feb 12, 2026
00e1b3b
refactor: 조합명, 유효성 검사
Feb 12, 2026
06ee11d
refactor: 기기 삭제 컴포넌트
Feb 12, 2026
881df00
refactor: 조합삭제 컴포넌트
Feb 12, 2026
d5bd2a3
refactor: 조합명 저장 확인 컴포넌트
Feb 12, 2026
c5c8e97
refactor: 삭제 완료 팝업 컴포넌트
Feb 12, 2026
bd35390
refactor: mypage sidebar 컴포넌트
Feb 12, 2026
277e855
refactor: 드랍다운 메뉴 컴포넌트
Feb 12, 2026
921cc16
refactor: 빈 조합 컴포넌트
Feb 12, 2026
c01fba0
refactor: 조합 컴포넌트
Feb 12, 2026
906a5dc
refactor: 상세보기 컴포넌트
Feb 12, 2026
b547819
refactor: mypage.tsx
Feb 12, 2026
ec6662d
refactor: useClickOutisde
Feb 12, 2026
52386a1
refactor: 모달 스크롤 방지 훅
Feb 12, 2026
ea93cb5
refactor: 스크롤 방지 훅
Feb 12, 2026
b99a586
refactor: MyPage.tsx
Feb 12, 2026
e153b60
refactor: 콘솔 삭제
Feb 12, 2026
bc12fa1
remove: 마이페이지, 검색에서 안 쓰이는 데이터 삭제
Feb 12, 2026
45de40e
refactor: useCallback으로 핸들러 메모이제이션
Feb 12, 2026
39099b4
refactor: 자식 컴포넌트 React.memo 적용
Feb 12, 2026
9cc9694
refactor: any 타입 제거
Feb 12, 2026
255c046
design: 구글 로그인 버튼에 hover추가
Seony777 Feb 12, 2026
ba3e788
feat: 로그인한 유저가 로그인 페이지 방문 시 홈으로 리다이렉트
Seony777 Feb 12, 2026
bf55166
feat: 로그인 직후 온보딩 유무에 따라 리다이렉트
Seony777 Feb 12, 2026
9a794a8
refactor: 리액트 훅 규칙 지켜서 코드 위치 변경
Seony777 Feb 12, 2026
c44dde3
refactor: 회원가입 시 전역 상태 제거 및 필요없는 코드 제거
Seony777 Feb 12, 2026
ced86fe
refactor: 불필요한 의존성 제거
Seony777 Feb 12, 2026
b4009ba
refactor: 이메일 인증상태 한 곳에서 관리
Seony777 Feb 12, 2026
4854667
refactor: 리액트 훅 규칙 지켜서 코드 위치 변경
Seony777 Feb 12, 2026
6a16f96
refactor: any타입 제거
Feb 12, 2026
676b6ae
refactor: Lazy Loading으로 성능 최적화
Feb 12, 2026
9465fd7
refactor: 에러처리 유틸함수 사용
Seony777 Feb 12, 2026
d4c3983
fix: 빌드에러 해결
Feb 12, 2026
5b80d59
refactor: mockdata.ts 삭제 및 새로 정의
Feb 12, 2026
adb2358
Merge pull request #153 from DeviceLife-Official/refactor/151-mypage
H-un1 Feb 12, 2026
eb933ec
feat: 최근 본 기기 저장 API 연동
Feb 12, 2026
bd9fd6d
refactor: alert 제거
Feb 12, 2026
85ae2ef
fix: 비밀번호 찾기 메일 인증오류 수정
Seony777 Feb 12, 2026
2ed00da
feat: 기기검색 flow, 마이페이지 조합에 제품 사진 구현
Feb 12, 2026
7b446a9
feat: 기기 상세보기에 태그 구현
Feb 12, 2026
2ee30ef
merge: develop 머지
Seony777 Feb 12, 2026
00e1de5
fix: 빌드에러 해결
Feb 12, 2026
b3a7ad8
refactor: restore 조합 태그 컴포넌트
Seony777 Feb 12, 2026
55fe780
fix: 빌드에러
Feb 12, 2026
3f7f8aa
docs: 리드미 기술스택 및 컨벤션 링크 추가
waldls Feb 12, 2026
b310663
Merge pull request #155 from DeviceLife-Official/feature/154-tag
H-un1 Feb 12, 2026
c96f6e5
fix: 스크롤 영역으로 인한 밀림 현상 해결
Feb 12, 2026
2c9eaaf
merge: develop머지
Seony777 Feb 12, 2026
7e4c032
fix: 충돌 오류 해결
Seony777 Feb 12, 2026
769bfc9
feat: 조합 태그 복구
Seony777 Feb 12, 2026
8169a54
feat: 조합 평가 태그 연동
Seony777 Feb 12, 2026
081f6c1
docs: 리드미 폴더 구조 컨벤션 추가
waldls Feb 12, 2026
d2b7f56
Merge pull request #157 from DeviceLife-Official/feature/146-code-ref…
Seony777 Feb 12, 2026
93172f6
Merge pull request #158 from DeviceLife-Official/fix/156-scroll
H-un1 Feb 12, 2026
63eb2aa
feat: 같은 타입의 기기일 경우 담지 못하도록 구현
Feb 12, 2026
ced635d
feat: 같은 타입일 경우 조합 담기 버튼 disabled
Feb 12, 2026
39f74b7
Merge pull request #160 from DeviceLife-Official/feature/159-device
H-un1 Feb 12, 2026
a85bd10
feat: 마이페이지에서 기기 사진 뜨도록 구현
Feb 12, 2026
c56e064
feat: 조합이 1개일 경우 상세보기에서 기기, 타입 구별
Feb 12, 2026
fd893f9
Merge pull request #162 from DeviceLife-Official/feature/161-combination
H-un1 Feb 12, 2026
bd55899
fix: 기기에 담는 즉시 반영되도록 구현
Feb 12, 2026
be222f4
Merge pull request #165 from DeviceLife-Official/fix/163-device
H-un1 Feb 12, 2026
bd64a76
fix: 가격대 필터 수정
Feb 12, 2026
aad1706
fix: 온보딩으로 안넘어가지는 오류 수정
Seony777 Feb 12, 2026
fb63f2d
fix: 낮은가격, 높은가격순 필터 수정
Feb 12, 2026
9fa7d9d
Merge pull request #168 from DeviceLife-Official/fix/164-scroll
H-un1 Feb 12, 2026
d60155c
docs: 리드미 아티클 링크 추가
waldls Feb 12, 2026
4038ebf
Merge pull request #167 from DeviceLife-Official/feature/166-onboardi…
Seony777 Feb 12, 2026
a34ffe0
design: 조합평가 전문보기 삭제
Feb 12, 2026
54252ef
Merge pull request #171 from DeviceLife-Official/design/170-delete
H-un1 Feb 12, 2026
d309816
fix: 조합에 기기가 없을 경우에도 조합명 수정되도록 수정
Feb 12, 2026
294e68f
Merge pull request #173 from DeviceLife-Official/fix/172-name
H-un1 Feb 12, 2026
a6ed2ca
design: 기기 검색 페이지, 제품에 원화 기호 추가
Feb 12, 2026
48d6371
fix: 기기 상세모달에서 모달이 꺼질경우 스크롤 안 되는 이슈 해결
Feb 12, 2026
d61fc90
Merge pull request #174 from DeviceLife-Official/fix/169-search-scroll
H-un1 Feb 12, 2026
60a5124
feat: 빈 조합의 +, 자세히보기 + 를 눌렀다가 다시 마이페이지로 라우팅할 경우 기존 스크롤 위치 저장
Feb 12, 2026
c8a75f9
Merge pull request #177 from DeviceLife-Official/fix/175-scroll
H-un1 Feb 12, 2026
eaa8792
refactor: 중복된 useLayoutEffect 통합
Feb 12, 2026
2a88059
refactor: isModalOpen 로직 명확화
Feb 12, 2026
80a352b
refactor: useCallback으로 콜백 함수 최적화
Feb 12, 2026
20badcb
refactor: ProductCard 리스트 렌더링 최적화
Feb 12, 2026
e9065ee
refactor: 필터 아이콘 버튼에 aria-label 추가
Feb 12, 2026
6c13540
refactor: 검색 Input에 aria-label 추가
Feb 12, 2026
70883ae
refactor: 모달에 ESC 키로 닫기 및 aria 속성 추가
Feb 12, 2026
d83c8e1
Merge pull request #178 from DeviceLife-Official/refactor/176-search
H-un1 Feb 12, 2026
0400b0a
design: 원화 표시
Feb 12, 2026
dcb84bd
docs: 서비스 소개 이미지 추가
waldls Feb 12, 2026
eb4c9dd
Merge pull request #181 from DeviceLife-Official/design/179
H-un1 Feb 12, 2026
115c257
Merge pull request #182 from DeviceLife-Official/feature/142-readme-docs
waldls Feb 12, 2026
1eea20a
fix: 기기 매핑 수정
Feb 12, 2026
afd7add
Merge pull request #183 from DeviceLife-Official/fix/180-device
H-un1 Feb 12, 2026
223a472
fix: 이어폰/헤드셋 타입 해결
Feb 12, 2026
9baf93d
Merge pull request #185 from DeviceLife-Official/fix/184-ear
H-un1 Feb 12, 2026
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
34 changes: 34 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Deploy

on:
push:
branches: ['develop']

jobs:
build:
runs-on: ubuntu-latest
container: pandoc/latex
steps:
- uses: actions/checkout@v2

- name: Install mustache (to update the date)
run: apk add ruby && gem install mustache

- name: creates output
run: sh ./build.sh

- name: Pushes to another repository
id: push_directory
uses: cpina/github-action-push-to-another-repository@main
env:
API_TOKEN_GITHUB: ${{ secrets.AUTO_ACTIONS }}
with:
source-directory: 'output'
destination-github-username: waldls
destination-repository-name: DeviceLife_Frontend
user-email: ${{ secrets.EMAIL }}
commit-message: ${{ github.event.commits[0].message }}
target-branch: develop

- name: Test get variable exported by push-to-another-repository
run: echo $DESTINATION_CLONED_DIRECTORY
43 changes: 43 additions & 0 deletions .github/workflows/preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Preview

on:
pull_request:
branches: ['develop']

jobs:
vercel-preview:
runs-on: ubuntu-latest

env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

steps:
- uses: actions/checkout@v4
- name: Install Vercel CLI
run: npm install --global vercel@latest && npm install --global pnpm
- name: Get Vercel Environment Variables
run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }}
- name: Build Project Artifacts
run: vercel build --token=${{ secrets.VERCEL_TOKEN }}
- name: Deploy Project Artifacts to Vercel
id: deploy

run: |

vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} > vercel-output.txt
echo "preview_url=$(cat vercel-output.txt)" >> $GITHUB_OUTPUT

- name: Comment PR with Preview URL
uses: thollander/actions-comment-pull-request@v2
with:
message: |
✅ PREVIEW ${{ steps.deploy.outputs.preview_url }}

permissions:
contents: read
pages: write
deployments: write
id-token: write
issues: write
pull-requests: write
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,5 @@ dist-ssr
*.sln
*.sw?
.env
.vercel
.env*.local
7 changes: 6 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.validate": ["typescript", "typescriptreact"]
"eslint.validate": ["typescript", "typescriptreact"],

"[typescript]": { "editor.formatOnSave": false },
"[typescriptreact]": { "editor.formatOnSave": false },

"prettier.prettierPath": "./node_modules/prettier"
}
117 changes: 62 additions & 55 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,75 +1,82 @@
# 📱Device Life - Frontend
> 수많은 디바이스 중 유저에게 최적의 조합을 제공하다
> 최적의 기기조합 웹 서비스
> UMC 9th Project - Client Repository

![KakaoTalk_20260212_224313434](https://github.com/user-attachments/assets/2deaa37b-9ce5-4c96-9201-beccaff84793)

## 📖 프로젝트 소개 (Project Overview)
이 저장소는 Device Life의 클라이언트 애플리케이션 코드를 관리합니다. 사용자가 직관적으로 기기를 탐색하고, 조합을 생성하며, 실시간으로 시각적인 평가 피드백을 받을 수 있는 UI/UX 구현에 집중합니다.
이 저장소는 최적의 기기 조합 추천 서비스 'Device Life'의 웹 클라이언트 코드를 관리합니다. 사용자가 수많은 스마트 기기 사이에서 자신에게 맞는 최적의 조합을 찾을 수 있도록, 직관적인 탐색 경험과 로직 기반의 실시간 평가 피드백을 제공하는 완성도 높은 UI/UX 구현에 집중합니다.

### ✨ 프론트엔드 핵심 기능 (Key Features)
* 조합 워크스페이스 UI: 기기 추가/삭제 시 부드러운 인터랙션 및 상태 관리 구현
* 실시간 평가 피드백: 생태계, 충전, 컬러 점수 데이터를 시각적 그래프나 수치로 즉시 렌더링
* 기기 탐색 및 필터 UI: 가격대 조절을 위한 Range Slider 컴포넌트 및 카테고리 칩 구현
* 라이프스타일 선택: 이미지 카드 및 브랜드 로고를 활용한 직관적인 사용자 입력 인터페이스
* 인터랙션: 내 조합 라이브러리의 스와이프 삭제 및 모달 애니메이션 처리
- 동적 유저 권한 및 GNB 렌더링: 로그인 유무 및 온보딩 상태에 따라 메뉴 구성과 접근 권한 제어
- 온보딩 플로우: 신규 유저를 위한 스플래시 화면, 라이프스타일 태그 선택, 첫 조합 생성으로 이어지는 단계별 폼 위저드 구현
- 다중 필터 기반 기기 탐색: 카테고리 칩, 단일/다중 체크박스 필터, 4가지 정렬 옵션을 조합한 검색 인터페이스 제공
- 조합 담기 시스템: 현재 선택된 조합 상태를 유지하며 중복 저장
- 라이프스타일 자동 로테이션: 유저 액션에 반응하여 정지/재생되는 시각적 태그 로테이션 및 기기 큐레이션 카드 구현
- 로직 기반 평가 리포트: 기기 간 연동성, 편의성, 라이프스타일 적합도 분석 내용을 마이페이지 내 한 줄 평가 리포트로 렌더링

---
## 🧑🏻‍💻 팀원 (Contributors)

| <img src="https://github.com/waldls.png" width="150" height="150"/> | <img src="https://github.com/Seony777.png" width="150" height="150"/> | <img src="https://github.com/H-un1.png" width="150" height="150"/> |
| :---------------------------------------------------------------: | :-----------------------------------------------------------------: | :---------------------------------------------------------------: |
| 박유민 <br/> [@waldls](https://github.com/waldls) | 이선우 <br/> [@Seony777](https://github.com/Seony777) | 임병훈 <br/> [@H-un1](https://github.com/H-un1) |
| **Frontend Lead** | **Frontend** | **Frontend** |

## 🛠️ 기술 스택 (Tech Stack)
| Category | Technology |
| :--- | :--- |
| **Language & Framework** | ![TypeScript](https://img.shields.io/badge/-TypeScript-3178C6?style=flat&logo=typescript&logoColor=white) ![React](https://img.shields.io/badge/-React-61DAFB?style=flat&logo=react&logoColor=black) ![Vite](https://img.shields.io/badge/-Vite-646CFF?style=flat&logo=vite&logoColor=white) |
| **Styling** | ![Tailwind CSS](https://img.shields.io/badge/-Tailwind%20CSS-38B2AC?style=flat&logo=tailwind-css&logoColor=white) |
| **State Management** | **Zustand** (Client), **TanStack Query** (Server) |
| **Data Fetching** | Axios, TanStack Query |
| **Tools** | ESLint, Prettier, npm |
| **DevOps** | Git, GitHub, Vercel |

---
## 🛠️ 기술 스택 (Tech Stack)

## 🌐 Git-flow 전략 (Git-flow Strategy)
| 역할 | 종류 | 선정 근거 |
| :-- | :-- | :-- |
| **Language & Framework** | ![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white) ![React](https://img.shields.io/badge/React-61DAFB?style=for-the-badge&logo=react&logoColor=black) ![Vite](https://img.shields.io/badge/Vite-646CFF?style=for-the-badge&logo=vite&logoColor=white) | TypeScript로 타입 안정성을 확보하고, React 기반 컴포넌트 UI를 구성했으며, Vite의 빠른 번들링과 HMR로 개발 생산성을 높였습니다. |
| **Styling** | ![TailwindCSS](https://img.shields.io/badge/Tailwind_CSS-06B6D4?style=for-the-badge&logo=tailwindcss&logoColor=white) | 유틸리티 기반 스타일링으로 빠르고 일관된 UI를 구현했습니다. |
| **UI Utilities** | ![SVGR](https://img.shields.io/badge/SVGR-FFB13B?style=for-the-badge&logo=svg&logoColor=black) ![clsx](https://img.shields.io/badge/clsx-000000?style=for-the-badge) | SVGR로 SVG를 React 컴포넌트로 관리해 재사용성을 높였고, clsx로 조건부 className 로직을 간결하게 처리했습니다. |
| **State Management** | ![Zustand](https://img.shields.io/badge/Zustand-000000?style=for-the-badge&logoColor=white) ![TanStack Query](https://img.shields.io/badge/TanStack_Query-FF4154?style=for-the-badge&logo=reactquery&logoColor=white) | Zustand로 클라이언트 상태를 간단히 관리하고, TanStack Query로 서버 상태/캐싱을 선언적으로 관리했습니다. |
| **Data Fetching** | ![Axios](https://img.shields.io/badge/Axios-5A29E4?style=for-the-badge&logo=axios&logoColor=white) ![TanStack Query](https://img.shields.io/badge/TanStack_Query-FF4154?style=for-the-badge&logo=reactquery&logoColor=white) | Axios로 HTTP 요청을 처리하고, TanStack Query로 요청 상태/캐싱/동기화 관리를 수행했습니다. |
| **Tools** | ![ESLint](https://img.shields.io/badge/ESLint-4B32C3?style=for-the-badge&logo=eslint&logoColor=white) ![Prettier](https://img.shields.io/badge/Prettier-F7B93E?style=for-the-badge&logo=prettier&logoColor=black) | ESLint로 코드 규칙을 통일하고, Prettier로 포맷을 자동화해 일관된 코드 스타일을 유지했습니다. |
| **DevOps** | ![Git](https://img.shields.io/badge/Git-F05032?style=for-the-badge&logo=git&logoColor=white) ![GitHub](https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white) ![Vercel](https://img.shields.io/badge/Vercel-000000?style=for-the-badge&logo=vercel&logoColor=white) | Git/GitHub로 버전 관리 및 협업을 진행하고, Vercel로 배포 자동화 및 CI/CD 과정을 간소화했습니다. |
| **Package Manager** | ![npm](https://img.shields.io/badge/npm-CB3837?style=for-the-badge&logo=npm&logoColor=white) | 표준 패키지 매니저(npm)를 사용하여 의존성 설치 및 관리를 수행했습니다. |
| **Validation** | ![Zod](https://img.shields.io/badge/Zod-3E67B1?style=for-the-badge&logo=zod&logoColor=white) | Zod로 API 응답 및 폼 입력 값을 스키마 기반으로 검증해 런타임 오류를 줄이고 타입 안정성을 강화했습니다. |
| **Collaboration** | ![Notion](https://img.shields.io/badge/Notion-000000?style=for-the-badge&logo=notion&logoColor=white) ![Figma](https://img.shields.io/badge/Figma-F24E1E?style=for-the-badge&logo=figma&logoColor=white) ![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white) | Notion을 통한 문서화와 프로젝트 자료 관리, Figma 기반 디자인 협업, Discord를 활용한 실시간 커뮤니케이션으로 팀 협업 효율을 높였습니다. |

* main: 최종적으로 사용자에게 배포되는 가장 안정적인 버전 브랜치
* develop: 다음 출시 버전을 개발하는 중심 브랜치. 기능 개발 완료 후 feature 브랜치들이 병합
* feature: 기능 개발용 브랜치. develop에서 분기하여 작업

---
## 📎 컨벤션 (Conventions)

- 🍃 [Commit Convention](https://www.notion.so/Commit-Convention-305c82f125c980898111df6891b25578?source=copy_link)
- 🪵 [Branch Convention](https://www.notion.so/Branch-Convention-305c82f125c980afaecfdc5b00ad1f71?source=copy_link)
- 💻 [Coding Convention](https://www.notion.so/Coding-Convention-2dac82f125c980a8810bca8fadbe8b5f?source=copy_link)
- 📢 [API Convention](https://www.notion.so/API-Convention-2e0c82f125c9805bb0c3c22fda770978?source=copy_link)
- 📌 [Issue Convention](https://www.notion.so/Issue-Convention-305c82f125c980029b7ce00b73962f66?source=copy_link)
- ✅ [PR Convention](https://www.notion.so/PR-Convention-305c82f125c9809e98ebe702534bf18a?source=copy_link)
- 📁 [Folder Structure Convention](https://www.notion.so/Folder-Structure-Convention-2d4c82f125c98112bd64d946da9d2f34?source=copy_link)

## 📌 브랜치 규칙 및 네이밍 (Branch Rules & Naming)
---

* 모든 기능 개발은 feature 브랜치에서 시작
* 작업 시작 전, 항상 최신 develop 내용 받아오기 (git pull origin develop)
* 작업 완료 후, develop으로 Pull Request(PR) 생성
* PR에 Reviewer(멘션) 지정 이후 머지
* 브랜치 이름 형식: feature/이슈번호-기능명
* 예시: feature/1-login-ui
## 🤝 그라운드 룰 (Ground Rules)

- **연락 자주 확인하기**
- 디스코드/카카오톡 알림을 자주 확인합니다.

- **적극적으로 의견 공유하기**
- 막히는 부분이나 변경 사항이 생기면 빠르게 공유합니다.

- **PR Merge 규칙**
- 기본적으로 전원 Approve 후 Merge하며, PR 작성자가 브랜치를 삭제합니다.
- 단, 여행 등 개인 일정으로 확인이 어려운 경우, 해당 인원을 제외한 팀원의 Approve로 Merge 가능합니다.

- **라이브러리 설치 공유**
- 작업 중 새로운 라이브러리를 설치한 경우, 디스코드 스레드에 댓글로 공유합니다.

- **Figma 수치 규칙**
- 디자이너님께서 별도로 안내한 경우를 제외하고, 가장 가까운 4의 배수로 스냅하여 적용합니다.

---

## 🎯 커밋 컨벤션 (Commit Convention)

### 주의 사항
* type은 소문자만 사용 (feat, fix, refactor, docs, style, test, chore)
* subject는 모두 현재형 동사

### 📋 타입 목록

| type | 설명 |
| :--- | :--- |
| start | 새로운 프로젝트를 시작할 때 |
| feat | 새로운 기능을 추가할 때 |
| fix | 버그를 수정할 때 |
| design | CSS 등 사용자 UI 디자인을 변경할 때 |
| refactor | 기능 변경 없이 코드를 리팩토링할 때 |
| settings | 설정 파일을 변경할 때 |
| comment | 필요한 주석을 추가하거나 변경할 때 |
| dependency/Plugin | 의존성/플러그인을 추가할 때 |
| docs | README.md 등 문서를 수정할 때 |
| merge | 브랜치를 병합할 때 |
| deploy | 빌드 및 배포 관련 작업을 할 때 |
| rename | 파일 혹은 폴더명을 수정하거나 옮길 때 |
| remove | 파일을 삭제하는 작업만 수행했을 때 |
| revert | 이전 버전으로 롤백할 때 |

### ✨ 예시
* feat: 컴포넌트 추가
* fix: 가려짐 현상 해결
## 📰 아티클 모음 (Articles)

| 이름 | 아티클 제목 |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 🍒 박유민 | [상태 기반 인터랙션 구현기](https://velog.io/@waldls/Frontend-%EC%83%81%ED%83%9C-%EA%B8%B0%EB%B0%98-%EC%9D%B8%ED%84%B0%EB%9E%99%EC%85%98-%EA%B5%AC%ED%98%84%EA%B8%B0) |
| 🍀 이선우 | [Device Life Auth 시스템 구현 회고](https://www.notion.so/Device-Life-Auth-305564e055eb8007a616fde7ddb853d7?source=copy_link) |
4 changes: 4 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
cd ../
mkdir output
cp -R ./Frontend/* ./output
cp -R ./output ./Frontend/
21 changes: 19 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,26 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link rel="icon" type="image/svg+xml" href="/devicelife.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>DeviceLife</title>
<title>Device Life</title>
<meta name="description" content="나에게 딱 맞는 최적의 기기 조합을 찾아보세요" />

<meta property="og:type" content="website" />
<meta property="og:site_name" content="Device Life" />
<meta property="og:title" content="Device Life" />
<meta property="og:description" content="나에게 딱 맞는 최적의 기기 조합을 찾아보세요" />
<meta property="og:url" content="https://devicelife.site" />
<meta property="og:image" content="https://devicelife.site/og-thumbnail.png" />

<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Device Life" />
<meta name="twitter:description" content="나에게 딱 맞는 최적의 기기 조합을 찾아보세요" />
<meta name="twitter:image" content="https://devicelife.site/og-thumbnail.png" />

<meta property="kakao:title" content="Device Life" />
<meta property="kakao:description" content="나에게 딱 맞는 최적의 기기 조합을 찾아보세요" />
<meta property="kakao:image" content="https://devicelife.site/og-thumbnail.png" />
</head>
<body>
<div id="root"></div>
Expand Down
Loading