Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
167 commits
Select commit Hold shift + click to select a range
5972f15
feat: user model 새로 만들기
nuk0325 Mar 11, 2026
e0e65aa
feat: challenge base model 새로 만들기
nuk0325 Mar 12, 2026
0e75575
feat: home challenge card model 새로 만들기
nuk0325 Mar 12, 2026
58343a5
refactor: model 폴더이름 models로 변경
nuk0325 Mar 12, 2026
dca08fb
refactor: 기존 user_model.dart에 인덱스 추가
nuk0325 Mar 12, 2026
4966790
refactor: models 폴더 이름 변경 사항 적용
nuk0325 Mar 12, 2026
04c0b2f
refactor: 모델 설명 주석 추가
nuk0325 Mar 12, 2026
31dc741
refactor: 기존 ChallengeMainModel에 인덱스 추가
nuk0325 Mar 12, 2026
3db7cf8
feat: rankCard model 새로 만들기
nuk0325 Mar 12, 2026
5bb09e5
refactor: 기존 ranking model에 인덱스 추가
nuk0325 Mar 12, 2026
89bd16a
feat: post model 만들기
nuk0325 Mar 12, 2026
e9c6745
feat: post model에 인증글 id 필드 추가
nuk0325 Mar 12, 2026
95b5d51
feat: comment model 만들기
nuk0325 Mar 12, 2026
9cdf653
refactor: 기존 challenge_model.dart 파일에 인덱스 추가
nuk0325 Mar 12, 2026
bf5352e
refactor: feed/model -> feed/models 로 이름 수정
nuk0325 Mar 12, 2026
9fcc11e
feat: 소셜 화면 user search card model 만들기
nuk0325 Mar 12, 2026
0c9d46d
refactor: 기존 social_model.dart 파일에 인덱스 추가
nuk0325 Mar 12, 2026
788266a
refactor: social/model -> social/models 로 폴더 이름 변경
nuk0325 Mar 12, 2026
e8120c1
feat: FriendRequestCard model 새로 만들기
nuk0325 Mar 12, 2026
44671f5
refactor: 기존 social_model.dart에 인덱스 추가
nuk0325 Mar 12, 2026
41c5c48
feat: SearchChallengeCard model 새로 만들기
nuk0325 Mar 14, 2026
ebcd2d8
refactor: 기존 모델에 인덱스 추가
nuk0325 Mar 14, 2026
3ed4d6b
refactor: ChallengeBase 모델 shared/models 폴더로 이동
nuk0325 Mar 14, 2026
59618c8
refactor: HomeChallengeCard 모델 shared/models 폴더로 이동
nuk0325 Mar 14, 2026
3bf47da
refactor: ChallengeBase 참조 주소 변경
nuk0325 Mar 14, 2026
9a763d8
feat: 새로운 MyPageChallengeCard 모델 만들기
nuk0325 Mar 14, 2026
e416cc0
feat: invite challenge card 모델 생성
nuk0325 Mar 14, 2026
5dcdbca
refactor: user/model -> user/models로 변경
nuk0325 Mar 14, 2026
03677ff
refactor: user/model -> user/models로 변경
nuk0325 Mar 14, 2026
cdc46b0
refactor: 기존 모델에 인덱스 추가
nuk0325 Mar 14, 2026
e47b67e
refactor: user/model -> user/models로 변경
nuk0325 Mar 14, 2026
fe0e8b9
feat: ChallengeDetail 모델 생성
nuk0325 Mar 14, 2026
b114eec
refactor: 기존 모델에 인덱스 추가
nuk0325 Mar 14, 2026
c1ad050
refactor: 챌린지 id값 int로 변경
nuk0325 Mar 14, 2026
efeb823
refactor: 새로운 notification model 연결
nuk0325 Mar 14, 2026
f9f541c
refactor: home화면 ChallengeCard 위젯 분리
nuk0325 Mar 14, 2026
b368fcf
Merge pull request #57 from GrowthPlusPlus/refactor-model-define
binii0124 Mar 14, 2026
b9869fa
refactor: 새 소셜 모델 적용 및 소셜 기능 전면 리팩토링
binii0124 Mar 14, 2026
11edb82
refactor: 프로필 원형 위젯 분리
binii0124 Mar 14, 2026
6443b1c
refactor: 프로필 원형 위젯 분리2
binii0124 Mar 14, 2026
a137e89
refactor: 유저 목록 타일 템플릿 생성 및 리팩토링
binii0124 Mar 14, 2026
68baaed
fix: 보낸요청 카드 '대기중' 표시 삭제
binii0124 Mar 14, 2026
794c9a4
refactor: 토스트메세지 코드 파일 shared/widgets 로 이동
binii0124 Mar 14, 2026
22e1e3a
refactor: 검색창 위젯 분리 리팩토링
binii0124 Mar 14, 2026
01752e7
feat: 받은 요청 뷰 스크롤 새로고침 기능 추가
binii0124 Mar 14, 2026
e280e0f
fix: 유저 모델 수정 및 친구추가, 편집페이지 뒤로가기 오류 수정
binii0124 Mar 15, 2026
fad45cb
Merge pull request #58 from GrowthPlusPlus/refactor-social-refactor
nuk0325 Mar 15, 2026
e21a420
refactor: 프로필 편집 스크린에서 비즈니즈 로직 분리, 챌린지 카드 UI 통합 분리
binii0124 Mar 15, 2026
34695aa
refactor: 컬러코드 표기법 변경
binii0124 Mar 15, 2026
e6c2607
refactor: 마이페이지 메인화면에서 챌린지 섹션 view, 설정메뉴 view 분리
binii0124 Mar 15, 2026
3dd5120
refactor: 마이페이지 관련 스크린 코드 파일들 폴더 이동
binii0124 Mar 15, 2026
63eb93a
refactor: 마이페이지스크린 공용 프로필 원형 위젯 적용
binii0124 Mar 15, 2026
6bdfe1b
refactor: 파일이름변환 적용 및 컬러코드 수정
binii0124 Mar 15, 2026
97e6049
feat: 앱 배포
Chaeyeonggg Mar 19, 2026
9d7ce6b
chore: refactor 브랜치 병합 및 충돌 해결
Chaeyeonggg Mar 19, 2026
d1a35f7
feat: ChallengeCard의 isLeader 변수 제외하고 모델 연결 완료
nuk0325 Mar 19, 2026
ef8f269
refactor: 전역 유저 상태 관리 도입
Chaeyeonggg Mar 19, 2026
65fe766
Merge pull request #59 from GrowthPlusPlus/refactor-user-provider
nuk0325 Mar 19, 2026
49e11ee
chore: merge한 거 가져오기
nuk0325 Mar 19, 2026
d5ba32f
feat: 챌린지 카드 디자인 수정 사항 반영
nuk0325 Mar 19, 2026
43f8270
Merge branch 'refactor' into refactor-home-screen
nuk0325 Mar 19, 2026
52de5a3
Merge pull request #60 from GrowthPlusPlus/refactor-home-screen
Chaeyeonggg Mar 19, 2026
2daf0af
feat: 탭 바 공유 위젯 생성
nuk0325 Mar 20, 2026
959ccfc
refactor: challengeMainScreen에 공유 탭 바 연결
nuk0325 Mar 20, 2026
9b30968
feat:카카오 로그인 구현
Chaeyeonggg Mar 20, 2026
a54c030
Merge remote-tracking branch 'origin/refactor' into refactor-user-pro…
Chaeyeonggg Mar 20, 2026
b3fc0d1
refactor: post.dart 파일 shared/models로 이동
nuk0325 Mar 20, 2026
398698b
refactor: id int타입으로 변경
nuk0325 Mar 20, 2026
50ffae5
feat: calendar_grid 위젯 생성
nuk0325 Mar 20, 2026
4fd83f1
feat: 연속 일수 넘겨주기 추가
nuk0325 Mar 20, 2026
3d17342
feat: 내 현황용 CalendarPost model 생성
nuk0325 Mar 20, 2026
8290044
refactor: model 폴더 이름 models로 변경
nuk0325 Mar 20, 2026
682f806
refactor: 캘린더 화면용 CalendarPostCard 위젯 생성
nuk0325 Mar 20, 2026
a4e2884
refactor: challenge_invite_card에 invite_challenge_card 모델 연결
nuk0325 Mar 23, 2026
1cf4b84
feat: 수정된 API에 맞게 invite_challenge_card 모델 수정
nuk0325 Mar 23, 2026
fa01d6c
feat: calendar_post 모델 생성
nuk0325 Mar 23, 2026
16308fa
refactor: ranking_model.dart 폴더 이동
nuk0325 Mar 23, 2026
598a68d
refactor: ranking model 경로 변경
nuk0325 Mar 23, 2026
03e4011
refactor: search challenge card 모델 dDay int값으로 변경
nuk0325 Mar 23, 2026
aa6897d
refactor: 챌린지 초대 카드 dDay 표현 수정
nuk0325 Mar 23, 2026
c1e609c
fix: dDay 표현 오류 수정
nuk0325 Mar 23, 2026
3d7c60a
fix: challenge invite card 디자인대로 다시 수정
nuk0325 Mar 23, 2026
0efd460
Merge pull request #62 from GrowthPlusPlus/refactor-notification
Chaeyeonggg Mar 24, 2026
d40e45f
Merge branch 'refactor' into refactor-challenge-detail
nuk0325 Mar 26, 2026
3ab8b2d
feat: ChallengeMainScreen에 streakCount 추가
nuk0325 Mar 26, 2026
ea5ce29
calendar_grid 위젯 수정
nuk0325 Mar 26, 2026
8be4f79
fix: 홈 화면 챌린지 카드 오류 수정
nuk0325 Mar 26, 2026
1dd4d4b
feat: 연속 일수, 총 인증 횟수 제공하는 프로바이더도 생성
nuk0325 Mar 26, 2026
41f8535
feat: 주석 추가하고 필요없는 import 제거
nuk0325 Mar 26, 2026
af27370
refactor: 챌린지 인증하기, 상세 화면 연결
nuk0325 Mar 26, 2026
8cc0021
chore: refactor 합치기 전 현재 상태 저장
Chaeyeonggg Mar 27, 2026
8ce49e5
Merge remote-tracking branch 'origin/refactor' into refactor-user-pro…
Chaeyeonggg Mar 27, 2026
e1a8e94
refactor: 카카오 로그인 구현 및 User와 UserDetail 모델 분리
Chaeyeonggg Mar 28, 2026
830a843
Merge remote-tracking branch 'origin/refactor-my-page' into refactor-…
Chaeyeonggg Mar 28, 2026
c36e734
Merge pull request #63 from GrowthPlusPlus/refactor-user-provider
binii0124 Apr 1, 2026
6276da6
fix: 모델정비 - id 타입 int로 수정
binii0124 Apr 1, 2026
35827de
feat: refactor 브랜치 풀
nuk0325 Apr 1, 2026
b826a11
fix: json에 맞게 모델 수정
binii0124 Apr 1, 2026
1800b6f
fix: 새 피드 모델 적용
binii0124 Apr 1, 2026
1bbbb12
fix: 피드 포스트 카드 키값 새 모델로 적용
binii0124 Apr 1, 2026
1bcd6a0
fix: 피드 관련 레포지토리, 프로바이더 챌린지에서 분리
binii0124 Apr 1, 2026
37a49b3
fix: 피드 관련 새 모델, 프로바이더 관련 외부 코드 수정/ 피드팝업메뉴 이름 변경, 위치 수정
binii0124 Apr 1, 2026
99f98aa
feat: 카메라 권한 추가
nuk0325 Apr 2, 2026
4098a4c
feat: 전역 헨들러 추가
nuk0325 Apr 2, 2026
26e9fee
refactor: 소개 탭 참조 파일 수정, DetailContent 모델에 base는 필요 없어서 삭제
nuk0325 Apr 2, 2026
9e2b343
feat: 디버깅 코드 추가
nuk0325 Apr 2, 2026
969c87d
refactor: API 필드명 추가
nuk0325 Apr 2, 2026
ca32b68
feat: 더 이상 안 쓸 image_model 주석 추가
nuk0325 Apr 2, 2026
c5f0a13
feat: 디버깅 코드 추가
nuk0325 Apr 2, 2026
d80f393
refactor: API 형식에 맞게 post 모델 수정, 기존 image 모델 참조 제거
nuk0325 Apr 2, 2026
46d8199
feat: 인증글 생성, 수정시 provider 캐시 갱신 공통 함수 추가
nuk0325 Apr 2, 2026
aac74cb
refactor: 챌린지 인증 참조 수정, 내부 로직 Provider로 이동
nuk0325 Apr 2, 2026
260db19
feat: 기타 수정
nuk0325 Apr 2, 2026
5d33e78
merge: refactor 브랜치 머지, 충돌 해결
nuk0325 Apr 2, 2026
177b93b
refactor: 챌린지 생성 리팩토링
Chaeyeonggg Apr 2, 2026
5f94d7f
Merge pull request #64 from GrowthPlusPlus/refactor-user-provider
nuk0325 Apr 2, 2026
4fd54a6
refactor: 댓글, 댓글작성란 위젯 분리 리팩토링
binii0124 Apr 6, 2026
eead793
refactor: 프로필 & 나의 챌린지 리팩토링
Chaeyeonggg Apr 6, 2026
506a36b
Merge pull request #65 from GrowthPlusPlus/refactor-user-provider
nuk0325 Apr 6, 2026
7a016ae
Merge branch 'refactor' of https://github.com/GrowthPlusPlus/FrontEnd…
nuk0325 Apr 6, 2026
712496b
chore: 피드 디자인 패딩 간격 수정
binii0124 Apr 6, 2026
76afe33
merge: 변경사항 머지
nuk0325 Apr 28, 2026
576cecf
feat: 챌린지 생성 provider, repository 분리
nuk0325 Apr 28, 2026
65a3d7f
feat: tag model 기존 모델과 병합
nuk0325 Apr 28, 2026
72964da
fix: 챌린지 소개 날짜 계산 로직 수정
nuk0325 Apr 28, 2026
1aedb2e
refactor: 사용 안 하는 임포트 파일 정리
nuk0325 Apr 28, 2026
b3cab05
refactor: baseurl 변경
Chaeyeonggg May 5, 2026
c2fcc04
feat: 신고 페이지 ui 구현
binii0124 May 5, 2026
c1b3147
Merge pull request #66 from GrowthPlusPlus/refactor-change-baseurl
binii0124 May 6, 2026
b176085
Merge remote-tracking branch 'origin/refactor' into feature/report
binii0124 May 6, 2026
91d4fcd
fix: api 경로 수정
binii0124 May 7, 2026
d1107bd
feat: 댓글, 인증글 신고 api 연결
binii0124 May 7, 2026
f2446f5
docs: 주석 수정
binii0124 May 7, 2026
1d29964
fix: ReportController 상태 업데이트 주석 처리 및 ReportScreen 내 기타 사유 키 수정
binii0124 May 7, 2026
04c0575
feat: 통계 페이지 3개 위젯 구현
Chaeyeonggg May 7, 2026
3fc5176
Merge pull request #67 from GrowthPlusPlus/feat/statistics
binii0124 May 8, 2026
cdb32fa
fix: 기타 항목 키값 오타 수정
binii0124 May 8, 2026
9d228b8
Merge pull request #68 from GrowthPlusPlus/feature/report
Chaeyeonggg May 10, 2026
f6586c4
refactor: 많은 것들... 커밋 못해서 죄송합니다
nuk0325 May 11, 2026
1a1f436
feat: refactor 브랜치 머지
nuk0325 May 11, 2026
9af9091
feat: refactor 브랜치 머지
nuk0325 May 13, 2026
3d3348e
Merge pull request #69 from GrowthPlusPlus/refactor-challenge-detail
binii0124 May 13, 2026
f92b1d6
임시 저장
Chaeyeonggg May 13, 2026
90816a6
fix: 회원가입 창으로 강제이동하는 문제 해결 - 로그인 창으로 이동하도록 함
binii0124 May 13, 2026
3f45a58
feat: dotenv를 이용한 환경 변수 관리 적용 및 의존성 업데이트
binii0124 May 13, 2026
78d214c
feat: 네이버 로그인 구현
binii0124 May 13, 2026
30eb8b1
Merge pull request #70 from GrowthPlusPlus/feature/naver-login
nuk0325 May 14, 2026
25d3348
feat: pull origin branch
nuk0325 May 14, 2026
3483613
Merge branch 'refactor' of https://github.com/GrowthPlusPlus/FrontEnd…
nuk0325 May 14, 2026
92b8e92
feat: pull origin branch
nuk0325 May 14, 2026
27b85fa
feat:AI 추천 기능 및 UI 수정 완료
Chaeyeonggg May 14, 2026
3f50f26
merge: 네이버 로그인 코드 병합 완료
Chaeyeonggg May 14, 2026
be24a66
fix: 피드 인증글 팝업 수정하기 안 뜨는 오류 해결
nuk0325 May 14, 2026
6a9ee38
refactor: 안 쓰는 파일 삭제
nuk0325 May 18, 2026
6177638
fix: api에서 title값을 주기 때문에 프론트에서 title값을 만드는 로직은 삭제
nuk0325 May 18, 2026
16061d1
feat: 챌린지 상세정보 페이지 연결
nuk0325 May 18, 2026
8e81319
refactor: 경로 및 임포트 수정
nuk0325 May 18, 2026
0ca79a7
refactor: 경로 수정
nuk0325 May 19, 2026
a977178
refactor: 알림 설정 페이지 경로 수정
nuk0325 May 19, 2026
a579458
feat: 전체 알림 토글 로직 수정
nuk0325 May 19, 2026
7c18e87
feat: 전체 알림 토글 로직 수정
nuk0325 May 19, 2026
1b51d3a
Merge pull request #71 from GrowthPlusPlus/fix-feed
binii0124 May 19, 2026
32bc1c0
Merge branch 'refactor' into fix-notification-setting
Chaeyeonggg May 20, 2026
bde2ae4
Merge pull request #73 from GrowthPlusPlus/fix-notification-setting
Chaeyeonggg May 20, 2026
989dfd9
merge: 최신 refactor PR 내용 반영 및 pubspec.lock 충돌 해결
Chaeyeonggg May 20, 2026
7bac60c
fix: 타임스탬프 이슈 해결
Chaeyeonggg May 20, 2026
1bfb712
fix: env 제외
Chaeyeonggg May 21, 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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,5 @@ app.*.map.json
/android/app/debug
/android/app/profile
/android/app/release

