Skip to content

Commit

Permalink
[refactor] NewNoteDatePickerViewModel 변경 및 NewNote 구조체에서 클래스로 변경 #302
Browse files Browse the repository at this point in the history
  • Loading branch information
skkimeo committed Jul 1, 2023
1 parent 124f5eb commit 47c2356
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,10 @@ final class HomeTabViewController: UIViewController {

if bottle.isEmtpyToday {
// NewNoteInputViewController
let viewModel = NewNoteInputViewModel(date: Date(), bottle: bottle)
self.navigationController?.pushViewControllerWithFade(
to: NewNoteInputViewController(viewModel: viewModel)
to: NewNoteInputViewController(
viewModel: .init(newNote: .init(date: Date(), bottle: bottle))
)
)
} else {
// NewNoteDatePickerViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ final class HomeViewController: UIViewController {
let bottle = self.viewModel.bottle
else { return }

let viewModel = NewNoteDatePickerViewModel(initialDate: Date(), bottle: bottle)
let viewModel = NewNoteDatePickerViewModel(newNote: .init(date: Date(), bottle: bottle))
dateViewController.viewModel = viewModel
}

Expand Down
20 changes: 19 additions & 1 deletion Happiggy-bank/Happiggy-bank/HomeTab/NewNote/Model/NewNote.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
import Foundation

/// 새 쪽지를 추가할 때 사용하는 모델
struct NewNote: Equatable {
final class NewNote {

// MARK: - Properties

/// 고유 아이디
let id = UUID()
Expand All @@ -24,4 +26,20 @@ struct NewNote: Equatable {

/// 이미지 아이디
var imageID: String?


// MARK: - Init(s)

init(date: Date, bottle: Bottle) {
self.date = date
self.bottle = bottle
}
}


// MARK: - Equtable
extension NewNote: Equatable {
static func == (lhs: NewNote, rhs: NewNote) -> Bool {
lhs.id == rhs.id
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -195,11 +195,7 @@ final class NewNoteDatePickerViewController: UIViewController {
guard let rowView = pickerView.view(forRow: row, forComponent: component)
as? NewNoteDatePickerRowView
else { return }

rowView.dateLabel.attributedText = self.viewModel.attributedDateString(
for: noteData,
isSelected: true
)

}

/// 이전 상태와 같게 틴트 컬러 및 경고 라벨 상태 복구
Expand All @@ -212,13 +208,7 @@ final class NewNoteDatePickerViewController: UIViewController {
forComponent: .zero
) as? NewNoteDatePickerRowView
else { return }

/// 선택 가능하면 틴트컬러 적용
rowView.dateLabel.attributedText = self.viewModel.attributedDateString(
for: noteDatePickerData,
isSelected: true
)


guard noteDatePickerData.color != nil
else { return }

Expand Down Expand Up @@ -271,7 +261,6 @@ extension NewNoteDatePickerViewController: UIPickerViewDelegate {
let rowView = view as? NewNoteDatePickerRowView ?? NewNoteDatePickerRowView()

/// 데이터에 맞게 행의 모습(날짜 라벨 텍스트와 쪽지 이미지 색깔) 업데이트
rowView.dateLabel.attributedText = self.viewModel.attributedDateString(for: noteData)
rowView.noteImageView.image = self.viewModel.image(for: noteData)

return rowView
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,24 @@ import UIKit
final class NewNoteDatePickerViewModel {

// MARK: - Properties


let newNote: NewNote

/// 오늘 날짜 혹은 이전에 선택한 날짜에 해당하는 행 위치를 리턴
let initialRow: Int

/// 날짜 피커 전체 행 개수
let numberOfRows: Int

/// 선택한 날짜
var selectedDate: Date!

/// 쪽지를 넣을 저금통: 보틀 뷰 컨트롤러에서 주입받음
private(set) var bottle: Bottle!
///
/// 피커를 스크롤만 하고 체크 버튼으로 확정하지 않는 경우를 분리하기 위해 별도로 선언
var selectedDate: Date

/// 날짜 피커에 나타낼 데이터 소스 : 시작일부터의 오늘까지의 모든 날짜와, 해당 날짜에 쪽지를 이미 썼으면 컬러가 없으면 nil이 담겨있음
private(set) lazy var noteData: [NoteDatePickerData] = {
var source = [NoteDatePickerData]()
let startDate = self.bottle.startDate
let startDate = self.newNote.bottle.startDate

/// 날짜 먼저 전부 기록
for value in .zero..<self.numberOfRows {
Expand All @@ -30,62 +37,50 @@ final class NewNoteDatePickerViewModel {
}

/// 쪽지들 확인하면서 맞는 날짜에 색깔 기록
for note in self.bottle.notes {
for note in self.newNote.bottle.notes {
guard note.date < Date.startOfTomorrow
else { continue }

let index = Calendar.daysBetween(start: startDate, end: note.date) - 1
guard source[safe: index] != nil
else {
continue
}

source[index].color = note.color
}

return source
}()

/// 날짜 피커 전체 행 개수
private(set) lazy var numberOfRows: Int = {
self.bottle.numberOfDaysSinceStartDate
}()

/// 오늘 날짜 혹은 이전에 선택한 날짜에 해당하는 행 위치를 리턴
private(set) lazy var initialRow: Int = {
Calendar.daysBetween(start: self.bottle.startDate, end: self.selectedDate) - 1
}()



// MARK: - Init

init(initialDate date: Date, bottle: Bottle) {
self.selectedDate = date
self.bottle = bottle

init(newNote: NewNote) {
self.newNote = newNote
self.initialRow = Calendar.daysBetween(start: newNote.bottle.startDate, end: newNote.date) - 1
self.numberOfRows = newNote.bottle.numberOfDaysSinceStartDate
self.selectedDate = newNote.date
}


// MARK: - Function

/// 날짜를 "2022 02.05 금" 형태의 문자열로 월, 일만 볼드 처리해서 변환
func attributedDateString(
for source: NoteDatePickerData,
isSelected: Bool = false
) -> NSMutableAttributedString {

let color = isSelected && (source.color == nil) ? UIColor.customTint : .label

return source.date
.customFormatted(type: .spaceAndDotWithDayOfWeek)
.nsMutableAttributedStringify()
.color(color: color)
.bold(targetString: source.date.monthDotDayWithDayOfWeekString)
}

/// 쪽지 에셋 이미지 리턴
func image(for noteData: NoteDatePickerData) -> UIImage? {
guard let color = noteData.color
else { return nil}
else { return nil }

return .note(color: color)
return AssetImage.note(ofColor: color)
}

/// 선택한 행의 날짜에 쪽지를 쓸 수 있는 지 리턴
func selectedDateIsAvailable(for row: Int) -> Bool {
noteData[row].color == nil
guard noteData.indices ~= row
else {
return false
}

return noteData[row].color == nil
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ final class NewNoteInputViewModel {
/// 이미지 처리 객체

/// 임시 쪽지 객체
var newNote: NewNote
let newNote: NewNote

/// 배경 색상
var backgroundColor: UIColor? { AssetColor.noteBG(for: self.newNote.color) }
Expand All @@ -34,8 +34,8 @@ final class NewNoteInputViewModel {

// MARK: - Inits

init(date: Date, bottle: Bottle) {
self.newNote = NewNote(date: date, bottle: bottle)
init(newNote: NewNote) {
self.newNote = newNote
}


Expand Down

0 comments on commit 47c2356

Please sign in to comment.