From 48cf51a5cf7c5804d522cf93d703481c5402342d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sun, 6 Sep 2026 17:04:39 +0900 Subject: [PATCH 1/5] =?UTF-8?q?delete:=20=EC=A3=BC=EB=AC=B8=20=ED=94=8C?= =?UTF-8?q?=EB=A1=9C=ED=8C=85=20=EB=B2=84=ED=8A=BC=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrderFloatingButton.swift | 174 ------------------ koin.xcodeproj/project.pbxproj | 4 - 2 files changed, 178 deletions(-) delete mode 100644 Koin/Core/View/OrderHistoryUIComponents/OrderFloatingButton.swift diff --git a/Koin/Core/View/OrderHistoryUIComponents/OrderFloatingButton.swift b/Koin/Core/View/OrderHistoryUIComponents/OrderFloatingButton.swift deleted file mode 100644 index 5bca7eff..00000000 --- a/Koin/Core/View/OrderHistoryUIComponents/OrderFloatingButton.swift +++ /dev/null @@ -1,174 +0,0 @@ -// -// OrderFloatingButton.swift -// koin -// -// Created by 이은지 on 9/8/25. -// - -import UIKit -import Lottie -import Then -import SnapKit - -final class OrderFloatingButton: UIControl { - - // MARK: - Properties - var titleText: String? { - get { titleLabel.text } - set { titleLabel.text = newValue } - } - - var subtitleText: String? { - get { subtitleLabel.text } - set { subtitleLabel.text = newValue } - } - - var rightImage: UIImage? { - get { rightImageView.image } - set { rightImageView.image = newValue } - } - - // MARK: - UI Components - private let containerView = UIView().then { - $0.backgroundColor = .white - $0.layer.cornerRadius = 32 - $0.layer.shadowColor = UIColor.black.cgColor - $0.layer.shadowOffset = CGSize(width: 0, height: 4) - $0.layer.shadowRadius = 8 - $0.layer.shadowOpacity = 0.2 - } - - let lottieView = LottieAnimationView().then { - $0.contentMode = .scaleAspectFit - $0.loopMode = .loop - } - - private let labelStackView = UIStackView().then { - $0.axis = .vertical - $0.alignment = .leading - $0.distribution = .fillEqually - $0.spacing = 0 - } - - private let titleLabel = UILabel().then { - $0.font = UIFont.appFont(.pretendardBold, size: 16) - $0.textColor = UIColor.appColor(.new500) - } - - private let subtitleLabel = UILabel().then { - $0.font = UIFont.appFont(.pretendardMedium, size: 12) - $0.textColor = UIColor.appColor(.neutral600) - } - - private let rightImageView = UIImageView().then { - $0.contentMode = .scaleAspectFit - $0.image = UIImage.appImage(asset: .chevronRight)?.withRenderingMode(.alwaysTemplate) - $0.tintColor = UIColor.appColor(.new500) - } - - // MARK: - Initializers - override init(frame: CGRect) { - super.init(frame: frame) - configureView() - setAddTarget() - - containerView.isUserInteractionEnabled = false - lottieView.isUserInteractionEnabled = false - labelStackView.isUserInteractionEnabled = false - rightImageView.isUserInteractionEnabled = false - - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - configureView() - setAddTarget() - } - - private func setAddTarget() { - addTarget(self, action: #selector(touchDown), for: .touchDown) - addTarget(self, action: #selector(touchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel]) - } - - // MARK: - Lottie Animation Methods - func setLottieAnimation(named name: String, bundle: Bundle = .main) { - lottieView.animation = LottieAnimation.named(name, bundle: bundle) - } - - func playLottieAnimation() { - lottieView.play() - } - - func stopLottieAnimation() { - lottieView.stop() - } -} - -// MARK: - @objc -extension OrderFloatingButton { - @objc private func touchDown() { - UIView.animate(withDuration: 0.1) { - self.containerView.transform = CGAffineTransform(scaleX: 0.95, y: 0.95) - self.containerView.alpha = 0.8 - } - } - - @objc private func touchUp() { - UIView.animate(withDuration: 0.1) { - self.containerView.transform = .identity - self.containerView.alpha = 1.0 - } - } -} - -// MARK: - UI Function -extension OrderFloatingButton { - private func setUpLayout() { - addSubview(containerView) - - containerView.addSubview(lottieView) - containerView.addSubview(labelStackView) - containerView.addSubview(rightImageView) - - labelStackView.addArrangedSubview(titleLabel) - labelStackView.addArrangedSubview(subtitleLabel) - } - - private func setUpConstraints() { - containerView.snp.makeConstraints { - $0.edges.equalToSuperview() - $0.height.equalTo(64) - } - - lottieView.snp.makeConstraints { - $0.leading.equalToSuperview().offset(6.5) - $0.centerY.equalToSuperview() - $0.width.equalTo(60) - $0.height.equalTo(57) - } - - labelStackView.snp.makeConstraints { - $0.leading.equalTo(lottieView.snp.trailing).offset(12) - $0.centerY.equalToSuperview() - $0.trailing.lessThanOrEqualTo(rightImageView.snp.leading).offset(-12) - } - - rightImageView.snp.makeConstraints { - $0.trailing.equalToSuperview().inset(14.5) - $0.centerY.equalToSuperview() - $0.width.equalTo(24) - $0.height.equalTo(12) - } - } - - private func configureView() { - setUpLayout() - setUpConstraints() - } -} - -extension OrderFloatingButton { - var lottieAnimationView: LottieAnimationView { - return lottieView - } -} diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index c01a4cdd..551541d0 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -1007,7 +1007,6 @@ D8B1A9EC2E321E7800943535 /* ShopSortType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8B1A9EB2E321E7800943535 /* ShopSortType.swift */; }; D8B4E0022DBFAB95001FBC89 /* CheckVerificationCodeUsecase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8B4E0012DBFAB95001FBC89 /* CheckVerificationCodeUsecase.swift */; }; D8B4E0042DBFAD1A001FBC89 /* CheckVerificationCodeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8B4E0032DBFAD1A001FBC89 /* CheckVerificationCodeRequest.swift */; }; - D8F5C54A2E6EF76800FB6708 /* OrderFloatingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C5492E6EF76800FB6708 /* OrderFloatingButton.swift */; }; D8F5C54C2E6F012500FB6708 /* LottieAnimationManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */; }; D8F5C5562E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; F1A000010000000000000001 /* ZoomingCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000002 /* ZoomingCollectionView.swift */; }; @@ -2036,7 +2035,6 @@ D8B1A9EB2E321E7800943535 /* ShopSortType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopSortType.swift; sourceTree = ""; }; D8B4E0012DBFAB95001FBC89 /* CheckVerificationCodeUsecase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckVerificationCodeUsecase.swift; sourceTree = ""; }; D8B4E0032DBFAD1A001FBC89 /* CheckVerificationCodeRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckVerificationCodeRequest.swift; sourceTree = ""; }; - D8F5C5492E6EF76800FB6708 /* OrderFloatingButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderFloatingButton.swift; sourceTree = ""; }; D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieAnimationManageable.swift; sourceTree = ""; }; D8F5C5532E6F144300FB6708 /* floatingLogo.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = floatingLogo.json; sourceTree = ""; }; EC692285302700A400EE26ED /* koinUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = koinUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -4697,7 +4695,6 @@ B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */, B608F0E32EB5DC2C0006F355 /* FilteringButton.swift */, B608F0E42EB5DC2C0006F355 /* OrderHistoryCustomSearchBar.swift */, - D8F5C5492E6EF76800FB6708 /* OrderFloatingButton.swift */, ); path = OrderHistoryUIComponents; sourceTree = ""; @@ -5865,7 +5862,6 @@ D215725C2CEDD04C0061E725 /* LectureRequest.swift in Sources */, D29F21F62C4FD2C700994554 /* FetchLandDetailRequest.swift in Sources */, D208A7A02CA10F1A007040E7 /* AbTestRepository.swift in Sources */, - D8F5C54A2E6EF76800FB6708 /* OrderFloatingButton.swift in Sources */, D2B2193B2D66626900EAF5B1 /* LostItemChatHistoryData.swift in Sources */, 83DD0DBB2C551E5100278ABD /* BusTimetableInfo.swift in Sources */, B47839052E70FAFE00D002E3 /* OrderShopSummary.swift in Sources */, From 4ad629bf296003082e2cde9de730e189684030cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sun, 6 Sep 2026 17:05:19 +0900 Subject: [PATCH 2/5] =?UTF-8?q?delete:=20=EC=A3=BC=EB=AC=B8=20=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EA=B2=80=EC=83=89=20=EB=B0=94=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrderHistoryCustomSearchBar.swift | 143 ------------------ koin.xcodeproj/project.pbxproj | 4 - 2 files changed, 147 deletions(-) delete mode 100644 Koin/Core/View/OrderHistoryUIComponents/OrderHistoryCustomSearchBar.swift diff --git a/Koin/Core/View/OrderHistoryUIComponents/OrderHistoryCustomSearchBar.swift b/Koin/Core/View/OrderHistoryUIComponents/OrderHistoryCustomSearchBar.swift deleted file mode 100644 index 743a464c..00000000 --- a/Koin/Core/View/OrderHistoryUIComponents/OrderHistoryCustomSearchBar.swift +++ /dev/null @@ -1,143 +0,0 @@ -// -// OrderHistoryCustomSearchBar.swift -// koin -// -// Created by 김성민 on 9/8/25. -// - -import UIKit -import SnapKit - -final class OrderHistoryCustomSearchBar: UIView { - - //MARK: - CallBack - var onTextChanged: ((String) -> Void)? - var onReturn: ((String) -> Void)? - - // MARK: - UI - private let iconView = UIImageView().then { - $0.image = UIImage.appImage(asset: .search)?.withRenderingMode(.alwaysTemplate) - $0.tintColor = UIColor.appColor(.neutral500) - $0.contentMode = .scaleAspectFit - } - - let textField = UITextField().then { - - $0.clearButtonMode = .whileEditing - $0.returnKeyType = .search - $0.autocapitalizationType = .none - $0.clearButtonMode = .never - $0.autocorrectionType = .no - $0.spellCheckingType = .no - $0.font = UIFont.appFont(.pretendardRegular, size: 14) - $0.textColor = .label - $0.attributedPlaceholder = NSAttributedString( - string: "주문한 메뉴/매장을 찾아보세요", - attributes: [ - .foregroundColor: UIColor.appColor(.neutral400), - .font: UIFont.appFont(.pretendardRegular, size: 14) - ] - ) - } - - // MARK: - Layout Config - var contentInsets = UIEdgeInsets(top: 6, left: 12, bottom: 6, right: 12) { didSet { remakeConstraints() } } - var spacing: CGFloat = 8 { didSet { remakeConstraints() } } - var iconSize: CGFloat = 18 { didSet { iconView.snp.updateConstraints { $0.size.equalTo(iconSize) } } } - - override init(frame: CGRect) { - super.init(frame: frame) - setupUI() - setupActions() - setDelegate() - makeConstraints() - } - required init?(coder: NSCoder) { fatalError() } - - func setPlaceholder(_ text: String) { - textField.attributedPlaceholder = NSAttributedString( - string: text, - attributes: [ - .foregroundColor: UIColor.appColor(.neutral400), - .font: UIFont.appFont(.pretendardRegular, size: 14) - ] - ) - } - - func setLeftIcon(_ image: UIImage?, tint: UIColor? = nil) { - iconView.image = image?.withRenderingMode(.alwaysTemplate) - if let tint { iconView.tintColor = tint } - } - - @discardableResult - func focus() -> Bool { textField.becomeFirstResponder() } - func unfocus() { textField.resignFirstResponder() } - - // MARK: - Private - private func setupUI() { - backgroundColor = UIColor.appColor(.neutral0) - layer.cornerRadius = 16 - layer.masksToBounds = false - - layer.shadowColor = UIColor.black.cgColor - layer.shadowOffset = CGSize(width: 0, height: 2) - layer.shadowRadius = 4 - layer.shadowOpacity = 0.06 - - addSubview(iconView) - addSubview(textField) - } - - private func setupActions() { - textField.addTarget(self, action: #selector(textDidChange), for: .editingChanged) - } - - private func setDelegate(){ - textField.delegate = self - } - - private func makeConstraints() { - iconView.snp.makeConstraints { - $0.size.equalTo(iconSize) - $0.leading.equalToSuperview().inset(contentInsets.left) - $0.centerY.equalToSuperview() - } - textField.snp.makeConstraints { - $0.leading.equalTo(iconView.snp.trailing).offset(spacing) - $0.top.equalToSuperview().inset(contentInsets.top) - $0.bottom.equalToSuperview().inset(contentInsets.bottom) - $0.trailing.equalToSuperview().inset(contentInsets.right) - $0.height.greaterThanOrEqualTo(28) - } - } - - private func remakeConstraints() { - iconView.snp.remakeConstraints { - $0.size.equalTo(iconSize) - $0.leading.equalToSuperview().inset(contentInsets.left) - $0.centerY.equalToSuperview() - } - textField.snp.remakeConstraints { - $0.leading.equalTo(iconView.snp.trailing).offset(spacing) - $0.top.equalToSuperview().inset(contentInsets.top) - $0.bottom.equalToSuperview().inset(contentInsets.bottom) - $0.trailing.equalToSuperview().inset(contentInsets.right) - $0.height.greaterThanOrEqualTo(28) - } - layoutIfNeeded() - } - - @objc private func textDidChange() { - onTextChanged?(textField.text ?? "") - } -} - -extension OrderHistoryCustomSearchBar: UITextFieldDelegate { - func textFieldShouldReturn(_ textField: UITextField) -> Bool { - onReturn?(textField.text ?? "") - return true - } -} - - - diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index 551541d0..49330408 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -757,7 +757,6 @@ B47839052E70FAFE00D002E3 /* OrderShopSummary.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47839042E70FAFE00D002E3 /* OrderShopSummary.swift */; }; B47839072E70FF2B00D002E3 /* OrderShopMenusGroups.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47839062E70FF2B00D002E3 /* OrderShopMenusGroups.swift */; }; B4B3EB262E6E7CAD00F8A23A /* OrderShopMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B3EB252E6E7CAD00F8A23A /* OrderShopMenus.swift */; }; - B608F0E62EB5DC2D0006F355 /* OrderHistoryCustomSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B608F0E42EB5DC2C0006F355 /* OrderHistoryCustomSearchBar.swift */; }; B608F0E72EB5DC2D0006F355 /* FilteringButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B608F0E32EB5DC2C0006F355 /* FilteringButton.swift */; }; B608F0E82EB5DC2D0006F355 /* EmptyStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */; }; B60D25462ED72017000E57B7 /* RadioButtonState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60D25442ED72017000E57B7 /* RadioButtonState.swift */; }; @@ -1783,7 +1782,6 @@ B4B3EB252E6E7CAD00F8A23A /* OrderShopMenus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderShopMenus.swift; sourceTree = ""; }; B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyStateView.swift; sourceTree = ""; }; B608F0E32EB5DC2C0006F355 /* FilteringButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilteringButton.swift; sourceTree = ""; }; - B608F0E42EB5DC2C0006F355 /* OrderHistoryCustomSearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderHistoryCustomSearchBar.swift; sourceTree = ""; }; B60D25412ED72017000E57B7 /* RadioButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButton.swift; sourceTree = ""; }; B60D25422ED72017000E57B7 /* RadioButtonColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonColors.swift; sourceTree = ""; }; B60D25432ED72017000E57B7 /* RadioButtonGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonGroup.swift; sourceTree = ""; }; @@ -4694,7 +4692,6 @@ children = ( B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */, B608F0E32EB5DC2C0006F355 /* FilteringButton.swift */, - B608F0E42EB5DC2C0006F355 /* OrderHistoryCustomSearchBar.swift */, ); path = OrderHistoryUIComponents; sourceTree = ""; @@ -6015,7 +6012,6 @@ 833D9C392C7058C300982145 /* NoticeListRepository.swift in Sources */, D27DD0E22BA609740081FD36 /* MenuDto.swift in Sources */, D27A5D9C2C6BE56500C4275F /* FetchShopListRequest.swift in Sources */, - B608F0E62EB5DC2D0006F355 /* OrderHistoryCustomSearchBar.swift in Sources */, B608F0E72EB5DC2D0006F355 /* FilteringButton.swift in Sources */, B608F0E82EB5DC2D0006F355 /* EmptyStateView.swift in Sources */, D29F21C32C4DE27C00994554 /* UserService.swift in Sources */, From fb4fd61ddcd49bf9a4ab43b4738db1e82cb527e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sun, 6 Sep 2026 17:06:04 +0900 Subject: [PATCH 3/5] =?UTF-8?q?delete:=20=EC=A3=BC=EB=AC=B8=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=20Sheet=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FilteringButton.swift | 103 ------------------ koin.xcodeproj/project.pbxproj | 4 - 2 files changed, 107 deletions(-) delete mode 100644 Koin/Core/View/OrderHistoryUIComponents/FilteringButton.swift diff --git a/Koin/Core/View/OrderHistoryUIComponents/FilteringButton.swift b/Koin/Core/View/OrderHistoryUIComponents/FilteringButton.swift deleted file mode 100644 index 018b3c5a..00000000 --- a/Koin/Core/View/OrderHistoryUIComponents/FilteringButton.swift +++ /dev/null @@ -1,103 +0,0 @@ -// -// FilteringButton.swift -// koin -// -// Created by 김성민 on 9/6/25. -// - -import UIKit - -final class FilteringButton: UIButton { - - private var isSelectable: Bool = true - private var forcedOn: Bool? = nil - - override init(frame: CGRect) { - super.init(frame: frame) - titleLabel?.numberOfLines = 1 - - var config = UIButton.Configuration.plain() - config.imagePlacement = .trailing - config.imagePadding = 6 - config.contentInsets = .init(top: 6, leading: 8, bottom: 6, trailing: 8) - config.attributedTitle = AttributedString("필터", attributes: .init([ - .font: UIFont.appFont(.pretendardBold, size: 14) - ])) - - var background = UIBackgroundConfiguration.clear() - background.backgroundColor = UIColor.appColor(.neutral0) - background.cornerRadius = 24 - background.strokeWidth = 0.5 - background.strokeColor = UIColor.appColor(.neutral300) - config.background = background - - config.image = UIImage.appImage(asset: .chevronDown) - config.baseForegroundColor = UIColor.appColor(.neutral500) - - self.configuration = config - - self.configurationUpdateHandler = { [weak self] button in - guard let self = self, var config = button.configuration else { return } - var background = config.background - let on = self.forcedOn ?? button.isSelected - if on { - background.backgroundColor = UIColor.appColor(.new500) - background.strokeWidth = 0 - background.strokeColor = nil - config.baseForegroundColor = UIColor.appColor(.neutral0) - } else { - background.backgroundColor = UIColor.appColor(.neutral0) - background.strokeWidth = 0.5 - background.strokeColor = UIColor.appColor(.neutral300) - config.baseForegroundColor = UIColor.appColor(.neutral500) - } - config.background = background - button.configuration = config - } - - addTarget(self, action: #selector(handleTap), for: .touchUpInside) - } - - required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - - func setTitle(_ text: String) { - guard var config = configuration else { return } - config.attributedTitle = AttributedString(text, attributes: .init([ - .font: UIFont.appFont(.pretendardBold, size: 14) - ])) - configuration = config - } - - func set(title: String, iconRight: UIImage? = nil, showsChevron: Bool = false) { - guard var config = configuration else { return } - config.attributedTitle = AttributedString(title, attributes: .init([ - .font: UIFont.appFont(.pretendardBold, size: 14) - ])) - if showsChevron { - config.image = UIImage.appImage(asset: .chevronDown) - } else { - config.image = iconRight?.withRenderingMode(.alwaysTemplate) - } - config.imagePlacement = .trailing - config.imagePadding = (config.image == nil) ? 0 : 6 - configuration = config - setNeedsUpdateConfiguration() - } - - func applyFilter(_ on: Bool) { - forcedOn = on - setNeedsUpdateConfiguration() - } - - func setSelectable(_ selectable: Bool) { - isSelectable = selectable - } - - @objc private func handleTap() { - if isSelectable { - isSelected.toggle() - setNeedsUpdateConfiguration() - } - } -} - diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index 49330408..c9f5ad6e 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -757,7 +757,6 @@ B47839052E70FAFE00D002E3 /* OrderShopSummary.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47839042E70FAFE00D002E3 /* OrderShopSummary.swift */; }; B47839072E70FF2B00D002E3 /* OrderShopMenusGroups.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47839062E70FF2B00D002E3 /* OrderShopMenusGroups.swift */; }; B4B3EB262E6E7CAD00F8A23A /* OrderShopMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B3EB252E6E7CAD00F8A23A /* OrderShopMenus.swift */; }; - B608F0E72EB5DC2D0006F355 /* FilteringButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B608F0E32EB5DC2C0006F355 /* FilteringButton.swift */; }; B608F0E82EB5DC2D0006F355 /* EmptyStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */; }; B60D25462ED72017000E57B7 /* RadioButtonState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60D25442ED72017000E57B7 /* RadioButtonState.swift */; }; B60D25472ED72017000E57B7 /* RadioButtonGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60D25432ED72017000E57B7 /* RadioButtonGroup.swift */; }; @@ -1781,7 +1780,6 @@ B47839062E70FF2B00D002E3 /* OrderShopMenusGroups.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderShopMenusGroups.swift; sourceTree = ""; }; B4B3EB252E6E7CAD00F8A23A /* OrderShopMenus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderShopMenus.swift; sourceTree = ""; }; B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyStateView.swift; sourceTree = ""; }; - B608F0E32EB5DC2C0006F355 /* FilteringButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilteringButton.swift; sourceTree = ""; }; B60D25412ED72017000E57B7 /* RadioButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButton.swift; sourceTree = ""; }; B60D25422ED72017000E57B7 /* RadioButtonColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonColors.swift; sourceTree = ""; }; B60D25432ED72017000E57B7 /* RadioButtonGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonGroup.swift; sourceTree = ""; }; @@ -4691,7 +4689,6 @@ isa = PBXGroup; children = ( B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */, - B608F0E32EB5DC2C0006F355 /* FilteringButton.swift */, ); path = OrderHistoryUIComponents; sourceTree = ""; @@ -6012,7 +6009,6 @@ 833D9C392C7058C300982145 /* NoticeListRepository.swift in Sources */, D27DD0E22BA609740081FD36 /* MenuDto.swift in Sources */, D27A5D9C2C6BE56500C4275F /* FetchShopListRequest.swift in Sources */, - B608F0E72EB5DC2D0006F355 /* FilteringButton.swift in Sources */, B608F0E82EB5DC2D0006F355 /* EmptyStateView.swift in Sources */, D29F21C32C4DE27C00994554 /* UserService.swift in Sources */, D837FB122E254BD8002BFB9F /* CustomSessionManager.swift in Sources */, From 338cdfaaff182f5d9dff4fa933b2d1c7eb1a760a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sun, 6 Sep 2026 17:06:33 +0900 Subject: [PATCH 4/5] =?UTF-8?q?delete:=20=EC=A3=BC=EB=AC=B8=20=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20Empty=20View=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmptyStateView.swift | 133 ------------------ koin.xcodeproj/project.pbxproj | 12 -- 2 files changed, 145 deletions(-) delete mode 100644 Koin/Core/View/OrderHistoryUIComponents/EmptyStateView.swift diff --git a/Koin/Core/View/OrderHistoryUIComponents/EmptyStateView.swift b/Koin/Core/View/OrderHistoryUIComponents/EmptyStateView.swift deleted file mode 100644 index 94db407b..00000000 --- a/Koin/Core/View/OrderHistoryUIComponents/EmptyStateView.swift +++ /dev/null @@ -1,133 +0,0 @@ -// -// EmptyStateView.swift -// koin -// -// Created by 김성민 on 9/19/25. -// - -import UIKit -import SnapKit - -final class EmptyStateView: UIView { - - var onTapAction: (() -> Void)? - private var symbolCenterY: Constraint? - - struct Config{ - let title: String - let showSeeOrderHistoryButton: Bool - } - - private let centerGuide = UILayoutGuide() - - private let symbolImageView = UIImageView().then { - $0.image = UIImage.appImage(asset: .sleepBcsdSymbol) - } - - private let noOrderHistoryLabel = UILabel().then { - $0.text = "주문 내역이 없어요" - $0.font = UIFont.appFont(.pretendardBold, size: 18) - $0.textColor = UIColor.appColor(.new500) - $0.textAlignment = .center - } - - private let seeOrderHistoryButton = UIButton( - configuration: { - var config = UIButton.Configuration.plain() - config.attributedTitle = AttributedString("과거 주문 내역 보기", attributes: .init([ - .font: UIFont.appFont(.pretendardBold, size: 13) - ])) - config.baseForegroundColor = UIColor.appColor(.neutral500) - - var background = UIBackgroundConfiguration.clear() - background.cornerRadius = 8 - background.backgroundColor = UIColor.appColor(.neutral0) - config.background = background - - config.contentInsets = NSDirectionalEdgeInsets(top: 7, leading: 7, bottom: 7, trailing: 7) - return config - }() - ).then { - $0.layer.masksToBounds = false - $0.layer.shadowColor = UIColor.black.cgColor - $0.layer.shadowOpacity = 0.2 - $0.layer.shadowOffset = CGSize(width: 0, height: 2) - $0.layer.shadowRadius = 4 - } - - override init(frame: CGRect){ - super.init(frame: frame) - configureView() - setAddTarget() - isHidden = true - - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - - -// MARK: - Set UI - -extension EmptyStateView { - - private func configureView() { - backgroundColor = UIColor.appColor(.newBackground) - setLayout() - } - - private func setLayout(){ - [symbolImageView, noOrderHistoryLabel, seeOrderHistoryButton].forEach{ - addSubview($0) - } - - addLayoutGuide(centerGuide) - } - - override func didMoveToSuperview() { - super.didMoveToSuperview() - guard let host = superview else { return } - - symbolImageView.snp.remakeConstraints { - $0.centerX.equalTo(host.snp.centerX) - $0.centerY.equalTo(host.snp.centerY) - $0.width.equalTo(95) - $0.height.equalTo(75) - } - - noOrderHistoryLabel.snp.remakeConstraints { - $0.top.equalTo(symbolImageView.snp.bottom).offset(16) - $0.centerX.equalTo(host.snp.centerX) - } - - seeOrderHistoryButton.snp.remakeConstraints { - $0.top.equalTo(noOrderHistoryLabel.snp.bottom).offset(16) - $0.centerX.equalTo(host.snp.centerX) - $0.height.equalTo(35) - } - } - - - - private func setAddTarget(){ - seeOrderHistoryButton.addTarget(self, action: #selector(seeOrderHistoryButtonTapped), for: .touchUpInside) - } - - func apply(_ config: Config){ - noOrderHistoryLabel.text = config.title - seeOrderHistoryButton.isHidden = !config.showSeeOrderHistoryButton - layoutIfNeeded() - } - - - //MARK: - @Objc - @objc private func seeOrderHistoryButtonTapped() { - onTapAction?() - } - - - -} diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index c9f5ad6e..a5da4ca4 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -757,7 +757,6 @@ B47839052E70FAFE00D002E3 /* OrderShopSummary.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47839042E70FAFE00D002E3 /* OrderShopSummary.swift */; }; B47839072E70FF2B00D002E3 /* OrderShopMenusGroups.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47839062E70FF2B00D002E3 /* OrderShopMenusGroups.swift */; }; B4B3EB262E6E7CAD00F8A23A /* OrderShopMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B3EB252E6E7CAD00F8A23A /* OrderShopMenus.swift */; }; - B608F0E82EB5DC2D0006F355 /* EmptyStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */; }; B60D25462ED72017000E57B7 /* RadioButtonState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60D25442ED72017000E57B7 /* RadioButtonState.swift */; }; B60D25472ED72017000E57B7 /* RadioButtonGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60D25432ED72017000E57B7 /* RadioButtonGroup.swift */; }; B60D25482ED72017000E57B7 /* RadioButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60D25412ED72017000E57B7 /* RadioButton.swift */; }; @@ -1779,7 +1778,6 @@ B47839042E70FAFE00D002E3 /* OrderShopSummary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderShopSummary.swift; sourceTree = ""; }; B47839062E70FF2B00D002E3 /* OrderShopMenusGroups.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderShopMenusGroups.swift; sourceTree = ""; }; B4B3EB252E6E7CAD00F8A23A /* OrderShopMenus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderShopMenus.swift; sourceTree = ""; }; - B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyStateView.swift; sourceTree = ""; }; B60D25412ED72017000E57B7 /* RadioButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButton.swift; sourceTree = ""; }; B60D25422ED72017000E57B7 /* RadioButtonColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonColors.swift; sourceTree = ""; }; B60D25432ED72017000E57B7 /* RadioButtonGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonGroup.swift; sourceTree = ""; }; @@ -4685,14 +4683,6 @@ path = Fonts; sourceTree = ""; }; - B608F0E52EB5DC2C0006F355 /* OrderHistoryUIComponents */ = { - isa = PBXGroup; - children = ( - B608F0E22EB5DC2C0006F355 /* EmptyStateView.swift */, - ); - path = OrderHistoryUIComponents; - sourceTree = ""; - }; B60D25452ED72017000E57B7 /* RadioButton */ = { isa = PBXGroup; children = ( @@ -5316,7 +5306,6 @@ D89F8FDA2DF12847000265DC /* StatefulButton.swift */, D891F25E2E45DC9D006D1F41 /* TrackPaddedSlider.swift */, 7C61D3502F22B344005FAC3A /* ExtendedTouchAreaView.swift */, - B608F0E52EB5DC2C0006F355 /* OrderHistoryUIComponents */, 7C65FDCA2FE69A00007831CE /* AutoScrollableInfiniteCarouselCollectionView */, ); path = View; @@ -6009,7 +5998,6 @@ 833D9C392C7058C300982145 /* NoticeListRepository.swift in Sources */, D27DD0E22BA609740081FD36 /* MenuDto.swift in Sources */, D27A5D9C2C6BE56500C4275F /* FetchShopListRequest.swift in Sources */, - B608F0E82EB5DC2D0006F355 /* EmptyStateView.swift in Sources */, D29F21C32C4DE27C00994554 /* UserService.swift in Sources */, D837FB122E254BD8002BFB9F /* CustomSessionManager.swift in Sources */, D2DCB2922CE5D639005CABEE /* PostCallNotificationUseCase.swift in Sources */, From 6658b89027ebccedd7e99f3b1534abfd2e2fccd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sun, 6 Sep 2026 17:07:22 +0900 Subject: [PATCH 5/5] =?UTF-8?q?delete:=20=EC=A3=BC=EB=AC=B8=20Slider=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Koin/Core/View/TrackPaddedSlider.swift | 26 -------------------------- koin.xcodeproj/project.pbxproj | 4 ---- 2 files changed, 30 deletions(-) delete mode 100644 Koin/Core/View/TrackPaddedSlider.swift diff --git a/Koin/Core/View/TrackPaddedSlider.swift b/Koin/Core/View/TrackPaddedSlider.swift deleted file mode 100644 index fcfb45de..00000000 --- a/Koin/Core/View/TrackPaddedSlider.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// TrackPaddedSlider.swift -// koin -// -// Created by 이은지 on 8/8/25. -// - -import UIKit - -final class TrackPaddedSlider: UISlider { - - public var horizontalPadding: CGFloat = 0 - - override func trackRect(forBounds bounds: CGRect) -> CGRect { - let originalRect = super.trackRect(forBounds: bounds) - - let newRect = CGRect( - x: originalRect.origin.x + horizontalPadding, - y: originalRect.origin.y, - width: originalRect.size.width - (horizontalPadding * 2), - height: originalRect.size.height - ) - - return newRect - } -} diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index a5da4ca4..ec9ae71a 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -995,7 +995,6 @@ D874DB4D2DBF1A6C0098EED0 /* SendVerificationCodeUsecase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D874DB4C2DBF1A6B0098EED0 /* SendVerificationCodeUsecase.swift */; }; D874DB4F2DBF1FEE0098EED0 /* SendVerificationCodeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D874DB4E2DBF1FEE0098EED0 /* SendVerificationCodeRequest.swift */; }; D874DB512DBF200C0098EED0 /* SendVerificationCodeDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = D874DB502DBF200C0098EED0 /* SendVerificationCodeDto.swift */; }; - D891F25F2E45DC9D006D1F41 /* TrackPaddedSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D891F25E2E45DC9D006D1F41 /* TrackPaddedSlider.swift */; }; D89BAA392DCA5B3D006D3BB7 /* GeneralRegisterFormRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D89BAA382DCA5B3D006D3BB7 /* GeneralRegisterFormRequest.swift */; }; D89BAA3B2DCA5B47006D3BB7 /* StudentRegisterFormRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D89BAA3A2DCA5B47006D3BB7 /* StudentRegisterFormRequest.swift */; }; D89BAA3D2DCA6483006D3BB7 /* RegisterFormUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D89BAA3C2DCA6483006D3BB7 /* RegisterFormUseCase.swift */; }; @@ -2020,7 +2019,6 @@ D874DB4C2DBF1A6B0098EED0 /* SendVerificationCodeUsecase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendVerificationCodeUsecase.swift; sourceTree = ""; }; D874DB4E2DBF1FEE0098EED0 /* SendVerificationCodeRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendVerificationCodeRequest.swift; sourceTree = ""; }; D874DB502DBF200C0098EED0 /* SendVerificationCodeDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendVerificationCodeDto.swift; sourceTree = ""; }; - D891F25E2E45DC9D006D1F41 /* TrackPaddedSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackPaddedSlider.swift; sourceTree = ""; }; D89BAA382DCA5B3D006D3BB7 /* GeneralRegisterFormRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralRegisterFormRequest.swift; sourceTree = ""; }; D89BAA3A2DCA5B47006D3BB7 /* StudentRegisterFormRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentRegisterFormRequest.swift; sourceTree = ""; }; D89BAA3C2DCA6483006D3BB7 /* RegisterFormUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterFormUseCase.swift; sourceTree = ""; }; @@ -5304,7 +5302,6 @@ D289873D2D21B30D00AA7285 /* DebouncedButton.swift */, D89F8FD82DF0A8A4000265DC /* DefaultTextField.swift */, D89F8FDA2DF12847000265DC /* StatefulButton.swift */, - D891F25E2E45DC9D006D1F41 /* TrackPaddedSlider.swift */, 7C61D3502F22B344005FAC3A /* ExtendedTouchAreaView.swift */, 7C65FDCA2FE69A00007831CE /* AutoScrollableInfiniteCarouselCollectionView */, ); @@ -6667,7 +6664,6 @@ D2FB236C2C0409900098BA2B /* LogAnalyticsEventUseCase.swift in Sources */, B4B3EB262E6E7CAD00F8A23A /* OrderShopMenus.swift in Sources */, 7C17EEB02EBF708B008BCA89 /* ShopSearchDto.swift in Sources */, - D891F25F2E45DC9D006D1F41 /* TrackPaddedSlider.swift in Sources */, D21572522CEDC1720061E725 /* FetchFrameUseCase.swift in Sources */, D2908D282BB8D1580008F908 /* LectureDto.swift in Sources */, D2908D2C2BB9D4150008F908 /* TimetablesDto.swift in Sources */,