.env
25 changes: 20 additions & 5 deletions .metadata
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.

version:
revision: "a402d9a4376add5bc2d6b1e33e53edaae58c07f8"
revision: "b45fa18946ecc2d9b4009952c636ba7e2ffbb787"
channel: "stable"

project_type: app
Expand All @@ -13,11 +13,26 @@ project_type: app
migration:
platforms:
- platform: root
create_revision: a402d9a4376add5bc2d6b1e33e53edaae58c07f8
base_revision: a402d9a4376add5bc2d6b1e33e53edaae58c07f8
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: android
create_revision: a402d9a4376add5bc2d6b1e33e53edaae58c07f8
base_revision: a402d9a4376add5bc2d6b1e33e53edaae58c07f8
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: ios
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: linux
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: macos
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: web
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: windows
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787

# User provided section

Expand Down
29 changes: 20 additions & 9 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<!-- 카메라 -->
<uses-permission android:name="android.permission.CAMERA"/>

<application
android:label="해냄"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true"
android:enableOnBackInvokedCallback="false">

<activity
Expand Down Expand Up @@ -41,8 +45,9 @@
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</intent-filter></activity>

<activity android:name="net.openid.appauth.RedirectUriReceiverActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
Expand All @@ -51,18 +56,18 @@
<data
android:scheme="com.googleusercontent.apps.433865217738-m3uqqdv9lumpf1ne8e3bkpsbtsa6919i"
android:host="oauth2redirect" />
</intent-filter></activity>

