From 227ba9ed91b1a1a8111b4abc63fa6cc822f99bf4 Mon Sep 17 00:00:00 2001 From: doyeonk429 <80318425+doyeonk429@users.noreply.github.com> Date: Sat, 18 Oct 2025 18:46:22 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[BOOK-363]=20feat:=20=EB=94=94=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EB=AA=A8=EB=93=9C=EC=97=90=EC=84=9C=20=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EA=B7=B8=20=EC=A1=B0=EC=A0=95=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/DebugOptionViewController.swift | 140 ++++++++++++++++++ .../Booket/Sources/SceneDelegate.swift | 2 +- 2 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 src/Projects/Booket/Sources/DebugOptionViewController.swift diff --git a/src/Projects/Booket/Sources/DebugOptionViewController.swift b/src/Projects/Booket/Sources/DebugOptionViewController.swift new file mode 100644 index 00000000..1318f621 --- /dev/null +++ b/src/Projects/Booket/Sources/DebugOptionViewController.swift @@ -0,0 +1,140 @@ +// Copyright © 2025 Booket. All rights reserved + +import BKCore +import BKData +import BKDesign +import BKDomain +import BKNetwork +import BKPresentation +import BKStorage +import KakaoSDKAuth +#if DEBUG +import Pulse +import PulseUI +#endif +import SwiftUI +import UIKit + +import UIKit + +public final class DebugOptionViewController: UIViewController { + + private struct DebugSection { + let title: String + let options: [DebugOption] + } + + private enum DebugOption: String, CaseIterable { + case showNetworkLog = "네트워크 로그 확인" + case resetOnboardingSeen = "온보딩 화면 보기" + + // 각 옵션에 따라 실행할 함수를 연결 + func performAction(on viewController: UIViewController) { + guard let vc = viewController as? DebugOptionViewController else { return } + switch self { + case .showNetworkLog: + vc.openPulseLog() + case .resetOnboardingSeen: + vc.resetOnboardingSeen() + } + } + } + + private let tableView = UITableView(frame: .zero, style: .insetGrouped) + private var sections: [DebugSection] = [] + + @Autowired var markOnboardingSeenUseCase: MarkOnboardingSeenUseCase + + override public func viewDidLoad() { + super.viewDidLoad() + setupData() + setupUI() + setupTableView() + } + + private func setupData() { + self.sections = [ + DebugSection(title: "Log", options: [ + .showNetworkLog + ]), + DebugSection(title: "플래그 초기화", options: [ + .resetOnboardingSeen + ]) + ] + } + + // UI 설정은 동일 + private func setupUI() { + self.title = "디버그 메뉴" + view.backgroundColor = .systemGroupedBackground + view.addSubview(tableView) + + tableView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor), + tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor) + ]) + } + + // 테이블뷰 설정은 동일 + private func setupTableView() { + tableView.delegate = self + tableView.dataSource = self + tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DebugCell") + } + + // 각 셀 선택 시 호출될 함수들 + private func openPulseLog() { + DispatchQueue.main.async { [weak self] in + let viewController = MainViewController() + self?.navigationController?.present(viewController, animated: true) + } + } + + private func resetOnboardingSeen() { + markOnboardingSeenUseCase.reset() + forceQuitApplication() + } + + private func forceQuitApplication() { + UIApplication.shared.perform(#selector(NSXPCConnection.suspend)) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + exit(0) + } + } +} + +extension DebugOptionViewController: UITableViewDelegate, UITableViewDataSource { + + public func numberOfSections(in tableView: UITableView) -> Int { + return sections.count + } + + public func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + return sections[section].title + } + + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return sections[section].options.count + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "DebugCell", for: indexPath) + let option = sections[indexPath.section].options[indexPath.row] + + var content = cell.defaultContentConfiguration() + content.text = option.rawValue + cell.contentConfiguration = content + cell.accessoryType = .none + + return cell + } + + public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + let selectedOption = sections[indexPath.section].options[indexPath.row] + selectedOption.performAction(on: self) + } +} diff --git a/src/Projects/Booket/Sources/SceneDelegate.swift b/src/Projects/Booket/Sources/SceneDelegate.swift index a5e24e77..9bbaf638 100644 --- a/src/Projects/Booket/Sources/SceneDelegate.swift +++ b/src/Projects/Booket/Sources/SceneDelegate.swift @@ -94,7 +94,7 @@ class PulseWindow: UIWindow { super.motionEnded(motion, with: event) guard motion == .motionShake else { return } - let viewController = MainViewController() + let viewController = DebugOptionViewController() let navigation = UINavigationController(rootViewController: viewController) rootViewController?.present(navigation, animated: true) } From 2b351326d5d776b978b9d4c5384f1dca94339e6b Mon Sep 17 00:00:00 2001 From: doyeonk429 <80318425+doyeonk429@users.noreply.github.com> Date: Sat, 18 Oct 2025 18:46:45 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[BOOK-363]=20feat:=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=ED=99=94=EB=A9=B4=20=ED=99=95=EC=9D=B8=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=EB=A6=AC=EC=85=8B=EC=8B=9C=ED=82=A4=EB=8A=94=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Repository/DefaultOnboardingRepository.swift | 4 ++++ .../Sources/Interface/Repository/OnboardingRepository.swift | 1 + .../Sources/Interface/Usecase/MarkOnboardingSeenUseCase.swift | 1 + .../Sources/UseCase/DefaultMarkOnboardingSeenUseCase.swift | 4 ++++ src/Projects/Booket/Sources/DebugOptionViewController.swift | 2 -- 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Projects/BKData/Sources/Repository/DefaultOnboardingRepository.swift b/src/Projects/BKData/Sources/Repository/DefaultOnboardingRepository.swift index b6496c7f..655793b6 100644 --- a/src/Projects/BKData/Sources/Repository/DefaultOnboardingRepository.swift +++ b/src/Projects/BKData/Sources/Repository/DefaultOnboardingRepository.swift @@ -21,4 +21,8 @@ public struct DefaultOnboardingRepository: OnboardingRepository { public func saveOnboardingSeen() { try? storage.save(true, for: key) } + + public func resetOnboardingSeen() { + try? storage.save(false, for: key) + } } diff --git a/src/Projects/BKDomain/Sources/Interface/Repository/OnboardingRepository.swift b/src/Projects/BKDomain/Sources/Interface/Repository/OnboardingRepository.swift index be33e735..6d0e41f3 100644 --- a/src/Projects/BKDomain/Sources/Interface/Repository/OnboardingRepository.swift +++ b/src/Projects/BKDomain/Sources/Interface/Repository/OnboardingRepository.swift @@ -3,4 +3,5 @@ public protocol OnboardingRepository { func fetchOnboardingSeen() -> Bool func saveOnboardingSeen() + func resetOnboardingSeen() } diff --git a/src/Projects/BKDomain/Sources/Interface/Usecase/MarkOnboardingSeenUseCase.swift b/src/Projects/BKDomain/Sources/Interface/Usecase/MarkOnboardingSeenUseCase.swift index c1ab52fc..9ab52c6c 100644 --- a/src/Projects/BKDomain/Sources/Interface/Usecase/MarkOnboardingSeenUseCase.swift +++ b/src/Projects/BKDomain/Sources/Interface/Usecase/MarkOnboardingSeenUseCase.swift @@ -4,4 +4,5 @@ import Foundation public protocol MarkOnboardingSeenUseCase { func execute() + func reset() } diff --git a/src/Projects/BKDomain/Sources/UseCase/DefaultMarkOnboardingSeenUseCase.swift b/src/Projects/BKDomain/Sources/UseCase/DefaultMarkOnboardingSeenUseCase.swift index 203b4cc9..a1168581 100644 --- a/src/Projects/BKDomain/Sources/UseCase/DefaultMarkOnboardingSeenUseCase.swift +++ b/src/Projects/BKDomain/Sources/UseCase/DefaultMarkOnboardingSeenUseCase.swift @@ -12,4 +12,8 @@ public struct DefaultMarkOnboardingSeenUseCase: MarkOnboardingSeenUseCase { public func execute() { repository.saveOnboardingSeen() } + + public func reset() { + repository.resetOnboardingSeen() + } } diff --git a/src/Projects/Booket/Sources/DebugOptionViewController.swift b/src/Projects/Booket/Sources/DebugOptionViewController.swift index 1318f621..a27c772f 100644 --- a/src/Projects/Booket/Sources/DebugOptionViewController.swift +++ b/src/Projects/Booket/Sources/DebugOptionViewController.swift @@ -15,8 +15,6 @@ import PulseUI import SwiftUI import UIKit -import UIKit - public final class DebugOptionViewController: UIViewController { private struct DebugSection {