Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate to TCA 1.0 #379

Merged
merged 32 commits into from
Jul 10, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
3d8b320
Rename `EffectTask` with `Effect`
Jimmy-Prime Mar 15, 2024
88fac74
Rename `ReducerProtocol` with `Reducer`
Jimmy-Prime Mar 15, 2024
52fd6c8
Fix 'init(value:)' is deprecated
Jimmy-Prime Mar 15, 2024
0026c04
Fix 'fireAndForget' is deprecated
Jimmy-Prime Mar 15, 2024
90c262a
Fix 'init(initialState:reducer:prepareDependencies:)' is deprecated
Jimmy-Prime Mar 15, 2024
ebb2387
Fix 'init(_:)' is deprecated
Jimmy-Prime Mar 16, 2024
253056d
Fix 'binding(_:fileID:line:)'
Jimmy-Prime Mar 16, 2024
53c4574
Fix 'eraseToEffect()' is deprecated
Jimmy-Prime Mar 16, 2024
fdbbbc4
Fix 'cancel(ids:)' is deprecated
Jimmy-Prime Mar 16, 2024
6f04b56
Merge pull request #368 from Jimmy-Prime/jimmy/fix-tca-warnings
chihchy Apr 4, 2024
76abb24
Enforce code style
chihchy Apr 11, 2024
6842553
Update code level contributors
chihchy Apr 11, 2024
4aedf46
Fix most warnings
Jimmy-Prime Apr 19, 2024
6407b4a
pr fix: Update Task.sleep call
Jimmy-Prime May 25, 2024
4c4163b
pr fix: Remove CancelID.teardown
Jimmy-Prime May 25, 2024
69f316b
Merge pull request #372 from Jimmy-Prime/jimmy/fix-most-warnings
chihchy May 27, 2024
a1b0463
Add async response for Request
Jimmy-Prime May 25, 2024
4f34187
Fix deprecation
Jimmy-Prime May 25, 2024
438d56e
Remove deprecated symbol
Jimmy-Prime May 25, 2024
3e7f279
TCA 1.0
Jimmy-Prime May 28, 2024
015e787
Fix bug: nesting binding is not matched
Jimmy-Prime May 28, 2024
093504c
Fix deprecated symbol
Jimmy-Prime May 28, 2024
0f475cc
Merge pull request #376 from Jimmy-Prime/jimmy/fix-publisher-deprecated
chihchy May 30, 2024
fd7805a
Resolve warnings & enforce code style
chihchy May 30, 2024
557a1b7
Update CI
chihchy May 30, 2024
033d8bc
Stop ignoring generated files in git
chihchy May 30, 2024
0de6620
Merge pull request #377 from EhPanda-Team/issue/resolve-warnings-and-…
chihchy May 30, 2024
856c492
Add MainActor attribution to avoid crashes
chihchy Jul 10, 2024
895b6d4
Add folder shortcuts
chihchy Jul 10, 2024
ca18060
Update Package.resolved version
chihchy Jul 10, 2024
4463781
Bump version to 2.7.5
chihchy Jul 10, 2024
0358bd5
Enforce code style
chihchy Jul 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fix 'eraseToEffect()' is deprecated
  • Loading branch information
