@@ -11,11 +11,14 @@ import Foundation
1111
1212final class SettingViewModel : ViewModel {
1313 enum URLType {
14+ case update
1415 case terms
1516 case privacy
1617
1718 fileprivate var url : URL ? {
1819 switch self {
20+ case . update:
21+ return URL ( string: " itms-apps://itunes.apple.com/app/{빛나길 id} " )
1922 case . terms:
2023 return URL ( string: " https://complex-wombat-99f.notion.site/2025-7-20-236f4587491d8071833adfaf8115bce2 " )
2124 case . privacy:
@@ -24,6 +27,11 @@ final class SettingViewModel: ViewModel {
2427 }
2528 }
2629
30+ enum OpenURLType {
31+ case `internal`( url: URL )
32+ case external( url: URL )
33+ }
34+
2735 enum VersionType {
2836 case needUpdate( version: String )
2937 case latest( version: String )
@@ -43,15 +51,15 @@ final class SettingViewModel: ViewModel {
4351 let generalNotificationEnabled : AnyPublisher < Bool , Never >
4452 let pushNotificationEnabled : AnyPublisher < Bool , Never >
4553 let versionPublisher : AnyPublisher < VersionType , Never >
46- let urlPublisher : AnyPublisher < URL ? , Never >
54+ let urlPublisher : AnyPublisher < OpenURLType , Never >
4755 let isAuthenticatedPublisher : AnyPublisher < Bool , Never >
4856 }
4957
5058 private( set) var output : Output
5159 private let versionSubject = PassthroughSubject < VersionType , Never > ( )
5260 private let generalNoticeEnabledSubject = CurrentValueSubject < Bool , Never > ( false )
5361 private let pushNoticeEnabledSubject = CurrentValueSubject < Bool , Never > ( true )
54- private let externalURLSubject = PassthroughSubject < URL ? , Never > ( )
62+ private let urlSubject = PassthroughSubject < OpenURLType , Never > ( )
5563 private let authenticatedSubject = PassthroughSubject < Bool , Never > ( )
5664 private var authRepository : AuthRepositoryProtocol ?
5765 private var appConfigRepository : AppConfigRepositoryProtocol ?
@@ -61,7 +69,7 @@ final class SettingViewModel: ViewModel {
6169 generalNotificationEnabled: generalNoticeEnabledSubject. eraseToAnyPublisher ( ) ,
6270 pushNotificationEnabled: pushNoticeEnabledSubject. eraseToAnyPublisher ( ) ,
6371 versionPublisher: versionSubject. eraseToAnyPublisher ( ) ,
64- urlPublisher: externalURLSubject . eraseToAnyPublisher ( ) ,
72+ urlPublisher: urlSubject . eraseToAnyPublisher ( ) ,
6573 isAuthenticatedPublisher: authenticatedSubject. eraseToAnyPublisher ( ) )
6674 }
6775
@@ -73,8 +81,8 @@ final class SettingViewModel: ViewModel {
7381 togglePushNotification ( )
7482 case . update:
7583 updateBitnagil ( )
76- case . openURL( type : let type) :
77- externalURLSubject . send ( type. url )
84+ case . openURL( let type) :
85+ handleURL ( type: type )
7886 case . logout:
7987 logout ( )
8088 case . withdrawal:
@@ -102,7 +110,8 @@ final class SettingViewModel: ViewModel {
102110 }
103111
104112 private func updateBitnagil( ) {
105- // TODO: - 앱스토어 열기
113+ guard let url = URLType . update. url else { return }
114+ urlSubject. send ( . external( url: url) )
106115 }
107116
108117 private func logout( ) {
@@ -144,4 +153,10 @@ final class SettingViewModel: ViewModel {
144153 }
145154 }
146155 }
156+
157+ private func handleURL( type: URLType ) {
158+ guard let url = type. url else { return }
159+
160+ urlSubject. send ( . internal( url: url) )
161+ }
147162}
0 commit comments