From e53d571c73075918bf673bbcfc4d67196daa57c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 11:02:14 +0900 Subject: [PATCH 01/14] =?UTF-8?q?refactor:=20BookCover=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookCreation/BookCreationViewController.swift | 10 +++++----- ...eationViewModel.swift => CreateBookViewModel.swift} | 2 +- .../Source/EditBook/View/EditBookViewController.swift | 2 +- .../Source/Home/HomeViewController.swift | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) rename MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/{BookCreationViewModel.swift => CreateBookViewModel.swift} (94%) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift index 7d51888b..cf32efd8 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift @@ -1,7 +1,7 @@ import UIKit import Combine -final class BookCreationViewController: UIViewController { +final class CreateBookViewController: UIViewController { // MARK: - Constant static let maxTitleLength = 10 // MARK: - Property @@ -75,17 +75,17 @@ final class BookCreationViewController: UIViewController { return shadowLayer }() @Published - private var viewModel: BookCreationViewModel + private var viewModel: CreateBookViewModel private var cancellables: Set = [] // MARK: - Initializer - init(viewModel: BookCreationViewModel) { + init(viewModel: CreateBookViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { - viewModel = BookCreationViewModel() + viewModel = CreateBookViewModel() super.init(coder: coder) } @@ -330,7 +330,7 @@ final class BookCreationViewController: UIViewController { } } -extension BookCreationViewController: UITextFieldDelegate { +extension CreateBookViewController: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewModel.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift similarity index 94% rename from MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewModel.swift rename to MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift index b850ab36..432868f8 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewModel.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift @@ -2,7 +2,7 @@ import MHDomain import MHFoundation import Photos -struct BookCreationViewModel { +struct CreateBookViewModel { var bookTitle: String = "" var bookCategory: String = "" var previousColorNumber: Int = -1 diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/View/EditBookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/View/EditBookViewController.swift index aa937236..c2e739b9 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/View/EditBookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/View/EditBookViewController.swift @@ -147,7 +147,7 @@ final class EditBookViewController: UIViewController { private func configureSaveButton() { // BookCreationViewController에서 넘어온 경우에만 저장 버튼 보여주기 let isFromCreation = navigationController?.viewControllers - .contains { $0 is BookCreationViewController } ?? false + .contains { $0 is CreateBookViewController } ?? false if isFromCreation { navigationItem.rightBarButtonItem = nil diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift index b44beab5..ee880f4d 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift @@ -170,7 +170,7 @@ public final class HomeViewController: UIViewController { } private func moveMakingBookViewController() { - let bookCreationViewController = BookCreationViewController(viewModel: BookCreationViewModel()) + let bookCreationViewController = CreateBookViewController(viewModel: CreateBookViewModel()) navigationController?.pushViewController(bookCreationViewController, animated: true) } From d549b026c794e1124e9e61821bd4df50060f5bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 11:05:05 +0900 Subject: [PATCH 02/14] =?UTF-8?q?refactor:=20=EC=B1=85=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=8B=9C=EC=A0=90=EC=97=90=20=EC=B1=85=20=EC=BB=A4?= =?UTF-8?q?=EB=B2=84=20=ED=81=AC=EA=B8=B0=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/BookCreation/BookCreationViewController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift index cf32efd8..0074abfa 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift @@ -5,7 +5,7 @@ final class CreateBookViewController: UIViewController { // MARK: - Constant static let maxTitleLength = 10 // MARK: - Property - private let bookView: MHBookCover = MHBookCover() + private let bookCoverView: MHBookCover = MHBookCover() private let bookTitleTextField: UITextField = { let textField = UITextField() textField.font = UIFont.ownglyphBerry(size: 25) @@ -121,8 +121,8 @@ final class CreateBookViewController: UIViewController { } private func configureConstraints() { // 책 미리보기 - let bookPreviewViewBackground = bookView.embededInDefaultBackground( - with: UIEdgeInsets(top: 70, left: 100, bottom: 70, right: 100) + let bookPreviewViewBackground = bookCoverView.embededInDefaultBackground( + with: UIEdgeInsets(top: 50, left: 80, bottom: 50, right: 80) ) view.addSubview(bookPreviewViewBackground) bookPreviewViewBackground.setAnchor( @@ -259,7 +259,7 @@ final class CreateBookViewController: UIViewController { .receive(on: DispatchQueue.main) .sink { [weak self] viewModel in guard let self else { return } - self.bookView.configure( + self.bookCoverView.configure( title: viewModel.bookTitle, bookCoverImage: viewModel.currentColor.image, // TODO: - 이미지 선택시 변경 From 40fc0492038055f7f99c8740c029f22f56959b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 11:18:47 +0900 Subject: [PATCH 03/14] =?UTF-8?q?refactor:=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=EB=B7=B0=EB=AA=A8=EB=8D=B8=20=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...r.swift => CreateBookViewController.swift} | 21 ++++++++++++++++++- .../BookCategoryViewModelFactory.swift | 2 +- .../Source/Home/HomeViewController.swift | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) rename MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/{BookCreationViewController.swift => CreateBookViewController.swift} (93%) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift similarity index 93% rename from MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift rename to MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift index 0074abfa..64b051dd 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/BookCreationViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift @@ -1,4 +1,5 @@ import UIKit +import MHCore import Combine final class CreateBookViewController: UIViewController { @@ -252,7 +253,25 @@ final class CreateBookViewController: UIViewController { imageSelectionButton.addAction(pictureSelectingAction, for: .touchUpInside) // TODO: - 사진 선택 뷰모델?에 반영 - + categorySelectionButton.addAction(UIAction { [weak self] _ in + self?.presentCategorySelectionView() + }, for: .touchUpInside) + } + private func presentCategorySelectionView() { + do { + let categoryViewModelFactory = try DIContainer.shared.resolve(BookCategoryViewModelFactory.self) + let categoryViewModel = categoryViewModelFactory.makeForCreateBook() + let categoryViewController = BookCategoryViewController(viewModel: categoryViewModel) + let navigationController = UINavigationController(rootViewController: categoryViewController) + + if let sheet = navigationController.sheetPresentationController { + sheet.detents = [.medium(), .large()] + } + + self.present(navigationController, animated: true) + } catch { + MHLogger.error(error) + } } private func configureViewModelBinding() { $viewModel diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModelFactory.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModelFactory.swift index 8975c82e..f97a74cb 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModelFactory.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModelFactory.swift @@ -18,7 +18,7 @@ public struct BookCategoryViewModelFactory { self.deleteBookCategoryUseCase = deleteBookCategoryUseCase } - func make() -> BookCategoryViewModel { + func makeForHome() -> BookCategoryViewModel { BookCategoryViewModel( createBookCategoryUseCase: createBookCategoryUseCase, fetchBookCategoriesUseCase: fetchBookCategoriesUseCase, diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift index ee880f4d..fa93f0c5 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift @@ -139,7 +139,7 @@ public final class HomeViewController: UIViewController { do { guard let self else { return } let categoryViewModelFactory = try DIContainer.shared.resolve(BookCategoryViewModelFactory.self) - let categoryViewModel = categoryViewModelFactory.make() + let categoryViewModel = categoryViewModelFactory.makeForHome() categoryViewModel.setup(currentCategory: self.currentCategory) let categoryViewController = BookCategoryViewController(viewModel: categoryViewModel) categoryViewController.delegate = self From 3557a3ad5e1ce1e3c6e0d5329a778f3fe6b64cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 11:19:23 +0900 Subject: [PATCH 04/14] =?UTF-8?q?refactor:=20Category=20=EB=B7=B0=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=EC=97=90=EC=84=9C=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=8B=9C=EC=A0=90=EC=97=90=20categories=EB=A5=BC=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/Category/BookCategoryViewController.swift | 2 +- .../Source/Category/BookCategoryViewModel.swift | 12 +++++++----- .../Category/BookCategoryViewModelFactory.swift | 10 ++++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewController.swift index ffd282c6..23c9ea28 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewController.swift @@ -31,7 +31,7 @@ final class BookCategoryViewController: UIViewController { guard let viewModelFactory = try? DIContainer.shared.resolve(BookCategoryViewModelFactory.self) else { return nil } - self.viewModel = viewModelFactory.make() + self.viewModel = viewModelFactory.makeForHome() super.init(coder: coder) } diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModel.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModel.swift index 3c7a0af3..bb04987d 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModel.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModel.swift @@ -24,22 +24,24 @@ final class BookCategoryViewModel: ViewModelType { private let deleteBookCategoryUseCase: DeleteBookCategoryUseCase private let output = PassthroughSubject() private var cancellables = Set() - private(set) var categories = [ - BookCategory(order: 0, name: "전체"), - BookCategory(order: 1, name: "즐겨찾기") - ] + private(set) var categories = [BookCategory]() private(set) var currentCategoryName = "" init( createBookCategoryUseCase: CreateBookCategoryUseCase, fetchBookCategoriesUseCase: FetchBookCategoriesUseCase, updateBookCategoryUseCase: UpdateBookCategoryUseCase, - deleteBookCategoryUseCase: DeleteBookCategoryUseCase + deleteBookCategoryUseCase: DeleteBookCategoryUseCase, + categories: [BookCategory] = [ + BookCategory(order: 0, name: "전체"), + BookCategory(order: 1, name: "즐겨찾기") + ] ) { self.createBookCategoryUseCase = createBookCategoryUseCase self.fetchBookCategoriesUseCase = fetchBookCategoriesUseCase self.updateBookCategoryUseCase = updateBookCategoryUseCase self.deleteBookCategoryUseCase = deleteBookCategoryUseCase + self.categories = categories } func setup(currentCategory: String) { diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModelFactory.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModelFactory.swift index f97a74cb..c47cb8d5 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModelFactory.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Category/BookCategoryViewModelFactory.swift @@ -26,4 +26,14 @@ public struct BookCategoryViewModelFactory { deleteBookCategoryUseCase: deleteBookCategoryUseCase ) } + + func makeForCreateBook() -> BookCategoryViewModel { + BookCategoryViewModel( + createBookCategoryUseCase: createBookCategoryUseCase, + fetchBookCategoriesUseCase: fetchBookCategoriesUseCase, + updateBookCategoryUseCase: updateBookCategoryUseCase, + deleteBookCategoryUseCase: deleteBookCategoryUseCase, + categories: [] + ) + } } From 6b3eabbcc832c7e149763b58799cfc9812f20ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 11:23:58 +0900 Subject: [PATCH 05/14] =?UTF-8?q?feat:=20CreateBookViewController=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=8B=9C?= =?UTF-8?q?=ED=8A=B8=EC=A7=80=EC=9D=98=20=EB=8D=B8=EB=A6=AC=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EC=A0=84=EB=8B=AC=EB=B0=9B=EA=B8=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookCreation/CreateBookViewController.swift | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift index 64b051dd..5f4ca638 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift @@ -263,6 +263,7 @@ final class CreateBookViewController: UIViewController { let categoryViewModel = categoryViewModelFactory.makeForCreateBook() let categoryViewController = BookCategoryViewController(viewModel: categoryViewModel) let navigationController = UINavigationController(rootViewController: categoryViewController) + categoryViewController.delegate = self if let sheet = navigationController.sheetPresentationController { sheet.detents = [.medium(), .large()] @@ -355,3 +356,15 @@ extension CreateBookViewController: UITextFieldDelegate { return true } } + +extension CreateBookViewController: BookCategoryViewControllerDelegate { + func categoryViewController( + _ categoryViewController: BookCategoryViewController, + didSelectCategory category: String + ) { + var attributedTitle = AttributedString(stringLiteral: category) + attributedTitle.font = UIFont.ownglyphBerry(size: 25) + + categorySelectionButton.setAttributedTitle(NSAttributedString(attributedTitle), for: .normal) + } +} From 737a648c085dfd789015c83ff1e49b1caf729360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 11:29:31 +0900 Subject: [PATCH 06/14] =?UTF-8?q?refactor:=20=EC=B1=85=20=EC=BB=A4?= =?UTF-8?q?=EB=B2=84=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20placeholder=20?= =?UTF-8?q?=EC=A0=9C=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/BookCreation/CreateBookViewController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift index 5f4ca638..65fe789f 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift @@ -42,11 +42,11 @@ final class CreateBookViewController: UIViewController { } private let categorySelectionButton: UIButton = { let button = UIButton() - var attributedTitle = AttributedString(stringLiteral: "없음") + var attributedTitle = AttributedString(stringLiteral: "카테고리를 선택해주세요") attributedTitle.font = UIFont.ownglyphBerry(size: 25) button.setAttributedTitle(NSAttributedString(attributedTitle), for: .normal) - button.setTitleColor(.mhTitle, for: .normal) + button.setTitleColor(.systemGray3, for: .normal) // TODO: - 우측에 > 이미지 추가 button.contentHorizontalAlignment = .left return button @@ -365,6 +365,7 @@ extension CreateBookViewController: BookCategoryViewControllerDelegate { var attributedTitle = AttributedString(stringLiteral: category) attributedTitle.font = UIFont.ownglyphBerry(size: 25) + categorySelectionButton.setTitleColor(.mhTitle, for: .normal) categorySelectionButton.setAttributedTitle(NSAttributedString(attributedTitle), for: .normal) } } From 534030dd53970db5435abc93a955e965cef524e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 12:12:28 +0900 Subject: [PATCH 07/14] =?UTF-8?q?feat:=20CreateBookViewModelFactory=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateBookViewModelFactory.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModelFactory.swift diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModelFactory.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModelFactory.swift new file mode 100644 index 00000000..3c9dc8fe --- /dev/null +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModelFactory.swift @@ -0,0 +1,18 @@ +import MHDomain + +public struct CreateBookViewModelFactory { + private let createBookCoverUseCase: CreateBookCoverUseCase + + public init( + createBookCoverUseCase: CreateBookCoverUseCase + ) { + self.createBookCoverUseCase = createBookCoverUseCase + } + + func make(houseName: String) -> CreateBookViewModel { + CreateBookViewModel( + createBookCoverUseCase: createBookCoverUseCase, + houseName: houseName + ) + } +} From aae7018a0160360e3c5860b34a74e085b0fc3393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 12:12:44 +0900 Subject: [PATCH 08/14] =?UTF-8?q?feat:=20DIContainer=EC=97=90=20CreateBook?= =?UTF-8?q?ViewModelFactory=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MHApplication/Source/App/SceneDelegate.swift | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift b/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift index 55bf0177..1c2907d8 100644 --- a/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift +++ b/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift @@ -179,6 +179,10 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate { // MARK: - BookCover UseCase let bookCoverRepository = try DIContainer.shared.resolve(BookCoverRepository.self) + DIContainer.shared.register( + CreateBookCoverUseCase.self, + object: DefaultCreateBookCoverUseCase(repository: bookCoverRepository) + ) DIContainer.shared.register( FetchAllBookCoverUseCase.self, object: DefaultFetchAllBookCoverUseCase(repository: bookCoverRepository) @@ -216,6 +220,15 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate { ) ) + // MARK: - BookCover ViewModel + let createBookCoverUseCase = try DIContainer.shared.resolve(CreateBookCoverUseCase.self) + DIContainer.shared.register( + CreateBookViewModelFactory.self, + object: CreateBookViewModelFactory( + createBookCoverUseCase: createBookCoverUseCase + ) + ) + // MARK: Category ViewModel let createBookCategoryUseCase = try DIContainer.shared.resolve(CreateBookCategoryUseCase.self) let fetchBookCategoriesUseCase = try DIContainer.shared.resolve(FetchBookCategoriesUseCase.self) From c188bbeb11478230a5d4bf5d26e341aa66a82359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 12:13:17 +0900 Subject: [PATCH 09/14] =?UTF-8?q?feat:=20Home=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B1=85=20=EC=83=9D=EC=84=B1=20=ED=99=94=EB=A9=B4=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=84=98=EC=96=B4=EA=B0=88=20=EB=95=8C=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EB=B6=80=EC=97=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/Home/HomeViewController.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift index fa93f0c5..e053fa39 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift @@ -170,8 +170,14 @@ public final class HomeViewController: UIViewController { } private func moveMakingBookViewController() { - let bookCreationViewController = CreateBookViewController(viewModel: CreateBookViewModel()) - navigationController?.pushViewController(bookCreationViewController, animated: true) + do { + let createBookViewModelFactory = try DIContainer.shared.resolve(CreateBookViewModelFactory.self) + let createBookViewModel = createBookViewModelFactory.make(houseName: viewModel.houseName) + let bookCreationViewController = CreateBookViewController(viewModel: createBookViewModel) + navigationController?.pushViewController(bookCreationViewController, animated: true) + } catch { + MHLogger.error(error.localizedDescription) + } } private func configureConstraints() { From 8743c6fc94b5988164bfb74131e1e191f40d33c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 12:14:24 +0900 Subject: [PATCH 10/14] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/BookCreation/CreateBookViewController.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift index 65fe789f..78646998 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift @@ -3,8 +3,6 @@ import MHCore import Combine final class CreateBookViewController: UIViewController { - // MARK: - Constant - static let maxTitleLength = 10 // MARK: - Property private let bookCoverView: MHBookCover = MHBookCover() private let bookTitleTextField: UITextField = { @@ -78,6 +76,7 @@ final class CreateBookViewController: UIViewController { @Published private var viewModel: CreateBookViewModel private var cancellables: Set = [] + private let maxTitleLength = 10 // MARK: - Initializer init(viewModel: CreateBookViewModel) { From d71270fa1a3fb22028d8499d08b0b02773ccbe58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 12:15:21 +0900 Subject: [PATCH 11/14] =?UTF-8?q?feat:=20CreateBookViewModel=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateBookViewController.swift | 9 ++- .../BookCreation/CreateBookViewModel.swift | 63 ++++++++++++++++++- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift index 78646998..05c740c6 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift @@ -73,8 +73,11 @@ final class CreateBookViewController: UIViewController { return shadowLayer }() + + // MARK: - Property @Published private var viewModel: CreateBookViewModel + private let input = PassthroughSubject() private var cancellables: Set = [] private let maxTitleLength = 10 @@ -85,7 +88,10 @@ final class CreateBookViewController: UIViewController { super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { - viewModel = CreateBookViewModel() + guard let createBookViewModelFactory = try? DIContainer.shared.resolve(CreateBookViewModelFactory.self) else { + return nil + } + viewModel = createBookViewModelFactory.make(houseName: "") super.init(coder: coder) } @@ -212,6 +218,7 @@ final class CreateBookViewController: UIViewController { ) { [weak self] in // TODO: - 추후 뷰모델 관련 생성 이슈 조정 필요 let editBookViewModel = EditBookViewModel() + self?.input.send(.createBook) self?.navigationController?.pushViewController( EditBookViewController(viewModel: editBookViewModel), animated: true diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift index 432868f8..3a8aee02 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift @@ -1,8 +1,20 @@ +import Combine +import Photos +import MHCore import MHDomain import MHFoundation -import Photos -struct CreateBookViewModel { +final class CreateBookViewModel: ViewModelType { + enum Input { + case createBook + case updateTextField(text: String) + } + + enum Output { + case createdBook + case updatedBookCover + } + var bookTitle: String = "" var bookCategory: String = "" var previousColorNumber: Int = -1 @@ -18,5 +30,50 @@ struct CreateBookViewModel { default: .blue } } - let houseName: String = UserDefaults.standard.string(forKey: Constant.houseNameUserDefaultKey) ?? "" + private let createBookCoverUseCase: CreateBookCoverUseCase + private let output = PassthroughSubject() + private var cancellables = Set() + let houseName: String + + init( + createBookCoverUseCase: CreateBookCoverUseCase, + houseName: String + ) { + self.createBookCoverUseCase = createBookCoverUseCase + self.houseName = houseName + } + + func transform(input: AnyPublisher) -> AnyPublisher { + input.sink { [weak self] event in + switch event { + case .createBook: + Task { await self?.createBookInCoreData() } + case .updateTextField(let text): + self?.vaildateBookTitle(text: text) + } + }.store(in: &cancellables) + + return output.eraseToAnyPublisher() + } + + private func createBookInCoreData() async { + let bookCover = BookCover( + order: 0, + title: bookTitle, + imageURL: nil, + color: currentColor, + category: bookCategory, + favorite: false + ) + do { + try await createBookCoverUseCase.execute(with: bookCover) + output.send(.createdBook) + } catch { + MHLogger.error("Create BookCover 실패: \(error.localizedDescription)") + } + } + + private func vaildateBookTitle(text: String) { + bookTitle = text + } } From 48e37dd3c3298039d2d739533f0eb2122f683c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 12:16:14 +0900 Subject: [PATCH 12/14] =?UTF-8?q?fix:=20maxTitleLength=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=BB=B4=ED=8C=8C=EC=9D=BC=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/BookCreation/CreateBookViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift index 05c740c6..6c4123db 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift @@ -240,8 +240,8 @@ final class CreateBookViewController: UIViewController { // TitleTextField 변경 let titleAction = UIAction { [weak self] _ in guard let self else { return } - if self.bookTitleTextField.text?.count ?? 0 > Self.maxTitleLength { - self.bookTitleTextField.text = String(self.bookTitleTextField.text?.prefix(Self.maxTitleLength) ?? "") + if self.bookTitleTextField.text?.count ?? 0 > maxTitleLength { + self.bookTitleTextField.text = String(self.bookTitleTextField.text?.prefix(maxTitleLength) ?? "") } self.viewModel.bookTitle = self.bookTitleTextField.text ?? "" From 40d81ea1a98fbf84fe4afacd59165bb83936cdd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 12:34:17 +0900 Subject: [PATCH 13/14] =?UTF-8?q?fix:=20CreateBookViewModel=EB=A5=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=EC=9D=98=20Stucrt=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/App/SceneDelegate.swift | 9 --- .../CreateBookViewController.swift | 6 +- .../BookCreation/CreateBookViewModel.swift | 63 +------------------ .../CreateBookViewModelFactory.swift | 18 ------ .../Source/Home/HomeViewController.swift | 10 +-- 5 files changed, 6 insertions(+), 100 deletions(-) delete mode 100644 MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModelFactory.swift diff --git a/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift b/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift index 96f91376..1774b1e6 100644 --- a/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift +++ b/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift @@ -255,15 +255,6 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate { ) ) - // MARK: - BookCover ViewModel - let createBookCoverUseCase = try DIContainer.shared.resolve(CreateBookCoverUseCase.self) - DIContainer.shared.register( - CreateBookViewModelFactory.self, - object: CreateBookViewModelFactory( - createBookCoverUseCase: createBookCoverUseCase - ) - ) - // MARK: Category ViewModel let createBookCategoryUseCase = try DIContainer.shared.resolve(CreateBookCategoryUseCase.self) let fetchBookCategoriesUseCase = try DIContainer.shared.resolve(FetchBookCategoriesUseCase.self) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift index e7e109d8..b2533851 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewController.swift @@ -78,7 +78,6 @@ final class CreateBookViewController: UIViewController { // MARK: - Property @Published private var viewModel: CreateBookViewModel - private let input = PassthroughSubject() private var cancellables: Set = [] private let maxTitleLength = 10 @@ -89,10 +88,7 @@ final class CreateBookViewController: UIViewController { super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { - guard let createBookViewModelFactory = try? DIContainer.shared.resolve(CreateBookViewModelFactory.self) else { - return nil - } - viewModel = createBookViewModelFactory.make(houseName: "") + viewModel = CreateBookViewModel() super.init(coder: coder) } diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift index 3a8aee02..432868f8 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModel.swift @@ -1,20 +1,8 @@ -import Combine -import Photos -import MHCore import MHDomain import MHFoundation +import Photos -final class CreateBookViewModel: ViewModelType { - enum Input { - case createBook - case updateTextField(text: String) - } - - enum Output { - case createdBook - case updatedBookCover - } - +struct CreateBookViewModel { var bookTitle: String = "" var bookCategory: String = "" var previousColorNumber: Int = -1 @@ -30,50 +18,5 @@ final class CreateBookViewModel: ViewModelType { default: .blue } } - private let createBookCoverUseCase: CreateBookCoverUseCase - private let output = PassthroughSubject() - private var cancellables = Set() - let houseName: String - - init( - createBookCoverUseCase: CreateBookCoverUseCase, - houseName: String - ) { - self.createBookCoverUseCase = createBookCoverUseCase - self.houseName = houseName - } - - func transform(input: AnyPublisher) -> AnyPublisher { - input.sink { [weak self] event in - switch event { - case .createBook: - Task { await self?.createBookInCoreData() } - case .updateTextField(let text): - self?.vaildateBookTitle(text: text) - } - }.store(in: &cancellables) - - return output.eraseToAnyPublisher() - } - - private func createBookInCoreData() async { - let bookCover = BookCover( - order: 0, - title: bookTitle, - imageURL: nil, - color: currentColor, - category: bookCategory, - favorite: false - ) - do { - try await createBookCoverUseCase.execute(with: bookCover) - output.send(.createdBook) - } catch { - MHLogger.error("Create BookCover 실패: \(error.localizedDescription)") - } - } - - private func vaildateBookTitle(text: String) { - bookTitle = text - } + let houseName: String = UserDefaults.standard.string(forKey: Constant.houseNameUserDefaultKey) ?? "" } diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModelFactory.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModelFactory.swift deleted file mode 100644 index 3c9dc8fe..00000000 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCreation/CreateBookViewModelFactory.swift +++ /dev/null @@ -1,18 +0,0 @@ -import MHDomain - -public struct CreateBookViewModelFactory { - private let createBookCoverUseCase: CreateBookCoverUseCase - - public init( - createBookCoverUseCase: CreateBookCoverUseCase - ) { - self.createBookCoverUseCase = createBookCoverUseCase - } - - func make(houseName: String) -> CreateBookViewModel { - CreateBookViewModel( - createBookCoverUseCase: createBookCoverUseCase, - houseName: houseName - ) - } -} diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift index e053fa39..fa93f0c5 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/HomeViewController.swift @@ -170,14 +170,8 @@ public final class HomeViewController: UIViewController { } private func moveMakingBookViewController() { - do { - let createBookViewModelFactory = try DIContainer.shared.resolve(CreateBookViewModelFactory.self) - let createBookViewModel = createBookViewModelFactory.make(houseName: viewModel.houseName) - let bookCreationViewController = CreateBookViewController(viewModel: createBookViewModel) - navigationController?.pushViewController(bookCreationViewController, animated: true) - } catch { - MHLogger.error(error.localizedDescription) - } + let bookCreationViewController = CreateBookViewController(viewModel: CreateBookViewModel()) + navigationController?.pushViewController(bookCreationViewController, animated: true) } private func configureConstraints() { From bdbb9b084d435356774e158ff1e72f618389a129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=ED=9A=A8=EC=A4=80?= Date: Mon, 2 Dec 2024 12:39:07 +0900 Subject: [PATCH 14/14] =?UTF-8?q?chore:=20=EB=A6=B0=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MHApplication/MHApplication/Source/App/SceneDelegate.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift b/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift index 1774b1e6..dca76798 100644 --- a/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift +++ b/MemorialHouse/MHApplication/MHApplication/Source/App/SceneDelegate.swift @@ -213,6 +213,7 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate { DeleteBookCoverUseCase.self, object: DefaultDeleteBookCoverUseCase(repository: bookCoverRepository) ) + // MARK: - EditBook UseCase DIContainer.shared.register( PersistentlyStoreMediaUseCase.self,