Skip to content

Commit 968c361

Browse files
committed
Feat: HomeViewModel + HomeView 연동 (#T3-105)
1 parent 453b98e commit 968c361

6 files changed

Lines changed: 281 additions & 88 deletions

File tree

Projects/Presentation/Sources/Common/Extension/Date+.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ extension Date {
1717
}
1818

1919
enum DateType {
20+
case yearMonthDate
2021
case yearMonth
2122
case dayOfWeek
2223
case date
2324
case amPmTime
2425

2526
var formatString: String {
2627
switch self {
28+
case .yearMonthDate: "yyyy-MM-dd"
2729
case .yearMonth: "yyyy년 M월"
2830
case .dayOfWeek: "E"
2931
case .date: "d"

Projects/Presentation/Sources/Common/TabBarView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ final public class TabBarView: UITabBarController {
6868

6969
viewControllers = [
7070
UINavigationController(rootViewController: homeView),
71-
UINavigationController(rootViewController: reportView),
71+
UINavigationController(rootViewController: recommendView),
7272
UINavigationController(rootViewController: mypageView)
7373
]
7474
}

Projects/Presentation/Sources/Home/View/Component/RoutineView.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ final class RoutineView: UIView {
5353
fatalError("init(coder:) has not been implemented")
5454
}
5555

56+
override var intrinsicContentSize: CGSize {
57+
let baseHeight = Layout.timeLabelHeight + Layout.mainRoutineViewTopSpacing + Layout.mainRoutineViewHeight
58+
59+
if routine.subRoutines.isEmpty {
60+
return CGSize(width: UIView.noIntrinsicMetric, height: baseHeight)
61+
} else {
62+
let subRoutineHeight = Layout.subRoutineLabelTopSpacing + Layout.subRoutineLabelHeight + Layout.subRoutineStackViewTopSpacing + (CGFloat(routine.subRoutines.count) * Layout.subRoutineViewHeight)
63+
return CGSize(width: UIView.noIntrinsicMetric, height: baseHeight + subRoutineHeight)
64+
}
65+
}
66+
5667
private func configureAttribute() {
5768
timeLabel.text = "\(routine.startTime.convertToString(dateType: .amPmTime))부터 시작"
5869
timeLabel.font = BitnagilFont(style: .caption1, weight: .regular).font

Projects/Presentation/Sources/Home/View/Component/WeekView.swift

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
import SnapKit
99
import UIKit
1010

11+
protocol WeekViewDelegate: AnyObject {
12+
func weekView(_ sender: WeekView, didMoveWeek weekStartDate: Date)
13+
func weekView(_ sender: WeekView, didSelectDate date: Date)
14+
}
15+
1116
final class WeekView: UIView {
1217

1318
private enum Layout {
@@ -30,13 +35,14 @@ final class WeekView: UIView {
3035
private let today = Date()
3136
private var selectedDate = Date()
3237
private var currentWeekStartDate = Date()
38+
weak var delegate: WeekViewDelegate?
3339

3440
init() {
3541
super.init(frame: .zero)
3642
configureAttribute()
3743
configureLayout()
38-
setupCurrentWeek()
39-
setWeekDateViews()
44+
calculateCurrentWeek()
45+
updateWeekDateViews()
4046
}
4147

4248
required init?(coder: NSCoder) {
@@ -104,21 +110,21 @@ final class WeekView: UIView {
104110
}
105111
}
106112

107-
// 날짜 세팅 및 현재 주의 첫째날 세팅
108-
private func setupCurrentWeek() {
113+
// 현재 날짜 세팅 및 현재 주의 첫째날을 세팅합니다.
114+
private func calculateCurrentWeek() {
109115
selectedDate = today
110-
currentWeekStartDate = getWeekStartDate(for: today)
116+
currentWeekStartDate = calculateWeekStartDate(for: today)
111117
}
112118

113-
// 현재 주의 첫째 날을 뱉어줌
114-
private func getWeekStartDate(for date: Date) -> Date {
119+
// 현재 주의 첫째 날을 계산해줍니다.
120+
private func calculateWeekStartDate(for date: Date) -> Date {
115121
let weekday = calendar.component(.weekday, from: date)
116122
let daysFromMonday = (weekday == 1) ? 6 : weekday - 2
117123
return calendar.date(byAdding: .day, value: -daysFromMonday, to: date) ?? date
118124
}
119125

120-
// current 주에 맞춰 DateView들 세팅
121-
private func setWeekDateViews() {
126+
// 현재 주에 맞춰 DateView들 업데이트합니다.
127+
private func updateWeekDateViews() {
122128
dateViews.values.forEach {
123129
$0.removeFromSuperview()
124130
}
@@ -135,7 +141,7 @@ final class WeekView: UIView {
135141
isSelected: isSelected,
136142
isToday: isToday)
137143
dateView.didTappedDateButton = { [weak self] date in
138-
self?.dateSelected(date: date)
144+
self?.selectDate(date: date)
139145
}
140146
dateViews[date] = dateView
141147
dateStackView.addArrangedSubview(dateView)
@@ -145,34 +151,39 @@ final class WeekView: UIView {
145151
}
146152
}
147153

148-
// 선택한 날짜의 dateView update
154+
// 선택한 날짜의 dateView를 업데이트합니다.
149155
private func updateSelectState() {
150156
for (date, dateView) in dateViews {
151157
let isSelected = calendar.isDate(date, inSameDayAs: selectedDate)
152158
dateView.updateSelectState(isSelected: isSelected)
153159
}
154160
}
155161

156-
// 날짜 선택
157-
private func dateSelected(date: Date) {
162+
// 날짜를 선택합니다.
163+
private func selectDate(date: Date) {
158164
selectedDate = date
159165
updateMonthLabel()
160166
updateSelectState()
167+
168+
delegate?.weekView(self, didSelectDate: date)
161169
}
162170

163-
// month Label update
171+
// monthLabel를 업데이트합니다.
164172
private func updateMonthLabel() {
165173
monthLabel.text = selectedDate.convertToString(dateType: .yearMonth)
166174
}
167175

168-
// 주를 움직여요
176+
// 주(week)를 이동합니다.
169177
private func moveWeek(by week: Int) {
170178
guard let newWeekStartDate = calendar.date(byAdding: .weekOfYear, value: week, to: currentWeekStartDate)
171179
else { return }
172180
currentWeekStartDate = newWeekStartDate
173181

174182
selectedDate = currentWeekStartDate
175183
updateMonthLabel()
176-
setWeekDateViews()
184+
updateWeekDateViews()
185+
186+
delegate?.weekView(self, didMoveWeek: currentWeekStartDate)
187+
delegate?.weekView(self, didSelectDate: selectedDate)
177188
}
178189
}

0 commit comments

Comments
 (0)