Skip to content

Commit 77c19db

Browse files
authored
๐Ÿ”€ :: (#53) ๋‚˜๋งŒ์˜ ์•ฝ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
2 parents 7d15966 + 1b0aa78 commit 77c19db

47 files changed

Lines changed: 1286 additions & 38 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

โ€ŽProjects/App/Sources/Application/Coordinator/BookMarkFlow.swiftโ€Ž

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ final class BookMarkFlow: Flow {
2424
return reqiredBookMarkVC()
2525
case .madicineDetailIsRequired(let medicineInfo):
2626
return navigateToMedicineDetailVC(medicineInfo)
27+
case .createMyMedicineIsRequired:
28+
return presentMedicineRegister()
2729
default:
2830
return .none
2931
}
@@ -45,4 +47,16 @@ final class BookMarkFlow: Flow {
4547
withNextStepper: medicineDetailVC.viewModel
4648
))
4749
}
50+
51+
private func presentMedicineRegister() -> FlowContributors {
52+
let medicineRegisterVC = MedicineRegisterViewController(viewModel: appDI.medicineRegisterViewModel)
53+
medicineRegisterVC.modalPresentationStyle = .fullScreen
54+
55+
presentable.present(medicineRegisterVC, animated: true)
56+
57+
return .one(flowContributor: .contribute(
58+
withNextPresentable: medicineRegisterVC,
59+
withNextStepper: medicineRegisterVC.viewModel
60+
))
61+
}
4862
}

โ€ŽProjects/App/Sources/Application/Coordinator/SearchFlow.swiftโ€Ž

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ final class SearchFlow: Flow {
2424
return reqiredSearchVC()
2525
case .madicineDetailIsRequired(let medicineInfo):
2626
return navigateToMedicineDetailVC(medicineInfo)
27+
case .createMyMedicineIsRequired:
28+
return presentMedicineRegister()
2729
default:
2830
return .none
2931
}
@@ -40,9 +42,22 @@ final class SearchFlow: Flow {
4042
let medicineDetailVC = MedicineDetailViewController(viewModel: appDI.medicineDetailViewModel)
4143
medicineDetailVC.setUp(with: entity)
4244
presentable.navigationController?.pushViewController(medicineDetailVC, animated: true)
45+
4346
return .one(flowContributor: .contribute(
4447
withNextPresentable: medicineDetailVC,
4548
withNextStepper: medicineDetailVC.viewModel
4649
))
4750
}
51+
52+
private func presentMedicineRegister() -> FlowContributors {
53+
let medicineRegisterVC = MedicineRegisterViewController(viewModel: appDI.medicineRegisterViewModel)
54+
medicineRegisterVC.modalPresentationStyle = .fullScreen
55+
56+
presentable.present(medicineRegisterVC, animated: true)
57+
58+
return .one(flowContributor: .contribute(
59+
withNextPresentable: medicineRegisterVC,
60+
withNextStepper: medicineRegisterVC.viewModel
61+
))
62+
}
4863
}

โ€ŽProjects/App/Sources/Application/Coordinator/Steps/FlowStep.swiftโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ enum FlowStep: Step {
1212
case madicineDetailIsRequired(with: MedicineInfoEntity)
1313
case timeLineDetailIsRequired
1414
case appInfoIsRequired
15+
case createMyMedicineIsRequired
1516
}

โ€ŽProjects/App/Sources/Application/DI/AppDI.swiftโ€Ž

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ struct AppDI {
99
let bookMarkDetailViewModel: BookMarkDetailViewModel
1010
let timeLineDetailViewModel: TimeLineDetailViewModel
1111
let appInfoViewModel: AppInfoViewModel
12+
let medicineRegisterViewModel: MedicineRegisterViewModel
1213
}
1314

1415
extension AppDI {
@@ -37,14 +38,18 @@ extension AppDI {
3738
fetchTakenMedicineListUseCase: serviceDI.fetchTakenMedicineListUseCase
3839
)
3940
let appInfoViewModelInject = AppInfoViewModel()
41+
let medicineRegisterViewModelInject = MedicineRegisterViewModel(
42+
registerMyMedicineUseCase: serviceDI.registerMyMedicineUseCase
43+
)
4044

4145
return .init(
4246
homeViewModel: homeViewModelInject,
4347
searchViewModel: searchViewModelInject,
4448
medicineDetailViewModel: medicineDetailViewModelInject,
4549
bookMarkDetailViewModel: bookMarkDetailViewModelInject,
4650
timeLineDetailViewModel: timeLineDetailViewModelInject,
47-
appInfoViewModel: appInfoViewModelInject
51+
appInfoViewModel: appInfoViewModelInject,
52+
medicineRegisterViewModel: medicineRegisterViewModelInject
4853
)
4954
}
5055
}

