Skip to content
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

Reopen Feature/quest view model #45

Merged
merged 10 commits into from
Nov 23, 2022
135 changes: 101 additions & 34 deletions DailyQuest/DailyQuest.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
340FDFD3292B5CE300C4E3DC /* QuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CAE317292B19A3007653AD /* QuestsRepository.swift */; };
340FDFD4292B5DA100C4E3DC /* QuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC87292B54DB00B504C5 /* QuestUseCase.swift */; };
340FDFD5292B5DB700C4E3DC /* DefaultQuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC89292B560800B504C5 /* DefaultQuestUseCase.swift */; };
34131397291E47D300E607E1 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 34131396291E47D300E607E1 /* RxCocoa */; };
34131399291E47D300E607E1 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 34131398291E47D300E607E1 /* RxSwift */; };
340FDFDB292B7A1500C4E3DC /* QuestViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 340FDFDA292B7A1500C4E3DC /* QuestViewModelTests.swift */; };
340FDFDE292B7A2C00C4E3DC /* QuestUseCaseMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 340FDFDD292B7A2C00C4E3DC /* QuestUseCaseMock.swift */; };
3413139C291E480500E607E1 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 3413139B291E480500E607E1 /* SnapKit */; };
3416FC88292B54DB00B504C5 /* QuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC87292B54DB00B504C5 /* QuestUseCase.swift */; };
3416FC8A292B560800B504C5 /* DefaultQuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC89292B560800B504C5 /* DefaultQuestUseCase.swift */; };
Expand Down Expand Up @@ -57,6 +57,11 @@
34CAE318292B19A3007653AD /* QuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CAE317292B19A3007653AD /* QuestsRepository.swift */; };
34EE6EB72924C674005AF583 /* QuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB62924C674005AF583 /* QuestView.swift */; };
34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */; };
34FF6C5A292B86F8002AFD4D /* SnapKit-Dynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 34FF6C46292B8014002AFD4D /* SnapKit-Dynamic */; };
34FF6C5D292B8B27002AFD4D /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 34FF6C5C292B8B27002AFD4D /* RxCocoa */; };
34FF6C5F292B8B27002AFD4D /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 34FF6C5E292B8B27002AFD4D /* RxSwift */; };
34FF6C60292B8BC9002AFD4D /* QuestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */; };
34FF6C64292B8C26002AFD4D /* RxCocoa-Dynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 34FF6C63292B8C26002AFD4D /* RxCocoa-Dynamic */; };
A50DE906292B53D900E1FD60 /* DefaultQuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */; };
A51189C329226E66008A9D33 /* QuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* QuestEntity+Mapping.swift */; };
9B1CFB3F292B585700CCE97A /* QuestDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */; };
Expand Down Expand Up @@ -109,7 +114,22 @@
};
/* End PBXContainerItemProxy section */

