Skip to content

Commit

Permalink
[fix][#40] 코드리뷰 반영
Browse files Browse the repository at this point in the history
  • Loading branch information
dayo2n committed Sep 3, 2024
1 parent 11dd381 commit da7aa08
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 122 deletions.
67 changes: 65 additions & 2 deletions Targets/Mashow/Sources/Common/Model/DrinkType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,69 @@

import Foundation

enum DrinkType: CaseIterable {
case soju, liquor, makgeoli, sake, beer, wine, cocktail, highball
enum DrinkType: String, CaseIterable {
case soju, liquor, makgeolli, sake, beer, wine, cocktail, highball

var colorHexValues: [String] {
switch self {
case .soju:
["8EFFA7", "CCFFD1"]
case .liquor:
["8EEBFF", "CCF3FF"]
case .makgeolli:
["E2FF8E", "F2FFCC"]
case .sake:
["FF8EED", "FFA9F1"]
case .beer:
["FFC93F", "FFE040"]
case .wine:
["DCA3FF", "F6DCFF"]
case .cocktail:
["FFC46B", "FFF0BC"]
case .highball:
["FFFA81", "FFFCBC"]
}
}

var korean: String {
switch self {
case .soju:
"소주"
case .liquor:
"양주"
case .makgeolli:
"막걸리"
case .sake:
"사케"
case .beer:
"맥주"
case .wine:
"와인"
case .cocktail:
"칵테일"
case .highball:
"하이볼"
}
}

var tag: Int {
switch self {
case .soju:
0
case .liquor:
1
case .makgeolli:
2
case .sake:
3
case .beer:
4
case .wine:
5
case .cocktail:
6
case .highball:
7
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import SnapKit

final class DrinkSelectionViewController: UIViewController {

init(viewModel: DrinkSelectionViewModel!) {
init(viewModel: DrinkSelectionViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
Expand All @@ -21,9 +21,9 @@ final class DrinkSelectionViewController: UIViewController {
fatalError("init(coder:) has not been implemented")
}

let viewModel: DrinkSelectionViewModel!
let viewModel: DrinkSelectionViewModel
private var cancellables = Set<AnyCancellable>()
private let drinkTypeList = DrinkSelectionViewModel.DrinkType.allCases
private let drinkTypeList = DrinkType.allCases

private var removedButtonTag: Int?
typealias TypeButtonTag = Int
Expand Down Expand Up @@ -94,7 +94,7 @@ final class DrinkSelectionViewController: UIViewController {
}
}

private extension DrinkSelectionViewController {
extension DrinkSelectionViewController {

private func bind() {
viewModel.state.currentType
Expand All @@ -105,7 +105,7 @@ private extension DrinkSelectionViewController {
}
.store(in: &cancellables)

viewModel.state.addedTypesPublisher
viewModel.state.addedTypes
.receive(on: DispatchQueue.main)
.sink { [weak self] addedTypes in
guard let self = self else { return }
Expand All @@ -119,7 +119,7 @@ private extension DrinkSelectionViewController {
} else {
guard !addedTypes.isEmpty else { return }
// If type added
let newButton = self.makeAddedTypeButton()
let newButton = self.makeAddedTypeButton(for: viewModel.state.currentType.value)
newButton.addTarget(self, action: #selector(didTapToRemoveType), for: .touchUpInside)
self.addedDrinkTypeButtons[viewModel.state.currentType.value.tag] = newButton
UIView.transition(with: addedTypesStackView, duration: 0.5, options: .transitionCrossDissolve) {
Expand All @@ -136,23 +136,27 @@ private extension DrinkSelectionViewController {
viewModel.removeType(drinkTypeList[index])
}

private func makeAddedTypeButton() -> UIButton {
let button = UIButton()
let view = UIStackView()
view.axis = .horizontal
view.spacing = 5
private func makeAddedTypeButton(for type: DrinkType) -> UIButton {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.spacing = 5
stackView.isUserInteractionEnabled = false

let label = UILabel()
label.text = viewModel.state.currentType.value.korean
label.text = type.korean
label.font = .pretendard(size: 16, weight: .semibold)
label.textColor = .white

let icon = UIImageView(image: UIImage(systemName: "xmark"))
icon.tintColor = .white
icon.contentMode = .scaleAspectFit
icon.frame = CGRect(x: 0, y: 0, width: 12, height: 12)
view.addArrangedSubview(label)
view.addArrangedSubview(icon)
button.addSubview(view)
view.snp.makeConstraints { make in

stackView.addArrangedSubview(label)
stackView.addArrangedSubview(icon)
let button = UIButton()
button.addSubview(stackView)
stackView.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(20)
make.trailing.equalToSuperview().offset(-20)
make.top.equalToSuperview().offset(6)
Expand All @@ -161,7 +165,7 @@ private extension DrinkSelectionViewController {
button.backgroundColor = UIColor.hex("151515").withAlphaComponent(0.5)
button.clipsToBounds = true
button.layer.cornerRadius = 15
button.tag = viewModel.state.currentType.value.tag
button.tag = type.tag
return button
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import SnapKit

final class DrinkTypeViewController: UIViewController {

let viewModel: DrinkSelectionViewModel!
var drinkType: DrinkSelectionViewModel.DrinkType
let viewModel: DrinkSelectionViewModel
var drinkType: DrinkType
var cancellables = Set<AnyCancellable>()

init(viewModel: DrinkSelectionViewModel, drinkType: DrinkSelectionViewModel.DrinkType) {
init(viewModel: DrinkSelectionViewModel, drinkType: DrinkType) {
self.viewModel = viewModel
self.drinkType = drinkType
super.init(nibName: nil, bundle: nil)
Expand All @@ -36,27 +36,30 @@ final class DrinkTypeViewController: UIViewController {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 127, height: 40))
button.layer.cornerRadius = 20
button.layer.masksToBounds = true
button.backgroundColor = .white.withAlphaComponent(0.15)

let stackView = UIStackView()
stackView.axis = .horizontal
stackView.spacing = 4
stackView.alignment = .center
stackView.bounds = button.bounds
stackView.isUserInteractionEnabled = false

let view = UIStackView()
view.axis = .horizontal
view.spacing = 4
view.alignment = .center
let label = UILabel()
label.font = .pretendard(size: 16, weight: .bold)
var icon = UIImageView(image: UIImage(systemName: "plus"))

button.backgroundColor = .white.withAlphaComponent(0.15)
label.text = "주종 추가"
label.textColor = .white.withAlphaComponent(0.7)

var icon = UIImageView(image: UIImage(systemName: "plus"))
icon.tintColor = .white.withAlphaComponent(0.7)
view.addArrangedSubview(label)
view.addArrangedSubview(icon)
button.addSubview(view)
view.bounds = button.bounds
view.snp.makeConstraints { make in

stackView.addArrangedSubview(label)
stackView.addArrangedSubview(icon)
button.addSubview(stackView)
stackView.snp.makeConstraints { make in
make.center.equalTo(button)
}
if viewModel.state.addedTypesPublisher.value.count >= 3 {
if viewModel.state.addedTypes.value.count >= 3 {
button.isEnabled = false
button.layer.opacity = 0.3
}
Expand All @@ -68,13 +71,20 @@ final class DrinkTypeViewController: UIViewController {
button.layer.cornerRadius = 20
button.layer.masksToBounds = true

let view = UIStackView()
view.axis = .horizontal
view.spacing = 4
view.alignment = .center
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.spacing = 4
stackView.alignment = .center
stackView.bounds = button.bounds

let label = UILabel()
label.font = .pretendard(size: 16, weight: .bold)
label.text = "추가됨"
label.textColor = UIColor.hex("434343")

var icon = UIImageView(image: UIImage(systemName: "plus"))
icon = UIImageView(image: UIImage(systemName: "checkmark"))
icon.tintColor = UIColor.hex("434343")

let gradient = CAGradientLayer()
gradient.frame = button.bounds
Expand All @@ -85,16 +95,11 @@ final class DrinkTypeViewController: UIViewController {
gradient.startPoint = CGPoint(x: 0.0, y: 0.0)
gradient.endPoint = CGPoint(x: 1.0, y: 0.0)
button.layer.insertSublayer(gradient, at: 0)
label.text = "추가됨"
label.textColor = UIColor.hex("434343")
icon = UIImageView(image: UIImage(systemName: "checkmark"))
icon.tintColor = UIColor.hex("434343")

view.addArrangedSubview(label)
view.addArrangedSubview(icon)
button.addSubview(view)
view.bounds = button.bounds
view.snp.makeConstraints { make in
stackView.addArrangedSubview(label)
stackView.addArrangedSubview(icon)
button.addSubview(stackView)
stackView.snp.makeConstraints { make in
make.center.equalTo(button)
}
button.isEnabled = false
Expand All @@ -120,7 +125,7 @@ final class DrinkTypeViewController: UIViewController {
private extension DrinkTypeViewController {

private func bind() {
viewModel.state.addedTypesPublisher
viewModel.state.addedTypes
.receive(on: DispatchQueue.main)
.sink { [weak self] addedTypes in
guard let self = self else { return }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,76 +10,10 @@ import UIKit
import Combine

class DrinkSelectionViewModel {
enum DrinkType: String, CaseIterable {
case soju, liquor, makgeolli, sake, beer, wine, cocktail, highball

var colorHexValues: [String] {
switch self {
case .soju:
["8EFFA7", "CCFFD1"]
case .liquor:
["8EEBFF", "CCF3FF"]
case .makgeolli:
["E2FF8E", "F2FFCC"]
case .sake:
["FF8EED", "FFA9F1"]
case .beer:
["FFC93F", "FFE040"]
case .wine:
["DCA3FF", "F6DCFF"]
case .cocktail:
["FFC46B", "FFF0BC"]
case .highball:
["FFFA81", "FFFCBC"]
}
}

var korean: String {
switch self {
case .soju:
"소주"
case .liquor:
"양주"
case .makgeolli:
"막걸리"
case .sake:
"사케"
case .beer:
"맥주"
case .wine:
"와인"
case .cocktail:
"칵테일"
case .highball:
"하이볼"
}
}

var tag: Int {
switch self {
case .soju:
0
case .liquor:
1
case .makgeolli:
2
case .sake:
3
case .beer:
4
case .wine:
5
case .cocktail:
6
case .highball:
7
}
}
}

struct State {
var currentType = CurrentValueSubject<DrinkType, Never>(DrinkType.soju)
var addedTypesPublisher = CurrentValueSubject<[DrinkType], Never>([])
var addedTypes = CurrentValueSubject<[DrinkType], Never>([])
}

var state: State
Expand All @@ -89,17 +23,17 @@ class DrinkSelectionViewModel {
}

func addType(_ type: DrinkType) {
guard state.addedTypesPublisher.value.count < 3, !state.addedTypesPublisher.value.contains(type) else { return }
var current = state.addedTypesPublisher.value
var current = state.addedTypes.value
guard state.addedTypes.value.count < 3, !current.contains(type) else { return }
current.append(type)
state.addedTypesPublisher.send(current)
state.addedTypes.send(current)
}

func removeType(_ type: DrinkType) {
guard state.addedTypesPublisher.value.contains(type) else { return }
var current = state.addedTypesPublisher.value
var current = state.addedTypes.value
guard current.contains(type) else { return }
guard let targetIndex = current.firstIndex(of: type) else { return }
current.remove(at: targetIndex)
state.addedTypesPublisher.send(current)
state.addedTypes.send(current)
}
}
1 change: 1 addition & 0 deletions Targets/Mashow/Sources/Root/MashowRootViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class MashowRootViewController: UIViewController {

// Remove back button title("Back")
navigationItem.backButtonTitle = ""
navigationController?.pushViewController(DrinkSelectionViewController(viewModel: DrinkSelectionViewModel(state: DrinkSelectionViewModel.State())), animated: true)
}

private func bind() {
Expand Down

0 comments on commit da7aa08

Please sign in to comment.