diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/Setting/DefaultSettingUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/Setting/DefaultSettingUseCase.swift index f9304d03..634f29bc 100644 --- a/project/Projects/Domain/Sources/ConcreteUseCase/Setting/DefaultSettingUseCase.swift +++ b/project/Projects/Domain/Sources/ConcreteUseCase/Setting/DefaultSettingUseCase.swift @@ -6,7 +6,6 @@ // import Foundation -import UserNotifications import Core @@ -23,56 +22,6 @@ public class DefaultSettingUseCase: SettingScreenUseCase { public init() { } - public func checkPushNotificationApproved() -> Single { - Single.create { single in - let center = UNUserNotificationCenter.current() - center.getNotificationSettings { settings in - switch settings.authorizationStatus { - case .notDetermined, .denied: - single(.success(false)) - case .authorized, .provisional, .ephemeral: - single(.success(true)) - @unknown default: - single(.success(false)) - } - } - - return Disposables.create { } - } - } - - public func requestNotificationPermission() -> Maybe { - Maybe.create { maybe in - - let current = UNUserNotificationCenter.current() - - current.getNotificationSettings { [maybe] settings in - switch settings.authorizationStatus { - case .notDetermined: - // Request permission since the user hasn't decided yet. - current.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in - if error != nil { - maybe(.success(.error(message: "알람동의를 수행할 수 없습니다."))) - } else { - maybe(.success(.granted)) - } - } - case .denied: - // 사용자가 요청을 거부했던 상태로 설정앱을 엽니다. - maybe(.success(.openSystemSetting)) - return - case .authorized, .provisional, .ephemeral: - maybe(.success(.granted)) - default: - maybe(.completed) - break - } - } - - return Disposables.create { } - } - } - // MARK: 회원탈퇴 & 로그아웃 // 센터 회원탈퇴 public func deregisterCenterAccount(reasons: [String], password: String) -> RxSwift.Single> { diff --git a/project/Projects/Domain/Sources/UseCaseInterface/Setting/SettingScreenUseCase .swift b/project/Projects/Domain/Sources/UseCaseInterface/Setting/SettingScreenUseCase .swift index 8b34341e..2ebada3a 100644 --- a/project/Projects/Domain/Sources/UseCaseInterface/Setting/SettingScreenUseCase .swift +++ b/project/Projects/Domain/Sources/UseCaseInterface/Setting/SettingScreenUseCase .swift @@ -10,20 +10,8 @@ import Foundation import RxSwift -public enum NotificationApproveAction: Equatable { - case openSystemSetting - case granted - case error(message: String) -} - public protocol SettingScreenUseCase: BaseUseCase { - - /// 현재 알람수신 동의 여부를 확인합니다. - func checkPushNotificationApproved() -> Single - - /// 알림동의를 요청합니다. - func requestNotificationPermission() -> Maybe - + // MARK: Worker /// 요양보호사 회원 탈퇴 diff --git a/project/Projects/Presentation/Feature/Base/Sources/Util/ImageUploadInfo+Extension.swift b/project/Projects/Presentation/Feature/Base/Sources/Util/Extension/ImageUploadInfo+Extension.swift similarity index 100% rename from project/Projects/Presentation/Feature/Base/Sources/Util/ImageUploadInfo+Extension.swift rename to project/Projects/Presentation/Feature/Base/Sources/Util/Extension/ImageUploadInfo+Extension.swift diff --git a/project/Projects/Presentation/Feature/Base/Sources/Util/UIImage+Extension.swift b/project/Projects/Presentation/Feature/Base/Sources/Util/Extension/UIImage+Extension.swift similarity index 100% rename from project/Projects/Presentation/Feature/Base/Sources/Util/UIImage+Extension.swift rename to project/Projects/Presentation/Feature/Base/Sources/Util/Extension/UIImage+Extension.swift diff --git a/project/Projects/Presentation/Feature/Base/Sources/Util/RemoteNotificationAuthHelper.swift b/project/Projects/Presentation/Feature/Base/Sources/Util/RemoteNotificationAuthHelper.swift new file mode 100644 index 00000000..3c6b658b --- /dev/null +++ b/project/Projects/Presentation/Feature/Base/Sources/Util/RemoteNotificationAuthHelper.swift @@ -0,0 +1,77 @@ +// +// RemoteNotificationAuthHelper.swift +// BaseFeature +// +// Created by choijunios on 10/9/24. +// + +import Foundation +import UserNotifications + + +import RxSwift + + +public enum RemoteNotificationApproveAction: Equatable { + case openSystemSetting + case granted + case error(message: String) +} + +public class RemoteNotificationAuthHelper { + + public static let shared: RemoteNotificationAuthHelper = .init() + + private init() { } + + public func checkPushNotificationApproved() -> Single { + Single.create { single in + let center = UNUserNotificationCenter.current() + center.getNotificationSettings { settings in + switch settings.authorizationStatus { + case .notDetermined, .denied: + single(.success(false)) + case .authorized, .provisional, .ephemeral: + single(.success(true)) + @unknown default: + single(.success(false)) + } + } + + return Disposables.create { } + } + } + + public func requestNotificationPermission() -> Maybe { + Maybe.create { maybe in + + let current = UNUserNotificationCenter.current() + + current.getNotificationSettings { [maybe] settings in + switch settings.authorizationStatus { + case .notDetermined: + // Request permission since the user hasn't decided yet. + current.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in + if error != nil { + maybe(.success(.error(message: "알람동의를 수행할 수 없습니다."))) + } else { + maybe(.success(.granted)) + } + } + case .denied: + // 사용자가 요청을 거부했던 상태로 설정앱을 엽니다. + maybe(.success(.openSystemSetting)) + return + case .authorized, .provisional, .ephemeral: + maybe(.success(.granted)) + default: + maybe(.completed) + break + } + } + + return Disposables.create { } + } + } +} + diff --git a/project/Projects/Presentation/Feature/CenterMainPage/Sources/SettingPage/CenterSettingViewModel.swift b/project/Projects/Presentation/Feature/CenterMainPage/Sources/SettingPage/CenterSettingViewModel.swift index 80f1fe08..d6b581e3 100644 --- a/project/Projects/Presentation/Feature/CenterMainPage/Sources/SettingPage/CenterSettingViewModel.swift +++ b/project/Projects/Presentation/Feature/CenterMainPage/Sources/SettingPage/CenterSettingViewModel.swift @@ -75,17 +75,16 @@ class CenterSettingViewModel: BaseViewModel, CenterSettingVMable { ) let currentNotificationAuthStatus = refreshNotificationStatusRequest - .flatMap { [settingUseCase] _ in - settingUseCase.checkPushNotificationApproved() + .flatMap { _ in + RemoteNotificationAuthHelper.shared.checkPushNotificationApproved() } let requestApproveNotification = approveToPushNotification.filter { $0 }.map { _ in () } let requestDenyNotification = approveToPushNotification.filter { !$0 }.map { _ in () } let approveRequestResult = requestApproveNotification - .flatMap { [settingUseCase] _ in - settingUseCase - .requestNotificationPermission() + .flatMap { _ in + RemoteNotificationAuthHelper.shared.requestNotificationPermission() } let approveGranted = approveRequestResult.filter { $0 == .granted } diff --git a/project/Projects/Presentation/Feature/WorkerMainPage/Sources/Setting/SettingPageViewModel.swift b/project/Projects/Presentation/Feature/WorkerMainPage/Sources/Setting/SettingPageViewModel.swift index 906294a7..5c3672e5 100644 --- a/project/Projects/Presentation/Feature/WorkerMainPage/Sources/Setting/SettingPageViewModel.swift +++ b/project/Projects/Presentation/Feature/WorkerMainPage/Sources/Setting/SettingPageViewModel.swift @@ -6,11 +6,11 @@ // import UIKit +import UserNotifications import BaseFeature import PresentationCore import Domain import DSKit -import UserNotifications import Core @@ -54,16 +54,16 @@ class SettingPageViewModel: BaseViewModel { ) let currentNotificationAuthStatus = refreshNotificationStatusRequest - .flatMap { [settingUseCase] _ in - settingUseCase.checkPushNotificationApproved() + .flatMap { _ in + RemoteNotificationAuthHelper.shared.checkPushNotificationApproved() } let requestApproveNotification = approveToPushNotification.filter { $0 }.map { _ in () } let requestDenyNotification = approveToPushNotification.filter { !$0 }.map { _ in () } let approveRequestResult = requestApproveNotification - .flatMap { [settingUseCase] _ in - settingUseCase + .flatMap { _ in + RemoteNotificationAuthHelper.shared .requestNotificationPermission() }