<activity android:name="com.kakao.sdk.flutter.AuthCodeCustomTabsActivity">
<intent-filter android:label="flutter_web_auth">
</intent-filter>
<!-- 카카오 로그인 (웹뷰 콜백) -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="kakao05a36f172ea2945260862834654385ea" android:host="oauth" />
<data
android:scheme="http"
android:host="158.247.216.11:8080"
android:pathPrefix="/oauth/kakao/callback" />
</intent-filter>
</activity>

<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
Expand All @@ -75,10 +80,16 @@

In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<package android:name="com.kakao.talk" />
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="kakaotalk" />
</intent>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
<package android:name="com.example.haenaem" />
</queries>
</manifest>
</manifest>
4 changes: 4 additions & 0 deletions assets/images/icons/gray_line_graph_icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions assets/images/icons/green_line_graph_icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed assets/images/profiles/user1.png
Binary file not shown.
Binary file removed assets/images/profiles/user2.png
Binary file not shown.
Binary file removed assets/images/profiles/user3.png
Binary file not shown.
5 changes: 5 additions & 0 deletions ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@
</array>
</dict>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSCameraUsageDescription</key>
<string>프로필 사진 촬영을 위해 카메라 권한이 필요합니다.</string>
<key>NSPhotoLibraryUsageDescription</key>
Expand Down
6 changes: 3 additions & 3 deletions lib/app.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// 최초 작성자: 김채영

