Skip to content
Merged
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
34 changes: 21 additions & 13 deletions RocketCall/View/HomeTab/Controller/HomeDetailViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,12 @@ extension HomeDetailViewController {
//MARK: set collectionView snapSHot
// Sum Section Item
let sum: Observable<[HomeViewModel.SumResult]> = output.sum
.map {
switch $0 {
.map { [weak self] result in
switch result {
case .success(let results):
return results
case .failure(let error):
print(error)
self?.showAlert(error: error)
return []
}
}
Expand All @@ -77,12 +77,12 @@ extension HomeDetailViewController {

// Chart Section Item
let chartData = output.chartRawData
.map {
switch $0 {
.map { [weak self] result in
switch result {
case .success(let data):
return data
case .failure(let error):
print(error)
self?.showAlert(error: error)
return [:]
}
}
Expand All @@ -96,12 +96,12 @@ extension HomeDetailViewController {

// Progress Section Item
let progress = output.progressStatus
.map {
switch $0 {
.map { [weak self] result in
switch result {
case .success(let status):
return status
case .failure(let error):
print(error)
self?.showAlert(error: error)
return HomeViewModel.ProgressStatus(current: .earth, target: .moon, progress: 0)
}
}
Expand All @@ -114,13 +114,13 @@ extension HomeDetailViewController {
.share()

// Result Section Item
let results = output.missionResults
.map {
switch $0 {
let results = output.missionResultList
.map { [weak self] result in
switch result {
case .success(let results):
return results
case .failure(let error):
print(error)
self?.showAlert(error: error)
return []
}
}
Expand Down Expand Up @@ -175,3 +175,11 @@ extension HomeDetailViewController {
.disposed(by: disposeBag)
}
}

extension HomeDetailViewController {
private func showAlert(error: Error) {
let alert = UIAlertController(title: "오류", message: "\(error.localizedDescription)", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: nil))
present(alert, animated: true)
}
}
18 changes: 13 additions & 5 deletions RocketCall/View/HomeTab/Controller/HomeMainViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,26 +60,26 @@ extension HomeMainViewController {
// 알람 카드뷰 업데이트
output.alarm
.observe(on: MainScheduler.instance)
.subscribe(onNext: { [cardView = homeMainView.alarmCardView] result in
.subscribe(onNext: { [weak self, cardView = homeMainView.alarmCardView] result in
switch result {
case .success(let alarm):
cardView.configure(alarm: alarm)

case .failure(let error):
print(error) // 추후 처리 필요
self?.showAlert(error: error) // 추후 처리 필요
}
})
.disposed(by: disposeBag)

// 통계 카드 업데이트
output.sum
.subscribe(onNext: { [homeMainView] result in
.subscribe(onNext: { [weak self, homeMainView] result in
switch result {
case .success(let results):
homeMainView.totalTimeCardView.configure(results[TotalCardView.CardCategory.totalTime.rawValue])
homeMainView.missionCardView.configure(results[TotalCardView.CardCategory.totalCount.rawValue])
case .failure(let error):
print(error)
self?.showAlert(error: error)
}
})
.disposed(by: disposeBag)
Expand All @@ -91,7 +91,7 @@ extension HomeMainViewController {
case .success(_):
break
case .failure(let error):
print(error)
self?.showAlert(error: error)
}
})
.disposed(by: disposeBag)
Expand Down Expand Up @@ -132,3 +132,11 @@ extension HomeMainViewController {
.disposed(by: disposeBag)
}
}

extension HomeMainViewController {
private func showAlert(error: Error) {
let alert = UIAlertController(title: "오류", message: "\(error.localizedDescription)", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: nil))
present(alert, animated: true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,15 @@ extension HomeResultListViewController {
//MARK: Output
let output = viewModel.transform(input)

output.missionResults
output.missionResultList
.subscribe(onNext: { [weak self] result in
guard let self else { return }
switch result {
case .success(let results):
let items = self.converToItem(results)
listView.setSnapshot(with: items)
case .failure(let error):
print(error)
self.showAlert(error: error)
}
})
.disposed(by: disposeBag)
Expand All @@ -77,9 +77,17 @@ extension HomeResultListViewController {
.disposed(by: disposeBag)
}

private func converToItem(_ results: [MissionResultPayload]) -> [DetailCollectionView.Item] {
private func converToItem(_ results: [HomeViewModel.MissionResultList]) -> [DetailCollectionView.Item] {
results.map {
DetailCollectionView.Item.result($0)
}
}
}

extension HomeResultListViewController {
private func showAlert(error: Error) {
let alert = UIAlertController(title: "오류", message: "\(error.localizedDescription)", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: nil))
present(alert, animated: true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,11 @@ extension ResultListCell {
}

extension ResultListCell {
func configure(with result: MissionResultPayload) {
func configure(with result: HomeViewModel.MissionResultList) {
titleLabel.text = result.title
timeLabel.text = "\(result.studyTime / 60)h \(result.studyTime % 60)m"

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "M월 dd일 (E)"
dateLabel.text = dateFormatter.string(from: result.start)
dateLabel.text = result.date

configureStateLabel(isCompleted: result.isCompleted)
}
Expand Down
2 changes: 1 addition & 1 deletion RocketCall/View/HomeTab/View/DetailCollectionView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ final class DetailCollectionView: UICollectionView {
case sum(HomeViewModel.SumResult)
case chart([Int: Int])
case progress(HomeViewModel.ProgressStatus)
case result(MissionResultPayload)
case result(HomeViewModel.MissionResultList)

func hash(into hasher: inout Hasher) {
switch self {
Expand Down
63 changes: 56 additions & 7 deletions RocketCall/ViewModel/HomeViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import RxSwift
import RxCocoa
import Foundation
import UserNotifications
import Then

final class HomeViewModel: ViewModelProtocol {
struct Input {
Expand All @@ -17,7 +18,7 @@ final class HomeViewModel: ViewModelProtocol {

struct Output {
let alarm: Observable<Result<Alarm?, Error>> // (alarm: 알람, isExist: 존재 여부)
let missionResults: Observable<Result<[MissionResultPayload], Error>> // 미션 결과 목록
let missionResultList: Observable<Result<[MissionResultList], Error>> // 미션 결과 목록
let sum: Observable<Result<[SumResult], Error>> // 미션 결과 통계
let chartRawData: Observable<Result<[Int: Int], Error>> // 차트뷰 업데이트를 위한 dataSource
let progressStatus: Observable<Result<ProgressStatus, Error>> // ProgressView 데이터
Expand All @@ -28,7 +29,12 @@ final class HomeViewModel: ViewModelProtocol {
let coreDataManager: CoreDataManager
let notificationManager: NotificationManager
let disposeBag = DisposeBag()

let center = UNUserNotificationCenter.current()
let dateFormatter = DateFormatter().then {
$0.locale = Locale(identifier: "ko_KR")
$0.dateFormat = "M월 dd일 (E)"
}
private(set) var weeklyData: WeeklyData // ChartView 바인딩용

struct TotalResultValue {
Expand Down Expand Up @@ -74,6 +80,12 @@ final class HomeViewModel: ViewModelProtocol {
}
.share()

let missionResultList: Observable<Result<[MissionResultList], Error>> = missionResults
.withUnretained(self)
.flatMap { `self`, results in
self.mapToMissionResultList(results)
}

// 결과 통계
let sum: Observable<Result<[SumResult], Error>> = missionResults
.withUnretained(self)
Expand All @@ -97,7 +109,7 @@ final class HomeViewModel: ViewModelProtocol {

return Output(
alarm: alarm,
missionResults: missionResults,
missionResultList: missionResultList,
sum: sum,
chartRawData: chartRawData,
progressStatus: progress
Expand Down Expand Up @@ -375,11 +387,10 @@ extension HomeViewModel {

switch result {
case .success(let result):
let cum = result[TotalCardView.CardCategory.totalTime.rawValue].value // 누적 집중 시간(분)
let left = result[TotalCardView.CardCategory.leftTime.rawValue].value // 다음 목적지까지 남은 시간(분)

let progressStatus = self.calculateProgress(cum: cum, left: left)
let cum = result[TotalCardView.CardCategory.totalTime.rawValue].detail // 누적 집중 시간(분)

let progressStatus = self.calculateProgress(cum: cum)
print(progressStatus)
observer.onNext(.success(progressStatus))
observer.onCompleted()

Expand All @@ -392,7 +403,7 @@ extension HomeViewModel {
}
}

private func calculateProgress(cum: Int, left: Int) -> ProgressStatus {
private func calculateProgress(cum: Int) -> ProgressStatus {
let target = findTargetPlanet(from: cum) // 목적지

guard let target else { // 마지막 목적지까지 이미 도달한 경우
Expand Down Expand Up @@ -435,3 +446,41 @@ extension HomeViewModel {
}.first
}
}

extension HomeViewModel {
struct MissionResultList: Hashable {
let id: UUID
let title: String
let date: String
let studyTime: Int // 공부 시간 - 분단위
let isCompleted: Bool // 달성 여부
}

private func mapToMissionResultList(_ results: Result<[MissionResultPayload], Error>) -> Observable<Result<[MissionResultList], Error>> {
Observable.create { observer in
switch results {
case .success(let results):
let list = results.map { [weak self] in
let time = $0.studyTime / 60
let date = self?.dateFormatter.string(from: $0.start) ?? ""

return MissionResultList(
id: $0.id,
title: $0.title,
date: date,
studyTime: time,
isCompleted: $0.isCompleted
)
}

observer.onNext(.success(list))
observer.onCompleted()
case .failure(let error):
observer.onNext(.failure(error))
observer.onCompleted()
}
return Disposables.create()
}

}
}
Loading