Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ struct NotificationView: View {
@State private var viewModel = NotificationSettingViewModel()

var body: some View {
VStack(alignment: .leading) {
VStack(alignment: .leading, spacing: 12) {
MyPageHeader(title: "알림 설정")
.padding(.bottom, 4)

startAlert

Expand All @@ -26,7 +27,8 @@ struct NotificationView: View {

Spacer()
}
.padding()
.padding(.horizontal, 32)
.padding(.vertical, 16)
.task {
viewModel.fetchSettings()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ struct PersonalizationView: View {
@State private var showResetAlert = false

var body: some View {
VStack(alignment: .leading) {
VStack(alignment: .leading, spacing: 16) {
MyPageHeader(title: "개인화 학습")
.padding([.horizontal, .top])
.padding(.horizontal, 32)
ScrollView {
VStack(alignment: .leading) {
VStack(alignment: .leading, spacing: 12) {
ToggleBox(
title: "사용자 행동 수집",
sub: "사용자의 행동을 학습하여\n 더 정확한 예측을 제공합니다",
Expand Down Expand Up @@ -79,9 +79,10 @@ struct PersonalizationView: View {
GuideBoxView(title: "학습 데이터 안내", description: "• 이동 패턴이 학습되어 더 정확한 예측이 가능합니다\n• 사용자 수정 내역도 자동으로 학습됩니다\n• 모든 데이터는 기기 내에 안전하게 저장됩니다")
.padding(.bottom, 80)
}
.padding()
.padding(.horizontal, 32)
}
}
.padding(.vertical,16)
.task {
async let _ = viewModel.loadSetting()
async let _ = viewModel.loadStatistics()
Expand Down
90 changes: 48 additions & 42 deletions TAMINGO/Features/MyPage/Setting/SettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,57 +15,63 @@ struct SettingsView: View {
@State private var showWithdrawAlert = false

var body: some View {
VStack(alignment: .leading) {
VStack(alignment: .leading, spacing: 16) {
MyPageHeader(title: "설정")
.padding([.horizontal, .top])
.padding(.horizontal, 32)

ScrollView {
// 앱 정보
SectionContainerView(title: "앱 정보") {
SettingCard(title: "버전 정보", sub: viewModel.appVersion) {
print("버전 정보 탭")
VStack(alignment: .leading, spacing: 12){
// 앱 정보
SectionContainerView(title: "앱 정보") {
SettingCard(title: "버전 정보", sub: viewModel.appVersion) {
print("버전 정보 탭")
}
SettingCard(title: "업데이트 확인", sub: "최신 버전", subColor: .mainMint) {
print("업데이트 확인 탭")
}
SettingCard(title: "오픈소스 라이선스") {
print("오픈소스 라이선스 탭")
}
Comment on lines +27 to +34
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

"업데이트 확인"의 sub 텍스트 "최신 버전"이 하드코딩되어 있습니다

현재는 실제 버전 비교 없이 항상 "최신 버전"을 표시합니다. 사용자에게 잘못된 정보를 줄 수 있는 UI입니다. viewModel.appVersion을 실제 앱스토어 최신 버전과 비교하는 로직이 연결되기 전까지는 빈 문자열이나 다른 상태 표시로 대체하는 것을 권장합니다.

🛡️ 임시 처리 제안
-SettingCard(title: "업데이트 확인", sub: "최신 버전", subColor: .mainMint) {
+SettingCard(title: "업데이트 확인", sub: viewModel.updateStatus) {
     print("업데이트 확인 탭")
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@TAMINGO/Features/MyPage/Setting/SettingsView.swift` around lines 27 - 34, The
SettingCard for "업데이트 확인" currently hardcodes sub: "최신 버전"; change it to a
non-misleading placeholder (e.g., empty string or "확인 중") until actual
version-comparison logic is implemented. Locate the SettingCard invocation
(SettingCard(title: "업데이트 확인", sub: ...)) in SettingsView and replace the
literal "최신 버전" with a safe default or viewModel-provided state (e.g., use
viewModel.appVersion or an empty string/placeholder) so the UI doesn't claim the
app is up-to-date prematurely.

Comment on lines +29 to +34
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

신규 메뉴 항목들의 print 플레이스홀더 액션이 남아 있습니다

"업데이트 확인", "오픈소스 라이선스", "서비스 이용약관", "개인정보 처리방침", "위치 정보 이용약관", "의견 보내기" 모두 print(...) 만 실행합니다. 릴리즈 빌드에서도 동작 없는 버튼이 노출됩니다.

실제 네비게이션(NavigationLink, UIApplication.shared.open(_:) 등) 또는 TODO 주석으로 대체를 권장합니다.

추적 이슈로 등록하거나, 각 항목별 네비게이션 로직을 구현하는 초안이 필요하시면 도움드릴 수 있습니다.

Also applies to: 51-68

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@TAMINGO/Features/MyPage/Setting/SettingsView.swift` around lines 29 - 34, The
SettingCard instances in SettingsView.swift currently use print(...)
placeholders (e.g., the "업데이트 확인" and "오픈소스 라이선스" SettingCard actions and others
like "서비스 이용약관", "개인정보 처리방침", "위치 정보 이용약관", "의견 보내기") — replace each print call
with an appropriate real navigation/action: use NavigationLink for in-app
screens (e.g., license or settings detail), call UIApplication.shared.open(_:)
for external URLs (terms/privacy/location), or if the implementation is pending
add a clear TODO comment (e.g., // TODO: implement navigation for "업데이트 확인") so
no inert print remains in release builds; update the closures attached to
SettingCard to perform the chosen action and keep identifiers like SettingCard
and the title strings to locate each item.

}
SettingCard(title: "업데이트 확인", sub: "최신 버전", subColor: .mainMint) {
print("업데이트 확인 탭")
}
SettingCard(title: "오픈소스 라이선스") {
print("오픈소스 라이선스 탭")
}
}
.padding(.top)

// 계정
SectionContainerView(title: "계정") {
SettingCard(title: "로그아웃") {
showLogoutAlert = true
}
SettingCard(title: "회원 탈퇴", isRed: true) {
showWithdrawAlert = true
}
}

// 약관 및 정책
SectionContainerView(title: "약관 및 정책") {
SettingCard(title: "서비스 이용약관") {
print("서비스 이용약관 탭")
}
SettingCard(title: "개인정보 처리방침") {
print("개인정보 처리방침 탭")
}
SettingCard(title: "위치 정보 이용약관") {
print("위치 정보 이용약관 탭")
.padding(.horizontal, 32)

// 계정
SectionContainerView(title: "계정") {
SettingCard(title: "로그아웃") {
showLogoutAlert = true
}
SettingCard(title: "회원 탈퇴", isRed: true) {
showWithdrawAlert = true
}
}
}
.padding(.horizontal, 32)

// 고객센터
SectionContainerView(title: "고객센터") {
SettingCard(title: "의견 보내기") {
print("의견 보내기 탭")
// 약관 및 정책
SectionContainerView(title: "약관 및 정책") {
SettingCard(title: "서비스 이용약관") {
print("서비스 이용약관 탭")
}
SettingCard(title: "개인정보 처리방침") {
print("개인정보 처리방침 탭")
}
SettingCard(title: "위치 정보 이용약관") {
print("위치 정보 이용약관 탭")
}
}
.padding(.horizontal, 32)

// 고객센터
SectionContainerView(title: "고객센터") {
SettingCard(title: "의견 보내기") {
print("의견 보내기 탭")
}
}
.padding(.bottom, 80)
.padding(.horizontal, 32)
}
.padding(.bottom, 80)
}
}
.padding(.vertical, 16)
.task {
viewModel.loadAppVersion()
}
Expand Down Expand Up @@ -118,7 +124,7 @@ struct SettingCard: View {
.frame(width: 6, height: 8)
.foregroundStyle(.gray2)
}
.padding()
.padding(.vertical)
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions TAMINGO/Features/MyPage/WeeklyReport/Model/InsightType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ extension InsightType {
case .task:
return .subBlue3
case .suggestion:
return .subPink1
return .subPink2
case .unknown:
return .gray1
}
Expand All @@ -53,7 +53,7 @@ extension InsightType {
case .task:
return .subBlue1
case .suggestion:
return .subPink
return .subPink1
case .unknown:
return .gray0
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct WeeklyReportView: View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
header
.padding(.horizontal, 16)
.padding(.horizontal, 32)

ScrollView {
VStack(alignment: .leading, spacing: 16) {
Expand All @@ -33,11 +33,12 @@ struct WeeklyReportView: View {

Spacer()
}
.padding(16)
.padding(.vertical, 16)
.padding(.horizontal, 32)
}
}
.padding(.vertical, 16)
.navigationBarBackButtonHidden(true)
.padding(.horizontal,16)
.task {
await vm.fetchReport()
}
Expand Down