โ€ŽProjects/App/Sources/Scene/BookMarkDetail/BookMarkDetailViewController.swiftโ€Ž

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,22 @@ class BookMarkDetailViewController: BaseVC<BookMarkDetailViewModel> {
1414
$0.rowHeight = 120
1515
$0.keyboardDismissMode = .onDrag
1616
}
17+
1718
private let bookMarkEmptyView = EmptyStatusView(
1819
icon: FlowKitAsset.readingGlassesWithCloud.image,
1920
title: "๋“ฑ๋ก๋œ ์•ฝ์ด ์—†์Šต๋‹ˆ๋‹ค",
2021
subTitle: "์•ฝ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ž์ฃผ ๋จน๋Š”\n์•ฝ์„ ๋“ฑ๋กํ•ด๋ณด์„ธ์š”"
2122
)
2223

24+
// ๋‚˜๋งŒ์˜ ์•ฝ ์ถ”๊ฐ€ ๋ฒ„ํŠผ
25+
private let creactMyMedicineNavigationButton = UIBarButtonItem().then {
26+
$0.image = UIImage(systemName: "plus")
27+
$0.tintColor = .black
28+
}
29+
2330
override func attridute() {
2431
navigationItem.title = "์ž์ฃผ ๋จน๋Š” ์•ฝ"
32+
navigationItem.rightBarButtonItem = creactMyMedicineNavigationButton
2533
}
2634

