Skip to content

Commit

Permalink
feat: BookCover 이미지 추가 기능 구현
Browse files Browse the repository at this point in the history
- EditPhotoViewModel 삭제
  • Loading branch information
k2645 committed Dec 3, 2024
1 parent 4f6560d commit 4c94dad
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 111 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -329,11 +329,5 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate {
ReadPageViewModelFactory.self,
object: ReadPageViewModelFactory(fetchMediaUseCase: fetchMediaUseCase)
)

// MARK: - EditPhoto ViewModel
DIContainer.shared.register(
EditPhotoViewModelFactory.self,
object: EditPhotoViewModelFactory(createMediaUseCase: createMediaUseCase)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,9 @@ final class BookCoverViewController: UIViewController {
nowIndex: nowIndex,
bookCoverImage: bookColor.image
)
case .bookImage(let imageData):
guard let imageData else { return }
self?.bookCoverView.configure(targetImage: UIImage(data: imageData))
case .bookCategory(let category):
self?.setCategorySelectionButton(category: category)
case .moveToNext(let bookID):
Expand Down Expand Up @@ -198,6 +201,9 @@ final class BookCoverViewController: UIViewController {
nowIndex: nowIndex,
bookCoverImage: bookColor.image
)
case .bookImage(let imageData):
guard let imageData else { return }
self?.bookCoverView.configure(targetImage: UIImage(data: imageData))
case .bookCategory(let category):
self?.setCategorySelectionButton(category: category)
case .moveToHome:
Expand Down Expand Up @@ -367,10 +373,18 @@ extension BookCoverViewController {
bookTitleTextField.addAction(titleAction, for: .editingChanged)

let selectPhotoAction = UIAction { [weak self] _ in
// TODO: - 사진 접근 제어 추가
let albumViewModel = CustomAlbumViewModel()
let customAlbumViewController = CustomAlbumViewController(viewModel: albumViewModel, mediaType: .image)
self?.navigationController?.pushViewController(customAlbumViewController, animated: true)
let customAlbumViewController = CustomAlbumViewController(
viewModel: albumViewModel,
mediaType: .image,
mode: .bookCover
) { imageData, _, _ in
self?.createInput.send(.changedBookImage(bookImage: imageData))
self?.modifyInput.send(.changedBookImage(bookImage: imageData))
}
let navigationViewController = UINavigationController(rootViewController: customAlbumViewController)
navigationViewController.modalPresentationStyle = .fullScreen
self?.present(navigationViewController, animated: true)
}
imageSelectionButton.addAction(selectPhotoAction, for: .touchUpInside)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ final class CreateBookCoverViewModel: ViewModelType {
case viewDidAppear
case changedBookTitle(title: String?)
case changedBookColor(colorIndex: Int)
case changedBookImage(bookImage: Data?)
case changedBookCategory(category: String?)
case saveBookCover
case deleteBookCover
Expand All @@ -18,6 +19,7 @@ final class CreateBookCoverViewModel: ViewModelType {
case memorialHouseName(name: String)
case bookTitle(title: String?)
case bookColorIndex(previousIndex: Int?, nowIndex: Int, bookColor: BookColor)
case bookImage(imageData: Data?)
case bookCategory(category: String?)
case moveToNext(bookID: UUID)
case moveToHome
Expand All @@ -36,6 +38,7 @@ final class CreateBookCoverViewModel: ViewModelType {
private let bookOrder: Int
private var bookTitle: String?
private var bookColor: BookColor?
private var bookImageData: Data?
private var bookCategory: String?

init(
Expand Down Expand Up @@ -64,6 +67,8 @@ final class CreateBookCoverViewModel: ViewModelType {
self?.setBookTitle(title: title)
case .changedBookColor(let colorIndex):
self?.setBookColor(nowIndex: colorIndex)
case .changedBookImage(let bookImage):
self?.setBookImageData(imageData: bookImage)
case .changedBookCategory(let category):
self?.setBookCategory(category: category)
case .saveBookCover:
Expand All @@ -79,6 +84,11 @@ final class CreateBookCoverViewModel: ViewModelType {
return output.eraseToAnyPublisher()
}

private func setBookTitle(title: String?) {
bookTitle = title
output.send(.bookTitle(title: title))
}

private func setBookColor(nowIndex: Int) {
var previousIndex: Int?
if let bookColor {
Expand All @@ -89,9 +99,9 @@ final class CreateBookCoverViewModel: ViewModelType {
output.send(.bookColorIndex(previousIndex: previousIndex, nowIndex: nowIndex, bookColor: bookColor))
}

private func setBookTitle(title: String?) {
bookTitle = title
output.send(.bookTitle(title: title))
private func setBookImageData(imageData: Data?) {
bookImageData = imageData
output.send(.bookImage(imageData: imageData))
}

private func setBookCategory(category: String?) {
Expand All @@ -112,7 +122,7 @@ final class CreateBookCoverViewModel: ViewModelType {
let newBookCover = BookCover(
order: bookOrder,
title: bookTitle,
imageData: nil,
imageData: bookImageData,
color: bookColor,
category: bookCategory
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ final class ModifyBookCoverViewModel: ViewModelType {
case loadBookCover
case changedBookTitle(title: String?)
case changedBookColor(colorIndex: Int)
case changedBookImage(bookImage: Data?)
case changedBookCategory(category: String?)
case saveBookCover
case cancelModifyBookCover
Expand All @@ -18,6 +19,7 @@ final class ModifyBookCoverViewModel: ViewModelType {
case setModifyView(title: String?, category: String?)
case bookTitle(title: String?)
case bookColorIndex(previousIndex: Int?, nowIndex: Int, bookColor: BookColor)
case bookImage(imageData: Data?)
case bookCategory(category: String?)
case moveToHome
case settingFailure
Expand All @@ -33,6 +35,7 @@ final class ModifyBookCoverViewModel: ViewModelType {
private var bookOrder: Int?
private var bookTitle: String?
private var bookColor: BookColor?
private var bookImageData: Data?
private var bookCategory: String?

init(
Expand All @@ -59,6 +62,8 @@ final class ModifyBookCoverViewModel: ViewModelType {
self?.setBookTitle(title: title)
case .changedBookColor(let colorIndex):
self?.setBookColor(nowIndex: colorIndex)
case .changedBookImage(let bookImage):
self?.setBookImageData(imageData: bookImage)
case .changedBookCategory(let category):
self?.setBookCategory(category: category)
case .saveBookCover:
Expand All @@ -71,6 +76,11 @@ final class ModifyBookCoverViewModel: ViewModelType {
return output.eraseToAnyPublisher()
}

private func setBookTitle(title: String?) {
bookTitle = title
output.send(.bookTitle(title: title))
}

private func setBookColor(nowIndex: Int) {
var previousIndex: Int?
if let bookColor {
Expand All @@ -81,9 +91,9 @@ final class ModifyBookCoverViewModel: ViewModelType {
output.send(.bookColorIndex(previousIndex: previousIndex, nowIndex: nowIndex, bookColor: bookColor))
}

private func setBookTitle(title: String?) {
bookTitle = title
output.send(.bookTitle(title: title))
private func setBookImageData(imageData: Data?) {
bookImageData = imageData
output.send(.bookImage(imageData: imageData))
}

private func setBookCategory(category: String?) {
Expand All @@ -101,8 +111,10 @@ final class ModifyBookCoverViewModel: ViewModelType {
bookOrder = bookCover.order
bookTitle = bookCover.title
bookColor = bookCover.color
bookImageData = bookCover.imageData
bookCategory = bookCover.category
output.send(.bookTitle(title: bookTitle))
output.send(.bookImage(imageData: bookImageData))
output.send(.bookCategory(category: bookCategory))
if let bookColor {
output.send(.bookColorIndex(previousIndex: nil, nowIndex: bookColor.index, bookColor: bookColor))
Expand All @@ -118,7 +130,7 @@ final class ModifyBookCoverViewModel: ViewModelType {
let newBookCover = BookCover(
order: bookOrder,
title: bookTitle,
imageData: nil,
imageData: bookImageData,
color: bookColor,
category: bookCategory
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import Photos
import Combine

final class CustomAlbumViewController: UIViewController {
enum Mode {
case bookCover
case editPage
}
// MARK: - UI Components
private lazy var albumCollectionView: UICollectionView = {
let flowLayout = UICollectionViewFlowLayout()
Expand All @@ -23,18 +27,29 @@ final class CustomAlbumViewController: UIViewController {
private let input = PassthroughSubject<CustomAlbumViewModel.Input, Never>()
private var cancellables = Set<AnyCancellable>()
private let mediaType: PHAssetMediaType
private let mode: Mode
private let completionHandler: (_ imageData: Data, _ creationDate: Date?, _ caption: String?) -> Void

// MARK: - Initializer
init(viewModel: CustomAlbumViewModel, mediaType: PHAssetMediaType) {
init(
viewModel: CustomAlbumViewModel,
mediaType: PHAssetMediaType,
mode: Mode = .editPage,
completionHandler: @escaping (_ imageData: Data, _ creationDate: Date?, _ caption: String?) -> Void
) {
self.viewModel = viewModel
self.mediaType = mediaType
self.mode = mode
self.completionHandler = completionHandler

super.init(nibName: nil, bundle: nil)
}

required init?(coder: NSCoder) {
self.viewModel = CustomAlbumViewModel()
self.mediaType = .image
self.mode = .bookCover
self.completionHandler = { _, _, _ in }

super.init(nibName: nil, bundle: nil)
}
Expand Down Expand Up @@ -101,7 +116,7 @@ final class CustomAlbumViewController: UIViewController {
normal: normalAttributes,
selected: selectedAttributes
) { [weak self] in
self?.navigationController?.popViewController(animated: true)
self?.dismiss(animated: true)
}
}

Expand Down Expand Up @@ -157,7 +172,7 @@ final class CustomAlbumViewController: UIViewController {
if status == .authorized || status == .limited {
self.input.send(.viewDidLoad(mediaType: self.mediaType))
} else {
self.navigationController?.popViewController(animated: true)
self.dismiss(animated: true)
}
}
}
Expand Down Expand Up @@ -210,9 +225,19 @@ final class CustomAlbumViewController: UIViewController {
}

private func moveToEditView(image: UIImage?, creationDate: Date) {
guard let viewModelFactory = try? DIContainer.shared.resolve(EditPhotoViewModelFactory.self) else { return }
let editPhotoViewModel = viewModelFactory.make(creationDate: creationDate)
let editPhotoViewController = EditPhotoViewController(viewModel: editPhotoViewModel)
var editPhotoViewController: EditPhotoViewController
switch mode {
case .bookCover:
editPhotoViewController = EditPhotoViewController(
mode: .bookCover,
completionHandler: completionHandler
)
case .editPage:
editPhotoViewController = EditPhotoViewController(
mode: .editPage,
completionHandler: completionHandler
)
}
editPhotoViewController.setPhoto(image: image)
self.navigationController?.pushViewController(editPhotoViewController, animated: true)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import UIKit
import Combine

final class EditPhotoViewController: UIViewController {
enum Mode {
case bookCover
case editPage
}
// MARK: - UI Components
private let clearView = UIView.dimmedView(opacity: 0)
private let dimmedView1 = UIView.dimmedView(opacity: 0.5)
Expand Down Expand Up @@ -66,26 +69,33 @@ final class EditPhotoViewController: UIViewController {
private var captionTextFieldBottomConstraint: NSLayoutConstraint?

// MARK: - Properties
private let viewModel: EditPhotoViewModel
private let input = PassthroughSubject<EditPhotoViewModel.Input, Never>()
private var cancellables = Set<AnyCancellable>()
private let mode: Mode
private var creationDate: Date?
private let completionHandler: (_ imageData: Data, _ creationDate: Date?, _ caption: String?) -> Void

init(viewModel: EditPhotoViewModel) {
self.viewModel = viewModel
init(
mode: Mode,
creationDate: Date? = nil,
completionHandler: @escaping (_ imageData: Data, _ creationDate: Date?, _ caption: String?) -> Void
) {
self.mode = mode
self.creationDate = creationDate
self.completionHandler = completionHandler

super.init(nibName: nil, bundle: nil)
}

// TODO: ViewModel Factory 수정
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
self.mode = .editPage
self.completionHandler = { _, _, _ in }

super.init(nibName: nil, bundle: nil)
}

// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()

bind()
setup()
configureNavigationBar()
configureAddSubView()
Expand All @@ -99,19 +109,6 @@ final class EditPhotoViewController: UIViewController {
configureNavigationAppearance()
}

// MARK: - Binding
private func bind() {
let output = viewModel.transform(input: input.eraseToAnyPublisher())

output.sink { event in
switch event {
case .moveToNextView:
// TODO: - 다음 뷰로 이동 로직
break
}
}.store(in: &cancellables)
}

// MARK: - Setup
private func setup() {
view.backgroundColor = .black
Expand All @@ -129,6 +126,12 @@ final class EditPhotoViewController: UIViewController {
name: UIResponder.keyboardWillHideNotification,
object: nil
)
switch mode {
case .bookCover:
captionTextField.isHidden = true
case .editPage:
captionTextField.isHidden = false
}
}

// MARK: - Configure Navigation
Expand Down Expand Up @@ -161,7 +164,8 @@ final class EditPhotoViewController: UIViewController {
) { [weak self] in
guard let imageData = self?.cropImage()?.pngData() else { return }
let caption = self?.captionTextField.text
self?.input.send(.doneEditPhoto(imageData: imageData, caption: caption))
self?.completionHandler(imageData, self?.creationDate, caption)
self?.dismiss(animated: true)
}
}

Expand Down Expand Up @@ -249,7 +253,12 @@ final class EditPhotoViewController: UIViewController {
bottom: photoScrollView.topAnchor,
trailing: view.trailingAnchor
)
photoScrollView.setWidthAndHeight(width: view.frame.width, height: view.frame.width * 0.75)
switch mode {
case .bookCover:
photoScrollView.setWidthAndHeight(width: view.frame.width, height: view.frame.width)
case .editPage:
photoScrollView.setWidthAndHeight(width: view.frame.width, height: view.frame.width * 0.75)
}
photoScrollView.setCenter(view: clearView)
photoImageView.setWidthAndHeight(width: photoScrollView.widthAnchor, height: photoScrollView.heightAnchor)
photoImageView.setAnchor(
Expand Down
Loading

0 comments on commit 4c94dad

Please sign in to comment.