/* Begin PBXCopyFilesBuildPhase section */
34FF6C2E292B8014002AFD4D /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
340FDFDA292B7A1500C4E3DC /* QuestViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModelTests.swift; sourceTree = "<group>"; };
340FDFDD292B7A2C00C4E3DC /* QuestUseCaseMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestUseCaseMock.swift; sourceTree = "<group>"; };
3416FC87292B54DB00B504C5 /* QuestUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestUseCase.swift; sourceTree = "<group>"; };
3416FC89292B560800B504C5 /* DefaultQuestUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultQuestUseCase.swift; sourceTree = "<group>"; };
3416FC8D292B593C00B504C5 /* Quest+Stub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Quest+Stub.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -192,19 +212,22 @@
files = (
A50DE90B292B73B900E1FD60 /* FirebaseDatabaseSwift in Frameworks */,
A5AC96DF292239CA003B7637 /* RealmSwift in Frameworks */,
A50DE909292B73B900E1FD60 /* FirebaseAuth in Frameworks */,
A50DE90D292B73B900E1FD60 /* FirebaseFirestoreSwift in Frameworks */,
34131399291E47D300E607E1 /* RxSwift in Frameworks */,
A50DE90F292B73B900E1FD60 /* FirebaseStorage in Frameworks */,
34ACC362291DEF6100741371 /* FirebaseDatabase in Frameworks */,
34ACC366291DEF6100741371 /* FirebaseStorage in Frameworks */,
34FF6C5D292B8B27002AFD4D /* RxCocoa in Frameworks */,
3413139C291E480500E607E1 /* SnapKit in Frameworks */,
34131397291E47D300E607E1 /* RxCocoa in Frameworks */,
34ACC360291DEF6100741371 /* FirebaseAuth in Frameworks */,
34FF6C5F292B8B27002AFD4D /* RxSwift in Frameworks */,
34ACC364291DEF6100741371 /* FirebaseFirestore in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
34ACC33C291DE9C100741371 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
34FF6C64292B8C26002AFD4D /* RxCocoa-Dynamic in Frameworks */,
34FF6C5A292B86F8002AFD4D /* SnapKit-Dynamic in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -221,10 +244,28 @@
340FDFD8292B61C200C4E3DC /* Presentation */ = {
isa = PBXGroup;
children = (
340FDFDC292B7A1A00C4E3DC /* Mocks */,
340FDFD9292B7A0200C4E3DC /* ViewModel */,
);
path = Presentation;
sourceTree = "<group>";
};
340FDFD9292B7A0200C4E3DC /* ViewModel */ = {
isa = PBXGroup;
children = (
340FDFDA292B7A1500C4E3DC /* QuestViewModelTests.swift */,
);
path = ViewModel;
sourceTree = "<group>";
};
340FDFDC292B7A1A00C4E3DC /* Mocks */ = {
isa = PBXGroup;
children = (
340FDFDD292B7A2C00C4E3DC /* QuestUseCaseMock.swift */,
);
path = Mocks;
sourceTree = "<group>";
};
3416FC85292B549900B504C5 /* Home */ = {
isa = PBXGroup;
children = (
Expand All @@ -245,6 +286,7 @@
3416FC8B292B58F600B504C5 /* Domain */ = {
isa = PBXGroup;
children = (
3416FC91292B59C700B504C5 /* Mocks */,
3416FC90292B59BB00B504C5 /* UseCases */,
);
path = Domain;
Expand All @@ -262,7 +304,6 @@
isa = PBXGroup;
children = (
3416FC94292B5AD600B504C5 /* QuestUseCaseTests.swift */,
3416FC91292B59C700B504C5 /* Mocks */,
);
path = UseCases;
sourceTree = "<group>";
Expand Down Expand Up @@ -457,6 +498,7 @@
34ACC342291DE9C100741371 /* DailyQuestTests */,
34ACC34C291DE9C100741371 /* DailyQuestUITests */,
34ACC32A291DE9C000741371 /* Products */,
34FF6BF3292B7FF7002AFD4D /* Frameworks */,
);
sourceTree = "<group>";
};
Expand Down Expand Up @@ -561,6 +603,13 @@
path = View;
sourceTree = "<group>";
};
34FF6BF3292B7FF7002AFD4D /* Frameworks */ = {
isa = PBXGroup;
children = (
);
name = Frameworks;
sourceTree = "<group>";
};
9B1CFB3C292B580C00CCE97A /* Network */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -729,14 +778,14 @@
);
name = DailyQuest;
packageProductDependencies = (
34131396291E47D300E607E1 /* RxCocoa */,
34131398291E47D300E607E1 /* RxSwift */,
34ACC35F291DEF6100741371 /* FirebaseAuth */,
34ACC361291DEF6100741371 /* FirebaseDatabase */,
34ACC363291DEF6100741371 /* FirebaseFirestore */,
34ACC365291DEF6100741371 /* FirebaseStorage */,
3413139B291E480500E607E1 /* SnapKit */,
A5AC96DE292239CA003B7637 /* RealmSwift */,
A50DE908292B73B900E1FD60 /* FirebaseAuth */,
A50DE90A292B73B900E1FD60 /* FirebaseDatabaseSwift */,
A50DE90C292B73B900E1FD60 /* FirebaseFirestoreSwift */,
A50DE90E292B73B900E1FD60 /* FirebaseStorage */,
34FF6C5C292B8B27002AFD4D /* RxCocoa */,
34FF6C5E292B8B27002AFD4D /* RxSwift */,
);
productName = DailyQuest;
productReference = 34ACC329291DE9C000741371 /* DailyQuest.app */;
Expand All @@ -749,13 +798,18 @@
34ACC33B291DE9C100741371 /* Sources */,
34ACC33C291DE9C100741371 /* Frameworks */,
34ACC33D291DE9C100741371 /* Resources */,
34FF6C2E292B8014002AFD4D /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
34ACC341291DE9C100741371 /* PBXTargetDependency */,
);
name = DailyQuestTests;
packageProductDependencies = (
34FF6C46292B8014002AFD4D /* SnapKit-Dynamic */,
34FF6C63292B8C26002AFD4D /* RxCocoa-Dynamic */,
);
productName = DailyQuestTests;
productReference = 34ACC33F291DE9C100741371 /* DailyQuestTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
Expand Down Expand Up @@ -811,10 +865,10 @@
);
mainGroup = 34ACC320291DE9C000741371;
packageReferences = (
34131395291E47D300E607E1 /* XCRemoteSwiftPackageReference "RxSwift" */,
34ACC35E291DEF6100741371 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
3413139A291E480500E607E1 /* XCRemoteSwiftPackageReference "SnapKit" */,
A5AC96DD292239CA003B7637 /* XCRemoteSwiftPackageReference "realm-swift" */,
A50DE907292B73B900E1FD60 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
34FF6C5B292B8B27002AFD4D /* XCRemoteSwiftPackageReference "RxSwift" */,
);
productRefGroup = 34ACC32A291DE9C000741371 /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -935,6 +989,9 @@
3416FC8E292B593C00B504C5 /* Quest+Stub.swift in Sources */,
340FDFD5292B5DB700C4E3DC /* DefaultQuestUseCase.swift in Sources */,
3416FC93292B59D300B504C5 /* QuestRepositoryMock.swift in Sources */,
340FDFDE292B7A2C00C4E3DC /* QuestUseCaseMock.swift in Sources */,
340FDFDB292B7A1500C4E3DC /* QuestViewModelTests.swift in Sources */,
34FF6C60292B8BC9002AFD4D /* QuestViewModel.swift in Sources */,
340FDFD4292B5DA100C4E3DC /* QuestUseCase.swift in Sources */,
340FDFD3292B5CE300C4E3DC /* QuestsRepository.swift in Sources */,
);
Expand Down Expand Up @@ -1256,14 +1313,6 @@
/* End XCConfigurationList section */

