From b575187cc0cd817fd29a83f32532c51efd57a570 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 17:32:51 +0900 Subject: [PATCH 01/17] =?UTF-8?q?[feat/mypage]=20feat:=20=EB=A7=88?= =?UTF-8?q?=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80=20UI=20&=20API=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/View/ChatViewController.swift | 5 - .../Sources/Component/LMInputField.swift | 6 +- .../Sources/View/Login/SignUpView.swift | 6 +- .../CommonUI/Sources/View/MyPageView.swift | 331 +++++++++++++++++- Projects/Data/Data.xcodeproj/project.pbxproj | 8 + Projects/Data/Sources/DTO/UserDTO.swift | 27 ++ .../Sources/Repository/UserRepository.swift | 92 +++++ .../Domain/Domain.xcodeproj/project.pbxproj | 12 + .../RepositoryProtocol/UserRepository.swift | 14 + .../Domain/Sources/UseCase/UserUseCase.swift | 34 ++ Projects/Domain/Sources/VO/UserVO.swift | 17 + .../LearnMate.xcodeproj/project.pbxproj | 2 + .../Sources/Coordinator/AppCoordinator.swift | 46 ++- .../Coordinator/TabBarCoordinator.swift | 22 +- .../LearnMate/Sources/DI/DataAssembly.swift | 5 + .../LearnMate/Sources/DI/DomainAssembly.swift | 5 + .../LearnMate/Sources/DI/MyPageAssembly.swift | 5 +- .../Sources/View/SignInViewController.swift | 11 + .../Sources/View/MyPageViewController.swift | 123 +++++-- .../Sources/ViewModel/MyPageViewModel.swift | 63 +++- 20 files changed, 746 insertions(+), 88 deletions(-) create mode 100644 Projects/Data/Sources/DTO/UserDTO.swift create mode 100644 Projects/Data/Sources/Repository/UserRepository.swift create mode 100644 Projects/Domain/Sources/RepositoryProtocol/UserRepository.swift create mode 100644 Projects/Domain/Sources/UseCase/UserUseCase.swift create mode 100644 Projects/Domain/Sources/VO/UserVO.swift diff --git a/Projects/Chat/Sources/View/ChatViewController.swift b/Projects/Chat/Sources/View/ChatViewController.swift index 0ff6c64..8a6aadf 100644 --- a/Projects/Chat/Sources/View/ChatViewController.swift +++ b/Projects/Chat/Sources/View/ChatViewController.swift @@ -31,11 +31,6 @@ public class ChatViewController: BaseViewController { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - - public override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - self.navigationController?.setNavigationBarHidden(true, animated: false) - } public override func viewDidLoad() { super.viewDidLoad() diff --git a/Projects/CommonUI/Sources/Component/LMInputField.swift b/Projects/CommonUI/Sources/Component/LMInputField.swift index fa26590..dcdcefd 100644 --- a/Projects/CommonUI/Sources/Component/LMInputField.swift +++ b/Projects/CommonUI/Sources/Component/LMInputField.swift @@ -24,18 +24,21 @@ public class LMInputField: UIStackView { private var waringText: String? private var inputType: InputType? private var buttonTitle: String? + private var isSecureTextEntry: Bool = false public init(inputType: InputType? = nil, inputText: String?, inputPlaceholder: String?, warningText: String?, - buttonTitle: String? = "" + buttonTitle: String? = "", + isSecureTextEntry: Bool = false ) { self.inputType = inputType self.inputText = inputText self.inputPlaceholder = inputPlaceholder self.waringText = warningText self.buttonTitle = buttonTitle + self.isSecureTextEntry = isSecureTextEntry super.init(frame: .zero) initUI() initAttribute() @@ -60,6 +63,7 @@ public class LMInputField: UIStackView { inputTextField = inputTextField.then { $0.placeholder = inputPlaceholder + $0.isSecureTextEntry = isSecureTextEntry } warningLabel = warningLabel.then { diff --git a/Projects/CommonUI/Sources/View/Login/SignUpView.swift b/Projects/CommonUI/Sources/View/Login/SignUpView.swift index fc76e7f..c05133f 100644 --- a/Projects/CommonUI/Sources/View/Login/SignUpView.swift +++ b/Projects/CommonUI/Sources/View/Login/SignUpView.swift @@ -30,10 +30,12 @@ open class SignUpView: UIView { public let passwordInputField = LMInputField(inputType: .password, inputText: "비밀번호", inputPlaceholder: "비밀번호를 입력하세요", - warningText: " 비밀번호 형식이 올바르지 않습니다") + warningText: " 비밀번호 형식이 올바르지 않습니다", + isSecureTextEntry: true) public let passwordCheckInputField = LMInputField(inputText: "비밀번호 확인", inputPlaceholder: "비밀번호를 한번 더 입력하세요", - warningText: " 비밀번호가 일치하지 않습니다") + warningText: " 비밀번호가 일치하지 않습니다", + isSecureTextEntry: true) public override init(frame: CGRect) { super.init(frame: frame) diff --git a/Projects/CommonUI/Sources/View/MyPageView.swift b/Projects/CommonUI/Sources/View/MyPageView.swift index fbda76e..b80704e 100644 --- a/Projects/CommonUI/Sources/View/MyPageView.swift +++ b/Projects/CommonUI/Sources/View/MyPageView.swift @@ -10,32 +10,335 @@ import SnapKit import Then open class MyPageView: UIView { - public let logoutButton = UIButton().then { - $0.setTitle("로그아웃", for: .normal) - $0.setTitleColor(.white, for: .normal) - $0.backgroundColor = .systemRed - $0.layer.cornerRadius = 8 - $0.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) + + // MARK: UI Components + private let tableView = UITableView().then { + $0.backgroundColor = .clear + $0.separatorStyle = .none + $0.register(MyPageTableViewCell.self, forCellReuseIdentifier: MyPageTableViewCell.identifier) } + // MARK: Properties + private var sections: [MyPageSection] = [] + + // MARK: Public Properties + public var onGetUser: (() -> Void)? + public var onPostLogout: (() -> Void)? + public var onDeleteUser: (() -> Void)? + public override init(frame: CGRect) { super.init(frame: frame) - initUI() + setupUI() + setupData() } required public init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - private func initUI() { - backgroundColor = .systemBackground + private func setupUI() { + backgroundColor = CommonUIAssets.LMWhite + + self.addSubview(tableView) + + tableView.delegate = self + tableView.dataSource = self + + setupConstraints() + } + + private func setupConstraints() { + tableView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + private func setupData() { + sections = [ + MyPageSection( + title: "내 정보", + items: [ + MyPageItem(title: "내 정보", icon: "person.fill", hasChevron: false), + MyPageItem(title: "사용자 이름", subtitle: "", hasChevron: false) + ] + ), + MyPageSection( + title: "앱 정보", + items: [ + MyPageItem(title: "앱 정보", icon: "info.circle.fill", hasChevron: false), + MyPageItem(title: "앱 버전", subtitle: "v 1.0.0", hasChevron: false) + ] + ), + MyPageSection( + title: "계정 관리", + items: [ + MyPageItem(title: "로그아웃", hasChevron: true), + MyPageItem(title: "회원탈퇴", hasChevron: true) + ] + ) + ] - addSubview(logoutButton) + tableView.reloadData() + } + + // MARK: - Public Methods + public func updateUserName(_ name: String) { + // "내 정보" 섹션의 첫 번째 아이템(사용자 이름) 업데이트 + if sections.count > 0 && sections[0].items.count > 0 { + var updatedItems = sections[0].items + updatedItems[0] = MyPageItem(title: "내 정보", subtitle: name, icon: "person.fill", hasChevron: false) + sections[0] = MyPageSection(title: sections[0].title, items: updatedItems) + tableView.reloadData() + } + } + + // MARK: - Modal Methods + private func showLogoutConfirmation() { + let alert = LMAlert( + title: "정말로 로그아웃하시겠습니까?", + cancelTitle: "취소", + confirmTitle: "확인" + ) + + alert.setCancelAction { [weak self] in + // 취소 액션 - 아무것도 하지 않음 + } - logoutButton.snp.makeConstraints { - $0.center.equalToSuperview() - $0.width.equalTo(200) - $0.height.equalTo(50) + alert.setConfirmAction { [weak self] in + self?.onPostLogout?() + } + + // 현재 뷰 컨트롤러 찾기 + if let topViewController = findTopViewController() { + alert.show(in: topViewController.view) + } + } + + private func showWithdrawalConfirmation() { + let alert = LMAlert( + title: "정말로 회원탈퇴하시겠습니까?\n탈퇴 후에는 모든 데이터가 삭제되며 복구할 수 없습니다.", + cancelTitle: "취소", + confirmTitle: "확인" + ) + + alert.setCancelAction { [weak self] in + // 취소 액션 - 아무것도 하지 않음 + } + + alert.setConfirmAction { [weak self] in + self?.onDeleteUser?() + } + + // 현재 뷰 컨트롤러 찾기 + if let topViewController = findTopViewController() { + alert.show(in: topViewController.view) + } + } + + private func findTopViewController() -> UIViewController? { + guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let window = windowScene.windows.first else { + return nil + } + + var topViewController = window.rootViewController + + while let presentedViewController = topViewController?.presentedViewController { + topViewController = presentedViewController + } + + return topViewController + } +} + +// MARK: - UITableViewDataSource +extension MyPageView: UITableViewDataSource { + public func numberOfSections(in tableView: UITableView) -> Int { + return sections.count + } + + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return sections[section].items.count + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: MyPageTableViewCell.identifier, for: indexPath) as! MyPageTableViewCell + let item = sections[indexPath.section].items[indexPath.row] + cell.configure(with: item) + return cell + } +} + +// MARK: - UITableViewDelegate +extension MyPageView: UITableViewDelegate { + public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + + let item = sections[indexPath.section].items[indexPath.row] + + switch item.title { + case "내 정보": + onGetUser?() + case "로그아웃": + showLogoutConfirmation() + case "회원탈퇴": + showWithdrawalConfirmation() + default: + break + } + } + + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 56 + } + + public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + if section == 0 { + return nil } + + let headerView = UIView() + headerView.backgroundColor = .clear + + let separatorView = UIView().then { + $0.backgroundColor = UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0) + } + + headerView.addSubview(separatorView) + separatorView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.height.equalTo(0.5) + } + + return headerView + } + + public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return section == 0 ? 0 : 1 + } +} + +// MARK: - Data Models +private struct MyPageSection { + let title: String + let items: [MyPageItem] +} + +private struct MyPageItem { + let title: String + let subtitle: String? + let icon: String? + let hasChevron: Bool + + init(title: String, subtitle: String? = nil, icon: String? = nil, hasChevron: Bool = false) { + self.title = title + self.subtitle = subtitle + self.icon = icon + self.hasChevron = hasChevron + } +} + +// MARK: - Custom Cell +private class MyPageTableViewCell: UITableViewCell { + static let identifier = "MyPageTableViewCell" + + private let iconImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.tintColor = CommonUIAssets.LMOrange1 + } + + private let titleLabel = UILabel().then { + $0.font = UIFont.systemFont(ofSize: 16, weight: .regular) + $0.textColor = CommonUIAssets.LMBlack + } + + private let subtitleLabel = UILabel().then { + $0.font = UIFont.systemFont(ofSize: 16, weight: .regular) + $0.textColor = CommonUIAssets.LMBlack + } + + private let chevronImageView = UIImageView().then { + $0.image = UIImage(systemName: "chevron.right") + $0.tintColor = UIColor(red: 0.8, green: 0.8, blue: 0.8, alpha: 1.0) + $0.contentMode = .scaleAspectFit + } + + private let containerView = UIView() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupUI() { + backgroundColor = .clear + selectionStyle = .none + + contentView.addSubview(containerView) + containerView.addSubview(iconImageView) + containerView.addSubview(titleLabel) + containerView.addSubview(subtitleLabel) + containerView.addSubview(chevronImageView) + + setupConstraints() + } + + private func setupConstraints() { + containerView.snp.makeConstraints { + $0.edges.equalToSuperview().inset(UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)) + } + + iconImageView.snp.makeConstraints { + $0.leading.equalToSuperview() + $0.centerY.equalToSuperview() + $0.width.height.equalTo(20) + } + + titleLabel.snp.makeConstraints { + $0.leading.equalTo(iconImageView.snp.trailing).offset(12) + $0.centerY.equalToSuperview() + } + + subtitleLabel.snp.makeConstraints { + $0.trailing.equalTo(chevronImageView.snp.leading).offset(-8) + $0.centerY.equalToSuperview() + } + + chevronImageView.snp.makeConstraints { + $0.trailing.equalToSuperview() + $0.centerY.equalToSuperview() + $0.width.height.equalTo(12) + } + } + + func configure(with item: MyPageItem) { + titleLabel.text = item.title + + if let icon = item.icon { + iconImageView.image = UIImage(systemName: icon) + iconImageView.isHidden = false + titleLabel.snp.updateConstraints { + $0.leading.equalTo(iconImageView.snp.trailing).offset(12) + } + } else { + iconImageView.isHidden = true + titleLabel.snp.updateConstraints { + $0.leading.equalTo(iconImageView.snp.trailing).offset(0) + } + } + + if let subtitle = item.subtitle { + subtitleLabel.text = subtitle + subtitleLabel.isHidden = false + } else { + subtitleLabel.isHidden = true + } + + chevronImageView.isHidden = !item.hasChevron } } diff --git a/Projects/Data/Data.xcodeproj/project.pbxproj b/Projects/Data/Data.xcodeproj/project.pbxproj index b76edae..59b54d7 100644 --- a/Projects/Data/Data.xcodeproj/project.pbxproj +++ b/Projects/Data/Data.xcodeproj/project.pbxproj @@ -17,6 +17,8 @@ 9532C7AC2E786F3F00B4BADE /* DiaryDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9532C7AB2E786F3A00B4BADE /* DiaryDTO.swift */; }; 9532C7AE2E78707D00B4BADE /* DiaryCalendarDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9532C7AD2E78707600B4BADE /* DiaryCalendarDTO.swift */; }; 956C4D8F2E77142700E32F93 /* DiaryRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956C4D8E2E77140A00E32F93 /* DiaryRepository.swift */; }; + 95EDE8D72E7E6F550091ED75 /* UserRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95EDE8D62E7E6F4C0091ED75 /* UserRepository.swift */; }; + 95EDE8DB2E7E70620091ED75 /* UserDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95EDE8DA2E7E705F0091ED75 /* UserDTO.swift */; }; 99E14C3BCF2FDBB8004B27AC /* ChatRoomDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2298B5F633729122951DB918 /* ChatRoomDTO.swift */; }; A334985695DC9388841BBC43 /* QuizRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCA951B89F2C3D20AA31F7F /* QuizRepository.swift */; }; B2F8FBFA915F696CCCA4152A /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A3B0D3D8C7049B6856791C1D /* Alamofire.framework */; }; @@ -57,6 +59,8 @@ 9532C7AB2E786F3A00B4BADE /* DiaryDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiaryDTO.swift; sourceTree = ""; }; 9532C7AD2E78707600B4BADE /* DiaryCalendarDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiaryCalendarDTO.swift; sourceTree = ""; }; 956C4D8E2E77140A00E32F93 /* DiaryRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiaryRepository.swift; sourceTree = ""; }; + 95EDE8D62E7E6F4C0091ED75 /* UserRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserRepository.swift; sourceTree = ""; }; + 95EDE8DA2E7E705F0091ED75 /* UserDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDTO.swift; sourceTree = ""; }; A3B0D3D8C7049B6856791C1D /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A44BC1E2E75FC256F832CA38 /* LoginDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginDTO.swift; sourceTree = ""; }; AAAC2885ACFE998578DC25E8 /* CourseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseDTO.swift; sourceTree = ""; }; @@ -107,6 +111,7 @@ 377C66458E6219D981E14335 /* DefaultDTO.swift */, A44BC1E2E75FC256F832CA38 /* LoginDTO.swift */, 77810122262C6CB16D4D47DA /* QuizDTO.swift */, + 95EDE8DA2E7E705F0091ED75 /* UserDTO.swift */, ); path = DTO; sourceTree = ""; @@ -114,6 +119,7 @@ 73F3ED55BFDC2EF15878F5B6 /* Repository */ = { isa = PBXGroup; children = ( + 95EDE8D62E7E6F4C0091ED75 /* UserRepository.swift */, DC5F0E176D612624E2C929B7 /* SignRepository.swift */, 3D7624DE90CFBBEF778E120E /* LoginRepository.swift */, 050263DDA587409393A9328A /* TokenRepository.swift */, @@ -251,6 +257,7 @@ files = ( C69F1794E1B0FB5F7B7CBDA5 /* ChatDTO.swift in Sources */, C9C427C4DD6EB1B302F5F219 /* ChatDetailDTO.swift in Sources */, + 95EDE8D72E7E6F550091ED75 /* UserRepository.swift in Sources */, 99E14C3BCF2FDBB8004B27AC /* ChatRoomDTO.swift in Sources */, 43E9C2380F425520C1FA1AD2 /* CourseDTO.swift in Sources */, 0C1776E871E0CB4A493E8354 /* DefaultDTO.swift in Sources */, @@ -262,6 +269,7 @@ E1BFC73FB539432F6E12CD94 /* CourseRepository.swift in Sources */, 34FD760EB97BB96E9D770BF0 /* LoginRepository.swift in Sources */, A334985695DC9388841BBC43 /* QuizRepository.swift in Sources */, + 95EDE8DB2E7E70620091ED75 /* UserDTO.swift in Sources */, 59034BF673F78A457B681967 /* SignRepository.swift in Sources */, E6785667C8E247C344474CBB /* TokenRepository.swift in Sources */, 9532C7AE2E78707D00B4BADE /* DiaryCalendarDTO.swift in Sources */, diff --git a/Projects/Data/Sources/DTO/UserDTO.swift b/Projects/Data/Sources/DTO/UserDTO.swift new file mode 100644 index 0000000..2839e13 --- /dev/null +++ b/Projects/Data/Sources/DTO/UserDTO.swift @@ -0,0 +1,27 @@ +// +// UserDTO.swift +// Data +// +// Created by 박지윤 on 9/20/25. +// + +import Foundation +import Domain + +public struct UserDTO: Decodable { + public let is_success: Bool + public let code: String + public let message: String + public let data: UserDataDTO +} + +public struct UserDataDTO: Decodable { + public let userId: Int + public let name: String +} + +extension UserDataDTO { + func toDomain() -> UserVO { + return UserVO(userId: userId, name: name) + } +} diff --git a/Projects/Data/Sources/Repository/UserRepository.swift b/Projects/Data/Sources/Repository/UserRepository.swift new file mode 100644 index 0000000..3326dab --- /dev/null +++ b/Projects/Data/Sources/Repository/UserRepository.swift @@ -0,0 +1,92 @@ +// +// UserRepository.swift +// Data +// +// Created by 박지윤 on 9/20/25. +// + +import Domain +import RxSwift +import Alamofire + +public class DefaultUserRepository: UserRepository { + private let tokenRepository: TokenRepository + + public init(tokenRepository: TokenRepository) { + self.tokenRepository = tokenRepository + } + + public func getUser() -> Single { + return request(endpoint: "/api/users/{userId}", + responseType: UserDTO.self) + .map { dto in + return dto.data.toDomain() + } + } + + public func postLogout() -> Single { + return request(method: .post, + endpoint: "/api/auth/logout", + responseType: DefaultDTO.self) + .map { dto in + return dto.getMessage() + } + } + + public func deleteUser() -> Single { + return request(method: .delete, + endpoint: "/api/users", + responseType: DefaultDTO.self) + .map { dto in + return dto.getMessage() + } + } + + private func request( + method: HTTPMethod = .get, + parameters: [String: Any]? = nil, + endpoint: String, + encoding: ParameterEncoding = JSONEncoding.default, + responseType: T.Type + ) -> Single { + return Single.create { single in + let url = "\(NetworkConfiguration.baseUrl)\(endpoint)" + var headers: HTTPHeaders = [:] + + if let token = self.tokenRepository.getAccessToken() { + print("🔑 사용할 토큰: \(token)") + headers.add(name: "Authorization", value: "Bearer \(token)") + } else { + print("❌ 토큰이 없습니다!") + } + print("🌐 API 요청 URL: \(url)") + print("🔑 Authorization 헤더: \(headers)") + print("📤 요청 파라미터: \(parameters ?? [:])") + print("📤 요청 메서드: \(method)") + print("📤 인코딩: \(encoding)") + + let request = AF.request(url, + method: method, + parameters: parameters, + encoding: encoding, + headers: headers) + .responseDecodable(of: responseType) { response in + print("📊 HTTP 상태 코드: \(response.response?.statusCode ?? -1)") + if let data = response.data { + print("📊 응답 데이터: \(String(data: data, encoding: .utf8) ?? "데이터 파싱 실패")") + } + + switch response.result { + case .success(let value): + print("✅ API 응답 성공: \(value)") + single(.success(value)) + case .failure(let error): + print("❌ API 응답 실패: \(error)") + single(.failure(error)) + } + } + + return Disposables.create { request.cancel() } + } + } +} diff --git a/Projects/Domain/Domain.xcodeproj/project.pbxproj b/Projects/Domain/Domain.xcodeproj/project.pbxproj index 80e7544..a3fcdf4 100644 --- a/Projects/Domain/Domain.xcodeproj/project.pbxproj +++ b/Projects/Domain/Domain.xcodeproj/project.pbxproj @@ -28,6 +28,9 @@ 956C4D8B2E77104800E32F93 /* DiaryUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956C4D8A2E77104500E32F93 /* DiaryUseCase.swift */; }; 956C4D8D2E7710BC00E32F93 /* DiaryRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956C4D8C2E7710B900E32F93 /* DiaryRepository.swift */; }; 956C4D922E771DD300E32F93 /* TokenValidationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956C4D912E771DCB00E32F93 /* TokenValidationUseCase.swift */; }; + 95EDE8D92E7E6F6E0091ED75 /* UserRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95EDE8D82E7E6F6A0091ED75 /* UserRepository.swift */; }; + 95EDE8DD2E7E70A70091ED75 /* UserVO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95EDE8DC2E7E70A40091ED75 /* UserVO.swift */; }; + 95EDE8DF2E7E90900091ED75 /* UserUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95EDE8DE2E7E908B0091ED75 /* UserUseCase.swift */; }; 9DBF2CB00F16FBC09602488A /* ChatDetailVO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097F5EF085884AD8C9591CE5 /* ChatDetailVO.swift */; }; A0CEC5A2E5A76EBD987CE37D /* StepVO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 798CFC331192C9FE77F3446A /* StepVO.swift */; }; B0B0382EF5DFDACDD3EB8A75 /* QuizUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F4565F6A02AFBF3D9A0D41B /* QuizUseCase.swift */; }; @@ -71,6 +74,9 @@ 956C4D8A2E77104500E32F93 /* DiaryUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiaryUseCase.swift; sourceTree = ""; }; 956C4D8C2E7710B900E32F93 /* DiaryRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiaryRepository.swift; sourceTree = ""; }; 956C4D912E771DCB00E32F93 /* TokenValidationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenValidationUseCase.swift; sourceTree = ""; }; + 95EDE8D82E7E6F6A0091ED75 /* UserRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserRepository.swift; sourceTree = ""; }; + 95EDE8DC2E7E70A40091ED75 /* UserVO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserVO.swift; sourceTree = ""; }; + 95EDE8DE2E7E908B0091ED75 /* UserUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserUseCase.swift; sourceTree = ""; }; 9A2E30672E510822AAF38EAD /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9B2CBEE7AC445460FAE28675 /* ChatUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatUseCase.swift; sourceTree = ""; }; A89402CD621AD4E2A5B16175 /* SignUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUseCase.swift; sourceTree = ""; }; @@ -145,6 +151,7 @@ F904C836B5CD2D4DA5EAE38D /* CourseUseCase.swift */, 6F4565F6A02AFBF3D9A0D41B /* QuizUseCase.swift */, ABB8C62A6FE12783AD3819BE /* TokenUseCase.swift */, + 95EDE8DE2E7E908B0091ED75 /* UserUseCase.swift */, ); path = UseCase; sourceTree = ""; @@ -188,6 +195,7 @@ FD08A7186FB9676854B7AEAC /* LoginVO.swift */, 24F9958F3DAC8013B440CEEA /* QuizVO.swift */, 798CFC331192C9FE77F3446A /* StepVO.swift */, + 95EDE8DC2E7E70A40091ED75 /* UserVO.swift */, ); path = VO; sourceTree = ""; @@ -200,6 +208,7 @@ DCA3E06ED2A8180A63919B6C /* CourseRepository.swift */, 8A2AB67DE6AA50B3229C7A86 /* LoginRepository.swift */, 1BA1471CB01ECE73BAD3D595 /* QuizRepository.swift */, + 95EDE8D82E7E6F6A0091ED75 /* UserRepository.swift */, B437170C7511425C025E4D08 /* SignRepository.swift */, 1A1F66123A81636A913985E6 /* TokenRepository.swift */, ); @@ -279,10 +288,12 @@ buildActionMask = 2147483647; files = ( 69DAD609572D32F2BA3845AE /* String+Extension.swift in Sources */, + 95EDE8DD2E7E70A70091ED75 /* UserVO.swift in Sources */, 16748FBAA3739FB31DEB293A /* UIImage+Extension.swift in Sources */, 92BD46EE48F6C63B6E43D069 /* UIView+Extension.swift in Sources */, 6D73D9043F7C3AA14AED7068 /* ChatRepository.swift in Sources */, 9532C7B02E7872A400B4BADE /* DiaryVO.swift in Sources */, + 95EDE8DF2E7E90900091ED75 /* UserUseCase.swift in Sources */, D510BC17C4583615CB60439E /* CourseRepository.swift in Sources */, D7012CC494E56CD8CE58176F /* LoginRepository.swift in Sources */, 1782D2A1A7FB2BD6FFA1DFEA /* QuizRepository.swift in Sources */, @@ -297,6 +308,7 @@ 3E835D4F2E5F639557AC7C06 /* TokenUseCase.swift in Sources */, 956C4D8B2E77104800E32F93 /* DiaryUseCase.swift in Sources */, 9DBF2CB00F16FBC09602488A /* ChatDetailVO.swift in Sources */, + 95EDE8D92E7E6F6E0091ED75 /* UserRepository.swift in Sources */, 72077A10B09B16423036D020 /* ChatRoomListVO.swift in Sources */, 6A879D6F3FB2FB826037933B /* ChatVO.swift in Sources */, 956C4D8D2E7710BC00E32F93 /* DiaryRepository.swift in Sources */, diff --git a/Projects/Domain/Sources/RepositoryProtocol/UserRepository.swift b/Projects/Domain/Sources/RepositoryProtocol/UserRepository.swift new file mode 100644 index 0000000..f88e7df --- /dev/null +++ b/Projects/Domain/Sources/RepositoryProtocol/UserRepository.swift @@ -0,0 +1,14 @@ +// +// UserRepository.swift +// Domain +// +// Created by 박지윤 on 9/20/25. +// + +import RxSwift + +public protocol UserRepository { + func getUser() -> Single + func postLogout() -> Single + func deleteUser() -> Single +} diff --git a/Projects/Domain/Sources/UseCase/UserUseCase.swift b/Projects/Domain/Sources/UseCase/UserUseCase.swift new file mode 100644 index 0000000..3265f60 --- /dev/null +++ b/Projects/Domain/Sources/UseCase/UserUseCase.swift @@ -0,0 +1,34 @@ +// +// UserUseCase.swift +// Domain +// +// Created by 박지윤 on 9/20/25. +// + +import RxSwift + +public protocol UserUseCase { + func getUser() -> Single + func postLogout() -> Single + func deleteUser() -> Single +} + +public final class DefaultUserUseCase: UserUseCase { + private let repository: UserRepository + + public init(repository: UserRepository) { + self.repository = repository + } + + public func getUser() -> Single { + return repository.getUser() + } + + public func postLogout() -> Single { + return repository.postLogout() + } + + public func deleteUser() -> Single { + return repository.deleteUser() + } +} diff --git a/Projects/Domain/Sources/VO/UserVO.swift b/Projects/Domain/Sources/VO/UserVO.swift new file mode 100644 index 0000000..8e4e209 --- /dev/null +++ b/Projects/Domain/Sources/VO/UserVO.swift @@ -0,0 +1,17 @@ +// +// UserVO.swift +// Domain +// +// Created by 박지윤 on 9/20/25. +// + +public struct UserVO { + public let userId: Int + public let name: String + + public init(userId: Int, + name: String) { + self.userId = userId + self.name = name + } +} diff --git a/Projects/LearnMate/LearnMate.xcodeproj/project.pbxproj b/Projects/LearnMate/LearnMate.xcodeproj/project.pbxproj index 5b71397..277b17e 100644 --- a/Projects/LearnMate/LearnMate.xcodeproj/project.pbxproj +++ b/Projects/LearnMate/LearnMate.xcodeproj/project.pbxproj @@ -379,6 +379,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "iPhone Developer"; + DEVELOPMENT_TEAM = 4P6BZ8CR69; ENABLE_PREVIEWS = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -415,6 +416,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "iPhone Developer"; + DEVELOPMENT_TEAM = 4P6BZ8CR69; ENABLE_PREVIEWS = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", diff --git a/Projects/LearnMate/Sources/Coordinator/AppCoordinator.swift b/Projects/LearnMate/Sources/Coordinator/AppCoordinator.swift index d1bef94..8e17d95 100644 --- a/Projects/LearnMate/Sources/Coordinator/AppCoordinator.swift +++ b/Projects/LearnMate/Sources/Coordinator/AppCoordinator.swift @@ -13,7 +13,7 @@ import RxSwift import Domain protocol AppCoordinator: Coordinator { - // func showLoginFlow() + func showLoginFlow() func showTabbarFlow() func setTabBarCoordinator() func getChildCoordinator(_ type: CoordinatorType) -> Coordinator? @@ -82,23 +82,36 @@ final class DefaultAppCoordinator: AppCoordinator{ .disposed(by: disposeBag) } - private func showLoginFlow() { - let loginViewController = dependency.injector.resolve(LoginViewController.self) - loginViewController.onPresentLmLogin = { [weak self] in - guard let self else { return } - let signInViewController = self.dependency.injector.resolve(SignInViewController.self) - signInViewController.onPresentSignUp = { [weak self] in + func showLoginFlow() { + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + + print("🔄 로그인 플로우 시작") + + let loginViewController = self.dependency.injector.resolve(LoginViewController.self) + loginViewController.onPresentLmLogin = { [weak self] in guard let self else { return } - let signUpViewController = self.dependency.injector.resolve(SignUpViewController.self) - self.navigationController.pushViewController(signUpViewController, animated: true) - } - signInViewController.onLoginSuccess = { [weak self] in - guard let self else { return } - self.showHomeAfterLogin() + let signInViewController = self.dependency.injector.resolve(SignInViewController.self) + signInViewController.onPresentSignUp = { [weak self] in + guard let self else { return } + let signUpViewController = self.dependency.injector.resolve(SignUpViewController.self) + self.navigationController.pushViewController(signUpViewController, animated: true) + } + signInViewController.onLoginSuccess = { [weak self] in + guard let self else { return } + self.showHomeAfterLogin() + } + self.navigationController.pushViewController(signInViewController, animated: true) } - self.navigationController.pushViewController(signInViewController, animated: true) + + // 네비게이션 바 숨기기 (로그인 화면에서 필요) + self.navigationController.setNavigationBarHidden(true, animated: false) + + // 애니메이션과 함께 로그인 화면 표시 + self.navigationController.setViewControllers([loginViewController], animated: true) + + print("✅ 로그인 화면 표시 완료") } - self.navigationController.pushViewController(loginViewController, animated: true) } /// 탭바 컨트롤러 플로우 @@ -148,10 +161,13 @@ final class DefaultAppCoordinator: AppCoordinator{ /// 자식 코디네이터가 종료되었을 때 실행할 메서드 extension DefaultAppCoordinator: CoordinatorFinishDelegate { func coordinatorDidFinish(childCoordinator: Coordinator) { + print("🔄 coordinatorDidFinish 호출됨 - childCoordinator: \(Swift.type(of: childCoordinator))") + childCoordinators.removeAll { $0 === childCoordinator } // TabBarCoordinator가 종료되면 로그인 화면으로 이동 if childCoordinator is TabBarCoordinator { + print("🔄 TabBarCoordinator 종료, 로그인 화면으로 이동") showLoginFlow() } } diff --git a/Projects/LearnMate/Sources/Coordinator/TabBarCoordinator.swift b/Projects/LearnMate/Sources/Coordinator/TabBarCoordinator.swift index 2160fbd..bab2e5c 100644 --- a/Projects/LearnMate/Sources/Coordinator/TabBarCoordinator.swift +++ b/Projects/LearnMate/Sources/Coordinator/TabBarCoordinator.swift @@ -34,6 +34,7 @@ final class DefaultTabBarController: TabBarCoordinator { init(dependency: Dependency) { self.dependency = dependency self.navigationController = dependency.navigationController + self.finishDelegate = dependency.finishDelegate } /// 탭바 flow 시작 @@ -119,9 +120,24 @@ final class DefaultTabBarController: TabBarCoordinator { } private func handleLogout() { - // 모든 뷰 컨트롤러 제거하고 로그인 화면으로 이동 - navigationController.viewControllers.removeAll() - finishDelegate?.coordinatorDidFinish(childCoordinator: self) + // 애니메이션과 함께 로그인 화면으로 전환 + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + + print("🔄 로그아웃 처리 시작") + + // 네비게이션 바 숨기기 (로그인 화면에서 필요) + self.navigationController.setNavigationBarHidden(true, animated: false) + + // 모든 뷰 컨트롤러 제거 + self.navigationController.viewControllers.removeAll() + + // 코디네이터 종료 알림 + print("🔄 finishDelegate 호출 시도 - finishDelegate: \(self.finishDelegate != nil ? "존재" : "nil")") + self.finishDelegate?.coordinatorDidFinish(childCoordinator: self) + + print("✅ 로그아웃 처리 완료") + } } } diff --git a/Projects/LearnMate/Sources/DI/DataAssembly.swift b/Projects/LearnMate/Sources/DI/DataAssembly.swift index aa3abf7..526d706 100644 --- a/Projects/LearnMate/Sources/DI/DataAssembly.swift +++ b/Projects/LearnMate/Sources/DI/DataAssembly.swift @@ -42,5 +42,10 @@ public struct DataAssembly: Assembly { let tokenRepository = resolver.resolve(TokenRepository.self)! return DefaultDiaryRepository(tokenRepository: tokenRepository) } + + container.register(UserRepository.self) { resolver in + let tokenRepository = resolver.resolve(TokenRepository.self)! + return DefaultUserRepository(tokenRepository: tokenRepository) + } } } diff --git a/Projects/LearnMate/Sources/DI/DomainAssembly.swift b/Projects/LearnMate/Sources/DI/DomainAssembly.swift index d20bc18..f6936a5 100644 --- a/Projects/LearnMate/Sources/DI/DomainAssembly.swift +++ b/Projects/LearnMate/Sources/DI/DomainAssembly.swift @@ -49,5 +49,10 @@ public struct DomainAssembly: Assembly { let repository = resolver.resolve(DiaryRepository.self)! return DefaultDiaryUseCase(repository: repository) } + + container.register(UserUseCase.self) { resolver in + let repository = resolver.resolve(UserRepository.self)! + return DefaultUserUseCase(repository: repository) + } } } diff --git a/Projects/LearnMate/Sources/DI/MyPageAssembly.swift b/Projects/LearnMate/Sources/DI/MyPageAssembly.swift index 22e6dc3..e20a5aa 100644 --- a/Projects/LearnMate/Sources/DI/MyPageAssembly.swift +++ b/Projects/LearnMate/Sources/DI/MyPageAssembly.swift @@ -12,8 +12,9 @@ import Swinject public struct MyPageAssembly: Assembly { public func assemble(container: Container) { container.register(MyPageViewModel.self) { resolver in + let userUseCase = resolver.resolve(UserUseCase.self)! let tokenUseCase = resolver.resolve(TokenUseCase.self)! - return MyPageViewModel(tokenUseCase: tokenUseCase) + return MyPageViewModel(userUseCase: userUseCase, tokenUseCase: tokenUseCase) } container.register(MyPageViewController.self) { resolver in @@ -21,4 +22,4 @@ public struct MyPageAssembly: Assembly { return MyPageViewController(myPageViewModel: viewModel) } } -} \ No newline at end of file +} diff --git a/Projects/Login/Sources/View/SignInViewController.swift b/Projects/Login/Sources/View/SignInViewController.swift index 7ac1a2c..9df6205 100644 --- a/Projects/Login/Sources/View/SignInViewController.swift +++ b/Projects/Login/Sources/View/SignInViewController.swift @@ -38,6 +38,7 @@ public class SignInViewController: BaseViewController { super.viewDidLoad() bindActions() bindTransition() + setupTapGesture() } private func bindActions() { @@ -75,6 +76,16 @@ public class SignInViewController: BaseViewController { } } } + + private func setupTapGesture() { + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) + tapGesture.cancelsTouchesInView = false + view.addGestureRecognizer(tapGesture) + } + + @objc private func dismissKeyboard() { + view.endEditing(true) + } public override func setupViewProperty() { view.backgroundColor = CommonUIAssets.LMWhite diff --git a/Projects/MyPage/Sources/View/MyPageViewController.swift b/Projects/MyPage/Sources/View/MyPageViewController.swift index a905fa4..fadcf2a 100644 --- a/Projects/MyPage/Sources/View/MyPageViewController.swift +++ b/Projects/MyPage/Sources/View/MyPageViewController.swift @@ -12,11 +12,11 @@ import RxSwift public class MyPageViewController: BaseViewController { let viewModel: MyPageViewModel - - let scrollView = UIScrollView() - let contentView = UIView() let myPageView = MyPageView() - + let navigationBar = DefaultNavigationBar(leftImage: nil, + rightImage: nil, + title: "마이페이지") + public var onLogout: (() -> Void)? public init(myPageViewModel: MyPageViewModel) { @@ -33,61 +33,108 @@ public class MyPageViewController: BaseViewController { bindActions() } + public override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + // 마이페이지 진입 시 사용자 정보 로드 + viewModel.getUser() + } + public override func setupViewProperty() { view.backgroundColor = .systemBackground - - scrollView.do { - $0.showsVerticalScrollIndicator = false - $0.showsHorizontalScrollIndicator = false - } } public override func setupHierarchy() { - view.addSubview(scrollView) - scrollView.addSubview(contentView) - contentView.addSubview(myPageView) + [navigationBar, myPageView] + .forEach { view.addSubview($0) } } public override func setupDelegate() { } public override func setupLayout() { - scrollView.snp.makeConstraints { - $0.edges.equalToSuperview() + navigationBar.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.width.centerX.equalToSuperview() } - - contentView.snp.makeConstraints { - $0.edges.equalToSuperview() - $0.width.equalToSuperview() - } - + myPageView.snp.makeConstraints { - $0.edges.equalToSuperview() + $0.top.equalTo(navigationBar.snp.bottom) + $0.horizontalEdges.bottom.equalToSuperview() } } public override func setupBind() { - viewModel.onLogoutSuccess = { [weak self] in - self?.onLogout?() - } - } - - private func bindActions() { - myPageView.logoutButton.rx.tap - .bind { [weak self] in - self?.showLogoutAlert() - } + // User data binding + viewModel.userSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] user in + print("📱 사용자 정보 로드 성공: \(user)") + // 사용자 이름을 MyPageView에 업데이트 + self?.myPageView.updateUserName(user.name) + }) + .disposed(by: disposeBag) + + viewModel.userErrorSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { error in + print("❌ 사용자 정보 로드 실패: \(error)") + // 에러 처리 로직 추가 + }) + .disposed(by: disposeBag) + + // Logout binding + viewModel.logoutSuccessSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] _ in + print("📱 로그아웃 성공") + // 토큰 지우기 + self?.viewModel.clearTokens() + // 로그인 화면으로 이동 + self?.onLogout?() + }) + .disposed(by: disposeBag) + + viewModel.logoutErrorSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { error in + print("❌ 로그아웃 실패: \(error)") + // 에러 처리 로직 추가 + }) + .disposed(by: disposeBag) + + // Delete user binding + viewModel.deleteUserSuccessSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] _ in + print("📱 회원탈퇴 성공") + // 토큰 지우기 + self?.viewModel.clearTokens() + // 로그인 화면으로 이동 + self?.onLogout?() + }) + .disposed(by: disposeBag) + + viewModel.deleteUserErrorSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { error in + print("❌ 회원탈퇴 실패: \(error)") + // 에러 처리 로직 추가 + }) .disposed(by: disposeBag) } - private func showLogoutAlert() { - let alert = UIAlertController(title: "로그아웃", message: "정말 로그아웃 하시겠습니까?", preferredStyle: .alert) + private func bindActions() { + myPageView.onGetUser = { [weak self] in + self?.viewModel.getUser() + } - alert.addAction(UIAlertAction(title: "취소", style: .cancel)) - alert.addAction(UIAlertAction(title: "로그아웃", style: .destructive) { [weak self] _ in + myPageView.onPostLogout = { [weak self] in self?.viewModel.logout() - }) + } - present(alert, animated: true) + myPageView.onDeleteUser = { [weak self] in + self?.viewModel.deleteUser() + } } -} \ No newline at end of file + +} diff --git a/Projects/MyPage/Sources/ViewModel/MyPageViewModel.swift b/Projects/MyPage/Sources/ViewModel/MyPageViewModel.swift index db4298f..325bcf2 100644 --- a/Projects/MyPage/Sources/ViewModel/MyPageViewModel.swift +++ b/Projects/MyPage/Sources/ViewModel/MyPageViewModel.swift @@ -8,20 +8,67 @@ import RxSwift import Domain +protocol MyPageViewModelProtocol { + func getUser() + func logout() + func deleteUser() +} + public class MyPageViewModel { - private let tokenUseCase: TokenUseCase private let disposeBag = DisposeBag() + private let userUseCase: UserUseCase + private let tokenUseCase: TokenUseCase + + // Subject for success/failure handling + public let userSubject = PublishSubject() + public let userErrorSubject = PublishSubject() - public var onLogoutSuccess: (() -> Void)? + public let logoutSuccessSubject = PublishSubject() + public let logoutErrorSubject = PublishSubject() - public init(tokenUseCase: TokenUseCase) { + public let deleteUserSuccessSubject = PublishSubject() + public let deleteUserErrorSubject = PublishSubject() + + public init(userUseCase: UserUseCase, tokenUseCase: TokenUseCase) { + self.userUseCase = userUseCase self.tokenUseCase = tokenUseCase } - + + public func getUser() { + userUseCase.getUser() + .subscribe(onSuccess: { [weak self] user in + print("✅ getUser 성공: \(user)") + self?.userSubject.onNext(user) + }, onFailure: { [weak self] error in + print("❌ getUser 실패: \(error)") + self?.userErrorSubject.onNext(error) + }).disposed(by: disposeBag) + } + public func logout() { - // 토큰 삭제 + userUseCase.postLogout() + .subscribe(onSuccess: { [weak self] _ in + print("✅ logout 성공") + self?.logoutSuccessSubject.onNext(()) + }, onFailure: { [weak self] error in + print("❌ logout 실패: \(error)") + self?.logoutErrorSubject.onNext(error) + }).disposed(by: disposeBag) + } + + public func deleteUser() { + userUseCase.deleteUser() + .subscribe(onSuccess: { [weak self] _ in + print("✅ deleteUser 성공") + self?.deleteUserSuccessSubject.onNext(()) + }, onFailure: { [weak self] error in + print("❌ deleteUser 실패: \(error)") + self?.deleteUserErrorSubject.onNext(error) + }).disposed(by: disposeBag) + } + + public func clearTokens() { tokenUseCase.clearAccessToken() - print("🔓 로그아웃 완료") - onLogoutSuccess?() + print("🔑 토큰 삭제 완료") } -} \ No newline at end of file +} From 81f1ab6ad8ce80175c4b1698e9e0a519bc3e430f Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 17:59:31 +0900 Subject: [PATCH 02/17] =?UTF-8?q?[feat]=20feat:=20=EC=95=B1=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppIcon.appiconset/1024.png | Bin 0 -> 110500 bytes .../AppIcon.appiconset/114.png | Bin 0 -> 5212 bytes .../AppIcon.appiconset/120.png | Bin 0 -> 5405 bytes .../AppIcon.appiconset/180.png | Bin 0 -> 8758 bytes .../Images.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 1126 bytes .../Images.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 1564 bytes .../Images.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 2404 bytes .../Images.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 2447 bytes .../Images.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 2499 bytes .../Images.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 3470 bytes .../Images.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 3751 bytes .../AppIcon.appiconset/Contents.json | 80 ++++++++++++++++++ .../CommonUI/Sources/Component/LMAlert.swift | 20 ++++- .../CommonUI/Sources/View/MyPageView.swift | 30 +++++-- .../AppIcon.appiconset/1024.png | Bin 0 -> 110500 bytes .../AppIcon.appiconset/114.png | Bin 0 -> 5212 bytes .../AppIcon.appiconset/120.png | Bin 0 -> 5405 bytes .../AppIcon.appiconset/180.png | Bin 0 -> 8758 bytes .../Assets.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 1126 bytes .../Assets.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 1564 bytes .../Assets.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 2404 bytes .../Assets.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 2447 bytes .../Assets.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 2499 bytes .../Assets.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 3470 bytes .../Assets.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 3751 bytes .../AppIcon.appiconset/Contents.json | 80 ++++++++++++++++++ .../LearnMate/Assets.xcassets/Contents.json | 6 ++ .../LearnMate.xcodeproj/project.pbxproj | 4 + 28 files changed, 212 insertions(+), 8 deletions(-) create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/1024.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/114.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/120.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/180.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/29.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/40.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/57.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/58.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/60.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/80.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/87.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/1024.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/114.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/120.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/180.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/29.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/40.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/57.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/58.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/60.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/80.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/87.png create mode 100644 Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Projects/LearnMate/Assets.xcassets/Contents.json diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/1024.png b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..8a44bbe265748fc147df8b15add590b6c017c91b GIT binary patch literal 110500 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

_;AINoiC*PO(E z2)`XYP0upu8&P@?=aW_2-wbv$nxMVFJzGMLb75)-x{NN-q7!$Y`%;x?jtD8?*GwtJ z1{=J`YH7Toc(#-iaRiTsGXq3~eXZ%}>rGbVS)Xq)XHGk&8PVX#L7bXB8ra{=FLk~StaTW=7cLVp- zuMsqP^psuysPGQ-`N#Ns^URXFZHJjP194}`1Tx<|d&pIxh$$lN^3E(e@qG_3ad?=gT1YNx1`CER z?(Xt1NqHxOEL+(N_GDqH2p{vqKS?9Y#pR!l(LB@;wHA-tYA5Kc^2~1BC0}be?t-s1 zvi0KfC>IC~)c_WKv%9nOE|cmfc3<@vT)oItki6s)?%329U%&cs{+%7he;8Owpmr~< zc9@rw*oW{n54eYX$P(LsIEo!+wleUha!RZbzA-qqe`Ffn<2zKGzDeojYVO@~A@2Wa zVuBd=IpE`u$@cf86Mw|b(^n6raZs5H#8E-02%li3*7W-IWEty_msG+)wlEO?(x}}UjeS(XRDIFxLwJX;f;WrmAAsjTO;%j z!vDGO0kagsLdx6#!=s=E?^7Ossr0(P;XiK)h|JOXeX$$Tp9l%7o05X+J-*CzQQ%a9 z-V&kulK9MYCci3*9%yrXlZ3bd4x- z)re{fV>M+%x&ZUdKC})I^Xt`Hdowfbi$ke(N83ZG9T*<^6n4`2-XyW3Q&IM>FP>1V ztxPQZ!uNV77*@1M$nerE^>%U}vmdhs`l9#^fBerk8|)@_yi3CQEhYqh+=q9b(gsD) zH+M*`%nP2rZP6mw1)tGN^1fP*aFuIZd;WqZ^mSa7_=bf7eSS|=isl^$Qiy-S(N_{^ zZmtr(%%4}j41ZSk)>dJf%8|w6*5o=ybeZ6S3T?y%w4_r34lBnFfepJKTW!;4W}bm# z(Yi3Vf8`j139u?sQF%w6p=IQYxJ8cJrOvNzCR4~{R z;U2rhsdd;0B#GU*=BEak56`PsUce$n(W8Cubx7BLjynj9Ts{xdyWA`$pJatj4G&r= zo29?jy~g@O)eR(7{uZT!(~qWSrr!u&I}y};V=sO*$!#!p1)|9u;B@72+OM(ri{Isd z`1$CEz|Xb~>3H)vHD`8pbV|D9*ilnqMdttAq4ef_>B zM3&q(mPO#?U#e8DR=u1JzLvhzZys=9XwLY@{#z{D}jR@N?PL( z;T~6l*;HF6xk9tEA4!MO*Jl0^q3a^t3;x|zT_ExxKi6Agq2NZ_i7XcY$CyZq-F$=J z)>+MPBV>bkQ79bjZI|IPZWO>S`f;(A|E7H4bu@Ec-DO`M;}dc}|1$em%1PwJcqZI@ zEun3*#UX#hl_$b6TO4TcQRv-(*pXS+?Y{4NZq7j- zTt&zDvshpxzxghJsP-h)IMPr?rupQ-3SoC}{$CwH*aN-_5r9|rL=9qd7Sjn#oyVFh zdTPQnDo)jIZ5M8DD+N|I_1v_;Z+v^35%f-do~A;0_+WWxAa{fO;J2;35x()CYwW!E zM%_Q~q5YjB)qlJ!R5Vg;>0QG4kHaqq$1_S{s*uCoBmH4)W^WSO+h(hE_OMIsi_r7= ztLdB2ZCFl>Ul%4-`{RXt*QIT|;U77jKg*JXS6Ozt0m=qv z1-vT2P`I|PMEm-y8nifk7y5hWdS~Ws7|`#Hj$Y3x?VJ=eX>o^x?s=I_jSih_&1Ax ze=pX;Pnc$^tVh%oKfG44?}t?hqb-PKvX7)q${zgab;!}-7S+4(j5x0pk1>k2$KCby zzb#7QQ`7OES9RoAio-R~*A`T#ZYzens!v+aX@Ar=`7_e*%x9ne6O7H^@sIH=nEZGA zLxK6#x%(rM{q#78jI?g%jEoTWrt>1UzL?F2R@T~SQ(dgR6vn356;XVoJhH7vR077dO+i$zc)B@YPUYj%sh2^e&g&7iaA|6 zjNg}z+ja{yT4D6l_GKp@Txfp5))sT8>fR#u=9O1SIpqZ%*y(ylDmDFs*7zv0v?k<{ zjX0aKGeVPlJTRt=t+-`bjG~EDsPyWI(zK7}4)dr6W!sO}rT6&eQ|}9uy#WewU-^%_;+RWuN;mO?(sbvw! zCz@tv66E+uIgqs{Gq|0FiAqJjmz`|inZ4O$!#W)h+&olsObjf{XQ-S zPs_d*RIm*61-!ElgmRRSy5^L<(?2j}8e5n@9wpDb0i8;$;STy!_m`CQ^jhPIRCEP? zXw!LN4^eP_fGpBqL5iL`4bPOg08lSa+J5iKum2=E^3B50oEDuca`Ad!dl-wWxr-xO zbd>Sk=XPy5fcc%J=T3+H#|NvhhTY(PT8lVAZFpSmZ-}b&7Q_rMr?PJxb+1&5N}Fi& z9tx~T7?AiFkomna=YMEkqQ5~UytCNgUDjJto%FIU9NDN&O82oC7!QgzRVuf(v>KD{ zpR7|@d=1~kDRofXw!6M7b8o%ja71kkayRx&xCgo-$4LwlsoP#TJl6Rkk%eKh(5WJ! zia0FC6~=&rDiYuWd@*&SQVb7SaHW*K(U1q;O@2I6W2u_UNL5{<# z#{o&tnlc1X|6E>%7+Lc>@eLjUV3_syF@EV=l5&aG-Vv@OrF zrTA3jpX@DCW?4Tf#*>A4Tp1C>AQ5zVeR0l#oSnD=#d~s#RWV)3-3>TpVh)QZ1<)2u2k2F3urgE|c zflghI%aKy}GP!*UTTeGZbFjbwU;#t-Y6IYjUuNw3tu#*#o%*uRv8MXJ4T{0jw(}F) z=I{{f9dUxiqfXZn=KDGE_EoXRt%|Q2C#oGpiB1N+2Z zaB(j6w8E<>-l$Hl#yw-7$nVUEZFcK_$B7T-El9BNvq07H;o=_xK z&4xTr`vDaKt6GLtj)pqUGkLylc+AKJ?Xgt`ii4S?qK4>6c0xU+nBUDGxVGq|czwQJ z+o%IgU{N@)*AV_oz02@LzWv^E7f);WoAT!B8i}R|a(65vDHY zkfMgp@<)k(+Avxz9+M=2)qJHOu8z?JG%!Yz5iHN%xicp?M=mpiYJ~=hGDcaR9dGNR zR(>9^#(sQcJh|@o?#FZK6BavTz;9O?&tTzYu8BVW;sIbH9pjNn@q*CeBtIU_yfArRM^`H(cZC5qKh z{QNr{ij=2MNr6`@B>M;r!CsDde{a^B1m$uJ0#k7 z^-JH$Ze3yEEnb;KM{g9E(#u!e#ZGX{K4&c0!&Au&Nkhet5!x-J%D~U^d&l8eP{fx$ zJh{Cjq^&SbDt!7%t*=Y6%0!uqp2~N??jIYqmJXU_)bLV(BiY=V8ZPslw$4_1nnF;sq?G*j2=BefTXE6{$FGuDK;~{bYei$W;5a@0 zFu0T&MaRR>Zlh%x&*~{i=w&l zdYFW~sZT+X`|^KLm?yN&RP6As1%6vVwYFr_bGEkl6R>U8H%u$nco-W-fh{0ifhU#u zJoJ}=7E`c9i7~uD2w+KBOW=C<)1y~U$n}Q&`K^sW+ZMj~uOswQ%3q8j{GEkh^H`zm zrrGp+B9b7f2WcA+asPMRE+gcukR*zd)Mc}U^NN;io{ zSjP-^qyS4v2VZm{T^Y~WLT~5zn@J)VTqhas0-ckKavLO}qpk5Jm+hkxSwp)S;>-9# zV%u@eU}CrrvkE9~DU*6@QHzaqGG$V$s}#FU@NQWAF;idqK`-dyk{Pd00L$uS4FuC>oF1b=yYWo>d_aGV{mOsHDQ9__Xp>KIpW2Q9~&FFtGR@h2jcly z1qElXnjH^-$NYRy;4?KravoHK zc$wi~R`h!cZC})TeO&ca3GQToJa^t4HZU`|QTd*}uZm&LUNhL1don*Bew=9MMNRLc z#&9_jd~kGA9bKR?B3|3fRO!jijiZMzGDA=VK##O*?<9p^BO99k4iQHd(A1T!j*9SJ ztwZ}VS|@#Ua>`?l7-%j$@mhWFm1`d#!ZX!<{tG|&lY|7h77M)@dZ$(Lq<1Yl&tFXK zug_c2*_JZj^olk|Mowx$-nG0)8y#0zQj)XS+c7nlQL!a`=TkefzJ3$%+LiJuw5VL} zwBfBxGJUq>M7)>NX-W$*miBMsCB<9y1YGE6&1Ph$;=`k6P#ydeq%V{jNSs)z6RfZ6 z;II-)ewI{2`q3BVCGUr5Q;BA&3lD0i^N~=Z!7`bBqVqxTge9bJdAO$ML?!}42Lmo& z4Qc1KuHW_ZHe(js>=zk}gSADbgCA6Bi7pnH|D;?OQ_mHQwXAl(y%~>kJDY*Ql+mjm zMU(MWk40??mPe!k$HYYCJJwhIvfhbzual`fVr3F`_`~FbEko8K417i928FYD3|u-Z z-?VntnkL7UzqC%(d>|thHB6!Fez+UErb2!n`s3Gt9d3eu&0oF$yLTkX+p9R(Z&!DZ zX|dEw`pU{LVcZZwvNlxHX*}v>L*Zl{R2)!2?D@ji>?ux_lJV^1(XzoprT7GUzLvBbR|6oR)s1m24X!5z8Hx$&Sc z0vBw)P))Kg&igQjnoz5o*20`=^{kTR`b#A@2i;Fk264yUM!eV3)mj82z@}y0?;K`I zioQ=aB*LOsy1aKsgk%}A98LSC5WKW&5-u{bzj!!99=?=T)k5~uLxBDWEhvQH!RoYp z%16}Zvj}Ue2g8j;`gu_*T(Z2lWDk)l7G&s?5 z_L7~dCXS5~e2!jBeQOJCcp3enbnK3c{oiF1K&PCTiRd{$$i5bm3Z5Ek=VPSlV=L%v z5ZNK(;6H(miz&qsFc{Fo7KYaibx;ilxZlds!+hr!Urjbf8cqf-ZE8PDZj@C&x~6ND zp|@~3Y?r-95X``FoW((+vw3%*i1TK&#pWAvGl;*?ERl?Slos#QzGBh2W<~>%JSWfJ zjKlA0NXu-chOCMo6^mp*vIJwL#}j|ca61|OVAL&N)4J>Hi|Z~}zpC59c(E_c?e2(Q9IIx=MeM#0tOh*_9u`lp zxcA0O1mC%6%c^JSJCvwK1$lk@{Osfuhn9jMjc)+oCbL6^Ff4E~astMYz;Y)zac^7` zEiZ13N08t;*SSIv)4;$WyeC|sfIMEVGTxthKqmu)RB;i+H(*~3MT)a(a<^4!lmY$9 zEV67+r8T0gHFzzdro_tdq#R)dx8^I^V zNjx?oxW@6i?OQvJQ;Spn9Xo%86QBwg-K&vuEJ@=rQI3(z%VokLzUp^+eg-? zRZ3B}L!@-=)f3r(wu4+LJb^$ZKR=nN!gbI;*3DYT|Eg_A+}{qc4x4)L*|+N4${?<^ z#afnS;CsrDMvLvuD!dtj{yIZQ1(mGjBf-PYv8{l=eU9Fbqhx`r7uwTRzGlWyK!kOF zbqe>Vm>$p@+FCt8H(ceRpbpoU6X_y=Bd@Q@SzQqB~>3sTI|RG(DLo_VAh$B zNm__@_J-rTue7cxU0$(~>jw>GT*28xA0GK}5sW;8II73+Sw|H~I;%flZgD1|s#aUj zyca7^(=gw)A3>6`jpm@PJsz#?hV!1xJ)Gg0-DPv0BQzoUQ7oeaMW+j4F;WcReesS) zX(bjJX4trUJ~g}4)Ks;UkmfOItn}f7$dw)T?Gem;Y>dw_BOiNrJ08f-?TZpfK$H;H z+Ra8U3M0?%1OUL=qkJXtFDSzCy@5|+8Zv&oM2^k~p%^6(5*fZa+X7lIC$l_eTGcai zrxq(+`m|(z;7NO)g|!6Kl;l+GYQ%E&-@`c;oN^x5n8qY)_&MXZIm6cevI6QGk?Y~w zIvKWSrEPfl!PJyoIM`=BoKisPp`%S5zFg>(gF4~bF~YyaRs;@LN3mJkO7QGF6^M&5 z{7c6Nd7Ob)kzkEQOSBDrhnEqVA_fm0;G+mDtQY?NEC*9vn=QOzhxOuReD#$fq)i$! z_(wZUe>-6S$Ct6)3xyze--d8NdRbGN=a#DG&R^kEB;iG+r!%}_+I2eYZD+BL6FYGq zX-A-XSaQL*`w*(n(i{ZJe1A4-aLu7DF=(H%$yV-SkSa(J`&XL z|I~k*;1~w<%VPKebsgS`syM8jc2?S-k+smXjButQ3cxUWu^qvqSb~GyK-sMETTV(b zUJKrY+Oj{-Iq4V9tTJw)s`S3=4=ReN^1ifg$ifWpf4T zv?l=F(gjsBYPFh7k6xrx^8=$(*&-`MHJV7DSwra<+2ayvS!9E)&UL%2Vo_&}(9Bp| zv2%*Y4TuN-D?;E68ps~TDa`)a%CZ*IZ)5pl!L1GJAbr!PIvVBm8BDK z2|?oKWzl{6#2r72?4BH}B>X%Vh5aj(D!o!ftph}Xv;pP&1VK4!xcT(^opEjwlg_)) zC`6fT=h;2c_llkg{daU71{JqxepE@{et>@)LUWhGnyP5EI+X0uGBJOWe^LmN_sv3H zfvxZXCgWf|b%>s#uxjynPPJjbH(UQ2&JZn27H6lV|3HxAS*v9-L!#T52Y$F6)6VGZ zROliN^80)8_adzIZ2z*Gyw123Bj&e&pW$oqM2qTTBvgp6?Jg|Lh%V_Y{@b_yegySE zXTLP!x-PjLxoMe+elQk*eJd1YV#@BXd_OEe777f>0Xq$8vlV1jL+792kK~`GL@}{w z_-ZZILy@L{Ehn5h7 z_&>id+yjbiS_je!9-01(PvtIis}Z+=!D!Tg`xqT87-bvbluukMoHKic*mx&gF7J2~nAsJ0 zG4!fNG0R>}2XvPq`tZt>dt`q@;t~cN590EO0Yk(61ZxNtsqg(Y+G4ISew4cy5VqKs zlSFXIa2hAN)2qLtE@gElk3Qlf`Bzv+3wgsF`~5H_R{iLVLYXNNVmw7H*c8dGJznrk zc-SzKRr-~m2KIy;Oj^K^Znmvra#7WsBR$ew@U326PSuDuaHlw+A7>?8H{tRr2eqF> znLBo{^!xW)JfU*%HDy;{yK5=0eZL-)nHWS2qz#4RRtm0;z)hbH&Brw~qMaJJkMi+! z)EF`}E^rK%y)W>7EsNJl?5Ztqnc>uFQH_kHd8_-;8Z?h*pm&ZwZT=`j z-I%oB#j=_5lG?IQ+E?)LrsQLk)*_e{X(k;~cGiZiy4GKJU6yj_!W=DSgc$n+y3XfZ zKk?<4!N-k$7NWIe{7~?Ug?p6?(}Q?K_IMn+0M7(?GeG^V#qp<%kENVY(&s^|zBt}b z_W6qBGJ=%&Z9c6GlTL>t`phI4QHwzrV6(;gR4kGJ>-8*uMI}+C<$O?ua&(EW8O*7l z`wblqWy&?m8Z`Eptw!LO-?#h>NkZGIN-e?869;E-T2Fc~cL!cedphG?Cw2wR^FFtO z>yccrBf)+R2B{AU#rC(DzmK(UA)UrBqyjtU(Zn<2#qN(lQ%(w?o+h9b&-U`?!W=ET zj{5=+WNxVWUrtV;GHva-OVAsCCsjiB9;@VaWW_63lo@4k5hT7&>EWoT zW?ZAcsV(h~CpApta@gC6>k*|_be)AZ)T;aC9IIv9Hh{7x(RgU9Jn{W0=Z|1N8FY{G zj=?a><)^eR&XFcLeDU*8X|>Q>KSLTl5|4|O-)ML(BY32EW}+x0S0mnfd&fQW4tu@h_V-LG`7lhWq=hGL|;Dkj6#{2uOXsAgwjX zMXOUMAP1sFF6xkr37r)Vxqm)T`2|M4*kYEL@zn9~80}rdF&vV^7Bi0e1nJU=FT^Ho z*k=l4S#AbZy|oH*9#Z{fLdVeN!lE|iY&z1;%1wQpXto*0mp=?w-_JGNQ#p*W^gqZu zZl#h9ib2FW{<6W{lWmB1bNLc9?B>7M-O&IqgIjo-nyA;_;dwMA)cK}-YTb(mS})9L zc4YZuO&_ScccF_sBZeMI0u#EvGx2n8Y6Pt{hFSKW*uf02wJ}6q8>Ta#Tyx<8&7#%g z5#5qkCL8YCg)qXxk+#?-`P=!GgsZZhstTr}6)U#PN!QM8y4V}wa;KEZdp-a_sDHxF z(WdT<1enI|C0T)K>@{1P6I;>nH3Kzb|6ICRuU9!g4=w)9Y%TLe_4^!?>6a@slVOWU zl0~kY0eDg*n0muBlo!dP9x0z*5nsQmo>|6+1fM>0t|`%L9u@pJK$#gN;k*6C8N&vY z2!V|7Ic1Y1JMpA*tC?5wj`;8qf3uV<#t19@uXB$e5DdK?b-P!P2h7XEZ(evypo7UnO^-QBpwLTwnX5! z){*5s?M;y?+b;alFl+Z#d~!DsSjz}o%T;Rjg(dm$IZvHW!D}IgD5>rC%glf%w<@0r zd=7Pu^&DG?s-LNL_@qH>N0M}9OxYN8Y3>q#-ds#2oC=3&qjy04!dx>a;TC))mWLBU zoo}|a6eYNNn25C28fV%2kPKyk=S7*t-J!CXvAz2G(p7u-(nR!6%t=Z;MOLqqJXSR; zOPfA(cyKnIn=2Rw)Gx$ai2+O2%8~hRg<&Kdd?f3fW4~kof+Pmf#_S=5O4T>KF8XhI zch)0Wb+J4dVJwx5rm6gKTjIaBsQT8vPBB$5Tcx%;tN(ubxfuGz(%+7tSO zQ7-5PSE}S`3xrSuQ=9cv4&tExHitJ>$EhV1$zcLrbNg6Ti}0=2eqY%~;ez zeTjRp^J+=7T-NRA`$;i-rEq`17Ecd{CLpuN%Q~igiRhfS`=ElfgAG7*gDOo-(Ke`C zmNRh!YIV<|IqMqcE1w8Ht{s6vYA0^spcPK+=0Y<^8|R;@aKBG;RKN~b@VzluAGqO9 z$|v}|-mmxgCS6oktd~~Y--*+q@e;_~dn{!sowuwcL{Rb#12?gtY)go9LXM>PVvi$2 zx`r~t7X?ju33yvK2(I^;HuOn21+Ne0%=>937%2#jFim(#9+a@coxxr=9qe=cwo|$O zvK9#z^?vbz=8}b}+$u%<7yN%+Xge2XkkdCT3(3X#xK@;urq7c#=v68XyiRPYYR_OZU z-8zu(as!4ce~eD=pX-={Q?vuT==H2mkMP8tY1lc`*N%VL66gtk;eOVCUmvFu!E8j8 z)iEM$arD$)VpzVSyv?sz!L5$50W&)ENWpLEV{hZn+Aj}up|-Q($Lej))G{|5Qtq|> zdgQ8{wXbDAR02*!Yk&~K-HF;NRBOUjSvy#@FVX|FYG)RfEhPTXCUXD5hn;Ua&nID3 zFj19?YD!u8Ogu^6gZoa7z0{DUVr{5)nLK#dI|8bkU>`*bZ4(35UlfP%N4g9fIYE20SgQNS5ArPE!x5Y1WmdeK9xGl@f#tD>KC574GCcg$fmU& zZdZdZLsTfKh#7Meko8-v_XpRg$T+#6a#kXB!uw{gk(9}J*Yg^%BsUF#Ra1x7+6%=% z>GgKbm1|2nPp}Yk_9Bo4?9Uh5sDjaH{g8LCrsl)Ps(zB9i*2_|NO(n8dZjX8kiz?k6t~lv z@`NwvP$`s)Ksp{;BiIWD&H)OGUKmuY| zcwWf(vbi9Kv5`e)Exv7Zxgj(tA+#!{FS2@%V+OSCkh1bKTsWM&RkbSo#cdc{ZX8{I zrUM&_`h%CB+Q~HfM|F>~a3+b(B^L>`qb?M**v)_g>bSHWZLr*oN#E~H(QHmO*py$@ ziCR#ak_ah$^umI?@P@_IRP-Xq2bSQyS|cV^!>$h=N-cMq-H^K!qlCUpS)1+&SFp?k z0L#I(ABH_DBEuX`oDO2K)^xvLyctcA3O%LQ-CZ((G>?zJM<;GFqpe|Mz~yqRCI*wN!vNX$$n5_o{c8vrCc)j)`4Z+Fk@lIU7a&-`-G zyjZ3(K?Ra+!g^&B_{BgzCk1u*{S_@j%8};IrW=oxz8y-m73-m>uUkTCx z<8rx1;DpjmQc;uGgo7wZWs^{fP_ z7MAu>o5wN;2Nu}5^M>}r{b#s#-jZA$E9^6&?qAP_+lF=SSucZoQ>+$o1AbPf^~cS` z<_r6XwnLlPfahgUFn(yEK3)%+mbsv}nk=As=1BwiJ0B5u{ab@_{S{+3nZlQZS2Fh9 zZ0clqnRDoKe~)1O)`GfF0e1a1(zVPQEOvxH605IL$#ID7ga4Za7~DyjIC#(~^k6~} zdb*q1pd7<;4Xtyu%*t3eRV=D5+P57Zst3bapp45!{m>IW%HFh-X0F7I9gU+6E`aF< z-K%aZY)gvNryDq`3e61a*!2ECcnoz`d`ml^p5^^E_L{16YhSUxMF~>Z|F?OeyFj&_UVB5V%+d3&hkgW;7pvhOQi|YdD!02c<}ONUUay0U2rU% zcuupZ&&-)@!HB|?Pv!Pcm-IikYUyDS^^8c%ptTU=FKb~aM^8fH$(SnMJvB^EZS8JA z(FNFSdg9j8;Y^2$@dniumaRW99$hKctiuTY4id*3CTRv+LMy>4z1v zHzAN}wuPnll28bLn2JOZaUx#h8l2=f`I!K7xb6oI=9*+HBh$LU>K|fF&tzEs{;YbT zzR!k8bT_m4qo|qRV617zN{(4_i_HU@Z=+ld-971&!KMD=UtGjOCo+CK=Tg_J&h0JP zX<<*8+XE~bvO|6K5}((&`|2yzc@t1yFD97qn>BM4p)*<&_B#*I-+yd{a6hc)IvA%U z-lQVUwzH8;M>{SgrCJ7ZqU6lVfq#(5Nwi8}HKfRPawTd^=y;{^%PjHcd-4cWVO%HGYSB8TF+lrMD4;^?>?wAq-7S!*zv{Du$FxMI^PShj`wj|@4-l!< zm>mJpflTYGtzdH98FEMNq;qS4WK7eu7O_?oIyUl5YzHCCjbm%(!-MEAv6DFpj9^_J z1MQFrqn_{V+FmW_yk@AYSGCnJ_+CEze`P&)Ak_c+cV~}C2oXwT6J>K6l95qHaz+Cw zaW>)Z@F~h@*dwH*VT7{h2dTrUl#+GfNH&>w=YFrZZ|eH|{`mB%d)@PTp6B)K=QR#d zWfD7G;5>JcR$XMwL_^tZ1g{P~ZPgkpy(cD#xT9T65jClcZZ#F+jK&0vREQ`pBt2yF z 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�*uQCl& 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 Ps{k~fXsec~SO@+O1Q7;< literal 0 HcmV?d00001 diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/120.png b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000000000000000000000000000000000000..792b6643cfe511f90538ee85dc62010f2df55bd2 GIT binary patch literal 5405 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 literal 0 HcmV?d00001 diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/40.png b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff83bbd7564f92a2f0255fff28b7b7c4e6529f0 GIT binary patch literal 1564 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 literal 0 HcmV?d00001 diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/Contents.json b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..af727e0 --- /dev/null +++ b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,80 @@ +{ + "images" : [ + { + "filename" : "40.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "60.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "87.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "80.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "57.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "57x57" + }, + { + "filename" : "114.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "57x57" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "180.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "1024.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/CommonUI/Sources/Component/LMAlert.swift b/Projects/CommonUI/Sources/Component/LMAlert.swift index 44a1e8c..5a128ed 100644 --- a/Projects/CommonUI/Sources/Component/LMAlert.swift +++ b/Projects/CommonUI/Sources/Component/LMAlert.swift @@ -98,23 +98,39 @@ public class LMAlert: UIView { containerView.snp.makeConstraints { $0.center.equalToSuperview() $0.width.equalTo(280) - $0.height.equalTo(140) + $0.height.greaterThanOrEqualTo(140) } titleLabel.snp.makeConstraints { $0.top.equalToSuperview().inset(24) $0.horizontalEdges.equalToSuperview().inset(20) + $0.bottom.lessThanOrEqualTo(buttonStackView.snp.top).offset(-16) } buttonStackView.snp.makeConstraints { $0.bottom.equalToSuperview().inset(20) $0.horizontalEdges.equalToSuperview().inset(20) $0.height.equalTo(44) + $0.top.greaterThanOrEqualTo(titleLabel.snp.bottom).offset(16) } } private func configure(title: String, cancelTitle: String, confirmTitle: String) { - titleLabel.text = title + // 줄간격을 적용한 attributed string 생성 + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 4 + paragraphStyle.alignment = .center + + let attributedString = NSAttributedString( + string: title, + attributes: [ + .font: UIFont.systemFont(ofSize: 16, weight: .medium), + .foregroundColor: UIColor.black, + .paragraphStyle: paragraphStyle + ] + ) + + titleLabel.attributedText = attributedString cancelButton.setTitle(cancelTitle, for: .normal) confirmButton.setTitle(confirmTitle, for: .normal) } diff --git a/Projects/CommonUI/Sources/View/MyPageView.swift b/Projects/CommonUI/Sources/View/MyPageView.swift index b80704e..0a606fe 100644 --- a/Projects/CommonUI/Sources/View/MyPageView.swift +++ b/Projects/CommonUI/Sources/View/MyPageView.swift @@ -83,10 +83,10 @@ open class MyPageView: UIView { // MARK: - Public Methods public func updateUserName(_ name: String) { - // "내 정보" 섹션의 첫 번째 아이템(사용자 이름) 업데이트 - if sections.count > 0 && sections[0].items.count > 0 { + // "내 정보" 섹션의 두 번째 아이템(사용자 이름) 업데이트 + if sections.count > 0 && sections[0].items.count > 1 { var updatedItems = sections[0].items - updatedItems[0] = MyPageItem(title: "내 정보", subtitle: name, icon: "person.fill", hasChevron: false) + updatedItems[1] = MyPageItem(title: "사용자 이름", subtitle: name, hasChevron: false) sections[0] = MyPageSection(title: sections[0].title, items: updatedItems) tableView.reloadData() } @@ -164,7 +164,13 @@ extension MyPageView: UITableViewDataSource { public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: MyPageTableViewCell.identifier, for: indexPath) as! MyPageTableViewCell let item = sections[indexPath.section].items[indexPath.row] - cell.configure(with: item) + + // 마지막 섹션의 마지막 셀이거나, 섹션의 마지막 셀이 아닌 경우 디바이더 숨김 + let isLastSection = indexPath.section == sections.count - 1 + let isLastRowInSection = indexPath.row == sections[indexPath.section].items.count - 1 + let shouldHideDivider = isLastSection || !isLastRowInSection + + cell.configure(with: item, isLastCell: shouldHideDivider) return cell } } @@ -215,7 +221,7 @@ extension MyPageView: UITableViewDelegate { } public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return section == 0 ? 0 : 1 + return 0 } } @@ -264,6 +270,10 @@ private class MyPageTableViewCell: UITableViewCell { $0.contentMode = .scaleAspectFit } + private let dividerView = UIView().then { + $0.backgroundColor = CommonUIAssets.LMGray5 + } + private let containerView = UIView() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { @@ -280,6 +290,7 @@ private class MyPageTableViewCell: UITableViewCell { selectionStyle = .none contentView.addSubview(containerView) + contentView.addSubview(dividerView) containerView.addSubview(iconImageView) containerView.addSubview(titleLabel) containerView.addSubview(subtitleLabel) @@ -314,9 +325,15 @@ private class MyPageTableViewCell: UITableViewCell { $0.centerY.equalToSuperview() $0.width.height.equalTo(12) } + + dividerView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(20) + $0.bottom.equalToSuperview() + $0.height.equalTo(0.5) + } } - func configure(with item: MyPageItem) { + func configure(with item: MyPageItem, isLastCell: Bool = false) { titleLabel.text = item.title if let icon = item.icon { @@ -340,5 +357,6 @@ private class MyPageTableViewCell: UITableViewCell { } chevronImageView.isHidden = !item.hasChevron + dividerView.isHidden = isLastCell } } diff --git a/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/1024.png b/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..8a44bbe265748fc147df8b15add590b6c017c91b GIT binary patch literal 110500 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

_;AINoiC*PO(E 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 z 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�*uQCl& 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 Ps{k~fXsec~SO@+O1Q7;< literal 0 HcmV?d00001 diff --git a/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/120.png b/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000000000000000000000000000000000000..792b6643cfe511f90538ee85dc62010f2df55bd2 GIT binary patch literal 5405 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 literal 0 HcmV?d00001 diff --git a/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/40.png b/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff83bbd7564f92a2f0255fff28b7b7c4e6529f0 GIT binary patch literal 1564 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 literal 0 HcmV?d00001 diff --git a/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/Contents.json b/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..af727e0 --- /dev/null +++ b/Projects/LearnMate/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,80 @@ +{ + "images" : [ + { + "filename" : "40.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "60.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "87.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "80.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "57.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "57x57" + }, + { + "filename" : "114.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "57x57" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "180.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "1024.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/LearnMate/Assets.xcassets/Contents.json b/Projects/LearnMate/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Projects/LearnMate/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/LearnMate/LearnMate.xcodeproj/project.pbxproj b/Projects/LearnMate/LearnMate.xcodeproj/project.pbxproj index 277b17e..e9804ab 100644 --- a/Projects/LearnMate/LearnMate.xcodeproj/project.pbxproj +++ b/Projects/LearnMate/LearnMate.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 53EE0AA2C503F809334F8412 /* Diary.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7459B5071C1C3E12A6519672 /* Diary.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 5EB1027699ED6A51784245ED /* HomeAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AEA88AC00680DC27F375FB6 /* HomeAssembly.swift */; }; 94D749E4159727E7A20216D4 /* Data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0FF6CED28AB52ACEA2B7ED2A /* Data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 95EDE8E12E7EA4090091ED75 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95EDE8E02E7EA4090091ED75 /* Assets.xcassets */; }; 9713AE7BE3A3D893CE4835B5 /* Then.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 69B232119647519D26142C64 /* Then.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9ED6C34369DCA2A469096622 /* Diary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7459B5071C1C3E12A6519672 /* Diary.framework */; }; A12C0E946F134ED9ED2BB84C /* DiaryAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D786F720EBD14634E77E3C1 /* DiaryAssembly.swift */; }; @@ -109,6 +110,7 @@ 7C422FE2DDF9127C2F4B2DF0 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 89F58ED76FC4C0973305766F /* DependencyInjector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DependencyInjector.swift; sourceTree = ""; }; 8A00D2BDD6B9A0B6E62CF3CC /* LearnMateTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LearnMateTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 95EDE8E02E7EA4090091ED75 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9ACFF0B3105009DD7646173E /* Domain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Domain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9AEA88AC00680DC27F375FB6 /* HomeAssembly.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeAssembly.swift; sourceTree = ""; }; A4DC536F09A4A8284AA20CE7 /* CommonUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CommonUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -198,6 +200,7 @@ E290CD2FA6D313265F045E73 = { isa = PBXGroup; children = ( + 95EDE8E02E7EA4090091ED75 /* Assets.xcassets */, B074F9F8E730729626040CA5 /* Project */, ED0EE4EA4327EC4E4D07675E /* Products */, ); @@ -329,6 +332,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 95EDE8E12E7EA4090091ED75 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 6bdeb4dbe8098dbc1e60d517e05a582ef24704c4 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 18:49:37 +0900 Subject: [PATCH 03/17] =?UTF-8?q?[feat/chat]=20feat:=20Chat=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=83=81=ED=99=A9=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppIcon.appiconset/1024.png | Bin 110500 -> 0 bytes .../AppIcon.appiconset/114.png | Bin 5212 -> 0 bytes .../AppIcon.appiconset/120.png | Bin 5405 -> 0 bytes .../AppIcon.appiconset/180.png | Bin 8758 -> 0 bytes .../Images.xcassets/AppIcon.appiconset/29.png | Bin 1126 -> 0 bytes .../Images.xcassets/AppIcon.appiconset/40.png | Bin 1564 -> 0 bytes .../Images.xcassets/AppIcon.appiconset/57.png | Bin 2404 -> 0 bytes .../Images.xcassets/AppIcon.appiconset/58.png | Bin 2447 -> 0 bytes .../Images.xcassets/AppIcon.appiconset/60.png | Bin 2499 -> 0 bytes .../Images.xcassets/AppIcon.appiconset/80.png | Bin 3470 -> 0 bytes .../Images.xcassets/AppIcon.appiconset/87.png | Bin 3751 -> 0 bytes .../AppIcon.appiconset/Contents.json | 80 ------------------ .../Sources/View/Home/AnswerView.swift | 6 +- .../Sources/View/Home/HomeProgressView.swift | 2 +- .../Sources/View/Home/HomeQuizView.swift | 3 +- .../View/Home/QuizCollectionViewCell.swift | 29 ++++++- .../View/Home/QuizCompleteAlertView.swift | 6 ++ .../CommonUI/Sources/View/Home/QuizView.swift | 6 +- .../CommonUI/Sources/View/MyPageView.swift | 2 +- .../Sources/Repository/QuizRepository.swift | 55 +++++++++--- .../RepositoryProtocol/QuizRepository.swift | 1 + .../Domain/Sources/UseCase/QuizUseCase.swift | 5 ++ Projects/Home/Home.xcodeproj/project.pbxproj | 46 ++-------- .../Sources/View/HomeViewController.swift | 35 ++++++-- .../Sources/View/QuizViewController.swift | 27 ++++-- .../Sources/ViewModel/HomeViewModel.swift | 16 ++++ .../Sources/View/MyPageViewController.swift | 1 + 27 files changed, 165 insertions(+), 155 deletions(-) delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/1024.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/114.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/120.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/180.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/29.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/40.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/57.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/58.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/60.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/80.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/87.png delete mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/1024.png b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/1024.png deleted file mode 100644 index 8a44bbe265748fc147df8b15add590b6c017c91b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110500 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

_;AINoiC*PO(E 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 z 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�*uQCl& zQ}*E{Y}=j3jLTYe+Pj>V?~hGkZ04SRUwnyCoX4(n@R(!thUd)<=F~Bu+^@%YnqLt9 z*_ig0soEpO$LToDh1^n_HPG&p-6^h%KDM0GXv#5q3fa9l+aY!;=h@6aj)H>X>%16& zVcjmh-Lu%Ckm0b|Ftx0(v56X)8sruBZ9Zve&D1F$(=SE-i6hIvn_c+`Ix<)3Od3WZVUR86qbk8bK$I_seWT=U*1}Y7QGC?SId)SVN(3u2+oAdg=Q4%Lm3tja$$?JB> zb~o5W6TMxOV~AD>_+HS&NY9I+ym85Nzb%!#cyGaNh}};=XGULCJG&Lia-!X=Nyn9D z>Yq@s%iY=0L)7V^TS!XeP#ki#ZYX|eEzl`;XrrRRF1=x~&xt*OS&^Z;gp)FZ4xV&pcOm8lrDHEQ6-K+5pY#;jAU617KQB*uwyo-&qFFW7Lm z(}^566x&71aEiH&U0qBZgj9I4PFl85zyn~=e8Io#RN-v80pK|&XEApGnj7ZW*J{!UyrajZ?&-rk|;GSw|epd9t z3QFE7^KHl!FOPZXwL4i9(=3uim|Di;pan}#t_2gP4MZHvW6Qh4Q!**Gr@x)m5I9VV z@#!A~_kOn#Ru{weFdR(eB{k2Dm!2e)G}l|lKK!Cja+M{S)|h@Za0WXZ9_3Xz96*P zjS@3if2cIRzD8P2@Yr~Zr9`fd-2G|T>-a&;H4sA^K}t`~Vc(8rQzufO_mGjXw8gHC z3zP~P1>2HMou6$>!LFFh3pcD+t-fO!63g#$j83(`ncBrbPRf5+z53vZQkaG;p&Sh> z7lsKA#9s{Ybei$B_L%$!=3=(DOvEbT39(DbKz?kY46TM&fRUWFxf|I;yypnLfX3{KLdRGj# zv!1C=oTN>#77@R9Zo}WX`tJlM`;Hv<8~Oc}ry_A?R`N_Cr|s0ZzSmbMHTa*!ks?2e zU({~j=C=5B%J)Wg!}7?FGH~ZrM=WPzslHP-_lLp9G~+VD>?7HXX1{j}yXyJAXXzIS z4Yd0S_@b<<=KE6SRr75lOlU~z)7xzVdMgvF{cd_f+3TZi!wK1|m)tR0eJ8~@fIoli zg7g2G^Yg9wiy5vR4XRz)o&IFs?2Vw%4OOw*PHR(bBcJtXZ&#O;LRB)dqn)T7h9jzC zWQ)*Ms(IUpKv(PV@DWD-SC{q9drCgbTeMVgv%slVqk1}B8k1^b!!j%z)DTk_RzI`K zuE&h$>J)~om9TOVt0MjZ7igDIUrnwrPLaXMNpx!IjowuJ&5y559*n@cm1qOM`sG<`LxzitVW+sE!tilS7p^-LtDdA){q-drOoXdR=-JiF@7ul zEZz71sio_q_nzf)$};exgR(baF#ZjXQ)@~CsnP@Btqlv}VFWWwbl>PKphmxqv7-nP zwKE5C;_Ghlu1bZh7-H=FX{Tsn>3lvC`NTAkHMl<)w879?=RMB_p0JO%#I--F zDs?;1{)`cEqrzo7jOa+)Q3-bKY&o|-`L+gQAvh+lgbz$VX-s9RL=+ZDoC$EZ=_Qos zyC;`XFJwJ_cseH!QMLT?pquMtI6_&qIA9W4OTdbEt#fyYFEXzAXumaP zOj-5G)~v`(j9f<5<9%K)sD-YFu4QQTT`1sMz4sx5lz5BRZHXMiBPobhV^9^ifbM&p zV7USR#~y~~-&M!D5$|1*d1J&`M~dmS)SY&Ia_)PpW!>I7(}(yjs*LuUjedC4jwfQz zyh1#a8lB12ynR(i^LK#6o>#kf@X-g|hQ5ALLH7sEoQe#c>!!Yb4xX}9?W#S3B4!Jyc-4b>p#>+74g{=REj zDrshIz!iD$owH3!xNF#B&2*Ofm1}iRCaWJkdnQqtS-S75QQg$>gk#siNy0fr#O>_~X(m92{pOP@Hxe{EJJ;Is1Qx z4O#c}PVhRx%)+5Sh=+4bQ|4PR7C9t9+F8d&SLh>+OkCLJ#G4-Br9&f3zt7|g1^Ot8 z=Y`lWJb?2a4nf$ZFrJLV;3HxaV)+3eW)nvG9R>)0TIm9G$%tL&MB@-xs9(sm#KHA1 zhU*?Xp|uMXn6v#epCYRu?E4X!3`1zX0Y=KnKlJee`m`)Npc{pJl?}Lt|Dl1n_d5#c zQ^)tBpevv&yf13DXvonwWaNbTJ<92P3_e1?z&ZROqIxeNLQe9k9z;YW;}q0!|3$eF zp!~kfWz}ckqkcJO=p@qrNDrTZ$TPFcI1N5>Zotv=v=2;o^!imBXu3KC23q?6fqlOR zq@kEp9&A1IRJdlV7XXHjGkHKQ=wIJT1m7~_uSl~7AI-3Tp(95DkTW3b^Q#@|4S*#W0_qL_4^cRQ4KRSZn{f_&Bz}b9&%g{c z;Fy+i;rBR{k*JULQBe#3>EK_C}PGTZ@3 zDK3}}zxtLqt4v0$mf{ zIKsi#-d%&MLI(EB81w~U=snPv&MG-G|4|ga6YyeiSbhk6O+SOFBjfk?aR{K$`c2?2 z6#Glt#>_t^FKqz~hmRQvp)O}nRiZ=93}|BJ!a%k*&8H0RbU-G!`3ENxCyaBC2lV%= ze9Go@BL@M@F18E^Kbf)PE*<_FFcKi+0XeU)QqGt^9P(AlIm3uW*RMiAHH;l`bU+dS z=(w^6B#p28oE_r>Ww-iG}2s3s>(h)%h+)fG1L#UL=h_NlnKr0pk7O(&4c^0s0 z&OJ<-K;FLvHvSdUdsHq%#}~qBtO)<>?p59i}?K z$5C6F3ua*ebcnn;4|z;y8>UPzI%HhH+oNB^KwdArmk$kIxA;wE;X#|xp$oDFe9z)XKr)fjSiq`5=i=CF zYXB*MEAvqFa8_f?H2KW{oJkZ!7$RJMqW}oIBLcTbXCjS}fE1k*Zy?_tJ|TeSqDPkl zrexXCyUE=&f&iTs+tO}su$FVq5@cwR9@{ro{c-RX#O;6suJDUW5S0fxG`#*mv5OoB zLOqu_wYeka2p>14Tj!%-oi+FpbfHD*mL-PLnIBpMFdpSw3K^cW7E`7i9dleVfVn#s z%TS0geTZ9xtoIk0Afy9ju)%LYYdHZ#w}W*qrd@4A5a>;g8*&NfTBn>Kc7oyK zzqJ`~8wJVd-9;`)UYRd(-G9Q41@RkL6`k6&qY&x)<%l2YMa~Gwyp0e%08$=4(ToKvh4w+1(c6gO4uI~22N$&XnTfb=dS!nPtyp@-QAnQqC5Tq^=#D|? zSjU|=(Xncrq(^5Bp~GutLg*+6GfO&EF@(5#5nFup*X?JTh{2_4t8n?2VH^KH36SoGSwS`g^iFr-vY!e!VFoTqL z%Q-xRlr}y4s2qe1Ft;@Tfk7#O1VRhkZInifAk2=^gMo0Z@hqnq0!t7;v(ssVh#lbj zF57M>o+-P-+rZl}TceE-Zz2Ql4nUGi;73nw4S=u29tL27+jn1wz>MH+g>+yVKmxHx z-+OO@@uEBE!62cY5!?-4$dLvmXd9GO{Zi@1APB7OeaR*m54vD$0K#Sjz*5C`Lt#jn z4c_*Y4y+OaGx;zNfsF{DW9h+80p!+j|p?7i~%p25Hb4&E07bm?FIGAstu{1opYRWD|@BEl&>y z2_W_G?)wlJ7rgCH5}(sp34z&voQJ>+1<;)IV4y5${9?5G0RTf=!K3Ib&Y1!n!)vb} zf{4S=tt#saXnm0C8NV2mQ*4CK~mI2%yc)a?ZiH^Bh5tpNxOO1X{R zYB@q+-f#O)$o(&BE?~o+z9RXnCr5(Zfx! zO%p%gg^VML{{`|l9dITo;PRYH>*GNw`=6>z zS{Zszm6ti-Cs@|TbBvoIW{Z9!kc6hbd@%yaL{#3H-uarMfY@4Y-iO37Cl1Hbi){gj zP0DME53IxAg&8QMA#*z*uFVF~|5s(EA3g#^iWb3d8vNg-nKW7+Oc{T@_a-F&ziKnc zeE@eJlzIOaq(FZaXM7q`fVVcr>5C90e^qBWjoy$4QgqLUwEM5}3=j#KTZyIi9zf*Z z^%E9f?)kcB+3(@%o>z06^Po69CX(6&e6ChA_R=b^t(sm1q{k76?eN zju)x~>1#9qWCmgC)rJbrzlt=#6Ocuwczps?3({9<00>GNjDBcC_2XY<8sG^6l5XJr zZ=D8!Y#>bQ+E6)o3kM$X+A>wZ69j~YYd~e+UzM5#@ewrS$EFbmh9Ypm^iVC(P!Nv> z11LT)@Xf}@FR$157TBZ4nhKf=^nj)jW9IO}VWUVGjBAh4vBOrs#TqUH`9`MeM0u#@ zVd{V!@|N4|1}UxcF5{+Ppi*iasp`LhK*k11)QT@s6*%r`er0gsd<%%(GzzHOgfz=I zaBg2^o$EK%=6`>r?f^=9`qXy94NwrBZbU&I{uiXO0x;UgdHXWCK{M$gE*Mh&Uy#n1 zf#gh2T53oDCiURZGa6gy8h=7AI;#{)19Pq-#^|#K8IUe18(jZZ@c)asZqPY#PB(52 zwuGJlP5skt0gOQkWW^t)3QT>PM|uAiCVRLQX~$ns&@a?cZ3yrqS?+M0V2>h&4qKH&Au{r=D|8hgkES zfJz-@69nP;7Ak=Bv;tu5Sqykc1+eyaIhX1QvF4yh0E*pl3%5ug0~4W$wSe$hhFJT% zntKfSzn3X@7D4t@CQj6WGS)5DmLS&ZqcaZ!)-dpK3wqW-QKL+C85NNQ1qg=*mX5U! z9AHgIdY>D}vHw%dIqw8|&~ZdY^EP0u6G6z>LIsej?g6Yx-Flk_yy^sy8oknO1FV%< zni2AVZa&9BQrN=R7z^3O-3TAhy8CY}=L%(`1&N8!Qgj2U(Ho&EV9oXMlT1s%njU=o z1RZO=Jb*QA7g8p~8k+`k3l%`xaR*{eR^H7Tu=aN;=bQ|&cFJ9|7_fE{L5TTHB4AAt zu=e;?JLo@#PyAiUr9utJGHXXdAz&>Aw@9BJ#zJ{g3Bnh&Apcv)xk9nHASrbbWZ2z6 zYQJ?KAoqn>D|(Z8?*G?uy^yVixQvN_=Ms!KAUFHlNL?+!jGQ~u%RpKGpE3@#FaV8b zE)&W?Ira$G{ihvh;VcDowc}!mW;e(({!_*E@&RNSq%jnPj7ETUZxL#ZtB3!R?>{uho@OU#7=8YsM>ym-qSp9OZ7!{2&I z3ZV5t#M9T^0l=0n8EU43mI27$N9fA#97zb(sXMNq?39uqo}ot-15lMGK3aoNv1&l& z#cxy~2hBNT;C>vSq9EewYwl$TmAPFyFW9Q7z>UzA+&KmiDyvji131%bz}27W_%0RVX5!URnXbj4s&*rwapADYy~3_DhZngvutz6-3k5 zfGc`b84y=VPu3t*tQuVOsP+R?{sxzCfL#4MA|5RM7F_r;gbG{%mH?*r47XX2|MDL1 zjsW2+$Xk_xm~P06zVsUgL|ADsUtHehEHIxmf{U(Z)|Ugae_48_GZD0Ps&Si5h^_gc zKsGIJ>kEA0ZCN6k&Plxl#-(q<(c=N44k!-+>~HUI67-$mF{!GXI5}1~L49DjJfU2483ozL~sDO>U8~bnw z1ToObTBhgfIfSY@s1x*JL>wETJ)*58yi@^JJs_nRGyub!*}u@Y2o*rUdAER23jyY+ z0VmUCO(5q3`+ko9g2a!BOTwAnU%zw&^i9Tm;RLQcl4***XR-`J;w7w5259^T-N7}` zMf7)Y!0&G9i)El6G^psXX-`zZ~mH_C(!Z-W0 zztkc}7|>U3Nr0|`&+K;&q!Yasv`;3%bQJ_IqBFdPF803T2Shl?xI?jvg>ADp{cD-R z3BYu|n_6ao&{b*Ms7OzqAs{ah{}qZ{82Dd2?SXib^(X_|ZXryRKO0~<`Y9l8`8|Ev z3DS&M_AkIkZcV744~;ylgkA^i=YR2Mw-Blj00}n18DKN#5~Bw_*#{sza_BN3Zw5G$ zPPCxj0GmxomC()*BYj`R57Z?3hKYWp{p`|YX6w9yVV`mv+V5jm5{ZycY(cd34U@G^{1-?knqdEjq)(?K)Vt`+H zoE`+SB14Wr54m^NaQZw^-xdOSHQHH$7~oU>Ob-HT9(}i%!C1L>2Jl6wJ^o8`^aCM~ zimA>j!~m~y+t$YrFOUI6aSRp6y*mVlg89~%ehLIq^|P}EF|b3qV(ViF{89sJDzyLc+enpRL=_;1X#wRZIvmp5!EPEWC{C6Tu5^haoaxtY z8Zbp*g>=-i2QlgIT?OUle+n)>uu}tLmjaqqjMJox3;N-Zu_&*C3<lbXXW(0%S>Lf;HiEt3uZKZIUn;ZyMcbI@82sTFy!!9=4g8JY z#KRk(8}E=UkDH77%M-uT#nVNFy~Xh6mr-v<8^&vNz*q5*CHL_%4-8`cMpD@^at}>;O zm;soE_(L0LcBr{_u`Se7>-Hd)xySxz!uU4xKiNPRw%sKRBjlV7ckfhI1Ln0yVE=zv z(#HMlF6JIFtR(9b8|Z6pftNM>WK~qzgKE*tJu{y)S^jI^VPCD6;|v|&5)aEw+C0mw z8&GxmJaL*-2*W2-VZ^)IKL5OrzZD;UFP7iQ&=y|@=(QXBWt1n=>Ln1L_je+vC10Qa z)8W$rE!P=k4r%ER7|i?Wdba>*;nniUNX>EQk@64k5BiZaG}-iNX66g&NLvk;cE4i}%~C{a^gy4;LgYgwe?`UG9sLx~#qTm+yXT2N zvDJwybw)m6&D-2lpRpkS(^kplYD8&U!^ZQjI*Y)U0dHlduErIntLxLdB#ep?*LSSl zTmnG#^M6n4(v)mkZ_Wby-3f=S?RkU4Gv5qoK2Iq#T4|Dv6}usk%t1jQQMe8{PXZVm zh2%17=+_n7?&-O2JddPIcz(kxf3!onIakee`3L;-L~5}U@uRGpl*uv_aT6f;%}apH z;N(_kgpN|UQp3K;{xDcEOlrxOH3$UGs`rtSls^#{ZoLRMsl5=U%sZRZ9$3zIhB8_? zIy&katcK`DNZ3hSaufF!6dMOHM)_aDyu7`$YI9j?YaO3bLm=C*@+L|-pFhi{p!bY|#S7=wBnzQeP4A$et&oMvw^LJP0hx%-#hh2-7O$Ubwh>`h; zPDUp#PQgyWz4^JND9)DsnDs)heG}d%R$QbxKl0PktO7R`NS7EdE-pb8Zq@;!1}3*K zh6lSX%_Bu78Lz72QWI;~FU})?Jr5HDAf8LgC<>JCLws)y0gBid^a8X39(rrwcZ+4Lm<`fZgk8wI5Xx zG7$yO%0Xg#`@73WbN79(Ji4cCY}=6!o=yr!1NE)$Di57qk01Q)So#h z7q@!C8E{?9P8qJQGRE&#G=VaX8lIW`-?8dl%*VUi9Ss{P!8$1?dgQ9{@wUnz`D7sS zi55sj|H}!3ov;aSb~&`g^VFdEhfHVd??2PB#br(gz<_rQO8{HGwI>jJjfQ64s$XjTp`{UQj45K&`@;Ss5dJ z1Xc`mQ#_NH_y4VFah7ycu`{0Dc{pqt`Ejq6RjTZ3LRz%x8gp#4oSm*BldU$Tau_iY z?xRE5b)SpWN=te9HwnbPH15PwOUKf)dl0$V(o}K$BeBAgU)s^p_>Q$@2#X_e-d+bJ zPY1RBWt@faa*^z9D+Ld7o-b%bG;(#!-eFU9J@z<;wX6veQ2jP z?s8h6dOP=DXj{lM*fxTbfHfpY_E7~qD6Z1_s`byAPo|$a>B|!t``kipwImp$~jMjZ)QQBv$lbai8`+1#-vK0hTtzkF2uaA zkqR%hX>yshluF%M~@?W`njYa(&$Z`B?^|G3zDsSRKc*wm6+sGr9It*eF93iBCl8i*f6Pi|0UmrJp1;E^$9PiS? zYCzNH+{=7mqO}fi3(y%wi@Rzew6zUeD{&x`Kz>h@`a8K%+x1mrnZ7bq{6DPVuQj!huGI9 zHI1kAs+gY>fG$$UWOU=5JoaT}w=R>Lr>icFjMEp=6@**MNpjZBr|aHrfAV{O5ci-V zRJClhA&r0Vk!{0P2{I|qzYDU!`ULCU`jE%3d}pfJnBCrir<)=&N?*Po@C#jRS^d~H z{b>5FrWGOK>P)oaH)AgR@cClVnRiivldmD+Juy5|PfEQCSO~ZS1Ep2Itnj*R{{^&z z#B}k}I)oTd%3?fGw|V?~JtBiv$GDel3bL^WNy-j`5!XWWfS>VLyWGbo@O%~TC1Y#8 z-}*C6=IDdFTIhTtKAGrQp%}%%qeHdq7I=m4nxT$SyaXzh5hsSnMjMc-*I{$NKYh@A zydR5kO)KiL2R?b3&?9xXzlIF0k}7X@E>?CH$FU|;_zQk;_WKyw$+u9HeTl%7WsC8+ z^OnD9O&PRJg^-5{g9@IHemg9zkQJB1#EnkOR6bHpP1JJ;$6F@ok=o61DR*s~Xz5Ve z3_0Qk&d5h@UP*RzFAbC9mhn5(IYR1-<{O}gGe?oc^3aDeEl!dSzwM9&zX!>B3v)Xp zW2~dZ7ID~JVxWSU6IJl!F8C$KYyjy9J`b;@{kItX}?)9CUFf$UznAPCQ%w-aVJ`yt!l5hmf( z!)j7dlu|oyZNy0I@Qv#W8p5;QV$$9gA8Q43`Hws_xg_Xcqf;H2F5y6Rbe!vJ)e(!b z!^iU<^~dtx7HJ22pJ<>yN(*QXYD1}$bG03x6g2c4jii)8rg2l#)HN;Xx#C53P10_` zG=M{mJ<YGv!yGAGQs>-2qtPfTQ3U$ZeotmY+j4AXgs6r+nm=AjV6qX1q9`X- zX*3@$1#kQn`1r$=oF{^}<4obn@HsrYwT^Dn?!HljgaAmzQZU1)1TSGf;RNWJJH3&w z22J#0BM(w!m0ylY#pgV=n%AbSO=n0yoS>Ohh?=7#BA~VmQ3~NYenSh3+wlY=|6uV; zbleLPbmRy_J44^$+Zc3zf!Vw`XTl1u1Y699Doo`&!A03Cqn5}K-+{WG>-X#B`Y20c zeM!F5tEBbSFOy{4vxDl+`;-0>-lI*uu1JcvOzG<^7J9&~u?~%zz&~pMVGpl)M#L}V zz9x>p+wAp~2kKw;K~eqc+>Vu557d>SX7jcya|Ch&GqODq!BV$~cuYr5GIH}NHzYLlu6zs%~O_|Q+!nve4X|S+IHF$om35?)O$mquG9uBgJrZj^5jk(O#|MV^zM$Nhm zTQyK0sNd>eZtA(L)&JA(q|37(`hho}y+=GEMeCj(Rjxi;Aw@Bee}H_urak$N__;41 z*ueh?m=P>!R_fX;zn-WW^XxD~nUZBNItG!pdk!x~px7?c%8^_;Ry)@uJX%X1l-+I2 zFbtnAzLouM+~3vQ;N2T+S%~voylsM-bFq$EhsdJehQJQi9tPqchivD77}=QhZ>tr> za@+$WEXPu#EKm5KgKk4qDQ+uMW!41T0>-MAq zr)ASsxyP1~)N-`n6hK1betXDU)#YbGvOw8A%#UwIE($unHGR}Z5W}8FT&C>jz2lv~ zwv1&z-4P-pF|@WjAfe76M7_70U3}Uqog2;|vVwZ4t}fSJ@X*}NT@}aR)kF zQ{`N}_B6+VRNsZ}^9#yU1}2s4)mt@FtU{)6^lg4-Zdx9N_|N6%+LV#Tfn_%IW27va z@)YGU#Oo&(0uK9|lb_?0o$Zq)w%TPoMbP+t$Ta7+KJyeT^E778>4+yam{X-h*W@dN zZF_YSNufSi-kpW=hVzZN+lS*Dzn9Q0eskw1?y*L(?S(>T-APhhob zfz5;>^MVlRf3Wyo$o(oGGmZeNr^k;HdS9i5HNJ8Z4D-1i``7wjG#nZYH&zAa+_W(p zD~$$)?=6JrTz42-oJUAix;_TiInPC9u6S(bHXHQo=8l+cXLURbvr?2A-Vn@#{oyWt zdI1cTrzk#gLH|N%n$CNRB#6^mly$C;$~J3IeQQBZacy=E1M)3FS5ro9Ab;?PMG=u% z$u9r9p}37KPF7ad(b-wxb#<0zL2d&J!R3JoK7*Q4)*Ke*D}SR+;o~2mRE9({38ONY zq;9%7u7-8!;X`s94%YzFQlZ>&u>#`;g8B&e?FuDAxdRDBG#-(2A&}XT2&4=kmOjwI zj2i>;-`z2J2g$(X?ic+rGKn&9ykv8o=Jo7<_PjH8={@t3|C-g+Wov0M_OCa4%Sn&y zyN{>ct+gCF*BjT<$J4~fozau8o&+-suMS5xzr{g!?PjvPGNZ{@&0C(Pi`hdY{u{o_ z9Ra<%Z@KrQMY)C@`Z2kQL}u8Y<=n;`ChFs=bE$HYJE@v`yFaZpV>b`dv=8FNL}xAw zmtru-3^n3XnL&JF1cFP!z1rH^%-UMU2RvJ;OOuh@G`~Anj%KZ~2Sp+WY4HX~m*-T! zqrY4pn+ae$i+$2?cyivU-?oX}y+O>SJlUJ3iu=Mo%JgAx4tBn>AyUA`UB70BLhTH z*-@>rRkpEhsqIAnAIb^=vZS^%_iS1-&Wdt_S&BFr3W2&{t|ycH$oW4&GFD zks4V^bi^#r=HHmH6DQfm*uVM*#OUi&jBkJdz|Bog3AE)OBP9FpAP@ue&Kq))eP#aq Ps{k~fXsec~SO@+O1Q7;< diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/120.png b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/120.png deleted file mode 100644 index 792b6643cfe511f90538ee85dc62010f2df55bd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5405 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 diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/40.png b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/40.png deleted file mode 100644 index 1ff83bbd7564f92a2f0255fff28b7b7c4e6529f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 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 diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/Contents.json b/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index af727e0..0000000 --- a/Projects/CommonUI/Sources/Assets/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "images" : [ - { - "filename" : "40.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "60.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "29.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "58.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "87.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "80.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "120.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "57.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "57x57" - }, - { - "filename" : "114.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "57x57" - }, - { - "filename" : "120.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "180.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "1024.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/CommonUI/Sources/View/Home/AnswerView.swift b/Projects/CommonUI/Sources/View/Home/AnswerView.swift index 31c6a40..2f0f750 100644 --- a/Projects/CommonUI/Sources/View/Home/AnswerView.swift +++ b/Projects/CommonUI/Sources/View/Home/AnswerView.swift @@ -81,8 +81,9 @@ open class AnswerView: UIView { correctView.addSubview(correctLabel) correctView.snp.makeConstraints { - $0.verticalEdges.equalToSuperview() + $0.top.bottom.equalToSuperview() $0.leading.equalToSuperview().inset(20) + $0.width.lessThanOrEqualToSuperview().multipliedBy(0.7) } correctLabel.snp.makeConstraints { @@ -94,8 +95,9 @@ open class AnswerView: UIView { wrongView.addSubview(wrongLabel) wrongView.snp.makeConstraints { - $0.verticalEdges.equalToSuperview() + $0.top.bottom.equalToSuperview() $0.leading.equalToSuperview().inset(20) + $0.width.lessThanOrEqualToSuperview().multipliedBy(0.7) } wrongLabel.snp.makeConstraints { diff --git a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift index 2f5f640..8946865 100644 --- a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift +++ b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift @@ -69,7 +69,7 @@ open class HomeProgressView: UIView { } progressView = progressView.then { - $0.backgroundColor = .red + $0.backgroundColor = CommonUIAssets.LMOrange1 $0.layer.cornerRadius = 3 $0.layer.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner] // TODO: 100% 달성 시 모든 corner에 적용 diff --git a/Projects/CommonUI/Sources/View/Home/HomeQuizView.swift b/Projects/CommonUI/Sources/View/Home/HomeQuizView.swift index c919c3d..be8cd5d 100644 --- a/Projects/CommonUI/Sources/View/Home/HomeQuizView.swift +++ b/Projects/CommonUI/Sources/View/Home/HomeQuizView.swift @@ -90,8 +90,7 @@ open class HomeQuizView: UIView, UICollectionViewDataSource, UICollectionViewDel return UICollectionViewCell() } let step = stepList[indexPath.item] - cell.quizTitleLabel.text = step.stepTitle - cell.quizSubtitleLabel.text = step.stepDescription + cell.configure(with: step) cell.onStartButtonTapped .subscribe(onNext: { [weak self] in self?.onStartButtonTapped?(indexPath) diff --git a/Projects/CommonUI/Sources/View/Home/QuizCollectionViewCell.swift b/Projects/CommonUI/Sources/View/Home/QuizCollectionViewCell.swift index 8f4a9ff..4f9db98 100644 --- a/Projects/CommonUI/Sources/View/Home/QuizCollectionViewCell.swift +++ b/Projects/CommonUI/Sources/View/Home/QuizCollectionViewCell.swift @@ -95,9 +95,32 @@ final class HomeQuizCell: UICollectionViewCell { fatalError("init(coder:) has not been implemented") } - func configure(with course: CourseVO) { - quizTitleLabel.text = "처음 보는 사람과 인사하기" - quizSubtitleLabel.text = "인사와 대화의 첫걸음을 배워요" + func configure(with step: StepVO) { + quizTitleLabel.text = step.stepTitle + quizSubtitleLabel.text = step.stepDescription + + // stepStatus에 따라 버튼 텍스트 변경 + let buttonTitle = step.stepStatus == "SOLVED" ? "완료" : "시작하기" + updateButtonTitle(buttonTitle) + } + + private func updateButtonTitle(_ title: String) { + var config = startButton.configuration ?? UIButton.Configuration.plain() + let attributedTitle = AttributedString(title, attributes: AttributeContainer([ + .font: UIFont.systemFont(ofSize: 12, weight: .regular) + ])) + config.attributedTitle = attributedTitle + + if title == "완료" { + config.image = nil + config.baseBackgroundColor = CommonUIAssets.LMOrange4 + config.baseForegroundColor = CommonUIAssets.LMGray1 + } else { + config.image = CommonUIAssets.IconPlay + config.baseForegroundColor = CommonUIAssets.LMGray1 + } + + startButton.configuration = config } func bindActions() { diff --git a/Projects/CommonUI/Sources/View/Home/QuizCompleteAlertView.swift b/Projects/CommonUI/Sources/View/Home/QuizCompleteAlertView.swift index b4ea857..7d472f8 100644 --- a/Projects/CommonUI/Sources/View/Home/QuizCompleteAlertView.swift +++ b/Projects/CommonUI/Sources/View/Home/QuizCompleteAlertView.swift @@ -10,6 +10,9 @@ import SnapKit import Then public final class QuizCompleteAlertView: UIView { + + // MARK: - Properties + public var onConfirmButtonTapped: (() -> Void)? private let backgroundView = UIView().then { $0.backgroundColor = UIColor.black.withAlphaComponent(0.4) @@ -116,6 +119,9 @@ public final class QuizCompleteAlertView: UIView { } @objc private func dismiss() { + // 확인 버튼 콜백 호출 + onConfirmButtonTapped?() + UIView.animate(withDuration: 0.3, animations: { self.backgroundView.alpha = 0.0 }) { _ in diff --git a/Projects/CommonUI/Sources/View/Home/QuizView.swift b/Projects/CommonUI/Sources/View/Home/QuizView.swift index e03a329..0b3bdf1 100644 --- a/Projects/CommonUI/Sources/View/Home/QuizView.swift +++ b/Projects/CommonUI/Sources/View/Home/QuizView.swift @@ -80,8 +80,9 @@ open class QuizView: UIView { situationView.addSubview(situationLabel) situationView.snp.makeConstraints { - $0.verticalEdges.equalToSuperview() + $0.top.bottom.equalToSuperview() $0.centerX.equalToSuperview() + $0.width.lessThanOrEqualToSuperview().multipliedBy(0.8) } situationLabel.snp.makeConstraints { @@ -93,8 +94,9 @@ open class QuizView: UIView { questionView.addSubview(questionLabel) questionView.snp.makeConstraints { - $0.verticalEdges.equalToSuperview() + $0.top.bottom.equalToSuperview() $0.leading.equalToSuperview().inset(20) + $0.width.lessThanOrEqualToSuperview().multipliedBy(0.7) } questionLabel.snp.makeConstraints { diff --git a/Projects/CommonUI/Sources/View/MyPageView.swift b/Projects/CommonUI/Sources/View/MyPageView.swift index 0a606fe..a3c3443 100644 --- a/Projects/CommonUI/Sources/View/MyPageView.swift +++ b/Projects/CommonUI/Sources/View/MyPageView.swift @@ -37,7 +37,7 @@ open class MyPageView: UIView { } private func setupUI() { - backgroundColor = CommonUIAssets.LMWhite + backgroundColor = CommonUIAssets.LMOrange4 self.addSubview(tableView) diff --git a/Projects/Data/Sources/Repository/QuizRepository.swift b/Projects/Data/Sources/Repository/QuizRepository.swift index 29b019d..ff30659 100644 --- a/Projects/Data/Sources/Repository/QuizRepository.swift +++ b/Projects/Data/Sources/Repository/QuizRepository.swift @@ -17,37 +17,66 @@ public class DefaultQuizRepository: QuizRepository { } public func startStep(course: Int, step: Int) -> Single { - return request( - endpoint: "/api/courses", - course: course, - step: step, - responseType: QuizResponseDTO.self + let params: Parameters = [ + "course": course, + "step": step + ] + + return request(method: .post, + parameters: params, + endpoint: "/api/courses", + encoding: URLEncoding.default, + responseType: QuizResponseDTO.self ) .map { dto in return dto.data.toDomain() } } - - private func request(endpoint: String, course: Int, step: Int, responseType: T.Type) -> Single { + + public func patchStep(stepProgressId: Int) -> Single { + return request(method: .patch, + endpoint: "/api/courses/\(stepProgressId)", + responseType: DefaultDTO.self + ) + .map { dto in + return dto.getMessage() + } + } + + private func request( + method: HTTPMethod = .get, + parameters: [String: Any]? = nil, + endpoint: String, + encoding: ParameterEncoding = JSONEncoding.default, + responseType: T.Type + ) -> Single { return Single.create { single in - let url = "\(NetworkConfiguration.baseUrl)\(endpoint)?course=\(course)&step=\(step)" + let url = "\(NetworkConfiguration.baseUrl)\(endpoint)" var headers: HTTPHeaders = [:] + if let token = self.tokenRepository.getAccessToken() { + print("🔑 사용할 토큰: \(token)") headers.add(name: "Authorization", value: "Bearer \(token)") } else { print("❌ 토큰이 없습니다!") } - print("🌐 API 요청 URL: \(url)") print("🔑 Authorization 헤더: \(headers)") + print("📤 요청 파라미터: \(parameters ?? [:])") + print("📤 요청 메서드: \(method)") + print("📤 인코딩: \(encoding)") let request = AF.request(url, - method: .post, - parameters: nil, - encoding: JSONEncoding.default, + method: method, + parameters: parameters, + encoding: encoding, headers: headers) - .validate() .responseDecodable(of: responseType) { response in + print("📊 HTTP 상태 코드: \(response.response?.statusCode ?? -1)") + if let data = response.data { + print("📊 응답 데이터: \(String(data: data, encoding: .utf8) ?? "데이터 파싱 실패")") + } + switch response.result { case .success(let value): print("✅ API 응답 성공: \(value)") diff --git a/Projects/Domain/Sources/RepositoryProtocol/QuizRepository.swift b/Projects/Domain/Sources/RepositoryProtocol/QuizRepository.swift index 2c678ec..c70965d 100644 --- a/Projects/Domain/Sources/RepositoryProtocol/QuizRepository.swift +++ b/Projects/Domain/Sources/RepositoryProtocol/QuizRepository.swift @@ -9,4 +9,5 @@ import RxSwift public protocol QuizRepository { func startStep(course: Int, step: Int) -> Single + func patchStep(stepProgressId: Int) -> Single } diff --git a/Projects/Domain/Sources/UseCase/QuizUseCase.swift b/Projects/Domain/Sources/UseCase/QuizUseCase.swift index 1122158..20c8d79 100644 --- a/Projects/Domain/Sources/UseCase/QuizUseCase.swift +++ b/Projects/Domain/Sources/UseCase/QuizUseCase.swift @@ -9,6 +9,7 @@ import RxSwift public protocol QuizUseCase { func startStep(course: Int, step: Int) -> Single + func patchStep(stepProgressId: Int) -> Single } public final class DefaultQuizUseCase: QuizUseCase { @@ -21,4 +22,8 @@ public final class DefaultQuizUseCase: QuizUseCase { public func startStep(course: Int, step: Int) -> Single { return repository.startStep(course: course, step: step) } + + public func patchStep(stepProgressId: Int) -> Single { + return repository.patchStep(stepProgressId: stepProgressId) + } } diff --git a/Projects/Home/Home.xcodeproj/project.pbxproj b/Projects/Home/Home.xcodeproj/project.pbxproj index 49de54c..8952c87 100644 --- a/Projects/Home/Home.xcodeproj/project.pbxproj +++ b/Projects/Home/Home.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 55; + objectVersion = 56; objects = { /* Begin PBXBuildFile section */ @@ -241,8 +241,6 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - TargetAttributes = { - }; }; buildConfigurationList = AA685C1613CFBDFB4ED6BAE7 /* Build configuration list for PBXProject "Home" */; compatibilityVersion = "Xcode 14.0"; @@ -338,13 +336,7 @@ "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap", ); - OTHER_SWIFT_FLAGS = ( - "$(inherited)", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap", - ); + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = io.tuist.Home; PRODUCT_NAME = Home; SDKROOT = iphoneos; @@ -352,10 +344,7 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( - "$(inherited)", - DEBUG, - ); + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -450,13 +439,7 @@ "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap", ); - OTHER_SWIFT_FLAGS = ( - "$(inherited)", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap", - ); + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = io.tuist.Home; PRODUCT_NAME = Home; SDKROOT = iphoneos; @@ -493,13 +476,7 @@ "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap", ); - OTHER_SWIFT_FLAGS = ( - "$(inherited)", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap", - ); + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = io.tuist.HomeTests; PRODUCT_NAME = HomeTests; SDKROOT = iphoneos; @@ -533,23 +510,14 @@ "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap", ); - OTHER_SWIFT_FLAGS = ( - "$(inherited)", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap", - ); + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/FSCalendar/FSCalendar/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/RxCocoaRuntime/RxCocoaRuntime.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = io.tuist.HomeTests; PRODUCT_NAME = HomeTests; SDKROOT = iphoneos; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( - "$(inherited)", - DEBUG, - ); + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; diff --git a/Projects/Home/Sources/View/HomeViewController.swift b/Projects/Home/Sources/View/HomeViewController.swift index 9d5d245..a486b52 100644 --- a/Projects/Home/Sources/View/HomeViewController.swift +++ b/Projects/Home/Sources/View/HomeViewController.swift @@ -9,6 +9,7 @@ import CommonUI import UIKit import SnapKit import RxSwift +import Domain public class HomeViewController: BaseViewController { let viewModel: HomeViewModel @@ -21,6 +22,10 @@ public class HomeViewController: BaseViewController { let homeView = HomeView() let homeProgressView = HomeProgressView() let homeQuizView = HomeQuizView() + + // 코스와 스텝 정보 저장 + private var currentCourse: CourseVO? + private var stepList: [StepVO] = [] public init(homeViewModel: HomeViewModel) { self.viewModel = homeViewModel @@ -46,6 +51,7 @@ public class HomeViewController: BaseViewController { bindStepList() bindCourseData() bindQuiz() + bindPatchStepSuccess() } private func bindActions() { @@ -54,10 +60,13 @@ public class HomeViewController: BaseViewController { private func bindTransition() { homeQuizView.onStartButtonTapped = { [weak self] indexPath in - // course와 step 정보를 가져와서 퀴즈 시작 - let course = indexPath.item + 1 // 1시작 - let step = indexPath.item + 1 // 1작 - self?.viewModel.startStep(course: course, step: step) + // getCourses에서 받아온 courseLv와 stepLv 사용 + guard let self = self, + let course = self.currentCourse, + indexPath.item < self.stepList.count else { return } + + let step = self.stepList[indexPath.item] + self.viewModel.startStep(course: course.courseLv, step: step.stepLv) } } @@ -65,7 +74,7 @@ public class HomeViewController: BaseViewController { viewModel.quizSubject .observe(on: MainScheduler.instance) .subscribe(onNext: { [weak self] quiz in - let quizViewController = QuizViewController(quizData: quiz) + let quizViewController = QuizViewController(homeViewModel: self!.viewModel, quizData: quiz) quizViewController.hidesBottomBarWhenPushed = true self?.navigationController?.pushViewController(quizViewController, animated: true) }) @@ -76,6 +85,7 @@ public class HomeViewController: BaseViewController { viewModel.stepListSubject .observe(on: MainScheduler.instance) .subscribe(onNext: { [weak self] stepList in + self?.stepList = stepList self?.homeQuizView.setQuizList(stepList) }) .disposed(by: disposeBag) @@ -84,8 +94,19 @@ public class HomeViewController: BaseViewController { private func bindCourseData() { viewModel.courseSubject .observe(on: MainScheduler.instance) - .subscribe(onNext: { [weak self] courseList in - self?.homeProgressView.setCourseList(courseList) + .subscribe(onNext: { [weak self] course in + self?.currentCourse = course + self?.homeProgressView.setCourseList(course) + }) + .disposed(by: disposeBag) + } + + private func bindPatchStepSuccess() { + viewModel.patchStepSuccessSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] _ in + print("🔄 patchStep 성공 감지, getCourses 호출하여 뷰 재로딩") + self?.viewModel.getCourses() }) .disposed(by: disposeBag) } diff --git a/Projects/Home/Sources/View/QuizViewController.swift b/Projects/Home/Sources/View/QuizViewController.swift index f1f6f3d..9be559c 100644 --- a/Projects/Home/Sources/View/QuizViewController.swift +++ b/Projects/Home/Sources/View/QuizViewController.swift @@ -12,6 +12,9 @@ import SnapKit import RxSwift public class QuizViewController: UIViewController { + let viewModel: HomeViewModel + private let disposeBag = DisposeBag() + let navigationBar = DefaultNavigationBar(leftImage: CommonUIAssets.IconBack ?? nil, rightImage: nil, title: nil) @@ -40,15 +43,12 @@ public class QuizViewController: UIViewController { var quizData: QuizVO? var currentQuiz: QuizDetailVO? - public init(quizData: QuizVO) { + public init(homeViewModel: HomeViewModel, quizData: QuizVO) { + self.viewModel = homeViewModel self.quizData = quizData super.init(nibName: nil, bundle: nil) } - init() { - super.init(nibName: nil, bundle: nil) - } - required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -64,6 +64,7 @@ public class QuizViewController: UIViewController { setupHierarchy() setupLayout() bindDatas() + bindPatchStepSuccess() if let quizData = quizData { showSituation(index: 0) } @@ -127,6 +128,16 @@ public class QuizViewController: UIViewController { navigationBar.setupViewProperty(title: "처음 보는 사람과 인사하기") } } + + func bindPatchStepSuccess() { + viewModel.patchStepSuccessSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] _ in + // patchStep 성공 시 네비게이션 뒤로 가기 + self?.navigationController?.popViewController(animated: true) + }) + .disposed(by: disposeBag) + } func showSituation(index: Int) { guard let quizData = quizData, index < quizData.quizList.count else { @@ -239,6 +250,12 @@ public class QuizViewController: UIViewController { func showQuizCompleteAlert() { let alertView = QuizCompleteAlertView() + alertView.onConfirmButtonTapped = { [weak self] in + // 퀴즈 완료 시 stepProgressId를 사용하여 patchStep 호출 + if let quizData = self?.quizData { + self?.viewModel.patchStep(stepProgressId: quizData.stepProgressId) + } + } alertView.show(in: view) } diff --git a/Projects/Home/Sources/ViewModel/HomeViewModel.swift b/Projects/Home/Sources/ViewModel/HomeViewModel.swift index acdb2a9..140955b 100644 --- a/Projects/Home/Sources/ViewModel/HomeViewModel.swift +++ b/Projects/Home/Sources/ViewModel/HomeViewModel.swift @@ -10,6 +10,8 @@ import RxSwift protocol HomeViewModelProtocol { func getCourses() + func startStep(course: Int, step: Int) + func patchStep(stepProgressId: Int) } public class HomeViewModel: HomeViewModelProtocol { @@ -21,6 +23,7 @@ public class HomeViewModel: HomeViewModelProtocol { let stepListSubject = PublishSubject<[StepVO]>() let courseSubject = PublishSubject() let quizSubject = PublishSubject() + let patchStepSuccessSubject = PublishSubject() public init(courseUseCase: CourseUseCase, tokenUseCase: TokenUseCase, quizUseCase: QuizUseCase) { self.courseUseCase = courseUseCase @@ -43,6 +46,9 @@ public class HomeViewModel: HomeViewModelProtocol { } func startStep(course: Int, step: Int) { + print(course) + print(step) + print("ddddd") quizUseCase.startStep(course: course, step: step) .subscribe(onSuccess: { [weak self] quiz in print("✅ 퀴즈 시작 성공: \(quiz)") @@ -51,4 +57,14 @@ public class HomeViewModel: HomeViewModelProtocol { print("❌ 퀴즈 시작 실패: \(error)") }).disposed(by: disposeBag) } + + func patchStep(stepProgressId: Int) { + quizUseCase.patchStep(stepProgressId: stepProgressId) + .subscribe(onSuccess: { [weak self] result in + print("✅ 퀴즈 완료 성공: \(result)") + self?.patchStepSuccessSubject.onNext(()) + }, onFailure: { error in + print("❌ 퀴즈 완료 실패: \(error)") + }).disposed(by: disposeBag) + } } diff --git a/Projects/MyPage/Sources/View/MyPageViewController.swift b/Projects/MyPage/Sources/View/MyPageViewController.swift index fadcf2a..18d4b15 100644 --- a/Projects/MyPage/Sources/View/MyPageViewController.swift +++ b/Projects/MyPage/Sources/View/MyPageViewController.swift @@ -30,6 +30,7 @@ public class MyPageViewController: BaseViewController { public override func viewDidLoad() { super.viewDidLoad() + view.backgroundColor = CommonUIAssets.LMOrange4 bindActions() } From 79996f94952795d4118fc27f5824bf7af40efd84 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 18:58:23 +0900 Subject: [PATCH 04/17] =?UTF-8?q?[feat/chat]=20feat:=20=EB=8B=A4=EC=9D=8C?= =?UTF-8?q?=20=EC=BD=94=EC=8A=A4=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Icon/next2.imageset/Contents.json | 22 +++++++ .../Icon/next2.imageset/next2@2x.png | Bin 0 -> 463 bytes .../Icon/next2.imageset/next2@3x.png | Bin 0 -> 571 bytes .../Sources/Enum/CommonUIAssets.swift | 1 + .../Sources/View/Home/HomeProgressView.swift | 58 ++++++++++++++++-- .../Sources/View/HomeViewController.swift | 22 ++++++- .../Sources/ViewModel/HomeViewModel.swift | 2 + 7 files changed, 98 insertions(+), 7 deletions(-) create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/Contents.json create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/next2@2x.png create mode 100644 Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/next2@3x.png diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/Contents.json b/Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/Contents.json new file mode 100644 index 0000000..48ee59a --- /dev/null +++ b/Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "next2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "next2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/next2@2x.png b/Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/next2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f17608593cb9c9fb193c591b34425421a1871f GIT binary patch literal 463 zcmV;=0WkiFP)=`JjO>DRU@d(}kZ@>}O8(30nr;YX$U;_1?U>@^c#}W$m&3n_# zmyj$&^7jA96tfFdRaKP~pfH&}&ts%z2-Ky|;`?*;4re1M+}t-G=^waGmt#e{Ua}ZE7+*`oVEKsS2>tCDa92 z$r4!#uu>(m6<{SwWG%qFOJpy=JWH4qU|uE63NVinrUjUF3G)KXvV=rFWn7h!= z*Q!OJm;QP>04_0*YXKI*h)&ngVIbE6`~*iaw*7SiyAmk#~3*jZ8{}m+{D;RCu`sluCw|+d!do zc&0kc5yi#HqGNcL_3gBGc&2_kozC)`bkUUvUsY9ARR;^%F?rSaWr6?z002ovPDHLk FV1l$8y6yk~ literal 0 HcmV?d00001 diff --git a/Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/next2@3x.png b/Projects/CommonUI/Sources/Assets/Images.xcassets/Icon/next2.imageset/next2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..de9f909fafb5a2d93f1dc83eb9e5c85b44625814 GIT binary patch literal 571 zcmV-B0>u4^P)&RDqxmf%X*f=jTnh04Z4mO?M_Ip-<~Q9&(c?m6*(iHQM{ z`}p&im%tmdlu}A5rIfx=tfBME>oXe-^ZM_k{;lk_%$^<}Rwkrbpo_`X>1H!}E;fvJ z9$wc-Q>92FYh?3MZa&3}3(H8Z>-8>K|N9qy?R3mi@1d5Tm1_HH6-2;JAq>w~?KWTc2M?f=Z* z_|IS8&aDB7K;V&z-5z+!#2SzZgpb)U*rBte$r^NI0z6J#gUa4DsNffrnKdAB75hb; z|9KUQj^h)I6hj=JVuV=Y_#`946vw9-5wm7<40gY z6yo?%SOAqcek9hJQXJ@he~?lf=z52lS{&$hkD_86=yI2N@do+nnW5~z2!;Rv002ov JPDHLkV1m08^PvC$ literal 0 HcmV?d00001 diff --git a/Projects/CommonUI/Sources/Enum/CommonUIAssets.swift b/Projects/CommonUI/Sources/Enum/CommonUIAssets.swift index f4ff5af..c585db2 100644 --- a/Projects/CommonUI/Sources/Enum/CommonUIAssets.swift +++ b/Projects/CommonUI/Sources/Enum/CommonUIAssets.swift @@ -56,6 +56,7 @@ public enum CommonUIAssets { public static let IconBubble = image(named: "bubble") public static let IconPrevious = image(named: "previous") public static let IconNext = image(named: "next") + public static let IconNext2 = image(named: "next2") public static let IconAdd = image(named: "add") /// color diff --git a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift index 8946865..db6f5ef 100644 --- a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift +++ b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift @@ -21,19 +21,55 @@ open class HomeProgressView: UIView { var buttonStackView = UIStackView() var restartButton = UIButton() var continueButton = UIButton() - var courseList: CourseVO? + var nextButton = UIButton() + public var courseList: [CourseVO] = [] + public var currentCourseIndex: Int = 0 + public var onNextCourseTapped: (() -> Void)? public override init(frame: CGRect) { super.init(frame: frame) initAttribute() initUI() + bindActions() + } + + private func bindActions() { + nextButton.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside) + } + + @objc private func nextButtonTapped() { + if currentCourseIndex < courseList.count - 1 { + currentCourseIndex += 1 + updateCurrentCourse() + onNextCourseTapped?() + } } - public func setCourseList(_ list: CourseVO) { + public func setCourseList(_ list: [CourseVO]) { self.courseList = list - courseLabel.text = "한국어 훈련 \(courseList?.courseLv ?? 0)단계" - progressLabel.text = "진행률 \(courseList?.progress ?? 0)%" - updateProgress(progress: courseList?.progress ?? 0) + updateCurrentCourse() + } + + private func updateCurrentCourse() { + guard currentCourseIndex < courseList.count else { return } + let currentCourse = courseList[currentCourseIndex] + courseLabel.text = "한국어 훈련 \(currentCourse.courseLv)단계" + progressLabel.text = "진행률 \(currentCourse.progress)%" + updateProgress(progress: currentCourse.progress) + updateNextButtonVisibility() + } + + public func updateNextButtonVisibility() { + guard currentCourseIndex < courseList.count else { + nextButton.isHidden = true + return + } + + let currentCourse = courseList[currentCourseIndex] + let allStepsSolved = currentCourse.stepList.allSatisfy { $0.stepStatus == "SOLVED" } + let hasNextCourse = currentCourseIndex < courseList.count - 1 + + nextButton.isHidden = !allStepsSolved || !hasNextCourse } public func updateProgress(progress: Int) { @@ -97,13 +133,17 @@ open class HomeProgressView: UIView { $0.backgroundColor = CommonUIAssets.LMOrange1 $0.layer.cornerRadius = 10 } + + nextButton = nextButton.then { + $0.setImage(CommonUIAssets.IconNext2, for: .normal) + } } func initUI() { [restartButton, continueButton] .forEach { buttonStackView.addArrangedSubview($0) } - [courseLabel, progressLabel, progressEntireView, progressView, buttonStackView] + [courseLabel, progressLabel, progressEntireView, progressView, buttonStackView, nextButton] .forEach { self.addSubview($0) } self.snp.makeConstraints { @@ -139,6 +179,12 @@ open class HomeProgressView: UIView { $0.width.bottom.equalToSuperview().inset(20) $0.height.equalTo(38) } + + nextButton.snp.makeConstraints { + $0.width.height.equalTo(40) + $0.trailing.equalToSuperview().inset(20) + $0.centerY.equalTo(courseLabel) + } } required public init?(coder: NSCoder) { diff --git a/Projects/Home/Sources/View/HomeViewController.swift b/Projects/Home/Sources/View/HomeViewController.swift index a486b52..38574c4 100644 --- a/Projects/Home/Sources/View/HomeViewController.swift +++ b/Projects/Home/Sources/View/HomeViewController.swift @@ -50,6 +50,7 @@ public class HomeViewController: BaseViewController { bindTransition() bindStepList() bindCourseData() + bindCourseList() bindQuiz() bindPatchStepSuccess() } @@ -96,17 +97,36 @@ public class HomeViewController: BaseViewController { .observe(on: MainScheduler.instance) .subscribe(onNext: { [weak self] course in self?.currentCourse = course - self?.homeProgressView.setCourseList(course) }) .disposed(by: disposeBag) } + private func bindCourseList() { + viewModel.courseListSubject + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] courseList in + self?.homeProgressView.setCourseList(courseList) + self?.homeProgressView.onNextCourseTapped = { [weak self] in + self?.updateCurrentCourseAndSteps() + } + }) + .disposed(by: disposeBag) + } + + private func updateCurrentCourseAndSteps() { + guard let currentCourse = homeProgressView.courseList.first(where: { $0.courseLv == homeProgressView.currentCourseIndex + 1 }) else { return } + self.currentCourse = currentCourse + homeQuizView.setQuizList(currentCourse.stepList) + } + private func bindPatchStepSuccess() { viewModel.patchStepSuccessSubject .observe(on: MainScheduler.instance) .subscribe(onNext: { [weak self] _ in print("🔄 patchStep 성공 감지, getCourses 호출하여 뷰 재로딩") self?.viewModel.getCourses() + // HomeProgressView의 nextButton 가시성 업데이트 + self?.homeProgressView.updateNextButtonVisibility() }) .disposed(by: disposeBag) } diff --git a/Projects/Home/Sources/ViewModel/HomeViewModel.swift b/Projects/Home/Sources/ViewModel/HomeViewModel.swift index 140955b..2cf2049 100644 --- a/Projects/Home/Sources/ViewModel/HomeViewModel.swift +++ b/Projects/Home/Sources/ViewModel/HomeViewModel.swift @@ -22,6 +22,7 @@ public class HomeViewModel: HomeViewModelProtocol { let stepListSubject = PublishSubject<[StepVO]>() let courseSubject = PublishSubject() + let courseListSubject = PublishSubject<[CourseVO]>() let quizSubject = PublishSubject() let patchStepSuccessSubject = PublishSubject() @@ -36,6 +37,7 @@ public class HomeViewModel: HomeViewModelProtocol { courseUseCase.getCourses() .subscribe(onSuccess: { [weak self] response in print("✅ 코스 정보: \(response)") + self?.courseListSubject.onNext(response.list) if let firstCourse = response.list.first { self?.stepListSubject.onNext(firstCourse.stepList) self?.courseSubject.onNext(firstCourse) From adb45bc9fa18420582a67cf1547ce6d3d2d7c771 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 19:03:06 +0900 Subject: [PATCH 05/17] =?UTF-8?q?[feat/chat]=20feat:=20=EC=9D=B4=EC=A0=84?= =?UTF-8?q?=20=EC=BD=94=EC=8A=A4=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/View/Home/HomeProgressView.swift | 33 +++++++++++++++++-- .../Sources/View/HomeViewController.swift | 10 ++++-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift index db6f5ef..4be3326 100644 --- a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift +++ b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift @@ -22,9 +22,11 @@ open class HomeProgressView: UIView { var restartButton = UIButton() var continueButton = UIButton() var nextButton = UIButton() + var previousButton = UIButton() public var courseList: [CourseVO] = [] public var currentCourseIndex: Int = 0 public var onNextCourseTapped: (() -> Void)? + public var onPreviousCourseTapped: (() -> Void)? public override init(frame: CGRect) { super.init(frame: frame) @@ -35,6 +37,7 @@ open class HomeProgressView: UIView { private func bindActions() { nextButton.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside) + previousButton.addTarget(self, action: #selector(previousButtonTapped), for: .touchUpInside) } @objc private func nextButtonTapped() { @@ -44,6 +47,14 @@ open class HomeProgressView: UIView { onNextCourseTapped?() } } + + @objc private func previousButtonTapped() { + if currentCourseIndex > 0 { + currentCourseIndex -= 1 + updateCurrentCourse() + onPreviousCourseTapped?() + } + } public func setCourseList(_ list: [CourseVO]) { self.courseList = list @@ -56,20 +67,26 @@ open class HomeProgressView: UIView { courseLabel.text = "한국어 훈련 \(currentCourse.courseLv)단계" progressLabel.text = "진행률 \(currentCourse.progress)%" updateProgress(progress: currentCourse.progress) - updateNextButtonVisibility() + updateButtonVisibility() } - public func updateNextButtonVisibility() { + public func updateButtonVisibility() { guard currentCourseIndex < courseList.count else { nextButton.isHidden = true + previousButton.isHidden = true return } let currentCourse = courseList[currentCourseIndex] let allStepsSolved = currentCourse.stepList.allSatisfy { $0.stepStatus == "SOLVED" } let hasNextCourse = currentCourseIndex < courseList.count - 1 + let hasPreviousCourse = currentCourseIndex > 0 + // nextButton: 모든 스텝이 완료되고 다음 코스가 있을 때만 표시 nextButton.isHidden = !allStepsSolved || !hasNextCourse + + // previousButton: 이전 코스가 있을 때만 표시 + previousButton.isHidden = !hasPreviousCourse } public func updateProgress(progress: Int) { @@ -137,13 +154,17 @@ open class HomeProgressView: UIView { nextButton = nextButton.then { $0.setImage(CommonUIAssets.IconNext2, for: .normal) } + + previousButton = previousButton.then { + $0.setImage(CommonUIAssets.IconBack, for: .normal) + } } func initUI() { [restartButton, continueButton] .forEach { buttonStackView.addArrangedSubview($0) } - [courseLabel, progressLabel, progressEntireView, progressView, buttonStackView, nextButton] + [courseLabel, progressLabel, progressEntireView, progressView, buttonStackView, nextButton, previousButton] .forEach { self.addSubview($0) } self.snp.makeConstraints { @@ -185,6 +206,12 @@ open class HomeProgressView: UIView { $0.trailing.equalToSuperview().inset(20) $0.centerY.equalTo(courseLabel) } + + previousButton.snp.makeConstraints { + $0.width.height.equalTo(40) + $0.trailing.equalTo(nextButton.snp.leading).offset(-10) + $0.centerY.equalTo(courseLabel) + } } required public init?(coder: NSCoder) { diff --git a/Projects/Home/Sources/View/HomeViewController.swift b/Projects/Home/Sources/View/HomeViewController.swift index 38574c4..43a6f3f 100644 --- a/Projects/Home/Sources/View/HomeViewController.swift +++ b/Projects/Home/Sources/View/HomeViewController.swift @@ -109,12 +109,16 @@ public class HomeViewController: BaseViewController { self?.homeProgressView.onNextCourseTapped = { [weak self] in self?.updateCurrentCourseAndSteps() } + self?.homeProgressView.onPreviousCourseTapped = { [weak self] in + self?.updateCurrentCourseAndSteps() + } }) .disposed(by: disposeBag) } private func updateCurrentCourseAndSteps() { - guard let currentCourse = homeProgressView.courseList.first(where: { $0.courseLv == homeProgressView.currentCourseIndex + 1 }) else { return } + guard homeProgressView.currentCourseIndex < homeProgressView.courseList.count else { return } + let currentCourse = homeProgressView.courseList[homeProgressView.currentCourseIndex] self.currentCourse = currentCourse homeQuizView.setQuizList(currentCourse.stepList) } @@ -125,8 +129,8 @@ public class HomeViewController: BaseViewController { .subscribe(onNext: { [weak self] _ in print("🔄 patchStep 성공 감지, getCourses 호출하여 뷰 재로딩") self?.viewModel.getCourses() - // HomeProgressView의 nextButton 가시성 업데이트 - self?.homeProgressView.updateNextButtonVisibility() + // HomeProgressView의 버튼 가시성 업데이트 + self?.homeProgressView.updateButtonVisibility() }) .disposed(by: disposeBag) } From 55673642481e99e431ad6fd09fd32f7c75c94b8d Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 19:13:33 +0900 Subject: [PATCH 06/17] =?UTF-8?q?[feat/sign]=20feat:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EC=99=84=EB=A3=8C=20=EB=AA=A8=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommonUI/Sources/Component/LMAlert.swift | 5 +++ .../Sources/View/Home/HomeProgressView.swift | 41 ++++++++++++++----- .../Sources/View/SignUpViewController.swift | 20 +++++++++ .../Sources/ViewModel/SignViewModel.swift | 2 + 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/Projects/CommonUI/Sources/Component/LMAlert.swift b/Projects/CommonUI/Sources/Component/LMAlert.swift index 5a128ed..4fb1a40 100644 --- a/Projects/CommonUI/Sources/Component/LMAlert.swift +++ b/Projects/CommonUI/Sources/Component/LMAlert.swift @@ -133,6 +133,11 @@ public class LMAlert: UIView { titleLabel.attributedText = attributedString cancelButton.setTitle(cancelTitle, for: .normal) confirmButton.setTitle(confirmTitle, for: .normal) + + // cancelTitle이 비어있으면 취소 버튼 숨기기 + if cancelTitle.isEmpty { + cancelButton.isHidden = true + } } // MARK: - Actions diff --git a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift index 4be3326..e677e0c 100644 --- a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift +++ b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift @@ -41,6 +41,7 @@ open class HomeProgressView: UIView { } @objc private func nextButtonTapped() { + guard nextButton.isEnabled else { return } if currentCourseIndex < courseList.count - 1 { currentCourseIndex += 1 updateCurrentCourse() @@ -49,6 +50,7 @@ open class HomeProgressView: UIView { } @objc private func previousButtonTapped() { + guard previousButton.isEnabled else { return } if currentCourseIndex > 0 { currentCourseIndex -= 1 updateCurrentCourse() @@ -72,8 +74,9 @@ open class HomeProgressView: UIView { public func updateButtonVisibility() { guard currentCourseIndex < courseList.count else { - nextButton.isHidden = true - previousButton.isHidden = true + nextButton.isEnabled = false + previousButton.isEnabled = false + updateButtonAppearance() return } @@ -82,11 +85,23 @@ open class HomeProgressView: UIView { let hasNextCourse = currentCourseIndex < courseList.count - 1 let hasPreviousCourse = currentCourseIndex > 0 - // nextButton: 모든 스텝이 완료되고 다음 코스가 있을 때만 표시 - nextButton.isHidden = !allStepsSolved || !hasNextCourse + // nextButton: 모든 스텝이 완료되고 다음 코스가 있을 때만 활성화 + nextButton.isEnabled = allStepsSolved && hasNextCourse - // previousButton: 이전 코스가 있을 때만 표시 - previousButton.isHidden = !hasPreviousCourse + // previousButton: 이전 코스가 있을 때만 활성화 + previousButton.isEnabled = hasPreviousCourse + + updateButtonAppearance() + } + + private func updateButtonAppearance() { + // nextButton 스타일 업데이트 + nextButton.backgroundColor = nextButton.isEnabled ? CommonUIAssets.LMOrange1 : CommonUIAssets.LMGray5 + nextButton.tintColor = nextButton.isEnabled ? .white : CommonUIAssets.LMGray3 + + // previousButton 스타일 업데이트 + previousButton.backgroundColor = previousButton.isEnabled ? CommonUIAssets.LMOrange1 : CommonUIAssets.LMGray5 + previousButton.tintColor = previousButton.isEnabled ? .white : CommonUIAssets.LMGray3 } public func updateProgress(progress: Int) { @@ -152,11 +167,17 @@ open class HomeProgressView: UIView { } nextButton = nextButton.then { - $0.setImage(CommonUIAssets.IconNext2, for: .normal) + $0.setImage(CommonUIAssets.IconNext, for: .normal) + $0.backgroundColor = CommonUIAssets.LMOrange1 + $0.layer.cornerRadius = 15 + $0.tintColor = .white } previousButton = previousButton.then { - $0.setImage(CommonUIAssets.IconBack, for: .normal) + $0.setImage(CommonUIAssets.IconPrevious, for: .normal) + $0.backgroundColor = CommonUIAssets.LMOrange1 + $0.layer.cornerRadius = 15 + $0.tintColor = .white } } @@ -202,13 +223,13 @@ open class HomeProgressView: UIView { } nextButton.snp.makeConstraints { - $0.width.height.equalTo(40) + $0.width.height.equalTo(30) $0.trailing.equalToSuperview().inset(20) $0.centerY.equalTo(courseLabel) } previousButton.snp.makeConstraints { - $0.width.height.equalTo(40) + $0.width.height.equalTo(30) $0.trailing.equalTo(nextButton.snp.leading).offset(-10) $0.centerY.equalTo(courseLabel) } diff --git a/Projects/Login/Sources/View/SignUpViewController.swift b/Projects/Login/Sources/View/SignUpViewController.swift index 125234a..acd7e3f 100644 --- a/Projects/Login/Sources/View/SignUpViewController.swift +++ b/Projects/Login/Sources/View/SignUpViewController.swift @@ -64,6 +64,12 @@ public class SignUpViewController: BaseViewController { self?.signUpView.confirmInputField.showWarning() } } + + viewModel.onSignUpSuccess = { [weak self] in + DispatchQueue.main.async { + self?.showSignUpSuccessModal() + } + } } private func bindActions() { @@ -207,4 +213,18 @@ public class SignUpViewController: BaseViewController { $0.width.equalToSuperview() } } + + private func showSignUpSuccessModal() { + let alertView = LMAlert(title: "회원가입이 완료되었습니다!\n로그인 화면으로 이동하시겠습니까?", + cancelTitle: "", + confirmTitle: "확인") + alertView.setConfirmAction { [weak self] in + self?.navigateToSignIn() + } + alertView.show(in: view) + } + + private func navigateToSignIn() { + navigationController?.popViewController(animated: true) + } } diff --git a/Projects/Login/Sources/ViewModel/SignViewModel.swift b/Projects/Login/Sources/ViewModel/SignViewModel.swift index 35a4f59..0df1d5c 100644 --- a/Projects/Login/Sources/ViewModel/SignViewModel.swift +++ b/Projects/Login/Sources/ViewModel/SignViewModel.swift @@ -26,6 +26,7 @@ public class SignViewModel: SignViewModelProtocol { public var onConfirmSuccess: (() -> Void)? public var onConfirmFailure: (() -> Void)? public var onSignInSuccess: (() -> Void)? + public var onSignUpSuccess: (() -> Void)? public let emailVerified = BehaviorRelay(value: false) public init(signUseCase: SignUseCase, tokenRepository: TokenRepository) { @@ -86,6 +87,7 @@ public class SignViewModel: SignViewModelProtocol { .subscribe(onSuccess: { [weak self] response in guard let self = self else { return } print("회원가입 성공: \(response.message)") + self.onSignUpSuccess?() }, onFailure: { [weak self] error in guard let self = self else { return } print("회원가입 실패: \(error)") From 781467cea1e3acd7be3f3bac103f72ab01a385e7 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 19:26:08 +0900 Subject: [PATCH 07/17] =?UTF-8?q?[feat/quiz]=20fix:=20=EC=A7=84=ED=96=89?= =?UTF-8?q?=EB=A5=A0=20=EA=B3=84=EC=82=B0=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/View/Home/HomeProgressView.swift | 2 +- .../Sources/View/HomeViewController.swift | 3 ++- .../Sources/View/QuizViewController.swift | 20 ++++++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift index e677e0c..9522a9a 100644 --- a/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift +++ b/Projects/CommonUI/Sources/View/Home/HomeProgressView.swift @@ -106,7 +106,7 @@ open class HomeProgressView: UIView { public func updateProgress(progress: Int) { let progressEntireWidth = 344 - 40 - let progressWidth = Int(CGFloat(progress)) / 100 * progressEntireWidth + let progressWidth = CGFloat(progress) / 100.0 * CGFloat(progressEntireWidth) progressView.snp.updateConstraints { make in make.width.equalTo(progressWidth) diff --git a/Projects/Home/Sources/View/HomeViewController.swift b/Projects/Home/Sources/View/HomeViewController.swift index 43a6f3f..5e7e1e9 100644 --- a/Projects/Home/Sources/View/HomeViewController.swift +++ b/Projects/Home/Sources/View/HomeViewController.swift @@ -163,7 +163,8 @@ public class HomeViewController: BaseViewController { scrollView.snp.makeConstraints { $0.top.equalTo(logoImageView.snp.bottom).offset(10) - $0.horizontalEdges.bottom.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview().inset(10) } contentView.snp.makeConstraints { diff --git a/Projects/Home/Sources/View/QuizViewController.swift b/Projects/Home/Sources/View/QuizViewController.swift index 9be559c..fae1122 100644 --- a/Projects/Home/Sources/View/QuizViewController.swift +++ b/Projects/Home/Sources/View/QuizViewController.swift @@ -110,7 +110,7 @@ public class QuizViewController: UIViewController { scrollView.snp.makeConstraints { $0.top.equalTo(progressEntireView.snp.bottom).offset(20) - $0.horizontalEdges.bottom.equalToSuperview() + $0.horizontalEdges.bottom.equalToSuperview().inset(10) } quizStackView.snp.makeConstraints { @@ -151,6 +151,7 @@ public class QuizViewController: UIViewController { if !situationText.isEmpty { let situationView = QuizView(text: situationText, type: .situation) quizStackView.addArrangedSubview(situationView) + scrollToBottom() DispatchQueue.main.asyncAfter(deadline: .now() + 2) { self.showQuestion(index: index) @@ -169,6 +170,7 @@ public class QuizViewController: UIViewController { let questionView = QuizView(text: currentQuiz.quiz, type: .question) quizStackView.addArrangedSubview(questionView) + scrollToBottom() DispatchQueue.main.asyncAfter(deadline: .now() + 2) { let optionStack = UIStackView().then { @@ -187,6 +189,7 @@ public class QuizViewController: UIViewController { self.quizStackView.addArrangedSubview(optionStack) self.currentQuestionIndex = index self.currentOptionStackView = optionStack + self.scrollToBottom() } } @@ -211,6 +214,7 @@ public class QuizViewController: UIViewController { let feedbackText = currentQuiz.quizOptions[selectedIndex].description let feedback = AnswerView(text: feedbackText, type: .correct) quizStackView.addArrangedSubview(feedback) + scrollToBottom() updateProgress() @@ -222,6 +226,7 @@ public class QuizViewController: UIViewController { } else { let feedback = AnswerView(text: "다시 한 번 생각해보세요.", type: .wrong) quizStackView.addArrangedSubview(feedback) + scrollToBottom() DispatchQueue.main.asyncAfter(deadline: .now() + 2) { let currentQuiz = quizData.quizList[self.currentQuestionIndex] @@ -240,6 +245,7 @@ public class QuizViewController: UIViewController { self.quizStackView.addArrangedSubview(optionStack) self.currentOptionStackView = optionStack + self.scrollToBottom() } } } @@ -277,4 +283,16 @@ public class QuizViewController: UIViewController { self.view.layoutIfNeeded() } } + + private func scrollToBottom() { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + let bottomOffset = CGPoint( + x: 0, + y: self.scrollView.contentSize.height - self.scrollView.bounds.height + ) + if bottomOffset.y > 0 { + self.scrollView.setContentOffset(bottomOffset, animated: true) + } + } + } } From 9470b6f5e1051ebe8306f287e75e20f219829b73 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 19:41:00 +0900 Subject: [PATCH 08/17] =?UTF-8?q?[feat/quiz]=20fix:=20UI=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Home/Sources/View/HomeViewController.swift | 7 +++---- Projects/Login/Sources/View/SignUpViewController.swift | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Projects/Home/Sources/View/HomeViewController.swift b/Projects/Home/Sources/View/HomeViewController.swift index 5e7e1e9..96e9c18 100644 --- a/Projects/Home/Sources/View/HomeViewController.swift +++ b/Projects/Home/Sources/View/HomeViewController.swift @@ -163,8 +163,7 @@ public class HomeViewController: BaseViewController { scrollView.snp.makeConstraints { $0.top.equalTo(logoImageView.snp.bottom).offset(10) - $0.horizontalEdges.equalToSuperview() - $0.bottom.equalToSuperview().inset(10) + $0.horizontalEdges.bottom.equalToSuperview() } contentView.snp.makeConstraints { @@ -184,9 +183,9 @@ public class HomeViewController: BaseViewController { homeQuizView.snp.makeConstraints { $0.top.equalTo(homeProgressView.snp.bottom).offset(30) $0.centerX.equalToSuperview() - $0.height.equalTo(330) +// $0.height.equalTo(330) $0.width.equalToSuperview().inset(20) - $0.bottom.equalToSuperview().inset(20) + $0.bottom.equalToSuperview().inset(50) } } } diff --git a/Projects/Login/Sources/View/SignUpViewController.swift b/Projects/Login/Sources/View/SignUpViewController.swift index acd7e3f..04b8995 100644 --- a/Projects/Login/Sources/View/SignUpViewController.swift +++ b/Projects/Login/Sources/View/SignUpViewController.swift @@ -215,7 +215,7 @@ public class SignUpViewController: BaseViewController { } private func showSignUpSuccessModal() { - let alertView = LMAlert(title: "회원가입이 완료되었습니다!\n로그인 화면으로 이동하시겠습니까?", + let alertView = LMAlert(title: "회원가입이 완료되었습니다!", cancelTitle: "", confirmTitle: "확인") alertView.setConfirmAction { [weak self] in From 2b681b81dc041e18807af04acf5e941565f22816 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 19:59:35 +0900 Subject: [PATCH 09/17] =?UTF-8?q?Revert=20"[feat/quiz]=20fix:=20UI=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 9470b6f5e1051ebe8306f287e75e20f219829b73. --- Projects/Home/Sources/View/HomeViewController.swift | 7 ++++--- Projects/Login/Sources/View/SignUpViewController.swift | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Projects/Home/Sources/View/HomeViewController.swift b/Projects/Home/Sources/View/HomeViewController.swift index 96e9c18..5e7e1e9 100644 --- a/Projects/Home/Sources/View/HomeViewController.swift +++ b/Projects/Home/Sources/View/HomeViewController.swift @@ -163,7 +163,8 @@ public class HomeViewController: BaseViewController { scrollView.snp.makeConstraints { $0.top.equalTo(logoImageView.snp.bottom).offset(10) - $0.horizontalEdges.bottom.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview().inset(10) } contentView.snp.makeConstraints { @@ -183,9 +184,9 @@ public class HomeViewController: BaseViewController { homeQuizView.snp.makeConstraints { $0.top.equalTo(homeProgressView.snp.bottom).offset(30) $0.centerX.equalToSuperview() -// $0.height.equalTo(330) + $0.height.equalTo(330) $0.width.equalToSuperview().inset(20) - $0.bottom.equalToSuperview().inset(50) + $0.bottom.equalToSuperview().inset(20) } } } diff --git a/Projects/Login/Sources/View/SignUpViewController.swift b/Projects/Login/Sources/View/SignUpViewController.swift index 04b8995..acd7e3f 100644 --- a/Projects/Login/Sources/View/SignUpViewController.swift +++ b/Projects/Login/Sources/View/SignUpViewController.swift @@ -215,7 +215,7 @@ public class SignUpViewController: BaseViewController { } private func showSignUpSuccessModal() { - let alertView = LMAlert(title: "회원가입이 완료되었습니다!", + let alertView = LMAlert(title: "회원가입이 완료되었습니다!\n로그인 화면으로 이동하시겠습니까?", cancelTitle: "", confirmTitle: "확인") alertView.setConfirmAction { [weak self] in From 508545d88897a629f389fcfc036fa25c7b194b61 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 20:01:12 +0900 Subject: [PATCH 10/17] =?UTF-8?q?[feat/quiz]=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Home/Sources/View/QuizViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Projects/Home/Sources/View/QuizViewController.swift b/Projects/Home/Sources/View/QuizViewController.swift index fae1122..e83b157 100644 --- a/Projects/Home/Sources/View/QuizViewController.swift +++ b/Projects/Home/Sources/View/QuizViewController.swift @@ -224,7 +224,8 @@ public class QuizViewController: UIViewController { self.showSituation(index: nextIndex) } } else { - let feedback = AnswerView(text: "다시 한 번 생각해보세요.", type: .wrong) + let feedbackText = currentQuiz.quizOptions[selectedIndex].description + let feedback = AnswerView(text: feedbackText, type: .wrong) quizStackView.addArrangedSubview(feedback) scrollToBottom() From 6ccd8aec330036d679edbdf12bc1c6c9ec0f847d Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 20:01:37 +0900 Subject: [PATCH 11/17] =?UTF-8?q?[feat/sign]=20fix:=20=08=EB=AA=A8?= =?UTF-8?q?=EB=8B=AC=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Login/Sources/View/SignUpViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Login/Sources/View/SignUpViewController.swift b/Projects/Login/Sources/View/SignUpViewController.swift index acd7e3f..04b8995 100644 --- a/Projects/Login/Sources/View/SignUpViewController.swift +++ b/Projects/Login/Sources/View/SignUpViewController.swift @@ -215,7 +215,7 @@ public class SignUpViewController: BaseViewController { } private func showSignUpSuccessModal() { - let alertView = LMAlert(title: "회원가입이 완료되었습니다!\n로그인 화면으로 이동하시겠습니까?", + let alertView = LMAlert(title: "회원가입이 완료되었습니다!", cancelTitle: "", confirmTitle: "확인") alertView.setConfirmAction { [weak self] in From 48a88981c0a15638f20d2354e6d0a958bfcd817d Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sat, 20 Sep 2025 20:17:26 +0900 Subject: [PATCH 12/17] =?UTF-8?q?[feat/diary]=20fix:=20=08=EC=9D=BC?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=80=EC=9E=A5=20=EC=98=A4=EB=A5=98=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/View/Diary/DiaryResultView.swift | 1 + .../Sources/View/DiaryAddViewController.swift | 3 +-- .../View/DiaryResultViewController.swift | 6 +++++- .../Sources/View/DiaryViewController.swift | 19 +++++++++---------- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift b/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift index a0559f3..6581547 100644 --- a/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift +++ b/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift @@ -194,6 +194,7 @@ open class DiaryResultView: UIView { private func bindEvents() { confirmButton.rx.tap .subscribe(onNext: { [weak self] in + print("🔄 DiaryResultView: confirmButton 탭됨") self?.onSaveButtonTapped?() }) .disposed(by: disposeBag) diff --git a/Projects/Diary/Sources/View/DiaryAddViewController.swift b/Projects/Diary/Sources/View/DiaryAddViewController.swift index 71bcc28..3122676 100644 --- a/Projects/Diary/Sources/View/DiaryAddViewController.swift +++ b/Projects/Diary/Sources/View/DiaryAddViewController.swift @@ -131,9 +131,8 @@ public class DiaryAddViewController: BaseViewController { print("📊 분석 결과 화면으로 이동") let diaryResultViewController = DiaryResultViewController(diaryViewModel: viewModel, diaryData: diaryData) - diaryResultViewController.modalPresentationStyle = .fullScreen - present(diaryResultViewController, animated: true) + navigationController?.pushViewController(diaryResultViewController, animated: true) } private func bindData() { diff --git a/Projects/Diary/Sources/View/DiaryResultViewController.swift b/Projects/Diary/Sources/View/DiaryResultViewController.swift index a4496cb..01462c4 100644 --- a/Projects/Diary/Sources/View/DiaryResultViewController.swift +++ b/Projects/Diary/Sources/View/DiaryResultViewController.swift @@ -110,7 +110,11 @@ public class DiaryResultViewController: BaseViewController { } private func handleSaveDiary() { - self.navigationController?.popViewController(animated: true) + print("🔄 handleSaveDiary 호출됨") + print("🔄 navigationController: \(String(describing: navigationController))") + + // root view인 DiaryViewController로 이동 + self.navigationController?.popToRootViewController(animated: true) } private func configureData() { diff --git a/Projects/Diary/Sources/View/DiaryViewController.swift b/Projects/Diary/Sources/View/DiaryViewController.swift index a81954a..f828f5e 100644 --- a/Projects/Diary/Sources/View/DiaryViewController.swift +++ b/Projects/Diary/Sources/View/DiaryViewController.swift @@ -30,21 +30,20 @@ public class DiaryViewController: BaseViewController { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: false) - // 첫 진입 시에만 데이터 로드 + let today = Date() + let calendar = Calendar.current + let year = calendar.component(.year, from: today) + let month = calendar.component(.month, from: today) + + // 첫 진입 시에만 오늘 날짜의 일기 데이터 로드 if isFirstAppearance { - let today = Date() - let calendar = Calendar.current - let year = calendar.component(.year, from: today) - let month = calendar.component(.month, from: today) - - // 캘린더 데이터 로드 - viewModel.getDiaryCalendar(year: year, month: month) - // 오늘 날짜의 일기 데이터 로드 viewModel.getDiary(date: today) - isFirstAppearance = false } + + // 매번 캘린더 데이터 리로드 (일기 저장 후 돌아올 때 포함) + viewModel.getDiaryCalendar(year: year, month: month) } public override func viewDidLoad() { From fa77b5dba086ae71f07114f38693167304362c7f Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Wed, 24 Sep 2025 00:08:55 +0900 Subject: [PATCH 13/17] =?UTF-8?q?[feat/quiz]=20fix:=20=08=08=ED=80=B4?= =?UTF-8?q?=EC=A6=88=20=EC=A7=84=ED=96=89=EC=A4=91=20=EB=92=A4=EB=A1=9C=20?= =?UTF-8?q?=EA=B0=80=EA=B8=B0=20=EC=8B=9C=20=ED=80=B4=EC=A6=88=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=20=ED=98=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Navigation/DefaultNavigationBar.swift | 7 ++-- .../Sources/Repository/QuizRepository.swift | 10 ++++++ .../Domain/Domain.xcodeproj/project.pbxproj | 6 ++-- .../RepositoryProtocol/QuizRepository.swift | 1 + .../Domain/Sources/UseCase/QuizUseCase.swift | 5 +++ .../Sources/View/QuizViewController.swift | 35 ++++++++++++++++++- .../Sources/ViewModel/HomeViewModel.swift | 10 ++++++ 7 files changed, 68 insertions(+), 6 deletions(-) diff --git a/Projects/CommonUI/Sources/View/Navigation/DefaultNavigationBar.swift b/Projects/CommonUI/Sources/View/Navigation/DefaultNavigationBar.swift index 0b0ca19..d5e2995 100644 --- a/Projects/CommonUI/Sources/View/Navigation/DefaultNavigationBar.swift +++ b/Projects/CommonUI/Sources/View/Navigation/DefaultNavigationBar.swift @@ -16,7 +16,8 @@ public final class DefaultNavigationBar: UIView { public init(leftImage: UIImage?, rightImage: UIImage?, - title: String?) { + title: String?, + isBack: Bool = true) { super.init(frame: .zero) setupUI() setupLayout() @@ -25,7 +26,9 @@ public final class DefaultNavigationBar: UIView { rightButton.setImage(rightImage, for: .normal) titleLabel.text = title - leftButton.addTarget(self, action: #selector(leftButtonTapped), for: .touchUpInside) + if (isBack) { + leftButton.addTarget(self, action: #selector(leftButtonTapped), for: .touchUpInside) + } rightButton.addTarget(self, action: #selector(rightButtonTapped), for: .touchUpInside) } diff --git a/Projects/Data/Sources/Repository/QuizRepository.swift b/Projects/Data/Sources/Repository/QuizRepository.swift index ff30659..28c5534 100644 --- a/Projects/Data/Sources/Repository/QuizRepository.swift +++ b/Projects/Data/Sources/Repository/QuizRepository.swift @@ -43,6 +43,16 @@ public class DefaultQuizRepository: QuizRepository { } } + public func deleteStep(stepProgressId: Int) -> Single { + return request(method: .delete, + endpoint: "/api/courses/\(stepProgressId)", + responseType: DefaultDTO.self + ) + .map { dto in + return dto.getMessage() + } + } + private func request( method: HTTPMethod = .get, parameters: [String: Any]? = nil, diff --git a/Projects/Domain/Domain.xcodeproj/project.pbxproj b/Projects/Domain/Domain.xcodeproj/project.pbxproj index a3fcdf4..9b66eaa 100644 --- a/Projects/Domain/Domain.xcodeproj/project.pbxproj +++ b/Projects/Domain/Domain.xcodeproj/project.pbxproj @@ -203,12 +203,12 @@ BC1A55AF7DC675AFEA6E7C12 /* RepositoryProtocol */ = { isa = PBXGroup; children = ( - CFB20675E9BA27548003EA55 /* ChatRepository.swift */, - 956C4D8C2E7710B900E32F93 /* DiaryRepository.swift */, DCA3E06ED2A8180A63919B6C /* CourseRepository.swift */, - 8A2AB67DE6AA50B3229C7A86 /* LoginRepository.swift */, 1BA1471CB01ECE73BAD3D595 /* QuizRepository.swift */, + CFB20675E9BA27548003EA55 /* ChatRepository.swift */, + 956C4D8C2E7710B900E32F93 /* DiaryRepository.swift */, 95EDE8D82E7E6F6A0091ED75 /* UserRepository.swift */, + 8A2AB67DE6AA50B3229C7A86 /* LoginRepository.swift */, B437170C7511425C025E4D08 /* SignRepository.swift */, 1A1F66123A81636A913985E6 /* TokenRepository.swift */, ); diff --git a/Projects/Domain/Sources/RepositoryProtocol/QuizRepository.swift b/Projects/Domain/Sources/RepositoryProtocol/QuizRepository.swift index c70965d..6181ada 100644 --- a/Projects/Domain/Sources/RepositoryProtocol/QuizRepository.swift +++ b/Projects/Domain/Sources/RepositoryProtocol/QuizRepository.swift @@ -10,4 +10,5 @@ import RxSwift public protocol QuizRepository { func startStep(course: Int, step: Int) -> Single func patchStep(stepProgressId: Int) -> Single + func deleteStep(stepProgressId: Int) -> Single } diff --git a/Projects/Domain/Sources/UseCase/QuizUseCase.swift b/Projects/Domain/Sources/UseCase/QuizUseCase.swift index 20c8d79..d8503a3 100644 --- a/Projects/Domain/Sources/UseCase/QuizUseCase.swift +++ b/Projects/Domain/Sources/UseCase/QuizUseCase.swift @@ -10,6 +10,7 @@ import RxSwift public protocol QuizUseCase { func startStep(course: Int, step: Int) -> Single func patchStep(stepProgressId: Int) -> Single + func deleteStep(stepProgressId: Int) -> Single } public final class DefaultQuizUseCase: QuizUseCase { @@ -26,4 +27,8 @@ public final class DefaultQuizUseCase: QuizUseCase { public func patchStep(stepProgressId: Int) -> Single { return repository.patchStep(stepProgressId: stepProgressId) } + + public func deleteStep(stepProgressId: Int) -> Single { + return repository.deleteStep(stepProgressId: stepProgressId) + } } diff --git a/Projects/Home/Sources/View/QuizViewController.swift b/Projects/Home/Sources/View/QuizViewController.swift index e83b157..fc4a75f 100644 --- a/Projects/Home/Sources/View/QuizViewController.swift +++ b/Projects/Home/Sources/View/QuizViewController.swift @@ -17,7 +17,8 @@ public class QuizViewController: UIViewController { let navigationBar = DefaultNavigationBar(leftImage: CommonUIAssets.IconBack ?? nil, rightImage: nil, - title: nil) + title: nil, + isBack: false) let progressView = UIView().then { $0.backgroundColor = CommonUIAssets.LMOrange1 $0.layer.cornerRadius = 3 @@ -64,6 +65,7 @@ public class QuizViewController: UIViewController { setupHierarchy() setupLayout() bindDatas() + bindEvents() bindPatchStepSuccess() if let quizData = quizData { showSituation(index: 0) @@ -129,6 +131,37 @@ public class QuizViewController: UIViewController { } } + func bindEvents() { + navigationBar.leftButton.rx.tap + .subscribe(onNext: { [weak self] in + self?.showExitConfirmationAlert() + }) + .disposed(by: disposeBag) + } + + private func showExitConfirmationAlert() { + let lmAlert = LMAlert(title: "퀴즈를 중단하시겠습니까?\n진행 상황이 저장되지 않습니다.") + + lmAlert.setCancelAction { + // 취소 시 아무것도 하지 않음 + } + + lmAlert.setConfirmAction { [weak self] in + self?.deleteStepAndExit() + } + + lmAlert.show(in: view) + } + + private func deleteStepAndExit() { + guard let quizData = quizData else { return } + + viewModel.deleteStep(stepProgressId: quizData.stepProgressId) + + // 네비게이션에서 뒤로가기 + navigationController?.popViewController(animated: true) + } + func bindPatchStepSuccess() { viewModel.patchStepSuccessSubject .observe(on: MainScheduler.instance) diff --git a/Projects/Home/Sources/ViewModel/HomeViewModel.swift b/Projects/Home/Sources/ViewModel/HomeViewModel.swift index 2cf2049..2d6e61e 100644 --- a/Projects/Home/Sources/ViewModel/HomeViewModel.swift +++ b/Projects/Home/Sources/ViewModel/HomeViewModel.swift @@ -12,6 +12,7 @@ protocol HomeViewModelProtocol { func getCourses() func startStep(course: Int, step: Int) func patchStep(stepProgressId: Int) + func deleteStep(stepProgressId: Int) } public class HomeViewModel: HomeViewModelProtocol { @@ -69,4 +70,13 @@ public class HomeViewModel: HomeViewModelProtocol { print("❌ 퀴즈 완료 실패: \(error)") }).disposed(by: disposeBag) } + + func deleteStep(stepProgressId: Int) { + quizUseCase.deleteStep(stepProgressId: stepProgressId) + .subscribe(onSuccess: { [weak self] result in + print("✅ 퀴즈 삭제 성공: \(result)") + }, onFailure: { error in + print("❌ 퀴즈 삭제 실패: \(error)") + }).disposed(by: disposeBag) + } } From 076bc0ace4edb857ce1697c90799b6c332757258 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Wed, 24 Sep 2025 00:32:18 +0900 Subject: [PATCH 14/17] =?UTF-8?q?[feat/quiz]=20fix:=20=08=08=ED=80=B4?= =?UTF-8?q?=EC=A6=88=20=EC=A7=84=ED=96=89=20=ED=98=B8=EC=B6=9C=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/CommonUI/Sources/View/Home/HomeQuizView.swift | 5 +++++ .../CommonUI/Sources/View/Home/QuizCollectionViewCell.swift | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Projects/CommonUI/Sources/View/Home/HomeQuizView.swift b/Projects/CommonUI/Sources/View/Home/HomeQuizView.swift index be8cd5d..17dd337 100644 --- a/Projects/CommonUI/Sources/View/Home/HomeQuizView.swift +++ b/Projects/CommonUI/Sources/View/Home/HomeQuizView.swift @@ -91,6 +91,11 @@ open class HomeQuizView: UIView, UICollectionViewDataSource, UICollectionViewDel } let step = stepList[indexPath.item] cell.configure(with: step) + + // 셀 재사용 시 이전 subscription 정리하고 버튼 이벤트 재설정 + cell.disposeBag = DisposeBag() + cell.bindActions() // 버튼 이벤트 재설정 + cell.onStartButtonTapped .subscribe(onNext: { [weak self] in self?.onStartButtonTapped?(indexPath) diff --git a/Projects/CommonUI/Sources/View/Home/QuizCollectionViewCell.swift b/Projects/CommonUI/Sources/View/Home/QuizCollectionViewCell.swift index 4f9db98..293a24c 100644 --- a/Projects/CommonUI/Sources/View/Home/QuizCollectionViewCell.swift +++ b/Projects/CommonUI/Sources/View/Home/QuizCollectionViewCell.swift @@ -16,7 +16,7 @@ final class HomeQuizCell: UICollectionViewCell { var quizSubtitleLabel = UILabel() var startButton = UIButton() - let disposeBag = DisposeBag() + var disposeBag = DisposeBag() let onStartButtonTapped = PublishSubject() override init(frame: CGRect) { @@ -123,7 +123,7 @@ final class HomeQuizCell: UICollectionViewCell { startButton.configuration = config } - func bindActions() { + public func bindActions() { startButton.rx.tap .bind(to: onStartButtonTapped) .disposed(by: disposeBag) From 60402c4efd43514023b3a628bc0b68ddd7dfe4e0 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Wed, 24 Sep 2025 01:09:54 +0900 Subject: [PATCH 15/17] =?UTF-8?q?[feat/diary]=20feat:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=EB=B3=84=20=EC=BB=AC=EB=9F=AC=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommonUI.xcodeproj/project.pbxproj | 4 ++ .../Contents.json | 12 ++--- .../LMBlue02.colorset/Contents.json | 12 ++--- .../LMGreen01.colorset/Contents.json | 38 ++++++++++++++ .../Contents.json | 0 .../LMOrange00.colorset/Contents.json | 38 ++++++++++++++ .../LMPink.colorset/Contents.json | 38 ++++++++++++++ .../Sources/Enum/CommonUIAssets.swift | 7 ++- .../Sources/Enum/SpellingCategoryColor.swift | 49 +++++++++++++++++++ .../Sources/View/Diary/DiaryDetailView.swift | 15 ++++-- .../Sources/View/Diary/DiaryResultView.swift | 15 ++++-- .../Sources/View/Diary/DiaryTodayView.swift | 1 - .../Sources/View/Home/AnswerView.swift | 2 +- .../CommonUI/Sources/View/Home/QuizView.swift | 2 +- 14 files changed, 206 insertions(+), 27 deletions(-) rename Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/{LMBlue.colorset => LMBlue01.colorset}/Contents.json (76%) create mode 100644 Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMGreen01.colorset/Contents.json rename Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/{LMGreen.colorset => LMGreen02.colorset}/Contents.json (100%) create mode 100644 Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMOrange00.colorset/Contents.json create mode 100644 Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMPink.colorset/Contents.json create mode 100644 Projects/CommonUI/Sources/Enum/SpellingCategoryColor.swift diff --git a/Projects/CommonUI/CommonUI.xcodeproj/project.pbxproj b/Projects/CommonUI/CommonUI.xcodeproj/project.pbxproj index 0beaa11..744f918 100644 --- a/Projects/CommonUI/CommonUI.xcodeproj/project.pbxproj +++ b/Projects/CommonUI/CommonUI.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ 7DC59B80630854028C7C80F4 /* TuistBundle+CommonUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94EF204F3CD6F86C6167C300 /* TuistBundle+CommonUI.swift */; }; 7DD1D21C569B040F1AB7067B /* DiaryResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EEBE047F5F8EC16F0985204 /* DiaryResultView.swift */; }; 8E0E6BDEA9574116ECBD55E4 /* ChatAnalysisView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 963B9323B265D5683B336EF2 /* ChatAnalysisView.swift */; }; + 95256BFF2E82F7F900AC3FE1 /* SpellingCategoryColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95256BFE2E82F7F800AC3FE1 /* SpellingCategoryColor.swift */; }; 9532C7A92E786B3C00B4BADE /* DiaryLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9532C7A82E786B3800B4BADE /* DiaryLoadingView.swift */; }; 956C4D852E76F05000E32F93 /* CalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956C4D842E76F04A00E32F93 /* CalendarView.swift */; }; 956C4D892E76F0F500E32F93 /* DividerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956C4D882E76F0F400E32F93 /* DividerView.swift */; }; @@ -97,6 +98,7 @@ 83D64639CB805B71A9CA6C17 /* ChatAnalysisLoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatAnalysisLoadingView.swift; sourceTree = ""; }; 9266801EFBA6178C5B70C641 /* MyPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageView.swift; sourceTree = ""; }; 94EF204F3CD6F86C6167C300 /* TuistBundle+CommonUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TuistBundle+CommonUI.swift"; sourceTree = ""; }; + 95256BFE2E82F7F800AC3FE1 /* SpellingCategoryColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpellingCategoryColor.swift; sourceTree = ""; }; 9532C7A82E786B3800B4BADE /* DiaryLoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiaryLoadingView.swift; sourceTree = ""; }; 956C4D842E76F04A00E32F93 /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = ""; }; 956C4D882E76F0F400E32F93 /* DividerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DividerView.swift; sourceTree = ""; }; @@ -174,6 +176,7 @@ 2DBBCE824C7AA1459F0CEA0F /* Enum */ = { isa = PBXGroup; children = ( + 95256BFE2E82F7F800AC3FE1 /* SpellingCategoryColor.swift */, 75EF1CA00DA4B6E64F0CB1F0 /* CommonUIAssets.swift */, ); path = Enum; @@ -424,6 +427,7 @@ 21B9DB651F4D3F7DFB5CE055 /* LMTextField.swift in Sources */, E0865F2849CCB89CC83D3B77 /* Coordinator.swift in Sources */, E055AA66777B1D4CC8C884E4 /* CommonUIAssets.swift in Sources */, + 95256BFF2E82F7F900AC3FE1 /* SpellingCategoryColor.swift in Sources */, 956C4D852E76F05000E32F93 /* CalendarView.swift in Sources */, B9F3C0F9AA675E70FB8ED969 /* UIStackView+Extension.swift in Sources */, F151F3B566BCA8E16853B241 /* ChatAnalysisLoadingView.swift in Sources */, diff --git a/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue.colorset/Contents.json b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue01.colorset/Contents.json similarity index 76% rename from Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue.colorset/Contents.json rename to Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue01.colorset/Contents.json index 1651786..ad76e7f 100644 --- a/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue.colorset/Contents.json +++ b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue01.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xFF", - "green" : "0xEA", - "red" : "0xD9" + "blue" : "0xEA", + "green" : "0x77", + "red" : "0x1A" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xFF", - "green" : "0xEA", - "red" : "0xD9" + "blue" : "0xEA", + "green" : "0x77", + "red" : "0x1A" } }, "idiom" : "universal" diff --git a/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue02.colorset/Contents.json b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue02.colorset/Contents.json index ad76e7f..1651786 100644 --- a/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue02.colorset/Contents.json +++ b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMBlue02.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xEA", - "green" : "0x77", - "red" : "0x1A" + "blue" : "0xFF", + "green" : "0xEA", + "red" : "0xD9" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xEA", - "green" : "0x77", - "red" : "0x1A" + "blue" : "0xFF", + "green" : "0xEA", + "red" : "0xD9" } }, "idiom" : "universal" diff --git a/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMGreen01.colorset/Contents.json b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMGreen01.colorset/Contents.json new file mode 100644 index 0000000..32fbe01 --- /dev/null +++ b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMGreen01.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x3D", + "green" : "0xAA", + "red" : "0x1F" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x3D", + "green" : "0xAA", + "red" : "0x1F" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMGreen.colorset/Contents.json b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMGreen02.colorset/Contents.json similarity index 100% rename from Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMGreen.colorset/Contents.json rename to Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMGreen02.colorset/Contents.json diff --git a/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMOrange00.colorset/Contents.json b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMOrange00.colorset/Contents.json new file mode 100644 index 0000000..75f48d9 --- /dev/null +++ b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMOrange00.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x11", + "green" : "0x67", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x11", + "green" : "0x67", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMPink.colorset/Contents.json b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMPink.colorset/Contents.json new file mode 100644 index 0000000..37b6757 --- /dev/null +++ b/Projects/CommonUI/Sources/Assets/Colors.xcassets/LMPointColor/LMPink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB3", + "green" : "0x5B", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB3", + "green" : "0x5B", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/CommonUI/Sources/Enum/CommonUIAssets.swift b/Projects/CommonUI/Sources/Enum/CommonUIAssets.swift index c585db2..cdeae2c 100644 --- a/Projects/CommonUI/Sources/Enum/CommonUIAssets.swift +++ b/Projects/CommonUI/Sources/Enum/CommonUIAssets.swift @@ -60,6 +60,7 @@ public enum CommonUIAssets { public static let IconAdd = image(named: "add") /// color + public static let LMOrange0 = color(named: "LMOrange00") public static let LMOrange1 = color(named: "LMOrange01") public static let LMOrange3 = color(named: "LMOrange03") public static let LMOrange4 = color(named: "LMOrange04") @@ -70,11 +71,13 @@ public enum CommonUIAssets { public static let LMGray4 = color(named: "LMGray04") public static let LMGray5 = color(named: "LMGray05") public static let LMGray6 = color(named: "LMGray06") - public static let LMBlue = color(named: "LMBlue") + public static let LMBlue = color(named: "LMBlue01") public static let LMBlue2 = color(named: "LMBlue02") - public static let LMGreen = color(named: "LMGreen") + public static let LMGreen = color(named: "LMGreen01") + public static let LMGreen2 = color(named: "LMGreen02") public static let LMRed = color(named: "LMRed") public static let LMRed2 = color(named: "LMRed02") + public static let LMPink = color(named: "LMPink") } private func image(named name: String) -> UIImage? { diff --git a/Projects/CommonUI/Sources/Enum/SpellingCategoryColor.swift b/Projects/CommonUI/Sources/Enum/SpellingCategoryColor.swift new file mode 100644 index 0000000..879c40a --- /dev/null +++ b/Projects/CommonUI/Sources/Enum/SpellingCategoryColor.swift @@ -0,0 +1,49 @@ +// +// SpellingCategoryColor.swift +// CommonUI +// +// Created by 박지윤 on 9/24/25. +// + +import UIKit + +public enum SpellingCategoryColor { + case spelling // 맞춤법 - 주황색 + case spacing // 띄어쓰기 - 파란색 + case standard // 표준어 위반 - 녹색 + case other // 기타 - 분홍색 + + public var color: UIColor? { + switch self { + case .spelling: + return CommonUIAssets.LMOrange0 + case .spacing: + return CommonUIAssets.LMBlue + case .standard: + return CommonUIAssets.LMGreen + case .other: + return CommonUIAssets.LMPink + } + } + + public var lightColor: UIColor? { + return color?.withAlphaComponent(0.3) + } + + public var borderColor: UIColor? { + return color?.withAlphaComponent(0.5) + } + + public static func color(for category: String) -> SpellingCategoryColor { + switch category { + case "맞춤법": + return .spelling + case "띄어쓰기": + return .spacing + case "표준어 위반": + return .standard + default: + return .other + } + } +} diff --git a/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift b/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift index f27a100..98aad6a 100644 --- a/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift +++ b/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift @@ -330,8 +330,12 @@ open class DiaryDetailView: UIView { for revision in revisions { let range = (revisedContent as NSString).range(of: revision.revisedContent) if range.location != NSNotFound { - attributedString.addAttribute(.backgroundColor, - value: CommonUIAssets.LMOrange1?.withAlphaComponent(0.3) ?? UIColor.orange.withAlphaComponent(0.3), + let categoryColor = SpellingCategoryColor.color(for: revision.category) + attributedString.addAttribute(.foregroundColor, + value: categoryColor.color ?? .black, + range: range) + attributedString.addAttribute(.font, + value: UIFont.systemFont(ofSize: 16, weight: .medium), range: range) } } @@ -363,11 +367,12 @@ open class DiaryDetailView: UIView { private func createErrorView(_ revision: RevisionVO) -> UIView { let containerView = UIView() + let categoryColor = SpellingCategoryColor.color(for: revision.category) let originalBox = UIView().then { $0.backgroundColor = .clear $0.layer.borderWidth = 1 - $0.layer.borderColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.3).cgColor + $0.layer.borderColor = categoryColor.borderColor?.cgColor $0.layer.cornerRadius = 8 } @@ -380,12 +385,12 @@ open class DiaryDetailView: UIView { let arrowImageView = UIImageView().then { $0.image = UIImage(systemName: "arrow.right") - $0.tintColor = CommonUIAssets.LMOrange1 + $0.tintColor = categoryColor.color $0.contentMode = .scaleAspectFit } let revisedBox = UIView().then { - $0.backgroundColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.3) + $0.backgroundColor = categoryColor.lightColor $0.layer.cornerRadius = 8 } diff --git a/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift b/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift index 6581547..8814f50 100644 --- a/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift +++ b/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift @@ -406,8 +406,12 @@ open class DiaryResultView: UIView { for revision in revisions { let range = (revisedContent as NSString).range(of: revision.revisedContent) if range.location != NSNotFound { - attributedString.addAttribute(.backgroundColor, - value: CommonUIAssets.LMOrange1?.withAlphaComponent(0.3) ?? UIColor.orange.withAlphaComponent(0.3), + let categoryColor = SpellingCategoryColor.color(for: revision.category) + attributedString.addAttribute(.foregroundColor, + value: categoryColor.color ?? .black, + range: range) + attributedString.addAttribute(.font, + value: UIFont.systemFont(ofSize: 16, weight: .medium), range: range) } } @@ -439,11 +443,12 @@ open class DiaryResultView: UIView { private func createErrorView(_ revision: RevisionVO) -> UIView { let containerView = UIView() + let categoryColor = SpellingCategoryColor.color(for: revision.category) let originalBox = UIView().then { $0.backgroundColor = .clear $0.layer.borderWidth = 1 - $0.layer.borderColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.3).cgColor + $0.layer.borderColor = categoryColor.borderColor?.cgColor $0.layer.cornerRadius = 8 } @@ -456,12 +461,12 @@ open class DiaryResultView: UIView { let arrowImageView = UIImageView().then { $0.image = UIImage(systemName: "arrow.right") - $0.tintColor = CommonUIAssets.LMOrange1 + $0.tintColor = categoryColor.color $0.contentMode = .scaleAspectFit } let revisedBox = UIView().then { - $0.backgroundColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.3) + $0.backgroundColor = categoryColor.lightColor $0.layer.cornerRadius = 8 } diff --git a/Projects/CommonUI/Sources/View/Diary/DiaryTodayView.swift b/Projects/CommonUI/Sources/View/Diary/DiaryTodayView.swift index 4efb4e3..6883a1e 100644 --- a/Projects/CommonUI/Sources/View/Diary/DiaryTodayView.swift +++ b/Projects/CommonUI/Sources/View/Diary/DiaryTodayView.swift @@ -57,7 +57,6 @@ open class DiaryTodayView: UIView { public override init(frame: CGRect) { super.init(frame: frame) - print("initttt") configureSubviews() makeConstraints() } diff --git a/Projects/CommonUI/Sources/View/Home/AnswerView.swift b/Projects/CommonUI/Sources/View/Home/AnswerView.swift index 2f0f750..3f5243b 100644 --- a/Projects/CommonUI/Sources/View/Home/AnswerView.swift +++ b/Projects/CommonUI/Sources/View/Home/AnswerView.swift @@ -45,7 +45,7 @@ open class AnswerView: UIView { switch type { case .correct: correctView = correctView.then { - $0.backgroundColor = CommonUIAssets.LMGreen + $0.backgroundColor = CommonUIAssets.LMGreen2 $0.layer.cornerRadius = 12 } diff --git a/Projects/CommonUI/Sources/View/Home/QuizView.swift b/Projects/CommonUI/Sources/View/Home/QuizView.swift index 0b3bdf1..d3600bd 100644 --- a/Projects/CommonUI/Sources/View/Home/QuizView.swift +++ b/Projects/CommonUI/Sources/View/Home/QuizView.swift @@ -59,7 +59,7 @@ open class QuizView: UIView { } case .question: questionView = questionView.then { - $0.backgroundColor = CommonUIAssets.LMBlue + $0.backgroundColor = CommonUIAssets.LMBlue2 $0.layer.cornerRadius = 12 } From 6a341160db03488c82a479f22bcfe5b63e20ad24 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sun, 28 Sep 2025 19:54:13 +0900 Subject: [PATCH 16/17] =?UTF-8?q?[feat/diary]=20fix:=20DiaryResultView=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommonUI.xcodeproj/project.pbxproj | 4 - .../Sources/View/Diary/DiaryDetailView.swift | 140 +++-- .../Sources/View/Diary/DiaryLoadingView.swift | 13 +- .../Sources/View/Diary/DiaryResultView.swift | 528 ------------------ .../Sources/View/DiaryAddViewController.swift | 7 + .../View/DiaryDetailViewController.swift | 2 +- .../View/DiaryResultViewController.swift | 13 +- .../Sources/View/DiaryViewController.swift | 1 + 8 files changed, 111 insertions(+), 597 deletions(-) delete mode 100644 Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift diff --git a/Projects/CommonUI/CommonUI.xcodeproj/project.pbxproj b/Projects/CommonUI/CommonUI.xcodeproj/project.pbxproj index 744f918..1b05ba4 100644 --- a/Projects/CommonUI/CommonUI.xcodeproj/project.pbxproj +++ b/Projects/CommonUI/CommonUI.xcodeproj/project.pbxproj @@ -27,7 +27,6 @@ 736D1C5EB53FB204B030C397 /* DiaryAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179BF0E6EE3B59F510B8AF40 /* DiaryAddView.swift */; }; 7D319882A302F75CCE46A48C /* HomeQuizView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39A77FC9A0E2D7F62CA16E90 /* HomeQuizView.swift */; }; 7DC59B80630854028C7C80F4 /* TuistBundle+CommonUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94EF204F3CD6F86C6167C300 /* TuistBundle+CommonUI.swift */; }; - 7DD1D21C569B040F1AB7067B /* DiaryResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EEBE047F5F8EC16F0985204 /* DiaryResultView.swift */; }; 8E0E6BDEA9574116ECBD55E4 /* ChatAnalysisView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 963B9323B265D5683B336EF2 /* ChatAnalysisView.swift */; }; 95256BFF2E82F7F900AC3FE1 /* SpellingCategoryColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95256BFE2E82F7F800AC3FE1 /* SpellingCategoryColor.swift */; }; 9532C7A92E786B3C00B4BADE /* DiaryLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9532C7A82E786B3800B4BADE /* DiaryLoadingView.swift */; }; @@ -94,7 +93,6 @@ 75EF1CA00DA4B6E64F0CB1F0 /* CommonUIAssets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonUIAssets.swift; sourceTree = ""; }; 7CE59FBFD1AAA1B5E7B45FD5 /* HomeProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeProgressView.swift; sourceTree = ""; }; 7DE79D12719B54383633DF73 /* SignInView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInView.swift; sourceTree = ""; }; - 7EEBE047F5F8EC16F0985204 /* DiaryResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiaryResultView.swift; sourceTree = ""; }; 83D64639CB805B71A9CA6C17 /* ChatAnalysisLoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatAnalysisLoadingView.swift; sourceTree = ""; }; 9266801EFBA6178C5B70C641 /* MyPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageView.swift; sourceTree = ""; }; 94EF204F3CD6F86C6167C300 /* TuistBundle+CommonUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TuistBundle+CommonUI.swift"; sourceTree = ""; }; @@ -263,7 +261,6 @@ FDCDDE79ED900C96E8D0EC4A /* DiaryEditView.swift */, 9532C7A82E786B3800B4BADE /* DiaryLoadingView.swift */, 95EDE8D42E7E60C50091ED75 /* DiaryDetailView.swift */, - 7EEBE047F5F8EC16F0985204 /* DiaryResultView.swift */, ACC4F396C35AD4C9F54E4BF6 /* DiaryTodayView.swift */, ); path = Diary; @@ -439,7 +436,6 @@ 736D1C5EB53FB204B030C397 /* DiaryAddView.swift in Sources */, 9532C7A92E786B3C00B4BADE /* DiaryLoadingView.swift in Sources */, F8B8A383C8670A714B41F2EE /* DiaryEditView.swift in Sources */, - 7DD1D21C569B040F1AB7067B /* DiaryResultView.swift in Sources */, 95EDE8D52E7E60CA0091ED75 /* DiaryDetailView.swift in Sources */, 568C33E681D9B58B71273564 /* DiaryTodayView.swift in Sources */, 318A2464888400F05D38B7E5 /* DiaryView.swift in Sources */, diff --git a/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift b/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift index 98aad6a..920304b 100644 --- a/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift +++ b/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift @@ -12,7 +12,9 @@ import Domain import RxSwift open class DiaryDetailView: UIView { - + + private let isResult: Bool + // MARK: UI Components private let scrollView = UIScrollView().then { $0.showsVerticalScrollIndicator = true @@ -25,11 +27,11 @@ open class DiaryDetailView: UIView { $0.textColor = .black $0.font = UIFont.systemFont(ofSize: 20, weight: .semibold) } - + private let dateUnderlineView = UIView().then { $0.backgroundColor = CommonUIAssets.LMOrange1 } - + // 원형 점수 표시기 private let scoreContainerView = UIView() private let scoreCircleView = UIView().then { @@ -38,111 +40,132 @@ open class DiaryDetailView: UIView { $0.layer.borderColor = CommonUIAssets.LMOrange1?.cgColor $0.layer.cornerRadius = 60 } - + private let scoreProgressView = UIView().then { $0.backgroundColor = CommonUIAssets.LMOrange3 $0.layer.cornerRadius = 60 } - + private let scoreLabel = UILabel().then { $0.font = UIFont.systemFont(ofSize: 24, weight: .bold) $0.textColor = CommonUIAssets.LMBlack $0.textAlignment = .center } - + // 내가 쓴 일기 섹션 private let originalSectionTitleLabel = UILabel().then { $0.text = "내가 쓴 일기" $0.font = UIFont.systemFont(ofSize: 16, weight: .semibold) $0.textColor = CommonUIAssets.LMBlack } - + private let originalContentContainer = UIView().then { $0.backgroundColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.1) $0.layer.cornerRadius = 12 } - + private let originalContentLabel = UILabel().then { $0.font = UIFont.systemFont(ofSize: 16, weight: .regular) $0.textColor = CommonUIAssets.LMBlack $0.numberOfLines = 0 } - + // 화살표 private let arrowImageView = UIImageView().then { $0.image = UIImage(systemName: "arrow.down") $0.tintColor = CommonUIAssets.LMGray3 $0.contentMode = .scaleAspectFit } - + // 맞춤법 교정 결과 섹션 private let revisedSectionTitleLabel = UILabel().then { $0.text = "맞춤법 교정 결과" $0.font = UIFont.systemFont(ofSize: 16, weight: .semibold) $0.textColor = CommonUIAssets.LMBlack } - + private let revisedContentContainer = UIView().then { $0.backgroundColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.1) $0.layer.cornerRadius = 12 } - + private let revisedContentLabel = UILabel().then { $0.font = UIFont.systemFont(ofSize: 16, weight: .regular) $0.textColor = CommonUIAssets.LMBlack $0.numberOfLines = 0 } - + // 맞춤법 오류 섹션 private let errorSectionTitleLabel = UILabel().then { $0.font = UIFont.systemFont(ofSize: 16, weight: .semibold) $0.textColor = CommonUIAssets.LMBlack } - + private let errorStackView = UIStackView().then { $0.axis = .vertical $0.spacing = 12 $0.distribution = .fill } - + // AI 피드백 섹션 private let feedbackSectionTitleLabel = UILabel().then { $0.text = "AI 피드백" $0.font = UIFont.systemFont(ofSize: 16, weight: .semibold) $0.textColor = CommonUIAssets.LMBlack } - + private let feedbackContainer = UIView().then { $0.backgroundColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.1) $0.layer.cornerRadius = 12 } - + private let feedbackLabel = UILabel().then { $0.font = UIFont.systemFont(ofSize: 16, weight: .regular) $0.textColor = CommonUIAssets.LMBlack $0.numberOfLines = 0 } - + + private let nonScrollView = UIView().then { + $0.backgroundColor = CommonUIAssets.LMWhite + } + + private var confirmButton = LMButton(textColor: CommonUIAssets.LMBlack, + bgColor: CommonUIAssets.LMOrange1) + // MARK: Properties private var diaryData: DiaryVO? let disposeBag = DisposeBag() - + // MARK: Public Properties public var onSaveButtonTapped: (() -> Void)? - + public override init(frame: CGRect) { + self.isResult = false super.init(frame: frame) setupUI() bindEvents() } - + + public init(isResult: Bool) { + self.isResult = isResult + super.init(frame: .zero) + setupUI() + bindEvents() + } + required public init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + // MARK: Setup private func setupUI() { backgroundColor = CommonUIAssets.LMWhite + confirmButton.setTitle("일기 저장하기", for: .normal) + + if isResult { + addSubview(nonScrollView) + nonScrollView.addSubview(confirmButton) + } addSubview(scrollView) scrollView.addSubview(contentView) @@ -151,122 +174,139 @@ open class DiaryDetailView: UIView { scoreContainerView.addSubview(scoreCircleView) scoreContainerView.addSubview(scoreProgressView) scoreContainerView.addSubview(scoreLabel) - + // 원문 컨테이너 설정 originalContentContainer.addSubview(originalContentLabel) - + // 수정문 컨테이너 설정 revisedContentContainer.addSubview(revisedContentLabel) - + // 피드백 컨테이너 설정 feedbackContainer.addSubview(feedbackLabel) - + [dateLabel, dateUnderlineView, scoreContainerView, originalSectionTitleLabel, originalContentContainer, arrowImageView, revisedSectionTitleLabel, revisedContentContainer, errorSectionTitleLabel, errorStackView, feedbackSectionTitleLabel, feedbackContainer] .forEach { contentView.addSubview($0) } - + setupConstraints() } - + private func bindEvents() { } - + private func setupConstraints() { - scrollView.snp.makeConstraints { - $0.edges.equalToSuperview() + if (isResult) { + scrollView.snp.makeConstraints { + $0.top.width.equalToSuperview() + $0.bottom.equalToSuperview().inset(100) + } + + nonScrollView.snp.makeConstraints { + $0.top.equalTo(scrollView.snp.bottom) + $0.width.bottom.equalToSuperview() + } + + confirmButton.snp.makeConstraints { + $0.width.equalToSuperview().inset(20) + $0.center.equalToSuperview() + } + } else { + scrollView.snp.makeConstraints { + $0.edges.equalToSuperview() + } } - + contentView.snp.makeConstraints { $0.edges.equalToSuperview() $0.width.equalToSuperview() } - + dateLabel.snp.makeConstraints { $0.top.equalToSuperview().inset(20) $0.leading.equalToSuperview().inset(20) } - + dateUnderlineView.snp.makeConstraints { $0.top.equalTo(dateLabel.snp.bottom) $0.centerX.width.equalTo(dateLabel) $0.height.equalTo(3) } - + scoreContainerView.snp.makeConstraints { $0.top.equalTo(dateUnderlineView.snp.bottom).offset(30) $0.centerX.equalToSuperview() $0.width.height.equalTo(120) } - + scoreCircleView.snp.makeConstraints { $0.edges.equalToSuperview() } - + scoreProgressView.snp.makeConstraints { $0.edges.equalToSuperview() } - + scoreLabel.snp.makeConstraints { $0.center.equalToSuperview() } - + // 내가 쓴 일기 섹션 originalSectionTitleLabel.snp.makeConstraints { $0.top.equalTo(scoreContainerView.snp.bottom).offset(30) $0.leading.trailing.equalToSuperview().inset(20) } - + originalContentContainer.snp.makeConstraints { $0.top.equalTo(originalSectionTitleLabel.snp.bottom).offset(12) $0.leading.trailing.equalToSuperview().inset(20) } - + originalContentLabel.snp.makeConstraints { $0.edges.equalToSuperview().inset(16) } - + // 화살표 arrowImageView.snp.makeConstraints { $0.top.equalTo(originalContentContainer.snp.bottom).offset(16) $0.centerX.equalToSuperview() $0.width.height.equalTo(20) } - + // 맞춤법 교정 결과 섹션 revisedSectionTitleLabel.snp.makeConstraints { $0.top.equalTo(arrowImageView.snp.bottom).offset(16) $0.leading.trailing.equalToSuperview().inset(20) } - + revisedContentContainer.snp.makeConstraints { $0.top.equalTo(revisedSectionTitleLabel.snp.bottom).offset(12) $0.leading.trailing.equalToSuperview().inset(20) } - + revisedContentLabel.snp.makeConstraints { $0.edges.equalToSuperview().inset(16) } - + // 맞춤법 오류 섹션 errorSectionTitleLabel.snp.makeConstraints { $0.top.equalTo(revisedContentContainer.snp.bottom).offset(20) $0.leading.trailing.equalToSuperview().inset(20) } - + errorStackView.snp.makeConstraints { $0.top.equalTo(errorSectionTitleLabel.snp.bottom).offset(12) $0.leading.trailing.equalToSuperview().inset(20) } - + // AI 피드백 섹션 feedbackSectionTitleLabel.snp.makeConstraints { $0.top.equalTo(errorStackView.snp.bottom).offset(20) $0.leading.trailing.equalToSuperview().inset(20) } - + feedbackContainer.snp.makeConstraints { $0.top.equalTo(feedbackSectionTitleLabel.snp.bottom).offset(12) $0.leading.trailing.equalToSuperview().inset(20) @@ -277,7 +317,7 @@ open class DiaryDetailView: UIView { $0.edges.equalToSuperview().inset(16) } } - + // MARK: Public Methods public func configure(with diary: DiaryVO) { self.diaryData = diary diff --git a/Projects/CommonUI/Sources/View/Diary/DiaryLoadingView.swift b/Projects/CommonUI/Sources/View/Diary/DiaryLoadingView.swift index 1b05880..d3c3288 100644 --- a/Projects/CommonUI/Sources/View/Diary/DiaryLoadingView.swift +++ b/Projects/CommonUI/Sources/View/Diary/DiaryLoadingView.swift @@ -23,10 +23,19 @@ open class DiaryLoadingView: UIView { } private let subLabel = UILabel().then { - $0.text = "잠시만 기다려 주세요" + $0.text = "최대 15초 소요될 수 있습니다\n잠시만 기다려 주세요" $0.textColor = CommonUIAssets.LMGray3 $0.font = UIFont.systemFont(ofSize: 14, weight: .regular) $0.textAlignment = .center + $0.numberOfLines = 2 + + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 4 + paragraphStyle.alignment = .center + $0.attributedText = NSAttributedString( + string: $0.text ?? "", + attributes: [.paragraphStyle: paragraphStyle] + ) } public override init(frame: CGRect) { @@ -55,7 +64,7 @@ open class DiaryLoadingView: UIView { subLabel.snp.makeConstraints { $0.centerX.equalToSuperview() - $0.top.equalTo(mainLabel.snp.bottom).offset(8) + $0.top.equalTo(mainLabel.snp.bottom).offset(10) } } } diff --git a/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift b/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift deleted file mode 100644 index 8814f50..0000000 --- a/Projects/CommonUI/Sources/View/Diary/DiaryResultView.swift +++ /dev/null @@ -1,528 +0,0 @@ -// -// DiaryResultView.swift -// CommonUI -// -// Created by 박지윤 on 1/7/25. -// - -import UIKit -import SnapKit -import Then -import Domain -import RxSwift - -open class DiaryResultView: UIView { - - // MARK: UI Components - private let scrollView = UIScrollView().then { - $0.showsVerticalScrollIndicator = true - $0.showsHorizontalScrollIndicator = true - } - - private let contentView = UIView() - - private(set) var dateLabel = UILabel().then { - $0.text = Date().getToday() - $0.textColor = .black - $0.font = UIFont.systemFont(ofSize: 20, weight: .semibold) - } - - private let dateUnderlineView = UIView().then { - $0.backgroundColor = CommonUIAssets.LMOrange1 - } - - // 원형 점수 표시기 - private let scoreContainerView = UIView() - private let scoreCircleView = UIView().then { - $0.backgroundColor = .yellow - $0.layer.borderWidth = 8 - $0.layer.borderColor = CommonUIAssets.LMOrange1?.cgColor - $0.layer.cornerRadius = 60 - } - - private let scoreProgressView = UIView().then { - $0.backgroundColor = CommonUIAssets.LMOrange3 - $0.layer.cornerRadius = 60 - } - - private let scoreLabel = UILabel().then { - $0.font = UIFont.systemFont(ofSize: 24, weight: .bold) - $0.textColor = CommonUIAssets.LMBlack - $0.textAlignment = .center - } - - // 내가 쓴 일기 섹션 - private let originalSectionTitleLabel = UILabel().then { - $0.text = "내가 쓴 일기" - $0.font = UIFont.systemFont(ofSize: 16, weight: .semibold) - $0.textColor = CommonUIAssets.LMBlack - } - - private let originalContentContainer = UIView().then { - $0.backgroundColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.1) - $0.layer.cornerRadius = 12 - } - - private let originalContentLabel = UILabel().then { - $0.font = UIFont.systemFont(ofSize: 16, weight: .regular) - $0.textColor = CommonUIAssets.LMBlack - $0.numberOfLines = 0 - } - - // 화살표 - private let arrowImageView = UIImageView().then { - $0.image = UIImage(systemName: "arrow.down") - $0.tintColor = CommonUIAssets.LMGray3 - $0.contentMode = .scaleAspectFit - } - - // 맞춤법 교정 결과 섹션 - private let revisedSectionTitleLabel = UILabel().then { - $0.text = "맞춤법 교정 결과" - $0.font = UIFont.systemFont(ofSize: 16, weight: .semibold) - $0.textColor = CommonUIAssets.LMBlack - } - - private let revisedContentContainer = UIView().then { - $0.backgroundColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.1) - $0.layer.cornerRadius = 12 - } - - private let revisedContentLabel = UILabel().then { - $0.font = UIFont.systemFont(ofSize: 16, weight: .regular) - $0.textColor = CommonUIAssets.LMBlack - $0.numberOfLines = 0 - } - - // 맞춤법 오류 섹션 - private let errorSectionTitleLabel = UILabel().then { - $0.font = UIFont.systemFont(ofSize: 16, weight: .semibold) - $0.textColor = CommonUIAssets.LMBlack - } - - private let errorStackView = UIStackView().then { - $0.axis = .vertical - $0.spacing = 12 - $0.distribution = .fill - } - - // AI 피드백 섹션 - private let feedbackSectionTitleLabel = UILabel().then { - $0.text = "AI 피드백" - $0.font = UIFont.systemFont(ofSize: 16, weight: .semibold) - $0.textColor = CommonUIAssets.LMBlack - } - - private let feedbackContainer = UIView().then { - $0.backgroundColor = CommonUIAssets.LMOrange1?.withAlphaComponent(0.1) - $0.layer.cornerRadius = 12 - } - - private let feedbackLabel = UILabel().then { - $0.font = UIFont.systemFont(ofSize: 16, weight: .regular) - $0.textColor = CommonUIAssets.LMBlack - $0.numberOfLines = 0 - } - - private var confirmButton = LMButton(textColor: CommonUIAssets.LMBlack, - bgColor: CommonUIAssets.LMOrange1) - - // MARK: Properties - private var diaryData: DiaryVO? - private var isButtonVisible: Bool = true - let disposeBag = DisposeBag() - - // MARK: Public Properties - public var onSaveButtonTapped: (() -> Void)? - - public override init(frame: CGRect) { - super.init(frame: frame) - setupUI() - bindEvents() - } - - public convenience init(frame: CGRect, showButton: Bool) { - self.init(frame: frame) - self.isButtonVisible = showButton - updateButtonVisibility() - } - - required public init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: Setup - private func setupUI() { - backgroundColor = CommonUIAssets.LMWhite - - // 버튼 설정 - confirmButton = confirmButton.then { - $0.setTitle("일기 저장하기", for: .normal) - $0.layer.cornerRadius = 12 - } - - addSubview(scrollView) - if isButtonVisible { - addSubview(confirmButton) - } - scrollView.addSubview(contentView) - - // 원형 점수 표시기 설정 - scoreContainerView.addSubview(scoreCircleView) - scoreContainerView.addSubview(scoreProgressView) - scoreContainerView.addSubview(scoreLabel) - - // 원문 컨테이너 설정 - originalContentContainer.addSubview(originalContentLabel) - - // 수정문 컨테이너 설정 - revisedContentContainer.addSubview(revisedContentLabel) - - // 피드백 컨테이너 설정 - feedbackContainer.addSubview(feedbackLabel) - - [dateLabel, dateUnderlineView, scoreContainerView, - originalSectionTitleLabel, originalContentContainer, - arrowImageView, revisedSectionTitleLabel, revisedContentContainer, - errorSectionTitleLabel, errorStackView, - feedbackSectionTitleLabel, feedbackContainer] - .forEach { contentView.addSubview($0) } - - setupConstraints() - } - - private func bindEvents() { - confirmButton.rx.tap - .subscribe(onNext: { [weak self] in - print("🔄 DiaryResultView: confirmButton 탭됨") - self?.onSaveButtonTapped?() - }) - .disposed(by: disposeBag) - } - - private func setupConstraints() { - if isButtonVisible { - scrollView.snp.makeConstraints { - $0.top.leading.trailing.equalToSuperview() - $0.bottom.equalTo(confirmButton.snp.top).offset(-20) - } - - contentView.snp.makeConstraints { - $0.top.leading.trailing.bottom.equalToSuperview() - $0.width.equalToSuperview() - } - - confirmButton.snp.makeConstraints { - $0.leading.trailing.equalToSuperview().inset(20) - $0.bottom.equalTo(safeAreaLayoutGuide).offset(-20) - } - } else { - scrollView.snp.makeConstraints { - $0.edges.equalToSuperview() - } - - contentView.snp.makeConstraints { - $0.top.leading.trailing.equalToSuperview() - $0.bottom.greaterThanOrEqualToSuperview() - $0.width.equalToSuperview() - } - } - - dateLabel.snp.makeConstraints { - $0.top.equalTo(safeAreaLayoutGuide).inset(20) - $0.leading.equalToSuperview().inset(20) - } - - dateUnderlineView.snp.makeConstraints { - $0.top.equalTo(dateLabel.snp.bottom) - $0.centerX.width.equalTo(dateLabel) - $0.height.equalTo(3) - } - - scoreContainerView.snp.makeConstraints { - $0.top.equalTo(dateUnderlineView.snp.bottom).offset(30) - $0.centerX.equalToSuperview() - $0.width.height.equalTo(120) - } - - scoreCircleView.snp.makeConstraints { - $0.edges.equalToSuperview() - } - - scoreProgressView.snp.makeConstraints { - $0.edges.equalToSuperview() - } - - scoreLabel.snp.makeConstraints { - $0.center.equalToSuperview() - } - - // 내가 쓴 일기 섹션 - originalSectionTitleLabel.snp.makeConstraints { - $0.top.equalTo(scoreContainerView.snp.bottom).offset(30) - $0.leading.trailing.equalToSuperview().inset(20) - } - - originalContentContainer.snp.makeConstraints { - $0.top.equalTo(originalSectionTitleLabel.snp.bottom).offset(12) - $0.leading.trailing.equalToSuperview().inset(20) - } - - originalContentLabel.snp.makeConstraints { - $0.edges.equalToSuperview().inset(16) - } - - // 화살표 - arrowImageView.snp.makeConstraints { - $0.top.equalTo(originalContentContainer.snp.bottom).offset(16) - $0.centerX.equalToSuperview() - $0.width.height.equalTo(20) - } - - // 맞춤법 교정 결과 섹션 - revisedSectionTitleLabel.snp.makeConstraints { - $0.top.equalTo(arrowImageView.snp.bottom).offset(16) - $0.leading.trailing.equalToSuperview().inset(20) - } - - revisedContentContainer.snp.makeConstraints { - $0.top.equalTo(revisedSectionTitleLabel.snp.bottom).offset(12) - $0.leading.trailing.equalToSuperview().inset(20) - } - - revisedContentLabel.snp.makeConstraints { - $0.edges.equalToSuperview().inset(16) - } - - // 맞춤법 오류 섹션 - errorSectionTitleLabel.snp.makeConstraints { - $0.top.equalTo(revisedContentContainer.snp.bottom).offset(20) - $0.leading.trailing.equalToSuperview().inset(20) - } - - errorStackView.snp.makeConstraints { - $0.top.equalTo(errorSectionTitleLabel.snp.bottom).offset(12) - $0.leading.trailing.equalToSuperview().inset(20) - } - - // AI 피드백 섹션 - feedbackSectionTitleLabel.snp.makeConstraints { - $0.top.equalTo(errorStackView.snp.bottom).offset(20) - $0.leading.trailing.equalToSuperview().inset(20) - } - - feedbackContainer.snp.makeConstraints { - $0.top.equalTo(feedbackSectionTitleLabel.snp.bottom).offset(12) - $0.leading.trailing.equalToSuperview().inset(20) - $0.bottom.equalToSuperview().inset(20) - } - - feedbackLabel.snp.makeConstraints { - $0.edges.equalToSuperview().inset(16) - } - } - - // MARK: Public Methods - public func configure(with diary: DiaryVO) { - self.diaryData = diary - - // 날짜 설정 - dateLabel.text = diary.createdAt - - // 원문 설정 - originalContentLabel.text = diary.originContent - - // 수정문 설정 (하이라이트 포함) - setupRevisedContent(diary.spellingDto.revisedContent, revisions: diary.spellingDto.revisions) - - // 점수 설정 - scoreLabel.text = "\(diary.spellingDto.score)점" - setupScoreProgress(score: diary.spellingDto.score) - - // 오류 섹션 설정 - setupErrorSection(revisions: diary.spellingDto.revisions) - - // 피드백 설정 - feedbackLabel.text = diary.feedback - } - - public func setButtonVisibility(_ isVisible: Bool) { - self.isButtonVisible = isVisible - updateButtonVisibility() - } - - private func updateButtonVisibility() { - if isButtonVisible { - if confirmButton.superview == nil { - addSubview(confirmButton) - confirmButton.snp.makeConstraints { - $0.leading.trailing.equalToSuperview().inset(20) - $0.bottom.equalTo(safeAreaLayoutGuide).offset(-20) - } - } - confirmButton.isHidden = false - - // 스크롤뷰 제약조건 업데이트 - scrollView.snp.remakeConstraints { - $0.top.leading.trailing.equalToSuperview() - $0.bottom.equalTo(confirmButton.snp.top).offset(-20) - } - } else { - confirmButton.isHidden = true - confirmButton.removeFromSuperview() - - // 스크롤뷰 제약조건 업데이트 - scrollView.snp.remakeConstraints { - $0.edges.equalToSuperview() - } - } - } - - private func setupScoreProgress(score: Int) { - let progress = CGFloat(score) / 100.0 - let angle = progress * 2 * .pi - .pi / 2 // -90도부터 시작 - - // 원형 프로그레스 애니메이션 - let path = UIBezierPath(arcCenter: CGPoint(x: 60, y: 60), - radius: 52, - startAngle: -.pi / 2, - endAngle: angle, - clockwise: true) - - let shapeLayer = CAShapeLayer() - shapeLayer.path = path.cgPath - shapeLayer.fillColor = UIColor.clear.cgColor - shapeLayer.strokeColor = CommonUIAssets.LMOrange1?.cgColor - shapeLayer.lineWidth = 8 - shapeLayer.lineCap = .round - - scoreProgressView.layer.sublayers?.removeAll() - scoreProgressView.layer.addSublayer(shapeLayer) - } - - private func setupRevisedContent(_ revisedContent: String, revisions: [RevisionVO]) { - let attributedString = NSMutableAttributedString(string: revisedContent) - - for revision in revisions { - let range = (revisedContent as NSString).range(of: revision.revisedContent) - if range.location != NSNotFound { - let categoryColor = SpellingCategoryColor.color(for: revision.category) - attributedString.addAttribute(.foregroundColor, - value: categoryColor.color ?? .black, - range: range) - attributedString.addAttribute(.font, - value: UIFont.systemFont(ofSize: 16, weight: .medium), - range: range) - } - } - - revisedContentLabel.attributedText = attributedString - } - - private func setupErrorSection(revisions: [RevisionVO]) { - errorStackView.arrangedSubviews.forEach { $0.removeFromSuperview() } - - if revisions.isEmpty { - errorSectionTitleLabel.text = "맞춤법 오류 0개" - let noErrorsLabel = UILabel().then { - $0.text = "완벽한 문장이에요! 🎉" - $0.font = UIFont.systemFont(ofSize: 16, weight: .medium) - $0.textColor = CommonUIAssets.LMOrange1 - $0.textAlignment = .center - } - errorStackView.addArrangedSubview(noErrorsLabel) - } else { - errorSectionTitleLabel.text = "맞춤법 오류 \(revisions.count)개" - - for revision in revisions { - let errorView = createErrorView(revision) - errorStackView.addArrangedSubview(errorView) - } - } - } - - private func createErrorView(_ revision: RevisionVO) -> UIView { - let containerView = UIView() - let categoryColor = SpellingCategoryColor.color(for: revision.category) - - let originalBox = UIView().then { - $0.backgroundColor = .clear - $0.layer.borderWidth = 1 - $0.layer.borderColor = categoryColor.borderColor?.cgColor - $0.layer.cornerRadius = 8 - } - - let originalLabel = UILabel().then { - $0.text = revision.originContent - $0.font = UIFont.systemFont(ofSize: 14, weight: .medium) - $0.textColor = CommonUIAssets.LMBlack - $0.textAlignment = .center - } - - let arrowImageView = UIImageView().then { - $0.image = UIImage(systemName: "arrow.right") - $0.tintColor = categoryColor.color - $0.contentMode = .scaleAspectFit - } - - let revisedBox = UIView().then { - $0.backgroundColor = categoryColor.lightColor - $0.layer.cornerRadius = 8 - } - - let revisedLabel = UILabel().then { - $0.text = revision.revisedContent - $0.font = UIFont.systemFont(ofSize: 14, weight: .medium) - $0.textColor = CommonUIAssets.LMBlack - $0.textAlignment = .center - } - - [originalBox, originalLabel, arrowImageView, revisedBox, revisedLabel] - .forEach { containerView.addSubview($0) } - - originalBox.snp.makeConstraints { - $0.leading.equalToSuperview() - $0.centerY.equalToSuperview() - $0.height.equalTo(32) - } - - originalLabel.snp.makeConstraints { - $0.edges.equalTo(originalBox).inset(8) - } - - // originalBox의 너비를 originalLabel의 내용에 따라 동적으로 설정 - originalBox.snp.makeConstraints { - $0.width.greaterThanOrEqualTo(60) // 최소 너비 - $0.width.lessThanOrEqualTo(120) // 최대 너비 - } - - arrowImageView.snp.makeConstraints { - $0.leading.equalTo(originalBox.snp.trailing).offset(8) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(16) - } - - revisedBox.snp.makeConstraints { - $0.leading.equalTo(arrowImageView.snp.trailing).offset(8) - $0.centerY.equalToSuperview() - $0.height.equalTo(32) - } - - revisedLabel.snp.makeConstraints { - $0.edges.equalTo(revisedBox).inset(8) - } - - // revisedBox의 너비를 revisedLabel의 내용에 따라 동적으로 설정 - revisedBox.snp.makeConstraints { - $0.width.greaterThanOrEqualTo(60) // 최소 너비 - $0.width.lessThanOrEqualTo(120) // 최대 너비 - } - - containerView.snp.makeConstraints { - $0.height.equalTo(32) - } - - return containerView - } - -} diff --git a/Projects/Diary/Sources/View/DiaryAddViewController.swift b/Projects/Diary/Sources/View/DiaryAddViewController.swift index 3122676..7ce4832 100644 --- a/Projects/Diary/Sources/View/DiaryAddViewController.swift +++ b/Projects/Diary/Sources/View/DiaryAddViewController.swift @@ -31,6 +31,12 @@ public class DiaryAddViewController: BaseViewController { public override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: false) + self.tabBarController?.tabBar.isHidden = true + } + + public override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + self.tabBarController?.tabBar.isHidden = false } public override func viewDidLoad() { @@ -131,6 +137,7 @@ public class DiaryAddViewController: BaseViewController { print("📊 분석 결과 화면으로 이동") let diaryResultViewController = DiaryResultViewController(diaryViewModel: viewModel, diaryData: diaryData) + diaryResultViewController.hidesBottomBarWhenPushed = true navigationController?.pushViewController(diaryResultViewController, animated: true) } diff --git a/Projects/Diary/Sources/View/DiaryDetailViewController.swift b/Projects/Diary/Sources/View/DiaryDetailViewController.swift index 623759b..00a8a66 100644 --- a/Projects/Diary/Sources/View/DiaryDetailViewController.swift +++ b/Projects/Diary/Sources/View/DiaryDetailViewController.swift @@ -10,7 +10,7 @@ import CommonUI import Domain public class DiaryDetailViewController: BaseViewController { - let diaryDetailView = DiaryDetailView() + let diaryDetailView = DiaryDetailView(isResult: false) let viewModel: DiaryViewModel let navigationBar = DefaultNavigationBar(leftImage: CommonUIAssets.IconBack ?? nil, diff --git a/Projects/Diary/Sources/View/DiaryResultViewController.swift b/Projects/Diary/Sources/View/DiaryResultViewController.swift index 01462c4..74aced2 100644 --- a/Projects/Diary/Sources/View/DiaryResultViewController.swift +++ b/Projects/Diary/Sources/View/DiaryResultViewController.swift @@ -10,7 +10,7 @@ import CommonUI import Domain public class DiaryResultViewController: BaseViewController { - let diaryResultView = DiaryResultView() + let diaryResultView = DiaryDetailView() let viewModel: DiaryViewModel let navigationBar = DefaultNavigationBar(leftImage: nil, @@ -66,9 +66,7 @@ public class DiaryResultViewController: BaseViewController { } public func setupActions() { - // 기존 타겟들을 모두 제거 navigationBar.rightButton.removeTarget(navigationBar, action: nil, for: .touchUpInside) - // 새로운 타겟 추가 navigationBar.rightButton.addTarget(self, action: #selector(handleRightButtonTapped), for: .touchUpInside) } @@ -92,18 +90,10 @@ public class DiaryResultViewController: BaseViewController { private func deleteDiaryAndExit() { viewModel.deleteDiaryDetail(diaryId: diaryData.diaryId) - // 모달 닫기 dismiss(animated: true) } private func bindEvents() { - // leftButton이 nil이므로 이벤트 바인딩 제거 - // navigationBar.leftButton.rx.tap - // .subscribe(onNext: { [weak self] in - // self?.navigationController?.popViewController(animated: true) - // }) - // .disposed(by: disposeBag) - diaryResultView.onSaveButtonTapped = { [weak self] in self?.handleSaveDiary() } @@ -113,7 +103,6 @@ public class DiaryResultViewController: BaseViewController { print("🔄 handleSaveDiary 호출됨") print("🔄 navigationController: \(String(describing: navigationController))") - // root view인 DiaryViewController로 이동 self.navigationController?.popToRootViewController(animated: true) } diff --git a/Projects/Diary/Sources/View/DiaryViewController.swift b/Projects/Diary/Sources/View/DiaryViewController.swift index f828f5e..cb4b79a 100644 --- a/Projects/Diary/Sources/View/DiaryViewController.swift +++ b/Projects/Diary/Sources/View/DiaryViewController.swift @@ -162,6 +162,7 @@ public class DiaryViewController: BaseViewController { private func presentNewDiaryView() { let diaryAddViewController = DiaryAddViewController(diaryViewModel: viewModel) + diaryAddViewController.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(diaryAddViewController, animated: true) } From 19a8025b3ec8aaf42c2fd766c5505d133e6d9b15 Mon Sep 17 00:00:00 2001 From: Bibi-urssu Date: Sun, 5 Oct 2025 18:34:03 +0900 Subject: [PATCH 17/17] =?UTF-8?q?[feat]=20fix:=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/View/Chat/ChatAnalysisView.swift | 4 ++-- .../Sources/View/Chat/ChatDetailView.swift | 2 +- .../CommonUI/Sources/View/Chat/ChatView.swift | 4 ++-- .../Sources/View/Diary/DiaryDetailView.swift | 6 +++++- .../Sources/View/DiaryAddViewController.swift | 2 -- .../View/DiaryResultViewController.swift | 19 ++++++++++++++----- 6 files changed, 24 insertions(+), 13 deletions(-) diff --git a/Projects/CommonUI/Sources/View/Chat/ChatAnalysisView.swift b/Projects/CommonUI/Sources/View/Chat/ChatAnalysisView.swift index 9409bbd..0b62436 100644 --- a/Projects/CommonUI/Sources/View/Chat/ChatAnalysisView.swift +++ b/Projects/CommonUI/Sources/View/Chat/ChatAnalysisView.swift @@ -82,7 +82,7 @@ open class ChatAnalysisView: UIView { nonScrollView.snp.makeConstraints { $0.width.equalToSuperview() - $0.bottom.equalTo(self.safeAreaLayoutGuide).offset(-20) + $0.bottom.equalTo(self.safeAreaLayoutGuide).offset(-10) $0.height.equalTo(75) } @@ -147,7 +147,7 @@ open class ChatAnalysisView: UIView { let bubbleView = UIView().then { $0.layer.cornerRadius = 16 - $0.backgroundColor = author == "HUMAN" ? CommonUIAssets.LMBlue2 : UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0) + $0.backgroundColor = author == "HUMAN" ? CommonUIAssets.LMBlue : UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0) } let messageLabel = UILabel().then { diff --git a/Projects/CommonUI/Sources/View/Chat/ChatDetailView.swift b/Projects/CommonUI/Sources/View/Chat/ChatDetailView.swift index feebeae..4b898dc 100644 --- a/Projects/CommonUI/Sources/View/Chat/ChatDetailView.swift +++ b/Projects/CommonUI/Sources/View/Chat/ChatDetailView.swift @@ -93,7 +93,7 @@ open class ChatDetailView: UIView { // 말풍선 배경 let bubbleView = UIView().then { - $0.backgroundColor = chat.author == 0 ? UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0) : CommonUIAssets.LMBlue2 + $0.backgroundColor = chat.author == 0 ? UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0) : CommonUIAssets.LMBlue $0.layer.cornerRadius = 16 } diff --git a/Projects/CommonUI/Sources/View/Chat/ChatView.swift b/Projects/CommonUI/Sources/View/Chat/ChatView.swift index abdceec..aafc748 100644 --- a/Projects/CommonUI/Sources/View/Chat/ChatView.swift +++ b/Projects/CommonUI/Sources/View/Chat/ChatView.swift @@ -105,7 +105,7 @@ open class ChatView: UIView { public let sendButton = UIButton().then { $0.setImage(CommonUIAssets.IconSend, for: .normal) - $0.backgroundColor = CommonUIAssets.LMBlue2 + $0.backgroundColor = CommonUIAssets.LMBlue $0.layer.cornerRadius = 22 $0.isEnabled = false } @@ -273,7 +273,7 @@ open class ChatView: UIView { let bubbleView = UIView().then { $0.layer.cornerRadius = 16 - $0.backgroundColor = message.author == "HUMAN" ? CommonUIAssets.LMBlue2 : UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0) + $0.backgroundColor = message.author == "HUMAN" ? CommonUIAssets.LMBlue : UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0) } let messageLabel = UILabel().then { diff --git a/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift b/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift index 920304b..209aa8a 100644 --- a/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift +++ b/Projects/CommonUI/Sources/View/Diary/DiaryDetailView.swift @@ -10,6 +10,7 @@ import SnapKit import Then import Domain import RxSwift +import RxRelay open class DiaryDetailView: UIView { @@ -137,7 +138,7 @@ open class DiaryDetailView: UIView { let disposeBag = DisposeBag() // MARK: Public Properties - public var onSaveButtonTapped: (() -> Void)? + public var onSaveButtonTapped = PublishRelay() public override init(frame: CGRect) { self.isResult = false @@ -195,6 +196,9 @@ open class DiaryDetailView: UIView { } private func bindEvents() { + confirmButton.rx.tap + .bind(to: onSaveButtonTapped) + .disposed(by: disposeBag) } private func setupConstraints() { diff --git a/Projects/Diary/Sources/View/DiaryAddViewController.swift b/Projects/Diary/Sources/View/DiaryAddViewController.swift index 7ce4832..f1be2fe 100644 --- a/Projects/Diary/Sources/View/DiaryAddViewController.swift +++ b/Projects/Diary/Sources/View/DiaryAddViewController.swift @@ -137,8 +137,6 @@ public class DiaryAddViewController: BaseViewController { print("📊 분석 결과 화면으로 이동") let diaryResultViewController = DiaryResultViewController(diaryViewModel: viewModel, diaryData: diaryData) - diaryResultViewController.hidesBottomBarWhenPushed = true - navigationController?.pushViewController(diaryResultViewController, animated: true) } diff --git a/Projects/Diary/Sources/View/DiaryResultViewController.swift b/Projects/Diary/Sources/View/DiaryResultViewController.swift index 74aced2..b6ef14a 100644 --- a/Projects/Diary/Sources/View/DiaryResultViewController.swift +++ b/Projects/Diary/Sources/View/DiaryResultViewController.swift @@ -10,7 +10,7 @@ import CommonUI import Domain public class DiaryResultViewController: BaseViewController { - let diaryResultView = DiaryDetailView() + let diaryResultView = DiaryDetailView(isResult: true) let viewModel: DiaryViewModel let navigationBar = DefaultNavigationBar(leftImage: nil, @@ -29,6 +29,16 @@ public class DiaryResultViewController: BaseViewController { fatalError("init(coder:) has not been implemented") } + public override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.tabBarController?.tabBar.isHidden = true + } + + public override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + self.tabBarController?.tabBar.isHidden = false + } + public override func viewDidLoad() { super.viewDidLoad() setupViewProperty() @@ -89,14 +99,13 @@ public class DiaryResultViewController: BaseViewController { private func deleteDiaryAndExit() { viewModel.deleteDiaryDetail(diaryId: diaryData.diaryId) - - dismiss(animated: true) + self.navigationController?.popToRootViewController(animated: true) } private func bindEvents() { - diaryResultView.onSaveButtonTapped = { [weak self] in + diaryResultView.onSaveButtonTapped.subscribe(onNext: { [weak self] in self?.handleSaveDiary() - } + }).disposed(by: disposeBag) } private func handleSaveDiary() {