@@ -10,6 +10,7 @@ import Foundation
1010final class SettingViewModel : Store {
1111 struct State {
1212 var theme = " "
13+ var dirSize : Int64 = 0
1314 var isLoading = false
1415 var showAlert : Bool = false
1516 var alertTitle : String = " "
@@ -23,8 +24,10 @@ final class SettingViewModel: Store {
2324 case setAlert( isPresented: Bool , type: AlertType ? = nil )
2425 case setLoading( Bool )
2526 case setTheme( String )
27+ case updateDirSize
2628 case tapDeleteAuthButton
2729 case tapSignOutButton
30+ case tapRemoveCacheButton
2831 }
2932
3033 enum SideEffect {
@@ -33,7 +36,7 @@ final class SettingViewModel: Store {
3336 }
3437
3538 enum AlertType {
36- case signOut, cancel , error
39+ case signOut, deleteAuth , error, removeCache
3740 }
3841
3942 @Published private( set) var state = State ( )
@@ -59,10 +62,14 @@ final class SettingViewModel: Store {
5962 state. isLoading = value
6063 case . setTheme( let value) :
6164 state. theme = value
65+ case . updateDirSize:
66+ state. dirSize = dirSizeInBytes ( )
6267 case . tapDeleteAuthButton:
6368 return [ . deleteAuth]
6469 case . tapSignOutButton:
6570 return [ . signOut]
71+ case . tapRemoveCacheButton:
72+ setAlert ( & state, isPresented: true , type: . removeCache)
6673 }
6774 return [ ]
6875 }
@@ -106,17 +113,56 @@ private extension SettingViewModel {
106113 case . signOut:
107114 state. alertTitle = " 로그아웃 "
108115 state. alertMessage = " 로그아웃 하시겠습니까? "
109- case . cancel :
116+ case . deleteAuth :
110117 state. alertTitle = " 정말 탈퇴하시겠습니까? "
111118 state. alertMessage = " 회원 탈퇴가 진행되면 모든 데이터가 지워지고 복구할 수 없습니다. "
112119 case . error:
113120 state. alertTitle = " 오류 "
114121 state. alertMessage = " 문제가 발생했습니다. 잠시 후 다시 시도해주세요. "
122+ case . removeCache:
123+ state. alertTitle = " 임시 데이터 삭제 "
124+ state. alertMessage = " 임시 데이터를 삭제하고 정리합니다. \n 계속하시겠습니까? "
115125 case . none:
116126 state. alertTitle = " "
117127 state. alertMessage = " "
118128 }
119129 state. showAlert = isPresented
120130 state. alertType = type
121131 }
132+
133+ func dirSizeInBytes( ) -> Int64 {
134+ do {
135+ let cachesDir = try FileManager . default. url (
136+ for: . cachesDirectory,
137+ in: . userDomainMask,
138+ appropriateFor: nil ,
139+ create: true
140+ )
141+ return directorySize ( at: cachesDir)
142+ } catch {
143+ return 0
144+ }
145+ }
146+
147+ private func directorySize( at url: URL ) -> Int64 {
148+ guard FileManager . default. fileExists ( atPath: url. path) else { return 0 }
149+ guard let enumerator = FileManager . default. enumerator (
150+ at: url,
151+ includingPropertiesForKeys: [ . isRegularFileKey, . fileSizeKey] ,
152+ options: [ . skipsHiddenFiles]
153+ ) else {
154+ return 0
155+ }
156+
157+ var total : Int64 = 0
158+ for case let fileURL as URL in enumerator {
159+ guard let resourceValues = try ? fileURL. resourceValues ( forKeys: [ . isRegularFileKey, . fileSizeKey] ) ,
160+ resourceValues. isRegularFile == true ,
161+ let fileSize = resourceValues. fileSize else {
162+ continue
163+ }
164+ total += Int64 ( fileSize)
165+ }
166+ return total
167+ }
122168}
0 commit comments