Jimmy-Prime committed Mar 16, 2024
commit 53c4574372d5d1dfd838a977553a57d411a2c426
22 changes: 11 additions & 11 deletions EhPanda/App/Tools/Clients/AuthorizationClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,21 @@ extension AuthorizationClient {
return !LAContext().canEvaluatePolicy(.deviceOwnerAuthentication, error: &error)
},
localAuthroize: { reason in
Future { promise in
let context = LAContext()
var error: NSError?
Effect.publisher {
Future { promise in
let context = LAContext()
var error: NSError?

if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { isSuccess, _ in
promise(.success(isSuccess))
if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { isSuccess, _ in
promise(.success(isSuccess))
}
} else {
promise(.success(false))
}
} else {
promise(.success(false))
}
.receive(on: DispatchQueue.main)
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.eraseToEffect()
}
)
}
Expand Down
115 changes: 58 additions & 57 deletions EhPanda/App/Tools/Clients/DatabaseClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,36 +20,36 @@ struct DatabaseClient {
extension DatabaseClient {
static let live: Self = .init(
prepareDatabase: {
Future { promise in
PersistenceController.shared.prepare {
switch $0 {
case .success:
promise(.success(nil))
Effect.publisher {
Future { promise in
PersistenceController.shared.prepare {
switch $0 {
case .success:
promise(.success(nil))

case .failure(let appError):
promise(.success(appError))
case .failure(let appError):
promise(.success(appError))
}
}
}
.receive(on: DispatchQueue.main)
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.eraseToEffect()
},
dropDatabase: {
Future { promise in
PersistenceController.shared.rebuild {
switch $0 {
case .success:
promise(.success(nil))
Effect.publisher {
Future { promise in
PersistenceController.shared.rebuild {
switch $0 {
case .success:
promise(.success(nil))

case .failure(let appError):
promise(.success(appError))
case .failure(let appError):
promise(.success(appError))
}
}
}
.receive(on: DispatchQueue.main)
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.eraseToEffect()
},
saveContext: {
let context = PersistenceController.shared.container.viewContext
Expand Down Expand Up @@ -217,49 +217,49 @@ extension DatabaseClient {
return entity
}
func fetchAppEnv() -> Effect<AppEnv> {
Future { promise in
DispatchQueue.main.async {
promise(.success(fetchOrCreate(entityType: AppEnvMO.self).toEntity()))
Effect.publisher {
Future { promise in
DispatchQueue.main.async {
promise(.success(fetchOrCreate(entityType: AppEnvMO.self).toEntity()))
}
}
.receive(on: DispatchQueue.main)
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.eraseToEffect()
}
func fetchAppEnvSynchronously() -> AppEnv {
fetchOrCreate(entityType: AppEnvMO.self).toEntity()
}
func fetchGalleryState(gid: String) -> Effect<GalleryState> {
guard gid.isValidGID else { return .none }
return Future { promise in
DispatchQueue.main.async {
promise(.success(
fetchOrCreate(entityType: GalleryStateMO.self, gid: gid).toEntity()
))
return Effect.publisher {
Future { promise in
DispatchQueue.main.async {
promise(.success(
fetchOrCreate(entityType: GalleryStateMO.self, gid: gid).toEntity()
))
}
}
.receive(on: DispatchQueue.main)
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.eraseToEffect()
}
func fetchHistoryGalleries(fetchLimit: Int = 0) -> Effect<[Gallery]> {
Future { promise in
DispatchQueue.main.async {
let predicate = NSPredicate(format: "lastOpenDate != nil")
let sortDescriptor = NSSortDescriptor(
keyPath: \GalleryMO.lastOpenDate, ascending: false
)
let galleries = batchFetch(
entityType: GalleryMO.self, fetchLimit: fetchLimit, predicate: predicate,
findBeforeFetch: false, sortDescriptors: [sortDescriptor]
)
.map { $0.toEntity() }
promise(.success(galleries))
Effect.publisher {
Future { promise in
DispatchQueue.main.async {
let predicate = NSPredicate(format: "lastOpenDate != nil")
let sortDescriptor = NSSortDescriptor(
keyPath: \GalleryMO.lastOpenDate, ascending: false
)
let galleries = batchFetch(
entityType: GalleryMO.self, fetchLimit: fetchLimit, predicate: predicate,
findBeforeFetch: false, sortDescriptors: [sortDescriptor]
)
.map { $0.toEntity() }
promise(.success(galleries))
}
}
.receive(on: DispatchQueue.main)
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.eraseToEffect()
}
}
// MARK: FetchAccessor
Expand Down Expand Up @@ -529,14 +529,15 @@ extension DatabaseClient {

// Update User
func updateUserProperty(_ commitChanges: @escaping (inout User) -> Void) -> Effect<Never> {
fetchAppEnv().map(\.user)
.map { (user: User) -> User in
var user = user
commitChanges(&user)
return user
}
.flatMap(updateUser)
.eraseToEffect()
Effect.publisher {
fetchAppEnv().map(\.user)
.map { (user: User) -> User in
var user = user
commitChanges(&user)
return user
}
.flatMap(updateUser)
}
}
func updateGreeting(_ greeting: Greeting) -> Effect<Never> {
updateUserProperty { user in
Expand Down
27 changes: 14 additions & 13 deletions EhPanda/App/Tools/Clients/ImageClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,24 @@ extension ImageClient {
})
},
saveImageToPhotoLibrary: { (image, isAnimated) in
Future { promise in
DispatchQueue.global(qos: .utility).async {
if let data = image.kf.data(format: isAnimated ? .GIF : .unknown) {
PHPhotoLibrary.shared().performChanges {
let request = PHAssetCreationRequest.forAsset()
request.addResource(with: .photo, data: data, options: nil)
} completionHandler: { (isSuccess, _) in
promise(.success(isSuccess))
Effect.publisher {
Future { promise in
DispatchQueue.global(qos: .utility).async {
if let data = image.kf.data(format: isAnimated ? .GIF : .unknown) {
PHPhotoLibrary.shared().performChanges {
let request = PHAssetCreationRequest.forAsset()
request.addResource(with: .photo, data: data, options: nil)
} completionHandler: { (isSuccess, _) in
promise(.success(isSuccess))
}
} else {
promise(.success(false))
}
} else {
promise(.success(false))
}
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.eraseToEffect()
},
downloadImage: { url in
Future { promise in
Expand Down
22 changes: 11 additions & 11 deletions EhPanda/App/Tools/Clients/LibraryClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,23 +67,23 @@ extension LibraryClient {
})
},
analyzeImageColors: { image in
Future { promise in
image.getColors(quality: .lowest) { colors in
promise(.success(colors))
Effect.publisher {
Future { promise in
image.getColors(quality: .lowest) { colors in
promise(.success(colors))
}
}
}
.eraseToAnyPublisher()
.eraseToEffect()
},
calculateWebImageDiskCacheSize: {
Future { promise in
KingfisherManager.shared.cache.calculateDiskStorageSize {
promise(.success(try? $0.get()))
Effect.publisher {
Future { promise in
KingfisherManager.shared.cache.calculateDiskStorageSize {
promise(.success(try? $0.get()))
}
}
.receive(on: DispatchQueue.main)
}
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.eraseToEffect()
}
)
}
Expand Down
13 changes: 7 additions & 6 deletions EhPanda/DataFlow/AppReducer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -155,12 +155,13 @@ struct AppReducer: Reducer {
effects.append(Effect.send(.setting(.setNavigation(.account))))
if !cookieClient.didLogin {
effects.append(
Effect.send(.setting(.account(.setNavigation(.login))))
.delay(
for: .milliseconds(deviceClient.isPad() ? 1200 : 200),
scheduler: DispatchQueue.main
)
.eraseToEffect()
Effect.publisher {
Effect.send(.setting(.account(.setNavigation(.login))))
.delay(
for: .milliseconds(deviceClient.isPad() ? 1200 : 200),
scheduler: DispatchQueue.main
)
}
)
}
return .merge(effects)
Expand Down
30 changes: 20 additions & 10 deletions EhPanda/DataFlow/AppRouteReducer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,15 @@ struct AppRouteReducer: Reducer {
let (isGalleryImageURL, _, _) = urlClient.analyzeURL(url)
let gid = urlClient.parseGalleryID(url)
guard databaseClient.fetchGallery(gid: gid) == nil else {
return Effect.send(.handleGalleryLink(url))
.delay(for: .milliseconds(delay + 250), scheduler: DispatchQueue.main).eraseToEffect()
return Effect.publisher {
Effect.send(.handleGalleryLink(url))
.delay(for: .milliseconds(delay + 250), scheduler: DispatchQueue.main)
}
}
return Effect.publisher {
Effect.send(.fetchGallery(url, isGalleryImageURL))
.delay(for: .milliseconds(delay), scheduler: DispatchQueue.main)
}
return Effect.send(.fetchGallery(url, isGalleryImageURL))
.delay(for: .milliseconds(delay), scheduler: DispatchQueue.main).eraseToEffect()

case .handleGalleryLink(let url):
let (_, pageIndex, commentID) = urlClient.analyzeURL(url)
Expand All @@ -116,14 +120,18 @@ struct AppRouteReducer: Reducer {
if let pageIndex = pageIndex {
effects.append(Effect.send(.updateReadingProgress(gid, pageIndex)))
effects.append(
Effect.send(.detail(.setNavigation(.reading)))
.delay(for: .milliseconds(500), scheduler: DispatchQueue.main).eraseToEffect()
Effect.publisher {
Effect.send(.detail(.setNavigation(.reading)))
.delay(for: .milliseconds(500), scheduler: DispatchQueue.main)
}
)
} else if let commentID = commentID {
state.detailState.commentsState?.scrollCommentID = commentID
effects.append(
Effect.send(.detail(.setNavigation(.comments(url))))
.delay(for: .milliseconds(500), scheduler: DispatchQueue.main).eraseToEffect()
Effect.publisher {
Effect.send(.detail(.setNavigation(.comments(url))))
.delay(for: .milliseconds(500), scheduler: DispatchQueue.main)
}
)
}
effects.append(Effect.send(.setNavigation(.detail(gid))))
Expand All @@ -148,8 +156,10 @@ struct AppRouteReducer: Reducer {
Effect.send(.handleGalleryLink(url))
)
case .failure:
return Effect.send(.setHUDConfig(.error))
.delay(for: .milliseconds(500), scheduler: DispatchQueue.main).eraseToEffect()
return Effect.publisher {
Effect.send(Action.setHUDConfig(.error))
.delay(for: .milliseconds(500), scheduler: DispatchQueue.main)
}
}

case .fetchGreetingDone(let result):
Expand Down
Loading