Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 7 additions & 2 deletions Gem/App.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ struct GemApp: App {
RootScene(
model: RootSceneViewModel(
walletConnectorPresenter: resolver.services.walletConnectorManager.presenter,
onstartAsyncService: resolver.services.onstartAsyncService,
onstartWalletService: resolver.services.onstartWalletService,
transactionStateService: resolver.services.transactionStateService,
connectionsService: resolver.services.connectionsService,
Expand All @@ -38,8 +37,11 @@ struct GemApp: App {
walletService: resolver.services.walletService,
walletsService: resolver.services.walletsService,
nameService: resolver.services.nameService,
releaseAlertService: resolver.services.releaseAlertService,
rateService: resolver.services.rateService,
eventPresenterService: resolver.services.eventPresenterService,
avatarService: resolver.services.avatarService
avatarService: resolver.services.avatarService,
deviceService: resolver.services.deviceService
)
)
.inject(resolver: resolver)
Expand All @@ -53,6 +55,9 @@ class AppDelegate: NSObject, UIApplicationDelegate, UIWindowSceneDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
AppResolver.main.services.onstartService.configure()
Task {
await AppResolver.main.services.onstartAsyncService.run()
}
return true
}

Expand Down
6 changes: 6 additions & 0 deletions Gem/Services/AppResolver+Services.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ extension AppResolver {
let swapService: SwapService
let subscriptionsService: SubscriptionService
let appReleaseService: AppReleaseService
let releaseAlertService: ReleaseAlertService
let rateService: RateService
let deviceObserverService: DeviceObserverService
let onstartService: OnstartService
let onstartAsyncService: OnstartAsyncService
Expand Down Expand Up @@ -91,6 +93,8 @@ extension AppResolver {
avatarService: AvatarService,
swapService: SwapService,
appReleaseService: AppReleaseService,
releaseAlertService: ReleaseAlertService,
rateService: RateService,
subscriptionsService: SubscriptionService,
deviceObserverService: DeviceObserverService,
onstartService: OnstartService,
Expand Down Expand Up @@ -128,6 +132,8 @@ extension AppResolver {
self.avatarService = avatarService
self.swapService = swapService
self.appReleaseService = appReleaseService
self.releaseAlertService = releaseAlertService
self.rateService = rateService
self.deviceObserverService = deviceObserverService
self.subscriptionsService = subscriptionsService
self.onstartService = onstartService
Expand Down
43 changes: 26 additions & 17 deletions Gem/Services/ServicesFactory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ struct ServicesFactory {

let configService = GemAPIService()
let releaseService = AppReleaseService(configService: configService)
let releaseAlertService = ReleaseAlertService(
appReleaseService: releaseService,
preferences: preferences
)
let rateService = RateService(preferences: preferences)

let onStartService = Self.makeOnstartService(
assetStore: storeManager.assetStore,
Expand All @@ -164,17 +169,14 @@ struct ServicesFactory {
walletService: walletService
)
let onstartAsyncService = Self.makeOnstartAsyncService(
assetStore: storeManager.assetStore,
nodeStore: storeManager.nodeStore,
nodeService: nodeService,
preferences: preferences,
assetsService: assetsService,
deviceService: deviceService,
bannerSetupService: BannerSetupService(
store: storeManager.bannerStore,
preferences: preferences
),
configService: configService,
releaseService: AppReleaseService(configService: configService),
swappableChainsProvider: swapService
)
let onstartWalletService = Self.makeOnstartWalletService(
Expand Down Expand Up @@ -246,6 +248,8 @@ struct ServicesFactory {
avatarService: avatarService,
swapService: swapService,
appReleaseService: releaseService,
releaseAlertService: releaseAlertService,
rateService: rateService,
subscriptionsService: subscriptionService,
deviceObserverService: deviceObserverService,
onstartService: onStartService,
Expand Down Expand Up @@ -461,26 +465,31 @@ extension ServicesFactory {
}

private static func makeOnstartAsyncService(
assetStore: AssetStore,
nodeStore: NodeStore,
nodeService: NodeService,
preferences: Preferences,
assetsService: AssetsService,
deviceService: DeviceService,
bannerSetupService: BannerSetupService,
configService: any GemAPIConfigService,
releaseService: AppReleaseService,
swappableChainsProvider: any SwappableChainsProvider
) -> OnstartAsyncService {
OnstartAsyncService(
assetStore: assetStore,
nodeStore: nodeStore,
preferences: preferences,
let importAssetsService = ImportAssetsService(
assetsService: assetsService,
deviceService: deviceService,
bannerSetupService: bannerSetupService,
configService: configService,
releaseService: releaseService,
swappableChainsProvider: swappableChainsProvider
assetStore: assetsService.assetStore,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The assetStore is being passed to ImportAssetsService here, but assetsService (passed on the previous line) already contains a public assetStore property. This is redundant. For cleaner dependency injection, consider refactoring ImportAssetsService to only take assetsService and access the store via assetsService.assetStore. This would simplify its initialization here.

preferences: preferences
)

return OnstartAsyncService(
runners: [
BannerSetupRunner(bannerSetupService: bannerSetupService),
NodeImportRunner(nodeService: nodeService),
AssetsUpdateRunner(
configService: configService,
importAssetsService: importAssetsService,
assetsService: assetsService,
swappableChainsProvider: swappableChainsProvider,
preferences: preferences
),
]
)
}

Expand Down
87 changes: 43 additions & 44 deletions Gem/ViewModels/RootSceneViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import Components
import DeviceService
import EventPresenterService
import Foundation
import GemstonePrimitives
import LockManager
import Localization
import NameService
import Onboarding
import Primitives
import SwiftUI
Expand All @@ -16,20 +16,21 @@ import TransactionsService
import WalletConnector
import WalletService
import WalletsService
import NameService
import AvatarService

@Observable
@MainActor
final class RootSceneViewModel {
private let onstartAsyncService: OnstartAsyncService
private let onstartWalletService: OnstartWalletService
private let transactionStateService: TransactionStateService
private let connectionsService: ConnectionsService
private let deviceObserverService: DeviceObserverService
private let notificationHandler: NotificationHandler
private let walletsService: WalletsService
private let releaseAlertService: ReleaseAlertService
private let rateService: RateService
private let eventPresenterService: EventPresenterService
private let deviceService: DeviceService

let walletService: WalletService
let nameService: NameService
Expand Down Expand Up @@ -66,7 +67,6 @@ final class RootSceneViewModel {

init(
walletConnectorPresenter: WalletConnectorPresenter,
onstartAsyncService: OnstartAsyncService,
onstartWalletService: OnstartWalletService,
transactionStateService: TransactionStateService,
connectionsService: ConnectionsService,
Expand All @@ -76,11 +76,13 @@ final class RootSceneViewModel {
walletService: WalletService,
walletsService: WalletsService,
nameService: NameService,
releaseAlertService: ReleaseAlertService,
rateService: RateService,
eventPresenterService: EventPresenterService,
avatarService: AvatarService
avatarService: AvatarService,
deviceService: DeviceService
) {
self.walletConnectorPresenter = walletConnectorPresenter
self.onstartAsyncService = onstartAsyncService
self.onstartWalletService = onstartWalletService
self.transactionStateService = transactionStateService
self.connectionsService = connectionsService
Expand All @@ -90,26 +92,24 @@ final class RootSceneViewModel {
self.walletService = walletService
self.walletsService = walletsService
self.nameService = nameService
self.releaseAlertService = releaseAlertService
self.rateService = rateService
self.eventPresenterService = eventPresenterService
self.avatarService = avatarService
self.deviceService = deviceService
}
}

// MARK: - Business Logic

extension RootSceneViewModel {
func setup() {
onstartAsyncService.releaseAction = { [weak self] in
self?.setupUpdateReleaseAlert($0)
}
onstartAsyncService.setup()
rateService.perform()
Task { await checkForUpdate() }
Task { try await deviceService.update() }
transactionStateService.setup()
Task {
try await connectionsService.setup()
}
Task {
try await deviceObserverService.startSubscriptionsObserver()
}
Task { try await connectionsService.setup() }
Task { try await deviceObserverService.startSubscriptionsObserver() }
}
}

Expand Down Expand Up @@ -158,49 +158,48 @@ extension RootSceneViewModel {
isPresentingConnectorError = error.localizedDescription
}
}

private func setupUpdateReleaseAlert(_ release: Release) {
}

// MARK: - Private

extension RootSceneViewModel {
private func setup(wallet: Wallet) {
onstartWalletService.setup(wallet: wallet)
do {
try walletsService.setup(wallet: wallet)
} catch {
debugLog("RootSceneViewModel setupWallet error: \(error)")
}
}

private func checkForUpdate() async {
guard let release = await releaseAlertService.checkForUpdate() else { return }
updateVersionAlertMessage = makeUpdateAlert(for: release)
}
Comment on lines +175 to +178
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Following the proposed change in ReleaseAlertService.checkForUpdate() to make it a throwing function, this call site should be updated to handle potential errors, for instance by logging them. This improves error diagnostics for failures in checking for app updates.

    private func checkForUpdate() async {
        do {
            guard let release = try await releaseAlertService.checkForUpdate() else { return }
            updateVersionAlertMessage = makeUpdateAlert(for: release)
        } catch {
            debugLog("Failed to check for app update: \(error)")
        }
    }


private func makeUpdateAlert(for release: Release) -> AlertMessage {
let skipAction = AlertAction(
title: Localized.Common.skip,
role: .cancel,
action: { [weak self] in
Task { @MainActor in
self?.onstartAsyncService.skipRelease(release.version)
}
action: { [releaseAlertService] in
releaseAlertService.skipRelease(release)
}
)
let updateAction = AlertAction(
title: Localized.UpdateApp.action,
isDefaultAction: true,
action: {
action: { [releaseAlertService] in
Task { @MainActor in
UIApplication.shared.open(PublicConstants.url(.appStore))
releaseAlertService.openAppStore()
}
}
)
let actions = if release.upgradeRequired {
[updateAction]
} else {
[skipAction, updateAction]
}

updateVersionAlertMessage = AlertMessage(
let actions = release.upgradeRequired ? [updateAction] : [skipAction, updateAction]

return AlertMessage(
title: Localized.UpdateApp.title,
message: Localized.UpdateApp.description(release.version),
actions: actions
)
}
}

// MARK: - Private

extension RootSceneViewModel {
private func setup(wallet: Wallet) {
onstartWalletService.setup(wallet: wallet)
do {
try walletsService.setup(wallet: wallet)
} catch {
debugLog("RootSceneViewModel setupWallet error: \(error)")
}
}
}
4 changes: 4 additions & 0 deletions Packages/ChainServices/NodeService/NodeService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ public final class NodeService: Sendable {
requestedChains.insert(chain)
*/
}

public func importDefaultNodes() throws {
try AddNodeService(nodeStore: nodeStore).addNodes()
}
}

// MARK: - NodeURLFetchable
Expand Down
Loading
Loading