diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Book/View/BookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Book/View/BookViewController.swift index 2148f586..6db0d0f1 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Book/View/BookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Book/View/BookViewController.swift @@ -35,6 +35,7 @@ final class BookViewController: UIViewController { setup() configureNavigationBar() configureConstraints() + input.send(.loadBookTitle) } override func viewWillAppear(_ animated: Bool) { @@ -56,8 +57,8 @@ final class BookViewController: UIViewController { case .loadFirstPage(let page): guard let page else { return } self?.configureFirstPageViewController(firstPage: page) - case .moveToEdit(let bookID): - self?.presentEditBookView(bookID: bookID) + case .moveToEdit(let bookID, let bookTitle): + self?.presentEditBookView(bookID: bookID, bookTitle: bookTitle) } } .store(in: &cancellables) @@ -129,10 +130,10 @@ final class BookViewController: UIViewController { } // MARK: - PresentEditBookView - private func presentEditBookView(bookID: UUID) { + private func presentEditBookView(bookID: UUID, bookTitle: String) { do { let editBookViewModelFactory = try DIContainer.shared.resolve(EditBookViewModelFactory.self) - let editBookViewModel = editBookViewModelFactory.make(bookID: bookID) + let editBookViewModel = editBookViewModelFactory.make(bookID: bookID, bookTitle: bookTitle) let editBookViewController = EditBookViewController(viewModel: editBookViewModel, mode: .modify) navigationController?.pushViewController(editBookViewController, animated: true) } catch { diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Book/ViewModel/BookViewModel.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Book/ViewModel/BookViewModel.swift index 14f7d57f..9b0bcbf9 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Book/ViewModel/BookViewModel.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Book/ViewModel/BookViewModel.swift @@ -4,6 +4,7 @@ import Combine public final class BookViewModel: ViewModelType { enum Input { + case loadBookTitle case loadBook case loadPreviousPage case loadNextPage @@ -13,7 +14,7 @@ public final class BookViewModel: ViewModelType { enum Output { case setBookTitle(with: String?) case loadFirstPage(page: Page?) - case moveToEdit(bookID: UUID) + case moveToEdit(bookID: UUID, bookTitle: String) } private let fetchBookUseCase: FetchBookUseCase @@ -22,21 +23,26 @@ public final class BookViewModel: ViewModelType { let identifier: UUID private var book: Book? + private let bookTitle: String private var nowPageIndex: Int = 0 var previousPage: Page? { nowPageIndex > 0 ? book?.pages[nowPageIndex - 1] : nil } var nextPage: Page? { nowPageIndex < (book?.pages.count ?? 0) - 1 ? book?.pages[nowPageIndex + 1] : nil } init( fetchBookUseCase: FetchBookUseCase, - identifier: UUID + identifier: UUID, + bookTitle: String ) { self.fetchBookUseCase = fetchBookUseCase self.identifier = identifier + self.bookTitle = bookTitle } func transform(input: AnyPublisher) -> AnyPublisher { input.sink { [weak self] event in switch event { + case .loadBookTitle: + self?.output.send(.setBookTitle(with: self?.bookTitle)) case .loadBook: Task { try await self?.fetchBook() } case .loadPreviousPage: @@ -49,7 +55,7 @@ public final class BookViewModel: ViewModelType { } case .editBook: guard let self else { return } - self.output.send(.moveToEdit(bookID: self.identifier)) + self.output.send(.moveToEdit(bookID: self.identifier, bookTitle: bookTitle)) } } .store(in: &cancellables) @@ -59,7 +65,6 @@ public final class BookViewModel: ViewModelType { private func fetchBook() async throws { book = try await fetchBookUseCase.execute(id: identifier) - output.send(.setBookTitle(with: book?.title)) output.send(.loadFirstPage(page: book?.pages[nowPageIndex])) } } diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Book/ViewModel/BookViewModelFactory.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Book/ViewModel/BookViewModelFactory.swift index 3d19de5b..bc2886a2 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Book/ViewModel/BookViewModelFactory.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Book/ViewModel/BookViewModelFactory.swift @@ -4,14 +4,17 @@ import MHDomain public struct BookViewModelFactory { private let fetchBookUseCase: FetchBookUseCase - public init(fetchBookUseCase: FetchBookUseCase) { + public init( + fetchBookUseCase: FetchBookUseCase + ) { self.fetchBookUseCase = fetchBookUseCase } - public func make(bookID: UUID) -> BookViewModel { + public func make(bookID: UUID, bookTitle: String) -> BookViewModel { BookViewModel( fetchBookUseCase: fetchBookUseCase, - identifier: bookID + identifier: bookID, + bookTitle: bookTitle ) } } diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCover/View/BookCoverViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCover/View/BookCoverViewController.swift index 71e4305d..ebc8a782 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/BookCover/View/BookCoverViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/BookCover/View/BookCoverViewController.swift @@ -228,8 +228,9 @@ final class BookCoverViewController: UIViewController { // MARK: - Present EditBookViewController private func presentEditBookView(bookID: UUID) { do { + guard let bookTitle = bookTitleTextField.text else { return } let editBookViewModelFactory = try DIContainer.shared.resolve(EditBookViewModelFactory.self) - let editBookViewModel = editBookViewModelFactory.make(bookID: bookID) + let editBookViewModel = editBookViewModelFactory.make(bookID: bookID, bookTitle: bookTitle) let editBookViewController = EditBookViewController(viewModel: editBookViewModel) navigationController?.pushViewController(editBookViewController, animated: true) } catch { diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/View/EditBookViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/View/EditBookViewController.swift index c9d00539..8c9df5c6 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/View/EditBookViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/View/EditBookViewController.swift @@ -96,7 +96,7 @@ final class EditBookViewController: UIViewController { required init?(coder: NSCoder) { guard let viewModel = try? DIContainer.shared.resolve(EditBookViewModelFactory.self) else { return nil } - self.viewModel = viewModel.make(bookID: .init()) + self.viewModel = viewModel.make(bookID: .init(), bookTitle: "") self.mode = .create super.init(coder: coder) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/ViewModel/EditBookViewModel.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/ViewModel/EditBookViewModel.swift index 1f067f56..c476d2dc 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/ViewModel/EditBookViewModel.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/ViewModel/EditBookViewModel.swift @@ -34,7 +34,7 @@ final class EditBookViewModel: ViewModelType { private let fetchMediaUseCase: FetchMediaUseCase private let deleteMediaUseCase: DeleteMediaUseCase private let bookID: UUID - private var title: String = "" + private let bookTitle: String private var editPageViewModels: [EditPageViewModel] = [] private var currentPageIndex = 0 @@ -47,7 +47,8 @@ final class EditBookViewModel: ViewModelType { createMediaUseCase: CreateMediaUseCase, fetchMediaUseCase: FetchMediaUseCase, deleteMediaUseCase: DeleteMediaUseCase, - bookID: UUID + bookID: UUID, + bookTitle: String ) { self.fetchBookUseCase = fetchBookUseCase self.updateBookUseCase = updateBookUseCase @@ -57,6 +58,7 @@ final class EditBookViewModel: ViewModelType { self.fetchMediaUseCase = fetchMediaUseCase self.deleteMediaUseCase = deleteMediaUseCase self.bookID = bookID + self.bookTitle = bookTitle } // MARK: - Binding Method @@ -86,7 +88,6 @@ final class EditBookViewModel: ViewModelType { private func fetchBook() async { do { let book = try await fetchBookUseCase.execute(id: bookID) - title = book.title editPageViewModels = book.pages.map { page in let editPageViewModel = EditPageViewModel( fetchMediaUseCase: fetchMediaUseCase, @@ -97,7 +98,7 @@ final class EditBookViewModel: ViewModelType { editPageViewModel.delegate = self return editPageViewModel } - output.send(.updateViewController(title: title)) + output.send(.updateViewController(title: bookTitle)) } catch { output.send(.error(message: "책을 가져오는데 실패했습니다.")) MHLogger.error(error.localizedDescription + #function) @@ -154,7 +155,7 @@ final class EditBookViewModel: ViewModelType { private func saveMediaAll() async { let pages = editPageViewModels.map { $0.page } - let book = Book(id: bookID, title: title, pages: pages) + let book = Book(id: bookID, title: bookTitle, pages: pages) let mediaList = pages.flatMap { $0.metadata.values } do { try await updateBookUseCase.execute(id: bookID, book: book) diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/ViewModel/EditBookViewModelFactory.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/ViewModel/EditBookViewModelFactory.swift index 5d181d22..6e93a954 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/ViewModel/EditBookViewModelFactory.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/EditBook/ViewModel/EditBookViewModelFactory.swift @@ -28,7 +28,7 @@ public struct EditBookViewModelFactory { self.deleteMediaUseCase = deleteMediaUseCase } - func make(bookID: UUID) -> EditBookViewModel { + func make(bookID: UUID, bookTitle: String) -> EditBookViewModel { EditBookViewModel( fetchBookUseCase: fetchBookUseCase, updateBookUseCase: updateBookUseCase, @@ -37,7 +37,8 @@ public struct EditBookViewModelFactory { createMediaUseCase: createMediaUseCase, fetchMediaUseCase: fetchMediaUseCase, deleteMediaUseCase: deleteMediaUseCase, - bookID: bookID + bookID: bookID, + bookTitle: bookTitle ) } } diff --git a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/View/HomeViewController.swift b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/View/HomeViewController.swift index daccb4e4..24028d44 100644 --- a/MemorialHouse/MHPresentation/MHPresentation/Source/Home/View/HomeViewController.swift +++ b/MemorialHouse/MHPresentation/MHPresentation/Source/Home/View/HomeViewController.swift @@ -302,10 +302,11 @@ extension HomeViewController: UICollectionViewDataSource { private func bookCoverTapped(indexPath: IndexPath) { let bookID = viewModel.currentBookCovers[indexPath.row].id + let bookTitle = viewModel.currentBookCovers[indexPath.row].title guard let bookViewModelFactory = try? DIContainer.shared.resolve(BookViewModelFactory.self) else { return } - let bookViewModel = bookViewModelFactory.make(bookID: bookID) + let bookViewModel = bookViewModelFactory.make(bookID: bookID, bookTitle: bookTitle) let bookViewController = BookViewController(viewModel: bookViewModel) navigationController?.pushViewController(bookViewController, animated: true) }