-
Notifications
You must be signed in to change notification settings - Fork 2
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
Apply new MealView design #115
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// | ||
// MealType.swift | ||
// Domain | ||
// | ||
// Created by hhhello0507 on 8/12/24. | ||
// | ||
|
||
import Foundation | ||
import SwiftBok | ||
|
||
public enum MealType: Int, RawRepresentable { | ||
case breakfast | ||
case lunch | ||
case dinner | ||
|
||
public var label: String { | ||
switch self { | ||
case .breakfast: | ||
"아침" | ||
case .lunch: | ||
"점심" | ||
case .dinner: | ||
"저녁" | ||
} | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 코드 리뷰 결과입니다. 버그 리스크:
개선 제안:
수정된 예시 코드: public enum MealType: String, RawRepresentable {
case breakfast = "아침"
case lunch = "점심"
case dinner = "저녁"
public var label: String {
switch self {
case .breakfast:
return "아침"
case .lunch:
return "점심"
case .dinner:
return "저녁"
}
}
} 이러한 수정을 고려하시면 코드의 안정성과 가독성을 높일 수 있습니다. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,4 +17,8 @@ public struct MealResponse: ResponseProtocol { | |
public let breakfast: Meal? | ||
public let lunch: Meal? | ||
public let dinner: Meal? | ||
|
||
public var meals: [Meal] { | ||
[self.breakfast, self.lunch, self.dinner].compactMap { $0 } | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이 코드 패치에 대한 간단한 코드 리뷰는 다음과 같습니다: 버그 리스크
개선 제안
이상으로, 이 코드는 전반적으로 걱정할 요소가 적으며, 사용이 간편하고 효율적입니다. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
// | ||
// CalendarCell.swift | ||
// Feature | ||
// | ||
// Created by hhhello0507 on 8/12/24. | ||
// | ||
|
||
import SwiftUI | ||
import DDS | ||
|
||
struct CalendarDateCell: View { | ||
|
||
private let date: Date? | ||
private let selected: Bool | ||
|
||
init(date: Date?, selected: Bool) { | ||
self.date = date | ||
self.selected = selected | ||
} | ||
|
||
private var label: String { | ||
guard let date else { | ||
return "" | ||
} | ||
guard let day = date[.day] else { | ||
return "" | ||
} | ||
return "\(day)" | ||
} | ||
|
||
var body: some View { | ||
Text(label) | ||
.headline(.medium) | ||
.foreground( | ||
selected | ||
? DodamColor.Static.white | ||
: DodamColor.Label.alternative | ||
) | ||
.padding(.vertical, 8) | ||
.if(selected) { view in | ||
view.background { | ||
Rectangle() | ||
.dodamFill(DodamColor.Primary.normal) | ||
.clipShape(.medium) | ||
.frame(width: 36, height: 36) | ||
} | ||
} | ||
.frame(maxWidth: .infinity) | ||
.opacity(date == nil ? 0 : 1) | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 코드 리뷰를 진행하겠습니다. 버그 위험:
개선사항:
결론:전반적으로 구조는 잘 되어 있으나, 옵셔널 처리 및 코드 유지보수를 위한 몇 가지 개선 사항이 있습니다. 이러한 부분을 점검하여 안정성과 가독성을 높이는 것이 좋습니다. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,72 +8,47 @@ | |
import SwiftUI | ||
import DDS | ||
import Domain | ||
import Shared | ||
|
||
struct MealContainer: View { | ||
|
||
@State private var pageSize: CGSize? | ||
private let mealData: MealResponse? | ||
@Binding var mealIdx: Int | ||
|
||
public init( | ||
data mealData: MealResponse?, | ||
mealIdx: Binding<Int> | ||
) { | ||
self.mealData = mealData | ||
self._mealIdx = mealIdx | ||
self.animatedIdx = mealIdx.wrappedValue | ||
} | ||
|
||
@State private var animatedIdx: Int | ||
@State private var heights: [Int: CGFloat] = [:] | ||
|
||
|
||
var body: some View { | ||
if let data = mealData { | ||
if data.exists { | ||
let meals = [ | ||
data.breakfast, | ||
data.lunch, | ||
data.dinner | ||
] | ||
DodamPageView(selection: $mealIdx) { | ||
ForEach(meals.indices, id: \.self) { idx in | ||
GeometryReader { geometryProxy in | ||
let text = meals[idx]?.details.map { | ||
$0.name | ||
}.joined(separator: ", ") ?? "급식이 없어요." | ||
Text(text) | ||
.body1(.medium) | ||
.foreground(DodamColor.Label.normal) | ||
.multilineTextAlignment(.leading) | ||
.fixedSize(horizontal: false, vertical: true) | ||
.onAppear { | ||
withAnimation(.spring) { | ||
heights[idx] = text.boundingRect( | ||
with: CGSize( | ||
width: geometryProxy.size.width, | ||
height: .greatestFiniteMagnitude | ||
), | ||
options: .usesLineFragmentOrigin, | ||
attributes: [ | ||
.font: UIFont( | ||
name: Pretendard.Weight.semibold.rawValue, | ||
size: 18 | ||
)! | ||
], | ||
context: nil | ||
).height | ||
ForEach(data.meals, id: \.self) { meal in | ||
let splitedArray = splitArray(array: meal.details) | ||
HStack(alignment: .top) { | ||
ForEach(splitedArray, id: \.self) { meals in | ||
VStack(alignment: .leading, spacing: 0) { | ||
ForEach(meals, id: \.self) { meal in | ||
Text(meal.name) | ||
.body1(.medium) | ||
.foreground(DodamColor.Label.normal) | ||
} | ||
} | ||
.frame(maxWidth: .infinity, alignment: .leading) | ||
} | ||
} | ||
.onReadSize { size in | ||
self.pageSize = size | ||
} | ||
.padding(.horizontal, 6) | ||
.page() | ||
} | ||
} | ||
.frame(height: heights[animatedIdx] ?? 44.928) | ||
.onChange(of: mealIdx) { newValue in | ||
withAnimation(.spring(duration: 0.2)) { | ||
animatedIdx = newValue | ||
} | ||
} | ||
.frame(height: pageSize?.height ?? 999) | ||
.onAppear { | ||
let currentTime = Date() | ||
let calendar = Calendar.current | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 코드 리뷰를 진행하겠습니다. 개선 제안 및 버그 위험
이러한 점들을 고려하면 더욱 안정적이고 유지보수하기 쉬운 코드를 작성할 수 있을 것입니다. |
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// | ||
// MealCell.swift | ||
// Feature | ||
// | ||
// Created by hhhello0507 on 8/12/24. | ||
// | ||
|
||
import SwiftUI | ||
import DDS | ||
import Domain | ||
|
||
struct MealCell: View { | ||
|
||
private let type: MealType | ||
private let meal: Meal | ||
|
||
init(type: MealType, meal: Meal) { | ||
self.type = type | ||
self.meal = meal | ||
} | ||
|
||
var body: some View { | ||
VStack(spacing: 12) { | ||
HStack { | ||
DodamTag(type.label, type: .primary) | ||
Spacer() | ||
Text("\(Int(meal.calorie))Kcal") | ||
.label(.medium) | ||
.foreground(DodamColor.Label.alternative) | ||
} | ||
Text(meal.details.map { $0.name }.joined(separator: "\n")) | ||
.body1(.medium) | ||
.foreground(DodamColor.Label.normal) | ||
.frame(maxWidth: .infinity, alignment: .leading) | ||
} | ||
.padding(16) | ||
.background(DodamColor.Background.normal) | ||
.clipShape(.large) | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 코드 리뷰를 진행하겠습니다. 코드 리뷰
결론전반적으로 코드가 깔끔하게 작성되었으며 좋은 구조를 가지고 있습니다. 위에서 언급한 개선점을 참고하여 코드의 안정성과 가독성을 더욱 높일 수 있을 것입니다. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 패치에 대한 간단한 리뷰를 제공하겠습니다.
버그 위험 및 개선 제안:
UIRefreshControl의 tintColor 설정:
UIRefreshControl.appearance().tintColor
설정은 앱의 전체 UI에 영향을 미칠 수 있습니다. 만약 이 색상을 특정 뷰에만 적용하고 싶다면, 해당 뷰에서 직접UIRefreshControl
인스턴스를 생성하여 사용하세요.색상 정의:
Dodam.color(DodamColor.Primary.normal)
가 올바른 색상 객체를 반환하는지 확인해야 합니다. 색상 정의가 유효하지 않거나 예상과 다르게 동작하면 UI에 문제를 일으킬 수 있습니다.onAppear 위치:
onAppear
가 필요 없는 경우 (예: 상태 관리나 다른 생명주기 메서드에서 처리되는 경우), 불필요하게 호출될 수 있으므로 항상 주의가 필요합니다.일관성 유지:
let color = ...
구문은 더 직관적으로 작성할 수 있습니다. 예를 들어, 검증 후 바로 설정하는 방식으로 변경할 수 있습니다.결론:
이 코드 변경은 전반적으로 적절해 보이지만, UI에 미칠 영향을 고려하고, 색상 정의의 안전성을 점검하는 것이 중요합니다. 추가적으로, 색상을 뷰에 국한시키는 방법을 검토하는 것이 좋습니다.