From 9ad25a11399cd533a51af2e14b317f739ff075fd Mon Sep 17 00:00:00 2001 From: g_mi <62610032+akrudal@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:07:42 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20Home=EC=97=90=EC=84=9C=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=ED=95=9C=20=EC=9D=B4=EC=8A=88=EB=93=A4=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=ED=95=B4=EC=9A=94.=20(#679)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: navigator input family link(#668) * fix: home issues(#668) * rename files(#668) * rename propertieis(#668) --- .../DIContainer/AppDIContainer.swift | 28 ++++++++++--- .../DIContainer/NavigatorDIContainer.swift | 8 +++- .../Navigator/InputFamilyLinkNavigator.swift | 38 +++++++++++++++++ .../Application/Navigator/MainNavigator.swift | 10 ++++- .../FamilyEntranceControllerWrapper.swift | 0 ...InputFamilyLinkViewControllerWrapper.swift | 0 .../JoinFamilyViewControllerWrapper.swift | 0 .../AccountSignInViewController.swift | 2 +- .../Reactor/InputFamilyLinkReactor.swift | 23 ++++------ .../InputFamilyLinkViewController.swift | 42 +------------------ .../Home/Reactor/MainViewReactor.swift | 30 +++++++++---- .../ViewControllers/MainViewController.swift | 7 +++- .../APIs/App/Repository/AppRepository.swift | 11 ++++- .../AppUserDefaults/AppUserDefaults.swift | 20 ++------- .../Sources/Repositories/AppRepository.swift | 5 ++- .../App/FetchFamilyManagementUseCase.swift | 8 ++-- .../App/IsFirstWidgetAlertUseCase.swift | 27 ++++++++++++ ... SaveIsFirstFamilyManagementUseCase.swift} | 4 +- .../App/SaveIsFirstWidgetAlertUseCase.swift | 27 ++++++++++++ .../MainView/CheckSurvivalTimeUseCase.swift | 35 ++++++++++++++++ 20 files changed, 226 insertions(+), 99 deletions(-) create mode 100644 14th-team5-iOS/App/Sources/Application/Navigator/InputFamilyLinkNavigator.swift rename 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/{JoinFamily => FamilyEntrance}/FamilyEntranceControllerWrapper.swift (100%) rename 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/{JoinFamily => FamilyEntrance}/InputFamilyLinkViewControllerWrapper.swift (100%) rename 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/{JoinFamily => FamilyEntrance}/JoinFamilyViewControllerWrapper.swift (100%) create mode 100644 14th-team5-iOS/Domain/Sources/UseCases/App/IsFirstWidgetAlertUseCase.swift rename 14th-team5-iOS/Domain/Sources/UseCases/App/{UpdateFamilyManagementUseCase.swift => SaveIsFirstFamilyManagementUseCase.swift} (74%) create mode 100644 14th-team5-iOS/Domain/Sources/UseCases/App/SaveIsFirstWidgetAlertUseCase.swift create mode 100644 14th-team5-iOS/Domain/Sources/UseCases/MainView/CheckSurvivalTimeUseCase.swift diff --git a/14th-team5-iOS/App/Sources/Application/DIContainer/AppDIContainer.swift b/14th-team5-iOS/App/Sources/Application/DIContainer/AppDIContainer.swift index 8718a1fa1..565818384 100644 --- a/14th-team5-iOS/App/Sources/Application/DIContainer/AppDIContainer.swift +++ b/14th-team5-iOS/App/Sources/Application/DIContainer/AppDIContainer.swift @@ -19,12 +19,20 @@ final class AppDIContainer: BaseContainer { ) } - private func makeFetchFamilyManagementUseCase() -> FetchIsFirstFamilyManagementUseCaseProtocol { - FetchFamilyManagementUseCase(repository: makeAppRepository()) + private func makeCheckIsFirstWidgetAlertUseCase() -> IsFirstWidgetAlertUseCaseProtocol { + IsFirstWidgetAlertUseCase(repository: makeAppRepository()) } - private func makeSaveFamilyManagementUseCase() -> UpdateFamilyManagementUseCaseProtocol { - UpdateFamilyManagementUseCase(repository: makeAppRepository()) + private func makeSaveWidgetAlertUseCase() -> SaveIsFirstWidgetAlertUseCaseProtocol { + SaveIsFirstWidgetAlertUseCase(repository: makeAppRepository()) + } + + private func makeFetchFamilyManagementUseCase() -> IsFirstFamilyManagementUseCaseProtocol { + IsFirstFamilyManagementUseCase(repository: makeAppRepository()) + } + + private func makeSaveFamilyManagementUseCase() -> SaveIsFirstFamilyManagementUseCaseProtocol { + SaveIsFirstFamilyManagementUseCase(repository: makeAppRepository()) } @@ -38,11 +46,15 @@ final class AppDIContainer: BaseContainer { // MARK: - Register func registerDependencies() { - container.register(type: FetchIsFirstFamilyManagementUseCaseProtocol.self) { _ in + container.register(type: IsFirstWidgetAlertUseCaseProtocol.self) { _ in + self.makeCheckIsFirstWidgetAlertUseCase() + } + + container.register(type: IsFirstFamilyManagementUseCaseProtocol.self) { _ in self.makeFetchFamilyManagementUseCase() } - container.register(type: UpdateFamilyManagementUseCaseProtocol.self) { _ in + container.register(type: SaveIsFirstFamilyManagementUseCaseProtocol.self) { _ in self.makeSaveFamilyManagementUseCase() } @@ -58,6 +70,10 @@ final class AppDIContainer: BaseContainer { container.register(type: AppUserDefaultsType.self) { _ in return AppUserDefaults() } + + container.register(type: SaveIsFirstWidgetAlertUseCaseProtocol.self) { _ in + return self.makeSaveWidgetAlertUseCase() + } } } diff --git a/14th-team5-iOS/App/Sources/Application/DIContainer/NavigatorDIContainer.swift b/14th-team5-iOS/App/Sources/Application/DIContainer/NavigatorDIContainer.swift index 455e810bc..daef02ea9 100644 --- a/14th-team5-iOS/App/Sources/Application/DIContainer/NavigatorDIContainer.swift +++ b/14th-team5-iOS/App/Sources/Application/DIContainer/NavigatorDIContainer.swift @@ -38,7 +38,7 @@ final class NavigatorDIContainer: BaseContainer { } container.register(type: MainNavigatorProtocol.self) { _ in - MainNavigator(navigationController: makeUINavigationController()) + MainNavigator(navigationController: makeUINavigationController()) } container.register(type: SplashNavigatorProtocol.self) { _ in @@ -90,7 +90,7 @@ final class NavigatorDIContainer: BaseContainer { } container.register(type: FamilyEntranceNavigatorProtocol.self) { _ in - FamilyEntranceNavigator(navigationController: makeUINavigationController()) + FamilyEntranceNavigator(navigationController: makeUINavigationController()) } container.register(type: JoinFamilyNavigatorProtocol.self) { _ in @@ -116,6 +116,10 @@ final class NavigatorDIContainer: BaseContainer { navigationController: makeUINavigationController() ) } + + container.register(type: InputFamilyLinkNavigatorProtocol.self) { _ in + InputFamilyLInkNavigator(navigationController: makeUINavigationController()) + } } } diff --git a/14th-team5-iOS/App/Sources/Application/Navigator/InputFamilyLinkNavigator.swift b/14th-team5-iOS/App/Sources/Application/Navigator/InputFamilyLinkNavigator.swift new file mode 100644 index 000000000..6e935d2d2 --- /dev/null +++ b/14th-team5-iOS/App/Sources/Application/Navigator/InputFamilyLinkNavigator.swift @@ -0,0 +1,38 @@ +// +// InputFamilyLinkNavigator.swift +// App +// +// Created by 마경미 on 30.09.24. +// + +import Core +import UIKit + +protocol InputFamilyLinkNavigatorProtocol: BaseNavigator { + func toHome() + func pop() +} + +final class InputFamilyLInkNavigator: InputFamilyLinkNavigatorProtocol { + + // MARK: - Properties + + var navigationController: UINavigationController + + // MARK: - Intializer + + init(navigationController: UINavigationController) { + self.navigationController = navigationController + } + + // MARK: - To + + func pop() { + navigationController.popViewController(animated: true) + } + + func toHome() { + let vc = MainViewControllerWrapper().viewController + navigationController.setViewControllers([vc], animated: true) + } +} diff --git a/14th-team5-iOS/App/Sources/Application/Navigator/MainNavigator.swift b/14th-team5-iOS/App/Sources/Application/Navigator/MainNavigator.swift index d045efa81..2b261fcf5 100644 --- a/14th-team5-iOS/App/Sources/Application/Navigator/MainNavigator.swift +++ b/14th-team5-iOS/App/Sources/Application/Navigator/MainNavigator.swift @@ -15,6 +15,7 @@ protocol MainNavigatorProtocol: BaseNavigator { // alert func showSurvivalAlert() func pickAlert(_ name: String) + func showWidgetAlert() func missionUnlockedAlert() @@ -51,7 +52,14 @@ final class MainNavigator: MainNavigatorProtocol { } func missionUnlockedAlert() { - BBAlert.style(.mission).show() + let handler: BBAlertActionHandler = { [weak self] alert in + self?.toCamera(.survival) + } + BBAlert.style(.takePhoto, primaryAction: handler).show() + } + + func showWidgetAlert() { + BBAlert.style(.widget).show() } func showToast(_ image: UIImage?, _ message: String) { diff --git a/14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/JoinFamily/FamilyEntranceControllerWrapper.swift b/14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/FamilyEntrance/FamilyEntranceControllerWrapper.swift similarity index 100% rename from 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/JoinFamily/FamilyEntranceControllerWrapper.swift rename to 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/FamilyEntrance/FamilyEntranceControllerWrapper.swift diff --git a/14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/JoinFamily/InputFamilyLinkViewControllerWrapper.swift b/14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/FamilyEntrance/InputFamilyLinkViewControllerWrapper.swift similarity index 100% rename from 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/JoinFamily/InputFamilyLinkViewControllerWrapper.swift rename to 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/FamilyEntrance/InputFamilyLinkViewControllerWrapper.swift diff --git a/14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/JoinFamily/JoinFamilyViewControllerWrapper.swift b/14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/FamilyEntrance/JoinFamilyViewControllerWrapper.swift similarity index 100% rename from 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/JoinFamily/JoinFamilyViewControllerWrapper.swift rename to 14th-team5-iOS/App/Sources/Application/Navigator/Wrapper/FamilyEntrance/JoinFamilyViewControllerWrapper.swift diff --git a/14th-team5-iOS/App/Sources/Presentation/Account/AccountSignIn/AccountSignInViewController.swift b/14th-team5-iOS/App/Sources/Presentation/Account/AccountSignIn/AccountSignInViewController.swift index e63cdf766..b4a153d8d 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Account/AccountSignIn/AccountSignInViewController.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Account/AccountSignIn/AccountSignInViewController.swift @@ -113,7 +113,7 @@ public final class AccountSignInViewController: BaseViewController.just(.setFamilyManagement(false)) } case .contributorNextButtonTap: @@ -247,11 +252,20 @@ extension MainViewReactor { self.pushViewController(type: .missionUnlockedAlert) return .empty() } - case .checkFamilyManagement: - return checkFamilyManagementUseCase.execute() + case .checkIsFirstFamilyManagement: + return isFirstFamilyManagementUseCase.execute() .flatMap { return Observable.just(.setFamilyManagement($0)) } + case .checkIsFirstWidgetAlert: + return isFirstWidgetAlertUseCase.execute() + .filter { $0 } + .withUnretained(self) + .flatMap { _ -> Observable in + self.pushViewController(type: .widgetAlert) + self.saveIsFirstWidgetAlertUseCase.execute(false) + return .empty() + } } } @@ -309,6 +323,8 @@ extension MainViewReactor { navigator.showToast(image, message) case .showErrorToast: navigator.showToast(DesignSystemAsset.warning.image, "에러가 발생했습니다") + case .widgetAlert: + navigator.showWidgetAlert() } } } diff --git a/14th-team5-iOS/App/Sources/Presentation/Home/ViewControllers/MainViewController.swift b/14th-team5-iOS/App/Sources/Presentation/Home/ViewControllers/MainViewController.swift index 1ee4c2b1d..7f9fc2b1d 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Home/ViewControllers/MainViewController.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Home/ViewControllers/MainViewController.swift @@ -129,7 +129,12 @@ extension MainViewController { .disposed(by: disposeBag) Observable.just(()) - .map { Reactor.Action.checkFamilyManagement } + .map { Reactor.Action.checkIsFirstFamilyManagement } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + Observable.just(()) + .map { Reactor.Action.checkIsFirstWidgetAlert } .bind(to: reactor.action) .disposed(by: disposeBag) diff --git a/14th-team5-iOS/Data/Sources/APIs/App/Repository/AppRepository.swift b/14th-team5-iOS/Data/Sources/APIs/App/Repository/AppRepository.swift index 0d374e76c..2708349de 100644 --- a/14th-team5-iOS/Data/Sources/APIs/App/Repository/AppRepository.swift +++ b/14th-team5-iOS/Data/Sources/APIs/App/Repository/AppRepository.swift @@ -40,7 +40,7 @@ extension AppRepository { .asObservable() } - public func fetchIsFirstFamilyManagement() -> RxSwift.Observable { + public func loadIsFirstFamilyManagement() -> RxSwift.Observable { let isFirstFamily = appUserDefaults.loadIsFirstFamilyManagement() return .just(isFirstFamily) } @@ -48,4 +48,13 @@ extension AppRepository { public func saveIsFirstFamilyManagement(isFirst: Bool) { appUserDefaults.saveIsFirstFamilyManagement(isFirst) } + + public func loadIsFirstWidgetAlert() -> Observable { + let isFirstWidgetAlert = appUserDefaults.loadIsFirstShowWidgetAlert() + return .just(isFirstWidgetAlert) + } + + public func saveIsFirstWidgetAlert(isFirst: Bool) { + appUserDefaults.saveIsFirstShowWidgetAlert(isFirst) + } } diff --git a/14th-team5-iOS/Data/Sources/Storages/UserDefaults/AppUserDefaults/AppUserDefaults.swift b/14th-team5-iOS/Data/Sources/Storages/UserDefaults/AppUserDefaults/AppUserDefaults.swift index 71f290718..a026b825e 100644 --- a/14th-team5-iOS/Data/Sources/Storages/UserDefaults/AppUserDefaults/AppUserDefaults.swift +++ b/14th-team5-iOS/Data/Sources/Storages/UserDefaults/AppUserDefaults/AppUserDefaults.swift @@ -42,10 +42,7 @@ final public class AppUserDefaults: AppUserDefaultsType { } public func loadIsFirstLaunchApp() -> Bool? { - guard - let value: Bool? = userDefaults[.isFirstLaunchApp] - else { return nil } - return value + return userDefaults[.isFirstLaunchApp] } @@ -56,10 +53,7 @@ final public class AppUserDefaults: AppUserDefaultsType { } public func loadIsFirstChangeFamilyName() -> Bool? { - guard - let value: Bool? = userDefaults[.isFirstChangeFamilyName] - else { return nil } - return value + return userDefaults[.isFirstChangeFamilyName] } @@ -70,10 +64,7 @@ final public class AppUserDefaults: AppUserDefaultsType { } public func loadIsFirstShowWidgetAlert() -> Bool? { - guard - let value: Bool? = userDefaults[.isFirstShowWidgetAlert] - else { return nil } - return value + return userDefaults[.isFirstShowWidgetAlert] } @@ -84,10 +75,7 @@ final public class AppUserDefaults: AppUserDefaultsType { } public func loadInviteCode() -> String? { - guard - let inviteCode: String? = userDefaults[.inviteCode] - else { return nil } - return inviteCode + return userDefaults[.inviteCode] } diff --git a/14th-team5-iOS/Domain/Sources/Repositories/AppRepository.swift b/14th-team5-iOS/Domain/Sources/Repositories/AppRepository.swift index 5dcdb49cb..85d11b1f4 100644 --- a/14th-team5-iOS/Domain/Sources/Repositories/AppRepository.swift +++ b/14th-team5-iOS/Domain/Sources/Repositories/AppRepository.swift @@ -11,7 +11,10 @@ import RxSwift public protocol AppRepositoryProtocol { func fetchAppVersion() -> Observable - func fetchIsFirstFamilyManagement() -> Observable + func loadIsFirstFamilyManagement() -> Observable func saveIsFirstFamilyManagement(isFirst: Bool) -> Void + + func loadIsFirstWidgetAlert() -> Observable + func saveIsFirstWidgetAlert(isFirst: Bool) -> Void } diff --git a/14th-team5-iOS/Domain/Sources/UseCases/App/FetchFamilyManagementUseCase.swift b/14th-team5-iOS/Domain/Sources/UseCases/App/FetchFamilyManagementUseCase.swift index 8c226dab1..7d04f2f49 100644 --- a/14th-team5-iOS/Domain/Sources/UseCases/App/FetchFamilyManagementUseCase.swift +++ b/14th-team5-iOS/Domain/Sources/UseCases/App/FetchFamilyManagementUseCase.swift @@ -9,11 +9,11 @@ import Foundation import RxSwift -public protocol FetchIsFirstFamilyManagementUseCaseProtocol { +public protocol IsFirstFamilyManagementUseCaseProtocol { func execute() -> Observable } -public class FetchFamilyManagementUseCase: FetchIsFirstFamilyManagementUseCaseProtocol { +public class IsFirstFamilyManagementUseCase: IsFirstFamilyManagementUseCaseProtocol { private let repository: AppRepositoryProtocol @@ -22,10 +22,10 @@ public class FetchFamilyManagementUseCase: FetchIsFirstFamilyManagementUseCasePr } public func execute() -> Observable { - repository.fetchIsFirstFamilyManagement() + repository.loadIsFirstFamilyManagement() .map { isFirst in guard let isFirst else { - return false + return true } return isFirst } diff --git a/14th-team5-iOS/Domain/Sources/UseCases/App/IsFirstWidgetAlertUseCase.swift b/14th-team5-iOS/Domain/Sources/UseCases/App/IsFirstWidgetAlertUseCase.swift new file mode 100644 index 000000000..d1db62e58 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/UseCases/App/IsFirstWidgetAlertUseCase.swift @@ -0,0 +1,27 @@ +// +// CheckWidgetAlertUseCaseprotocol.swift +// Domain +// +// Created by 마경미 on 15.10.24. +// + +import RxSwift + +public protocol IsFirstWidgetAlertUseCaseProtocol { + func execute() -> Observable +} + +public class IsFirstWidgetAlertUseCase: IsFirstWidgetAlertUseCaseProtocol { + + private let repository: AppRepositoryProtocol + + public init(repository: AppRepositoryProtocol) { + self.repository = repository + } + + public func execute() -> Observable { + repository.loadIsFirstWidgetAlert() + .map { ($0 ?? true) } + .asObservable() + } +} diff --git a/14th-team5-iOS/Domain/Sources/UseCases/App/UpdateFamilyManagementUseCase.swift b/14th-team5-iOS/Domain/Sources/UseCases/App/SaveIsFirstFamilyManagementUseCase.swift similarity index 74% rename from 14th-team5-iOS/Domain/Sources/UseCases/App/UpdateFamilyManagementUseCase.swift rename to 14th-team5-iOS/Domain/Sources/UseCases/App/SaveIsFirstFamilyManagementUseCase.swift index cf0334ed0..82ee08ccc 100644 --- a/14th-team5-iOS/Domain/Sources/UseCases/App/UpdateFamilyManagementUseCase.swift +++ b/14th-team5-iOS/Domain/Sources/UseCases/App/SaveIsFirstFamilyManagementUseCase.swift @@ -9,11 +9,11 @@ import Foundation import RxSwift -public protocol UpdateFamilyManagementUseCaseProtocol { +public protocol SaveIsFirstFamilyManagementUseCaseProtocol { func execute(_ isFirst: Bool) } -public class UpdateFamilyManagementUseCase: UpdateFamilyManagementUseCaseProtocol { +public class SaveIsFirstFamilyManagementUseCase: SaveIsFirstFamilyManagementUseCaseProtocol { private let repository: AppRepositoryProtocol diff --git a/14th-team5-iOS/Domain/Sources/UseCases/App/SaveIsFirstWidgetAlertUseCase.swift b/14th-team5-iOS/Domain/Sources/UseCases/App/SaveIsFirstWidgetAlertUseCase.swift new file mode 100644 index 000000000..749aca15d --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/UseCases/App/SaveIsFirstWidgetAlertUseCase.swift @@ -0,0 +1,27 @@ +// +// UpdateWidgetAlertUseCase.swift +// Domain +// +// Created by 마경미 on 16.10.24. +// + +import Foundation + +import RxSwift + +public protocol SaveIsFirstWidgetAlertUseCaseProtocol { + func execute(_ isFirst: Bool) +} + +public class SaveIsFirstWidgetAlertUseCase: SaveIsFirstWidgetAlertUseCaseProtocol { + + private let repository: AppRepositoryProtocol + + public init(repository: AppRepositoryProtocol) { + self.repository = repository + } + + public func execute(_ isFirst: Bool) { + repository.saveIsFirstWidgetAlert(isFirst: isFirst) + } +} diff --git a/14th-team5-iOS/Domain/Sources/UseCases/MainView/CheckSurvivalTimeUseCase.swift b/14th-team5-iOS/Domain/Sources/UseCases/MainView/CheckSurvivalTimeUseCase.swift new file mode 100644 index 000000000..e5b4a1da1 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/UseCases/MainView/CheckSurvivalTimeUseCase.swift @@ -0,0 +1,35 @@ +// +// CheckSurvivalTimeUseCase.swift +// Domain +// +// Created by 마경미 on 30.09.24. +// + +import Foundation + +public protocol CheckSurvivalTimeUseCaseProtocol { + func execute() -> (isIntime: Bool, remainTIme: Int) +} + +public final class CheckSurvivalTimeUseCase: CheckSurvivalTimeUseCaseProtocol { + public func execute() -> (isIntime: Bool, remainTIme: Int) { + let calendar = Calendar.current + let currentTime = Date() + + let currentHour = calendar.component(.hour, from: currentTime) + + if currentHour >= 10 { + if let nextMidnight = calendar.date(bySettingHour: 0, minute: 0, second: 0, of: currentTime.addingTimeInterval(24 * 60 * 60)) { + let timeDifference = calendar.dateComponents([.second], from: currentTime, to: nextMidnight) + return (true, max(0, timeDifference.second ?? 0)) + } + } else { + if let nextMidnight = calendar.date(bySettingHour: 12, minute: 0, second: 0, of: currentTime) { + let timeDifference = calendar.dateComponents([.second], from: currentTime, to: nextMidnight) + return (false, max(0, timeDifference.second ?? 0)) + } + } + + return (false, 1000) + } +}