/* Begin XCRemoteSwiftPackageReference section */
34131395291E47D300E607E1 /* XCRemoteSwiftPackageReference "RxSwift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/ReactiveX/RxSwift";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 6.0.0;
};
};
3413139A291E480500E607E1 /* XCRemoteSwiftPackageReference "SnapKit" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/SnapKit/SnapKit";
Expand All @@ -1280,6 +1329,14 @@
kind = branch;
};
};
34FF6C5B292B8B27002AFD4D /* XCRemoteSwiftPackageReference "RxSwift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/ReactiveX/RxSwift";
requirement = {
branch = main;
kind = branch;
};
};
A5AC96DD292239CA003B7637 /* XCRemoteSwiftPackageReference "realm-swift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/realm/realm-swift";
Expand All @@ -1291,16 +1348,6 @@
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
34131396291E47D300E607E1 /* RxCocoa */ = {
isa = XCSwiftPackageProductDependency;
package = 34131395291E47D300E607E1 /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxCocoa;
};
34131398291E47D300E607E1 /* RxSwift */ = {
isa = XCSwiftPackageProductDependency;
package = 34131395291E47D300E607E1 /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxSwift;
};
3413139B291E480500E607E1 /* SnapKit */ = {
isa = XCSwiftPackageProductDependency;
package = 3413139A291E480500E607E1 /* XCRemoteSwiftPackageReference "SnapKit" */;
Expand All @@ -1326,6 +1373,26 @@
package = A50DE907292B73B900E1FD60 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
productName = FirebaseStorage;
};
34FF6C46292B8014002AFD4D /* SnapKit-Dynamic */ = {
isa = XCSwiftPackageProductDependency;
package = 3413139A291E480500E607E1 /* XCRemoteSwiftPackageReference "SnapKit" */;
productName = "SnapKit-Dynamic";
};
34FF6C5C292B8B27002AFD4D /* RxCocoa */ = {
isa = XCSwiftPackageProductDependency;
package = 34FF6C5B292B8B27002AFD4D /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxCocoa;
};
34FF6C5E292B8B27002AFD4D /* RxSwift */ = {
isa = XCSwiftPackageProductDependency;
package = 34FF6C5B292B8B27002AFD4D /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxSwift;
};
34FF6C63292B8C26002AFD4D /* RxCocoa-Dynamic */ = {
isa = XCSwiftPackageProductDependency;
package = 34FF6C5B292B8B27002AFD4D /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = "RxCocoa-Dynamic";
};
A5AC96DE292239CA003B7637 /* RealmSwift */ = {
isa = XCSwiftPackageProductDependency;
package = A5AC96DD292239CA003B7637 /* XCRemoteSwiftPackageReference "realm-swift" */;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/ReactiveX/RxSwift",
"state" : {
"revision" : "b4307ba0b6425c0ba4178e138799946c3da594f8",
"version" : "6.5.0"
"branch" : "main",
"revision" : "8ec08deca8271516f673706e78fb954797cd6627"
}
},
{
Expand Down
16 changes: 9 additions & 7 deletions DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,15 @@ final class QuestView: UITableView {
}

private func bind() {
// viewModel
// .data
// .bind(to: rx.items(cellIdentifier: QuestCell.reuseIdentifier, cellType: QuestCell.self)) { row, item, cell in
// cell.setup(with: item)
// cell.backgroundColor = .white
// }
// .disposed(by: disposableBag)
let output = viewModel.transform(input: QuestViewModel.Input(viewDidLoad: .just(Date()).asObservable()), disposeBag: disposableBag)

output
.data
.drive(rx.items(cellIdentifier: QuestCell.reuseIdentifier, cellType: QuestCell.self)) { row, item, cell in
cell.setup(with: item)
cell.backgroundColor = .white
}
.disposed(by: disposableBag)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,30 @@
import Foundation

import RxSwift
import RxCocoa

final class QuestViewModel {
private let questUseCase: QuestUseCase

// let quests = [
// Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "물마시기", currentCount: 4, totalCount: 5),
// Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "책읽기", currentCount: 9, totalCount: 20),
// Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "달리기", currentCount: 4, totalCount: 9),
// Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "잠자기", currentCount: 1, totalCount: 1)
// ]


init(questUseCase: QuestUseCase) {
self.questUseCase = questUseCase
}

struct Input {
let viewDidLoad: Observable<Date>
}

struct Output {
let data: Driver<[Quest]>
}

func transform(input: Input, disposeBag: DisposeBag) -> Output {

let data = input
.viewDidLoad
.flatMap(questUseCase.fetch(by:))
.asDriver(onErrorJustReturn: [])

return Output(data: data)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// QuestUseCaseMock.swift
// DailyQuestTests
//
// Created by jinwoong Kim on 2022/11/21.
//

import Foundation

import RxSwift

final class QuestUseCaseMock: QuestUseCase {
let quests = [
Quest.stub(groupId: UUID(),
uuid: UUID(),
title: "물마시기",
currentCount: 0,
totalCount: 10),
Quest.stub(groupId: UUID(),
uuid: UUID(),
title: "물마시기",
currentCount: 0,
totalCount: 10),
]

func fetch(by date: Date) -> Observable<[Quest]> {
return Observable.just(quests)
}
}
Loading