crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

AppActions.swift (3053B)


      1 import Foundation
      2 import SwiftUI
      3 
      4 @MainActor
      5 final class AppActions {
      6     private unowned let services: AppServices
      7 
      8     init(services: AppServices) {
      9         self.services = services
     10     }
     11 
     12     func resetDatabase() async {
     13         do {
     14             try await services.cloudService.resetAllData()
     15         } catch {
     16             services.announcements.post(Announcement(
     17                 id: "reset-database-error",
     18                 scope: .global,
     19                 severity: .error,
     20                 title: "Resetting Failed",
     21                 body: error.localizedDescription,
     22                 dismissal: .manual
     23             ))
     24         }
     25     }
     26 
     27     func inviteFriend(gameID: UUID, friendAuthorID: String) async throws {
     28         do {
     29             try await services.invites.inviteFriend(
     30                 gameID: gameID,
     31                 friendAuthorID: friendAuthorID
     32             )
     33             services.friendInviteRecency.recordInvite(to: friendAuthorID)
     34         } catch let error as SyncEngine.PingOutboxError {
     35             if error == .deliveryPending {
     36                 services.friendInviteRecency.recordInvite(to: friendAuthorID)
     37             }
     38             throw error
     39         }
     40     }
     41 
     42     var recentFriendInviteRanks: [String: Int] {
     43         services.friendInviteRecency.ranksByAuthorID
     44     }
     45 
     46     func inviteDelivery(gameID: UUID, friendAuthorID: String) -> InviteDelivery {
     47         services.inviteDeliveries.delivery(
     48             gameID: gameID,
     49             friendAuthorID: friendAuthorID
     50         )
     51     }
     52 
     53     func markInviteFailed(gameID: UUID, friendAuthorID: String, error: Error) {
     54         services.inviteDeliveries.markFailed(
     55             recordName: nil,
     56             gameID: gameID,
     57             friendAuthorID: friendAuthorID,
     58             failure: InviteDeliveryFailure(error: error)
     59         )
     60     }
     61 
     62     func acceptInvite(shareURL: String, pingRecordName: String) async throws {
     63         _ = try await services.invites.acceptInvite(
     64             shareURL: shareURL,
     65             pingRecordName: pingRecordName
     66         )
     67     }
     68 
     69     func declineInvite(gameID: UUID) async throws {
     70         try await services.invites.declineInvite(gameID: gameID)
     71     }
     72 
     73     func blockFriend(authorID: String) async {
     74         await services.invites.blockFriend(authorID: authorID)
     75     }
     76 
     77     func unblockFriend(authorID: String) async {
     78         await services.invites.unblockFriend(authorID: authorID)
     79     }
     80 
     81     func renameFriend(authorID: String, nickname: String) async {
     82         do {
     83             try await services.friendController.setNickname(
     84                 friendAuthorID: authorID,
     85                 nickname: nickname
     86             )
     87         } catch {
     88             services.announcements.post(Announcement(
     89                 id: "rename-friend-error-\(authorID)",
     90                 scope: .global,
     91                 severity: .error,
     92                 title: "Renaming Failed",
     93                 body: error.localizedDescription,
     94                 dismissal: .manual
     95             ))
     96         }
     97     }
     98 
     99 }
    100 
    101 extension EnvironmentValues {
    102     @Entry var appActions: AppActions? = nil
    103 }