2735
override func addView() {
@@ -45,7 +53,8 @@ class BookMarkDetailViewController: BaseVC<BookMarkDetailViewModel> {
4553
override func bind() {
4654
let input = BookMarkDetailViewModel.Input(
4755
viewWillAppear: viewWillAppearRelay.asObservable(),
48-
selectedItemIndex: resultTableView.rx.itemSelected.asObservable()
56+
selectedItemIndex: resultTableView.rx.itemSelected.asObservable(),
57+
onTapCreateMyMedicineButton: creactMyMedicineNavigationButton.rx.tap.asObservable()
4958
)
5059
let output = viewModel.transform(input: input)
5160

โ€ŽProjects/App/Sources/Scene/BookMarkDetail/BookMarkDetailViewModel.swiftโ€Ž

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class BookMarkDetailViewModel: ViewModelType, Stepper {
1818
struct Input {
1919
let viewWillAppear: Observable<Void>
2020
let selectedItemIndex: Observable<IndexPath>
21+
let onTapCreateMyMedicineButton: Observable<Void>
2122
}
2223

2324
struct Output {
@@ -44,6 +45,11 @@ class BookMarkDetailViewModel: ViewModelType, Stepper {
4445
.bind(to: steps)
4546
.disposed(by: disposeBag)
4647

48+
input.onTapCreateMyMedicineButton
49+
.map { FlowStep.createMyMedicineIsRequired }
50+
.bind(to: steps)
51+
.disposed(by: disposeBag)
52+
4753
return Output(bookMarkList: bookMarkList.asDriver())
4854
}
4955
}

โ€ŽProjects/App/Sources/Scene/BookMarkDetail/Component/BookMarkResultTableCell.swiftโ€Ž

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ extension BookMarkResultTableCell {
8585
companyNameLabel.text = entity.companyName
8686
updateAtLabel.contentText = entity.updateDate
8787
medicineTypeLabel.contentText = entity.medicineType.toString
88-
medicineTypeLabel.setTagType(tagType: entity.medicineType == .NOMAL ? .Common : .Primary)
88+
89+
let tagTypeMapper: [MedicineTypeEnum: TagType] = [
90+
.NOMAL: .Common,
91+
.PRESCRIPTION: .Primary,
92+
.CUSTOM: .Secondary
93+
]
94+
medicineTypeLabel.setTagType(tagType: tagTypeMapper[entity.medicineType] ?? .Common)
8995
}
9096
}

โ€ŽProjects/App/Sources/Scene/Home/Component/PillgramAD/PillGramADBanner.swiftโ€Ž

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
import UIKit
44
import FlowKit
55

6-
import SwiftUI
7-
86
class PillGramADBanner: BaseButton {
97
private let bannerImageView = UIImageView().then {
108
$0.image = UIImage(named: "PillGramBanner")

โ€ŽProjects/App/Sources/Scene/MedicineDetail/MedicineDetailViewController.swiftโ€Ž

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class MedicineDetailViewController: BaseVC<MedicineDetailViewModel> {
2020
private let scrollView = VScrollView(showsVerticalScrollIndicator: true)
2121
private let medicineImageView = UIImageView().then {
2222
$0.contentMode = .scaleAspectFill
23+
$0.clipsToBounds = true
2324
}
2425
private let updateAtLabel = PaddingLableView()
2526
private let companyNameLabel = UILabel().then {
@@ -44,6 +45,7 @@ class MedicineDetailViewController: BaseVC<MedicineDetailViewModel> {
4445
private let interactionExplain = ExplainFormView(title: "์ƒํ˜ธ์ž‘์šฉ")
4546
private let sideEffectExplain = ExplainFormView(title: "๋ถ€์ž‘์šฉ")
4647
private let storageMethodExplain = ExplainFormView(title: "๋ณด๊ด€๋ฒ•")
48+
private let customShortDescription = ExplainFormView(title: "๊ฐ„๋‹จํ•œ ์„ค๋ช…")
4749

4850
override func attridute() {
4951
navigationItem.title = "์ƒ์„ธ์ •๋ณด"
@@ -63,6 +65,7 @@ class MedicineDetailViewController: BaseVC<MedicineDetailViewModel> {
6365
)
6466
medicineImageView.addSubview(updateAtLabel)
6567
explainVStack.addArrangedSubviews(
68+
customShortDescription,
6669
efficacyExplain,
6770
howToUseExplain,
6871
cautionWarningExplain,
@@ -97,12 +100,12 @@ class MedicineDetailViewController: BaseVC<MedicineDetailViewModel> {
97100
$0.leading.trailing.equalToSuperview().inset(20)
98101
}
99102
medicineCodeLabel.snp.makeConstraints {
100-
$0.top.equalTo(medicineNameLabel.snp.bottom).offset(5)
101-
$0.leading.equalToSuperview().inset(20)
103+
$0.top.equalTo(medicineTypeLabel)
104+
$0.leading.equalTo(medicineTypeLabel.snp.trailing).offset(5)
102105
}
103106
medicineTypeLabel.snp.makeConstraints {
104-
$0.top.equalTo(medicineCodeLabel)
105-
$0.leading.equalTo(medicineCodeLabel.snp.trailing).offset(5)
107+
$0.top.equalTo(medicineNameLabel.snp.bottom).offset(5)
108+
$0.leading.equalToSuperview().inset(20)
106109
}
107110
explainVStack.snp.makeConstraints {
108111
$0.top.equalTo(medicineCodeLabel.snp.bottom).offset(25)
@@ -183,12 +186,33 @@ extension MedicineDetailViewController {
183186
interactionExplain.explain = entity.interaction
184187
sideEffectExplain.explain = entity.sideEffect
185188
storageMethodExplain.explain = entity.storageMethod
189+
customShortDescription.explain = entity.howToUse
186190

187191
updateAtLabel.contentText = "๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ: \(entity.updateDate)"
188192
medicineCodeLabel.contentText = entity.itemCode
189193
medicineTypeLabel.contentText = entity.medicineType.toString
190-
medicineTypeLabel.setTagType(tagType: entity.medicineType == .NOMAL ? .Common : .Primary)
191194
item = entity
195+
196+
// ์•ฝ ํƒ€์ž…๋ณ„ TagType
197+
let tagTypeMapper: [MedicineTypeEnum: TagType] = [
198+
.NOMAL: .Common,
199+
.PRESCRIPTION: .Primary,
200+
.CUSTOM: .Secondary
201+
]
202+
medicineTypeLabel.setTagType(tagType: tagTypeMapper[entity.medicineType] ?? .Common)
203+
204+
// ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ์•ฝ์ผ ๋•Œ,
205+
customShortDescription.isHidden = entity.medicineType != .CUSTOM
206+
[
207+
efficacyExplain,
208+
howToUseExplain,
209+
cautionWarningExplain,
210+
cautionExplain,
211+
interactionExplain,
212+
sideEffectExplain,
213+
storageMethodExplain,
214+
medicineCodeLabel
215+
].forEach { $0.isHidden = entity.medicineType == .CUSTOM }
192216
}
193217
}
194218

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// Copyright ยฉ 2025 com.flow-health. All rights reserved.
2+
3+
import UIKit
4+
import FlowKit
5+
6+
class RegisterHeaderView: BaseView {
7+
private let descriptionLabel = UILabel().then {
8+
$0.font = .bodyB2SemiBold
9+
$0.textColor = .blue1
10+
$0.textAlignment = .left
11+
$0.numberOfLines = 0
12+
}
13+
14+
private let titleLabel = UILabel().then {
15+
$0.font = .headerH2SemiBold
16+
$0.textColor = .black
17+
$0.textAlignment = .left
18+
}
19+
20+
init(description: String?, title: String?) {
21+
super.init(frame: .zero)
22+
descriptionLabel.text = description
23+
titleLabel.text = title
24+
}
25+
26+
@MainActor required init?(coder: NSCoder) {
27+
fatalError("init(coder:) has not been implemented")
28+
}
29+
30+
override func addView() {
31+
addSubViews(descriptionLabel, titleLabel)
32+
}
33+
34+
override func setLayout() {
35+
descriptionLabel.snp.makeConstraints {
36+
$0.top.leading.trailing.equalToSuperview()
37+
}
38+
39+
titleLabel.snp.makeConstraints {
40+
$0.top.equalTo(descriptionLabel.snp.bottom).offset(5)
41+
$0.leading.trailing.equalToSuperview()
42+
}
43+
44+
self.snp.makeConstraints {
45+
$0.bottom.equalTo(titleLabel.snp.bottom)
46+
}
47+
}
48+
}

0 commit comments

Comments
ย (0)