import 'package:flutter/material.dart';
import 'package:haenaem/features/social/screens/social_screen.dart';
import 'package:haenaem/features/social/screens/social_main_screen.dart';
import 'features/challenge/create/screens/challenge_create_screen.dart';
import 'features/user/screens/my_page_screen.dart';
import 'features/user/screens/my_page_main_screen.dart';
import 'features/main/screens/main_screen.dart';

class App extends StatelessWidget {
Expand All @@ -13,7 +13,7 @@ class App extends StatelessWidget {
Widget build(BuildContext context) {
return const MaterialApp(
// theme:,
home: MyPageScreen(),
home: MyPageMainScreen(),
//home: MainScreen(),
//home: SocialScreen(),
);
Expand Down
52 changes: 44 additions & 8 deletions lib/core/network/dio_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ part 'dio_provider.g.dart';
Dio dio(DioRef ref) {
final dio = Dio(
BaseOptions(
baseUrl: 'https://hanaem.onrender.com/',
connectTimeout: const Duration(seconds: 45),
receiveTimeout: const Duration(seconds: 45),
baseUrl: 'http://158.247.216.11:8080',
connectTimeout: const Duration(seconds: 5),
),
);

Expand All @@ -24,18 +23,55 @@ Dio dio(DioRef ref) {
onRequest: (options, handler) async {
const storage = FlutterSecureStorage();
final String? token = await storage.read(key: 'accessToken');
// 💡 [디버깅 로그] 저장소에서 꺼낸 생생한 토큰 상태를 확인합니다.
debugPrint('🕵️‍♂️ [Interceptor] Storage Read (accessToken): $token');
if (token != null) {
options.headers['Authorization'] = 'Bearer $token';
}
return handler.next(options);
},
onError: (DioException e, handler) async {
if (e.response?.statusCode == 401) {
final newToken = await AuthService.refreshTokens();
if (newToken != null) {
e.requestOptions.headers['Authorization'] = 'Bearer $newToken';
final response = await dio.fetch(e.requestOptions);
return handler.resolve(response);
const storage = FlutterSecureStorage();
final refreshToken = await storage.read(key: 'refreshToken');
if (refreshToken != null) {
try {
// 🎯 토큰 갱신 전용 가벼운 Dio 생성 (인터셉터 없음)
final refreshDio = Dio(
BaseOptions(baseUrl: e.requestOptions.baseUrl),
);

final response = await refreshDio.post(
'/api/token',
data: {"refreshToken": refreshToken},
);

// 1. 서버 응답에서 새 토큰 추출 (백엔드 응답 키값에 맞게 수정하세요)
final newAccessToken = response.data['accessToken'];
final newRefreshToken = response.data['refreshToken'];

// 2. 새 토큰 스토리지에 저장
await storage.write(key: 'accessToken', value: newAccessToken);
if (newRefreshToken != null) {
await storage.write(
key: 'refreshToken',
value: newRefreshToken,
);
}

// 3. 실패했던 원래 요청의 헤더를 새 토큰으로 변경
e.requestOptions.headers['Authorization'] =
'Bearer $newAccessToken';

// 4. 원래 요청 재시도 및 결과 반환
final retryResponse = await dio.fetch(e.requestOptions);
return handler.resolve(retryResponse);
} catch (err) {
// 재발급 실패 시: 토큰 찌꺼기 삭제
debugPrint("재발급 실패! 저장된 토큰 삭제");
await storage.deleteAll();
return handler.next(e);
}
}
}
return handler.next(e);
Expand Down
2 changes: 1 addition & 1 deletion lib/core/network/dio_provider.g.dart

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

7 changes: 4 additions & 3 deletions lib/core/theme/app_colors.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,17 @@ class AppColors {
static const Color gray2 = Color(0xFF616161);
static const Color gray3 = Color(0xFF8c8c8c);
static const Color gray4 = Color(0xFFD9D9D9);
static final Color gray5 = const Color(0xFFd9d9d9).withValues(alpha: 0.5);
static const Color gray5 = Color(0x7Fd9d9d9);
//static final Color gray5 = const Color(0xFFd9d9d9).withValues(alpha: 0.5);

// Green - primary
static const Color primaryAble = Color(0xff009951);
static const Color selected = Color(0xffe8f5e9);
static const Color disable = Color(0xffd9e0d7);

// Mainlist
static Color success = const Color(0xffbbf4bd).withValues(alpha: 0.5);
static Color warning = const Color(0xffffd6c8).withValues(alpha: 0.5);
static const success = Color(0x7fbbf4bd);
static const warning = Color(0x7fffd6c8);

static const Color fire = Color(0xFFFB7039);
static const Color notification = Color(0xffD11E1B);
Expand Down
11 changes: 11 additions & 0 deletions lib/core/theme/app_theme.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
// 최초 작성자: 김채영

import 'package:flutter/material.dart';
import 'app_colors.dart';

class AppTheme {
static ThemeData lightTheme = ThemeData(
useMaterial3: true,
fontFamily: 'Pretendard',
scaffoldBackgroundColor: Colors.white,

// 스피너랑 커서 우리 앱 초록색으로 변경
progressIndicatorTheme: const ProgressIndicatorThemeData(
color: AppColors.primaryAble,
),
textSelectionTheme: TextSelectionThemeData(
cursorColor: AppColors.primaryAble,
selectionHandleColor: AppColors.primaryAble,
selectionColor: AppColors.primaryAble.withValues(alpha: 0.3),
),

// 상단 AppBar 테마 설정
appBarTheme: const AppBarTheme(
backgroundColor: Colors.white,
Expand Down
36 changes: 36 additions & 0 deletions lib/core/utils/image_utils.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// 최초 작성자: 김채영
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:path_provider/path_provider.dart';

// 클라우더리 용량 이슈 때문에 필요한 인증글의 이미지 압축 유틸 함수
Future<File> compressImageFile(File file) async {
final tempDir = await getTemporaryDirectory();
final targetPath =
'${tempDir.path}/compressed_${DateTime.now().millisecondsSinceEpoch}.jpg';

final XFile? result = await FlutterImageCompress.compressAndGetFile(
file.absolute.path,
targetPath,
quality: 80, // 80 정도면 육안상 차이 거의 없음
minWidth: 1080, // 긴 쪽 기준 최대 해상도
minHeight: 1080,
format: CompressFormat.jpeg,
);

// ✅ 압축 전후 크기 비교 로그
final int originalSize = await file.length();
final int compressedSize = result != null
? await File(result.path).length()
: 0;

debugPrint('🖼️ 압축 전: ${(originalSize / 1024).toStringAsFixed(1)} KB');
debugPrint('🖼️ 압축 후: ${(compressedSize / 1024).toStringAsFixed(1)} KB');
debugPrint(
'🖼️ 압축률: ${((1 - compressedSize / originalSize) * 100).toStringAsFixed(1)}%',
);

return result != null ? File(result.path) : file; // 실패 시 원본 반환
}
Loading