From e99a66875cbd3f322827bf80d67830bb6485e3b6 Mon Sep 17 00:00:00 2001 From: dankinsoid <30962149+dankinsoid@users.noreply.github.com> Date: Tue, 12 Mar 2024 14:56:42 +0300 Subject: [PATCH] 0.23.0 --- .../UserInterfaceState.xcuserstate | Bin 104632 -> 108001 bytes Examples/Search/Search/SearchView.swift | 2 +- Examples/SpeechRecognition/README.md | 5 + .../project.pbxproj | 512 +++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 14 + .../UserInterfaceState.xcuserstate | Bin 0 -> 37351 bytes .../xcschemes/SpeechRecognition.xcscheme | 88 +++ .../xcschemes/xcschememanagement.plist | 14 + .../AppIcon.appiconset/AppIcon-60@2x.png | Bin 0 -> 7569 bytes .../AppIcon.appiconset/AppIcon-76@2x.png | Bin 0 -> 9893 bytes .../AppIcon.appiconset/AppIcon-iPadPro@2x.png | Bin 0 -> 15226 bytes .../AppIcon.appiconset/AppIcon.png | Bin 0 -> 8460 bytes .../AppIcon.appiconset/Contents.json | 103 +++ .../AppIcon.appiconset/transparent.png | Bin 0 -> 221 bytes .../Assets.xcassets/Contents.json | 6 + .../SpeechRecognition/Info.plist | 64 ++ .../SpeechClient/Client.swift | 94 +++ .../SpeechRecognition/SpeechClient/Live.swift | 97 +++ .../SpeechClient/Models.swift | 94 +++ .../SpeechRecognition/SpeechRecognition.swift | 141 ++++ .../SpeechRecognitionApp.swift | 11 + .../SpeechRecognitionTests.swift | 135 ++++ Examples/SyncUps/README.md | 64 ++ .../SyncUps/SyncUps.xcodeproj/project.pbxproj | 707 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 176 +++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 19506 bytes .../xcshareddata/xcschemes/SyncUps.xcscheme | 104 +++ .../xcschemes/xcschememanagement.plist | 35 + Examples/SyncUps/SyncUps.xctestplan | 36 + Examples/SyncUps/SyncUps/App.swift | 29 + Examples/SyncUps/SyncUps/AppFeature.swift | 128 ++++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../SyncUps/Assets.xcassets/Contents.json | 6 + .../Assets.xcassets/Themes/Contents.json | 6 + .../Themes/bubblegum.colorset/Contents.json | 38 + .../Themes/buttercup.colorset/Contents.json | 38 + .../Themes/indigo.colorset/Contents.json | 38 + .../Themes/lavender.colorset/Contents.json | 38 + .../Themes/magenta.colorset/Contents.json | 38 + .../Themes/navy.colorset/Contents.json | 38 + .../Themes/orange.colorset/Contents.json | 38 + .../Themes/oxblood.colorset/Contents.json | 38 + .../Themes/periwinkle.colorset/Contents.json | 38 + .../Themes/poppy.colorset/Contents.json | 38 + .../Themes/purple.colorset/Contents.json | 38 + .../Themes/seafoam.colorset/Contents.json | 38 + .../Themes/sky.colorset/Contents.json | 38 + .../Themes/tan.colorset/Contents.json | 38 + .../Themes/teal.colorset/Contents.json | 38 + .../Themes/yellow.colorset/Contents.json | 38 + .../SyncUps/Dependencies/DataManager.swift | 57 ++ .../SyncUps/Dependencies/OpenSettings.swift | 19 + .../Dependencies/SpeechRecognizer.swift | 192 +++++ Examples/SyncUps/SyncUps/Meeting.swift | 27 + Examples/SyncUps/SyncUps/Models.swift | 115 +++ Examples/SyncUps/SyncUps/RecordMeeting.swift | 390 ++++++++++ Examples/SyncUps/SyncUps/Resources/ding.wav | Bin 0 -> 535904 bytes Examples/SyncUps/SyncUps/SyncUpDetail.swift | 279 +++++++ Examples/SyncUps/SyncUps/SyncUpForm.swift | 138 ++++ Examples/SyncUps/SyncUps/SyncUpsList.swift | 233 ++++++ .../SyncUpsTests/AppFeatureTests.swift | 144 ++++ .../SyncUpsTests/RecordMeetingTests.swift | 373 +++++++++ .../SyncUpsTests/SyncUpDetailTests.swift | 138 ++++ .../SyncUpsTests/SyncUpFormTests.swift | 91 +++ .../SyncUpsTests/SyncUpsListTests.swift | 116 +++ .../SyncUpsUITests/SyncUpsUITests.swift | 46 ++ .../AppIcon.appiconset/AppIcon-60@2x.png | Bin 0 -> 7569 bytes .../AppIcon.appiconset/AppIcon-76@2x.png | Bin 0 -> 9893 bytes .../AppIcon.appiconset/AppIcon-iPadPro@2x.png | Bin 0 -> 15226 bytes .../AppIcon.appiconset/AppIcon.png | Bin 0 -> 8460 bytes .../AppIcon.appiconset/Contents.json | 103 +++ .../AppIcon.appiconset/transparent.png | Bin 0 -> 221 bytes .../App/Assets.xcassets/Contents.json | 6 + Examples/TicTacToe/App/RootView.swift | 61 ++ Examples/TicTacToe/App/TicTacToeApp.swift | 10 + Examples/TicTacToe/README.md | 21 + .../TicTacToe.xcodeproj/project.pbxproj | 358 +++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/TicTacToe.xcscheme | 128 ++++ Examples/TicTacToe/tic-tac-toe/.gitignore | 7 + Examples/TicTacToe/tic-tac-toe/Package.swift | 177 +++++ .../tic-tac-toe/Sources/AppCore/AppCore.swift | 39 + .../Sources/AppSwiftUI/AppView.swift | 26 + .../Sources/AppUIKit/AppViewController.swift | 52 ++ .../AuthenticationClient.swift | 52 ++ .../LiveAuthenticationClient.swift | 27 + .../Sources/GameCore/GameCore.swift | 122 +++ .../tic-tac-toe/Sources/GameCore/Three.swift | 47 ++ .../Sources/GameSwiftUI/GameView.swift | 93 +++ .../GameUIKit/GameViewController.swift | 154 ++++ .../Sources/LoginCore/LoginCore.swift | 83 ++ .../Sources/LoginSwiftUI/LoginView.swift | 85 +++ .../LoginUIKit/LoginViewController.swift | 158 ++++ .../Sources/NewGameCore/NewGameCore.swift | 49 ++ .../Sources/NewGameSwiftUI/NewGameView.swift | 61 ++ .../NewGameUIKit/NewGameViewController.swift | 128 ++++ .../Sources/TwoFactorCore/TwoFactorCore.swift | 74 ++ .../TwoFactorSwiftUI/TwoFactorView.swift | 69 ++ .../TwoFactorViewController.swift | 92 +++ .../Tests/AppCoreTests/AppCoreTests.swift | 83 ++ .../Tests/GameCoreTests/GameCoreTests.swift | 83 ++ .../Tests/LoginCoreTests/LoginCoreTests.swift | 88 +++ .../NewGameCoreTests/NewGameCoreTests.swift | 37 + .../TwoFactorCoreTests.swift | 66 ++ Examples/Todos/README.md | 8 + .../Todos/Todos.xcodeproj/project.pbxproj | 504 +++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Todos.xcscheme | 88 +++ .../AppIcon.appiconset/AppIcon-60@2x.png | Bin 0 -> 7569 bytes .../AppIcon.appiconset/AppIcon-76@2x.png | Bin 0 -> 9893 bytes .../AppIcon.appiconset/AppIcon-iPadPro@2x.png | Bin 0 -> 15226 bytes .../AppIcon.appiconset/AppIcon.png | Bin 0 -> 8460 bytes .../AppIcon.appiconset/Contents.json | 103 +++ .../AppIcon.appiconset/transparent.png | Bin 0 -> 221 bytes .../Todos/Todos/Assets.xcassets/Contents.json | 6 + Examples/Todos/Todos/Todo.swift | 38 + Examples/Todos/Todos/Todos.swift | 169 +++++ Examples/Todos/Todos/TodosApp.swift | 15 + Examples/Todos/TodosTests/TodosTests.swift | 353 +++++++++ Examples/VoiceMemos/README.md | 9 + .../VoiceMemos.xcodeproj/project.pbxproj | 543 ++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/VoiceMemos.xcscheme | 88 +++ .../AppIcon.appiconset/AppIcon-60@2x.png | Bin 0 -> 7569 bytes .../AppIcon.appiconset/AppIcon-76@2x.png | Bin 0 -> 9893 bytes .../AppIcon.appiconset/AppIcon-iPadPro@2x.png | Bin 0 -> 15226 bytes .../AppIcon.appiconset/AppIcon.png | Bin 0 -> 8460 bytes .../AppIcon.appiconset/Contents.json | 103 +++ .../AppIcon.appiconset/transparent.png | Bin 0 -> 221 bytes .../VoiceMemos/Assets.xcassets/Contents.json | 6 + .../AudioPlayerClient/AudioPlayerClient.swift | 25 + .../LiveAudioPlayerClient.swift | 54 ++ .../AudioRecorderClient.swift | 43 ++ .../LiveAudioRecorderClient.swift | 103 +++ .../VoiceMemos/VoiceMemos/Dependencies.swift | 28 + Examples/VoiceMemos/VoiceMemos/Helpers.swift | 8 + Examples/VoiceMemos/VoiceMemos/Info.plist | 62 ++ .../VoiceMemos/VoiceMemos/RecordingMemo.swift | 122 +++ .../VoiceMemos/VoiceMemos/VoiceMemo.swift | 145 ++++ .../VoiceMemos/VoiceMemos/VoiceMemos.swift | 229 ++++++ .../VoiceMemos/VoiceMemos/VoiceMemosApp.swift | 15 + .../VoiceMemosTests/VoiceMemosTests.swift | 457 +++++++++++ README.md | 2 +- Sources/VDStore/Store.swift | 12 +- Sources/VDStore/ViewStore.swift | 2 +- 153 files changed, 11706 insertions(+), 9 deletions(-) create mode 100644 Examples/SpeechRecognition/README.md create mode 100644 Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.pbxproj create mode 100644 Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Examples/SpeechRecognition/SpeechRecognition.xcodeproj/xcshareddata/xcschemes/SpeechRecognition.xcscheme create mode 100644 Examples/SpeechRecognition/SpeechRecognition.xcodeproj/xcuserdata/danil.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png create mode 100644 Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png create mode 100644 Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png create mode 100644 Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon.png create mode 100644 Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/transparent.png create mode 100644 Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/Contents.json create mode 100644 Examples/SpeechRecognition/SpeechRecognition/Info.plist create mode 100644 Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Client.swift create mode 100644 Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Live.swift create mode 100644 Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Models.swift create mode 100644 Examples/SpeechRecognition/SpeechRecognition/SpeechRecognition.swift create mode 100644 Examples/SpeechRecognition/SpeechRecognition/SpeechRecognitionApp.swift create mode 100644 Examples/SpeechRecognition/SpeechRecognitionTests/SpeechRecognitionTests.swift create mode 100644 Examples/SyncUps/README.md create mode 100644 Examples/SyncUps/SyncUps.xcodeproj/project.pbxproj create mode 100644 Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Examples/SyncUps/SyncUps.xcodeproj/xcshareddata/xcschemes/SyncUps.xcscheme create mode 100644 Examples/SyncUps/SyncUps.xcodeproj/xcuserdata/danil.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Examples/SyncUps/SyncUps.xctestplan create mode 100644 Examples/SyncUps/SyncUps/App.swift create mode 100644 Examples/SyncUps/SyncUps/AppFeature.swift create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/bubblegum.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/buttercup.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/indigo.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/lavender.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/magenta.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/navy.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/orange.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/oxblood.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/periwinkle.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/poppy.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/purple.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/seafoam.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/sky.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/tan.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/teal.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Assets.xcassets/Themes/yellow.colorset/Contents.json create mode 100644 Examples/SyncUps/SyncUps/Dependencies/DataManager.swift create mode 100644 Examples/SyncUps/SyncUps/Dependencies/OpenSettings.swift create mode 100644 Examples/SyncUps/SyncUps/Dependencies/SpeechRecognizer.swift create mode 100644 Examples/SyncUps/SyncUps/Meeting.swift create mode 100644 Examples/SyncUps/SyncUps/Models.swift create mode 100644 Examples/SyncUps/SyncUps/RecordMeeting.swift create mode 100644 Examples/SyncUps/SyncUps/Resources/ding.wav create mode 100644 Examples/SyncUps/SyncUps/SyncUpDetail.swift create mode 100644 Examples/SyncUps/SyncUps/SyncUpForm.swift create mode 100644 Examples/SyncUps/SyncUps/SyncUpsList.swift create mode 100644 Examples/SyncUps/SyncUpsTests/AppFeatureTests.swift create mode 100644 Examples/SyncUps/SyncUpsTests/RecordMeetingTests.swift create mode 100644 Examples/SyncUps/SyncUpsTests/SyncUpDetailTests.swift create mode 100644 Examples/SyncUps/SyncUpsTests/SyncUpFormTests.swift create mode 100644 Examples/SyncUps/SyncUpsTests/SyncUpsListTests.swift create mode 100644 Examples/SyncUps/SyncUpsUITests/SyncUpsUITests.swift create mode 100644 Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png create mode 100644 Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png create mode 100644 Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png create mode 100644 Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon.png create mode 100644 Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/transparent.png create mode 100644 Examples/TicTacToe/App/Assets.xcassets/Contents.json create mode 100644 Examples/TicTacToe/App/RootView.swift create mode 100644 Examples/TicTacToe/App/TicTacToeApp.swift create mode 100644 Examples/TicTacToe/README.md create mode 100644 Examples/TicTacToe/TicTacToe.xcodeproj/project.pbxproj create mode 100644 Examples/TicTacToe/TicTacToe.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Examples/TicTacToe/TicTacToe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Examples/TicTacToe/TicTacToe.xcodeproj/xcshareddata/xcschemes/TicTacToe.xcscheme create mode 100644 Examples/TicTacToe/tic-tac-toe/.gitignore create mode 100644 Examples/TicTacToe/tic-tac-toe/Package.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/AppCore/AppCore.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/AppSwiftUI/AppView.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/AppUIKit/AppViewController.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/AuthenticationClient/AuthenticationClient.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/AuthenticationClientLive/LiveAuthenticationClient.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/GameCore/GameCore.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/GameCore/Three.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/GameSwiftUI/GameView.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/GameUIKit/GameViewController.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/LoginCore/LoginCore.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/LoginSwiftUI/LoginView.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/LoginUIKit/LoginViewController.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/NewGameCore/NewGameCore.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/NewGameSwiftUI/NewGameView.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/NewGameUIKit/NewGameViewController.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorCore/TwoFactorCore.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorSwiftUI/TwoFactorView.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorUIKit/TwoFactorViewController.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Tests/AppCoreTests/AppCoreTests.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Tests/GameCoreTests/GameCoreTests.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Tests/LoginCoreTests/LoginCoreTests.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Tests/NewGameCoreTests/NewGameCoreTests.swift create mode 100644 Examples/TicTacToe/tic-tac-toe/Tests/TwoFactorCoreTests/TwoFactorCoreTests.swift create mode 100644 Examples/Todos/README.md create mode 100644 Examples/Todos/Todos.xcodeproj/project.pbxproj create mode 100644 Examples/Todos/Todos.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Examples/Todos/Todos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Examples/Todos/Todos.xcodeproj/xcshareddata/xcschemes/Todos.xcscheme create mode 100644 Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png create mode 100644 Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png create mode 100644 Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png create mode 100644 Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon.png create mode 100644 Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/transparent.png create mode 100644 Examples/Todos/Todos/Assets.xcassets/Contents.json create mode 100644 Examples/Todos/Todos/Todo.swift create mode 100644 Examples/Todos/Todos/Todos.swift create mode 100644 Examples/Todos/Todos/TodosApp.swift create mode 100644 Examples/Todos/TodosTests/TodosTests.swift create mode 100644 Examples/VoiceMemos/README.md create mode 100644 Examples/VoiceMemos/VoiceMemos.xcodeproj/project.pbxproj create mode 100644 Examples/VoiceMemos/VoiceMemos.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Examples/VoiceMemos/VoiceMemos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Examples/VoiceMemos/VoiceMemos.xcodeproj/xcshareddata/xcschemes/VoiceMemos.xcscheme create mode 100644 Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png create mode 100644 Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png create mode 100644 Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png create mode 100644 Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon.png create mode 100644 Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/transparent.png create mode 100644 Examples/VoiceMemos/VoiceMemos/Assets.xcassets/Contents.json create mode 100644 Examples/VoiceMemos/VoiceMemos/AudioPlayerClient/AudioPlayerClient.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/AudioPlayerClient/LiveAudioPlayerClient.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/AudioRecorderClient/AudioRecorderClient.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/AudioRecorderClient/LiveAudioRecorderClient.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/Dependencies.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/Helpers.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/Info.plist create mode 100644 Examples/VoiceMemos/VoiceMemos/RecordingMemo.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/VoiceMemo.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/VoiceMemos.swift create mode 100644 Examples/VoiceMemos/VoiceMemos/VoiceMemosApp.swift create mode 100644 Examples/VoiceMemos/VoiceMemosTests/VoiceMemosTests.swift diff --git a/Examples/Search/Search.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate b/Examples/Search/Search.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate index fc9b4e71b8b04d528b909f0ed8fdce97332896c4..ae26b94a902d05e3f145c6249a822c2c2d4637fe 100644 GIT binary patch literal 108001 zcmeGF2YeJ&_dkx$z0+rBcV{=-LkYd6ca)L}kxoJ{F(eBF(#$46M0BnldoS2XK$Kv| zUa>0{6a>523pT9S{hd3rlR^T*^XTXQd|!X{m1TEk?z!!K-uK*l&porSuBtN9kd*Wa zgBZ-P49D<{z=(`8tN-$FeWbFsW_JIw`tl`}@T;VMLv7ux{&uN4L5pA7f)w#?J(pAd|=>G098{lggwq=}ZQb$z(B; zn90l(W-2p{DP~HT>C6mfCNqnvVyc-Mrk1H=j$`VX2-Cpm3}H@YPGL@E&ScJG&Sx%V zE@Rd*S263D^~?t5Hs*Hb4rU8;Cvz9`0P`TTm3fqTnc2bYWL{x*F}s;pnb(-tnKzh^ znNOHcna`NL%s%ED=3C}F=4a*?<`3pi#3KPI$cAE&2YFE+)ED(b{m}q45Dh|uQ3}dL zN1@Ru59Ol*RD_N}Gtf*l3(ZDz&;nG7!e|j%ik6{O=mfMHorq3CIwI&~bRIe%U4Sk` z7op40<>)GOHM$P1M;p-fXd}7_-HdKSx1)Q|y=W_X6g`ICLT{sY&>r+IdJnyiK0qI$ zkI={H6Z8ezhrU7Iq8~BFEEcgHJFpvjuouVT9ykv7#{=*X9FLQ64$j4SI3E|_LOd2v z#nW&xF2M_M4Q|A%F~KL})A1SjYM*J{-1aHNU;>Ymg z_zC+CE z%lg?^wg(%>_GbsML)aWPm(64I*#fqZ9m|emi`Zk>@$6)F20N3T&n{pWv5VOyY$dyt zt!E=_1G}0%l|73+k3FBgn7y36g1wr(hHYkB*!$TB*az8%*oWCi*sbiN>|^ZX>=W!W z>~{7g_GR`}_BHlh_C5A}_5=1q_6zn)_A7Qj`v-?PffG52Q#p-uac(Y#>%sNohI2_= zGMCO}a3i>*xY67gE}t96P2eVSQ@KiRDYuNP;;OkCu9mCgj^paN2)BYekvoYyjXRw? zk2{~cfV+^pl3UAN#a+!^&)vk`$=%D{$KB68%ss|E#cktW}g6KY?G(6aGwo4Szm=0e=O5CBK%xiocrQz+caA z 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 J@1cov{|A!&KMeo? literal 104632 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 VpE>{iXY$Vw8e*hQ#=wJW< diff --git a/Examples/Search/Search/SearchView.swift b/Examples/Search/Search/SearchView.swift index 87bcf2c..e7ecd1f 100644 --- a/Examples/Search/Search/SearchView.swift +++ b/Examples/Search/Search/SearchView.swift @@ -23,7 +23,7 @@ struct SearchView: View { Image(systemName: "magnifyingglass") TextField( "New York, San Francisco, ...", - text: Binding { + text: Binding { state.searchQuery } set: { text in $state.searchQueryChanged(query: text) diff --git a/Examples/SpeechRecognition/README.md b/Examples/SpeechRecognition/README.md new file mode 100644 index 0000000..aa37a25 --- /dev/null +++ b/Examples/SpeechRecognition/README.md @@ -0,0 +1,5 @@ +# Speech Recognition + +This application demonstrates how to work with a complex dependency in the VDStore. It uses the `SFSpeechRecognizer` API from the `Speech` framework to listen to audio on the device and live-transcribe it to the UI. + +The `SFSpeechRecognizer` class is a complex dependency, and if we used it freely in our application we wouldn't be able to test any of that code. So, instead, we wrap the API in a `SpeechClient` type that exposes asynchronous endpoints for accessing the underlying `SFSpeechRecognizer` class. Then we can use it in the reducer in an understandable way, _and_ we can write tests for the reducer. diff --git a/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.pbxproj b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.pbxproj new file mode 100644 index 0000000..eae364d --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.pbxproj @@ -0,0 +1,512 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 831767FF2BA0724F00F199F0 /* VDStore in Frameworks */ = {isa = PBXBuildFile; productRef = 831767FE2BA0724F00F199F0 /* VDStore */; }; + CA2332102447ACFA00B818EB /* SpeechRecognitionApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA23320F2447ACFA00B818EB /* SpeechRecognitionApp.swift */; }; + CA2332122447ACFA00B818EB /* SpeechRecognition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2332112447ACFA00B818EB /* SpeechRecognition.swift */; }; + CA2332142447ACFB00B818EB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CA2332132447ACFB00B818EB /* Assets.xcassets */; }; + CA2332252447ACFC00B818EB /* SpeechRecognitionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2332242447ACFC00B818EB /* SpeechRecognitionTests.swift */; }; + CACC04222447C66C000C5725 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = CACC04212447C66C000C5725 /* Client.swift */; }; + CACC04242447D96D000C5725 /* Live.swift in Sources */ = {isa = PBXBuildFile; fileRef = CACC04232447D96D000C5725 /* Live.swift */; }; + CACC04272447DBAF000C5725 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = CACC04262447DBAF000C5725 /* Models.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + CA2332212447ACFC00B818EB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CA2332022447ACFA00B818EB /* Project object */; + proxyType = 1; + remoteGlobalIDString = CA2332092447ACFA00B818EB; + remoteInfo = SpeechRecognition; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + CA2332352447AE1000B818EB /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + CA23323B2447AE1700B818EB /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + CA23320A2447ACFA00B818EB /* SpeechRecognition.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SpeechRecognition.app; sourceTree = BUILT_PRODUCTS_DIR; }; + CA23320F2447ACFA00B818EB /* SpeechRecognitionApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechRecognitionApp.swift; sourceTree = ""; }; + CA2332112447ACFA00B818EB /* SpeechRecognition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechRecognition.swift; sourceTree = ""; }; + CA2332132447ACFB00B818EB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + CA23321B2447ACFB00B818EB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CA2332202447ACFC00B818EB /* SpeechRecognitionTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SpeechRecognitionTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + CA2332242447ACFC00B818EB /* SpeechRecognitionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechRecognitionTests.swift; sourceTree = ""; }; + CA23322F2447AE0300B818EB /* VDStore */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "VDStore"; path = ../..; sourceTree = ""; }; + CACC04212447C66C000C5725 /* Client.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Client.swift; sourceTree = ""; }; + CACC04232447D96D000C5725 /* Live.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Live.swift; sourceTree = ""; }; + CACC04262447DBAF000C5725 /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = ""; }; + DCB9EA3F26B21ED000497C03 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CA2332072447ACFA00B818EB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 831767FF2BA0724F00F199F0 /* VDStore in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA23321D2447ACFC00B818EB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 831767FD2BA0724F00F199F0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + CA2332012447ACFA00B818EB = { + isa = PBXGroup; + children = ( + CA23322F2447AE0300B818EB /* VDStore */, + DCB9EA3F26B21ED000497C03 /* README.md */, + CA23320B2447ACFA00B818EB /* Products */, + CA23320C2447ACFA00B818EB /* SpeechRecognition */, + CA2332232447ACFC00B818EB /* SpeechRecognitionTests */, + 831767FD2BA0724F00F199F0 /* Frameworks */, + ); + sourceTree = ""; + }; + CA23320B2447ACFA00B818EB /* Products */ = { + isa = PBXGroup; + children = ( + CA23320A2447ACFA00B818EB /* SpeechRecognition.app */, + CA2332202447ACFC00B818EB /* SpeechRecognitionTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + CA23320C2447ACFA00B818EB /* SpeechRecognition */ = { + isa = PBXGroup; + children = ( + CACC04252447DBA3000C5725 /* SpeechClient */, + CA2332112447ACFA00B818EB /* SpeechRecognition.swift */, + CA23320F2447ACFA00B818EB /* SpeechRecognitionApp.swift */, + CA2332132447ACFB00B818EB /* Assets.xcassets */, + CA23321B2447ACFB00B818EB /* Info.plist */, + ); + path = SpeechRecognition; + sourceTree = ""; + }; + CA2332232447ACFC00B818EB /* SpeechRecognitionTests */ = { + isa = PBXGroup; + children = ( + CA2332242447ACFC00B818EB /* SpeechRecognitionTests.swift */, + ); + path = SpeechRecognitionTests; + sourceTree = ""; + }; + CACC04252447DBA3000C5725 /* SpeechClient */ = { + isa = PBXGroup; + children = ( + CACC04212447C66C000C5725 /* Client.swift */, + CACC04232447D96D000C5725 /* Live.swift */, + CACC04262447DBAF000C5725 /* Models.swift */, + ); + path = SpeechClient; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CA2332092447ACFA00B818EB /* SpeechRecognition */ = { + isa = PBXNativeTarget; + buildConfigurationList = CA2332292447ACFC00B818EB /* Build configuration list for PBXNativeTarget "SpeechRecognition" */; + buildPhases = ( + CA2332062447ACFA00B818EB /* Sources */, + CA2332072447ACFA00B818EB /* Frameworks */, + CA2332082447ACFA00B818EB /* Resources */, + CA2332352447AE1000B818EB /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SpeechRecognition; + packageProductDependencies = ( + 831767FE2BA0724F00F199F0 /* VDStore */, + ); + productName = SpeechRecognition; + productReference = CA23320A2447ACFA00B818EB /* SpeechRecognition.app */; + productType = "com.apple.product-type.application"; + }; + CA23321F2447ACFC00B818EB /* SpeechRecognitionTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = CA23322C2447ACFC00B818EB /* Build configuration list for PBXNativeTarget "SpeechRecognitionTests" */; + buildPhases = ( + CA23321C2447ACFC00B818EB /* Sources */, + CA23321D2447ACFC00B818EB /* Frameworks */, + CA23321E2447ACFC00B818EB /* Resources */, + CA23323B2447AE1700B818EB /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + CA2332222447ACFC00B818EB /* PBXTargetDependency */, + ); + name = SpeechRecognitionTests; + packageProductDependencies = ( + ); + productName = SpeechRecognitionTests; + productReference = CA2332202447ACFC00B818EB /* SpeechRecognitionTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CA2332022447ACFA00B818EB /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1140; + LastUpgradeCheck = 1240; + ORGANIZATIONNAME = "Brandon Williams"; + TargetAttributes = { + CA2332092447ACFA00B818EB = { + CreatedOnToolsVersion = 11.4; + }; + CA23321F2447ACFC00B818EB = { + CreatedOnToolsVersion = 11.4; + TestTargetID = CA2332092447ACFA00B818EB; + }; + }; + }; + buildConfigurationList = CA2332052447ACFA00B818EB /* Build configuration list for PBXProject "SpeechRecognition" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CA2332012447ACFA00B818EB; + packageReferences = ( + ); + productRefGroup = CA23320B2447ACFA00B818EB /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CA2332092447ACFA00B818EB /* SpeechRecognition */, + CA23321F2447ACFC00B818EB /* SpeechRecognitionTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CA2332082447ACFA00B818EB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA2332142447ACFB00B818EB /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA23321E2447ACFC00B818EB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CA2332062447ACFA00B818EB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CACC04242447D96D000C5725 /* Live.swift in Sources */, + CA2332102447ACFA00B818EB /* SpeechRecognitionApp.swift in Sources */, + CA2332122447ACFA00B818EB /* SpeechRecognition.swift in Sources */, + CACC04222447C66C000C5725 /* Client.swift in Sources */, + CACC04272447DBAF000C5725 /* Models.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA23321C2447ACFC00B818EB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA2332252447ACFC00B818EB /* SpeechRecognitionTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + CA2332222447ACFC00B818EB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = CA2332092447ACFA00B818EB /* SpeechRecognition */; + targetProxy = CA2332212447ACFC00B818EB /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + CA2332272447ACFC00B818EB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_STRICT_CONCURRENCY = complete; + }; + name = Debug; + }; + CA2332282447ACFC00B818EB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_STRICT_CONCURRENCY = complete; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + CA23322A2447ACFC00B818EB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = SpeechRecognition/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SpeechRecognition; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + CA23322B2447ACFC00B818EB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = SpeechRecognition/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SpeechRecognition; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + CA23322D2447ACFC00B818EB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = SpeechRecognition/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SpeechRecognitionTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SpeechRecognition.app/SpeechRecognition"; + }; + name = Debug; + }; + CA23322E2447ACFC00B818EB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = SpeechRecognition/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SpeechRecognitionTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SpeechRecognition.app/SpeechRecognition"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CA2332052447ACFA00B818EB /* Build configuration list for PBXProject "SpeechRecognition" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA2332272447ACFC00B818EB /* Debug */, + CA2332282447ACFC00B818EB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CA2332292447ACFC00B818EB /* Build configuration list for PBXNativeTarget "SpeechRecognition" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA23322A2447ACFC00B818EB /* Debug */, + CA23322B2447ACFC00B818EB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CA23322C2447ACFC00B818EB /* Build configuration list for PBXNativeTarget "SpeechRecognitionTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA23322D2447ACFC00B818EB /* Debug */, + CA23322E2447ACFC00B818EB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + 831767FE2BA0724F00F199F0 /* VDStore */ = { + isa = XCSwiftPackageProductDependency; + productName = VDStore; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = CA2332022447ACFA00B818EB /* Project object */; +} diff --git a/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..83c865b --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax", + "state" : { + "revision" : "64889f0c732f210a935a0ad7cda38f77f876262d", + "version" : "509.1.1" + } + } + ], + "version" : 2 +} diff --git a/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..f0b7d4c3776b2034f0ac37fab89da11e75e70863 GIT binary patch literal 37351 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 BzU}}3 literal 0 HcmV?d00001 diff --git a/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/xcshareddata/xcschemes/SpeechRecognition.xcscheme b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/xcshareddata/xcschemes/SpeechRecognition.xcscheme new file mode 100644 index 0000000..719fa5c --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/xcshareddata/xcschemes/SpeechRecognition.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/xcuserdata/danil.xcuserdatad/xcschemes/xcschememanagement.plist b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/xcuserdata/danil.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..ef111a4 --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition.xcodeproj/xcuserdata/danil.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + SpeechRecognition.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png b/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b1516e5a122b534ae5a9d14706d6248718aeb03a GIT binary patch literal 7569 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 literal 0 HcmV?d00001 diff --git a/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png b/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..869cd81f3aee14834f60b9fb9bb87b3ec53a2840 GIT binary patch literal 9893 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 XN$)>5c`(j700000NkvXXu0mjfLN#h7 literal 0 HcmV?d00001 diff --git a/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png b/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..94a32fd65c0f0b6cd8af035b2d10286b49c8732b GIT binary patch literal 15226 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 literal 0 HcmV?d00001 diff --git a/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..4f45077 --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,103 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "AppIcon.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-iPadPro@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "transparent.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/transparent.png b/Examples/SpeechRecognition/SpeechRecognition/Assets.xcassets/AppIcon.appiconset/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..bae1e0d7424038acc03d0981da831baf5752e49e GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7#M*hLwK5)9*|-x3GxeOU?`h>)&j_z=IP=X tQo;E4U?WJ$;RU~g + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + NSMicrophoneUsageDescription + Your microphone will be used to record your speech when you press the "Start Recording" button. + NSSpeechRecognitionUsageDescription + Speech recognition will be used to determine which words you speak into the device's microphone. + + diff --git a/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Client.swift b/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Client.swift new file mode 100644 index 0000000..22178ad --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Client.swift @@ -0,0 +1,94 @@ +import VDStore +import Speech + +struct SpeechClient { + + var finishTask: @Sendable () async -> Void = { } + var requestAuthorization: @Sendable () async -> SFSpeechRecognizerAuthorizationStatus = { .notDetermined } + var startTask: + @Sendable (_ request: SFSpeechAudioBufferRecognitionRequest) async -> AsyncThrowingStream< + SpeechRecognitionResult, Error + > = { _ in + AsyncThrowingStream { nil } + } + + enum Failure: Error, Equatable { + case taskError + case couldntStartAudioEngine + case couldntConfigureAudioSession + } +} + +extension SpeechClient { + + static var previewValue: Self { + let isRecording = ActorIsolated(false) + + return Self( + finishTask: { await isRecording.set(false) }, + requestAuthorization: { .authorized }, + startTask: { _ in + AsyncThrowingStream { continuation in + Task { + await isRecording.set(true) + var finalText = """ + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor \ + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ + exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute \ + irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \ + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui \ + officia deserunt mollit anim id est laborum. + """ + var text = "" + while await isRecording.value { + let word = finalText.prefix { $0 != " " } + try await Task.sleep(for: .milliseconds(word.count * 50 + .random(in: 0...200))) + finalText.removeFirst(word.count) + if finalText.first == " " { + finalText.removeFirst() + } + text += word + " " + continuation.yield( + SpeechRecognitionResult( + bestTranscription: Transcription( + formattedString: text, + segments: [] + ), + isFinal: false, + transcriptions: [] + ) + ) + } + } + } + } + ) + } +} + +final actor ActorIsolated { + + var value: T + + init(_ value: T) { + self.value = value + } + + func `set`(_ value: T) { + self.value = value + } +} + +extension StoreDIValues { + + var speechClient: SpeechClient { + get { + self[\.speechClient] ?? valueFor( + live: .liveValue, + test: SpeechClient(), + preview: .previewValue + ) + } + set { self[\.speechClient] = newValue } + } +} diff --git a/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Live.swift b/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Live.swift new file mode 100644 index 0000000..92d65d2 --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Live.swift @@ -0,0 +1,97 @@ +import VDStore +import Speech + +extension SpeechClient { + + static var liveValue: Self { + let speech = Speech() + return Self( + finishTask: { + await speech.finishTask() + }, + requestAuthorization: { + await withCheckedContinuation { continuation in + SFSpeechRecognizer.requestAuthorization { status in + continuation.resume(returning: status) + } + } + }, + startTask: { request in + await speech.startTask(request: request) + } + ) + } +} + +private actor Speech { + var audioEngine: AVAudioEngine? = nil + var recognitionTask: SFSpeechRecognitionTask? = nil + var recognitionContinuation: AsyncThrowingStream.Continuation? + + func finishTask() { + self.audioEngine?.stop() + self.audioEngine?.inputNode.removeTap(onBus: 0) + self.recognitionTask?.finish() + self.recognitionContinuation?.finish() + } + + func startTask( + request: SFSpeechAudioBufferRecognitionRequest + ) -> AsyncThrowingStream { + + return AsyncThrowingStream { continuation in + self.recognitionContinuation = continuation + let audioSession = AVAudioSession.sharedInstance() + do { + try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers) + try audioSession.setActive(true, options: .notifyOthersOnDeactivation) + } catch { + continuation.finish(throwing: SpeechClient.Failure.couldntConfigureAudioSession) + return + } + + self.audioEngine = AVAudioEngine() + let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))! + self.recognitionTask = speechRecognizer.recognitionTask(with: request) { result, error in + switch (result, error) { + case let (.some(result), _): + continuation.yield(SpeechRecognitionResult(result)) + case (_, .some): + continuation.finish(throwing: SpeechClient.Failure.taskError) + case (.none, .none): + fatalError("It should not be possible to have both a nil result and nil error.") + } + } + + continuation.onTermination = { + [ + speechRecognizer = speechRecognizer, + audioEngine = audioEngine, + recognitionTask = recognitionTask + ] + _ in + + _ = speechRecognizer + audioEngine?.stop() + audioEngine?.inputNode.removeTap(onBus: 0) + recognitionTask?.finish() + } + + self.audioEngine?.inputNode.installTap( + onBus: 0, + bufferSize: 1024, + format: self.audioEngine?.inputNode.outputFormat(forBus: 0) + ) { buffer, when in + request.append(buffer) + } + + self.audioEngine?.prepare() + do { + try self.audioEngine?.start() + } catch { + continuation.finish(throwing: SpeechClient.Failure.couldntStartAudioEngine) + return + } + } + } +} diff --git a/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Models.swift b/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Models.swift new file mode 100644 index 0000000..6347cc7 --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Models.swift @@ -0,0 +1,94 @@ +import Speech + +// The core data types in the Speech framework are reference types and are not constructible by us, +// and so they aren't testable out the box. We define struct versions of those types to make +// them easier to use and test. + +struct SpeechRecognitionMetadata: Equatable { + var averagePauseDuration: TimeInterval + var speakingRate: Double + var voiceAnalytics: VoiceAnalytics? +} + +struct SpeechRecognitionResult: Equatable { + var bestTranscription: Transcription + var isFinal: Bool + var speechRecognitionMetadata: SpeechRecognitionMetadata? + var transcriptions: [Transcription] +} + +struct Transcription: Equatable { + var formattedString: String + var segments: [TranscriptionSegment] +} + +struct TranscriptionSegment: Equatable { + var alternativeSubstrings: [String] + var confidence: Float + var duration: TimeInterval + var substring: String + var timestamp: TimeInterval +} + +struct VoiceAnalytics: Equatable { + var jitter: AcousticFeature + var pitch: AcousticFeature + var shimmer: AcousticFeature + var voicing: AcousticFeature +} + +struct AcousticFeature: Equatable { + var acousticFeatureValuePerFrame: [Double] + var frameDuration: TimeInterval +} + +extension SpeechRecognitionMetadata { + init(_ speechRecognitionMetadata: SFSpeechRecognitionMetadata) { + self.averagePauseDuration = speechRecognitionMetadata.averagePauseDuration + self.speakingRate = speechRecognitionMetadata.speakingRate + self.voiceAnalytics = speechRecognitionMetadata.voiceAnalytics.map(VoiceAnalytics.init) + } +} + +extension SpeechRecognitionResult { + init(_ speechRecognitionResult: SFSpeechRecognitionResult) { + self.bestTranscription = Transcription(speechRecognitionResult.bestTranscription) + self.isFinal = speechRecognitionResult.isFinal + self.speechRecognitionMetadata = speechRecognitionResult.speechRecognitionMetadata + .map(SpeechRecognitionMetadata.init) + self.transcriptions = speechRecognitionResult.transcriptions.map(Transcription.init) + } +} + +extension Transcription { + init(_ transcription: SFTranscription) { + self.formattedString = transcription.formattedString + self.segments = transcription.segments.map(TranscriptionSegment.init) + } +} + +extension TranscriptionSegment { + init(_ transcriptionSegment: SFTranscriptionSegment) { + self.alternativeSubstrings = transcriptionSegment.alternativeSubstrings + self.confidence = transcriptionSegment.confidence + self.duration = transcriptionSegment.duration + self.substring = transcriptionSegment.substring + self.timestamp = transcriptionSegment.timestamp + } +} + +extension VoiceAnalytics { + init(_ voiceAnalytics: SFVoiceAnalytics) { + self.jitter = AcousticFeature(voiceAnalytics.jitter) + self.pitch = AcousticFeature(voiceAnalytics.pitch) + self.shimmer = AcousticFeature(voiceAnalytics.shimmer) + self.voicing = AcousticFeature(voiceAnalytics.voicing) + } +} + +extension AcousticFeature { + init(_ acousticFeature: SFAcousticFeature) { + self.acousticFeatureValuePerFrame = acousticFeature.acousticFeatureValuePerFrame + self.frameDuration = acousticFeature.frameDuration + } +} diff --git a/Examples/SpeechRecognition/SpeechRecognition/SpeechRecognition.swift b/Examples/SpeechRecognition/SpeechRecognition/SpeechRecognition.swift new file mode 100644 index 0000000..5fe7a67 --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition/SpeechRecognition.swift @@ -0,0 +1,141 @@ +import VDStore +import Speech +import SwiftUI + +private let readMe = """ + This application demonstrates how to work with a complex dependency in the Composable \ + Architecture. It uses the `SFSpeechRecognizer` API from the Speech framework to listen to audio \ + on the device and live-transcribe it to the UI. + """ + +// MARK: - State + +struct SpeechRecognition: Equatable { + var alert: String? + var isRecording = false + var transcribedText = "" +} + +// MARK: - Actions + +extension Store { + + func recordButtonTapped() async { + state.isRecording.toggle() + if state.isRecording { + do { + try await startRecording() + } catch { + speechFailed(failure: error) + } + } else { + await di.speechClient.finishTask() + } + } + + func startRecording() async throws { + let status = await di.speechClient.requestAuthorization() + speechRecognizerAuthorizationStatusResponse(status: status) + + guard status == .authorized + else { return } + + let request = SFSpeechAudioBufferRecognitionRequest() + for try await result in await di.speechClient.startTask(request) { + state.transcribedText = result.bestTranscription.formattedString + } + } + + func speechFailed(failure: Error) { + switch failure { + case SpeechClient.Failure.couldntConfigureAudioSession, + SpeechClient.Failure.couldntStartAudioEngine: + state.alert = "Problem with audio device. Please try again." + default: + state.alert = "An error occurred while transcribing. Please try again." + } + } + + func speechRecognizerAuthorizationStatusResponse(status: SFSpeechRecognizerAuthorizationStatus) { + state.isRecording = status == .authorized + + switch status { + case .denied: + state.alert = """ + You denied access to speech recognition. This app needs access to transcribe your \ + speech. + """ + + case .restricted: + state.alert = "Your device does not allow speech recognition." + default: + break + } + } +} + +// MARK: - View + +struct SpeechRecognitionView: View { + + @ViewStore var state = SpeechRecognition() + + var body: some View { + VStack { + VStack(alignment: .leading) { + Text(readMe) + .padding(.bottom, 32) + } + + ScrollView { + ScrollViewReader { proxy in + Text(state.transcribedText) + .font(.largeTitle) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + + Spacer() + + Button { + Task { + await $state.recordButtonTapped() + } + } label: { + HStack { + Image( + systemName: state.isRecording + ? "stop.circle.fill" : "arrowtriangle.right.circle.fill" + ) + .font(.title) + Text(state.isRecording ? "Stop Recording" : "Start Recording") + } + .foregroundColor(.white) + .padding() + .background(state.isRecording ? Color.red : .green) + .cornerRadius(16) + } + } + .padding() + .animation(.linear, value: state.transcribedText) + .alert( + "Error", + isPresented: Binding { + state.alert != nil + } set: { newValue in + if !newValue { + state.alert = nil + } + } + ) { + Text(state.alert ?? "") + } + } +} + +#Preview { + SpeechRecognitionView( + state: SpeechRecognition(transcribedText: "Test test 123") + ) +} diff --git a/Examples/SpeechRecognition/SpeechRecognition/SpeechRecognitionApp.swift b/Examples/SpeechRecognition/SpeechRecognition/SpeechRecognitionApp.swift new file mode 100644 index 0000000..84db7fb --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognition/SpeechRecognitionApp.swift @@ -0,0 +1,11 @@ +import VDStore +import SwiftUI + +@main +struct SpeechRecognitionApp: App { + var body: some Scene { + WindowGroup { + SpeechRecognitionView() + } + } +} diff --git a/Examples/SpeechRecognition/SpeechRecognitionTests/SpeechRecognitionTests.swift b/Examples/SpeechRecognition/SpeechRecognitionTests/SpeechRecognitionTests.swift new file mode 100644 index 0000000..ddf526c --- /dev/null +++ b/Examples/SpeechRecognition/SpeechRecognitionTests/SpeechRecognitionTests.swift @@ -0,0 +1,135 @@ +import VDStore +import XCTest + +@testable import SpeechRecognition + +final class SpeechRecognitionTests: XCTestCase { + @MainActor + func testDenyAuthorization() async { + let store = TestStore(initialState: SpeechRecognition.State()) { + SpeechRecognition() + } withDependencies: { + $0.speechClient.requestAuthorization = { .denied } + } + + await store.send(.recordButtonTapped) { + $0.isRecording = true + } + await store.receive(\.speechRecognizerAuthorizationStatusResponse) { + $0.alert = AlertState { + TextState( + """ + You denied access to speech recognition. This app needs access to transcribe your speech. + """ + ) + } + $0.isRecording = false + } + } + + @MainActor + func testRestrictedAuthorization() async { + let store = TestStore(initialState: SpeechRecognition.State()) { + SpeechRecognition() + } withDependencies: { + $0.speechClient.requestAuthorization = { .restricted } + } + + await store.send(.recordButtonTapped) { + $0.isRecording = true + } + await store.receive(\.speechRecognizerAuthorizationStatusResponse) { + $0.alert = AlertState { TextState("Your device does not allow speech recognition.") } + $0.isRecording = false + } + } + + @MainActor + func testAllowAndRecord() async { + let recognitionTask = AsyncThrowingStream.makeStream(of: SpeechRecognitionResult.self) + let store = TestStore(initialState: SpeechRecognition.State()) { + SpeechRecognition() + } withDependencies: { + $0.speechClient.finishTask = { recognitionTask.continuation.finish() } + $0.speechClient.startTask = { @Sendable _ in recognitionTask.stream } + $0.speechClient.requestAuthorization = { .authorized } + } + + let firstResult = SpeechRecognitionResult( + bestTranscription: Transcription( + formattedString: "Hello", + segments: [] + ), + isFinal: false, + transcriptions: [] + ) + var secondResult = firstResult + secondResult.bestTranscription.formattedString = "Hello world" + + await store.send(.recordButtonTapped) { + $0.isRecording = true + } + + await store.receive(\.speechRecognizerAuthorizationStatusResponse) + + recognitionTask.continuation.yield(firstResult) + await store.receive(\.speech.success) { + $0.transcribedText = "Hello" + } + + recognitionTask.continuation.yield(secondResult) + await store.receive(\.speech.success) { + $0.transcribedText = "Hello world" + } + + await store.send(.recordButtonTapped) { + $0.isRecording = false + } + + await store.finish() + } + + @MainActor + func testAudioSessionFailure() async { + let recognitionTask = AsyncThrowingStream.makeStream(of: SpeechRecognitionResult.self) + let store = TestStore(initialState: SpeechRecognition.State()) { + SpeechRecognition() + } withDependencies: { + $0.speechClient.startTask = { @Sendable _ in recognitionTask.stream } + $0.speechClient.requestAuthorization = { .authorized } + } + + await store.send(.recordButtonTapped) { + $0.isRecording = true + } + + await store.receive(\.speechRecognizerAuthorizationStatusResponse) + + recognitionTask.continuation.finish(throwing: SpeechClient.Failure.couldntConfigureAudioSession) + await store.receive(\.speech.failure) { + $0.alert = AlertState { TextState("Problem with audio device. Please try again.") } + } + } + + @MainActor + func testAudioEngineFailure() async { + let recognitionTask = AsyncThrowingStream.makeStream(of: SpeechRecognitionResult.self) + let store = TestStore(initialState: SpeechRecognition.State()) { + SpeechRecognition() + } withDependencies: { + $0.speechClient.startTask = { @Sendable _ in recognitionTask.stream } + $0.speechClient.requestAuthorization = { .authorized } + } + + await store.send(.recordButtonTapped) { + $0.isRecording = true + } + + await store.receive(\.speechRecognizerAuthorizationStatusResponse) + + recognitionTask.continuation.finish(throwing: SpeechClient.Failure.couldntStartAudioEngine) + await store.receive(\.speech.failure) { + $0.alert = AlertState { TextState("Problem with audio device. Please try again.") } + } + } +} diff --git a/Examples/SyncUps/README.md b/Examples/SyncUps/README.md new file mode 100644 index 0000000..58c0433 --- /dev/null +++ b/Examples/SyncUps/README.md @@ -0,0 +1,64 @@ +# SyncUps + +This project demonstrates how to build a complex, real world application that deals with many forms +of navigation (_e.g._, sheets, drill-downs, alerts), many side effects (timers, speech recognizer, +data persistence), and do so in a way that is testable and modular. + +The inspiration for this application comes from Apple's [Scrumdinger][scrumdinger] tutorial: + +> This module guides you through the development of Scrumdinger, an iOS app that helps users manage +> their daily scrums. To help keep scrums short and focused, Scrumdinger uses visual and audio cues +> to indicate when and how long each attendee should speak. The app also displays a progress screen +> that shows the time remaining in the meeting and creates a transcript that users can refer to +> later. + +The Scrumdinger app is one of Apple's most interesting code samples as it deals with many real +world problems that one faces in application development. It shows off many types of navigation, +it deals with complex effects such as timers and speech recognition, and it persists application +data to disk. + +However, it is not necessarily built in the most ideal way. It uses mostly fire-and-forget style +navigation, which means you can't easily deep link into any screen of the app, which is handy for +push notifications and opening URLs. It also uses uncontrolled dependencies, including file system +access, timers and a speech recognizer, which makes it nearly impossible to write automated tests +and even hinders the ability to preview the app in Xcode previews. + +But, the simplicity of Apple's Scrumdinger codebase is not a defect. In fact, it's a feature! +Apple's sample code is viewed by hundreds of thousands of developers across the world, and so its +goal is to be as approachable as possible in order to teach the basics of SwiftUI. But, that doesn't mean there isn't room for improvement. + +## Composable SyncUps + +Our SyncUps application is a rebuild of Apple's Scrumdinger application, but with a focus on +modern, best practices for SwiftUI development. We faithfully recreate the Scrumdinger, but with +some key additions: + + 1. Identifiers are made type safe using our [Tagged library][tagged-gh]. This prevents us from + writing nonsensical code, such as comparing a `SyncUp.ID` to a `Attendee.ID`. + 2. Instead of using bare arrays in feature logic we use an "identified" array from our + [IdentifiedCollections][identified-collections-gh] library. This allows you to read and modify + elements of the collection via their ID rather than positional index, which can be error-prone + and lead to bugs or crashes. + 3. _All_ navigation is driven off of state, including sheets, drill-downs and alerts. This makes + it possible to deep link into any screen of the app by just constructing a piece of state and + handing it off to SwiftUI. + 4. Further, each view represents its navigation destinations as a single enum, which gives us + compile time proof that two destinations cannot be active at the same time. This cannot be + accomplished with default SwiftUI tools, but can be done easily with the tools that the + Composable Architecture provides. + 5. All side effects are controlled. This includes access to the file system for persistence, access + to time-based asynchrony for timers, access to speech recognition APIs, and even the creation + of dates and UUIDs. This allows us to run our application in specific execution contexts, which + is very useful in tests and Xcode previews. We accomplish this using our + [Dependencies][dependencies-gh] library. + 6. The project includes a full test suite. Since all of navigation is driven off of state, and + because we controlled all dependencies, we can write very comprehensive and nuanced tests. For + example, we can write a unit test that proves that when a sync-up meeting's timer runs out the + screen pops off the stack and a new transcript is added to the sync-up. Such a test would be + very difficult, if not impossible, without controlling dependencies. + +[scrumdinger]: https://developer.apple.com/tutorials/app-dev-training/getting-started-with-scrumdinger +[scrumdinger-dl]: https://docs-assets.developer.apple.com/published/1ea2eec121b90031e354288912a76357/TranscribingSpeechToText.zip +[tagged-gh]: http://github.com/pointfreeco/swift-tagged +[identified-collections-gh]: http://github.com/pointfreeco/swift-identified-collections +[dependencies-gh]: http://github.com/pointfreeco/swift-dependencies diff --git a/Examples/SyncUps/SyncUps.xcodeproj/project.pbxproj b/Examples/SyncUps/SyncUps.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c98b747 --- /dev/null +++ b/Examples/SyncUps/SyncUps.xcodeproj/project.pbxproj @@ -0,0 +1,707 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + CA14FF052B361C7400104A70 /* SwiftUINavigation in Frameworks */ = {isa = PBXBuildFile; productRef = CA14FF042B361C7400104A70 /* SwiftUINavigation */; }; + DC7CE4E729E9E6E4006B6263 /* ding.wav in Resources */ = {isa = PBXBuildFile; fileRef = DC7CE4E629E9E6E4006B6263 /* ding.wav */; }; + DC808D7329E9C3AC0072B4A9 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808D7229E9C3AC0072B4A9 /* App.swift */; }; + DC808D7729E9C3AD0072B4A9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DC808D7629E9C3AD0072B4A9 /* Assets.xcassets */; }; + DC808D8429E9C3AD0072B4A9 /* SyncUpFormTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808D8329E9C3AD0072B4A9 /* SyncUpFormTests.swift */; }; + DC808D8E29E9C3AD0072B4A9 /* SyncUpsUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808D8D29E9C3AD0072B4A9 /* SyncUpsUITests.swift */; }; + DC808DA029E9C4340072B4A9 /* DataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808D9F29E9C4340072B4A9 /* DataManager.swift */; }; + DC808DA329E9C4490072B4A9 /* ComposableArchitecture in Frameworks */ = {isa = PBXBuildFile; productRef = DC808DA229E9C4490072B4A9 /* ComposableArchitecture */; }; + DC808DA529E9C4C70072B4A9 /* OpenSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808DA429E9C4C70072B4A9 /* OpenSettings.swift */; }; + DC808DA729E9C4D60072B4A9 /* SpeechRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808DA629E9C4D60072B4A9 /* SpeechRecognizer.swift */; }; + DC808DA929E9C5090072B4A9 /* SyncUpForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808DA829E9C5090072B4A9 /* SyncUpForm.swift */; }; + DC808DAB29E9C51D0072B4A9 /* Meeting.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808DAA29E9C51D0072B4A9 /* Meeting.swift */; }; + DC808DAD29E9C52A0072B4A9 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808DAC29E9C52A0072B4A9 /* Models.swift */; }; + DC808DAF29E9C53E0072B4A9 /* RecordMeeting.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808DAE29E9C53E0072B4A9 /* RecordMeeting.swift */; }; + DC808DB129E9C54A0072B4A9 /* SyncUpDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808DB029E9C54A0072B4A9 /* SyncUpDetail.swift */; }; + DC808DB329E9C5540072B4A9 /* SyncUpsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC808DB229E9C5540072B4A9 /* SyncUpsList.swift */; }; + DC808DB629E9C58F0072B4A9 /* Tagged in Frameworks */ = {isa = PBXBuildFile; productRef = DC808DB529E9C58F0072B4A9 /* Tagged */; }; + DC80B1E929EDE5D1001CC0CC /* AppFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC80B1E829EDE5D1001CC0CC /* AppFeature.swift */; }; + DC80B1EB29EE12A7001CC0CC /* AppFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC80B1EA29EE12A7001CC0CC /* AppFeatureTests.swift */; }; + DC8C2B0C29EB084900C65286 /* RecordMeetingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8C2B0B29EB084900C65286 /* RecordMeetingTests.swift */; }; + DC8C2B0E29EB085600C65286 /* SyncUpDetailTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8C2B0D29EB085600C65286 /* SyncUpDetailTests.swift */; }; + DC8C2B1029EB086A00C65286 /* SyncUpsListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8C2B0F29EB086A00C65286 /* SyncUpsListTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + DC808D8029E9C3AD0072B4A9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DC808D6729E9C3AC0072B4A9 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DC808D6E29E9C3AC0072B4A9; + remoteInfo = SyncUps; + }; + DC808D8A29E9C3AD0072B4A9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DC808D6729E9C3AC0072B4A9 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DC808D6E29E9C3AC0072B4A9; + remoteInfo = SyncUps; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + DC43064F2AE8CF7C005AFB1E /* SyncUps.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = SyncUps.xctestplan; sourceTree = ""; }; + DC7CE4E629E9E6E4006B6263 /* ding.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = ding.wav; sourceTree = ""; }; + DC808D6F29E9C3AC0072B4A9 /* SyncUps.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SyncUps.app; sourceTree = BUILT_PRODUCTS_DIR; }; + DC808D7229E9C3AC0072B4A9 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; + DC808D7629E9C3AD0072B4A9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + DC808D7F29E9C3AD0072B4A9 /* SyncUpsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SyncUpsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + DC808D8329E9C3AD0072B4A9 /* SyncUpFormTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncUpFormTests.swift; sourceTree = ""; }; + DC808D8929E9C3AD0072B4A9 /* SyncUpsUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SyncUpsUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + DC808D8D29E9C3AD0072B4A9 /* SyncUpsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncUpsUITests.swift; sourceTree = ""; }; + DC808D9C29E9C3C10072B4A9 /* swift-composable-architecture */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "swift-composable-architecture"; path = ../..; sourceTree = ""; }; + DC808D9F29E9C4340072B4A9 /* DataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataManager.swift; sourceTree = ""; }; + DC808DA429E9C4C70072B4A9 /* OpenSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenSettings.swift; sourceTree = ""; }; + DC808DA629E9C4D60072B4A9 /* SpeechRecognizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechRecognizer.swift; sourceTree = ""; }; + DC808DA829E9C5090072B4A9 /* SyncUpForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncUpForm.swift; sourceTree = ""; }; + DC808DAA29E9C51D0072B4A9 /* Meeting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Meeting.swift; sourceTree = ""; }; + DC808DAC29E9C52A0072B4A9 /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = ""; }; + DC808DAE29E9C53E0072B4A9 /* RecordMeeting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordMeeting.swift; sourceTree = ""; }; + DC808DB029E9C54A0072B4A9 /* SyncUpDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncUpDetail.swift; sourceTree = ""; }; + DC808DB229E9C5540072B4A9 /* SyncUpsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncUpsList.swift; sourceTree = ""; }; + DC80B1E829EDE5D1001CC0CC /* AppFeature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppFeature.swift; sourceTree = ""; }; + DC80B1EA29EE12A7001CC0CC /* AppFeatureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppFeatureTests.swift; sourceTree = ""; }; + DC8C2B0B29EB084900C65286 /* RecordMeetingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordMeetingTests.swift; sourceTree = ""; }; + DC8C2B0D29EB085600C65286 /* SyncUpDetailTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncUpDetailTests.swift; sourceTree = ""; }; + DC8C2B0F29EB086A00C65286 /* SyncUpsListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncUpsListTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + DC808D6C29E9C3AC0072B4A9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DC808DB629E9C58F0072B4A9 /* Tagged in Frameworks */, + DC808DA329E9C4490072B4A9 /* ComposableArchitecture in Frameworks */, + CA14FF052B361C7400104A70 /* SwiftUINavigation in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC808D7C29E9C3AD0072B4A9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC808D8629E9C3AD0072B4A9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + DC7CE4E529E9E6E4006B6263 /* Resources */ = { + isa = PBXGroup; + children = ( + DC7CE4E629E9E6E4006B6263 /* ding.wav */, + ); + path = Resources; + sourceTree = ""; + }; + DC808D6629E9C3AC0072B4A9 = { + isa = PBXGroup; + children = ( + DC808D9C29E9C3C10072B4A9 /* swift-composable-architecture */, + DC43064F2AE8CF7C005AFB1E /* SyncUps.xctestplan */, + DC808DA129E9C4490072B4A9 /* Frameworks */, + DC808D7029E9C3AC0072B4A9 /* Products */, + DC808D7129E9C3AC0072B4A9 /* SyncUps */, + DC808D8229E9C3AD0072B4A9 /* SyncUpsTests */, + DC808D8C29E9C3AD0072B4A9 /* SyncUpsUITests */, + ); + sourceTree = ""; + }; + DC808D7029E9C3AC0072B4A9 /* Products */ = { + isa = PBXGroup; + children = ( + DC808D6F29E9C3AC0072B4A9 /* SyncUps.app */, + DC808D7F29E9C3AD0072B4A9 /* SyncUpsTests.xctest */, + DC808D8929E9C3AD0072B4A9 /* SyncUpsUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + DC808D7129E9C3AC0072B4A9 /* SyncUps */ = { + isa = PBXGroup; + children = ( + DC808D9E29E9C4040072B4A9 /* Dependencies */, + DC808D7229E9C3AC0072B4A9 /* App.swift */, + DC80B1E829EDE5D1001CC0CC /* AppFeature.swift */, + DC808DAA29E9C51D0072B4A9 /* Meeting.swift */, + DC808DAC29E9C52A0072B4A9 /* Models.swift */, + DC808DAE29E9C53E0072B4A9 /* RecordMeeting.swift */, + DC808DB029E9C54A0072B4A9 /* SyncUpDetail.swift */, + DC808DA829E9C5090072B4A9 /* SyncUpForm.swift */, + DC808DB229E9C5540072B4A9 /* SyncUpsList.swift */, + DC808D7629E9C3AD0072B4A9 /* Assets.xcassets */, + DC7CE4E529E9E6E4006B6263 /* Resources */, + ); + path = SyncUps; + sourceTree = ""; + }; + DC808D8229E9C3AD0072B4A9 /* SyncUpsTests */ = { + isa = PBXGroup; + children = ( + DC80B1EA29EE12A7001CC0CC /* AppFeatureTests.swift */, + DC8C2B0B29EB084900C65286 /* RecordMeetingTests.swift */, + DC8C2B0D29EB085600C65286 /* SyncUpDetailTests.swift */, + DC808D8329E9C3AD0072B4A9 /* SyncUpFormTests.swift */, + DC8C2B0F29EB086A00C65286 /* SyncUpsListTests.swift */, + ); + path = SyncUpsTests; + sourceTree = ""; + }; + DC808D8C29E9C3AD0072B4A9 /* SyncUpsUITests */ = { + isa = PBXGroup; + children = ( + DC808D8D29E9C3AD0072B4A9 /* SyncUpsUITests.swift */, + ); + path = SyncUpsUITests; + sourceTree = ""; + }; + DC808D9E29E9C4040072B4A9 /* Dependencies */ = { + isa = PBXGroup; + children = ( + DC808D9F29E9C4340072B4A9 /* DataManager.swift */, + DC808DA429E9C4C70072B4A9 /* OpenSettings.swift */, + DC808DA629E9C4D60072B4A9 /* SpeechRecognizer.swift */, + ); + path = Dependencies; + sourceTree = ""; + }; + DC808DA129E9C4490072B4A9 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + DC808D6E29E9C3AC0072B4A9 /* SyncUps */ = { + isa = PBXNativeTarget; + buildConfigurationList = DC808D9329E9C3AD0072B4A9 /* Build configuration list for PBXNativeTarget "SyncUps" */; + buildPhases = ( + DC808D6B29E9C3AC0072B4A9 /* Sources */, + DC808D6C29E9C3AC0072B4A9 /* Frameworks */, + DC808D6D29E9C3AC0072B4A9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SyncUps; + packageProductDependencies = ( + DC808DA229E9C4490072B4A9 /* ComposableArchitecture */, + DC808DB529E9C58F0072B4A9 /* Tagged */, + CA14FF042B361C7400104A70 /* SwiftUINavigation */, + ); + productName = SyncUps; + productReference = DC808D6F29E9C3AC0072B4A9 /* SyncUps.app */; + productType = "com.apple.product-type.application"; + }; + DC808D7E29E9C3AD0072B4A9 /* SyncUpsTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DC808D9629E9C3AD0072B4A9 /* Build configuration list for PBXNativeTarget "SyncUpsTests" */; + buildPhases = ( + DC808D7B29E9C3AD0072B4A9 /* Sources */, + DC808D7C29E9C3AD0072B4A9 /* Frameworks */, + DC808D7D29E9C3AD0072B4A9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + DC808D8129E9C3AD0072B4A9 /* PBXTargetDependency */, + ); + name = SyncUpsTests; + productName = SyncUpsTests; + productReference = DC808D7F29E9C3AD0072B4A9 /* SyncUpsTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + DC808D8829E9C3AD0072B4A9 /* SyncUpsUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DC808D9929E9C3AD0072B4A9 /* Build configuration list for PBXNativeTarget "SyncUpsUITests" */; + buildPhases = ( + DC808D8529E9C3AD0072B4A9 /* Sources */, + DC808D8629E9C3AD0072B4A9 /* Frameworks */, + DC808D8729E9C3AD0072B4A9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + DC808D8B29E9C3AD0072B4A9 /* PBXTargetDependency */, + ); + name = SyncUpsUITests; + productName = SyncUpsUITests; + productReference = DC808D8929E9C3AD0072B4A9 /* SyncUpsUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + DC808D6729E9C3AC0072B4A9 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1520; + TargetAttributes = { + DC808D6E29E9C3AC0072B4A9 = { + CreatedOnToolsVersion = 14.3; + }; + DC808D7E29E9C3AD0072B4A9 = { + CreatedOnToolsVersion = 14.3; + TestTargetID = DC808D6E29E9C3AC0072B4A9; + }; + DC808D8829E9C3AD0072B4A9 = { + CreatedOnToolsVersion = 14.3; + TestTargetID = DC808D6E29E9C3AC0072B4A9; + }; + }; + }; + buildConfigurationList = DC808D6A29E9C3AC0072B4A9 /* Build configuration list for PBXProject "SyncUps" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = DC808D6629E9C3AC0072B4A9; + packageReferences = ( + DC808DB429E9C58F0072B4A9 /* XCRemoteSwiftPackageReference "swift-tagged" */, + CA14FF032B361C7400104A70 /* XCRemoteSwiftPackageReference "swiftui-navigation" */, + ); + productRefGroup = DC808D7029E9C3AC0072B4A9 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + DC808D6E29E9C3AC0072B4A9 /* SyncUps */, + DC808D7E29E9C3AD0072B4A9 /* SyncUpsTests */, + DC808D8829E9C3AD0072B4A9 /* SyncUpsUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + DC808D6D29E9C3AC0072B4A9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DC808D7729E9C3AD0072B4A9 /* Assets.xcassets in Resources */, + DC7CE4E729E9E6E4006B6263 /* ding.wav in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC808D7D29E9C3AD0072B4A9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC808D8729E9C3AD0072B4A9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + DC808D6B29E9C3AC0072B4A9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DC808DAB29E9C51D0072B4A9 /* Meeting.swift in Sources */, + DC808DA729E9C4D60072B4A9 /* SpeechRecognizer.swift in Sources */, + DC80B1E929EDE5D1001CC0CC /* AppFeature.swift in Sources */, + DC808DA529E9C4C70072B4A9 /* OpenSettings.swift in Sources */, + DC808DAD29E9C52A0072B4A9 /* Models.swift in Sources */, + DC808DB129E9C54A0072B4A9 /* SyncUpDetail.swift in Sources */, + DC808DA029E9C4340072B4A9 /* DataManager.swift in Sources */, + DC808D7329E9C3AC0072B4A9 /* App.swift in Sources */, + DC808DB329E9C5540072B4A9 /* SyncUpsList.swift in Sources */, + DC808DAF29E9C53E0072B4A9 /* RecordMeeting.swift in Sources */, + DC808DA929E9C5090072B4A9 /* SyncUpForm.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC808D7B29E9C3AD0072B4A9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DC8C2B0C29EB084900C65286 /* RecordMeetingTests.swift in Sources */, + DC80B1EB29EE12A7001CC0CC /* AppFeatureTests.swift in Sources */, + DC8C2B0E29EB085600C65286 /* SyncUpDetailTests.swift in Sources */, + DC808D8429E9C3AD0072B4A9 /* SyncUpFormTests.swift in Sources */, + DC8C2B1029EB086A00C65286 /* SyncUpsListTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC808D8529E9C3AD0072B4A9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DC808D8E29E9C3AD0072B4A9 /* SyncUpsUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + DC808D8129E9C3AD0072B4A9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DC808D6E29E9C3AC0072B4A9 /* SyncUps */; + targetProxy = DC808D8029E9C3AD0072B4A9 /* PBXContainerItemProxy */; + }; + DC808D8B29E9C3AD0072B4A9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DC808D6E29E9C3AC0072B4A9 /* SyncUps */; + targetProxy = DC808D8A29E9C3AD0072B4A9 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + DC808D9129E9C3AD0072B4A9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_STRICT_CONCURRENCY = complete; + }; + name = Debug; + }; + DC808D9229E9C3AD0072B4A9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_STRICT_CONCURRENCY = complete; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + DC808D9429E9C3AD0072B4A9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VFRXY8HC3H; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "To transcribe meeting notes."; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SyncUps; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + DC808D9529E9C3AD0072B4A9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VFRXY8HC3H; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "To transcribe meeting notes."; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SyncUps; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + DC808D9729E9C3AD0072B4A9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VFRXY8HC3H; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SyncUpsTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SyncUps.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/SyncUps"; + }; + name = Debug; + }; + DC808D9829E9C3AD0072B4A9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VFRXY8HC3H; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SyncUpsTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SyncUps.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/SyncUps"; + }; + name = Release; + }; + DC808D9A29E9C3AD0072B4A9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VFRXY8HC3H; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SyncUpsUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = SyncUps; + }; + name = Debug; + }; + DC808D9B29E9C3AD0072B4A9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VFRXY8HC3H; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.SyncUpsUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = SyncUps; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + DC808D6A29E9C3AC0072B4A9 /* Build configuration list for PBXProject "SyncUps" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DC808D9129E9C3AD0072B4A9 /* Debug */, + DC808D9229E9C3AD0072B4A9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DC808D9329E9C3AD0072B4A9 /* Build configuration list for PBXNativeTarget "SyncUps" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DC808D9429E9C3AD0072B4A9 /* Debug */, + DC808D9529E9C3AD0072B4A9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DC808D9629E9C3AD0072B4A9 /* Build configuration list for PBXNativeTarget "SyncUpsTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DC808D9729E9C3AD0072B4A9 /* Debug */, + DC808D9829E9C3AD0072B4A9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DC808D9929E9C3AD0072B4A9 /* Build configuration list for PBXNativeTarget "SyncUpsUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DC808D9A29E9C3AD0072B4A9 /* Debug */, + DC808D9B29E9C3AD0072B4A9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + CA14FF032B361C7400104A70 /* XCRemoteSwiftPackageReference "swiftui-navigation" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/pointfreeco/swiftui-navigation.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.2.0; + }; + }; + DC808DB429E9C58F0072B4A9 /* XCRemoteSwiftPackageReference "swift-tagged" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/pointfreeco/swift-tagged.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.10.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + CA14FF042B361C7400104A70 /* SwiftUINavigation */ = { + isa = XCSwiftPackageProductDependency; + package = CA14FF032B361C7400104A70 /* XCRemoteSwiftPackageReference "swiftui-navigation" */; + productName = SwiftUINavigation; + }; + DC808DA229E9C4490072B4A9 /* ComposableArchitecture */ = { + isa = XCSwiftPackageProductDependency; + productName = ComposableArchitecture; + }; + DC808DB529E9C58F0072B4A9 /* Tagged */ = { + isa = XCSwiftPackageProductDependency; + package = DC808DB429E9C58F0072B4A9 /* XCRemoteSwiftPackageReference "swift-tagged" */; + productName = Tagged; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = DC808D6729E9C3AC0072B4A9 /* Project object */; +} diff --git a/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..dd995dc --- /dev/null +++ b/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,176 @@ +{ + "pins" : [ + { + "identity" : "combine-schedulers", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/combine-schedulers", + "state" : { + "revision" : "9dc9cbe4bc45c65164fa653a563d8d8db61b09bb", + "version" : "1.0.0" + } + }, + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser", + "state" : { + "revision" : "c8ed701b513cf5177118a175d85fbbbcd707ab41", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-benchmark", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/swift-benchmark", + "state" : { + "revision" : "8163295f6fe82356b0bcf8e1ab991645de17d096", + "version" : "0.1.2" + } + }, + { + "identity" : "swift-case-paths", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-case-paths", + "state" : { + "revision" : "e593aba2c6222daad7c4f2732a431eed2c09bb07", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-clocks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-clocks", + "state" : { + "revision" : "a8421d68068d8f45fbceb418fbf22c5dad4afd33", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-concurrency-extras", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-concurrency-extras", + "state" : { + "revision" : "bb5059bde9022d69ac516803f4f227d8ac967f71", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-custom-dump", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-custom-dump", + "state" : { + "revision" : "3ce83179e5f0c83ad54c305779c6b438e82aaf1d", + "version" : "1.2.1" + } + }, + { + "identity" : "swift-dependencies", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-dependencies", + "state" : { + "revision" : "d3a5af3038a09add4d7682f66555d6212058a3c0", + "version" : "1.2.2" + } + }, + { + "identity" : "swift-docc-plugin", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-docc-plugin", + "state" : { + "revision" : "26ac5758409154cc448d7ab82389c520fa8a8247", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-docc-symbolkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-docc-symbolkit", + "state" : { + "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", + "version" : "1.0.0" + } + }, + { + "identity" : "swift-identified-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-identified-collections", + "state" : { + "revision" : "d1e45f3e1eee2c9193f5369fa9d70a6ddad635e8", + "version" : "1.0.0" + } + }, + { + "identity" : "swift-macro-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-macro-testing", + "state" : { + "revision" : "90e38eec4bf661ec0da1bbfd3ec507d0f0c05310", + "version" : "0.3.0" + } + }, + { + "identity" : "swift-perception", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-perception", + "state" : { + "revision" : "a5bb578d963fcdbffe4fd56c92b2e222f5b02c8a", + "version" : "1.1.2" + } + }, + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing", + "state" : { + "revision" : "5b0c434778f2c1a4c9b5ebdb8682b28e84dd69bd", + "version" : "1.15.4" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax", + "state" : { + "revision" : "fa8f95c2d536d6620cc2f504ebe8a6167c9fc2dd", + "version" : "510.0.1" + } + }, + { + "identity" : "swift-tagged", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-tagged.git", + "state" : { + "revision" : "3907a9438f5b57d317001dc99f3f11b46882272b", + "version" : "0.10.0" + } + }, + { + "identity" : "swiftui-navigation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swiftui-navigation.git", + "state" : { + "revision" : "d9e72f3083c08375794afa216fb2f89c0114f303", + "version" : "1.2.1" + } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state" : { + "revision" : "b13b1d1a8e787a5ffc71ac19dcaf52183ab27ba2", + "version" : "1.1.1" + } + } + ], + "version" : 2 +} diff --git a/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate b/Examples/SyncUps/SyncUps.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..701d220c60005b3c4c8dae8afb78dbf00d0c4b4c GIT binary patch literal 19506 zcmeHv2Ut^Q-}il=!8DMB5Rx!N!cc*bgpd%1VTn=^QHEQL5Fi>7ngmyCdmrnlweDK$ zmQic9%i2Bcw!==XcG~gSy|lZvGF%v&?RUbnusQ$dNc#gM$M=N%|jlv04+p|(Bx=pX14^eOrpeS^M5-=QDTPZ(j0 zDIAC6aRMHS6Y(&dgta&sr{GkahSRYT=VB`^#wEBE*Wg-QhwJfVJOxk1)9@VJh?}qj zH{%vO4_}JC*oQB}m*ea47JLKVinrnIcn98zcj4W55AMMS@GbaGdNY*Z0dOqEcjR2fxCji+j;T51M0lWL?|s8-5Nd8l@3KDB^aNUf(fP#dXD)OFNm z>UwGmbpy4P+D2`sc2GO1UDR%B57kL^QMXaIQ+H4YsXM7d)Lqow)PvMh)Dh}w>KW=; z>N)CF>IC%$b&C3u`ieS3ou$5}zM;OSexQD)exqqRm=2@mbSj-j52r`aBk6QHgU+ON zbP-)lm(Znj89kaVr^nDWbS+&+*VB{fM!Jc1(9LuU-AcP@5ACD<^dg$0m(o|!>*)3L z26`jCiN22BMsKHg(|hPn`X+iGeSp4&K0-fDKSMuDKSv*>pQm4-U!-56U#4H7Ptb4B zZ_;nkZ`1G5XX&r$Z|HC7@96L89~i`7hGJ+Yn2BMuOfoZ)(K80d$e5WtCZ8!_ikM<% z3^R_Iz*IA}%oJuSGn2714#v%NFqbh`GFLGxnX8#=nZ3+S%s%F3W;er7RCu|aGw8^J1A z6&uGUvcuRE*1#IsY}Ul)u*GZ%TgsNPquHtKG}Ga1yNB&$53skex7H=QJ6x{gNP;3zB$A>iq?}w;qnqbguT5LVa}tU}6nQMaBat7R8}>lz@h!L^KQ~ zAuUQqDTF0KB$$MdP!dMM$q*tT5hU^eN<+iZ2s9FQb@icXNamnDx1{dF7>$mj)ne7jz(CbuR*FQb2QsKT>jBbPQS-12p(U#$6Gh4 z(l?{H(GP;Frm@x0=73F#k1$4=!{>Lp?S2q%P+a15*ypu-oG_fw0z_9+gH&H>_xVdb zZS5`xJXiC=(C3FK#nDRaK9G6*@J|1tNse}p7mh13aB`EK?k3LyesSVo#a^%7-2#hn z`^y}2I$A2+&7KD7&`BPj!|%5bTu{B!=bYno!LTr3jl%`9*3r~Api11gxY@vT{9XgM zU_+%y*^P=&F)AT4A}3MZs0@upZ7Br(U(WHbd$MboB<^z62`Ii`qzI(+q2HDz#nT~I%LN>$ASK~sr6W};aQ z(x|GM@g08q9G9ca33uml+r5jr(M;5Urq6(`ePw|a+EF9F!Z}3KiJD04`74Y>t;mVy zPK6cv{9dQKg~T;T^DHJ~d1R!x=@>-QhQffBaGaQT*xhKNPG^gt{wT1u?t;_yd;4P?LvOk zK@!O@o>B75+2w}vVoOeDPOjOQY0_Kxg_um4#m17doE&|w*<>{jzL0-&7yQjFMs>Y6 z_BqYp7+>Xa!nHQpq8HLzz<=JxvZB z5ZE}UUpJ8ab=8g*yRXAn+&%gXntDMzjfChc**E8ArV2I-)v`Zh$>)McdGJw1cP8IUovtgI|x9j`B|$?kT#vdTOQ+%Av3$(Q9@;B5A1HiDG#_;|9+6l^U&@O+2Y zk=bTVgS72GH$O;5kGE;O!vUhb<>DpWCM+SVLF)R?EkQhjGKb&p zbOlx*YUP9IA!OW-?nH;sUFdFf54soKhweuYpa+S87)drUksM+s7LrS>ByT@@7#$Wq zkDy3X}ICppEw8Q5wA-mrGFC zI!|*msKUWU@}1Yp<#fY(2H#R~hriY1g^4b%<|RkD$JGR6G1zG>@Y>reVPsG{y!~_> zo#;fbk^(YHe0~j`=z%K`K5*>fXOt8i3|lRVO(v2_q=wXzI#PcCOGTo^ z3iLQu@??wEK(>>6$#yD`?JR+C+yD0w?r_j4;>}ij9rK-z1-x`F?pO$h9M~9QjX>)E z6KEU{2O7sC$dq0h#~Fjtcz_hLaSo6&Hj!za*i5GXJyOPbxR58iFK_`VBQt>Punov= z=0&6|lbi@lREEbP<6b-(m*X*bEUv(pkOnfF*vTByNSgNIN}#AJJONkZiNpak)J*0P z7ir^#pj@yIde7dco96L=Ar&{Uum&VwJzPzRr^DUE8|Qt^d*x=S-96v#<8Q7(8auFW zwbSheFF?H82C4eOt`k67dYw(YG#q+i-Fe;yKepC(R^-sYwx{D+a8h^%o=I9rYZq?7 zvx$?;B}p@yoFM+3ZQ!c7{q=skx5eSFb%AwJ=khe#UDbgBTCo!;_v|4_fdUtH^EcK; z+@07%JQs{K)!yOvw1Jt@7-;Xu3j`5?=Yxp2^pEc<(0&PC#S4ck@RgWg4ll)5fpA!k zSKyWSYT_e)(n02v1!N%zhec#Dxr|(X0AJH99McsHutPJ9Ph z`Zsz0E_^Rf$#;YLx(d`6z7N#bvO(0BZ1@%0qL6`H@CZJ_GykLbG5k1w0zZkLA}h(& zWEHuFtR~lr%>OJf|502mF#j50{&m3q|NYGWR}B7V;vsOpC-Ce1Nu30qU;D>AA87p! zeviM6cggy}_*pt7(C#DrsmRBl03UDS`S?CK{bd))+(7#?_!pj!&*HD~H~3rp9sVBp z_(%K`{u!Smo5}TL3%P-8CEI|Hx04-YC)srX|0?n^h0x;^#VdJ=1wP*0%g3Fd?a4vEdujW zR$g;c1p@QlDroN8|1U7_zoWSWyB$r9<(YRTHHNg3+q&><+yLs@d4ZY@w63D6`Ae8U z?ih@D1Fh<)DFW+KlYw>b{NqCpw4X)IhR_t%KedLkVna5{ zS%?ISCRQ03@Qn_L4*8oQn9(3ro?l$yg8+1+7h=K}RZMn5^vB@?6HqGls3{v)Z}&RE zc)MWiN-*EV;Imw8DP+%j!#-2{I)hnz{?z66Hm3{1v(e`l3Q-{5VGo7C;f0aKK}tq7 z&G$D68_c|*_1_9!)(OE%h@@W7*>z&nnU~`)IWyr}e1+K4~+6Qqps)xFf+DqL; zUM8=QW8`=bbu+b}IzZh*UL_~UN%9&m4wOI#1LNwoPCtJ+s*5V>#RTPGRTJ9z z4*3W9EU>eOs7H~pn|hc!Og%#0Aa9blx~a#g$Elmi+vF7N3wFdu#Ru+az>L*ir^hQq z`_uotVTrwQUX7#O?iGT@(h+~&TAZWa?&@%8i+Uph6B7f=K1#iG;j(ch^$K+ir1QJv zJ)&wvi76CHJVu>Fk<@F{>wJu}$?msLkTD^10y$$$(F_|D{IBPVLqco49*-Xq#ZqG-I*Bkhp>IIAEM-QIzYTY zT1!Rf`f`ZAIhu|~D$b@yO2-B&7lvEVt3(6s#bTVOR;;^I$ZE{L#+HfeV zaV~biM9t+cdy9`x3^;fy01@ko z+aYFKvj{RqZFLp=93>EIIUbRok*R|aWQ;g(|G0hhs=2V{yxl3~1jG0t{LTzHvE9aO zlbBEIHd}IqoLV%A5|SMJg#0G@IyXoYt7=MX`SNmyoewV8K;{VoV!rd5r~*yuD(ZX? z`s=GYri>U>)M7 zS6jQN-O*noMbe;SRTHWw4wlUskdo=Dp46YwshUt*H>)p~BShc2YwITkB5@!I#l7-} zE^Gznm^uyQ@`b0{HGR?`rO%(qp|n9_lr&P_mcnSGZ5`8Rtv6uph6!wK?F0h#j-^&xK~ zK1{s_(>y|*ral0Hd76Ac-Xb58kM`nq)W_5()Ti+KV+aO(Og!talH5t{VpvW};z zzib3cfktV6J`&%k#=nTyH-FKx7SfVJODPr-T-3L{39c8`u6~Zh%&PS?*%u|+{fP!s zo*`E}s2{1HE~HxOM?PvSYMFCj+e2=iCZhsJ_B)OE{3Dcg(wKZnR6;|Vp&k$$it33D zp&r;ndjAebCvHURA%V4qYC!9V4pLZYOSAoyGksDWS|3@j*T#~&b*cZ zi?$%+O|+gi&_+6&Hqkk>nVciPkYCAf0DMv3V=-VD03QKGb$%W^;B<&uO6*zT_O%N#xxZOo zPeGaWPtez$H^{}fDBmftp|SLMu;l0p`Vx8^UCCjJ!!(B(4zoRU6%<#~6FD3tl*>4* z;Fq2_Aa&a}udeUFVch|oLtib3@G)LbN4r?jn?mXvsLBJuONWn71&e?7^$Vllip+v!VbP^}tBZ}HS$%>(%WiQ;wmK<^6f1&5^^j+`K)st1~EX~T6>onV>t zCM2XT*kf@c94Np$cnLTQ%pG9XYL5>H$>W|GaN{bVk8fYl5NTA5W~la9a7bu)ZM)sy zIu+n9j)h|ZK+_o(@Z2Cl1{Pa55Y|PbI~KOvg|whBe>RWpI61pj4&%w>U14ET=9nT{ z`FDH1`NV;7&{GxO6{c>G#{X$T{a9>Ve8S&c(Hm!OSxjI0r1UYc z694YvUOyhh3Hv)$dL*f9M0(fAk$vg8u8d4=(WRm?)fQd-y6{(L7R;zOc87%-z_7SD zoh%I!Op926N)-ZNvKD|YvrsFVi@bpTSOkW}cGQDzMz^5bAklmTod9FvH2MfkiEuC> zGO-zejfDVgtiafvPxWW_>ipg>{G6cA z=ni^5h}zK$+g+jnp3vdv^OAgyMTCR$blJ-b-Sh%_A)5ZT+c!w(G}QXXl-3)}W%afF za{$j9&Haz(P03pUK1=U(4fQn**@pgh0;$!2@N~EITb~U9=37iJ0pJOJ8GSj29c3|tJXc?fN*8-kr2e9`8=$|4V_OWM7FJJb4 zVXQ4`FA^RC1l~pWfFVhDb2zb+zLCQMNNiXKV3HtN*$k;mM^h;X{uU49sso^niZT%q zLEkKxmwiVT81q*8en=kBx6!xLchCpvJLyC8UG&}bJ@mcweH>2aa0-W0Ih@Af;T#^p z;gK9p=WqsxGdZj~KtF)8=!fWs>BICR^rQ4+^yBdNlN`<>g&a0;*vR2*4x2c96^F0k z@J&L=KEa*{7z_Q@Nex6K`~n=J8q`sPbYzJGLU({+X@hWy)8}yuikpXE^;&^qS5ciu z_UdImBE*~i)6TC=1Z`OGGLP!iRc7P`e7Y8Pk(7OdJ7=DSo2tH09qmM)M z=4*6{eia&2)%2Z^2qFPZcwU)cQ*&4^iuRNAYXE2K>(E8Nj;5bqFl|D+!(HJ98`>vD zpsIQgqtemruk}oFwzT?1SLGDAD)c)X&gl!8(eKlrfFB4HbDI8u{*eBN{#YOqGlwl4 z&gHO`!+Cq@PwCI-&*Ar%=rD)#Ib6Wudf|_yVqQrm9;;~H_ntwNST+_6As}QZY@Fwt zDVFh9ZOBfa&YLjfz+4fGyLhmuJ6uh?U0n^%%OuC8Afb88uMi28!s!X%E&4|q(q!HA zPxR09ISvDTj^ePboBovt1#!3t(p`l-VaoZ_DE9SEFBnU3!~trBO5r%cvMpN#s8wfU zphP$+h5_%7VL4n(M!n92FriEs6OJO8A&i8HU?LeQ+Q!J4C?*n|yQ?6>7{CLG#0z?s zpN|hn0lU)!&oMciDwd+p-dt(3_)~ES{A@M^@ho3 z^{Z@=zoYwnhe;4V1gqO2mP1b-Guhu94oW!m3C)2q`|CJd#o;mzS97?A!=vpn@d3_x|viajR83~n!^)tM*^CK5EFd8Ittm0?B#cpQcY3>+9Nwn-(>8&XSeRS}$n_EqkAsN=T20CX z>I+d8Uq7A~zrg2vxvjfISfwv%nR72 zk4pk1I*^0|rOQOZ1#ICT5pFMu_R4c+4YL(27iKN9j#(0IJ1XGKrr3Bl5&A!f)9t?1UTEr zgCID3rKqj`H(_-DpMp9vck*iW5C>Q|5i!Bs^Jj<&=3(X$aB~>APERNED2Lm5H|MW` zyUdf!(*kCKIYL0CT-wDvLxH{P9RxKY68{SVRyRP9FEg)!NyNOu90O_mDszH4$zeZ- zJ2*U_!wWdPki&}v5C!ul^A?`KoZ>+g9A3=f%gHFfHk2$=PsHX6iKJR5r6^woUuW6zWAUak23H5m*eU44<#j|EMpP$Xb=CW2c zkHhOZyn(|TIlQR{WNQ}l3`z&N3F6!fi3YH&V+9xmn5GbVcP!xTb>AfW0x=5!>^ZQu z_m#PtM)0m7`aGag=nn7d^=DqeQBw|RB8<*k&Vj|2vlAd+!j56bvK8zl>^QcP9nXU4 zxS7M(b9f7fL1%2`@HP%_=kN~5n+PAsn1~-yD+mb_K|k>O;WPbxMr0EtM|>WagZKO@ zopZcAUfj(`&H}C-pZplKHJ^hLOt69NNB&X!>WZ>js2ebN#ve5v4{xzFffF&XIWPPN zUkjYrz@~q=?3#`_J|Qzcuzl7a4PEW^@Udy$=@{7K57*uo%Q$bVf$N;ZHbE$a1^vFO zlLh_0o4*hl*n55CDtK;!m}Z^S16}M~7G&%m4&T`4!?JGH3vXGn9=4sml*64I?&5HF zH=BmiSrFQ*`6NycV47gme#?Ib|J0v5lENcTj^phu5HsokTzC<8$N51U_HvdCHpy_9 z1cD;h@{{Z(Nzjc9=(du*8W{l%4lk(*?kl^RUDLngwH&^=H;>3};CHu?-NfPj9KN-G zch|Gq2Ag<0OuUoB2l$C^AxTr=zCM}>jFrO7cT8jX-W)$0?j@WX!$IR;~*)nrP9Xqg%%!8^kS_+JEUkXz^f z*MM2{lkjf%YxKJiIry6X0o?U-^grPZaKNa5hgr&0Gc91k&STmb4|6HwgLk|aFpJDS2Wlk}l!5iEvVEdWy2KEm2HuhQeBzuZ| zmwlf-&3?vy!G6V_WxolE3K|#W58{HB1+55L6|_2NP0;3`T|s+;ZVx&b^gz&4K`#cK z2zoQ!tjln&^2ZHYkek}M%@H4^B z1-}&hO7QXE6Cv`D2_aKL>>-UIu8@w91tBD4dC10)Eg@S&wukHq=?duy*&A{)G$=GG zG%hqDG%++OG&wXgG%M5)njM-GY6&e1tqh$KIxTcY=&aDELthR(8TwY}C!wE(ei8ar z*z~a0u(@HbFn8EHVV{S68FnV@>+sp(ZQ)D9mxZqgzdHPy@N2`@hOZCb7=B&&_2CD? zZwB_@ekk}JuRluE`)swER8vm|y&qoi5VDw!);DY;IvRkB^OQ_>~rk?fW1 zliVwLLUKg%lH_H{G09t!Pb6PT&PcwN{2=*Ba!&GV1Qj8RNQlUZutZoR@*@f(Y!Sr~ zr4gee#za&^jEk5P(G<}f(Hb!~!WH3;Xpitl_#@^=ER0wju_fZ3h&LmCjZBOzkGwQ; zbL3r-$0N^1{v7#hUMcx>34Y+9~ap-YC6Edb9L^^gihW(ubsnrH@J8#6>_yaRvs@OD%Z*L<&)&K@_P9c`84?q`7HTt`5bwZyjk8Vzf#W0uaYm9 zuavKnua>Wouaj?(Z<248Z;{_6KQ8|P%zG9JLsbZaChhmpv zkD^P_qu8t1r?^{jui}2igNlb0k0>5fJfV19@nf_i+8A9M-5$LpdTI2s=oQhcqt`^Q zi{22uEBZk6ZP9l`ABw&^`rha#qmM)%kA6M+&FHtI-;X{W{bBUS(LX3@rA8U2Oi(5& zla$HIRON8xNM(jnr_?LQC@YlXl;f2XloORT$~xs_%T-sXh-$OyF4Zfl zGwN`4raDh;Qx~gC)nnC{s4LY~>gnoM^*nW(x?Sy6`_-I!t$LGsvwDkqhkBQKkGe~J zP<>eanEDCz5%n|b=hUyM-%!7$KBXzsOw`nB>NQg}(={_Sb2aUnB^shxs#&gCsad7j zqS>vvMe~^E3C&ZQr!~)Nj%r@eyrg+Wb6j&m^O@!g%~zVUnr}4UX@1cBq&cVgRr7l+ ziVcrVip`I$jctj&B6d^k&e%I+pNl;jdn)!!oIcJRR~c6mH!E&loIh@U+`_oUahJy} zk6RhHDsFY$nz(gw`{JI6dnaBN9}}MtpBO(PULS9aH^rOdbK^(HSH@SxSI19^pBg_s zer9|_ygmM!`1|5Ni2pMFO#H72bOM_YoDiBIO^_!j5|jz5grNz;6ZA<1Nu!d+B-JI& zNNP-KPg;_6WfGTkRnqdLl}W3Tu1~rlXFPG?N7;}$>GV8oSmGLY)Q5z=O-5?*Ck({ zd}H#7gQwmZhr!=MbQaVx=q%2CgEM-Z`l_^V8Hl%DyxjtoU%8r!XDV-@jDSK1y zPkBD&y_9cLgHtuB!&7roN2M00mZgqKy(G0JwLW!f>WtKeRD0^O)EiRwr@oweD)pn( zPgB20J(K!P>MyCkrJ*!BjZF(qOGq=OjZ14ziqZAiN=ZA;p=v>j>prahW=D($_r z(<3b-i$*#}wvXI8^7r)cbZL52x-vaBJt2Kqx;A}WdVBhk^cCr=(yvWlm%cH5d-~4w zJ?Y))H>Tf|emMPD`sW!z8N)Jk8HNl~h9x5}qab5)#_WtG86@MX%#)e#W`2=*Ci9!j z?=yeOJf}<0rRj$2M(VP4MY_qlX}X!Z*}6tuv(Bk=={!2Gu0yv_w@$ZFcb#sFZkukW zZjY{8w^w(w?iStcx`Vn`vv5{aRzg;B*3_&kvo>elm-TekTUnoE{i=`D%k{DPG<}9X zS6`|ht)HfE)Hmy$`g!_=`sMno^{e%3^&9lp>9^>6^f&4E>u=THp+BU*TYs|sHW@Y>?lBxQ{9p_*rW*5% z<;Essi*c^eW%L-m#t!2G<09imUi*+a5NWsk|O%AS~A zn>{&uYIbw>rP&Lz7iTZYCfS>_w`A|hekA+J?9 znI@~L)HK>O)^v%f#^f})P0LJcOgEUen|7Ig%L&Sn=fvb_b24%!=gi1inX@xzZ_dLx zkLSFR^N*Ylb3V!WEazKugjr@*m~+gz=6v%gbFsP1JjPsM9%pVcx0vUe+sy4|pSi<) zg?YL8YV&IITJw7IPV*jfw|TGmkog|-{pN?v&zhe%zi58N{D%1>^C#xd&0m_&S!5Q4 zCB~w$#9IBgeAk0WieVRER~ijOSNT^rOqGRtDOG+G>%rIt?1QcF`*H4PxnJadpZmKNSt%=H4YGza|{Gz1(_*b+z>d>vrodYp1oxdXsg(^n+@4$8*5YBl5A=ixRmC4 literal 0 HcmV?d00001 diff --git a/Examples/SyncUps/SyncUps.xcodeproj/xcshareddata/xcschemes/SyncUps.xcscheme b/Examples/SyncUps/SyncUps.xcodeproj/xcshareddata/xcschemes/SyncUps.xcscheme new file mode 100644 index 0000000..25f9667 --- /dev/null +++ b/Examples/SyncUps/SyncUps.xcodeproj/xcshareddata/xcschemes/SyncUps.xcscheme @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SyncUps/SyncUps.xcodeproj/xcuserdata/danil.xcuserdatad/xcschemes/xcschememanagement.plist b/Examples/SyncUps/SyncUps.xcodeproj/xcuserdata/danil.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..ab11eed --- /dev/null +++ b/Examples/SyncUps/SyncUps.xcodeproj/xcuserdata/danil.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,35 @@ + + + + + SchemeUserState + + SyncUps.xcscheme_^#shared#^_ + + orderHint + 0 + + Tagged (Playground) 1.xcscheme + + isShown + + orderHint + 5 + + Tagged (Playground) 2.xcscheme + + isShown + + orderHint + 6 + + Tagged (Playground).xcscheme + + isShown + + orderHint + 3 + + + + diff --git a/Examples/SyncUps/SyncUps.xctestplan b/Examples/SyncUps/SyncUps.xctestplan new file mode 100644 index 0000000..76fce95 --- /dev/null +++ b/Examples/SyncUps/SyncUps.xctestplan @@ -0,0 +1,36 @@ +{ + "configurations" : [ + { + "id" : "010513FF-66DF-47DB-B263-451122E2CE20", + "name" : "Test Scheme Action", + "options" : { + + } + } + ], + "defaultOptions" : { + "targetForVariableExpansion" : { + "containerPath" : "container:SyncUps.xcodeproj", + "identifier" : "DC808D6E29E9C3AC0072B4A9", + "name" : "SyncUps" + } + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:SyncUps.xcodeproj", + "identifier" : "DC808D7E29E9C3AD0072B4A9", + "name" : "SyncUpsTests" + } + }, + { + "enabled" : false, + "target" : { + "containerPath" : "container:SyncUps.xcodeproj", + "identifier" : "DC808D8829E9C3AD0072B4A9", + "name" : "SyncUpsUITests" + } + } + ], + "version" : 1 +} diff --git a/Examples/SyncUps/SyncUps/App.swift b/Examples/SyncUps/SyncUps/App.swift new file mode 100644 index 0000000..b71f1d9 --- /dev/null +++ b/Examples/SyncUps/SyncUps/App.swift @@ -0,0 +1,29 @@ +import ComposableArchitecture +import SwiftUI + +@main +struct SyncUpsApp: App { + let store = Store(initialState: AppFeature.State()) { + AppFeature() + ._printChanges() + } withDependencies: { + if ProcessInfo.processInfo.environment["UITesting"] == "true" { + $0.dataManager = .mock() + } + } + + var body: some Scene { + WindowGroup { + // NB: This conditional is here only to facilitate UI testing so that we can mock out certain + // dependencies for the duration of the test (e.g. the data manager). We do not really + // recommend performing UI tests in general, but we do want to demonstrate how it can be + // done. + if _XCTIsTesting { + // NB: Don't run application when testing so that it doesn't interfere with tests. + EmptyView() + } else { + AppView(store: store) + } + } + } +} diff --git a/Examples/SyncUps/SyncUps/AppFeature.swift b/Examples/SyncUps/SyncUps/AppFeature.swift new file mode 100644 index 0000000..ce8ac10 --- /dev/null +++ b/Examples/SyncUps/SyncUps/AppFeature.swift @@ -0,0 +1,128 @@ +import ComposableArchitecture +import SwiftUI + +@Reducer +struct AppFeature { + @Reducer(state: .equatable) + enum Path { + case detail(SyncUpDetail) + case meeting(Meeting, syncUp: SyncUp) + case record(RecordMeeting) + } + + @ObservableState + struct State: Equatable { + var path = StackState() + var syncUpsList = SyncUpsList.State() + } + + enum Action { + case path(StackActionOf) + case syncUpsList(SyncUpsList.Action) + } + + @Dependency(\.continuousClock) var clock + @Dependency(\.date.now) var now + @Dependency(\.dataManager.save) var saveData + @Dependency(\.uuid) var uuid + + private enum CancelID { + case saveDebounce + } + + var body: some ReducerOf { + Scope(state: \.syncUpsList, action: \.syncUpsList) { + SyncUpsList() + } + Reduce { state, action in + switch action { + case let .path(.element(id, .detail(.delegate(delegateAction)))): + guard case let .some(.detail(detailState)) = state.path[id: id] + else { return .none } + + switch delegateAction { + case .deleteSyncUp: + state.syncUpsList.syncUps.remove(id: detailState.syncUp.id) + return .none + + case let .syncUpUpdated(syncUp): + state.syncUpsList.syncUps[id: syncUp.id] = syncUp + return .none + + case .startMeeting: + state.path.append(.record(RecordMeeting.State(syncUp: detailState.syncUp))) + return .none + } + + case let .path(.element(_, .record(.delegate(delegateAction)))): + switch delegateAction { + case let .save(transcript: transcript): + guard let id = state.path.ids.dropLast().last + else { + XCTFail( + """ + Record meeting is the only element in the stack. A detail feature should precede it. + """ + ) + return .none + } + + state.path[id: id]?.detail?.syncUp.meetings.insert( + Meeting( + id: Meeting.ID(self.uuid()), + date: self.now, + transcript: transcript + ), + at: 0 + ) + guard let syncUp = state.path[id: id]?.detail?.syncUp + else { return .none } + state.syncUpsList.syncUps[id: syncUp.id] = syncUp + return .none + } + + case .path: + return .none + + case .syncUpsList: + return .none + } + } + .forEach(\.path, action: \.path) + + Reduce { state, action in + return .run { [syncUps = state.syncUpsList.syncUps] _ in + try await withTaskCancellation(id: CancelID.saveDebounce, cancelInFlight: true) { + try await self.clock.sleep(for: .seconds(1)) + try await self.saveData(JSONEncoder().encode(syncUps), .syncUps) + } + } catch: { _, _ in + } + } + } +} + +struct AppView: View { + @Bindable var store: StoreOf + + var body: some View { + NavigationStack(path: $store.scope(state: \.path, action: \.path)) { + SyncUpsListView( + store: store.scope(state: \.syncUpsList, action: \.syncUpsList) + ) + } destination: { store in + switch store.case { + case let .detail(store): + SyncUpDetailView(store: store) + case let .meeting(meeting, syncUp): + MeetingView(meeting: meeting, syncUp: syncUp) + case let .record(store): + RecordMeetingView(store: store) + } + } + } +} + +extension URL { + static let syncUps = Self.documentsDirectory.appending(component: "sync-ups.json") +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/AccentColor.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/bubblegum.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/bubblegum.colorset/Contents.json new file mode 100644 index 0000000..849c4cb --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/bubblegum.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.820", + "green" : "0.502", + "red" : "0.933" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.820", + "green" : "0.502", + "red" : "0.933" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/buttercup.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/buttercup.colorset/Contents.json new file mode 100644 index 0000000..92c0b5a --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/buttercup.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.588", + "green" : "0.945", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.588", + "green" : "0.945", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/indigo.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/indigo.colorset/Contents.json new file mode 100644 index 0000000..d9daea3 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/indigo.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.443", + "green" : "0.000", + "red" : "0.212" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.443", + "green" : "0.000", + "red" : "0.212" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/lavender.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/lavender.colorset/Contents.json new file mode 100644 index 0000000..f95edce --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/lavender.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.808", + "red" : "0.812" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.808", + "red" : "0.812" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/magenta.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/magenta.colorset/Contents.json new file mode 100644 index 0000000..b20bdf5 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/magenta.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.467", + "green" : "0.075", + "red" : "0.647" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.467", + "green" : "0.075", + "red" : "0.647" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/navy.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/navy.colorset/Contents.json new file mode 100644 index 0000000..821f22f --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/navy.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.255", + "green" : "0.078", + "red" : "0.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.255", + "green" : "0.078", + "red" : "0.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/orange.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/orange.colorset/Contents.json new file mode 100644 index 0000000..863c8c7 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/orange.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.259", + "green" : "0.545", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.259", + "green" : "0.545", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/oxblood.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/oxblood.colorset/Contents.json new file mode 100644 index 0000000..0821af2 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/oxblood.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.043", + "green" : "0.027", + "red" : "0.290" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.043", + "green" : "0.027", + "red" : "0.290" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/periwinkle.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/periwinkle.colorset/Contents.json new file mode 100644 index 0000000..8d29c91 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/periwinkle.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.510", + "red" : "0.525" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.510", + "red" : "0.525" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/poppy.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/poppy.colorset/Contents.json new file mode 100644 index 0000000..d6a984f --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/poppy.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.369", + "green" : "0.369", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.369", + "green" : "0.369", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/purple.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/purple.colorset/Contents.json new file mode 100644 index 0000000..b19089a --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/purple.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.949", + "green" : "0.294", + "red" : "0.569" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.949", + "green" : "0.294", + "red" : "0.569" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/seafoam.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/seafoam.colorset/Contents.json new file mode 100644 index 0000000..39065d2 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/seafoam.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.898", + "green" : "0.918", + "red" : "0.796" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.898", + "green" : "0.918", + "red" : "0.796" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/sky.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/sky.colorset/Contents.json new file mode 100644 index 0000000..91e8248 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/sky.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.573", + "red" : "0.431" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.573", + "red" : "0.431" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/tan.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/tan.colorset/Contents.json new file mode 100644 index 0000000..e42a672 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/tan.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.494", + "green" : "0.608", + "red" : "0.761" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.494", + "green" : "0.608", + "red" : "0.761" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/teal.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/teal.colorset/Contents.json new file mode 100644 index 0000000..a43d657 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/teal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.620", + "green" : "0.561", + "red" : "0.133" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.620", + "green" : "0.561", + "red" : "0.133" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/yellow.colorset/Contents.json b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/yellow.colorset/Contents.json new file mode 100644 index 0000000..ce3b3be --- /dev/null +++ b/Examples/SyncUps/SyncUps/Assets.xcassets/Themes/yellow.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.302", + "green" : "0.875", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.302", + "green" : "0.875", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SyncUps/SyncUps/Dependencies/DataManager.swift b/Examples/SyncUps/SyncUps/Dependencies/DataManager.swift new file mode 100644 index 0000000..68ea0b0 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Dependencies/DataManager.swift @@ -0,0 +1,57 @@ +import ComposableArchitecture +import Foundation + +@DependencyClient +struct DataManager: Sendable { + var load: @Sendable (_ from: URL) throws -> Data + var save: @Sendable (Data, _ to: URL) async throws -> Void +} + +extension DataManager: DependencyKey { + static let liveValue = Self( + load: { url in try Data(contentsOf: url) }, + save: { data, url in try data.write(to: url) } + ) + + static let testValue = Self() +} + +extension DependencyValues { + var dataManager: DataManager { + get { self[DataManager.self] } + set { self[DataManager.self] = newValue } + } +} + +extension DataManager { + static func mock(initialData: Data? = nil) -> Self { + let data = LockIsolated(initialData) + return Self( + load: { _ in + guard let data = data.value + else { + struct FileNotFound: Error {} + throw FileNotFound() + } + return data + }, + save: { newData, _ in data.setValue(newData) } + ) + } + + static let failToWrite = Self( + load: { _ in Data() }, + save: { _, _ in + struct SaveError: Error {} + throw SaveError() + } + ) + + static let failToLoad = Self( + load: { _ in + struct LoadError: Error {} + throw LoadError() + }, + save: { _, _ in } + ) +} diff --git a/Examples/SyncUps/SyncUps/Dependencies/OpenSettings.swift b/Examples/SyncUps/SyncUps/Dependencies/OpenSettings.swift new file mode 100644 index 0000000..835fe9b --- /dev/null +++ b/Examples/SyncUps/SyncUps/Dependencies/OpenSettings.swift @@ -0,0 +1,19 @@ +import Dependencies +import UIKit + +extension DependencyValues { + var openSettings: @Sendable () async -> Void { + get { self[OpenSettingsKey.self] } + set { self[OpenSettingsKey.self] = newValue } + } + + private enum OpenSettingsKey: DependencyKey { + typealias Value = @Sendable () async -> Void + + static let liveValue: @Sendable () async -> Void = { + await MainActor.run { + UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!) + } + } + } +} diff --git a/Examples/SyncUps/SyncUps/Dependencies/SpeechRecognizer.swift b/Examples/SyncUps/SyncUps/Dependencies/SpeechRecognizer.swift new file mode 100644 index 0000000..f7fe525 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Dependencies/SpeechRecognizer.swift @@ -0,0 +1,192 @@ +import ComposableArchitecture +@preconcurrency import Speech + +@DependencyClient +struct SpeechClient { + var authorizationStatus: @Sendable () -> SFSpeechRecognizerAuthorizationStatus = { .denied } + var requestAuthorization: @Sendable () async -> SFSpeechRecognizerAuthorizationStatus = { + .denied + } + var startTask: + @Sendable (_ request: SFSpeechAudioBufferRecognitionRequest) async -> AsyncThrowingStream< + SpeechRecognitionResult, Error + > = { _ in .finished() } +} + +extension SpeechClient: DependencyKey { + static var liveValue: SpeechClient { + let speech = Speech() + return SpeechClient( + authorizationStatus: { SFSpeechRecognizer.authorizationStatus() }, + requestAuthorization: { + await withUnsafeContinuation { continuation in + SFSpeechRecognizer.requestAuthorization { status in + continuation.resume(returning: status) + } + } + }, + startTask: { request in + await speech.startTask(request: request) + } + ) + } + + static var previewValue: SpeechClient { + let isRecording = ActorIsolated(false) + return Self( + authorizationStatus: { .authorized }, + requestAuthorization: { .authorized }, + startTask: { _ in + AsyncThrowingStream { continuation in + Task { @MainActor in + await isRecording.setValue(true) + var finalText = """ + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor \ + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ + exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute \ + irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \ + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui \ + officia deserunt mollit anim id est laborum. + """ + var text = "" + while await isRecording.value { + let word = finalText.prefix { $0 != " " } + try await Task.sleep(for: .milliseconds(word.count * 50 + .random(in: 0...200))) + finalText.removeFirst(word.count) + if finalText.first == " " { + finalText.removeFirst() + } + text += word + " " + continuation.yield( + SpeechRecognitionResult( + bestTranscription: Transcription( + formattedString: text + ), + isFinal: false + ) + ) + } + } + } + } + ) + } + + static let testValue = SpeechClient() + + static func fail(after duration: Duration) -> Self { + return Self( + authorizationStatus: { .authorized }, + requestAuthorization: { .authorized }, + startTask: { request in + AsyncThrowingStream { continuation in + Task { + let start = ContinuousClock.now + do { + for try await result in await Self.previewValue.startTask(request) { + if ContinuousClock.now - start > duration { + struct SpeechRecognitionFailed: Error {} + continuation.finish(throwing: SpeechRecognitionFailed()) + break + } else { + continuation.yield(result) + } + } + continuation.finish() + } catch { + continuation.finish(throwing: error) + } + } + } + } + ) + } +} + +extension DependencyValues { + var speechClient: SpeechClient { + get { self[SpeechClient.self] } + set { self[SpeechClient.self] = newValue } + } +} + +struct SpeechRecognitionResult: Equatable { + var bestTranscription: Transcription + var isFinal: Bool +} + +struct Transcription: Equatable { + var formattedString: String +} + +extension SpeechRecognitionResult { + init(_ speechRecognitionResult: SFSpeechRecognitionResult) { + self.bestTranscription = Transcription(speechRecognitionResult.bestTranscription) + self.isFinal = speechRecognitionResult.isFinal + } +} + +extension Transcription { + init(_ transcription: SFTranscription) { + self.formattedString = transcription.formattedString + } +} + +private actor Speech { + private var audioEngine: AVAudioEngine? = nil + private var recognitionTask: SFSpeechRecognitionTask? = nil + private var recognitionContinuation: + AsyncThrowingStream.Continuation? + + func startTask( + request: SFSpeechAudioBufferRecognitionRequest + ) -> AsyncThrowingStream { + AsyncThrowingStream { continuation in + self.recognitionContinuation = continuation + let audioSession = AVAudioSession.sharedInstance() + do { + try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers) + try audioSession.setActive(true, options: .notifyOthersOnDeactivation) + } catch { + continuation.finish(throwing: error) + return + } + + self.audioEngine = AVAudioEngine() + let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))! + self.recognitionTask = speechRecognizer.recognitionTask(with: request) { result, error in + switch (result, error) { + case let (.some(result), _): + continuation.yield(SpeechRecognitionResult(result)) + case (_, .some): + continuation.finish(throwing: error) + case (.none, .none): + fatalError("It should not be possible to have both a nil result and nil error.") + } + } + + continuation.onTermination = { [audioEngine, recognitionTask] _ in + _ = speechRecognizer + audioEngine?.stop() + audioEngine?.inputNode.removeTap(onBus: 0) + recognitionTask?.finish() + } + + self.audioEngine?.inputNode.installTap( + onBus: 0, + bufferSize: 1024, + format: self.audioEngine?.inputNode.outputFormat(forBus: 0) + ) { buffer, when in + request.append(buffer) + } + + self.audioEngine?.prepare() + do { + try self.audioEngine?.start() + } catch { + continuation.finish(throwing: error) + return + } + } + } +} diff --git a/Examples/SyncUps/SyncUps/Meeting.swift b/Examples/SyncUps/SyncUps/Meeting.swift new file mode 100644 index 0000000..caacc60 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Meeting.swift @@ -0,0 +1,27 @@ +import ComposableArchitecture +import SwiftUI + +struct MeetingView: View { + let meeting: Meeting + let syncUp: SyncUp + + var body: some View { + ScrollView { + VStack(alignment: .leading) { + Divider() + .padding(.bottom) + Text("Attendees") + .font(.headline) + ForEach(self.syncUp.attendees) { attendee in + Text(attendee.name) + } + Text("Transcript") + .font(.headline) + .padding(.top) + Text(self.meeting.transcript) + } + } + .navigationTitle(Text(self.meeting.date, style: .date)) + .padding() + } +} diff --git a/Examples/SyncUps/SyncUps/Models.swift b/Examples/SyncUps/SyncUps/Models.swift new file mode 100644 index 0000000..ee3e724 --- /dev/null +++ b/Examples/SyncUps/SyncUps/Models.swift @@ -0,0 +1,115 @@ +import IdentifiedCollections +import SwiftUI +import Tagged + +struct SyncUp: Equatable, Identifiable, Codable { + let id: Tagged + var attendees: IdentifiedArrayOf = [] + var duration: Duration = .seconds(60 * 5) + var meetings: IdentifiedArrayOf = [] + var theme: Theme = .bubblegum + var title = "" + + var durationPerAttendee: Duration { + self.duration / self.attendees.count + } +} + +struct Attendee: Equatable, Identifiable, Codable { + let id: Tagged + var name = "" +} + +struct Meeting: Equatable, Identifiable, Codable { + let id: Tagged + let date: Date + var transcript: String +} + +enum Theme: String, CaseIterable, Equatable, Identifiable, Codable { + case bubblegum + case buttercup + case indigo + case lavender + case magenta + case navy + case orange + case oxblood + case periwinkle + case poppy + case purple + case seafoam + case sky + case tan + case teal + case yellow + + var id: Self { self } + + var accentColor: Color { + switch self { + case .bubblegum, .buttercup, .lavender, .orange, .periwinkle, .poppy, .seafoam, .sky, .tan, + .teal, .yellow: + return .black + case .indigo, .magenta, .navy, .oxblood, .purple: + return .white + } + } + + var mainColor: Color { Color(self.rawValue) } + + var name: String { self.rawValue.capitalized } +} + +extension SyncUp { + static let mock = Self( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID(), name: "Blob"), + Attendee(id: Attendee.ID(), name: "Blob Jr"), + Attendee(id: Attendee.ID(), name: "Blob Sr"), + Attendee(id: Attendee.ID(), name: "Blob Esq"), + Attendee(id: Attendee.ID(), name: "Blob III"), + Attendee(id: Attendee.ID(), name: "Blob I"), + ], + duration: .seconds(60), + meetings: [ + Meeting( + id: Meeting.ID(), + date: Date().addingTimeInterval(-60 * 60 * 24 * 7), + transcript: """ + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor \ + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ + exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \ + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \ + Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ + mollit anim id est laborum. + """ + ) + ], + theme: .orange, + title: "Design" + ) + + static let engineeringMock = Self( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID(), name: "Blob"), + Attendee(id: Attendee.ID(), name: "Blob Jr"), + ], + duration: .seconds(60 * 10), + theme: .periwinkle, + title: "Engineering" + ) + + static let designMock = Self( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID(), name: "Blob Sr"), + Attendee(id: Attendee.ID(), name: "Blob Jr"), + ], + duration: .seconds(60 * 30), + theme: .poppy, + title: "Product" + ) +} diff --git a/Examples/SyncUps/SyncUps/RecordMeeting.swift b/Examples/SyncUps/SyncUps/RecordMeeting.swift new file mode 100644 index 0000000..d0c4401 --- /dev/null +++ b/Examples/SyncUps/SyncUps/RecordMeeting.swift @@ -0,0 +1,390 @@ +import ComposableArchitecture +import Speech +import SwiftUI + +@Reducer +struct RecordMeeting { + @ObservableState + struct State: Equatable { + @Presents var alert: AlertState? + var secondsElapsed = 0 + var speakerIndex = 0 + var syncUp: SyncUp + var transcript = "" + + var durationRemaining: Duration { + self.syncUp.duration - .seconds(self.secondsElapsed) + } + } + + enum Action { + case alert(PresentationAction) + case delegate(Delegate) + case endMeetingButtonTapped + case nextButtonTapped + case onTask + case timerTick + case speechFailure + case speechResult(SpeechRecognitionResult) + + @CasePathable + enum Alert { + case confirmDiscard + case confirmSave + } + @CasePathable + enum Delegate { + case save(transcript: String) + } + } + + @Dependency(\.continuousClock) var clock + @Dependency(\.dismiss) var dismiss + @Dependency(\.speechClient) var speechClient + + var body: some ReducerOf { + Reduce { state, action in + switch action { + case .alert(.presented(.confirmDiscard)): + return .run { _ in + await self.dismiss() + } + + case .alert(.presented(.confirmSave)): + return .run { [transcript = state.transcript] send in + await send(.delegate(.save(transcript: transcript))) + await self.dismiss() + } + + case .alert: + return .none + + case .delegate: + return .none + + case .endMeetingButtonTapped: + state.alert = .endMeeting(isDiscardable: true) + return .none + + case .nextButtonTapped: + guard state.speakerIndex < state.syncUp.attendees.count - 1 + else { + state.alert = .endMeeting(isDiscardable: false) + return .none + } + state.speakerIndex += 1 + state.secondsElapsed = + state.speakerIndex * Int(state.syncUp.durationPerAttendee.components.seconds) + return .none + + case .onTask: + return .run { send in + let authorization = + await self.speechClient.authorizationStatus() == .notDetermined + ? self.speechClient.requestAuthorization() + : self.speechClient.authorizationStatus() + + await withTaskGroup(of: Void.self) { group in + if authorization == .authorized { + group.addTask { + await self.startSpeechRecognition(send: send) + } + } + group.addTask { + await self.startTimer(send: send) + } + } + } + + case .timerTick: + guard state.alert == nil + else { return .none } + + state.secondsElapsed += 1 + + let secondsPerAttendee = Int(state.syncUp.durationPerAttendee.components.seconds) + if state.secondsElapsed.isMultiple(of: secondsPerAttendee) { + if state.speakerIndex == state.syncUp.attendees.count - 1 { + return .run { [transcript = state.transcript] send in + await send(.delegate(.save(transcript: transcript))) + await self.dismiss() + } + } + state.speakerIndex += 1 + } + + return .none + + case .speechFailure: + if !state.transcript.isEmpty { + state.transcript += " ❌" + } + state.alert = .speechRecognizerFailed + return .none + + case let .speechResult(result): + state.transcript = result.bestTranscription.formattedString + return .none + } + } + .ifLet(\.$alert, action: \.alert) + } + + private func startSpeechRecognition(send: Send) async { + do { + let speechTask = await self.speechClient.startTask(SFSpeechAudioBufferRecognitionRequest()) + for try await result in speechTask { + await send(.speechResult(result)) + } + } catch { + await send(.speechFailure) + } + } + + private func startTimer(send: Send) async { + for await _ in self.clock.timer(interval: .seconds(1)) { + await send(.timerTick) + } + } +} + +struct RecordMeetingView: View { + @Bindable var store: StoreOf + + var body: some View { + ZStack { + RoundedRectangle(cornerRadius: 16) + .fill(store.syncUp.theme.mainColor) + + VStack { + MeetingHeaderView( + secondsElapsed: store.secondsElapsed, + durationRemaining: store.durationRemaining, + theme: store.syncUp.theme + ) + MeetingTimerView( + syncUp: store.syncUp, + speakerIndex: store.speakerIndex + ) + MeetingFooterView( + syncUp: store.syncUp, + nextButtonTapped: { + store.send(.nextButtonTapped) + }, + speakerIndex: store.speakerIndex + ) + } + } + .padding() + .foregroundColor(store.syncUp.theme.accentColor) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("End meeting") { + store.send(.endMeetingButtonTapped) + } + } + } + .navigationBarBackButtonHidden(true) + .alert($store.scope(state: \.alert, action: \.alert)) + .task { await store.send(.onTask).finish() } + } +} + +extension AlertState where Action == RecordMeeting.Action.Alert { + static func endMeeting(isDiscardable: Bool) -> Self { + Self { + TextState("End meeting?") + } actions: { + ButtonState(action: .confirmSave) { + TextState("Save and end") + } + if isDiscardable { + ButtonState(role: .destructive, action: .confirmDiscard) { + TextState("Discard") + } + } + ButtonState(role: .cancel) { + TextState("Resume") + } + } message: { + TextState("You are ending the meeting early. What would you like to do?") + } + } + + static let speechRecognizerFailed = Self { + TextState("Speech recognition failure") + } actions: { + ButtonState(role: .cancel) { + TextState("Continue meeting") + } + ButtonState(role: .destructive, action: .confirmDiscard) { + TextState("Discard meeting") + } + } message: { + TextState( + """ + The speech recognizer has failed for some reason and so your meeting will no longer be \ + recorded. What do you want to do? + """ + ) + } +} + +struct MeetingHeaderView: View { + let secondsElapsed: Int + let durationRemaining: Duration + let theme: Theme + + var body: some View { + VStack { + ProgressView(value: self.progress) + .progressViewStyle(MeetingProgressViewStyle(theme: self.theme)) + HStack { + VStack(alignment: .leading) { + Text("Time Elapsed") + .font(.caption) + Label( + Duration.seconds(self.secondsElapsed).formatted(.units()), + systemImage: "hourglass.bottomhalf.fill" + ) + } + Spacer() + VStack(alignment: .trailing) { + Text("Time Remaining") + .font(.caption) + Label(self.durationRemaining.formatted(.units()), systemImage: "hourglass.tophalf.fill") + .font(.body.monospacedDigit()) + .labelStyle(.trailingIcon) + } + } + } + .padding([.top, .horizontal]) + } + + private var totalDuration: Duration { + .seconds(self.secondsElapsed) + self.durationRemaining + } + + private var progress: Double { + guard self.totalDuration > .seconds(0) else { return 0 } + return Double(self.secondsElapsed) / Double(self.totalDuration.components.seconds) + } +} + +struct MeetingProgressViewStyle: ProgressViewStyle { + var theme: Theme + + func makeBody(configuration: Configuration) -> some View { + ZStack { + RoundedRectangle(cornerRadius: 10) + .fill(self.theme.accentColor) + .frame(height: 20) + + ProgressView(configuration) + .tint(self.theme.mainColor) + .frame(height: 12) + .padding(.horizontal) + } + } +} + +struct MeetingTimerView: View { + let syncUp: SyncUp + let speakerIndex: Int + + var body: some View { + Circle() + .strokeBorder(lineWidth: 24) + .overlay { + VStack { + Group { + if self.speakerIndex < self.syncUp.attendees.count { + Text(self.syncUp.attendees[self.speakerIndex].name) + } else { + Text("Someone") + } + } + .font(.title) + Text("is speaking") + Image(systemName: "mic.fill") + .font(.largeTitle) + .padding(.top) + } + .foregroundStyle(self.syncUp.theme.accentColor) + } + .overlay { + ForEach(Array(self.syncUp.attendees.enumerated()), id: \.element.id) { index, attendee in + if index < self.speakerIndex + 1 { + SpeakerArc(totalSpeakers: self.syncUp.attendees.count, speakerIndex: index) + .rotation(Angle(degrees: -90)) + .stroke(self.syncUp.theme.mainColor, lineWidth: 12) + } + } + } + .padding(.horizontal) + } +} + +struct SpeakerArc: Shape { + let totalSpeakers: Int + let speakerIndex: Int + + func path(in rect: CGRect) -> Path { + let diameter = min(rect.size.width, rect.size.height) - 24 + let radius = diameter / 2 + let center = CGPoint(x: rect.midX, y: rect.midY) + return Path { path in + path.addArc( + center: center, + radius: radius, + startAngle: self.startAngle, + endAngle: self.endAngle, + clockwise: false + ) + } + } + + private var degreesPerSpeaker: Double { + 360 / Double(self.totalSpeakers) + } + private var startAngle: Angle { + Angle(degrees: self.degreesPerSpeaker * Double(self.speakerIndex) + 1) + } + private var endAngle: Angle { + Angle(degrees: self.startAngle.degrees + self.degreesPerSpeaker - 1) + } +} + +struct MeetingFooterView: View { + let syncUp: SyncUp + var nextButtonTapped: () -> Void + let speakerIndex: Int + + var body: some View { + VStack { + HStack { + if self.speakerIndex < self.syncUp.attendees.count - 1 { + Text("Speaker \(self.speakerIndex + 1) of \(self.syncUp.attendees.count)") + } else { + Text("No more speakers.") + } + Spacer() + Button(action: self.nextButtonTapped) { + Image(systemName: "forward.fill") + } + } + } + .padding([.bottom, .horizontal]) + } +} + +#Preview { + NavigationStack { + RecordMeetingView( + store: Store(initialState: RecordMeeting.State(syncUp: .mock)) { + RecordMeeting() + } + ) + } +} diff --git a/Examples/SyncUps/SyncUps/Resources/ding.wav b/Examples/SyncUps/SyncUps/Resources/ding.wav new file mode 100644 index 0000000000000000000000000000000000000000..5831df269dda704add693c6ff8468400559e22de GIT binary patch literal 535904 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

7{1zAqfq$7$2 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 literal 0 HcmV?d00001 diff --git a/Examples/SyncUps/SyncUps/SyncUpDetail.swift b/Examples/SyncUps/SyncUps/SyncUpDetail.swift new file mode 100644 index 0000000..2307386 --- /dev/null +++ b/Examples/SyncUps/SyncUps/SyncUpDetail.swift @@ -0,0 +1,279 @@ +import ComposableArchitecture +import SwiftUI + +@Reducer +struct SyncUpDetail { + @Reducer(state: .equatable) + enum Destination { + case alert(AlertState) + case edit(SyncUpForm) + + @CasePathable + enum Alert { + case confirmDeletion + case continueWithoutRecording + case openSettings + } + } + + @ObservableState + struct State: Equatable { + @Presents var destination: Destination.State? + var syncUp: SyncUp + } + + enum Action: Sendable { + case cancelEditButtonTapped + case delegate(Delegate) + case deleteButtonTapped + case deleteMeetings(atOffsets: IndexSet) + case destination(PresentationAction) + case doneEditingButtonTapped + case editButtonTapped + case startMeetingButtonTapped + + @CasePathable + enum Delegate { + case deleteSyncUp + case syncUpUpdated(SyncUp) + case startMeeting + } + } + + @Dependency(\.dismiss) var dismiss + @Dependency(\.openSettings) var openSettings + @Dependency(\.speechClient.authorizationStatus) var authorizationStatus + + var body: some ReducerOf { + Reduce { state, action in + switch action { + case .cancelEditButtonTapped: + state.destination = nil + return .none + + case .delegate: + return .none + + case .deleteButtonTapped: + state.destination = .alert(.deleteSyncUp) + return .none + + case let .deleteMeetings(atOffsets: indices): + state.syncUp.meetings.remove(atOffsets: indices) + return .none + + case let .destination(.presented(.alert(alertAction))): + switch alertAction { + case .confirmDeletion: + return .run { send in + await send(.delegate(.deleteSyncUp), animation: .default) + await self.dismiss() + } + case .continueWithoutRecording: + return .send(.delegate(.startMeeting)) + case .openSettings: + return .run { _ in + await self.openSettings() + } + } + + case .destination: + return .none + + case .doneEditingButtonTapped: + guard case let .some(.edit(editState)) = state.destination + else { return .none } + state.syncUp = editState.syncUp + state.destination = nil + return .none + + case .editButtonTapped: + state.destination = .edit(SyncUpForm.State(syncUp: state.syncUp)) + return .none + + case .startMeetingButtonTapped: + switch self.authorizationStatus() { + case .notDetermined, .authorized: + return .send(.delegate(.startMeeting)) + + case .denied: + state.destination = .alert(.speechRecognitionDenied) + return .none + + case .restricted: + state.destination = .alert(.speechRecognitionRestricted) + return .none + + @unknown default: + return .none + } + } + } + .ifLet(\.$destination, action: \.destination) + .onChange(of: \.syncUp) { oldValue, newValue in + Reduce { state, action in + .send(.delegate(.syncUpUpdated(newValue))) + } + } + } +} + +struct SyncUpDetailView: View { + @Bindable var store: StoreOf + + var body: some View { + Form { + Section { + Button { + store.send(.startMeetingButtonTapped) + } label: { + Label("Start Meeting", systemImage: "timer") + .font(.headline) + .foregroundColor(.accentColor) + } + HStack { + Label("Length", systemImage: "clock") + Spacer() + Text(store.syncUp.duration.formatted(.units())) + } + + HStack { + Label("Theme", systemImage: "paintpalette") + Spacer() + Text(store.syncUp.theme.name) + .padding(4) + .foregroundColor(store.syncUp.theme.accentColor) + .background(store.syncUp.theme.mainColor) + .cornerRadius(4) + } + } header: { + Text("Sync-up Info") + } + + if !store.syncUp.meetings.isEmpty { + Section { + ForEach(store.syncUp.meetings) { meeting in + NavigationLink( + state: AppFeature.Path.State.meeting(meeting, syncUp: store.syncUp) + ) { + HStack { + Image(systemName: "calendar") + Text(meeting.date, style: .date) + Text(meeting.date, style: .time) + } + } + } + .onDelete { indices in + store.send(.deleteMeetings(atOffsets: indices)) + } + } header: { + Text("Past meetings") + } + } + + Section { + ForEach(store.syncUp.attendees) { attendee in + Label(attendee.name, systemImage: "person") + } + } header: { + Text("Attendees") + } + + Section { + Button("Delete") { + store.send(.deleteButtonTapped) + } + .foregroundColor(.red) + .frame(maxWidth: .infinity) + } + } + .toolbar { + Button("Edit") { + store.send(.editButtonTapped) + } + } + .navigationTitle(store.syncUp.title) + .alert($store.scope(state: \.destination?.alert, action: \.destination.alert)) + .sheet(item: $store.scope(state: \.destination?.edit, action: \.destination.edit)) { store in + NavigationStack { + SyncUpFormView(store: store) + .navigationTitle(self.store.syncUp.title) + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Cancel") { + self.store.send(.cancelEditButtonTapped) + } + } + ToolbarItem(placement: .confirmationAction) { + Button("Done") { + self.store.send(.doneEditingButtonTapped) + } + } + } + } + } + } +} + +extension AlertState where Action == SyncUpDetail.Destination.Alert { + static let deleteSyncUp = Self { + TextState("Delete?") + } actions: { + ButtonState(role: .destructive, action: .confirmDeletion) { + TextState("Yes") + } + ButtonState(role: .cancel) { + TextState("Nevermind") + } + } message: { + TextState("Are you sure you want to delete this meeting?") + } + + static let speechRecognitionDenied = Self { + TextState("Speech recognition denied") + } actions: { + ButtonState(action: .continueWithoutRecording) { + TextState("Continue without recording") + } + ButtonState(action: .openSettings) { + TextState("Open settings") + } + ButtonState(role: .cancel) { + TextState("Cancel") + } + } message: { + TextState( + """ + You previously denied speech recognition and so your meeting will not be recorded. You can \ + enable speech recognition in settings, or you can continue without recording. + """ + ) + } + + static let speechRecognitionRestricted = Self { + TextState("Speech recognition restricted") + } actions: { + ButtonState(action: .continueWithoutRecording) { + TextState("Continue without recording") + } + ButtonState(role: .cancel) { + TextState("Cancel") + } + } message: { + TextState( + """ + Your device does not support speech recognition and so your meeting will not be recorded. + """ + ) + } +} + +#Preview { + NavigationStack { + SyncUpDetailView( + store: Store(initialState: SyncUpDetail.State(syncUp: .mock)) { + SyncUpDetail() + } + ) + } +} diff --git a/Examples/SyncUps/SyncUps/SyncUpForm.swift b/Examples/SyncUps/SyncUps/SyncUpForm.swift new file mode 100644 index 0000000..8a09b0a --- /dev/null +++ b/Examples/SyncUps/SyncUps/SyncUpForm.swift @@ -0,0 +1,138 @@ +import ComposableArchitecture +import SwiftUI +import SwiftUINavigation + +@Reducer +struct SyncUpForm { + @ObservableState + struct State: Equatable, Sendable { + var focus: Field? = .title + var syncUp: SyncUp + + init(focus: Field? = .title, syncUp: SyncUp) { + self.focus = focus + self.syncUp = syncUp + if self.syncUp.attendees.isEmpty { + @Dependency(\.uuid) var uuid + self.syncUp.attendees.append(Attendee(id: Attendee.ID(uuid()))) + } + } + + enum Field: Hashable { + case attendee(Attendee.ID) + case title + } + } + + enum Action: BindableAction, Equatable, Sendable { + case addAttendeeButtonTapped + case binding(BindingAction) + case deleteAttendees(atOffsets: IndexSet) + } + + @Dependency(\.uuid) var uuid + + var body: some ReducerOf { + BindingReducer() + Reduce { state, action in + switch action { + case .addAttendeeButtonTapped: + let attendee = Attendee(id: Attendee.ID(self.uuid())) + state.syncUp.attendees.append(attendee) + state.focus = .attendee(attendee.id) + return .none + + case .binding: + return .none + + case let .deleteAttendees(atOffsets: indices): + state.syncUp.attendees.remove(atOffsets: indices) + if state.syncUp.attendees.isEmpty { + state.syncUp.attendees.append(Attendee(id: Attendee.ID(self.uuid()))) + } + guard let firstIndex = indices.first + else { return .none } + let index = min(firstIndex, state.syncUp.attendees.count - 1) + state.focus = .attendee(state.syncUp.attendees[index].id) + return .none + } + } + } +} + +struct SyncUpFormView: View { + @Bindable var store: StoreOf + @FocusState var focus: SyncUpForm.State.Field? + + var body: some View { + Form { + Section { + TextField("Title", text: $store.syncUp.title) + .focused($focus, equals: .title) + HStack { + Slider(value: $store.syncUp.duration.minutes, in: 5...30, step: 1) { + Text("Length") + } + Spacer() + Text(store.syncUp.duration.formatted(.units())) + } + ThemePicker(selection: $store.syncUp.theme) + } header: { + Text("Sync-up Info") + } + Section { + ForEach($store.syncUp.attendees) { $attendee in + TextField("Name", text: $attendee.name) + .focused($focus, equals: .attendee(attendee.id)) + } + .onDelete { indices in + store.send(.deleteAttendees(atOffsets: indices)) + } + + Button("New attendee") { + store.send(.addAttendeeButtonTapped) + } + } header: { + Text("Attendees") + } + } + .bind($store.focus, to: $focus) + } +} + +struct ThemePicker: View { + @Binding var selection: Theme + + var body: some View { + Picker("Theme", selection: self.$selection) { + ForEach(Theme.allCases) { theme in + ZStack { + RoundedRectangle(cornerRadius: 4) + .fill(theme.mainColor) + Label(theme.name, systemImage: "paintpalette") + .padding(4) + } + .foregroundColor(theme.accentColor) + .fixedSize(horizontal: false, vertical: true) + .tag(theme) + } + } + } +} + +extension Duration { + fileprivate var minutes: Double { + get { Double(self.components.seconds / 60) } + set { self = .seconds(newValue * 60) } + } +} + +#Preview { + NavigationStack { + SyncUpFormView( + store: Store(initialState: SyncUpForm.State(syncUp: .mock)) { + SyncUpForm() + } + ) + } +} diff --git a/Examples/SyncUps/SyncUps/SyncUpsList.swift b/Examples/SyncUps/SyncUps/SyncUpsList.swift new file mode 100644 index 0000000..af755dc --- /dev/null +++ b/Examples/SyncUps/SyncUps/SyncUpsList.swift @@ -0,0 +1,233 @@ +import ComposableArchitecture +import SwiftUI + +@Reducer +struct SyncUpsList { + @Reducer(state: .equatable) + enum Destination { + case add(SyncUpForm) + case alert(AlertState) + + @CasePathable + enum Alert { + case confirmLoadMockData + } + } + + @ObservableState + struct State: Equatable { + @Presents var destination: Destination.State? + var syncUps: IdentifiedArrayOf = [] + + init(destination: Destination.State? = nil) { + self.destination = destination + + do { + @Dependency(\.dataManager.load) var load + self.syncUps = try JSONDecoder().decode(IdentifiedArray.self, from: load(.syncUps)) + } catch is DecodingError { + self.destination = .alert(.dataFailedToLoad) + } catch { + } + } + } + + enum Action { + case addSyncUpButtonTapped + case confirmAddSyncUpButtonTapped + case destination(PresentationAction) + case dismissAddSyncUpButtonTapped + case onDelete(IndexSet) + } + + @Dependency(\.continuousClock) var clock + @Dependency(\.uuid) var uuid + + var body: some ReducerOf { + Reduce { state, action in + switch action { + case .addSyncUpButtonTapped: + state.destination = .add(SyncUpForm.State(syncUp: SyncUp(id: SyncUp.ID(self.uuid())))) + return .none + + case .confirmAddSyncUpButtonTapped: + guard case let .some(.add(editState)) = state.destination + else { return .none } + var syncUp = editState.syncUp + syncUp.attendees.removeAll { attendee in + attendee.name.allSatisfy(\.isWhitespace) + } + if syncUp.attendees.isEmpty { + syncUp.attendees.append( + editState.syncUp.attendees.first + ?? Attendee(id: Attendee.ID(self.uuid())) + ) + } + state.syncUps.append(syncUp) + state.destination = nil + return .none + + case .destination(.presented(.alert(.confirmLoadMockData))): + state.syncUps = [ + .mock, + .designMock, + .engineeringMock, + ] + return .none + + case .destination: + return .none + + case .dismissAddSyncUpButtonTapped: + state.destination = nil + return .none + + case let .onDelete(indexSet): + state.syncUps.remove(atOffsets: indexSet) + return .none + } + } + .ifLet(\.$destination, action: \.destination) + } +} + +struct SyncUpsListView: View { + @Bindable var store: StoreOf + + var body: some View { + List { + ForEach(store.syncUps) { syncUp in + NavigationLink( + state: AppFeature.Path.State.detail(SyncUpDetail.State(syncUp: syncUp)) + ) { + CardView(syncUp: syncUp) + } + .listRowBackground(syncUp.theme.mainColor) + } + .onDelete { indexSet in + store.send(.onDelete(indexSet)) + } + } + .toolbar { + Button { + store.send(.addSyncUpButtonTapped) + } label: { + Image(systemName: "plus") + } + } + .navigationTitle("Daily Sync-ups") + .alert($store.scope(state: \.destination?.alert, action: \.destination.alert)) + .sheet(item: $store.scope(state: \.destination?.add, action: \.destination.add)) { store in + NavigationStack { + SyncUpFormView(store: store) + .navigationTitle("New sync-up") + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Dismiss") { + self.store.send(.dismissAddSyncUpButtonTapped) + } + } + ToolbarItem(placement: .confirmationAction) { + Button("Add") { + self.store.send(.confirmAddSyncUpButtonTapped) + } + } + } + } + } + } +} + +extension AlertState where Action == SyncUpsList.Destination.Alert { + static let dataFailedToLoad = Self { + TextState("Data failed to load") + } actions: { + ButtonState(action: .send(.confirmLoadMockData, animation: .default)) { + TextState("Yes") + } + ButtonState(role: .cancel) { + TextState("No") + } + } message: { + TextState( + """ + Unfortunately your past data failed to load. Would you like to load some mock data to play \ + around with? + """ + ) + } +} + +struct CardView: View { + let syncUp: SyncUp + + var body: some View { + VStack(alignment: .leading) { + Text(self.syncUp.title) + .font(.headline) + Spacer() + HStack { + Label("\(self.syncUp.attendees.count)", systemImage: "person.3") + Spacer() + Label(self.syncUp.duration.formatted(.units()), systemImage: "clock") + .labelStyle(.trailingIcon) + } + .font(.caption) + } + .padding() + .foregroundColor(self.syncUp.theme.accentColor) + } +} + +struct TrailingIconLabelStyle: LabelStyle { + func makeBody(configuration: Configuration) -> some View { + HStack { + configuration.title + configuration.icon + } + } +} + +extension LabelStyle where Self == TrailingIconLabelStyle { + static var trailingIcon: Self { Self() } +} + +#Preview { + SyncUpsListView( + store: Store(initialState: SyncUpsList.State()) { + SyncUpsList() + } withDependencies: { + $0.dataManager.load = { @Sendable _ in + try JSONEncoder().encode([ + SyncUp.mock, + .designMock, + .engineeringMock, + ]) + } + } + ) +} + +#Preview("Load data failure") { + SyncUpsListView( + store: Store(initialState: SyncUpsList.State()) { + SyncUpsList() + } withDependencies: { + $0.dataManager = .mock(initialData: Data("!@#$% bad data ^&*()".utf8)) + } + ) + .previewDisplayName("Load data failure") +} + +#Preview("Card") { + CardView( + syncUp: SyncUp( + id: SyncUp.ID(), + attendees: [], + duration: .seconds(60), + meetings: [], + theme: .bubblegum, + title: "Point-Free Morning Sync" + ) + ) +} diff --git a/Examples/SyncUps/SyncUpsTests/AppFeatureTests.swift b/Examples/SyncUps/SyncUpsTests/AppFeatureTests.swift new file mode 100644 index 0000000..cf07cfb --- /dev/null +++ b/Examples/SyncUps/SyncUpsTests/AppFeatureTests.swift @@ -0,0 +1,144 @@ +import ComposableArchitecture +import XCTest + +@testable import SyncUps + +final class AppFeatureTests: XCTestCase { + @MainActor + func testDelete() async throws { + let syncUp = SyncUp.mock + + let store = TestStore(initialState: AppFeature.State()) { + AppFeature() + } withDependencies: { + $0.continuousClock = ImmediateClock() + $0.dataManager = .mock( + initialData: try! JSONEncoder().encode([syncUp]) + ) + } + + await store.send(\.path.push, (id: 0, .detail(SyncUpDetail.State(syncUp: syncUp)))) { + $0.path[id: 0] = .detail(SyncUpDetail.State(syncUp: syncUp)) + } + + await store.send(\.path[id:0].detail.deleteButtonTapped) { + $0.path[id: 0]?.detail?.destination = .alert(.deleteSyncUp) + } + + await store.send(\.path[id:0].detail.destination.alert.confirmDeletion) { + $0.path[id: 0]?.detail?.destination = nil + } + + await store.receive(\.path[id:0].detail.delegate.deleteSyncUp) { + $0.syncUpsList.syncUps = [] + } + await store.receive(\.path.popFrom) { + $0.path = StackState() + } + } + + @MainActor + func testDetailEdit() async throws { + var syncUp = SyncUp.mock + let savedData = LockIsolated(Data?.none) + + let store = TestStore(initialState: AppFeature.State()) { + AppFeature() + } withDependencies: { dependencies in + dependencies.continuousClock = ImmediateClock() + dependencies.dataManager = .mock( + initialData: try! JSONEncoder().encode([syncUp]) + ) + dependencies.dataManager.save = { @Sendable [dependencies] data, url in + savedData.setValue(data) + try await dependencies.dataManager.save(data, to: url) + } + } + + await store.send(\.path.push, (id: 0, .detail(SyncUpDetail.State(syncUp: syncUp)))) { + $0.path[id: 0] = .detail(SyncUpDetail.State(syncUp: syncUp)) + } + + await store.send(\.path[id:0].detail.editButtonTapped) { + $0.path[id: 0]?.detail?.destination = .edit( + SyncUpForm.State(syncUp: syncUp) + ) + } + + syncUp.title = "Blob" + await store.send(\.path[id:0].detail.destination.edit.binding.syncUp, syncUp) { + $0.path[id: 0]?.detail?.destination?.edit?.syncUp.title = "Blob" + } + + await store.send(\.path[id:0].detail.doneEditingButtonTapped) { + $0.path[id: 0]?.detail?.destination = nil + $0.path[id: 0]?.detail?.syncUp.title = "Blob" + } + + await store.receive(\.path[id:0].detail.delegate.syncUpUpdated) { + $0.syncUpsList.syncUps[0].title = "Blob" + } + + var savedSyncUp = syncUp + savedSyncUp.title = "Blob" + XCTAssertNoDifference( + try JSONDecoder().decode([SyncUp].self, from: savedData.value!), + [savedSyncUp] + ) + } + + @MainActor + func testRecording() async { + let speechResult = SpeechRecognitionResult( + bestTranscription: Transcription(formattedString: "I completed the project"), + isFinal: true + ) + let syncUp = SyncUp( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + ], + duration: .seconds(6) + ) + + let store = TestStore( + initialState: AppFeature.State( + path: StackState([ + .detail(SyncUpDetail.State(syncUp: syncUp)), + .record(RecordMeeting.State(syncUp: syncUp)), + ]) + ) + ) { + AppFeature() + } withDependencies: { + $0.dataManager = .mock(initialData: try! JSONEncoder().encode([syncUp])) + $0.date.now = Date(timeIntervalSince1970: 1_234_567_890) + $0.continuousClock = ImmediateClock() + $0.speechClient.authorizationStatus = { .authorized } + $0.speechClient.startTask = { @Sendable _ in + AsyncThrowingStream { continuation in + continuation.yield(speechResult) + continuation.finish() + } + } + $0.uuid = .incrementing + } + store.exhaustivity = .off + + await store.send(\.path[id:1].record.onTask) + await store.receive(\.path[id:1].record.delegate.save) { + $0.path[id: 0]?.detail?.syncUp.meetings = [ + Meeting( + id: Meeting.ID(UUID(0)), + date: Date(timeIntervalSince1970: 1_234_567_890), + transcript: "I completed the project" + ) + ] + } + await store.receive(\.path.popFrom) { + XCTAssertEqual($0.path.count, 1) + } + } +} diff --git a/Examples/SyncUps/SyncUpsTests/RecordMeetingTests.swift b/Examples/SyncUps/SyncUpsTests/RecordMeetingTests.swift new file mode 100644 index 0000000..2b63f42 --- /dev/null +++ b/Examples/SyncUps/SyncUpsTests/RecordMeetingTests.swift @@ -0,0 +1,373 @@ +import ComposableArchitecture +import XCTest + +@testable import SyncUps + +final class RecordMeetingTests: XCTestCase { + @MainActor + func testTimer() async { + let clock = TestClock() + let dismissed = self.expectation(description: "dismissed") + + let store = TestStore( + initialState: RecordMeeting.State( + syncUp: SyncUp( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + ], + duration: .seconds(6) + ) + ) + ) { + RecordMeeting() + } withDependencies: { + $0.continuousClock = clock + $0.dismiss = DismissEffect { dismissed.fulfill() } + $0.speechClient.authorizationStatus = { .denied } + } + + let onTask = await store.send(.onTask) + + await clock.advance(by: .seconds(1)) + await store.receive(\.timerTick) { + $0.speakerIndex = 0 + $0.secondsElapsed = 1 + XCTAssertEqual($0.durationRemaining, .seconds(5)) + } + + await clock.advance(by: .seconds(1)) + await store.receive(\.timerTick) { + $0.speakerIndex = 1 + $0.secondsElapsed = 2 + XCTAssertEqual($0.durationRemaining, .seconds(4)) + } + + await clock.advance(by: .seconds(1)) + await store.receive(\.timerTick) { + $0.speakerIndex = 1 + $0.secondsElapsed = 3 + XCTAssertEqual($0.durationRemaining, .seconds(3)) + } + + await clock.advance(by: .seconds(1)) + await store.receive(\.timerTick) { + $0.speakerIndex = 2 + $0.secondsElapsed = 4 + XCTAssertEqual($0.durationRemaining, .seconds(2)) + } + + await clock.advance(by: .seconds(1)) + await store.receive(\.timerTick) { + $0.speakerIndex = 2 + $0.secondsElapsed = 5 + XCTAssertEqual($0.durationRemaining, .seconds(1)) + } + + await clock.advance(by: .seconds(1)) + await store.receive(\.timerTick) { + $0.speakerIndex = 2 + $0.secondsElapsed = 6 + XCTAssertEqual($0.durationRemaining, .seconds(0)) + } + + // NB: this improves on the onMeetingFinished pattern from vanilla SwiftUI + await store.receive(\.delegate.save) + + #if swift(>=5.10) + nonisolated(unsafe) let `self` = self + #endif + await self.fulfillment(of: [dismissed]) + await onTask.cancel() + } + + @MainActor + func testRecordTranscript() async { + let clock = TestClock() + let dismissed = self.expectation(description: "dismissed") + + let store = TestStore( + initialState: RecordMeeting.State( + syncUp: SyncUp( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + ], + duration: .seconds(6) + ) + ) + ) { + RecordMeeting() + } withDependencies: { + $0.continuousClock = clock + $0.dismiss = DismissEffect { dismissed.fulfill() } + $0.speechClient.authorizationStatus = { .authorized } + $0.speechClient.startTask = { @Sendable _ in + AsyncThrowingStream { continuation in + continuation.yield( + SpeechRecognitionResult( + bestTranscription: Transcription(formattedString: "I completed the project"), + isFinal: true + ) + ) + continuation.finish() + } + } + } + + let onTask = await store.send(.onTask) + + await store.receive(\.speechResult) { + $0.transcript = "I completed the project" + } + + await store.withExhaustivity(.off(showSkippedAssertions: true)) { + await clock.advance(by: .seconds(6)) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + } + + await store.receive(\.delegate.save) + + #if swift(>=5.10) + nonisolated(unsafe) let `self` = self + #endif + await self.fulfillment(of: [dismissed]) + await onTask.cancel() + } + + @MainActor + func testEndMeetingSave() async { + let clock = TestClock() + let dismissed = self.expectation(description: "dismissed") + + let store = TestStore(initialState: RecordMeeting.State(syncUp: .mock)) { + RecordMeeting() + } withDependencies: { + $0.continuousClock = clock + $0.dismiss = DismissEffect { dismissed.fulfill() } + $0.speechClient.authorizationStatus = { .denied } + } + + let onTask = await store.send(.onTask) + + await store.send(.endMeetingButtonTapped) { + $0.alert = .endMeeting(isDiscardable: true) + } + + await clock.advance(by: .seconds(3)) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + + await store.send(\.alert.confirmSave) { + $0.alert = nil + } + + await store.receive(\.delegate.save) + + #if swift(>=5.10) + nonisolated(unsafe) let `self` = self + #endif + await self.fulfillment(of: [dismissed]) + await onTask.cancel() + } + + @MainActor + func testEndMeetingDiscard() async { + let clock = TestClock() + let dismissed = self.expectation(description: "dismissed") + + let store = TestStore(initialState: RecordMeeting.State(syncUp: .mock)) { + RecordMeeting() + } withDependencies: { + $0.continuousClock = clock + $0.dismiss = DismissEffect { dismissed.fulfill() } + $0.speechClient.authorizationStatus = { .denied } + } + + let task = await store.send(.onTask) + + await store.send(.endMeetingButtonTapped) { + $0.alert = .endMeeting(isDiscardable: true) + } + + await store.send(\.alert.confirmDiscard) { + $0.alert = nil + } + + #if swift(>=5.10) + nonisolated(unsafe) let `self` = self + #endif + await self.fulfillment(of: [dismissed]) + await task.cancel() + } + + @MainActor + func testNextSpeaker() async { + let clock = TestClock() + let dismissed = self.expectation(description: "dismissed") + + let store = TestStore( + initialState: RecordMeeting.State( + syncUp: SyncUp( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + ], + duration: .seconds(6) + ) + ) + ) { + RecordMeeting() + } withDependencies: { + $0.continuousClock = clock + $0.dismiss = DismissEffect { dismissed.fulfill() } + $0.speechClient.authorizationStatus = { .denied } + } + + let onTask = await store.send(.onTask) + + await store.send(.nextButtonTapped) { + $0.speakerIndex = 1 + $0.secondsElapsed = 2 + } + + await store.send(.nextButtonTapped) { + $0.speakerIndex = 2 + $0.secondsElapsed = 4 + } + + await store.send(.nextButtonTapped) { + $0.alert = .endMeeting(isDiscardable: false) + } + + await store.send(\.alert.confirmSave) { + $0.alert = nil + } + + await store.receive(\.delegate.save) + #if swift(>=5.10) + nonisolated(unsafe) let `self` = self + #endif + await self.fulfillment(of: [dismissed]) + await onTask.cancel() + } + + @MainActor + func testSpeechRecognitionFailure_Continue() async { + let clock = TestClock() + let dismissed = self.expectation(description: "dismissed") + + let store = TestStore( + initialState: RecordMeeting.State( + syncUp: SyncUp( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + ], + duration: .seconds(6) + ) + ) + ) { + RecordMeeting() + } withDependencies: { + $0.continuousClock = clock + $0.dismiss = DismissEffect { dismissed.fulfill() } + $0.speechClient.authorizationStatus = { .authorized } + $0.speechClient.startTask = { @Sendable _ in + AsyncThrowingStream { + $0.yield( + SpeechRecognitionResult( + bestTranscription: Transcription(formattedString: "I completed the project"), + isFinal: true + ) + ) + struct SpeechRecognitionFailure: Error {} + $0.finish(throwing: SpeechRecognitionFailure()) + } + } + } + + let onTask = await store.send(.onTask) + + await store.receive(\.speechResult) { + $0.transcript = "I completed the project" + } + + await store.receive(\.speechFailure) { + $0.alert = .speechRecognizerFailed + $0.transcript = "I completed the project ❌" + } + + await store.send(\.alert.dismiss) { + $0.alert = nil + } + + await clock.advance(by: .seconds(6)) + + store.exhaustivity = .off(showSkippedAssertions: true) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + await store.receive(\.timerTick) + store.exhaustivity = .on + + await store.receive(\.delegate.save) + #if swift(>=5.10) + nonisolated(unsafe) let `self` = self + #endif + await self.fulfillment(of: [dismissed]) + await onTask.cancel() + } + + @MainActor + func testSpeechRecognitionFailure_Discard() async { + let clock = TestClock() + let dismissed = self.expectation(description: "dismissed") + + let store = TestStore(initialState: RecordMeeting.State(syncUp: .mock)) { + RecordMeeting() + } withDependencies: { + $0.continuousClock = clock + $0.dismiss = DismissEffect { dismissed.fulfill() } + $0.speechClient.authorizationStatus = { .authorized } + $0.speechClient.startTask = { @Sendable _ in + AsyncThrowingStream { + struct SpeechRecognitionFailure: Error {} + $0.finish(throwing: SpeechRecognitionFailure()) + } + } + } + + let onTask = await store.send(.onTask) + + await store.receive(\.speechFailure) { + $0.alert = .speechRecognizerFailed + } + + await store.send(\.alert.confirmDiscard) { + $0.alert = nil + } + + #if swift(>=5.10) + nonisolated(unsafe) let `self` = self + #endif + await self.fulfillment(of: [dismissed]) + await onTask.cancel() + } +} diff --git a/Examples/SyncUps/SyncUpsTests/SyncUpDetailTests.swift b/Examples/SyncUps/SyncUpsTests/SyncUpDetailTests.swift new file mode 100644 index 0000000..a237d02 --- /dev/null +++ b/Examples/SyncUps/SyncUpsTests/SyncUpDetailTests.swift @@ -0,0 +1,138 @@ +import ComposableArchitecture +import XCTest + +@testable import SyncUps + +final class SyncUpDetailTests: XCTestCase { + @MainActor + func testSpeechRestricted() async { + let store = TestStore(initialState: SyncUpDetail.State(syncUp: .mock)) { + SyncUpDetail() + } withDependencies: { + $0.speechClient.authorizationStatus = { .restricted } + } + + await store.send(.startMeetingButtonTapped) { + $0.destination = .alert(.speechRecognitionRestricted) + } + } + + @MainActor + func testSpeechDenied() async throws { + let store = TestStore(initialState: SyncUpDetail.State(syncUp: .mock)) { + SyncUpDetail() + } withDependencies: { + $0.speechClient.authorizationStatus = { + .denied + } + } + + await store.send(.startMeetingButtonTapped) { + $0.destination = .alert(.speechRecognitionDenied) + } + } + + @MainActor + func testOpenSettings() async { + let settingsOpened = LockIsolated(false) + + let store = TestStore( + initialState: SyncUpDetail.State( + destination: .alert(.speechRecognitionDenied), + syncUp: .mock + ) + ) { + SyncUpDetail() + } withDependencies: { + $0.openSettings = { settingsOpened.setValue(true) } + $0.speechClient.authorizationStatus = { .denied } + } + + await store.send(\.destination.alert.openSettings) { + $0.destination = nil + } + XCTAssertEqual(settingsOpened.value, true) + } + + @MainActor + func testContinueWithoutRecording() async throws { + let store = TestStore( + initialState: SyncUpDetail.State( + destination: .alert(.speechRecognitionDenied), + syncUp: .mock + ) + ) { + SyncUpDetail() + } withDependencies: { + $0.speechClient.authorizationStatus = { .denied } + } + + await store.send(\.destination.alert.continueWithoutRecording) { + $0.destination = nil + } + + await store.receive(\.delegate.startMeeting) + } + + @MainActor + func testSpeechAuthorized() async throws { + let store = TestStore(initialState: SyncUpDetail.State(syncUp: .mock)) { + SyncUpDetail() + } withDependencies: { + $0.speechClient.authorizationStatus = { .authorized } + } + + await store.send(.startMeetingButtonTapped) + + await store.receive(\.delegate.startMeeting) + } + + @MainActor + func testEdit() async { + var syncUp = SyncUp.mock + let store = TestStore(initialState: SyncUpDetail.State(syncUp: syncUp)) { + SyncUpDetail() + } withDependencies: { + $0.uuid = .incrementing + } + + await store.send(.editButtonTapped) { + $0.destination = .edit(SyncUpForm.State(syncUp: syncUp)) + } + + syncUp.title = "Blob's Meeting" + await store.send(\.destination.edit.binding.syncUp, syncUp) { + $0.destination?.edit?.syncUp.title = "Blob's Meeting" + } + + await store.send(.doneEditingButtonTapped) { + $0.destination = nil + $0.syncUp.title = "Blob's Meeting" + } + + await store.receive(\.delegate.syncUpUpdated) + } + + @MainActor + func testDelete() async { + let didDismiss = LockIsolated(false) + defer { XCTAssertEqual(didDismiss.value, true) } + + let syncUp = SyncUp.mock + let store = TestStore(initialState: SyncUpDetail.State(syncUp: syncUp)) { + SyncUpDetail() + } withDependencies: { + $0.dismiss = DismissEffect { + didDismiss.setValue(true) + } + } + + await store.send(.deleteButtonTapped) { + $0.destination = .alert(.deleteSyncUp) + } + await store.send(\.destination.alert.confirmDeletion) { + $0.destination = nil + } + await store.receive(\.delegate.deleteSyncUp) + } +} diff --git a/Examples/SyncUps/SyncUpsTests/SyncUpFormTests.swift b/Examples/SyncUps/SyncUpsTests/SyncUpFormTests.swift new file mode 100644 index 0000000..66dc787 --- /dev/null +++ b/Examples/SyncUps/SyncUpsTests/SyncUpFormTests.swift @@ -0,0 +1,91 @@ +import ComposableArchitecture +import XCTest + +@testable import SyncUps + +final class SyncUpFormTests: XCTestCase { + @MainActor + func testAddAttendee() async { + let store = TestStore( + initialState: SyncUpForm.State( + syncUp: SyncUp( + id: SyncUp.ID(), + attendees: [], + title: "Engineering" + ) + ) + ) { + SyncUpForm() + } withDependencies: { + $0.uuid = .incrementing + } + + XCTAssertNoDifference( + store.state.syncUp.attendees, + [ + Attendee(id: Attendee.ID(UUID(0))) + ] + ) + + await store.send(.addAttendeeButtonTapped) { + $0.focus = .attendee(Attendee.ID(UUID(1))) + $0.syncUp.attendees = [ + Attendee(id: Attendee.ID(UUID(0))), + Attendee(id: Attendee.ID(UUID(1))), + ] + } + } + + @MainActor + func testFocus_RemoveAttendee() async { + let store = TestStore( + initialState: SyncUpForm.State( + syncUp: SyncUp( + id: SyncUp.ID(), + attendees: [ + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + Attendee(id: Attendee.ID()), + ], + title: "Engineering" + ) + ) + ) { + SyncUpForm() + } withDependencies: { + $0.uuid = .incrementing + } + + await store.send(.deleteAttendees(atOffsets: [0])) { + $0.focus = .attendee($0.syncUp.attendees[1].id) + $0.syncUp.attendees = [ + $0.syncUp.attendees[1], + $0.syncUp.attendees[2], + $0.syncUp.attendees[3], + ] + } + + await store.send(.deleteAttendees(atOffsets: [1])) { + $0.focus = .attendee($0.syncUp.attendees[2].id) + $0.syncUp.attendees = [ + $0.syncUp.attendees[0], + $0.syncUp.attendees[2], + ] + } + + await store.send(.deleteAttendees(atOffsets: [1])) { + $0.focus = .attendee($0.syncUp.attendees[0].id) + $0.syncUp.attendees = [ + $0.syncUp.attendees[0] + ] + } + + await store.send(.deleteAttendees(atOffsets: [0])) { + $0.focus = .attendee(Attendee.ID(UUID(0))) + $0.syncUp.attendees = [ + Attendee(id: Attendee.ID(UUID(0))) + ] + } + } +} diff --git a/Examples/SyncUps/SyncUpsTests/SyncUpsListTests.swift b/Examples/SyncUps/SyncUpsTests/SyncUpsListTests.swift new file mode 100644 index 0000000..1cdf676 --- /dev/null +++ b/Examples/SyncUps/SyncUpsTests/SyncUpsListTests.swift @@ -0,0 +1,116 @@ +import ComposableArchitecture +import XCTest + +@testable import SyncUps + +final class SyncUpsListTests: XCTestCase { + @MainActor + func testAdd() async throws { + let store = TestStore(initialState: SyncUpsList.State()) { + SyncUpsList() + } withDependencies: { + $0.continuousClock = ImmediateClock() + $0.dataManager = .mock() + $0.uuid = .incrementing + } + + var syncUp = SyncUp( + id: SyncUp.ID(UUID(0)), + attendees: [ + Attendee(id: Attendee.ID(UUID(1))) + ] + ) + await store.send(.addSyncUpButtonTapped) { + $0.destination = .add(SyncUpForm.State(syncUp: syncUp)) + } + + syncUp.title = "Engineering" + await store.send(\.destination.add.binding.syncUp, syncUp) { + $0.destination?.add?.syncUp.title = "Engineering" + } + + await store.send(.confirmAddSyncUpButtonTapped) { + $0.destination = nil + $0.syncUps = [syncUp] + } + } + + @MainActor + func testAdd_ValidatedAttendees() async throws { + @Dependency(\.uuid) var uuid + + let store = TestStore( + initialState: SyncUpsList.State( + destination: .add( + SyncUpForm.State( + syncUp: SyncUp( + id: SyncUp.ID(uuidString: "deadbeef-dead-beef-dead-beefdeadbeef")!, + attendees: [ + Attendee(id: Attendee.ID(uuid()), name: ""), + Attendee(id: Attendee.ID(uuid()), name: " "), + ], + title: "Design" + ) + ) + ) + ) + ) { + SyncUpsList() + } withDependencies: { + $0.continuousClock = ImmediateClock() + $0.dataManager = .mock() + $0.uuid = .incrementing + } + + await store.send(.confirmAddSyncUpButtonTapped) { + $0.destination = nil + $0.syncUps = [ + SyncUp( + id: SyncUp.ID(uuidString: "deadbeef-dead-beef-dead-beefdeadbeef")!, + attendees: [ + Attendee(id: Attendee.ID(UUID(0))) + ], + title: "Design" + ) + ] + } + } + + @MainActor + func testLoadingDataDecodingFailed() async throws { + let store = TestStore(initialState: SyncUpsList.State()) { + SyncUpsList() + } withDependencies: { + $0.continuousClock = ImmediateClock() + $0.dataManager = .mock( + initialData: Data("!@#$ BAD DATA %^&*()".utf8) + ) + } + + XCTAssertEqual(store.state.destination, .alert(.dataFailedToLoad)) + + await store.send(\.destination.alert.confirmLoadMockData) { + $0.destination = nil + $0.syncUps = [ + .mock, + .designMock, + .engineeringMock, + ] + } + } + + @MainActor + func testLoadingDataFileNotFound() async throws { + let store = TestStore(initialState: SyncUpsList.State()) { + SyncUpsList() + } withDependencies: { + $0.continuousClock = ImmediateClock() + $0.dataManager.load = { @Sendable _ in + struct FileNotFound: Error {} + throw FileNotFound() + } + } + + XCTAssertEqual(store.state.destination, nil) + } +} diff --git a/Examples/SyncUps/SyncUpsUITests/SyncUpsUITests.swift b/Examples/SyncUps/SyncUpsUITests/SyncUpsUITests.swift new file mode 100644 index 0000000..072b5dd --- /dev/null +++ b/Examples/SyncUps/SyncUpsUITests/SyncUpsUITests.swift @@ -0,0 +1,46 @@ +import XCTest + +final class SyncUpsUITests: XCTestCase { + @MainActor + var app: XCUIApplication! + + @MainActor + override func setUpWithError() throws { + continueAfterFailure = false + app = XCUIApplication() + app.launchEnvironment = [ + "UITesting": "true" + ] + } + + // This test demonstrates the simple flow of tapping the "Add" button, filling in some fields in + // the form, and then adding the sync-up to the list. It's a very simple test, but it takes + // approximately 10 seconds to run, and it depends on a lot of internal implementation details to + // get right, such as tapping a button with the literal label "Add". + // + // This test is also written in the simpler, "unit test" style in SyncUpsListTests.swift, where + // it takes 0.025 seconds (400 times faster) and it even tests more. It further confirms that when + // the sync-up is added to the list its data will be persisted to disk so that it will be + // available on next launch. + @MainActor + func testAdd() throws { + app.launch() + app.navigationBars["Daily Sync-ups"].buttons["Add"].tap() + + let collectionViews = app.collectionViews + let titleTextField = collectionViews.textFields["Title"] + let nameTextField = collectionViews.textFields["Name"] + + titleTextField.typeText("Engineering") + + nameTextField.tap() + nameTextField.typeText("Blob") + + collectionViews.buttons["New attendee"].tap() + app.typeText("Blob Jr.") + + app.navigationBars["New sync-up"].buttons["Add"].tap() + + XCTAssertEqual(collectionViews.staticTexts["Engineering"].exists, true) + } +} diff --git a/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png b/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b1516e5a122b534ae5a9d14706d6248718aeb03a GIT binary patch literal 7569 zcmV;C9d6=@P)p}m%1tPVS3CbI>oj% z-5i!c7;Ccv@XG=amOz~On}0%cYfIfUO!OxgQ!An0eP-F!bKVC%wk`2_dD9L*=Ao%$ zdbZMK=)fKiKY#2DM?MSjOFvwf*R`oC?y~#FL2>L#Hmn5SBHFM-(^YpLz2-X^$P3^k zK5xWq6bO%neEEw4c~AUehY#=*I9;3Q^Hxp67&`NPi4#jGusl_V4je}x&PM}25tvgS zr!3FasGGDGR@LolDkk*0tEf#fJj}p;mzLYgocO^g@_9l@GhFN&$!kL?<2Ci8Fh?MW@S&X3`#*M3*=H zdWgO~zf_q}9>2pTQ3CRL#(Fe7EIJf88~vXZvcYXz2ZAs!{1QcyUwbs?&#e>mFjDNE zp&JhIdD}4vAu#ZHL9b?ahUCx-AR{4b0>I|GL$+=mGL-nunu$Y(j^VQ1xz)K=w&eKe#j~e`6YoIZZjGEYs7}P;csvodpiT-*3 zGz5U`^6jjJ?Z78wqPr)MHL!sxRo~oZ&FG>j%7;Qs)JE3i9DUF~Zr2k4d@wpx=bBz@ z(EB5pfK~L-Bk=2&>HIXG9;3o8I6a2K`&2<6uIgn`!As(zot~#EK#!6=)GE8^^G?WvLN1a~ zp;<@mSwpiX0MxY}fa}Xz<4r~?qOy|>AY~b21}bB!u^JG_TL)=I)$Sg)(NuNlv!4ol zA^`Y)+w+w5U$RC3+4PAs*VjY880f@HmQCju3#w1v7rC#$G^4V1YXD8<*Q7stU*l#C z`CjghCg)6%GOa&-TTcW|H?whBbhCF@0W+qnL|{; z--%8Sz4diH9nMo=8bG!^z?1?w=H;?%=XtgU7)~vNTeCJlbd!!N=L2M>^)Rlv)ATfv zaTXyEj7*5NCk242N2U(TJ5i+ptO-!D>w^biEvvHLb7tb9e+0vNfcVRc=qwE&KvSn; zR?1fCM9p!18yP}V>%aRGL^@DCzp%dWojGlD=Z^jBGi#4fN&OOghghA+8}(J_38;Xe zE(NWn8rJs!I?I{>C~0Di9{$n;9jllMWL(xBft_Tye$6thM=_>a6&w|sP_w227KX<&YtL5hmt!z2$Gc<@omR!#r7K_|J89mvzHmMLn_vNQ zAEOO=9x9^;>{yp!eH)gyDvkQd{Q~ic167(MM6Nf(8Mme;czt%-xXxj5*--dqNRiDP|K!N>eOTY)pt>FQkBbj(5Agoq^7j4X zmy&!X0A&8qQdaM6BT*FBKf7Q`^H}DWavNBN*JZ{sgt1{L*S2JV(;Al7&K}K;PDhie z*Cl+fwW=C(Sy{JJD6L=FJZBMA;yCt9smUv-uTz(StWdVb^XmV5C} z+selh&HmeNwKq5ag6n7wMPgo`x(RM+=y_tScI2=szUiu%+BLPpP-CE%O zk~&sD+&mVo7(x>KpmHQmR63H6+mOSOWS<{f9*h?C6wXBRJ1Qfxgy0T52@ZgU&uh2O zHy@sFSb*zXa?Wl0fcU4Q(JY+mn)$Ta?Q_w*u@*-3O>liN)$#5`re;#315F^kel(pX zScxRo{)53Z%^JL|68FSDc?CBSQ0ehTKYx5%oYHlAjBm(lPCEdR6CMxe{%!G#VR`;; zx6VZi=JjotGVaT%yZ-J?oL=$7R4yk!01 zd({==ocn?q7^LCO5Bd)IGxoc?axl3U87-*9I4ff>)ka0E%hZW2d*euraUoUr0H#dV z<0P;Qp$W?zvjU9z*>JH3dwOGXlFuIBiB%e+ZBY8V)s<`_1@AH>cd420_1R!iU3rWN zcs02-paei~UE*NJEH-^ctV{O!GqFSxBD>;D0M`=*cjB{0V)@zlrBVF2x{d=J4;S#| zeJ0ENUc+_vnN&Puvy*iva@)v~@;FH~pyDbpz%;fzI}oj;2=(zYVNvIJu<%{&;V+Hy zuPKVi^Ys$btTUUXPaoacvJ9U6`M2HPUzsiN`nXzhO{6N)fQ)%}!m0FA7wQmQ7NLYl z)1<7)mnWr@Nif}0nSoXlaow>lmItGi>y652BRJo1&)3TU?j#8-`jpK>b>I9hKl_9A z2glfQ*vv>9Be zmw$mif+;f%i^Gke{fw`1hxhulzr_2-$+69VZpo+{-W*sq&=yRk7Go-d(v#*rm74?M zDurSU`s3-EO6t~G(?wscdt#Zcl|&cG0mqb1Mw-F1eU-cTUZ3$-aQ7$o?E=GFx{ieC z(iDC`T0lo?YO=?hi-iVjdJ-6CkqJ2N3s!G5{K?;+7Fsh67=D<_H4wM)LMQ2)mO*M-X3@fKcfLPZSIXA=kb&fyq`(Fw=}UU9!!pd8 zi0deRe>-xm?#pNSRXo^uzqtEVaUz(^x(y<*G! zUZ1M0zMl3I>mq4aLdMqbz~k#ssZ+YCDoC@A-0LnurAffF7tbb~@z;my0nBy@-s_(q zE59{Q@;WTb%S_d;_`TlkF6MA|P!zd#qygyCQ53_@>xo$c#lrUbuJYoRwLnq^cKXs| z$!D@m*YNvu%|l*OUyN68*!*7aE&WHFS#USbV`13;a-obLGc#jxc$p6`GvnZLIb_Bp z15TO_HtxQiliLaM6xTFrS${V2fdC)@D(#DH=$~l&S7iX;_mNAXVlmU-xoskc2X< zRR#6V?jPd{D^t0Ya+vSNOtYX7lby+z71p4W>( zNp;nwaZ?U48cJZ!+F<0QSG}BKO@S33%2K5NrB+qkb$aCN2TqJEmJ{N5V9eWFGZq#o zmI>yuSZ8ZFGUV%*B*S_AvX^_v!9Dv!#-&niPWdHLwq9}zE0GCSLqi1yWiE$|G;4O` z-)fgH?OuVefw=acMlIt`#+$k)jID?5Ev#r-Ssk~Z^LB1Fn;B1}SDl>djZ<1x-D)$| z_M8H`FWULl&|D5pnJT^OkwFPW_gG~9KCVL6AduxXaV{s>j?shnJ$>HV!g9d0EgEyw zK+dM!cf3-@myFogpN0nClj%^36rxpLaf-{Konor2L>98U&hu9V87vd)dvz>6}GzwOv}T6_I1cHopeRcwWC^7wOJ?e@6VtH4K0k?GnlD35)IvuKj&{8Gd_mfz%() zzZ&&ny}^#}+?g`4D3GUA=~0jG+)9S@zVQ>^>h~-Stw}Tgk!Qizz?_QQbM+d04UB%h zF)Y#7?%bX*#G|rNE4u`6Ss-hG02469tp$ZSfRFb~XBK z&?-zAg%3RYP@!tk?PfLb=**1=#<_Vt`!U^2nlpNl7AaF*Fq4;jUN2;SQx40gBCqw= zi~+h`Yg_bSR(2$gVa)kDSm6YP{l@AHL#EE_;?;pEnZ%=(ajV(P_(%O_IhtaJ2GgoA8V#2w zbV(68r5E3GoyC?uU*L0klqocUW~NE?6Jc;Mn``4nCfB$&x_xs5d)6#rbyEZyyqUnb zUZ~v4@_K{LZ*mxYuSKe&)}U*AYzEQ9Qu$^NXN z^PW z3bjuK!C5-5Vf=i%M0B~%L+El!a9(HJak%`yjosD2f7NlGvaDAfdo>6*8oLRNWjU9> z7L}*S(l|o`WunfYi&2ecV89#)C5a&!EgA1R-hv-2cma|mD#`dvTYbq3P6grFniR^Q zD?xjgi==y(>LM94n`_c7b|0W0*~t3O_8U>TB}x@dCVN7nNp640wHJKqv2MYq3JZPl zk;nb;d`$X23wY;LDc#^RB%>fA^KDLtWLY;yNfG6t&>W5CS;%%QnR4ho2g*V?Ra4Sg zbO~y3eaVAsC>tE?>!bVzTsezYf*{q!$(UnBlakd@l4}i}u_8J)Ux2Qfl6M{dQ#WK5 zya)z~NL0MABRe?eMQ1omx8~gfbEgvLb4J#9*g(b3|p3>AIP3beX1opW-QncT( zp{y+FQb|QmqRyf8L>~9coCt!*`~AD!icuSHb|0Z<_=b=kBTb%N|_ zbeS_+u*VBF5>Q2^gJjTU*MqU@RbcIYf#siHiGN1?r@ogQ#a=$?SF!wV*cDK_Vic(q zA=>Exu4Rr8jqiOg*C6+&q?ob>wi`E+2X`)C8D|45fl~px zDA^S?(z^CVl8bD|k;y|UBYEd-D}ugHU{Fnh+Dz~IaliVvSa_5+xuJ447M3CRr$`lY zy@`GOAS_pV`WXfN>tp%0B8he(+8YrAo(fgmj{2xb7fEdwu2XTR-r98bd7)NqcNuXaYmSTQtTN)S~tJd@el4%826tc_|~5=&L9B?^SCq z_@mzZdcoYKo1gRLb@!UOy&sjg?8k@N*#01f>9Dbf4O-wJ;+kmUhr-BTJUYwZGN~K8 z?Da+Q$KGoSekt7Mc6q&m*Vn=252DiH0LCA)8hNLIy@?<5o|p;wqi7@wkkOT(gCCn^ zt!qIJWsD4XHlR$a$iI5hdQJQa2d~WQ)ql=jer&;-dsm1G1QTW?quZw{joa{=lj1JHtd5u>OOnrqc)92G`agYBkv6IjTLY3x<3r-i!S_8Si61>v3|e&+WA_B;z_$r!0Z@*z=|Z-C#<^~ zaT#9qhMq(jU{3`Y3Q%l(#6}4oIY+ORU4{ZJ|J>h%JUJ#yA~%g-X~}6f5wIJ*{xsK6dj+`_bk+a`#$NtN`>t!YxK#vW zoOLlu=MFz-Tem-$`eC>nYPYrTKlE}c82H5piw0k*qW`@7deCrj(f3>zaC^dZZy)kA zVs;&RHy=@CaPyI3Mdpe@AL8M&WbTsu1+4|#+&Thzh0HC};)jgPy}(D&@@7of33tAk z`_NgRC2MjPUQ_sTP!Dzmgnehpt81TK@6+Si3OSF|Ji8FEN--30jj!)YS zr)SNRvu4N*aj5LYDV-O%-7CIJw`4c*akP?M_N{=PC&O>8LL`C?z<=y?*(9w*4?9mz8k` zR@XiEZNEy^?Vn0cmIEZa>;GqkjB?Zlf*?8* z0i^8v&(P7eP4vzi@~2t>a|M42d>D=DTKUwE<{x-Gf9x0NFOLoOM<0#-`(nI4G;>tO zA4l;dO*D40r(?!1EUHlL1e`?sf#}c#{`T{mt%CHTG9ElBF&==rm7dZrv!OtH@ymXQ z=+Ff9bk)+1ra<^l2F~_={e(d}^xjhWi@)vO1IEK?kLF-^qB>NwYGiq>&3P_RcfgtE z{b-1Y(Dpp2BQkkT8O;L!c`V_3IY3Tgq6#{Pb!^Xx;Gj!nzH(*{5t@Zx=T!ur-khJh zr}O6&a|4fg31uGom+)ZY`s<8Gt|as#?WbU-(I(nqggPSo%E_h`VQ<;(uw<~$zG zrW|~@nnKv{$ft*4)30+^JS%I_#(sLPqwFM63ou8w-z83{dQz$TE*6&IZaQz0e4&{Y z^4zu!rVdwhZG?UtT@~13MXL@TAs2l@0q8!zR{(g|#{X9K^Tj@xI_{qQo2h^Dn{Wxm zZyNpqe|U@uy#RM}BCB!%7!vh{6wRuqd7?1Up+M*K7NAcBd+_V?r-Yl!qr~LIfm&1j z(-glz`#3YlkFDCqPBc7j&O^3ov=nHQcWSgepEJ((^R)o}vYW2MeBDhKJGk2Py3Gtt zgZ$h!@6fa}qI(4zYniJmsQ}NXK>KN*dA{^4ktZc?yXiK}H?I=ffGdqXXzL2RyroZ( zKD&0KTSFe=WRLWu07P`J0JQr=bg^Au-s}X?DY)7va2t9Bu6O`<>xW{p&&TN3;twJ?(uaTdz@^03JUEL0+BTojoj+@(U{n> zSKhD+r)bD8v5k4*Wg!`}BRnvbz-9;wuiSPwafX z{kh)J5Qj`06(|I1?TMo=n#6>d3+&vZnv51Y6b)qou@7Opj;w?4bu5a8$_^B`EN-&0x|8+JH`3z#Vivs4UPfua-Ug-8}eH$8h`hezZx~=4>~d zWj{S2WpLbol9MLJ)gu(&vzQO$+y1-O>A^4%)c&@0hq80cl>O(P|5)~# zE!wcDy+1Y?k8Xi0{W$1peL3jaz^G^OCt{3-;(xA>&-JxHX#J^K6CdO}SRhV5G%t^C zhZW7w=*E@Unigirqo8BA0j0ks>|@41rnF+=n(tSV@eZ2{h&>rCO)dFos6OZ~`^S17 zR(a;g%19I^h~&9;293P($Mk|PB&lL_8r`_Oy~J705Ktt| zOwTjSU+Nz=-^#-~@-8sfQ+@06%MSU_-{Ir(6r4#cS6i4p(bMwZFCcX>{i*$pz2_tN zqUCVOU8(tLivPjztiP%~)vpVLK4Y@hj(q9!_E#AlIFOlm)P%o$Tz-DVHyVl$#g{`^ ntNGtMR7Wi^8hzjBsRjN5&Tosh?FL{m00000NkvXXu0mjfxb+&b literal 0 HcmV?d00001 diff --git a/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png b/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..869cd81f3aee14834f60b9fb9bb87b3ec53a2840 GIT binary patch literal 9893 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 XN$)>5c`(j700000NkvXXu0mjfLN#h7 literal 0 HcmV?d00001 diff --git a/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png b/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..94a32fd65c0f0b6cd8af035b2d10286b49c8732b GIT binary patch literal 15226 zcmV-=JB7rFP)2su?y6VY$)<;09Zr;%Q2j$4Vou^we_xx9$36SdJe*j~_q8;eF-% zyJLNCf^vfGFjwEce=<~k-=sPCvgTyy4@3U{W;M=;9K9UgKQ$@n$iD`Pb^fv9+VAfU z8g5Sb(Ir$>hhhh+r&}tSelC*K_Za(-cIG?0Cz@mUbaOhw|_0QBa zlIDbb6joct;@{%UHZ*RgF&_^zW>)a_cAe8MZDa2d9@b zSh=cr>Zx`Z-O+d0dd8Dxz{Y{u3Ye|nr5v`hZ`k_r?F8y27fvc(zYgNBLAMDHK4G^_ zG$+%PB#nb78h4e9uIO3ZFKxefApA&?M z-YZw38GHMs4CM-z*wEvraSB%G&Ws9G8B8<@esCt#91fAu3V@n3Yj#iKW~d;cXpTXQ z4uzCdj(^f@HpnJuW#6!Z#nQQ;%#O9Y2iQ@WHd_P^S|HV(y<`aXHGuRc7(rukt7uQw+&XzKkXE1&d+~=Lw*GkkDzFtebnt7vy(p;2 z4gz#neYK=2dLR*$sPB<*k93^zl4oQ{NNTnMIskyg8ISLNHpR<}% zEQNF!&2$il6$j~XT~NwiRD27E>x^>Z*=83y)?0#1IJi%b6_+VCjw_#BB4`?Nf~_i~ zzgqSA3`H{W&sp=`6(j*wXb!dTReOWRUd|C<7K9?Yg{y6NnAS$%Lrw&9yAdRN_YO7) z%Mmw#2Bao?Mo-PDLUSdh&JWq78Pefib6Tzc^)qtM`-|eU0&%~h0ICrr!u zec#5dXVsRiJF^X{#f*S?>k-3LLP90CPMivR-{&bMdC%fAb9RyhrWe^H6iKbai?b=H ze2ZWnF#9+|hv)4bddzZ2mGm30aBsfMu+9|*%D+~qABwh zi^Z;D0h|cui=6rwg+*BgRAq-!qC-Fcq-MmBpx{5=$pqJN9EO5E@MO>FrnBcVvE6-# z;XFkZfq4)-D^LjdEs`oy_)N--^$6AY<;K1$Xlb>Bb4FWf!U;3fTaN+RhE&-(&fuI` zzJ4(o_CJ3F$1nI!pzFbul%}8(mH!g`Tbe75GqK6(;AWwZa|TXv2CM4Jx$Ado;onou z`OvDCS4X%&)lmO9S?B`dwErqO{5qvH*V!h3O*j!Wx3~8$bk06|a3+F_@>B7V@*rmd zr{39@AYe9(bLNw9n13ARczD0zfeV(tI?FPz9`s(_Cy+KPfgGw76BPcAvylNxOwO^N zkRM5d_$T-LtFL~luO7GrF{tl3h~U5Gdy?u$5E=nF=lBR^7p?05tj*R?f}(ny&k9Iu zn#|1gKdAaQMRkZp*PTZ2M)7H0y3aJ`t<@B1|L;erXA3s zxm3_WM>x}*fJ{zv0@Jaa7Rnbo_d6W*#wJ0VA9gcO)xt++j=21?W#D7m=RI)hPbMo) zldR<2*5+1qEy*f*`UF%Dd6xEyr2$iKe@ff0S19Jv^6Hns?e}6w zvh1he>*G&4nA6~(kA6E-@Rgs*RlDlETjtCal&}g9nXt6#l2l>whI2p_uWnU|33&DL z=_1-!WSC2b{d75w*Z9pxDy-ciEms}#M~+$~z}A{HcAcFYxEBr_jn~7JR0+U1dtq&$ z2L4}&D-2y{HY|J-KdECN+D_-~bP?x(3!0m*yO|(!m~n#AHhu}QY6@8(N5g(9ySwI5 zRghGg;A6v|cHP^$5qj#+^y*P-M?&MnI~nboufX)-QUamO>PCRGfX|E@1snn6U_uGD zc#^LpziJ0Lz!$8N0Jqnguz?60sGDZXF!_(XF!#g%Fuk+PIuUgHc&PRrV-x>%qfJ8Anvq9i5QGCbY!e^ zkav`8mpDr!J)2QQ7-#U#%UA7H{anLlycf2?l-az8R03~CmmXJw4k>3n-Qq?rU9%mr z76=RPTu*6bZ%nG3y8Tuq1^IN%qvqypRjM#qZMxAP_zuP}1(1e~owTohD{Cbq?>BoB zd)%qdhxRQAAU`P)hEw(r=tX>batdpiQo|OcDVfTk0godLX4jx%>i_G>$;5q&Z_ zVtu_O+Ux0gcs*ls9<{YaKFzgSCj8s{Jifaz$MqD)tzhN{pKfsXQi)KHeRvfBi2%Q5xKDupe_OQP`GZozm;{S^9O5*ty4u_ z21c`G&=1hVfy@!OUk4%h{$yq9WJc61?s>yZT(4|huWbH}mByyQ{YBU3LLe4oSqWr_ z3rF#gx%AK0%Hqkv2VQQ{S?{GUAmjsCKVpJc6L{HSx;ocNDn=_0I!ku_;rZG5te5LI zKMqad8|FYNd~qpMc~yc0+|T9hpcG13EEtO;H3Sxw>#4N_GagRB+Ytf*$FhPDXE=e7 z1SmI>S1KFVDw|g-n=_TocdQilC0$fOD@%gjS;xUUvLi=yxfA9pZ9VQPdmPhOnuLh+DSVS)Y=C< z30wka`|;`H#(4wQ&*&dDKXrHiyhI=BRUun5zcdR8ZB-%PCiw2<`# z+RI|39J#GG%_NlbF8A5u_IhRe9V;_b#@3NLA%@#6&YKceaC#;G(#b$JlrMUR6i^Hf zKdR;b%USEi%IzLmfv=d5^@mFFKI7wujk@ppjC~`l`~UrI=k7p}Rvt8#Wc{{Cg*oWl ztEQtW#YW1w7|>FslLJyUR7NX^KM4|1^a{i<1rjG-H&}VowB{WvJyfPD$P_|ul3VIo z;&LC}aw`PJe%kcpt-e)aY z^(W_bY;kywytwNdC%3wfK6ynx=4UI6Wu=op4gxGrAfPEqq1>kgiij7TCT7VxAucHv zcp(lXjaxlSIt6@~q~8)Ej2ZIZzE)1~VSd#i!848o0rn=^H_f!aby{A6I;FVGpqYU3 z-+70N9!!VHfgr$leEuJ7h{wbv6@^xdd@g>=hIqU8;RLpm*6E`L;rz1waKnQQ)4?MClQm>`|<1ZJZ|o{GpYejz|F|2_(^iSB=!P zvnh^+tI@ZU&KA<%HJ4$XKf_S4nyN)=sGJ%!l7C}ne}gab+93%R@j|HQgIeL=?HgSs zJW{-fM#`E5c$iA{huF`6n%2_kg|T0`huueUF85HRs_~1;B4XO3txKoGZEVJHF-AKZ z0;OiaJ#C=JLifu=37Asq^>Su9w5{8NOyG-8K&o1wNnsSX`q$?2Z>k6LA9&$~H@ zpRsqkjQEgVGqQN{6*Fbj9|cZZ3MV+=oS&ay$CKm1P?4n+p(}E!Ip#gqzQT!4O8wFW z2{He|X(0Cj0_71T2T0tyM=vEg1eB+zo$ag6_B2V|CL|EVH-oqK_8aE%kSXhP0Mi_& zyUqAtSu1n3oGAB$LezSJkk~8C`#lr(c9)SDXjMws>M@etX2LmrdRC`R&UErZ+E-6* z_Y{+FmeW#%pe7)}!5|m8sb3XSCh8RgmE6)16Z0>V1|xu%LmNUmL-1R=KM6*pCxlGl zHM#ROC=Z#Q1~v!O0v=UtAq_*Xnacy^MEFAv8yVQ@GLml@ncwoMPA*v|2Oy6&EFL|Q zIp^jVYx#e*Zouw{e7ff1={_U<=SIAC`lNBzXzt{Tl&gMD{pRs*S0RDV{u1h-wi#b> zut>2~)t7>}8H@n#0pXymC`r&XE%ld2Du%VhI*2GQNvqc7HWY}|FyV;C?-310Kb_*ZMAkB)j$j`n3UW1c?7!QP4P_FwitJ=yOspy-*wpu*e^ z7cEkjz_GXm?l2|_7vPg(`CPU~ds@=0u5amm;cKO3Xw)?b@9hK=lik$Klx z`BgQ~&OSGDK|5PJ!jHQ*irL;$`gLoih(FSvUAR8=`6uAdtA~Sy%&-yEip=@&qtJl@ zU22uDrmN1_U@1FvF@r>=*%rg_{7^C{lo-jOiQu(zcG9^uqLT zFXhF*46xYO?cIS~5(j&@wnJs!T4KG~FM>oZC-9IGABtsGcxN`P7v;ij;5o~3`QhU7 zaCD*sVfss1Jki*fGb~sm?mJ9ynA`ZW_~!k)3D->5tdDAjZyglbJ+~T3P@Ms83D#$; zIq$6AAVrrWTz|)Z*}2o5qwPKrsj#4nsY=~}xZw+8SYICSK>%c60O%kDC!T_AQA{iRJAa zaU`ahS!zq~d!=gK*U?({<$b+#)BJIl8_41KUFkzHOF=z>xbG0<3$#i=0P9CI44@5h z6zM^#8ZBPPOU0FG=Puc`NG)2xZzI^!Ninw)2;4L2+#a=ezV7U%{Qd3Y5FW6(&AJwT z+(A4Pb_@>o(kvbhw|sI6<^NAF{>gv_`oDI6ucxs5vM8WH_796+30eu-IFeBo&xm50 zPS(K?wX4dybjm^+848pit&V@{_3mUd=70zS;jRQt`LTatC{ z_gw=nS?Vm>wm|uuTUx9^`O{0?)t&ztPr)}U2Y-B+?k_;ZYJX_gu~dZ;R0N++^r93?FjyevW5#WAY_dg`eOIib1tMNXea)gDNb=nYo7%59yJ^qL zD$T9LJ0I12@vhRWm?erXf0skR^LVlOuiN{7k;|ggec~@#XC;+Q-{>cuU{!K-z_H}O zI?e3G_u_>RYK^53JpiiG0BM&r52)9{^x|KaYPJF*F{yAGhv}nfJbC??ZORwF8|Mp{?~w`auN~-#anp;9gmut(8Bl znr`FNFZy$}uKt|+p>z002P>#N3_-A{fkm!-ZxHBh8A5MkKD=pqj8*}xGtAK%=%IKG zs02U>1NoaHh4prVEfrimIv(P`O?;Oh;7gj+y0H7q@X7yP&46`io~xGU5Le6dC*}8C zyE0eg@bI|k%V!eT21W}MA=mcIG%GV~X z-KH>XPze~bJ#1RDJ4(C!09%}t|KGq-|GsO&`tPbFezr;nd$nF?-7n(HKk%om-JZjn z1I4u-QpI4K0tD<>`UNd$O%UY>Vtx6WeR(~fI=MeIx-JPk3%h)b&0PkxltlrQU$^#? z-X$n!lCJ$h&044$INKMGq5LUr?-$Ye84&S5xS#vu{Trw=2?L_JHS5S^ucAyOMj`8Z zOy-1va)zEhynQLZF={~h?wCQlv$ad|%|BF76@3m&m%%Y0Mwn06qE7(nsw&#~kolzVbat8V4l`#Y`wN?+hH|FBaSh)buzR4> zBw@_h`?7tQ65r2+3n~Dy1YuSl+;{8sFX*?n$Zh}xU(99jA1wZ5^WabS*9K^Rvqcgl zuq(4wz@~Ak75?Ai`Px86^4f}2f=HFEipY7k_y6sBxsNz@hH8e z_P@=&Yv#d{Yh#bHElnmw+5-|ZGRiS42gl3q|59@n-fb)C8}@(q!{xn{ICkvhGAuLm zHn_~p%*+@lTsBD>fn|1E+p?WBiKXs4-$dV0BVV`oR9@(L&gAuI?9Q2IW@MSJjwh3( zhMiQZKhiPJrQ;wN1^(dp_;`Xzz=q_UVDHKN&-7pZX4uY%Q#HyxIR+$=WJOVv;0&-H z3btjb0%vveQMaI6eyAy?D<@d_OzSLOp!{^l-t(^Pd+d0&`01Lb0_8`6pX^mxz%Sp@ z1An9K-d`=|of5duE#6lvK3ISD?Tw0aZ4`YI}vx1*x{rRv) z5}J;N6b>kqYz8%Xy3Zrk0!f0ZS;T$MY;2ut8z1Y~=e^6=haqVOES}0)>=Kwmw6RYT za?QpeGEj?qvuUKQLe4JcKke7ETK42F%8<1^nHBlm|9Yo%ul3A*Hb$wCcM7nsRvX>KJV21v)sSK* z`0MbBFR!|3n@>)ipDeL3OTwZMTO!+Ue&r9lv(DwrZB{uflo>MEjs>7_Lu6Ya`0prL*0LO6BatvbEW;Hycib@Db#O z;hbw&pKeyMu`5F%{hJu|qG1Z>N1%Ux*uO>>Y4DTyE2B!-s#96D$~if#Wi?!IAL^H7 z-ohbC-YVv(0Zoz83&k@Qp4A5=DcRR)E;!x4w;lvhIAWRfU_g^1R!%zC&k<$yI+?N0p{`v9C}vYtYyst^{Pxx%iKd1sCz|~Q@Ej6HH!~g z<&CH{GA~+83pAww?@F>(;e{n-2+>w_*K~*Iy7NwjPzL0%~$5N)C#O z8vTbIO}<<|&$nfL;9tLXJ$Q>Flu$r{sYI<;(7Bvhd9Q12%cYs5@@?XC*xs?XV>eFJ z`gyN!AB>Lt$>|HF^ZVytFOIzhy|iRkvZiD?Vj2Np07-TQP$hx}5U}(gc69Y7&HSvZ z_hiclqgNVw-qLcmhElm#iUHq*b*UUInx*%;_IBNQ4u$T`d9F>q>3*r*y5J4Z!`5Js zl=U5XQs@^C)C+NQw2lF79FJeFmzPL6$b?HJZ_2^toRhF`fO?!4DvvtGbrLhz58M4_ z(9N1g8eUDPCHH29$;wJiRi>zyNLt3K++&vC<;WEub2(M&ROQpALeu?Fv-*Wr^8$H- zumr{bedtxjxGtKbcv?o27wYA-p@vUK87^zUL1Rd~tc3UlQT|A)Ij6qyKKHAuR~D%! zS=j+SZ<2B@DTHXJ*1?LDq4u?myduU@&ZHK9S!Gt8hUm-l1rIn z1M0vmQjr_Fy2D*0euISF;Ex06Scp;M2idB-=Nj(UIxRZ8GyQ0|soi)Rx_CqA>4)Qa zoz~@bk-y{h(gx1lM#j=&pvzdFa88?JqFrjcXW6u1LX zxH2VYE|So*jHxdO{hd;L4ZvI&Tng|9YV7qaVFSemXh_!U^6psl-|2Su2gCF5mk=ag z2JK)xk7rB)#M56a+?>$vwY4SF09lhq3}`$RmJkTExx>;*=#?~{r1XIPN#%nf&8=|q z#h@9f&^V;RP8(T4(1DE5(?WYk)!B%cBmH$r9n`2KqpIYiXju!7f=J+&U+;Dx9-ej* zb59R7@QUNnBzfVU!u3O&<=uMatCu?`@;$&r zl>_?ohkox~VaO#;zKDov&LJ5zX6x#UhmUo-1hpdtKFErcd2h#fPAfc^( zI8>o>I1c9UdqT=x_xNbl)b21UIZazMbS7;`@%I?|okIUV!}v+>s(*4aNwf?6SU>G| zu)eX%mkq&EWf==oNo5Q(D}-!kh!9g%f{YMpVZ6hsN?W!1CP7(=jD}g7)m@l#_4>I+ zeY;-!QoFq$Zq7R@#NhhfuuZfX&lsv4vUvSqEVa+$JE!y_+t)j-oDg@IBJY@4)4InL z84H`gyDI$Jv{tKqtJ~cf!a7TxVSPwB4i14K&j9sk+ITdN ztscvlpN=2;lS||A?+4y*dxO1^*EszFdH*=^b9ortqoXBVtQuC1OfQl0G+RHTQq?nT zoo`^)WPrh#3KDPLW0+EWy|D)OM5r(xm^0#UY@o!`y}sG$@^X*qWN>pxcv1GKlC7Vi ze0VUYmv4MuehwOHPyFCG2qyC8jEmf~NU5F8}WJmUKsXVdZhPGvKvu-4Z1J z9ga($BJS%dP-TqunS}Zqn{NH9t?phQ;$iOjLCQHq>qja)H9D9CbNOx1KtXzZVlt1f zPKJBNA9@2RLI9Bt*C&TtBu%8!r?+i{Y1q-QXqa!6TYZzoBd^W0e)gy<;lK@0eo=}a z{vE>l&rf{ZI*b21LVs8o9|ZGzpEE|{Pb3h2ezljD`>rib3BXbqOR=Qipf5v&!6Myc zJ$_FnQg3HrF{0{sV6P3#~3x(TYzDY$0&39gO^W zd7t~2pa0SyENE6%I2l1YgrmGHQpqUgAPh=2$}mK%+c-=u9Kr@%c_w5j->uv4uGV4n zT(t#l3~JVEOl!k!lTRQB}4gVUw?A0_|7$V+RE za>ff6`ZHvNiOY(^M^lm8POP<~N;)J<2IAjr*Vm-iDARQEp<0`u5NXf(98HK#xABek z6|z3sRb`avc1LldhxWWNwvb<69XvT0|3@h2>%+&rgGJpU)6QZj2sz@&is%Fm6P2h4 z>m$}P+CP{%3+FbHER5@ayP{>UBMuxh^D?jLn3<_)!SOO2gmXm;7Fmu(cBFwGk`y@p z=DnSlwtFmTZ@raN{i^FztEZ>^e$yjJ>}%l&vgY{k?tE;cg8{{6=l*tonsrNu#T$oc zmj!k_>HmYR5_#hp#E&L(DjdD)MbE2n%?(fbA>MM!>+y|zW3ODg0_E>*_Ks|J$yS#Y zAdrYQU}Z_}?6$5$&x&<2+6D1#gg{_eHd-FTfsh^F74ZiP#Q)Ax=fm+iQ~b=FPOh7m z{OGtFtf}A`-~}iA=!U(|%eA=bdGBlVSavERLX%>Ku87wUf%R@GEMCIVBnUJ`x3JN9 zq=OB5(BkQq@T-A>b#Ny5Kb7O&{(=`CcYP=)>mkI0bHRweMY*Be%VJhtFE02dY7Q5@ zM2Zx@EmCwu3W7+~Vf_f1BO5(TtwTL>CJr(MS_v^_5`RzYqOn;4XTeU{(-MpUOLW8k zP2W353hCqAXm;>I4qjH_aq@kw^+LEuCh<4eF8@#5obX5R`ram0m_(ETR~w-C+)~gG zO`Jdes6ncqVc(D zJKGF+Enjt@8RFSG1tnEavk>*<_N{`X;cxDl87SllKww?%=-n&5)KZUlRuO|17| zeH&*22nOh9>nQ_{pp`RGE^hShY4vwIb5?qeE)_ldgDYk)i?F_pNvz)v{L|qWI!^^d z_R1imUtsHa`-ZK2oKYII(M3Gv=p}dfFLr)C#N*5?{W&{iud$Kl&fz914CVUP61MfQ z+sHIXC9LlpZa{qcAd=12_njpf2_U|EmxzbR?jEU0kAyuK*5%S!>e|1vy;I?sWTO@9 z$mE;CsbGv#VHN z_;ca-dVNScuKc6q8!c6pT}V~UQm5-ENtkF5Aw#q5m{7k47G$vBfw{)^eXYUQ$hxou zNYP zDe=AZ_7V32E~Z}%g45CXw14SzBL0LQD_>Kl)S1OoIN>G#*%GbsE$M;&8H9f$obxZ2 z>pfWKN)|URnp;S6Qek8SLxdsToJYt=I#M^RPX~+WCx`bF>i`e8v-R!!w(PGZwpKdR z9Cy+?xm~2N5MKny&L1s)a|ichsCwBI1(T7t2~ z)2styz^wW*r0pU=NVw)wp5DoWbjm!`j46|ExRwiyF)SIe(X|<0ECU-lxs|7PFUH?3e?@;DiAP*z1GB zTaO2LT!=v!pa;uBKnr*n!UT8*84nP0wf;R@7MWAAJOh!M{;a_w(^Cs==Qn-4{T@B9 zhO2JGu-#PxfpRn%9>&)BsArtL6U}vlxB%K`k5|~nLKkJe~JP&#bwLziQzdPRXN?gu{>~DoDhB8{7 zM4|uwmhlT)T z|Ncz>DVEHc?x$S~GT=oog6~oT(=uFV!7_tTs-=|I!01dr#LCbE8_=!T0u<;9Ko*j- z=HnIEvJ`~*xb zcRk$p*3|Gxcg*6otvm+$&ffDd9uMVC1irr=%vJE(WYP6xAE6)fD^2?IxfB-70%arVH~KRP3bwQJew8eoY``Qm1}36uoNpf z869G*sbEf$vf>$S%+O#ee&T}vZNDn&#d#rPXRPI5H}Jj}$FklHEmYzXsJ8{(JS z{z8kDqm^Jl{kW?m;E+#jsGM;M=%GT`ch>BCHoa$9r%kQs7udI8m)-PQDWO=x5%C*7nvN&jYelluSczUT#WfExda{rcW zGi;r42s<5lN@l4Nl50*5ZPJ+o6!bAN0OIeu0Fi;I*<`6j0XOyy7t;z-H4f-G)WGD{ z0~h>f?D289B=M7ha@^RV{EqcOjw?XOoP{b*;Xphti0`!{`gNE11D&|lMN2Dx`th&o z5^1nxW&kCVD-5VmXyu_k0F?yB4AM^^h%CYqJDFqza5R#O0D+&9MOQi4@~rgBu`-W# zN*T{1ZQSbb+VqywG%xIZh>IhjUCtMig~KT@w4~&8InwiJJ6LmJ^wQIlmD8*Kx4OY? z>sXI1KO+LKUnb|p=hmH-mLLCTOCj}hc@oa}mkZTFx#pDO30-Ywn_GrXiePR(DInEN zNGfdXReiNUo~10ERV#xe<D=X( z_iy5-Lu)g06b_PF&fy1qVYh+=< zAv*dV;-BArV9Q@_2Meu`WCsL^Z~4f}-QYuYHBXLtl5FaNjXKU%ov&=D=jbN?l#NYK zkZgpfY_#z^_B+?1+(jXH9&=jGbX#`GqRQ62dz$_gd}~L4uttBsF7DUtAueld@nQwH zD8LgceR7kT>n}_x1ukOEx;*PiQRWIcjrhLlGu zz3?M-m8~kQ1p7mlG3`oqF?hZnyZqut@GM@r;hV%W@k4L)E$s4jxKt>|lxejAg{oV` zVk+)^&EVhsDIV?tiRazFIv8auHZ4QtE3|%@L~09Y9s(h?s*~+bErpxM%pf@(cTTb{ zOF1aA(n=343on*)73Z!Cv1Sp!2s+`Xu*>6RU|2jjb*a=3BUe~S{YCzsdE+guFY_<9X{HM9&aH8 zA8mMCVmu3Iegs;BEGhk@L`|{yTh^V2E`<1mwg&MwlwbPEPISi`c9xXW4BAg5a~iNh zo*B!)%<~oZhdp2a$GPWJbZFh9sT3{MEYyDU8%36i?N@3;b9yNRIWO&XDc{>5{ivz| z^$YolhtE|M#DAk5eytOJY{T1U2H;Wl@&I8fRaIDb7q`Oa>`O1G@sD?gx4${qb!yHM zOpK-S+3}iv+q(K*H{#dwSKQ0FbuO+4jB>e>33vAL<_W2=go%fHrc;?MBkMyDj7~F{ zN2&QFBXCZgHoZSND}E7@mXM=dgxg{Tm2tvWwhJY4Fu8qgSM`my698CS(2UhD^kIh<-B%zCp_?A z%!n-loQE;*?(8h7rqN<=;IZule4Is!>kUy)iw?tl^?8_`uP){q;qm#OFVFmwK-rD1 zpiEjNF=+gw{jLJB?$5u==iF!yeC8`HzZPtheCh06D%qgzT<}%v z0s9~ZJ}>AnQHzP1`1>{&`Xr;TrP zWz>&S{tSHb_0C;LS7YOm7Ozhz zP%qcUMCEemm6#8VZ3`^h5?PZljs?-+C;V5@Uj2oJY~$4>m^4Yg z`e!u*@gLcDbL|GxQPHBYo0|6ByCEZ|Npa}52gfT)(F zU2ot~5%dl=1@2a_PLz)VJH%R#gkzt&>%$~+D*p7sW_v+bfyU|2e08k6Afv`zMCL4J zZZU|;t7kzzYB4Bax`TfP5EPJhwCS3!PJv#Xp8Kc9+KHc`eWD-*%oSYFw+cvNe-8aA zu*{c&KMSUCn^>i$*b9nbX5a@Mp1D^R8`WSg6>at_}K+ji!(4x$gL6ToIm0CaRZ- zD&66Tkd@()5P@Zm!=Rf3Ym%8+#0H{bMOuWkUj>HRMNxsF85?kxP*jhtN(6xgQI}p( zIW|hftLxK_0U#H&-6Jis;!}giUJqpI*M~5}cqH@@5wCu1#G5gKl_hY{AwIfjeF9F1 zt$igdEe@RY$`U}=tzRkvhn^~a6GmM%Q5RIP9ySqI&q|zdWnMNUUL67Hpt1}QLtW6K zF0?W~9AZ|W8q3Vr34G`6u5UaTf>7_y#MzdOF~PK~?cwREFID|)}p$(Sk5LlePX zkv2_KD2R%f4V-f!3sOMhnT4W~c_JzTCR<>*X}!9Xzj|T)-#_0?Mkk3IjBDm^kn}wH z`~Bg%9>_o8Hhy*5DY&D+1a|`T5;*_lv0LT{CKC)};{2<}A}o&cqN4jl+)fX1Cr;mW zQdDtiNGKoyBA-)xN|brHSv&rP#L6r(7nQbA0z-+!+7TJx-&)E>w{0T`gM2(o6p}u8 ztTazkCZv@vIMQIDPr|{D15Ay@aewA+)%ZlJx}^T~Ly^*Od~m6=^QSaR!-44;|9PG+R~tIjWLY>E9MiKCick|1)${HOLV#(X_Tgz+yZs zIE;kbF265dclO{HP{^1%FDOauZ(D~N=+hJAnYLJEElNAT>aQ=Nv)W<@Mhq_UEWto$ zNmYV&5uFR2J9zfsS^ue8By^wm{Z(+S3CsspZhTEU|2po&D##7Z*L>jX+C*2s;u8}& z=hHIZRGChk&It5A{Zq4|`Ql+Z1FC(>aqq^S%y(xTf=yI4=wgLId)@|y{9?}c7jYK- z`_|W;me(fj*I2nvEv8T_`P!7OM3Cpkn)E&%a*NP5Sak;D2-f~? zjDS?iYv$Jbn)7*yBUo#}o_KfhxxiIUGv1BrB{PSuQnG44UxA!2=bk_iv;+%n!XX+C zox`@%%f)gbhy3EJZJX*4IuwrRL3hZ@f^j}?mh`8{oT0Wmb?aMOSh9`Jlc4QvgVw=> z{i~v9J`vafh*Qa}2TpviHihyi=gS#N748x?ZHK7(u@_EfrfV{B)V8klb>xA{{d~0b zEuOIvl)mnS}E}XA;;tHU!6=J)q>V}IpID=1O5 zJ170ty#pLjEmVCc)Hdf;VyJ17+IHALtLFS*1WdOLy&cc@+&tcR&>>VA*da6JWKdeS zSq#N5^92}0U`aR+P?))ypkZ_F)LhK73J|ND!T`^LuR-5yzOb$ApVLVuZoz~>ar`sJ z9bOBK{aK95rKxUXZPG@nr%%6W3Rv~=r{0DMg)bZ>n@S9y7TdvQHyxD1`hIgM5h zy$Y3K=g#R*ca~efjDps*>}MW7{4ix|%Sg zU7NO+f0}dWVZ!{av?FKG*1*Mlj&SyW_+qL~wcWyk_NKpgdeeKTrQC$bAztvFU zoJpuzw)Jly)qCSrb^?bqD0R}bD3yD+dh%q5q| z-AGC<$(}UDU9y@l7-N;baiuGOh z?{nq^>seEor2G7|IYjn+B21ke(H;5ctn%m2K+e!Hj* zo`TNz=P1&M((6vV>mkXxt{x`d<|X&{pN&6lG}>OFSv$BjdTRhwoEw@GInw9j_HssO z>^p0F)>61#4*Rc_AF)c+>tTHDf#+rTo`L(!-?}n z{xo*v?`WQgGr<`I{MvtjQQj2CQEFi zqJ#`+Gz(^Zkh76|l|z_#tI2(FCy)?O?YH{>9P{XYrrD}RrWxq!v2#xQLwQvL2gJw4 zl`N-}xH#iAg@E4IPCtDAX+q~LBI;&>>A<|hyMHg~-@S~0$j9NjmMb^vdJ~wJvm!4+ z_W#+Bcs@}za;*!o5Rf%bC~YkD{RjSEuo@Ng@a3>2n&10vD`U(>^QH0%r37kBApqWK>~7T#{_89>(iumLRqYJP zE?I@?IMPS-SuF58R;(0WJ&`c*>Cf8`}_Cd)d^#$x&KEAU|(PXuJeHym-i zx)DZ@ZQJAMhH*NuoEfcNEFLr%9RC_72rMqfxG?LdaaN=`m#NpM{Jad#N0Tt@3JMDI z^PgR8yJf}X6*}Q5w!9`j(BYiQZ|e`rnkw8glhyX9jpGXZ7I~(B++nJBTA%eIW)s== z@dy4bySFxeJ=t&@svMO0Sp0JH@Q=)-M5SU(WPJ&hQL8TT@!CMql?Ce+UE#;3#zr=zMH>RV(~_%Ay;3B&wFotSmGpKx+nGn$ep zba8ee8C$pSI3hB5%Zdx>dcJ#ud+&3JSCL8i{b-%$k?c`HyFa?siDb=GG1T6?mrc@+ z+z8pkxSNKd;=&a5BguL1=?%FbCW zZcqjYEusXMajz3Js0Te|d)2N?>&Hy6`%=jBN-7`nH}N@I#p%JIIE-_=l{639Je<_^ zi7|=k?{Qm5p4-_rMjgId#`P5ZeOVJ8mKDV{c+m6)pXt2kgXgAq9bJPeoID}?X70$> zi_@P$mzZ7bU2#lH1;%1Y5-^+!hJY5)UpwNfAG;9Pr3JaPR%}G8^1p4FKZI2?C!nPWi z9uq7j6x7ZEsqO2e0X1f(Iy^QgWMwTivbn*8Gzqym(R)7V_ia8P35hH$ZNr zN7!`y6{BQJxCf~cM50QIpbnNbD`1KzwV0;|Pf^5vWXXLFyEt|fnwAg!rCAV?9dZSu zummjg+p|0M>_`e4$xXGb)0|T#*g)4llOG+<-#Q}*eEawN#%Q_vC-2CNhp|}CGsX{M z!lg`WloS$47W$Wvf^Tph&%$>e`2=U6!@kXos_21CCu1OxuX_?OnnZXDVSBcKT4Dx& zxx<*ZD?4+4$a}o+R)cn()3fBbkzV*)sPQ%EJc#g0F(4L;msaLeRQ332ZOo?VHW~RS9J4YWAKGn>Y}}2Hkjt*WJ}6hapYOb0WGb&V&i}7edSdDf&(V zisRHB@hi#{(_z}1z+ui>f^TVmT%@2quM@G;m_|Mt$x3careVQ~4H=W4nSVJprsw+n z@~9+!Of?o8tyjzN+Tra*OotufTcn#B58QEJQT5t`7-__H?NwvccG<^d;!0_1;$!~( zm$tU*w??(o6H=bAlo2qRJ<{dvdxWMpyd39_?^-D<&aasl_oOE93%hh7K&grWp51#{ zQSXsQ6Qw00;ja{xP z|A%hZ&AXXuHV%(Rb@7>ukkpL+y~RqkI~046mVy?1$Xq@Q9yhJ2_=U_KQnTBiF(&0O zFMFS7lntQKq;OQRWN+3HOLa_VmGqoQ$VysrdzPE(mQ^)d%0ay^JkY{PUJ^De0c$@h zF!Ssl<^kmV*Og%!e{>=+%KSluzi15@emB?c(6Be+lk64Pb7^sD1UMkw<^5vs57-Hi zzx>gw<$||AnRqAjNi0NMicvo(YknWz=huFuE;n^lOE}f^iGJ*b#6{Yip5;GJ^1!5q z3%R6qK>m9?7hrE(rJ8QLP~STVSe>BVQHHr!D*5-S)KfD^!OZA;299B#VVrY~a%^Kq zt|yGIcjSwSpkCuQt--197=h^-@i)>Fbe1|#Ji41aN1oe+=}%6;zCry1Q6#V_!blIY zd$UP_%+&fW2-HX7&qbBF@ZVx>7FH5=2-gsRm~=z?aMPOlXoM^@wi}-!)q^m79d1NG zfE4vKjJrR;w%T>TAI7t`i$qYaR8M=jqx{faIEO0X$-}_0?vtZ3RbGyl%(RX4wyQUO zZn@cFJ)SjjT3>g5U%ul3ax8keV|hoOPZD}h2F45vzX#8rzS{MY4umk_nP%(Ct zU4Z+R)i#$%hQ_(8L*7tj4AALdv69<4a4>i`A_e>u|p$*QuFMeSzs<~(|0aTTXioJf38@vxaUV`pZQ zckC*(SV`r&QV4|Xx)}C~2iPYUpPBw`^1MRqm4jFB0o(FCZAK{K)3;-*QIJ?m726Nz zcblsF4H}l9QZ>Oip$HZ`CRDl{!U!I7Q~K%d+l&jidmV}c1KdNhtS(DIp;jug%DwtO zqZqS`V)X{3k}29+%W$QdeJOi=X>A+nV1HwiK+3JdsV%y2P(5zGzcTk3VG$Ug>LRa1 z*YlLyaq7&g&wiV22sB?!GMh=n+o3M zB9Ej+004G}^e`QRM^_ojoV3&RlSHVBpxo~5e)Q;7*V#?>pDSBumy*GSIXXDJ{QE7X zcip0!=^OH3aTctw6lqfV?t;hpXHVpdIkkX`uM*m)ryFj>&p|^%oFC3DcREW`ZRcM6 zTyz(Fq-od$Bx3NpakSB24(_`zJ=j7qu^_vxF{ZRt92=@|7d2q1@i#QEs~_V=t%KG>=I{3c0h&G42WkoH!!d17}a z@QVnl)8V~X+&0*iVTcYaN63IVV1tP*KLz&A5vHRu7Y;HL`SvxJ~et$k4ED35(jhmdfMzso6{q!#h) zu`JE@Q}+J7@6^)p+{iIrR{Qe)mKC6o+_JG|X#vE9tE@B?IHsaq^))K*{+RjIF9fq$ z@52EdcyjC_K+Us<&%F`oXKVdqysy{dk&OrXr;z#A{svo=?Z>x2GVC5|X;~hB-J#I+ zxv{mLm`hJx5SDt`Y3a*#&_iw9Yd~ zSJV1mS5cc7Mzd<8?X{H=UC^#S9wY{QYg1B2P3WTtXG_UrI=V(hdeUvu61Md(**#@O=zC~x;wwXPq`-w=c9y3$Z z@f3A#TR5PUyE&6tVEhDGp&4D$%^#Zj_!Mx*JkpZ!K0uS4l=oo@j}OTmlYP-U$>tVa z2p3{*9{YE4cCbIC!d(sSpna#QzT0Ixcy(-g=@8jYLEZC_S@ykIRx_{~jf=;Jx89C` zc+$4@E9M%5n2gi*UiANWD3O<{G3*6^91AJ(T-bU~6llTXy241Al3u8LKP-k@=Z|icMZp(HX-5zZh1vz-Z*5^CC(iFDxv7{LC;IP*kfI zYln4oBKWDNqZK#C=Rowqyx)$LsEqh8yo;TBSX@g}WzwlhypQ6#V!6wG*%FH^;m9pbsa&01eFL#iYccoaw}mzq0X{t^r%$T2VVaQ<%^Y>0a@UgttGJEQUV3Zj9iP z8z~H%GF*SnDI-q*F7#fgD7-E70^`q>6$xBZ_cnxZ)mmIKcH9ez z)dLvkZLH9%d!J#HpFv`OMwttXuj+s0&M(pQ@lHxa(QxRxp&y%ZdMmeM9HS-q-&BWk zFW-W`VOw90U(BlaZ9lKyh2XE*7hV)Tg9YgdLp-_PY_Hv17%rH9!Z6a>~^Yy3&~pY{0|$r93Jq# zc}^no>|ZUhY5Zx;Yi!Kcg&3fwt?j+x`x$OM8K`TvV#Gee{iW(OIWutB;bt7}v-Fp} zf){v2wfEHDS;Xyqnb@ z2)jGa@bwQOiHpuZePP}xY`P#5SU6iIwh6nj`t30W-Yw z5sRvYGZI_2eNu8aL~f&9ey*Q2kV;KHE+yv{@xe^3&9NoWe`mWhz@$5ApeL8^@q>!W zzeeA@Lb$6kdYaX#2nSe{w!$VJOd<{9qj2&tH~Eo~MU?*vYx^N{R2`#p&#eCv*Nx1j z$bxLbI~-g>%r9c1U4?(Bi@WyqNBS2yh|pL`Wr*j)z=8>d&ahVrMk=kRa&AZAZo;mj z+Q=8=UI9Jh<4Kl!U&j}sa#y0b0OR?ZCl%)n;Xf*VDRv>oQZ@3tDH!!B?KT{wvCh@hM1udTu)>*OA3_U!x1mx%GE-<^HOkk^{dWTVh@%N~g}8 zl#{(K0t`9+Co}KzGKwA)DaATYw!A1-pnS26^QiLF(yOIN^oPBgJWWMzl5%vYg}HQZ zxe+S_gRtBv5@ZeyY1b1X$Sbc{H$ z$^7}dtKS7dCxHytok7_b`P?z$34%al&9#S@J>dr)yCv$Fbxw*`Lk8RW1M?~C?Yyk`)1S(NeD8(;R##kI1f^AO*^3#7A5>jq*LX^*B-1Wibm$7cdD(j1(l~> z9U@LfKr*x#En;WASk3o;ZrPlgVA-C{OM*>gY0a= ztfD(=1mT!7J-9fKS=2plOkuy%U_!KJXK{u2_xZ*7(@#yhxdu-6zN;KwI~1nBm@V^F z{KR6q?WSv}#GOawQ#sz-qw8fOP{?jrvFcXJBSmt%vM`-GTxrmD*WN-}Q6zy?!Z~?K znhu`Mmhd0aAYCG98$iS*$AQVEOTSOAJIt;<46kMJ*vh!h7kV1!7w;;9G86sZ!2F>F z0<^nGS?R}TS#l%u3rloBspg*%OM%J@hx=8*r2U# zN?IAe%L)RmOL`}Cw^4)b=kER*R40&4xi7{v@G5^)cdSX`9E@mL)LN@$Y^evFUY1tc{8n7qo1&rBF@&%Rz)`I;tuTmTGs z`m+cz?6|r?nekd=rP@PJQ7Z$O7l?P!HQaJGv0_IqepWQHc^IZoN=p`#n&gBe!IOl3 z+dhaW-f}iQ%*?Qk9&+EY{0WvDnSg5y+irHx2GrLu2Bjqo9AsZP$?M4LpWO~8$Hy(z zQL9**BGs6NnpZAbN+CemX_7Dj&TGlU{++n8B6g|Jv!BpiF!)orB$S$mx$P8dbRY!& zvIR6%@xNef;rp)?6!4Ko*eq)fS*u<{%^A`BSpq6z=$wm!8nd;$wah$V;! z_Y)3tCERzah1CFZBgxyoh>p_4BNh3jzlNa4CgIVQG)Ef^UN|>m&LJ`QqcC|iotkfJCZh%;`A8! z7T)z4@w9w7plGhVZ^a{6JAq@Ga6#eAVWk8|EAbIFA_e_lj%{}P;U9(96aUEEm(dx> zcqO*AxCM)=;l%dZQh4@nx@*lQwzH>$EJJ9cw0VVQW%^;diB3PR5WP~QkO_P6`$j*` zq?=%3@hC|F${W*)9SnyWgu4(6`x>B`bo$jqImc)C?eC4)%L++S9gF;0&T zh&Mz~`z(}N>yl<>tmXfZVSVKEGd-qzww|Ir%cgj-q2TZYxo>W8=E5Up(z*KMA~z5g z%wN*Mzx6|O8?YrU9rep^Qyq$@7pB))VRhT?b#3^ZSFqbWNY6wdF&e&d`ped1-$ z9B<2EsA zsam)TnKGSVa%5U1V`I0c4GwCs65Po+XWOBY9YlnO)(kf@$}nY@`B!gA<}f0XW59kK z%E%1p0EUn?J%m?CVab*Azv@H_HQrHH$RLqahrRLS;3FI6-DQ(i+hXziXQ({-OXnvS z953K6bcdg4(GZH+R4QYx&1TqhC8GslssO)SJ(OlxV$T0;SRhQ@<=4(~EW~F(6|+gr z0jC~@P{%Ra%)2;=RUV|P(eXyE&SnRZkl?KBf^gC0GG-xT!!x~c%}^DR?zVP*60M)8 zZDf)kw6A_}*5ocT_{brrQUt2C!C!Ft}&zv1~;uC(npb?`mVN7VbX$QP8YpA-%RGzIv?O@xdbrlG^O>f#)8@RgHdc*X8J!OVe!1sH{w9 zH6ep7^ZyMHV;PVu2#k?e2$>j8!;0)AQMagE#{Am%ME6{dvN%$^!8B`Dqt3Cwx!Q6U zGyJ4j_{{(-8_0{V6r+^}ctc`Dpq`5;Ux}Eb=0rIRUjbmxgC!_XRHngdrMWNi%@H+V zsglV2&Kv@0`JYN@%x^#=uCZ|<_u%;Nt{@xcHe&4N82Ca3sjcu0(U{`mTD-{s8& zRwi^BwMjU2eGaUS=4Adui)O$E{gH%HQZ-1*tiQ+d u8VlkH%J*}1Kb29X;$5HZ?2pQow<)(Xxg%RtSpRZ3W~67XTcPdx?Ee5_dh=8O literal 0 HcmV?d00001 diff --git a/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..4f45077 --- /dev/null +++ b/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,103 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "AppIcon.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-iPadPro@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "transparent.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/transparent.png b/Examples/TicTacToe/App/Assets.xcassets/AppIcon.appiconset/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..bae1e0d7424038acc03d0981da831baf5752e49e GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7#M*hLwK5)9*|-x3GxeOU?`h>)&j_z=IP=X tQo;E4U?WJ$;RU~g + + + + diff --git a/Examples/TicTacToe/TicTacToe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/TicTacToe/TicTacToe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Examples/TicTacToe/TicTacToe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/TicTacToe/TicTacToe.xcodeproj/xcshareddata/xcschemes/TicTacToe.xcscheme b/Examples/TicTacToe/TicTacToe.xcodeproj/xcshareddata/xcschemes/TicTacToe.xcscheme new file mode 100644 index 0000000..9449c2d --- /dev/null +++ b/Examples/TicTacToe/TicTacToe.xcodeproj/xcshareddata/xcschemes/TicTacToe.xcscheme @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/TicTacToe/tic-tac-toe/.gitignore b/Examples/TicTacToe/tic-tac-toe/.gitignore new file mode 100644 index 0000000..bb460e7 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata diff --git a/Examples/TicTacToe/tic-tac-toe/Package.swift b/Examples/TicTacToe/tic-tac-toe/Package.swift new file mode 100644 index 0000000..174a9a0 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Package.swift @@ -0,0 +1,177 @@ +// swift-tools-version:5.9 + +import PackageDescription + +let package = Package( + name: "tic-tac-toe", + platforms: [ + .iOS(.v17) + ], + products: [ + .library(name: "AppCore", targets: ["AppCore"]), + .library(name: "AppSwiftUI", targets: ["AppSwiftUI"]), + .library(name: "AppUIKit", targets: ["AppUIKit"]), + .library(name: "AuthenticationClient", targets: ["AuthenticationClient"]), + .library(name: "AuthenticationClientLive", targets: ["AuthenticationClientLive"]), + .library(name: "GameCore", targets: ["GameCore"]), + .library(name: "GameSwiftUI", targets: ["GameSwiftUI"]), + .library(name: "GameUIKit", targets: ["GameUIKit"]), + .library(name: "LoginCore", targets: ["LoginCore"]), + .library(name: "LoginSwiftUI", targets: ["LoginSwiftUI"]), + .library(name: "LoginUIKit", targets: ["LoginUIKit"]), + .library(name: "NewGameCore", targets: ["NewGameCore"]), + .library(name: "NewGameSwiftUI", targets: ["NewGameSwiftUI"]), + .library(name: "NewGameUIKit", targets: ["NewGameUIKit"]), + .library(name: "TwoFactorCore", targets: ["TwoFactorCore"]), + .library(name: "TwoFactorSwiftUI", targets: ["TwoFactorSwiftUI"]), + .library(name: "TwoFactorUIKit", targets: ["TwoFactorUIKit"]), + ], + dependencies: [ + .package(name: "swift-composable-architecture", path: "../../.."), + .package(url: "https://github.com/pointfreeco/swift-dependencies", from: "1.0.0"), + ], + targets: [ + .target( + name: "AppCore", + dependencies: [ + "AuthenticationClient", + "LoginCore", + "NewGameCore", + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + ] + ), + .testTarget( + name: "AppCoreTests", + dependencies: ["AppCore"] + ), + .target( + name: "AppSwiftUI", + dependencies: [ + "AppCore", + "LoginSwiftUI", + "NewGameSwiftUI", + ] + ), + .target( + name: "AppUIKit", + dependencies: [ + "AppCore", + "LoginUIKit", + "NewGameUIKit", + ] + ), + + .target( + name: "AuthenticationClient", + dependencies: [ + .product(name: "Dependencies", package: "swift-dependencies"), + .product(name: "DependenciesMacros", package: "swift-dependencies"), + ] + ), + .target( + name: "AuthenticationClientLive", + dependencies: ["AuthenticationClient"] + ), + + .target( + name: "GameCore", + dependencies: [ + .product(name: "ComposableArchitecture", package: "swift-composable-architecture") + ] + ), + .testTarget( + name: "GameCoreTests", + dependencies: ["GameCore"] + ), + .target( + name: "GameSwiftUI", + dependencies: ["GameCore"] + ), + .target( + name: "GameUIKit", + dependencies: ["GameCore"] + ), + + .target( + name: "LoginCore", + dependencies: [ + "AuthenticationClient", + "TwoFactorCore", + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + ] + ), + .testTarget( + name: "LoginCoreTests", + dependencies: ["LoginCore"] + ), + .target( + name: "LoginSwiftUI", + dependencies: [ + "LoginCore", + "TwoFactorSwiftUI", + ] + ), + .target( + name: "LoginUIKit", + dependencies: [ + "LoginCore", + "TwoFactorUIKit", + ] + ), + + .target( + name: "NewGameCore", + dependencies: [ + "GameCore", + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + ] + ), + .testTarget( + name: "NewGameCoreTests", + dependencies: ["NewGameCore"] + ), + .target( + name: "NewGameSwiftUI", + dependencies: [ + "GameSwiftUI", + "NewGameCore", + ] + ), + .target( + name: "NewGameUIKit", + dependencies: [ + "GameUIKit", + "NewGameCore", + ] + ), + + .target( + name: "TwoFactorCore", + dependencies: [ + "AuthenticationClient", + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + ] + ), + .testTarget( + name: "TwoFactorCoreTests", + dependencies: ["TwoFactorCore"] + ), + .target( + name: "TwoFactorSwiftUI", + dependencies: ["TwoFactorCore"] + ), + .target( + name: "TwoFactorUIKit", + dependencies: ["TwoFactorCore"] + ), + ] +) + +for target in package.targets { + target.swiftSettings = [ + .unsafeFlags([ + "-Xfrontend", "-enable-actor-data-race-checks", + "-Xfrontend", "-warn-concurrency", + ]) + ] +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/AppCore/AppCore.swift b/Examples/TicTacToe/tic-tac-toe/Sources/AppCore/AppCore.swift new file mode 100644 index 0000000..552c2a8 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/AppCore/AppCore.swift @@ -0,0 +1,39 @@ +import ComposableArchitecture +import LoginCore +import NewGameCore + +@Reducer(state: .equatable) +public enum TicTacToe { + case login(Login) + case newGame(NewGame) + + public static var body: some ReducerOf { + Reduce { state, action in + switch action { + case .login(.twoFactor(.presented(.twoFactorResponse(.success)))): + state = .newGame(NewGame.State()) + return .none + + case let .login(.loginResponse(.success(response))) where !response.twoFactorRequired: + state = .newGame(NewGame.State()) + return .none + + case .login: + return .none + + case .newGame(.logoutButtonTapped): + state = .login(Login.State()) + return .none + + case .newGame: + return .none + } + } + .ifCaseLet(\.login, action: \.login) { + Login() + } + .ifCaseLet(\.newGame, action: \.newGame) { + NewGame() + } + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/AppSwiftUI/AppView.swift b/Examples/TicTacToe/tic-tac-toe/Sources/AppSwiftUI/AppView.swift new file mode 100644 index 0000000..ba60609 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/AppSwiftUI/AppView.swift @@ -0,0 +1,26 @@ +import AppCore +import ComposableArchitecture +import LoginSwiftUI +import NewGameSwiftUI +import SwiftUI + +public struct AppView: View { + let store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some View { + switch store.case { + case let .login(store): + NavigationStack { + LoginView(store: store) + } + case let .newGame(store): + NavigationStack { + NewGameView(store: store) + } + } + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/AppUIKit/AppViewController.swift b/Examples/TicTacToe/tic-tac-toe/Sources/AppUIKit/AppViewController.swift new file mode 100644 index 0000000..5fa1e05 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/AppUIKit/AppViewController.swift @@ -0,0 +1,52 @@ +import AppCore +import ComposableArchitecture +import LoginUIKit +import NewGameUIKit +import SwiftUI +import UIKit + +public struct UIKitAppView: UIViewControllerRepresentable { + let store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public func makeUIViewController(context: Context) -> UIViewController { + AppViewController(store: store) + } + + public func updateUIViewController( + _ uiViewController: UIViewController, + context: Context + ) { + // Nothing to do + } +} + +class AppViewController: UINavigationController { + let store: StoreOf + + init(store: StoreOf) { + self.store = store + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + observe { [weak self] in + guard let self else { return } + switch store.case { + case let .login(store): + setViewControllers([LoginViewController(store: store)], animated: false) + case let .newGame(store): + setViewControllers([NewGameViewController(store: store)], animated: false) + } + } + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/AuthenticationClient/AuthenticationClient.swift b/Examples/TicTacToe/tic-tac-toe/Sources/AuthenticationClient/AuthenticationClient.swift new file mode 100644 index 0000000..54e4aae --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/AuthenticationClient/AuthenticationClient.swift @@ -0,0 +1,52 @@ +import Dependencies +import DependenciesMacros +import Foundation + +public struct AuthenticationResponse: Equatable, Sendable { + public var token: String + public var twoFactorRequired: Bool + + public init( + token: String, + twoFactorRequired: Bool + ) { + self.token = token + self.twoFactorRequired = twoFactorRequired + } +} + +public enum AuthenticationError: Equatable, LocalizedError, Sendable { + case invalidUserPassword + case invalidTwoFactor + case invalidIntermediateToken + + public var errorDescription: String? { + switch self { + case .invalidUserPassword: + return "Unknown user or invalid password." + case .invalidTwoFactor: + return "Invalid second factor (try 1234)" + case .invalidIntermediateToken: + return "404!! What happened to your token there bud?!?!" + } + } +} + +@DependencyClient +public struct AuthenticationClient: Sendable { + public var login: + @Sendable (_ email: String, _ password: String) async throws -> AuthenticationResponse + public var twoFactor: + @Sendable (_ code: String, _ token: String) async throws -> AuthenticationResponse +} + +extension AuthenticationClient: TestDependencyKey { + public static let testValue = Self() +} + +extension DependencyValues { + public var authenticationClient: AuthenticationClient { + get { self[AuthenticationClient.self] } + set { self[AuthenticationClient.self] = newValue } + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/AuthenticationClientLive/LiveAuthenticationClient.swift b/Examples/TicTacToe/tic-tac-toe/Sources/AuthenticationClientLive/LiveAuthenticationClient.swift new file mode 100644 index 0000000..0de50a0 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/AuthenticationClientLive/LiveAuthenticationClient.swift @@ -0,0 +1,27 @@ +import AuthenticationClient +import Dependencies +import Foundation + +extension AuthenticationClient: DependencyKey { + public static let liveValue = Self( + login: { email, password in + guard email.contains("@") && password == "password" + else { throw AuthenticationError.invalidUserPassword } + + try await Task.sleep(for: .seconds(1)) + return AuthenticationResponse( + token: "deadbeef", twoFactorRequired: email.contains("2fa") + ) + }, + twoFactor: { code, token in + guard token == "deadbeef" + else { throw AuthenticationError.invalidIntermediateToken } + + guard code == "1234" + else { throw AuthenticationError.invalidTwoFactor } + + try await Task.sleep(for: .seconds(1)) + return AuthenticationResponse(token: "deadbeefdeadbeef", twoFactorRequired: false) + } + ) +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/GameCore/GameCore.swift b/Examples/TicTacToe/tic-tac-toe/Sources/GameCore/GameCore.swift new file mode 100644 index 0000000..a412b6a --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/GameCore/GameCore.swift @@ -0,0 +1,122 @@ +import ComposableArchitecture +import SwiftUI + +@Reducer +public struct Game: Sendable { + @ObservableState + public struct State: Equatable { + public var board: Three> = .empty + public var currentPlayer: Player = .x + public let oPlayerName: String + public let xPlayerName: String + + public init(oPlayerName: String, xPlayerName: String) { + self.oPlayerName = oPlayerName + self.xPlayerName = xPlayerName + } + + public var currentPlayerName: String { + switch self.currentPlayer { + case .o: return self.oPlayerName + case .x: return self.xPlayerName + } + } + } + + public enum Action: Sendable { + case cellTapped(row: Int, column: Int) + case playAgainButtonTapped + case quitButtonTapped + } + + @Dependency(\.dismiss) var dismiss + + public init() {} + + public var body: some Reducer { + Reduce { state, action in + switch action { + case let .cellTapped(row, column): + guard + state.board[row][column] == nil, + !state.board.hasWinner + else { return .none } + + state.board[row][column] = state.currentPlayer + + if !state.board.hasWinner { + state.currentPlayer.toggle() + } + + return .none + + case .playAgainButtonTapped: + state = Game.State(oPlayerName: state.oPlayerName, xPlayerName: state.xPlayerName) + return .none + + case .quitButtonTapped: + return .run { _ in + await self.dismiss() + } + } + } + } +} + +public enum Player: Equatable, Sendable { + case o + case x + + public mutating func toggle() { + switch self { + case .o: self = .x + case .x: self = .o + } + } + + public var label: String { + switch self { + case .o: return "⭕️" + case .x: return "❌" + } + } +} + +extension Three where Element == Three { + public static let empty = Self( + .init(nil, nil, nil), + .init(nil, nil, nil), + .init(nil, nil, nil) + ) + + public var isFilled: Bool { + self.allSatisfy { $0.allSatisfy { $0 != nil } } + } + + func hasWin(_ player: Player) -> Bool { + let winConditions = [ + [0, 1, 2], [3, 4, 5], [6, 7, 8], + [0, 3, 6], [1, 4, 7], [2, 5, 8], + [0, 4, 8], [6, 4, 2], + ] + + for condition in winConditions { + let matches = + condition + .map { self[$0 % 3][$0 / 3] } + let matchCount = + matches + .filter { $0 == player } + .count + + if matchCount == 3 { + return true + } + } + return false + } + + public var hasWinner: Bool { + hasWin(.x) || hasWin(.o) + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/GameCore/Three.swift b/Examples/TicTacToe/tic-tac-toe/Sources/GameCore/Three.swift new file mode 100644 index 0000000..b3982f2 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/GameCore/Three.swift @@ -0,0 +1,47 @@ +/// A collection of three elements. +public struct Three { + public var first: Element + public var second: Element + public var third: Element + + public init(_ first: Element, _ second: Element, _ third: Element) { + self.first = first + self.second = second + self.third = third + } + + public func map(_ transform: (Element) -> T) -> Three { + .init(transform(self.first), transform(self.second), transform(self.third)) + } +} + +extension Three: MutableCollection { + public subscript(offset: Int) -> Element { + _read { + switch offset { + case 0: yield self.first + case 1: yield self.second + case 2: yield self.third + default: fatalError() + } + } + _modify { + switch offset { + case 0: yield &self.first + case 1: yield &self.second + case 2: yield &self.third + default: fatalError() + } + } + } + + public var startIndex: Int { 0 } + public var endIndex: Int { 3 } + public func index(after i: Int) -> Int { i + 1 } +} + +extension Three: RandomAccessCollection {} + +extension Three: Equatable where Element: Equatable {} +extension Three: Hashable where Element: Hashable {} +extension Three: Sendable where Element: Sendable {} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/GameSwiftUI/GameView.swift b/Examples/TicTacToe/tic-tac-toe/Sources/GameSwiftUI/GameView.swift new file mode 100644 index 0000000..13e28b0 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/GameSwiftUI/GameView.swift @@ -0,0 +1,93 @@ +import ComposableArchitecture +import GameCore +import SwiftUI + +public struct GameView: View { + let store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some View { + GeometryReader { proxy in + VStack(spacing: 0.0) { + VStack { + Text(store.title) + .font(.title) + + if store.isPlayAgainButtonVisible { + Button("Play again?") { + store.send(.playAgainButtonTapped) + } + .padding(.top, 12) + .font(.title) + } + } + .padding(.bottom, 48) + + VStack { + rowView(row: 0, proxy: proxy) + rowView(row: 1, proxy: proxy) + rowView(row: 2, proxy: proxy) + } + .disabled(store.isGameDisabled) + } + .navigationTitle("Tic-tac-toe") + .navigationBarItems(leading: Button("Quit") { store.send(.quitButtonTapped) }) + .navigationBarBackButtonHidden(true) + } + } + + func rowView( + row: Int, + proxy: GeometryProxy + ) -> some View { + HStack(spacing: 0.0) { + cellView(row: row, column: 0, proxy: proxy) + cellView(row: row, column: 1, proxy: proxy) + cellView(row: row, column: 2, proxy: proxy) + } + } + + func cellView( + row: Int, + column: Int, + proxy: GeometryProxy + ) -> some View { + Button { + store.send(.cellTapped(row: row, column: column)) + } label: { + Text(store.rows[row][column]) + .frame(width: proxy.size.width / 3, height: proxy.size.width / 3) + .background( + (row + column).isMultiple(of: 2) + ? Color(red: 0.8, green: 0.8, blue: 0.8) + : Color(red: 0.6, green: 0.6, blue: 0.6) + ) + } + } +} + +extension Game.State { + fileprivate var rows: [[String]] { self.board.map { $0.map { $0?.label ?? "" } } } + fileprivate var isGameDisabled: Bool { self.board.hasWinner || self.board.isFilled } + fileprivate var isPlayAgainButtonVisible: Bool { self.board.hasWinner || self.board.isFilled } + fileprivate var title: String { + self.board.hasWinner + ? "Winner! Congrats \(self.currentPlayerName)!" + : self.board.isFilled + ? "Tied game!" + : "\(self.currentPlayerName), place your \(self.currentPlayer.label)" + } +} + +#Preview { + NavigationStack { + GameView( + store: Store(initialState: Game.State(oPlayerName: "Blob Jr.", xPlayerName: "Blob Sr.")) { + Game() + } + ) + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/GameUIKit/GameViewController.swift b/Examples/TicTacToe/tic-tac-toe/Sources/GameUIKit/GameViewController.swift new file mode 100644 index 0000000..b457fc9 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/GameUIKit/GameViewController.swift @@ -0,0 +1,154 @@ +import ComposableArchitecture +import GameCore +import UIKit + +public final class GameViewController: UIViewController { + let store: StoreOf + + public init(store: StoreOf) { + self.store = store + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func viewDidLoad() { + super.viewDidLoad() + + self.navigationItem.title = "Tic-Tac-Toe" + self.view.backgroundColor = .systemBackground + + self.navigationItem.leftBarButtonItem = UIBarButtonItem( + title: "Quit", + style: .done, + target: self, + action: #selector(quitButtonTapped) + ) + + let titleLabel = UILabel() + titleLabel.textAlignment = .center + + let playAgainButton = UIButton(type: .system) + playAgainButton.setTitle("Play again?", for: .normal) + playAgainButton.addTarget(self, action: #selector(playAgainButtonTapped), for: .touchUpInside) + + let titleStackView = UIStackView(arrangedSubviews: [titleLabel, playAgainButton]) + titleStackView.axis = .vertical + titleStackView.spacing = 12 + + let gridCell11 = UIButton() + gridCell11.addTarget(self, action: #selector(gridCell11Tapped), for: .touchUpInside) + let gridCell21 = UIButton() + gridCell21.addTarget(self, action: #selector(gridCell21Tapped), for: .touchUpInside) + let gridCell31 = UIButton() + gridCell31.addTarget(self, action: #selector(gridCell31Tapped), for: .touchUpInside) + let gridCell12 = UIButton() + gridCell12.addTarget(self, action: #selector(gridCell12Tapped), for: .touchUpInside) + let gridCell22 = UIButton() + gridCell22.addTarget(self, action: #selector(gridCell22Tapped), for: .touchUpInside) + let gridCell32 = UIButton() + gridCell32.addTarget(self, action: #selector(gridCell32Tapped), for: .touchUpInside) + let gridCell13 = UIButton() + gridCell13.addTarget(self, action: #selector(gridCell13Tapped), for: .touchUpInside) + let gridCell23 = UIButton() + gridCell23.addTarget(self, action: #selector(gridCell23Tapped), for: .touchUpInside) + let gridCell33 = UIButton() + gridCell33.addTarget(self, action: #selector(gridCell33Tapped), for: .touchUpInside) + + let cells = [ + [gridCell11, gridCell12, gridCell13], + [gridCell21, gridCell22, gridCell23], + [gridCell31, gridCell32, gridCell33], + ] + + let gameRow1StackView = UIStackView(arrangedSubviews: cells[0]) + gameRow1StackView.spacing = 6 + let gameRow2StackView = UIStackView(arrangedSubviews: cells[1]) + gameRow2StackView.spacing = 6 + let gameRow3StackView = UIStackView(arrangedSubviews: cells[2]) + gameRow3StackView.spacing = 6 + + let gameStackView = UIStackView(arrangedSubviews: [ + gameRow1StackView, + gameRow2StackView, + gameRow3StackView, + ]) + gameStackView.axis = .vertical + gameStackView.spacing = 6 + + let rootStackView = UIStackView(arrangedSubviews: [ + titleStackView, + gameStackView, + ]) + rootStackView.isLayoutMarginsRelativeArrangement = true + rootStackView.layoutMargins = UIEdgeInsets(top: 0, left: 32, bottom: 0, right: 32) + rootStackView.translatesAutoresizingMaskIntoConstraints = false + rootStackView.axis = .vertical + rootStackView.spacing = 100 + + self.view.addSubview(rootStackView) + + NSLayoutConstraint.activate([ + rootStackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + rootStackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), + rootStackView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor), + ]) + + gameStackView.arrangedSubviews + .flatMap { view in (view as? UIStackView)?.arrangedSubviews ?? [] } + .enumerated() + .forEach { idx, cellView in + cellView.backgroundColor = idx % 2 == 0 ? .darkGray : .lightGray + NSLayoutConstraint.activate([ + cellView.widthAnchor.constraint(equalTo: cellView.heightAnchor) + ]) + } + + observe { [weak self] in + guard let self else { return } + titleLabel.text = self.store.title + playAgainButton.isHidden = self.store.isPlayAgainButtonHidden + + for (rowIdx, row) in self.store.rows.enumerated() { + for (colIdx, label) in row.enumerated() { + let button = cells[rowIdx][colIdx] + button.setTitle(label, for: .normal) + button.isEnabled = self.store.isGameEnabled + } + } + } + } + + @objc private func gridCell11Tapped() { self.store.send(.cellTapped(row: 0, column: 0)) } + @objc private func gridCell12Tapped() { self.store.send(.cellTapped(row: 0, column: 1)) } + @objc private func gridCell13Tapped() { self.store.send(.cellTapped(row: 0, column: 2)) } + @objc private func gridCell21Tapped() { self.store.send(.cellTapped(row: 1, column: 0)) } + @objc private func gridCell22Tapped() { self.store.send(.cellTapped(row: 1, column: 1)) } + @objc private func gridCell23Tapped() { self.store.send(.cellTapped(row: 1, column: 2)) } + @objc private func gridCell31Tapped() { self.store.send(.cellTapped(row: 2, column: 0)) } + @objc private func gridCell32Tapped() { self.store.send(.cellTapped(row: 2, column: 1)) } + @objc private func gridCell33Tapped() { self.store.send(.cellTapped(row: 2, column: 2)) } + + @objc private func quitButtonTapped() { + self.store.send(.quitButtonTapped) + } + + @objc private func playAgainButtonTapped() { + self.store.send(.playAgainButtonTapped) + } +} + +extension Game.State { + fileprivate var rows: Three> { self.board.map { $0.map { $0?.label ?? "" } } } + fileprivate var isGameEnabled: Bool { !self.board.hasWinner && !self.board.isFilled } + fileprivate var isPlayAgainButtonHidden: Bool { !self.board.hasWinner && !self.board.isFilled } + fileprivate var title: String { + self.board.hasWinner + ? "Winner! Congrats \(self.currentPlayerName)!" + : self.board.isFilled + ? "Tied game!" + : "\(self.currentPlayerName), place your \(self.currentPlayer.label)" + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/LoginCore/LoginCore.swift b/Examples/TicTacToe/tic-tac-toe/Sources/LoginCore/LoginCore.swift new file mode 100644 index 0000000..87223b7 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/LoginCore/LoginCore.swift @@ -0,0 +1,83 @@ +import AuthenticationClient +import ComposableArchitecture +import Dispatch +import TwoFactorCore + +@Reducer +public struct Login: Sendable { + @ObservableState + public struct State: Equatable { + @Presents public var alert: AlertState? + public var email = "" + public var isFormValid = false + public var isLoginRequestInFlight = false + public var password = "" + @Presents public var twoFactor: TwoFactor.State? + + public init() {} + } + + public enum Action: Sendable, ViewAction { + case alert(PresentationAction) + case loginResponse(Result) + case twoFactor(PresentationAction) + case view(View) + + public enum Alert: Equatable, Sendable {} + + @CasePathable + public enum View: BindableAction, Sendable { + case binding(BindingAction) + case loginButtonTapped + } + } + + @Dependency(\.authenticationClient) var authenticationClient + + public init() {} + + public var body: some Reducer { + BindingReducer(action: \.view) + Reduce { state, action in + switch action { + case .alert: + return .none + + case let .loginResponse(.success(response)): + state.isLoginRequestInFlight = false + if response.twoFactorRequired { + state.twoFactor = TwoFactor.State(token: response.token) + } + return .none + + case let .loginResponse(.failure(error)): + state.alert = AlertState { TextState(error.localizedDescription) } + state.isLoginRequestInFlight = false + return .none + + case .twoFactor: + return .none + + case .view(.binding): + state.isFormValid = !state.email.isEmpty && !state.password.isEmpty + return .none + + case .view(.loginButtonTapped): + state.isLoginRequestInFlight = true + return .run { [email = state.email, password = state.password] send in + await send( + .loginResponse( + Result { + try await self.authenticationClient.login(email: email, password: password) + } + ) + ) + } + } + } + .ifLet(\.$alert, action: \.alert) + .ifLet(\.$twoFactor, action: \.twoFactor) { + TwoFactor() + } + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/LoginSwiftUI/LoginView.swift b/Examples/TicTacToe/tic-tac-toe/Sources/LoginSwiftUI/LoginView.swift new file mode 100644 index 0000000..eb40c5d --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/LoginSwiftUI/LoginView.swift @@ -0,0 +1,85 @@ +import AuthenticationClient +import ComposableArchitecture +import LoginCore +import SwiftUI +import TwoFactorCore +import TwoFactorSwiftUI + +@ViewAction(for: Login.self) +public struct LoginView: View { + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some View { + Form { + Text( + """ + To login use any email and "password" for the password. If your email contains the \ + characters "2fa" you will be taken to a two-factor flow, and on that screen you can \ + use "1234" for the code. + """ + ) + + Section { + TextField("blob@pointfree.co", text: $store.email) + .autocapitalization(.none) + .keyboardType(.emailAddress) + .textContentType(.emailAddress) + + SecureField("••••••••", text: $store.password) + } + + Button { + // NB: SwiftUI will print errors to the console about "AttributeGraph: cycle detected" if + // you disable a text field while it is focused. This hack will force all fields to + // unfocus before we send the action to the store. + // CF: https://stackoverflow.com/a/69653555 + _ = UIApplication.shared.sendAction( + #selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil + ) + send(.loginButtonTapped) + } label: { + HStack { + Text("Log in") + if store.isActivityIndicatorVisible { + Spacer() + ProgressView() + } + } + } + .disabled(store.isLoginButtonDisabled) + } + .disabled(store.isFormDisabled) + .alert($store.scope(state: \.alert, action: \.alert)) + .navigationDestination(item: $store.scope(state: \.twoFactor, action: \.twoFactor)) { store in + TwoFactorView(store: store) + } + .navigationTitle("Login") + } +} + +extension Login.State { + fileprivate var isActivityIndicatorVisible: Bool { self.isLoginRequestInFlight } + fileprivate var isFormDisabled: Bool { self.isLoginRequestInFlight } + fileprivate var isLoginButtonDisabled: Bool { !self.isFormValid } +} + +#Preview { + NavigationStack { + LoginView( + store: Store(initialState: Login.State()) { + Login() + } withDependencies: { + $0.authenticationClient.login = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeef", twoFactorRequired: false) + } + $0.authenticationClient.twoFactor = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeef", twoFactorRequired: false) + } + } + ) + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/LoginUIKit/LoginViewController.swift b/Examples/TicTacToe/tic-tac-toe/Sources/LoginUIKit/LoginViewController.swift new file mode 100644 index 0000000..8b9df2d --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/LoginUIKit/LoginViewController.swift @@ -0,0 +1,158 @@ +import ComposableArchitecture +import LoginCore +import TwoFactorUIKit +import UIKit + +@ViewAction(for: Login.self) +public class LoginViewController: UIViewController { + public let store: StoreOf + + public init(store: StoreOf) { + self.store = store + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func viewDidLoad() { + super.viewDidLoad() + + navigationItem.title = "Login" + view.backgroundColor = .systemBackground + + let disclaimerLabel = UILabel() + disclaimerLabel.text = """ + To login use any email and "password" for the password. If your email contains the \ + characters "2fa" you will be taken to a two-factor flow, and on that screen you can use \ + "1234" for the code. + """ + disclaimerLabel.textAlignment = .left + disclaimerLabel.numberOfLines = 0 + + let divider = UIView() + divider.backgroundColor = .gray + + let titleLabel = UILabel() + titleLabel.text = "Please log in to play TicTacToe!" + titleLabel.font = UIFont.preferredFont(forTextStyle: .title2) + titleLabel.numberOfLines = 0 + + let emailTextField = UITextField() + emailTextField.placeholder = "email@address.com" + emailTextField.borderStyle = .roundedRect + emailTextField.autocapitalizationType = .none + emailTextField.addTarget( + self, action: #selector(emailTextFieldChanged(sender:)), for: .editingChanged + ) + + let passwordTextField = UITextField() + passwordTextField.placeholder = "**********" + passwordTextField.borderStyle = .roundedRect + passwordTextField.addTarget( + self, action: #selector(passwordTextFieldChanged(sender:)), for: .editingChanged + ) + passwordTextField.isSecureTextEntry = true + + let loginButton = UIButton(type: .system) + loginButton.setTitle("Login", for: .normal) + loginButton.addTarget(self, action: #selector(loginButtonTapped(sender:)), for: .touchUpInside) + + let activityIndicator = UIActivityIndicatorView(style: .large) + activityIndicator.startAnimating() + + let rootStackView = UIStackView(arrangedSubviews: [ + disclaimerLabel, + divider, + titleLabel, + emailTextField, + passwordTextField, + loginButton, + activityIndicator, + ]) + rootStackView.isLayoutMarginsRelativeArrangement = true + rootStackView.layoutMargins = UIEdgeInsets(top: 0, left: 32, bottom: 0, right: 32) + rootStackView.translatesAutoresizingMaskIntoConstraints = false + rootStackView.axis = .vertical + rootStackView.spacing = 24 + + view.addSubview(rootStackView) + + NSLayoutConstraint.activate([ + rootStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + rootStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + rootStackView.centerYAnchor.constraint(equalTo: view.centerYAnchor), + divider.heightAnchor.constraint(equalToConstant: 1), + ]) + + var alertController: UIAlertController? + var twoFactorController: TwoFactorViewController? + + observe { [weak self] in + guard let self else { return } + emailTextField.text = store.email + emailTextField.isEnabled = store.isEmailTextFieldEnabled + passwordTextField.text = store.password + passwordTextField.isEnabled = store.isPasswordTextFieldEnabled + loginButton.isEnabled = store.isLoginButtonEnabled + activityIndicator.isHidden = store.isActivityIndicatorHidden + + if let store = store.scope(state: \.alert, action: \.alert), + alertController == nil + { + alertController = UIAlertController(store: store) + present(alertController!, animated: true, completion: nil) + } else if store.alert == nil, alertController != nil { + alertController?.dismiss(animated: true) + alertController = nil + } + + if let store = store.scope(state: \.twoFactor, action: \.twoFactor.presented), + twoFactorController == nil + { + twoFactorController = TwoFactorViewController(store: store) + navigationController?.pushViewController( + twoFactorController!, + animated: true + ) + } else if store.twoFactor == nil, twoFactorController != nil { + navigationController?.popToViewController(self, animated: true) + twoFactorController = nil + } + } + } + + public override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + if !isMovingToParent { + store.twoFactorDismissed() + } + } + + @objc private func loginButtonTapped(sender: UIButton) { + send(.loginButtonTapped) + } + + @objc private func emailTextFieldChanged(sender: UITextField) { + store.email = sender.text ?? "" + } + + @objc private func passwordTextFieldChanged(sender: UITextField) { + store.password = sender.text ?? "" + } +} + +extension Login.State { + fileprivate var isActivityIndicatorHidden: Bool { !isLoginRequestInFlight } + fileprivate var isEmailTextFieldEnabled: Bool { !isLoginRequestInFlight } + fileprivate var isLoginButtonEnabled: Bool { isFormValid && !isLoginRequestInFlight } + fileprivate var isPasswordTextFieldEnabled: Bool { !isLoginRequestInFlight } +} + +extension StoreOf { + fileprivate func twoFactorDismissed() { + send(.twoFactor(.dismiss)) + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/NewGameCore/NewGameCore.swift b/Examples/TicTacToe/tic-tac-toe/Sources/NewGameCore/NewGameCore.swift new file mode 100644 index 0000000..a82b5a3 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/NewGameCore/NewGameCore.swift @@ -0,0 +1,49 @@ +import ComposableArchitecture +import GameCore + +@Reducer +public struct NewGame { + @ObservableState + public struct State: Equatable { + @Presents public var game: Game.State? + public var oPlayerName = "" + public var xPlayerName = "" + + public init() {} + } + + public enum Action: BindableAction { + case binding(BindingAction) + case game(PresentationAction) + case letsPlayButtonTapped + case logoutButtonTapped + } + + public init() {} + + public var body: some Reducer { + BindingReducer() + Reduce { state, action in + switch action { + case .binding: + return .none + + case .game: + return .none + + case .letsPlayButtonTapped: + state.game = Game.State( + oPlayerName: state.oPlayerName, + xPlayerName: state.xPlayerName + ) + return .none + + case .logoutButtonTapped: + return .none + } + } + .ifLet(\.$game, action: \.game) { + Game() + } + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/NewGameSwiftUI/NewGameView.swift b/Examples/TicTacToe/tic-tac-toe/Sources/NewGameSwiftUI/NewGameView.swift new file mode 100644 index 0000000..c679a95 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/NewGameSwiftUI/NewGameView.swift @@ -0,0 +1,61 @@ +import ComposableArchitecture +import GameCore +import GameSwiftUI +import NewGameCore +import SwiftUI + +public struct NewGameView: View { + @Bindable var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some View { + Form { + Section { + TextField("Blob Sr.", text: $store.xPlayerName) + .autocapitalization(.words) + .disableAutocorrection(true) + .textContentType(.name) + } header: { + Text("X Player Name") + } + + Section { + TextField("Blob Jr.", text: $store.oPlayerName) + .autocapitalization(.words) + .disableAutocorrection(true) + .textContentType(.name) + } header: { + Text("O Player Name") + } + + Button("Let's play!") { + store.send(.letsPlayButtonTapped) + } + .disabled(store.isLetsPlayButtonDisabled) + } + .navigationTitle("New Game") + .navigationBarItems(trailing: Button("Logout") { store.send(.logoutButtonTapped) }) + .navigationDestination(item: $store.scope(state: \.game, action: \.game)) { store in + GameView(store: store) + } + } +} + +extension NewGame.State { + fileprivate var isLetsPlayButtonDisabled: Bool { + self.oPlayerName.isEmpty || self.xPlayerName.isEmpty + } +} + +#Preview { + NavigationStack { + NewGameView( + store: Store(initialState: NewGame.State()) { + NewGame() + } + ) + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/NewGameUIKit/NewGameViewController.swift b/Examples/TicTacToe/tic-tac-toe/Sources/NewGameUIKit/NewGameViewController.swift new file mode 100644 index 0000000..e5aeda1 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/NewGameUIKit/NewGameViewController.swift @@ -0,0 +1,128 @@ +import ComposableArchitecture +import GameUIKit +import NewGameCore +import UIKit + +public class NewGameViewController: UIViewController { + let store: StoreOf + + public init(store: StoreOf) { + self.store = store + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func viewDidLoad() { + super.viewDidLoad() + + navigationItem.title = "New Game" + + navigationItem.rightBarButtonItem = UIBarButtonItem( + title: "Logout", + style: .done, + target: self, + action: #selector(logoutButtonTapped) + ) + + let playerXLabel = UILabel() + playerXLabel.text = "Player X" + playerXLabel.setContentHuggingPriority(.required, for: .horizontal) + + let playerXTextField = UITextField() + playerXTextField.borderStyle = .roundedRect + playerXTextField.placeholder = "Blob Sr." + playerXTextField.setContentCompressionResistancePriority(.required, for: .horizontal) + playerXTextField.addTarget( + self, action: #selector(playerXTextChanged(sender:)), for: .editingChanged) + + let playerXRow = UIStackView(arrangedSubviews: [ + playerXLabel, + playerXTextField, + ]) + playerXRow.spacing = 24 + + let playerOLabel = UILabel() + playerOLabel.text = "Player O" + playerOLabel.setContentHuggingPriority(.required, for: .horizontal) + + let playerOTextField = UITextField() + playerOTextField.borderStyle = .roundedRect + playerOTextField.placeholder = "Blob Jr." + playerOTextField.setContentCompressionResistancePriority(.required, for: .horizontal) + playerOTextField.addTarget( + self, action: #selector(playerOTextChanged(sender:)), for: .editingChanged) + + let playerORow = UIStackView(arrangedSubviews: [ + playerOLabel, + playerOTextField, + ]) + playerORow.spacing = 24 + + let letsPlayButton = UIButton(type: .system) + letsPlayButton.setTitle("Let’s Play!", for: .normal) + letsPlayButton.addTarget(self, action: #selector(letsPlayTapped), for: .touchUpInside) + + let rootStackView = UIStackView(arrangedSubviews: [ + playerXRow, + playerORow, + letsPlayButton, + ]) + rootStackView.isLayoutMarginsRelativeArrangement = true + rootStackView.layoutMargins = UIEdgeInsets(top: 0, left: 32, bottom: 0, right: 32) + rootStackView.translatesAutoresizingMaskIntoConstraints = false + rootStackView.axis = .vertical + rootStackView.spacing = 24 + + view.addSubview(rootStackView) + + NSLayoutConstraint.activate([ + rootStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + rootStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + rootStackView.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + + var gameController: GameViewController? + + observe { [weak self] in + guard let self else { return } + playerOTextField.text = store.oPlayerName + playerXTextField.text = store.xPlayerName + letsPlayButton.isEnabled = store.isLetsPlayButtonEnabled + + if let store = store.scope(state: \.game, action: \.game.presented), + gameController == nil + { + gameController = GameViewController(store: store) + navigationController?.pushViewController(gameController!, animated: true) + } else if store.game == nil, gameController != nil { + navigationController?.popToViewController(self, animated: true) + gameController = nil + } + } + } + + @objc private func logoutButtonTapped() { + store.send(.logoutButtonTapped) + } + + @objc private func playerXTextChanged(sender: UITextField) { + store.xPlayerName = sender.text ?? "" + } + + @objc private func playerOTextChanged(sender: UITextField) { + store.oPlayerName = sender.text ?? "" + } + + @objc private func letsPlayTapped() { + store.send(.letsPlayButtonTapped) + } +} + +extension NewGame.State { + fileprivate var isLetsPlayButtonEnabled: Bool { + !oPlayerName.isEmpty && !xPlayerName.isEmpty + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorCore/TwoFactorCore.swift b/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorCore/TwoFactorCore.swift new file mode 100644 index 0000000..bc2586d --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorCore/TwoFactorCore.swift @@ -0,0 +1,74 @@ +import AuthenticationClient +import Combine +import ComposableArchitecture +import Dispatch + +@Reducer +public struct TwoFactor: Sendable { + @ObservableState + public struct State: Equatable { + @Presents public var alert: AlertState? + public var code = "" + public var isFormValid = false + public var isTwoFactorRequestInFlight = false + public let token: String + + public init(token: String) { + self.token = token + } + } + + public enum Action: Sendable, ViewAction { + case alert(PresentationAction) + case twoFactorResponse(Result) + case view(View) + + public enum Alert: Equatable, Sendable {} + + @CasePathable + public enum View: BindableAction, Sendable { + case binding(BindingAction) + case submitButtonTapped + } + } + + @Dependency(\.authenticationClient) var authenticationClient + + public init() {} + + public var body: some ReducerOf { + BindingReducer(action: \.view) + Reduce { state, action in + switch action { + case .alert: + return .none + + case let .twoFactorResponse(.failure(error)): + state.alert = AlertState { TextState(error.localizedDescription) } + state.isTwoFactorRequestInFlight = false + return .none + + case .twoFactorResponse(.success): + state.isTwoFactorRequestInFlight = false + return .none + + case .view(.binding): + state.isFormValid = state.code.count >= 4 + return .none + + case .view(.submitButtonTapped): + state.isTwoFactorRequestInFlight = true + return .run { [code = state.code, token = state.token] send in + await send( + .twoFactorResponse( + await Result { + try await self.authenticationClient.twoFactor(code: code, token: token) + } + ) + ) + } + } + } + .ifLet(\.$alert, action: \.alert) + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorSwiftUI/TwoFactorView.swift b/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorSwiftUI/TwoFactorView.swift new file mode 100644 index 0000000..fff03b3 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorSwiftUI/TwoFactorView.swift @@ -0,0 +1,69 @@ +import AuthenticationClient +import ComposableArchitecture +import SwiftUI +import TwoFactorCore + +@ViewAction(for: TwoFactor.self) +public struct TwoFactorView: View { + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some View { + Form { + Text(#"To confirm the second factor enter "1234" into the form."#) + + Section { + TextField("1234", text: $store.code) + .keyboardType(.numberPad) + } + + HStack { + Button("Submit") { + // NB: SwiftUI will print errors to the console about "AttributeGraph: cycle detected" + // if you disable a text field while it is focused. This hack will force all + // fields to unfocus before we send the action to the store. + // CF: https://stackoverflow.com/a/69653555 + UIApplication.shared.sendAction( + #selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil + ) + send(.submitButtonTapped) + } + .disabled(store.isSubmitButtonDisabled) + + if store.isActivityIndicatorVisible { + Spacer() + ProgressView() + } + } + } + .alert($store.scope(state: \.alert, action: \.alert)) + .disabled(store.isFormDisabled) + .navigationTitle("Confirmation Code") + } +} + +extension TwoFactor.State { + fileprivate var isActivityIndicatorVisible: Bool { self.isTwoFactorRequestInFlight } + fileprivate var isFormDisabled: Bool { self.isTwoFactorRequestInFlight } + fileprivate var isSubmitButtonDisabled: Bool { !self.isFormValid } +} + +#Preview { + NavigationStack { + TwoFactorView( + store: Store(initialState: TwoFactor.State(token: "deadbeef")) { + TwoFactor() + } withDependencies: { + $0.authenticationClient.login = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeef", twoFactorRequired: false) + } + $0.authenticationClient.twoFactor = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeef", twoFactorRequired: false) + } + } + ) + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorUIKit/TwoFactorViewController.swift b/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorUIKit/TwoFactorViewController.swift new file mode 100644 index 0000000..a84137b --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Sources/TwoFactorUIKit/TwoFactorViewController.swift @@ -0,0 +1,92 @@ +import ComposableArchitecture +import TwoFactorCore +import UIKit + +@ViewAction(for: TwoFactor.self) +public final class TwoFactorViewController: UIViewController { + public let store: StoreOf + + public init(store: StoreOf) { + self.store = store + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .systemBackground + + let titleLabel = UILabel() + titleLabel.text = "Enter the one time code to continue" + titleLabel.textAlignment = .center + + let codeTextField = UITextField() + codeTextField.placeholder = "1234" + codeTextField.borderStyle = .roundedRect + codeTextField.addTarget( + self, action: #selector(codeTextFieldChanged(sender:)), for: .editingChanged) + + let loginButton = UIButton(type: .system) + loginButton.setTitle("Login", for: .normal) + loginButton.addTarget(self, action: #selector(loginButtonTapped), for: .touchUpInside) + + let activityIndicator = UIActivityIndicatorView(style: .large) + activityIndicator.startAnimating() + + let rootStackView = UIStackView(arrangedSubviews: [ + titleLabel, + codeTextField, + loginButton, + activityIndicator, + ]) + rootStackView.isLayoutMarginsRelativeArrangement = true + rootStackView.layoutMargins = .init(top: 0, left: 32, bottom: 0, right: 32) + rootStackView.translatesAutoresizingMaskIntoConstraints = false + rootStackView.axis = .vertical + rootStackView.spacing = 24 + + view.addSubview(rootStackView) + + NSLayoutConstraint.activate([ + rootStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + rootStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + rootStackView.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + + var alertController: UIAlertController? + + observe { [weak self] in + guard let self else { return } + activityIndicator.isHidden = store.isActivityIndicatorHidden + codeTextField.text = store.code + loginButton.isEnabled = store.isLoginButtonEnabled + + if let store = store.scope(state: \.alert, action: \.alert), + alertController == nil + { + alertController = UIAlertController(store: store) + present(alertController!, animated: true, completion: nil) + } else if store.alert == nil, alertController != nil { + alertController?.dismiss(animated: true) + alertController = nil + } + } + } + + @objc private func codeTextFieldChanged(sender: UITextField) { + store.code = sender.text ?? "" + } + + @objc private func loginButtonTapped() { + send(.submitButtonTapped) + } +} + +extension TwoFactor.State { + fileprivate var isActivityIndicatorHidden: Bool { !isTwoFactorRequestInFlight } + fileprivate var isLoginButtonEnabled: Bool { isFormValid && !isTwoFactorRequestInFlight } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Tests/AppCoreTests/AppCoreTests.swift b/Examples/TicTacToe/tic-tac-toe/Tests/AppCoreTests/AppCoreTests.swift new file mode 100644 index 0000000..3b23327 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Tests/AppCoreTests/AppCoreTests.swift @@ -0,0 +1,83 @@ +import AppCore +import AuthenticationClient +import ComposableArchitecture +import LoginCore +import NewGameCore +import TwoFactorCore +import XCTest + +final class AppCoreTests: XCTestCase { + @MainActor + func testIntegration() async { + let store = TestStore(initialState: TicTacToe.State.login(Login.State())) { + TicTacToe.body + } withDependencies: { + $0.authenticationClient.login = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeef", twoFactorRequired: false) + } + } + + await store.send(\.login.view.binding.email, "blob@pointfree.co") { + $0.login?.email = "blob@pointfree.co" + } + await store.send(\.login.view.binding.password, "bl0bbl0b") { + $0.login?.password = "bl0bbl0b" + $0.login?.isFormValid = true + } + await store.send(\.login.view.loginButtonTapped) { + $0.login?.isLoginRequestInFlight = true + } + await store.receive(\.login.loginResponse.success) { + $0 = .newGame(NewGame.State()) + } + await store.send(\.newGame.binding.oPlayerName, "Blob Sr.") { + $0.newGame?.oPlayerName = "Blob Sr." + } + await store.send(\.newGame.logoutButtonTapped) { + $0 = .login(Login.State()) + } + } + + @MainActor + func testIntegration_TwoFactor() async { + let store = TestStore(initialState: TicTacToe.State.login(Login.State())) { + TicTacToe.body + } withDependencies: { + $0.authenticationClient.login = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeef", twoFactorRequired: true) + } + $0.authenticationClient.twoFactor = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeef", twoFactorRequired: false) + } + } + + await store.send(\.login.view.binding.email, "blob@pointfree.co") { + $0.login?.email = "blob@pointfree.co" + } + + await store.send(\.login.view.binding.password, "bl0bbl0b") { + $0.login?.password = "bl0bbl0b" + $0.login?.isFormValid = true + } + + await store.send(\.login.view.loginButtonTapped) { + $0.login?.isLoginRequestInFlight = true + } + await store.receive(\.login.loginResponse.success) { + $0.login?.isLoginRequestInFlight = false + $0.login?.twoFactor = TwoFactor.State(token: "deadbeef") + } + + await store.send(\.login.twoFactor.view.binding.code, "1234") { + $0.login?.twoFactor?.code = "1234" + $0.login?.twoFactor?.isFormValid = true + } + + await store.send(\.login.twoFactor.view.submitButtonTapped) { + $0.login?.twoFactor?.isTwoFactorRequestInFlight = true + } + await store.receive(\.login.twoFactor.twoFactorResponse.success) { + $0 = .newGame(NewGame.State()) + } + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Tests/GameCoreTests/GameCoreTests.swift b/Examples/TicTacToe/tic-tac-toe/Tests/GameCoreTests/GameCoreTests.swift new file mode 100644 index 0000000..aebc359 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Tests/GameCoreTests/GameCoreTests.swift @@ -0,0 +1,83 @@ +import ComposableArchitecture +import GameCore +import XCTest + +final class GameCoreTests: XCTestCase { + @MainActor + func testFlow_Winner_Quit() async { + let store = TestStore( + initialState: Game.State(oPlayerName: "Blob Jr.", xPlayerName: "Blob Sr.") + ) { + Game() + } + + await store.send(.cellTapped(row: 0, column: 0)) { + $0.board[0][0] = .x + $0.currentPlayer = .o + } + await store.send(.cellTapped(row: 2, column: 1)) { + $0.board[2][1] = .o + $0.currentPlayer = .x + } + await store.send(.cellTapped(row: 1, column: 0)) { + $0.board[1][0] = .x + $0.currentPlayer = .o + } + await store.send(.cellTapped(row: 1, column: 1)) { + $0.board[1][1] = .o + $0.currentPlayer = .x + } + await store.send(.cellTapped(row: 2, column: 0)) { + $0.board[2][0] = .x + } + } + + @MainActor + func testFlow_Tie() async { + let store = TestStore( + initialState: Game.State(oPlayerName: "Blob Jr.", xPlayerName: "Blob Sr.") + ) { + Game() + } + + await store.send(.cellTapped(row: 0, column: 0)) { + $0.board[0][0] = .x + $0.currentPlayer = .o + } + await store.send(.cellTapped(row: 2, column: 2)) { + $0.board[2][2] = .o + $0.currentPlayer = .x + } + await store.send(.cellTapped(row: 1, column: 0)) { + $0.board[1][0] = .x + $0.currentPlayer = .o + } + await store.send(.cellTapped(row: 2, column: 0)) { + $0.board[2][0] = .o + $0.currentPlayer = .x + } + await store.send(.cellTapped(row: 2, column: 1)) { + $0.board[2][1] = .x + $0.currentPlayer = .o + } + await store.send(.cellTapped(row: 1, column: 2)) { + $0.board[1][2] = .o + $0.currentPlayer = .x + } + await store.send(.cellTapped(row: 0, column: 2)) { + $0.board[0][2] = .x + $0.currentPlayer = .o + } + await store.send(.cellTapped(row: 0, column: 1)) { + $0.board[0][1] = .o + $0.currentPlayer = .x + } + await store.send(.cellTapped(row: 1, column: 1)) { + $0.board[1][1] = .x + $0.currentPlayer = .o + } + await store.send(.playAgainButtonTapped) { + $0 = Game.State(oPlayerName: "Blob Jr.", xPlayerName: "Blob Sr.") + } + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Tests/LoginCoreTests/LoginCoreTests.swift b/Examples/TicTacToe/tic-tac-toe/Tests/LoginCoreTests/LoginCoreTests.swift new file mode 100644 index 0000000..3487c7d --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Tests/LoginCoreTests/LoginCoreTests.swift @@ -0,0 +1,88 @@ +import AuthenticationClient +import ComposableArchitecture +import LoginCore +import TwoFactorCore +import XCTest + +final class LoginCoreTests: XCTestCase { + @MainActor + func testFlow_Success_TwoFactor_Integration() async { + let store = TestStore(initialState: Login.State()) { + Login() + } withDependencies: { + $0.authenticationClient.login = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeefdeadbeef", twoFactorRequired: true) + } + $0.authenticationClient.twoFactor = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeefdeadbeef", twoFactorRequired: false) + } + } + + await store.send(\.view.binding.email, "2fa@pointfree.co") { + $0.email = "2fa@pointfree.co" + } + await store.send(\.view.binding.password, "password") { + $0.password = "password" + $0.isFormValid = true + } + let twoFactorPresentationTask = await store.send(\.view.loginButtonTapped) { + $0.isLoginRequestInFlight = true + } + await store.receive(\.loginResponse.success) { + $0.isLoginRequestInFlight = false + $0.twoFactor = TwoFactor.State(token: "deadbeefdeadbeef") + } + await store.send(\.twoFactor.view.binding.code, "1234") { + $0.twoFactor?.code = "1234" + $0.twoFactor?.isFormValid = true + } + await store.send(\.twoFactor.view.submitButtonTapped) { + $0.twoFactor?.isTwoFactorRequestInFlight = true + } + await store.receive(\.twoFactor.twoFactorResponse.success) { + $0.twoFactor?.isTwoFactorRequestInFlight = false + } + await twoFactorPresentationTask.cancel() + } + + @MainActor + func testFlow_DismissEarly_TwoFactor_Integration() async { + let store = TestStore(initialState: Login.State()) { + Login() + } withDependencies: { + $0.authenticationClient.login = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeefdeadbeef", twoFactorRequired: true) + } + $0.authenticationClient.twoFactor = { @Sendable _, _ in + try await Task.sleep(for: .seconds(1)) + return AuthenticationResponse(token: "deadbeefdeadbeef", twoFactorRequired: false) + } + } + + await store.send(\.view.binding.email, "2fa@pointfree.co") { + $0.email = "2fa@pointfree.co" + } + await store.send(\.view.binding.password, "password") { + $0.password = "password" + $0.isFormValid = true + } + await store.send(\.view.loginButtonTapped) { + $0.isLoginRequestInFlight = true + } + await store.receive(\.loginResponse.success) { + $0.isLoginRequestInFlight = false + $0.twoFactor = TwoFactor.State(token: "deadbeefdeadbeef") + } + await store.send(\.twoFactor.view.binding.code, "1234") { + $0.twoFactor?.code = "1234" + $0.twoFactor?.isFormValid = true + } + await store.send(\.twoFactor.view.submitButtonTapped) { + $0.twoFactor?.isTwoFactorRequestInFlight = true + } + await store.send(\.twoFactor.dismiss) { + $0.twoFactor = nil + } + await store.finish() + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Tests/NewGameCoreTests/NewGameCoreTests.swift b/Examples/TicTacToe/tic-tac-toe/Tests/NewGameCoreTests/NewGameCoreTests.swift new file mode 100644 index 0000000..f8eb4bf --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Tests/NewGameCoreTests/NewGameCoreTests.swift @@ -0,0 +1,37 @@ +import ComposableArchitecture +import GameCore +import NewGameCore +import XCTest + +final class NewGameCoreTests: XCTestCase { + @MainActor + func testFlow_NewGame_Integration() async { + let store = TestStore(initialState: NewGame.State()) { + NewGame() + } + await store.send(\.binding.oPlayerName, "Blob Sr.") { + $0.oPlayerName = "Blob Sr." + } + await store.send(\.binding.xPlayerName, "Blob Jr.") { + $0.xPlayerName = "Blob Jr." + } + await store.send(.letsPlayButtonTapped) { + $0.game = Game.State(oPlayerName: "Blob Sr.", xPlayerName: "Blob Jr.") + } + await store.send(\.game.cellTapped, (row: 0, column: 0)) { + $0.game!.board[0][0] = .x + $0.game!.currentPlayer = .o + } + await store.send(\.game.quitButtonTapped) + await store.receive(\.game.dismiss) { + $0.game = nil + } + await store.send(.letsPlayButtonTapped) { + $0.game = Game.State(oPlayerName: "Blob Sr.", xPlayerName: "Blob Jr.") + } + await store.send(\.game.dismiss) { + $0.game = nil + } + await store.send(.logoutButtonTapped) + } +} diff --git a/Examples/TicTacToe/tic-tac-toe/Tests/TwoFactorCoreTests/TwoFactorCoreTests.swift b/Examples/TicTacToe/tic-tac-toe/Tests/TwoFactorCoreTests/TwoFactorCoreTests.swift new file mode 100644 index 0000000..cf83b51 --- /dev/null +++ b/Examples/TicTacToe/tic-tac-toe/Tests/TwoFactorCoreTests/TwoFactorCoreTests.swift @@ -0,0 +1,66 @@ +import AuthenticationClient +import ComposableArchitecture +import TwoFactorCore +import XCTest + +final class TwoFactorCoreTests: XCTestCase { + @MainActor + func testFlow_Success() async { + let store = TestStore(initialState: TwoFactor.State(token: "deadbeefdeadbeef")) { + TwoFactor() + } withDependencies: { + $0.authenticationClient.twoFactor = { @Sendable _, _ in + AuthenticationResponse(token: "deadbeefdeadbeef", twoFactorRequired: false) + } + } + + await store.send(\.view.binding.code, "1") { + $0.code = "1" + } + await store.send(\.view.binding.code, "12") { + $0.code = "12" + } + await store.send(\.view.binding.code, "123") { + $0.code = "123" + } + await store.send(\.view.binding.code, "1234") { + $0.code = "1234" + $0.isFormValid = true + } + await store.send(\.view.submitButtonTapped) { + $0.isTwoFactorRequestInFlight = true + } + await store.receive(\.twoFactorResponse.success) { + $0.isTwoFactorRequestInFlight = false + } + } + + @MainActor + func testFlow_Failure() async { + let store = TestStore(initialState: TwoFactor.State(token: "deadbeefdeadbeef")) { + TwoFactor() + } withDependencies: { + $0.authenticationClient.twoFactor = { @Sendable _, _ in + throw AuthenticationError.invalidTwoFactor + } + } + + await store.send(\.view.binding.code, "1234") { + $0.code = "1234" + $0.isFormValid = true + } + await store.send(\.view.submitButtonTapped) { + $0.isTwoFactorRequestInFlight = true + } + await store.receive(\.twoFactorResponse.failure) { + $0.alert = AlertState { + TextState(AuthenticationError.invalidTwoFactor.localizedDescription) + } + $0.isTwoFactorRequestInFlight = false + } + await store.send(\.alert.dismiss) { + $0.alert = nil + } + await store.finish() + } +} diff --git a/Examples/Todos/README.md b/Examples/Todos/README.md new file mode 100644 index 0000000..9eb0a53 --- /dev/null +++ b/Examples/Todos/README.md @@ -0,0 +1,8 @@ +# Todos + +This simple todo application built with the Composable Architecture includes a few bells and whistles: + +* Filtering and rearranging todo items. +* Automatically sort completed todos to the bottom of the list. +* Debouncing the sort action to allow multiple todo items to be toggled before being sorted. +* A comprehensive test suite. diff --git a/Examples/Todos/Todos.xcodeproj/project.pbxproj b/Examples/Todos/Todos.xcodeproj/project.pbxproj new file mode 100644 index 0000000..924e4cf --- /dev/null +++ b/Examples/Todos/Todos.xcodeproj/project.pbxproj @@ -0,0 +1,504 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + +/* Begin PBXBuildFile section */ + CA93D060249BF4D000A6F65D /* Todo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA93D05F249BF4D000A6F65D /* Todo.swift */; }; + DC1394322469E57000EE1157 /* ComposableArchitecture in Frameworks */ = {isa = PBXBuildFile; productRef = DC1394312469E57000EE1157 /* ComposableArchitecture */; }; + DCBCB77624290F6C00DE1F59 /* TodosApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBCB77524290F6C00DE1F59 /* TodosApp.swift */; }; + DCBCB77A24290F6D00DE1F59 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DCBCB77924290F6D00DE1F59 /* Assets.xcassets */; }; + DCBCB78B24290F6D00DE1F59 /* TodosTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBCB78A24290F6D00DE1F59 /* TodosTests.swift */; }; + DCBCB79B24290FEB00DE1F59 /* Todos.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBCB79A24290FEB00DE1F59 /* Todos.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + DCBCB78724290F6D00DE1F59 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DCBCB76824290F6C00DE1F59 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DCBCB76F24290F6C00DE1F59; + remoteInfo = Todos; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + DCBCB79924290FDA00DE1F59 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + DCF6E2D124296752002F8A8F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 23EDBE6A271CD8C7004F7430 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + CA93D05F249BF4D000A6F65D /* Todo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Todo.swift; sourceTree = ""; }; + DC85B441242D0286009784B0 /* swift-composable-architecture */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "swift-composable-architecture"; path = ../..; sourceTree = ""; }; + DCBCB77024290F6C00DE1F59 /* Todos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Todos.app; sourceTree = BUILT_PRODUCTS_DIR; }; + DCBCB77524290F6C00DE1F59 /* TodosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodosApp.swift; sourceTree = ""; }; + DCBCB77924290F6D00DE1F59 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + DCBCB78624290F6D00DE1F59 /* TodosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TodosTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + DCBCB78A24290F6D00DE1F59 /* TodosTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodosTests.swift; sourceTree = ""; }; + DCBCB79A24290FEB00DE1F59 /* Todos.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Todos.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + DCBCB76D24290F6C00DE1F59 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DC1394322469E57000EE1157 /* ComposableArchitecture in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DCBCB78324290F6D00DE1F59 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + DCBCB76724290F6C00DE1F59 = { + isa = PBXGroup; + children = ( + DC85B441242D0286009784B0 /* swift-composable-architecture */, + 23EDBE6A271CD8C7004F7430 /* README.md */, + DCBCB77124290F6C00DE1F59 /* Products */, + DCBCB77224290F6C00DE1F59 /* Todos */, + DCBCB78924290F6D00DE1F59 /* TodosTests */, + ); + sourceTree = ""; + }; + DCBCB77124290F6C00DE1F59 /* Products */ = { + isa = PBXGroup; + children = ( + DCBCB77024290F6C00DE1F59 /* Todos.app */, + DCBCB78624290F6D00DE1F59 /* TodosTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + DCBCB77224290F6C00DE1F59 /* Todos */ = { + isa = PBXGroup; + children = ( + CA93D05F249BF4D000A6F65D /* Todo.swift */, + DCBCB79A24290FEB00DE1F59 /* Todos.swift */, + DCBCB77524290F6C00DE1F59 /* TodosApp.swift */, + DCBCB77924290F6D00DE1F59 /* Assets.xcassets */, + ); + path = Todos; + sourceTree = ""; + }; + DCBCB78924290F6D00DE1F59 /* TodosTests */ = { + isa = PBXGroup; + children = ( + DCBCB78A24290F6D00DE1F59 /* TodosTests.swift */, + ); + path = TodosTests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + DCBCB76F24290F6C00DE1F59 /* Todos */ = { + isa = PBXNativeTarget; + buildConfigurationList = DCBCB78F24290F6D00DE1F59 /* Build configuration list for PBXNativeTarget "Todos" */; + buildPhases = ( + DCBCB76C24290F6C00DE1F59 /* Sources */, + DCBCB76D24290F6C00DE1F59 /* Frameworks */, + DCBCB76E24290F6C00DE1F59 /* Resources */, + DCBCB79924290FDA00DE1F59 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Todos; + packageProductDependencies = ( + DC1394312469E57000EE1157 /* ComposableArchitecture */, + ); + productName = Todos; + productReference = DCBCB77024290F6C00DE1F59 /* Todos.app */; + productType = "com.apple.product-type.application"; + }; + DCBCB78524290F6D00DE1F59 /* TodosTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DCBCB79224290F6D00DE1F59 /* Build configuration list for PBXNativeTarget "TodosTests" */; + buildPhases = ( + DCBCB78224290F6D00DE1F59 /* Sources */, + DCBCB78324290F6D00DE1F59 /* Frameworks */, + DCBCB78424290F6D00DE1F59 /* Resources */, + DCF6E2D124296752002F8A8F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + DCBCB78824290F6D00DE1F59 /* PBXTargetDependency */, + ); + name = TodosTests; + packageProductDependencies = ( + ); + productName = TodosTests; + productReference = DCBCB78624290F6D00DE1F59 /* TodosTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + DCBCB76824290F6C00DE1F59 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1140; + LastUpgradeCheck = 1240; + ORGANIZATIONNAME = "Point-Free"; + TargetAttributes = { + DCBCB76F24290F6C00DE1F59 = { + CreatedOnToolsVersion = 11.4; + }; + DCBCB78524290F6D00DE1F59 = { + CreatedOnToolsVersion = 11.4; + TestTargetID = DCBCB76F24290F6C00DE1F59; + }; + }; + }; + buildConfigurationList = DCBCB76B24290F6C00DE1F59 /* Build configuration list for PBXProject "Todos" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = DCBCB76724290F6C00DE1F59; + packageReferences = ( + ); + productRefGroup = DCBCB77124290F6C00DE1F59 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + DCBCB76F24290F6C00DE1F59 /* Todos */, + DCBCB78524290F6D00DE1F59 /* TodosTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + DCBCB76E24290F6C00DE1F59 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DCBCB77A24290F6D00DE1F59 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DCBCB78424290F6D00DE1F59 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + DCBCB76C24290F6C00DE1F59 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DCBCB77624290F6C00DE1F59 /* TodosApp.swift in Sources */, + CA93D060249BF4D000A6F65D /* Todo.swift in Sources */, + DCBCB79B24290FEB00DE1F59 /* Todos.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DCBCB78224290F6D00DE1F59 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DCBCB78B24290F6D00DE1F59 /* TodosTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + DCBCB78824290F6D00DE1F59 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DCBCB76F24290F6C00DE1F59 /* Todos */; + targetProxy = DCBCB78724290F6D00DE1F59 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + DCBCB78D24290F6D00DE1F59 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_STRICT_CONCURRENCY = complete; + }; + name = Debug; + }; + DCBCB78E24290F6D00DE1F59 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_STRICT_CONCURRENCY = complete; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + DCBCB79024290F6D00DE1F59 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.Todos; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + DCBCB79124290F6D00DE1F59 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.Todos; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + DCBCB79324290F6D00DE1F59 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.TodosTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Todos.app/Todos"; + }; + name = Debug; + }; + DCBCB79424290F6D00DE1F59 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.TodosTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Todos.app/Todos"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + DCBCB76B24290F6C00DE1F59 /* Build configuration list for PBXProject "Todos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DCBCB78D24290F6D00DE1F59 /* Debug */, + DCBCB78E24290F6D00DE1F59 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DCBCB78F24290F6D00DE1F59 /* Build configuration list for PBXNativeTarget "Todos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DCBCB79024290F6D00DE1F59 /* Debug */, + DCBCB79124290F6D00DE1F59 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DCBCB79224290F6D00DE1F59 /* Build configuration list for PBXNativeTarget "TodosTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DCBCB79324290F6D00DE1F59 /* Debug */, + DCBCB79424290F6D00DE1F59 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + DC1394312469E57000EE1157 /* ComposableArchitecture */ = { + isa = XCSwiftPackageProductDependency; + productName = ComposableArchitecture; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = DCBCB76824290F6C00DE1F59 /* Project object */; +} diff --git a/Examples/Todos/Todos.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/Todos/Todos.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Examples/Todos/Todos.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Examples/Todos/Todos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/Todos/Todos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Examples/Todos/Todos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/Todos/Todos.xcodeproj/xcshareddata/xcschemes/Todos.xcscheme b/Examples/Todos/Todos.xcodeproj/xcshareddata/xcschemes/Todos.xcscheme new file mode 100644 index 0000000..9377c0a --- /dev/null +++ b/Examples/Todos/Todos.xcodeproj/xcshareddata/xcschemes/Todos.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png b/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b1516e5a122b534ae5a9d14706d6248718aeb03a GIT binary patch literal 7569 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 literal 0 HcmV?d00001 diff --git a/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png b/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..869cd81f3aee14834f60b9fb9bb87b3ec53a2840 GIT binary patch literal 9893 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 XN$)>5c`(j700000NkvXXu0mjfLN#h7 literal 0 HcmV?d00001 diff --git a/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png b/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..94a32fd65c0f0b6cd8af035b2d10286b49c8732b GIT binary patch literal 15226 zcmV-=JB7rFP)2su?y6VY$)<;09Zr;%Q2j$4Vou^we_xx9$36SdJe*j~_q8;eF-% zyJLNCf^vfGFjwEce=<~k-=sPCvgTyy4@3U{W;M=;9K9UgKQ$@n$iD`Pb^fv9+VAfU z8g5Sb(Ir$>hhhh+r&}tSelC*K_Za(-cIG?0Cz@mUbaOhw|_0QBa zlIDbb6joct;@{%UHZ*RgF&_^zW>)a_cAe8MZDa2d9@b zSh=cr>Zx`Z-O+d0dd8Dxz{Y{u3Ye|nr5v`hZ`k_r?F8y27fvc(zYgNBLAMDHK4G^_ zG$+%PB#nb78h4e9uIO3ZFKxefApA&?M z-YZw38GHMs4CM-z*wEvraSB%G&Ws9G8B8<@esCt#91fAu3V@n3Yj#iKW~d;cXpTXQ z4uzCdj(^f@HpnJuW#6!Z#nQQ;%#O9Y2iQ@WHd_P^S|HV(y<`aXHGuRc7(rukt7uQw+&XzKkXE1&d+~=Lw*GkkDzFtebnt7vy(p;2 z4gz#neYK=2dLR*$sPB<*k93^zl4oQ{NNTnMIskyg8ISLNHpR<}% zEQNF!&2$il6$j~XT~NwiRD27E>x^>Z*=83y)?0#1IJi%b6_+VCjw_#BB4`?Nf~_i~ zzgqSA3`H{W&sp=`6(j*wXb!dTReOWRUd|C<7K9?Yg{y6NnAS$%Lrw&9yAdRN_YO7) z%Mmw#2Bao?Mo-PDLUSdh&JWq78Pefib6Tzc^)qtM`-|eU0&%~h0ICrr!u zec#5dXVsRiJF^X{#f*S?>k-3LLP90CPMivR-{&bMdC%fAb9RyhrWe^H6iKbai?b=H ze2ZWnF#9+|hv)4bddzZ2mGm30aBsfMu+9|*%D+~qABwh zi^Z;D0h|cui=6rwg+*BgRAq-!qC-Fcq-MmBpx{5=$pqJN9EO5E@MO>FrnBcVvE6-# z;XFkZfq4)-D^LjdEs`oy_)N--^$6AY<;K1$Xlb>Bb4FWf!U;3fTaN+RhE&-(&fuI` zzJ4(o_CJ3F$1nI!pzFbul%}8(mH!g`Tbe75GqK6(;AWwZa|TXv2CM4Jx$Ado;onou z`OvDCS4X%&)lmO9S?B`dwErqO{5qvH*V!h3O*j!Wx3~8$bk06|a3+F_@>B7V@*rmd zr{39@AYe9(bLNw9n13ARczD0zfeV(tI?FPz9`s(_Cy+KPfgGw76BPcAvylNxOwO^N zkRM5d_$T-LtFL~luO7GrF{tl3h~U5Gdy?u$5E=nF=lBR^7p?05tj*R?f}(ny&k9Iu zn#|1gKdAaQMRkZp*PTZ2M)7H0y3aJ`t<@B1|L;erXA3s zxm3_WM>x}*fJ{zv0@Jaa7Rnbo_d6W*#wJ0VA9gcO)xt++j=21?W#D7m=RI)hPbMo) zldR<2*5+1qEy*f*`UF%Dd6xEyr2$iKe@ff0S19Jv^6Hns?e}6w zvh1he>*G&4nA6~(kA6E-@Rgs*RlDlETjtCal&}g9nXt6#l2l>whI2p_uWnU|33&DL z=_1-!WSC2b{d75w*Z9pxDy-ciEms}#M~+$~z}A{HcAcFYxEBr_jn~7JR0+U1dtq&$ z2L4}&D-2y{HY|J-KdECN+D_-~bP?x(3!0m*yO|(!m~n#AHhu}QY6@8(N5g(9ySwI5 zRghGg;A6v|cHP^$5qj#+^y*P-M?&MnI~nboufX)-QUamO>PCRGfX|E@1snn6U_uGD zc#^LpziJ0Lz!$8N0Jqnguz?60sGDZXF!_(XF!#g%Fuk+PIuUgHc&PRrV-x>%qfJ8Anvq9i5QGCbY!e^ zkav`8mpDr!J)2QQ7-#U#%UA7H{anLlycf2?l-az8R03~CmmXJw4k>3n-Qq?rU9%mr z76=RPTu*6bZ%nG3y8Tuq1^IN%qvqypRjM#qZMxAP_zuP}1(1e~owTohD{Cbq?>BoB zd)%qdhxRQAAU`P)hEw(r=tX>batdpiQo|OcDVfTk0godLX4jx%>i_G>$;5q&Z_ zVtu_O+Ux0gcs*ls9<{YaKFzgSCj8s{Jifaz$MqD)tzhN{pKfsXQi)KHeRvfBi2%Q5xKDupe_OQP`GZozm;{S^9O5*ty4u_ z21c`G&=1hVfy@!OUk4%h{$yq9WJc61?s>yZT(4|huWbH}mByyQ{YBU3LLe4oSqWr_ z3rF#gx%AK0%Hqkv2VQQ{S?{GUAmjsCKVpJc6L{HSx;ocNDn=_0I!ku_;rZG5te5LI zKMqad8|FYNd~qpMc~yc0+|T9hpcG13EEtO;H3Sxw>#4N_GagRB+Ytf*$FhPDXE=e7 z1SmI>S1KFVDw|g-n=_TocdQilC0$fOD@%gjS;xUUvLi=yxfA9pZ9VQPdmPhOnuLh+DSVS)Y=C< z30wka`|;`H#(4wQ&*&dDKXrHiyhI=BRUun5zcdR8ZB-%PCiw2<`# z+RI|39J#GG%_NlbF8A5u_IhRe9V;_b#@3NLA%@#6&YKceaC#;G(#b$JlrMUR6i^Hf zKdR;b%USEi%IzLmfv=d5^@mFFKI7wujk@ppjC~`l`~UrI=k7p}Rvt8#Wc{{Cg*oWl ztEQtW#YW1w7|>FslLJyUR7NX^KM4|1^a{i<1rjG-H&}VowB{WvJyfPD$P_|ul3VIo z;&LC}aw`PJe%kcpt-e)aY z^(W_bY;kywytwNdC%3wfK6ynx=4UI6Wu=op4gxGrAfPEqq1>kgiij7TCT7VxAucHv zcp(lXjaxlSIt6@~q~8)Ej2ZIZzE)1~VSd#i!848o0rn=^H_f!aby{A6I;FVGpqYU3 z-+70N9!!VHfgr$leEuJ7h{wbv6@^xdd@g>=hIqU8;RLpm*6E`L;rz1waKnQQ)4?MClQm>`|<1ZJZ|o{GpYejz|F|2_(^iSB=!P zvnh^+tI@ZU&KA<%HJ4$XKf_S4nyN)=sGJ%!l7C}ne}gab+93%R@j|HQgIeL=?HgSs zJW{-fM#`E5c$iA{huF`6n%2_kg|T0`huueUF85HRs_~1;B4XO3txKoGZEVJHF-AKZ z0;OiaJ#C=JLifu=37Asq^>Su9w5{8NOyG-8K&o1wNnsSX`q$?2Z>k6LA9&$~H@ zpRsqkjQEgVGqQN{6*Fbj9|cZZ3MV+=oS&ay$CKm1P?4n+p(}E!Ip#gqzQT!4O8wFW z2{He|X(0Cj0_71T2T0tyM=vEg1eB+zo$ag6_B2V|CL|EVH-oqK_8aE%kSXhP0Mi_& zyUqAtSu1n3oGAB$LezSJkk~8C`#lr(c9)SDXjMws>M@etX2LmrdRC`R&UErZ+E-6* z_Y{+FmeW#%pe7)}!5|m8sb3XSCh8RgmE6)16Z0>V1|xu%LmNUmL-1R=KM6*pCxlGl zHM#ROC=Z#Q1~v!O0v=UtAq_*Xnacy^MEFAv8yVQ@GLml@ncwoMPA*v|2Oy6&EFL|Q zIp^jVYx#e*Zouw{e7ff1={_U<=SIAC`lNBzXzt{Tl&gMD{pRs*S0RDV{u1h-wi#b> zut>2~)t7>}8H@n#0pXymC`r&XE%ld2Du%VhI*2GQNvqc7HWY}|FyV;C?-310Kb_*ZMAkB)j$j`n3UW1c?7!QP4P_FwitJ=yOspy-*wpu*e^ z7cEkjz_GXm?l2|_7vPg(`CPU~ds@=0u5amm;cKO3Xw)?b@9hK=lik$Klx z`BgQ~&OSGDK|5PJ!jHQ*irL;$`gLoih(FSvUAR8=`6uAdtA~Sy%&-yEip=@&qtJl@ zU22uDrmN1_U@1FvF@r>=*%rg_{7^C{lo-jOiQu(zcG9^uqLT zFXhF*46xYO?cIS~5(j&@wnJs!T4KG~FM>oZC-9IGABtsGcxN`P7v;ij;5o~3`QhU7 zaCD*sVfss1Jki*fGb~sm?mJ9ynA`ZW_~!k)3D->5tdDAjZyglbJ+~T3P@Ms83D#$; zIq$6AAVrrWTz|)Z*}2o5qwPKrsj#4nsY=~}xZw+8SYICSK>%c60O%kDC!T_AQA{iRJAa zaU`ahS!zq~d!=gK*U?({<$b+#)BJIl8_41KUFkzHOF=z>xbG0<3$#i=0P9CI44@5h z6zM^#8ZBPPOU0FG=Puc`NG)2xZzI^!Ninw)2;4L2+#a=ezV7U%{Qd3Y5FW6(&AJwT z+(A4Pb_@>o(kvbhw|sI6<^NAF{>gv_`oDI6ucxs5vM8WH_796+30eu-IFeBo&xm50 zPS(K?wX4dybjm^+848pit&V@{_3mUd=70zS;jRQt`LTatC{ z_gw=nS?Vm>wm|uuTUx9^`O{0?)t&ztPr)}U2Y-B+?k_;ZYJX_gu~dZ;R0N++^r93?FjyevW5#WAY_dg`eOIib1tMNXea)gDNb=nYo7%59yJ^qL zD$T9LJ0I12@vhRWm?erXf0skR^LVlOuiN{7k;|ggec~@#XC;+Q-{>cuU{!K-z_H}O zI?e3G_u_>RYK^53JpiiG0BM&r52)9{^x|KaYPJF*F{yAGhv}nfJbC??ZORwF8|Mp{?~w`auN~-#anp;9gmut(8Bl znr`FNFZy$}uKt|+p>z002P>#N3_-A{fkm!-ZxHBh8A5MkKD=pqj8*}xGtAK%=%IKG zs02U>1NoaHh4prVEfrimIv(P`O?;Oh;7gj+y0H7q@X7yP&46`io~xGU5Le6dC*}8C zyE0eg@bI|k%V!eT21W}MA=mcIG%GV~X z-KH>XPze~bJ#1RDJ4(C!09%}t|KGq-|GsO&`tPbFezr;nd$nF?-7n(HKk%om-JZjn z1I4u-QpI4K0tD<>`UNd$O%UY>Vtx6WeR(~fI=MeIx-JPk3%h)b&0PkxltlrQU$^#? z-X$n!lCJ$h&044$INKMGq5LUr?-$Ye84&S5xS#vu{Trw=2?L_JHS5S^ucAyOMj`8Z zOy-1va)zEhynQLZF={~h?wCQlv$ad|%|BF76@3m&m%%Y0Mwn06qE7(nsw&#~kolzVbat8V4l`#Y`wN?+hH|FBaSh)buzR4> zBw@_h`?7tQ65r2+3n~Dy1YuSl+;{8sFX*?n$Zh}xU(99jA1wZ5^WabS*9K^Rvqcgl zuq(4wz@~Ak75?Ai`Px86^4f}2f=HFEipY7k_y6sBxsNz@hH8e z_P@=&Yv#d{Yh#bHElnmw+5-|ZGRiS42gl3q|59@n-fb)C8}@(q!{xn{ICkvhGAuLm zHn_~p%*+@lTsBD>fn|1E+p?WBiKXs4-$dV0BVV`oR9@(L&gAuI?9Q2IW@MSJjwh3( zhMiQZKhiPJrQ;wN1^(dp_;`Xzz=q_UVDHKN&-7pZX4uY%Q#HyxIR+$=WJOVv;0&-H z3btjb0%vveQMaI6eyAy?D<@d_OzSLOp!{^l-t(^Pd+d0&`01Lb0_8`6pX^mxz%Sp@ z1An9K-d`=|of5duE#6lvK3ISD?Tw0aZ4`YI}vx1*x{rRv) z5}J;N6b>kqYz8%Xy3Zrk0!f0ZS;T$MY;2ut8z1Y~=e^6=haqVOES}0)>=Kwmw6RYT za?QpeGEj?qvuUKQLe4JcKke7ETK42F%8<1^nHBlm|9Yo%ul3A*Hb$wCcM7nsRvX>KJV21v)sSK* z`0MbBFR!|3n@>)ipDeL3OTwZMTO!+Ue&r9lv(DwrZB{uflo>MEjs>7_Lu6Ya`0prL*0LO6BatvbEW;Hycib@Db#O z;hbw&pKeyMu`5F%{hJu|qG1Z>N1%Ux*uO>>Y4DTyE2B!-s#96D$~if#Wi?!IAL^H7 z-ohbC-YVv(0Zoz83&k@Qp4A5=DcRR)E;!x4w;lvhIAWRfU_g^1R!%zC&k<$yI+?N0p{`v9C}vYtYyst^{Pxx%iKd1sCz|~Q@Ej6HH!~g z<&CH{GA~+83pAww?@F>(;e{n-2+>w_*K~*Iy7NwjPzL0%~$5N)C#O z8vTbIO}<<|&$nfL;9tLXJ$Q>Flu$r{sYI<;(7Bvhd9Q12%cYs5@@?XC*xs?XV>eFJ z`gyN!AB>Lt$>|HF^ZVytFOIzhy|iRkvZiD?Vj2Np07-TQP$hx}5U}(gc69Y7&HSvZ z_hiclqgNVw-qLcmhElm#iUHq*b*UUInx*%;_IBNQ4u$T`d9F>q>3*r*y5J4Z!`5Js zl=U5XQs@^C)C+NQw2lF79FJeFmzPL6$b?HJZ_2^toRhF`fO?!4DvvtGbrLhz58M4_ z(9N1g8eUDPCHH29$;wJiRi>zyNLt3K++&vC<;WEub2(M&ROQpALeu?Fv-*Wr^8$H- zumr{bedtxjxGtKbcv?o27wYA-p@vUK87^zUL1Rd~tc3UlQT|A)Ij6qyKKHAuR~D%! zS=j+SZ<2B@DTHXJ*1?LDq4u?myduU@&ZHK9S!Gt8hUm-l1rIn z1M0vmQjr_Fy2D*0euISF;Ex06Scp;M2idB-=Nj(UIxRZ8GyQ0|soi)Rx_CqA>4)Qa zoz~@bk-y{h(gx1lM#j=&pvzdFa88?JqFrjcXW6u1LX zxH2VYE|So*jHxdO{hd;L4ZvI&Tng|9YV7qaVFSemXh_!U^6psl-|2Su2gCF5mk=ag z2JK)xk7rB)#M56a+?>$vwY4SF09lhq3}`$RmJkTExx>;*=#?~{r1XIPN#%nf&8=|q z#h@9f&^V;RP8(T4(1DE5(?WYk)!B%cBmH$r9n`2KqpIYiXju!7f=J+&U+;Dx9-ej* zb59R7@QUNnBzfVU!u3O&<=uMatCu?`@;$&r zl>_?ohkox~VaO#;zKDov&LJ5zX6x#UhmUo-1hpdtKFErcd2h#fPAfc^( zI8>o>I1c9UdqT=x_xNbl)b21UIZazMbS7;`@%I?|okIUV!}v+>s(*4aNwf?6SU>G| zu)eX%mkq&EWf==oNo5Q(D}-!kh!9g%f{YMpVZ6hsN?W!1CP7(=jD}g7)m@l#_4>I+ zeY;-!QoFq$Zq7R@#NhhfuuZfX&lsv4vUvSqEVa+$JE!y_+t)j-oDg@IBJY@4)4InL z84H`gyDI$Jv{tKqtJ~cf!a7TxVSPwB4i14K&j9sk+ITdN ztscvlpN=2;lS||A?+4y*dxO1^*EszFdH*=^b9ortqoXBVtQuC1OfQl0G+RHTQq?nT zoo`^)WPrh#3KDPLW0+EWy|D)OM5r(xm^0#UY@o!`y}sG$@^X*qWN>pxcv1GKlC7Vi ze0VUYmv4MuehwOHPyFCG2qyC8jEmf~NU5F8}WJmUKsXVdZhPGvKvu-4Z1J z9ga($BJS%dP-TqunS}Zqn{NH9t?phQ;$iOjLCQHq>qja)H9D9CbNOx1KtXzZVlt1f zPKJBNA9@2RLI9Bt*C&TtBu%8!r?+i{Y1q-QXqa!6TYZzoBd^W0e)gy<;lK@0eo=}a z{vE>l&rf{ZI*b21LVs8o9|ZGzpEE|{Pb3h2ezljD`>rib3BXbqOR=Qipf5v&!6Myc zJ$_FnQg3HrF{0{sV6P3#~3x(TYzDY$0&39gO^W zd7t~2pa0SyENE6%I2l1YgrmGHQpqUgAPh=2$}mK%+c-=u9Kr@%c_w5j->uv4uGV4n zT(t#l3~JVEOl!k!lTRQB}4gVUw?A0_|7$V+RE za>ff6`ZHvNiOY(^M^lm8POP<~N;)J<2IAjr*Vm-iDARQEp<0`u5NXf(98HK#xABek z6|z3sRb`avc1LldhxWWNwvb<69XvT0|3@h2>%+&rgGJpU)6QZj2sz@&is%Fm6P2h4 z>m$}P+CP{%3+FbHER5@ayP{>UBMuxh^D?jLn3<_)!SOO2gmXm;7Fmu(cBFwGk`y@p z=DnSlwtFmTZ@raN{i^FztEZ>^e$yjJ>}%l&vgY{k?tE;cg8{{6=l*tonsrNu#T$oc zmj!k_>HmYR5_#hp#E&L(DjdD)MbE2n%?(fbA>MM!>+y|zW3ODg0_E>*_Ks|J$yS#Y zAdrYQU}Z_}?6$5$&x&<2+6D1#gg{_eHd-FTfsh^F74ZiP#Q)Ax=fm+iQ~b=FPOh7m z{OGtFtf}A`-~}iA=!U(|%eA=bdGBlVSavERLX%>Ku87wUf%R@GEMCIVBnUJ`x3JN9 zq=OB5(BkQq@T-A>b#Ny5Kb7O&{(=`CcYP=)>mkI0bHRweMY*Be%VJhtFE02dY7Q5@ zM2Zx@EmCwu3W7+~Vf_f1BO5(TtwTL>CJr(MS_v^_5`RzYqOn;4XTeU{(-MpUOLW8k zP2W353hCqAXm;>I4qjH_aq@kw^+LEuCh<4eF8@#5obX5R`ram0m_(ETR~w-C+)~gG zO`Jdes6ncqVc(D zJKGF+Enjt@8RFSG1tnEavk>*<_N{`X;cxDl87SllKww?%=-n&5)KZUlRuO|17| zeH&*22nOh9>nQ_{pp`RGE^hShY4vwIb5?qeE)_ldgDYk)i?F_pNvz)v{L|qWI!^^d z_R1imUtsHa`-ZK2oKYII(M3Gv=p}dfFLr)C#N*5?{W&{iud$Kl&fz914CVUP61MfQ z+sHIXC9LlpZa{qcAd=12_njpf2_U|EmxzbR?jEU0kAyuK*5%S!>e|1vy;I?sWTO@9 z$mE;CsbGv#VHN z_;ca-dVNScuKc6q8!c6pT}V~UQm5-ENtkF5Aw#q5m{7k47G$vBfw{)^eXYUQ$hxou zNYP zDe=AZ_7V32E~Z}%g45CXw14SzBL0LQD_>Kl)S1OoIN>G#*%GbsE$M;&8H9f$obxZ2 z>pfWKN)|URnp;S6Qek8SLxdsToJYt=I#M^RPX~+WCx`bF>i`e8v-R!!w(PGZwpKdR z9Cy+?xm~2N5MKny&L1s)a|ichsCwBI1(T7t2~ z)2styz^wW*r0pU=NVw)wp5DoWbjm!`j46|ExRwiyF)SIe(X|<0ECU-lxs|7PFUH?3e?@;DiAP*z1GB zTaO2LT!=v!pa;uBKnr*n!UT8*84nP0wf;R@7MWAAJOh!M{;a_w(^Cs==Qn-4{T@B9 zhO2JGu-#PxfpRn%9>&)BsArtL6U}vlxB%K`k5|~nLKkJe~JP&#bwLziQzdPRXN?gu{>~DoDhB8{7 zM4|uwmhlT)T z|Ncz>DVEHc?x$S~GT=oog6~oT(=uFV!7_tTs-=|I!01dr#LCbE8_=!T0u<;9Ko*j- z=HnIEvJ`~*xb zcRk$p*3|Gxcg*6otvm+$&ffDd9uMVC1irr=%vJE(WYP6xAE6)fD^2?IxfB-70%arVH~KRP3bwQJew8eoY``Qm1}36uoNpf z869G*sbEf$vf>$S%+O#ee&T}vZNDn&#d#rPXRPI5H}Jj}$FklHEmYzXsJ8{(JS z{z8kDqm^Jl{kW?m;E+#jsGM;M=%GT`ch>BCHoa$9r%kQs7udI8m)-PQDWO=x5%C*7nvN&jYelluSczUT#WfExda{rcW zGi;r42s<5lN@l4Nl50*5ZPJ+o6!bAN0OIeu0Fi;I*<`6j0XOyy7t;z-H4f-G)WGD{ z0~h>f?D289B=M7ha@^RV{EqcOjw?XOoP{b*;Xphti0`!{`gNE11D&|lMN2Dx`th&o z5^1nxW&kCVD-5VmXyu_k0F?yB4AM^^h%CYqJDFqza5R#O0D+&9MOQi4@~rgBu`-W# zN*T{1ZQSbb+VqywG%xIZh>IhjUCtMig~KT@w4~&8InwiJJ6LmJ^wQIlmD8*Kx4OY? z>sXI1KO+LKUnb|p=hmH-mLLCTOCj}hc@oa}mkZTFx#pDO30-Ywn_GrXiePR(DInEN zNGfdXReiNUo~10ERV#xe<D=X( z_iy5-Lu)g06b_PF&fy1qVYh+=< zAv*dV;-BArV9Q@_2Meu`WCsL^Z~4f}-QYuYHBXLtl5FaNjXKU%ov&=D=jbN?l#NYK zkZgpfY_#z^_B+?1+(jXH9&=jGbX#`GqRQ62dz$_gd}~L4uttBsF7DUtAueld@nQwH zD8LgceR7kT>n}_x1ukOEx;*PiQRWIcjrhLlGu zz3?M-m8~kQ1p7mlG3`oqF?hZnyZqut@GM@r;hV%W@k4L)E$s4jxKt>|lxejAg{oV` zVk+)^&EVhsDIV?tiRazFIv8auHZ4QtE3|%@L~09Y9s(h?s*~+bErpxM%pf@(cTTb{ zOF1aA(n=343on*)73Z!Cv1Sp!2s+`Xu*>6RU|2jjb*a=3BUe~S{YCzsdE+guFY_<9X{HM9&aH8 zA8mMCVmu3Iegs;BEGhk@L`|{yTh^V2E`<1mwg&MwlwbPEPISi`c9xXW4BAg5a~iNh zo*B!)%<~oZhdp2a$GPWJbZFh9sT3{MEYyDU8%36i?N@3;b9yNRIWO&XDc{>5{ivz| z^$YolhtE|M#DAk5eytOJY{T1U2H;Wl@&I8fRaIDb7q`Oa>`O1G@sD?gx4${qb!yHM zOpK-S+3}iv+q(K*H{#dwSKQ0FbuO+4jB>e>33vAL<_W2=go%fHrc;?MBkMyDj7~F{ zN2&QFBXCZgHoZSND}E7@mXM=dgxg{Tm2tvWwhJY4Fu8qgSM`my698CS(2UhD^kIh<-B%zCp_?A z%!n-loQE;*?(8h7rqN<=;IZule4Is!>kUy)iw?tl^?8_`uP){q;qm#OFVFmwK-rD1 zpiEjNF=+gw{jLJB?$5u==iF!yeC8`HzZPtheCh06D%qgzT<}%v z0s9~ZJ}>AnQHzP1`1>{&`Xr;TrP zWz>&S{tSHb_0C;LS7YOm7Ozhz zP%qcUMCEemm6#8VZ3`^h5?PZljs?-+C;V5@Uj2oJY~$4>m^4Yg z`e!u*@gLcDbL|GxQPHBYo0|6ByCEZ|Npa}52gfT)(F zU2ot~5%dl=1@2a_PLz)VJH%R#gkzt&>%$~+D*p7sW_v+bfyU|2e08k6Afv`zMCL4J zZZU|;t7kzzYB4Bax`TfP5EPJhwCS3!PJv#Xp8Kc9+KHc`eWD-*%oSYFw+cvNe-8aA zu*{c&KMSUCn^>i$*b9nbX5a@Mp1D^R8`WSg6>at_}K+ji!(4x$gL6ToIm0CaRZ- zD&66Tkd@()5P@Zm!=Rf3Ym%8+#0H{bMOuWkUj>HRMNxsF85?kxP*jhtN(6xgQI}p( zIW|hftLxK_0U#H&-6Jis;!}giUJqpI*M~5}cqH@@5wCu1#G5gKl_hY{AwIfjeF9F1 zt$igdEe@RY$`U}=tzRkvhn^~a6GmM%Q5RIP9ySqI&q|zdWnMNUUL67Hpt1}QLtW6K zF0?W~9AZ|W8q3Vr34G`6u5UaTf>7_y#MzdOF~PK~?cwREFID|)}p$(Sk5LlePX zkv2_KD2R%f4V-f!3sOMhnT4W~c_JzTCR<>*X}!9Xzj|T)-#_0?Mkk3IjBDm^kn}wH z`~Bg%9>_o8Hhy*5DY&D+1a|`T5;*_lv0LT{CKC)};{2<}A}o&cqN4jl+)fX1Cr;mW zQdDtiNGKoyBA-)xN|brHSv&rP#L6r(7nQbA0z-+!+7TJx-&)E>w{0T`gM2(o6p}u8 ztTazkCZv@vIMQIDPr|{D15Ay@aewA+)%ZlJx}^T~Ly^*Od~m6=^QSaR!-44;|9PG+R~tIjWLY>E9MiKCick|1)${HOLV#(X_Tgz+yZs zIE;kbF265dclO{HP{^1%FDOauZ(D~N=+hJAnYLJEElNAT>aQ=Nv)W<@Mhq_UEWto$ zNmYV&5uFR2J9zfsS^ue8By^wm{Z(+S3CsspZhTEU|2po&D##7Z*L>jX+C*2s;u8}& z=hHIZRGChk&It5A{Zq4|`Ql+Z1FC(>aqq^S%y(xTf=yI4=wgLId)@|y{9?}c7jYK- z`_|W;me(fj*I2nvEv8T_`P!7OM3Cpkn)E&%a*NP5Sak;D2-f~? zjDS?iYv$Jbn)7*yBUo#}o_KfhxxiIUGv1BrB{PSuQnG44UxA!2=bk_iv;+%n!XX+C zox`@%%f)gbhy3EJZJX*4IuwrRL3hZ@f^j}?mh`8{oT0Wmb?aMOSh9`Jlc4QvgVw=> z{i~v9J`vafh*Qa}2TpviHihyi=gS#N748x?ZHK7(u@_EfrfV{B)V8klb>xA{{d~0b zEuOIvl)mnS}E}XA;;tHU!6=J)q>V}IpID=1O5 zJ170ty#pLjEmVCc)Hdf;VyJ17+IHALtLFS*1WdOLy&cc@+&tcR&>>VA*da6JWKdeS zSq#N5^92}0U`aR+P?))ypkZ_F)LhK73J|ND!T`^LuR-5yzOb$ApVLVuZoz~>ar`sJ z9bOBK{aK95rKxUXZPG@nr%%6W3Rv~=r{0DMg)bZ>n@S9y7TdvQHyxD1`hIgM5h zy$Y3K=g#R*ca~efjDps*>}MW7{4ix|%Sg zU7NO+f0}dWVZ!{av?FKG*1*Mlj&SyW_+qL~wcWyk_NKpgdeeKTrQC$bAztvFU zoJpuzw)Jly)qCSrb^?bqD0R}bD3yD+dh%q5q| z-AGC<$(}UDU9y@l7-N;baiuGOh z?{nq^>seEor2G7|IYjn+B21ke(H;5ctn%m2K+e!Hj* zo`TNz=P1&M((6vV>mkXxt{x`d<|X&{pN&6lG}>OFSv$BjdTRhwoEw@GInw9j_HssO z>^p0F)>61#4*Rc_AF)c+>tTHDf#+rTo`L(!-?}n z{xo*v?`WQgGr<`I{MvtjQQj2CQEFi zqJ#`+Gz(^Zkh76|l|z_#tI2(FCy)?O?YH{>9P{XYrrD}RrWxq!v2#xQLwQvL2gJw4 zl`N-}xH#iAg@E4IPCtDAX+q~LBI;&>>A<|hyMHg~-@S~0$j9NjmMb^vdJ~wJvm!4+ z_W#+Bcs@}za;*!o5Rf%bC~YkD{RjSEuo@Ng@a3>2n&10vD`U(>^QH0%r37kBApqWK>~7T#{_89>(iumLRqYJP zE?I@?IMPS-SuF58R;(0WJ&`c*>Cf8`}_Cd)d^#$x&KEAU|(PXuJeHym-i zx)DZ@ZQJAMhH*NuoEfcNEFLr%9RC_72rMqfxG?LdaaN=`m#NpM{Jad#N0Tt@3JMDI z^PgR8yJf}X6*}Q5w!9`j(BYiQZ|e`rnkw8glhyX9jpGXZ7I~(B++nJBTA%eIW)s== z@dy4bySFxeJ=t&@svMO0Sp0JH@Q=)-M5SU(WPJ&hQL8TT@!CMql?Ce+UE#;3#zr=zMH>RV(~_%Ay;3B&wFotSmGpKx+nGn$ep zba8ee8C$pSI3hB5%Zdx>dcJ#ud+&3JSCL8i{b-%$k?c`HyFa?siDb=GG1T6?mrc@+ z+z8pkxSNKd;=&a5BguL1=?%FbCW zZcqjYEusXMajz3Js0Te|d)2N?>&Hy6`%=jBN-7`nH}N@I#p%JIIE-_=l{639Je<_^ zi7|=k?{Qm5p4-_rMjgId#`P5ZeOVJ8mKDV{c+m6)pXt2kgXgAq9bJPeoID}?X70$> zi_@P$mzZ7bU2#lH1;%1Y5-^+!hJY5)UpwNfAG;9Pr3JaPR%}G8^1p4FKZI2?C!nPWi z9uq7j6x7ZEsqO2e0X1f(Iy^QgWMwTivbn*8Gzqym(R)7V_ia8P35hH$ZNr zN7!`y6{BQJxCf~cM50QIpbnNbD`1KzwV0;|Pf^5vWXXLFyEt|fnwAg!rCAV?9dZSu zummjg+p|0M>_`e4$xXGb)0|T#*g)4llOG+<-#Q}*eEawN#%Q_vC-2CNhp|}CGsX{M z!lg`WloS$47W$Wvf^Tph&%$>e`2=U6!@kXos_21CCu1OxuX_?OnnZXDVSBcKT4Dx& zxx<*ZD?4+4$a}o+R)cn()3fBbkzV*)sPQ%EJc#g0F(4L;msaLeRQ332ZOo?VHW~RS9J4YWAKGn>Y}}2Hkjt*WJ}6hapYOb0WGb&V&i}7edSdDf&(V zisRHB@hi#{(_z}1z+ui>f^TVmT%@2quM@G;m_|Mt$x3careVQ~4H=W4nSVJprsw+n z@~9+!Of?o8tyjzN+Tra*OotufTcn#B58QEJQT5t`7-__H?NwvccG<^d;!0_1;$!~( zm$tU*w??(o6H=bAlo2qRJ<{dvdxWMpyd39_?^-D<&aasl_oOE93%hh7K&grWp51#{ zQSXsQ6Qw00;ja{xP z|A%hZ&AXXuHV%(Rb@7>ukkpL+y~RqkI~046mVy?1$Xq@Q9yhJ2_=U_KQnTBiF(&0O zFMFS7lntQKq;OQRWN+3HOLa_VmGqoQ$VysrdzPE(mQ^)d%0ay^JkY{PUJ^De0c$@h zF!Ssl<^kmV*Og%!e{>=+%KSluzi15@emB?c(6Be+lk64Pb7^sD1UMkw<^5vs57-Hi zzx>gw<$||AnRqAjNi0NMicvo(YknWz=huFuE;n^lOE}f^iGJ*b#6{Yip5;GJ^1!5q z3%R6qK>m9?7hrE(rJ8QLP~STVSe>BVQHHr!D*5-S)KfD^!OZA;299B#VVrY~a%^Kq zt|yGIcjSwSpkCuQt--197=h^-@i)>Fbe1|#Ji41aN1oe+=}%6;zCry1Q6#V_!blIY zd$UP_%+&fW2-HX7&qbBF@ZVx>7FH5=2-gsRm~=z?aMPOlXoM^@wi}-!)q^m79d1NG zfE4vKjJrR;w%T>TAI7t`i$qYaR8M=jqx{faIEO0X$-}_0?vtZ3RbGyl%(RX4wyQUO zZn@cFJ)SjjT3>g5U%ul3ax8keV|hoOPZD}h2F45vzX#8rzS{MY4umk_nP%(Ct zU4Z+R)i#$%hQ_(8L*7tj4AALdv69<4a4>i`A_e>u|p$*QuFMeSzs<~(|0aTTXioJf38@vxaUV`pZQ zckC*(SV`r&QV4|Xx)}C~2iPYUpPBw`^1MRqm4jFB0o(FCZAK{K)3;-*QIJ?m726Nz zcblsF4H}l9QZ>Oip$HZ`CRDl{!U!I7Q~K%d+l&jidmV}c1KdNhtS(DIp;jug%DwtO zqZqS`V)X{3k}29+%W$QdeJOi=X>A+nV1HwiK+3JdsV%y2P(5zGzcTk3VG$Ug>LRa1 z*YlLyaq7&g&wiV22sB?!GMh=n+o3M zB9Ej+004G}^e`QRM^_ojoV3&RlSHVBpxo~5e)Q;7*V#?>pDSBumy*GSIXXDJ{QE7X zcip0!=^OH3aTctw6lqfV?t;hpXHVpdIkkX`uM*m)ryFj>&p|^%oFC3DcREW`ZRcM6 zTyz(Fq-od$Bx3NpakSB24(_`zJ=j7qu^_vxF{ZRt92=@|7d2q1@i#QEs~_V=t%KG>=I{3c0h&G42WkoH!!d17}a z@QVnl)8V~X+&0*iVTcYaN63IVV1tP*KLz&A5vHRu7Y;HL`SvxJ~et$k4ED35(jhmdfMzso6{q!#h) zu`JE@Q}+J7@6^)p+{iIrR{Qe)mKC6o+_JG|X#vE9tE@B?IHsaq^))K*{+RjIF9fq$ z@52EdcyjC_K+Us<&%F`oXKVdqysy{dk&OrXr;z#A{svo=?Z>x2GVC5|X;~hB-J#I+ zxv{mLm`hJx5SDt`Y3a*#&_iw9Yd~ zSJV1mS5cc7Mzd<8?X{H=UC^#S9wY{QYg1B2P3WTtXG_UrI=V(hdeUvu61Md(**#@O=zC~x;wwXPq`-w=c9y3$Z z@f3A#TR5PUyE&6tVEhDGp&4D$%^#Zj_!Mx*JkpZ!K0uS4l=oo@j}OTmlYP-U$>tVa z2p3{*9{YE4cCbIC!d(sSpna#QzT0Ixcy(-g=@8jYLEZC_S@ykIRx_{~jf=;Jx89C` zc+$4@E9M%5n2gi*UiANWD3O<{G3*6^91AJ(T-bU~6llTXy241Al3u8LKP-k@=Z|icMZp(HX-5zZh1vz-Z*5^CC(iFDxv7{LC;IP*kfI zYln4oBKWDNqZK#C=Rowqyx)$LsEqh8yo;TBSX@g}WzwlhypQ6#V!6wG*%FH^;m9pbsa&01eFL#iYccoaw}mzq0X{t^r%$T2VVaQ<%^Y>0a@UgttGJEQUV3Zj9iP z8z~H%GF*SnDI-q*F7#fgD7-E70^`q>6$xBZ_cnxZ)mmIKcH9ez z)dLvkZLH9%d!J#HpFv`OMwttXuj+s0&M(pQ@lHxa(QxRxp&y%ZdMmeM9HS-q-&BWk zFW-W`VOw90U(BlaZ9lKyh2XE*7hV)Tg9YgdLp-_PY_Hv17%rH9!Z6a>~^Yy3&~pY{0|$r93Jq# zc}^no>|ZUhY5Zx;Yi!Kcg&3fwt?j+x`x$OM8K`TvV#Gee{iW(OIWutB;bt7}v-Fp} zf){v2wfEHDS;Xyqnb@ z2)jGa@bwQOiHpuZePP}xY`P#5SU6iIwh6nj`t30W-Yw z5sRvYGZI_2eNu8aL~f&9ey*Q2kV;KHE+yv{@xe^3&9NoWe`mWhz@$5ApeL8^@q>!W zzeeA@Lb$6kdYaX#2nSe{w!$VJOd<{9qj2&tH~Eo~MU?*vYx^N{R2`#p&#eCv*Nx1j z$bxLbI~-g>%r9c1U4?(Bi@WyqNBS2yh|pL`Wr*j)z=8>d&ahVrMk=kRa&AZAZo;mj z+Q=8=UI9Jh<4Kl!U&j}sa#y0b0OR?ZCl%)n;Xf*VDRv>oQZ@3tDH!!B?KT{wvCh@hM1udTu)>*OA3_U!x1mx%GE-<^HOkk^{dWTVh@%N~g}8 zl#{(K0t`9+Co}KzGKwA)DaATYw!A1-pnS26^QiLF(yOIN^oPBgJWWMzl5%vYg}HQZ zxe+S_gRtBv5@ZeyY1b1X$Sbc{H$ z$^7}dtKS7dCxHytok7_b`P?z$34%al&9#S@J>dr)yCv$Fbxw*`Lk8RW1M?~C?Yyk`)1S(NeD8(;R##kI1f^AO*^3#7A5>jq*LX^*B-1Wibm$7cdD(j1(l~> z9U@LfKr*x#En;WASk3o;ZrPlgVA-C{OM*>gY0a= ztfD(=1mT!7J-9fKS=2plOkuy%U_!KJXK{u2_xZ*7(@#yhxdu-6zN;KwI~1nBm@V^F z{KR6q?WSv}#GOawQ#sz-qw8fOP{?jrvFcXJBSmt%vM`-GTxrmD*WN-}Q6zy?!Z~?K znhu`Mmhd0aAYCG98$iS*$AQVEOTSOAJIt;<46kMJ*vh!h7kV1!7w;;9G86sZ!2F>F z0<^nGS?R}TS#l%u3rloBspg*%OM%J@hx=8*r2U# zN?IAe%L)RmOL`}Cw^4)b=kER*R40&4xi7{v@G5^)cdSX`9E@mL)LN@$Y^evFUY1tc{8n7qo1&rBF@&%Rz)`I;tuTmTGs z`m+cz?6|r?nekd=rP@PJQ7Z$O7l?P!HQaJGv0_IqepWQHc^IZoN=p`#n&gBe!IOl3 z+dhaW-f}iQ%*?Qk9&+EY{0WvDnSg5y+irHx2GrLu2Bjqo9AsZP$?M4LpWO~8$Hy(z zQL9**BGs6NnpZAbN+CemX_7Dj&TGlU{++n8B6g|Jv!BpiF!)orB$S$mx$P8dbRY!& zvIR6%@xNef;rp)?6!4Ko*eq)fS*u<{%^A`BSpq6z=$wm!8nd;$wah$V;! z_Y)3tCERzah1CFZBgxyoh>p_4BNh3jzlNa4CgIVQG)Ef^UN|>m&LJ`QqcC|iotkfJCZh%;`A8! z7T)z4@w9w7plGhVZ^a{6JAq@Ga6#eAVWk8|EAbIFA_e_lj%{}P;U9(96aUEEm(dx> zcqO*AxCM)=;l%dZQh4@nx@*lQwzH>$EJJ9cw0VVQW%^;diB3PR5WP~QkO_P6`$j*` zq?=%3@hC|F${W*)9SnyWgu4(6`x>B`bo$jqImc)C?eC4)%L++S9gF;0&T zh&Mz~`z(}N>yl<>tmXfZVSVKEGd-qzww|Ir%cgj-q2TZYxo>W8=E5Up(z*KMA~z5g z%wN*Mzx6|O8?YrU9rep^Qyq$@7pB))VRhT?b#3^ZSFqbWNY6wdF&e&d`ped1-$ z9B<2EsA zsam)TnKGSVa%5U1V`I0c4GwCs65Po+XWOBY9YlnO)(kf@$}nY@`B!gA<}f0XW59kK z%E%1p0EUn?J%m?CVab*Azv@H_HQrHH$RLqahrRLS;3FI6-DQ(i+hXziXQ({-OXnvS z953K6bcdg4(GZH+R4QYx&1TqhC8GslssO)SJ(OlxV$T0;SRhQ@<=4(~EW~F(6|+gr z0jC~@P{%Ra%)2;=RUV|P(eXyE&SnRZkl?KBf^gC0GG-xT!!x~c%}^DR?zVP*60M)8 zZDf)kw6A_}*5ocT_{brrQUt2C!C!Ft}&zv1~;uC(npb?`mVN7VbX$QP8YpA-%RGzIv?O@xdbrlG^O>f#)8@RgHdc*X8J!OVe!1sH{w9 zH6ep7^ZyMHV;PVu2#k?e2$>j8!;0)AQMagE#{Am%ME6{dvN%$^!8B`Dqt3Cwx!Q6U zGyJ4j_{{(-8_0{V6r+^}ctc`Dpq`5;Ux}Eb=0rIRUjbmxgC!_XRHngdrMWNi%@H+V zsglV2&Kv@0`JYN@%x^#=uCZ|<_u%;Nt{@xcHe&4N82Ca3sjcu0(U{`mTD-{s8& zRwi^BwMjU2eGaUS=4Adui)O$E{gH%HQZ-1*tiQ+d u8VlkH%J*}1Kb29X;$5HZ?2pQow<)(Xxg%RtSpRZ3W~67XTcPdx?Ee5_dh=8O literal 0 HcmV?d00001 diff --git a/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..4f45077 --- /dev/null +++ b/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,103 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "AppIcon.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-iPadPro@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "transparent.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/transparent.png b/Examples/Todos/Todos/Assets.xcassets/AppIcon.appiconset/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..bae1e0d7424038acc03d0981da831baf5752e49e GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7#M*hLwK5)9*|-x3GxeOU?`h>)&j_z=IP=X tQo;E4U?WJ$;RU~g) + } + + var body: some Reducer { + BindingReducer() + } +} + +struct TodoView: View { + @Bindable var store: StoreOf + + var body: some View { + HStack { + Button { + store.isComplete.toggle() + } label: { + Image(systemName: store.isComplete ? "checkmark.square" : "square") + } + .buttonStyle(.plain) + + TextField("Untitled Todo", text: $store.description) + } + .foregroundColor(store.isComplete ? .gray : nil) + } +} diff --git a/Examples/Todos/Todos/Todos.swift b/Examples/Todos/Todos/Todos.swift new file mode 100644 index 0000000..bfb26cf --- /dev/null +++ b/Examples/Todos/Todos/Todos.swift @@ -0,0 +1,169 @@ +import ComposableArchitecture +import SwiftUI + +enum Filter: LocalizedStringKey, CaseIterable, Hashable { + case all = "All" + case active = "Active" + case completed = "Completed" +} + +@Reducer +struct Todos { + @ObservableState + struct State: Equatable { + var editMode: EditMode = .inactive + var filter: Filter = .all + var todos: IdentifiedArrayOf = [] + + var filteredTodos: IdentifiedArrayOf { + switch filter { + case .active: return self.todos.filter { !$0.isComplete } + case .all: return self.todos + case .completed: return self.todos.filter(\.isComplete) + } + } + } + + enum Action: BindableAction, Sendable { + case addTodoButtonTapped + case binding(BindingAction) + case clearCompletedButtonTapped + case delete(IndexSet) + case move(IndexSet, Int) + case sortCompletedTodos + case todos(IdentifiedActionOf) + } + + @Dependency(\.continuousClock) var clock + @Dependency(\.uuid) var uuid + private enum CancelID { case todoCompletion } + + var body: some Reducer { + BindingReducer() + Reduce { state, action in + switch action { + case .addTodoButtonTapped: + state.todos.insert(Todo.State(id: self.uuid()), at: 0) + return .none + + case .binding: + return .none + + case .clearCompletedButtonTapped: + state.todos.removeAll(where: \.isComplete) + return .none + + case let .delete(indexSet): + let filteredTodos = state.filteredTodos + for index in indexSet { + state.todos.remove(id: filteredTodos[index].id) + } + return .none + + case var .move(source, destination): + if state.filter == .completed { + source = IndexSet( + source + .map { state.filteredTodos[$0] } + .compactMap { state.todos.index(id: $0.id) } + ) + destination = + (destination < state.filteredTodos.endIndex + ? state.todos.index(id: state.filteredTodos[destination].id) + : state.todos.endIndex) + ?? destination + } + + state.todos.move(fromOffsets: source, toOffset: destination) + + return .run { send in + try await self.clock.sleep(for: .milliseconds(100)) + await send(.sortCompletedTodos) + } + + case .sortCompletedTodos: + state.todos.sort { $1.isComplete && !$0.isComplete } + return .none + + case .todos(.element(id: _, action: .binding(\.isComplete))): + return .run { send in + try await self.clock.sleep(for: .seconds(1)) + await send(.sortCompletedTodos, animation: .default) + } + .cancellable(id: CancelID.todoCompletion, cancelInFlight: true) + + case .todos: + return .none + } + } + .forEach(\.todos, action: \.todos) { + Todo() + } + } +} + +struct AppView: View { + @Bindable var store: StoreOf + + var body: some View { + NavigationStack { + VStack(alignment: .leading) { + Picker("Filter", selection: $store.filter.animation()) { + ForEach(Filter.allCases, id: \.self) { filter in + Text(filter.rawValue).tag(filter) + } + } + .pickerStyle(.segmented) + .padding(.horizontal) + + List { + ForEach(store.scope(state: \.filteredTodos, action: \.todos)) { store in + TodoView(store: store) + } + .onDelete { store.send(.delete($0)) } + .onMove { store.send(.move($0, $1)) } + } + } + .navigationTitle("Todos") + .navigationBarItems( + trailing: HStack(spacing: 20) { + EditButton() + Button("Clear Completed") { + store.send(.clearCompletedButtonTapped, animation: .default) + } + .disabled(!store.todos.contains(where: \.isComplete)) + Button("Add Todo") { store.send(.addTodoButtonTapped, animation: .default) } + } + ) + .environment(\.editMode, $store.editMode) + } + } +} + +extension IdentifiedArray where ID == Todo.State.ID, Element == Todo.State { + static let mock: Self = [ + Todo.State( + description: "Check Mail", + id: UUID(), + isComplete: false + ), + Todo.State( + description: "Buy Milk", + id: UUID(), + isComplete: false + ), + Todo.State( + description: "Call Mom", + id: UUID(), + isComplete: true + ), + ] +} + +#Preview { + AppView( + store: Store(initialState: Todos.State(todos: .mock)) { + Todos() + } + ) +} diff --git a/Examples/Todos/Todos/TodosApp.swift b/Examples/Todos/Todos/TodosApp.swift new file mode 100644 index 0000000..f4c394a --- /dev/null +++ b/Examples/Todos/Todos/TodosApp.swift @@ -0,0 +1,15 @@ +import ComposableArchitecture +import SwiftUI + +@main +struct TodosApp: App { + var body: some Scene { + WindowGroup { + AppView( + store: Store(initialState: Todos.State()) { + Todos() + } + ) + } + } +} diff --git a/Examples/Todos/TodosTests/TodosTests.swift b/Examples/Todos/TodosTests/TodosTests.swift new file mode 100644 index 0000000..3265cc9 --- /dev/null +++ b/Examples/Todos/TodosTests/TodosTests.swift @@ -0,0 +1,353 @@ +import ComposableArchitecture +import XCTest + +@testable import Todos + +final class TodosTests: XCTestCase { + let clock = TestClock() + + @MainActor + func testAddTodo() async { + let store = TestStore(initialState: Todos.State()) { + Todos() + } withDependencies: { + $0.uuid = .incrementing + } + + await store.send(.addTodoButtonTapped) { + $0.todos.insert( + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + at: 0 + ) + } + + await store.send(.addTodoButtonTapped) { + $0.todos = [ + Todo.State( + description: "", + id: UUID(1), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + ] + } + } + + @MainActor + func testEditTodo() async { + let state = Todos.State( + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ) + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } + + await store.send(\.todos[id:UUID(0)].binding.description, "Learn Composable Architecture") { + $0.todos[id: UUID(0)]?.description = "Learn Composable Architecture" + } + } + + @MainActor + func testCompleteTodo() async { + let state = Todos.State( + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(1), + isComplete: false + ), + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } withDependencies: { + $0.continuousClock = self.clock + } + + await store.send(\.todos[id:UUID(0)].binding.isComplete, true) { + $0.todos[id: UUID(0)]?.isComplete = true + } + await self.clock.advance(by: .seconds(1)) + await store.receive(\.sortCompletedTodos) { + $0.todos = [ + $0.todos[1], + $0.todos[0], + ] + } + } + + @MainActor + func testCompleteTodoDebounces() async { + let state = Todos.State( + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(1), + isComplete: false + ), + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } withDependencies: { + $0.continuousClock = self.clock + } + + await store.send(\.todos[id:UUID(0)].binding.isComplete, true) { + $0.todos[id: UUID(0)]?.isComplete = true + } + await self.clock.advance(by: .milliseconds(500)) + await store.send(\.todos[id:UUID(0)].binding.isComplete, false) { + $0.todos[id: UUID(0)]?.isComplete = false + } + await self.clock.advance(by: .seconds(1)) + await store.receive(\.sortCompletedTodos) + } + + @MainActor + func testClearCompleted() async { + let state = Todos.State( + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(1), + isComplete: true + ), + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } + + await store.send(.clearCompletedButtonTapped) { + $0.todos = [ + $0.todos[0] + ] + } + } + + @MainActor + func testDelete() async { + let state = Todos.State( + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(1), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(2), + isComplete: false + ), + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } + + await store.send(.delete([1])) { + $0.todos = [ + $0.todos[0], + $0.todos[2], + ] + } + } + + @MainActor + func testDeleteWhileFiltered() async { + let state = Todos.State( + filter: .completed, + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(1), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(2), + isComplete: true + ), + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } + + await store.send(.delete([0])) { + $0.todos = [ + $0.todos[0], + $0.todos[1], + ] + } + } + + @MainActor + func testEditModeMoving() async { + let state = Todos.State( + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(1), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(2), + isComplete: false + ), + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } withDependencies: { + $0.continuousClock = self.clock + } + + await store.send(\.binding.editMode, .active) { + $0.editMode = .active + } + await store.send(.move([0], 2)) { + $0.todos = [ + $0.todos[1], + $0.todos[0], + $0.todos[2], + ] + } + await self.clock.advance(by: .milliseconds(100)) + await store.receive(\.sortCompletedTodos) + } + + @MainActor + func testEditModeMovingWithFilter() async { + let state = Todos.State( + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(1), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(2), + isComplete: true + ), + Todo.State( + description: "", + id: UUID(3), + isComplete: true + ), + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } withDependencies: { + $0.continuousClock = self.clock + $0.uuid = .incrementing + } + + await store.send(\.binding.editMode, .active) { + $0.editMode = .active + } + await store.send(\.binding.filter, .completed) { + $0.filter = .completed + } + await store.send(.move([0], 2)) { + $0.todos = [ + $0.todos[0], + $0.todos[1], + $0.todos[3], + $0.todos[2], + ] + } + await self.clock.advance(by: .milliseconds(100)) + await store.receive(\.sortCompletedTodos) + } + + @MainActor + func testFilteredEdit() async { + let state = Todos.State( + todos: [ + Todo.State( + description: "", + id: UUID(0), + isComplete: false + ), + Todo.State( + description: "", + id: UUID(1), + isComplete: true + ), + ] + ) + + let store = TestStore(initialState: state) { + Todos() + } + + await store.send(\.binding.filter, .completed) { + $0.filter = .completed + } + await store.send(\.todos[id:UUID(1)].binding.description, "Did this already") { + $0.todos[id: UUID(1)]?.description = "Did this already" + } + } +} diff --git a/Examples/VoiceMemos/README.md b/Examples/VoiceMemos/README.md new file mode 100644 index 0000000..2d90ff6 --- /dev/null +++ b/Examples/VoiceMemos/README.md @@ -0,0 +1,9 @@ +# Voice Memos + +This application demonstrates how to work with multiple dependencies and manage a complex state machine driven off of timers in the Composable Architecture. Some functionality includes: + +* Requesting the user’s permission to record audio. +* Prompting the user if insufficient permission is provided. +* Audio recording and playback. +* Handling errors that may occur during recording or playback. +* Stubbing dependencies to work with SwiftUI previews. diff --git a/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.pbxproj b/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b25cb54 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.pbxproj @@ -0,0 +1,543 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 53; + objects = { + +/* Begin PBXBuildFile section */ + CA93D05C249BF42500A6F65D /* VoiceMemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA93D05B249BF42500A6F65D /* VoiceMemo.swift */; }; + CA93D05E249BF46E00A6F65D /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA93D05D249BF46E00A6F65D /* Helpers.swift */; }; + CABAB49028A2B5F900122307 /* RecordingMemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABAB48F28A2B5F900122307 /* RecordingMemo.swift */; }; + DC1394342469E59600EE1157 /* ComposableArchitecture in Frameworks */ = {isa = PBXBuildFile; productRef = DC1394332469E59600EE1157 /* ComposableArchitecture */; }; + DC52A010288F01B30092F7DB /* Dependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC52A00F288F01B30092F7DB /* Dependencies.swift */; }; + DC5BDCB024589177009C65A3 /* VoiceMemosApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5BDCAF24589177009C65A3 /* VoiceMemosApp.swift */; }; + DC5BDCB224589177009C65A3 /* VoiceMemos.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5BDCB124589177009C65A3 /* VoiceMemos.swift */; }; + DC5BDCB424589178009C65A3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DC5BDCB324589178009C65A3 /* Assets.xcassets */; }; + DC5BDCC524589179009C65A3 /* VoiceMemosTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5BDCC424589179009C65A3 /* VoiceMemosTests.swift */; }; + DC5BDF362458939C009C65A3 /* AudioRecorderClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5BDF352458939C009C65A3 /* AudioRecorderClient.swift */; }; + DC5BDF3A245893C1009C65A3 /* LiveAudioRecorderClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5BDF39245893C1009C65A3 /* LiveAudioRecorderClient.swift */; }; + DC5BDF3D245893E6009C65A3 /* AudioPlayerClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5BDF3C245893E6009C65A3 /* AudioPlayerClient.swift */; }; + DC5BDF3F24589406009C65A3 /* LiveAudioPlayerClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5BDF3E24589406009C65A3 /* LiveAudioPlayerClient.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + DC5BDCC124589179009C65A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DC5BDCA224589177009C65A3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DC5BDCA924589177009C65A3; + remoteInfo = VoiceMemos; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + DC5BDF2E24589263009C65A3 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + DC5BDF3224589267009C65A3 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 23EDBE6B271CD8DD004F7430 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + CA93D05B249BF42500A6F65D /* VoiceMemo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMemo.swift; sourceTree = ""; }; + CA93D05D249BF46E00A6F65D /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; + CABAB48F28A2B5F900122307 /* RecordingMemo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingMemo.swift; sourceTree = ""; }; + DC52A00F288F01B30092F7DB /* Dependencies.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dependencies.swift; sourceTree = ""; }; + DC5BDCAA24589177009C65A3 /* VoiceMemos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VoiceMemos.app; sourceTree = BUILT_PRODUCTS_DIR; }; + DC5BDCAF24589177009C65A3 /* VoiceMemosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMemosApp.swift; sourceTree = ""; }; + DC5BDCB124589177009C65A3 /* VoiceMemos.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMemos.swift; sourceTree = ""; }; + DC5BDCB324589178009C65A3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + DC5BDCBB24589178009C65A3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DC5BDCC024589179009C65A3 /* VoiceMemosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VoiceMemosTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + DC5BDCC424589179009C65A3 /* VoiceMemosTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMemosTests.swift; sourceTree = ""; }; + DC5BDF2A245891B7009C65A3 /* swift-composable-architecture */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "swift-composable-architecture"; path = ../..; sourceTree = ""; }; + DC5BDF352458939C009C65A3 /* AudioRecorderClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecorderClient.swift; sourceTree = ""; }; + DC5BDF39245893C1009C65A3 /* LiveAudioRecorderClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveAudioRecorderClient.swift; sourceTree = ""; }; + DC5BDF3C245893E6009C65A3 /* AudioPlayerClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlayerClient.swift; sourceTree = ""; }; + DC5BDF3E24589406009C65A3 /* LiveAudioPlayerClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveAudioPlayerClient.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + DC5BDCA724589177009C65A3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DC1394342469E59600EE1157 /* ComposableArchitecture in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC5BDCBD24589179009C65A3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + CA71F02129A6A32F007AE0DD /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + DC5BDCA124589177009C65A3 = { + isa = PBXGroup; + children = ( + DC5BDF2A245891B7009C65A3 /* swift-composable-architecture */, + 23EDBE6B271CD8DD004F7430 /* README.md */, + DC5BDCAB24589177009C65A3 /* Products */, + DC5BDCAC24589177009C65A3 /* VoiceMemos */, + DC5BDCC324589179009C65A3 /* VoiceMemosTests */, + CA71F02129A6A32F007AE0DD /* Frameworks */, + ); + sourceTree = ""; + }; + DC5BDCAB24589177009C65A3 /* Products */ = { + isa = PBXGroup; + children = ( + DC5BDCAA24589177009C65A3 /* VoiceMemos.app */, + DC5BDCC024589179009C65A3 /* VoiceMemosTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + DC5BDCAC24589177009C65A3 /* VoiceMemos */ = { + isa = PBXGroup; + children = ( + DC5BDCBB24589178009C65A3 /* Info.plist */, + DC52A00F288F01B30092F7DB /* Dependencies.swift */, + CA93D05D249BF46E00A6F65D /* Helpers.swift */, + CABAB48F28A2B5F900122307 /* RecordingMemo.swift */, + CA93D05B249BF42500A6F65D /* VoiceMemo.swift */, + DC5BDCB124589177009C65A3 /* VoiceMemos.swift */, + DC5BDCAF24589177009C65A3 /* VoiceMemosApp.swift */, + DC5BDCB324589178009C65A3 /* Assets.xcassets */, + DC5BDF3B245893DB009C65A3 /* AudioPlayerClient */, + DC5BDF3424589389009C65A3 /* AudioRecorderClient */, + ); + path = VoiceMemos; + sourceTree = ""; + }; + DC5BDCC324589179009C65A3 /* VoiceMemosTests */ = { + isa = PBXGroup; + children = ( + DC5BDCC424589179009C65A3 /* VoiceMemosTests.swift */, + ); + path = VoiceMemosTests; + sourceTree = ""; + }; + DC5BDF3424589389009C65A3 /* AudioRecorderClient */ = { + isa = PBXGroup; + children = ( + DC5BDF352458939C009C65A3 /* AudioRecorderClient.swift */, + DC5BDF39245893C1009C65A3 /* LiveAudioRecorderClient.swift */, + ); + path = AudioRecorderClient; + sourceTree = ""; + }; + DC5BDF3B245893DB009C65A3 /* AudioPlayerClient */ = { + isa = PBXGroup; + children = ( + DC5BDF3C245893E6009C65A3 /* AudioPlayerClient.swift */, + DC5BDF3E24589406009C65A3 /* LiveAudioPlayerClient.swift */, + ); + path = AudioPlayerClient; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + DC5BDCA924589177009C65A3 /* VoiceMemos */ = { + isa = PBXNativeTarget; + buildConfigurationList = DC5BDCC924589179009C65A3 /* Build configuration list for PBXNativeTarget "VoiceMemos" */; + buildPhases = ( + DC5BDCA624589177009C65A3 /* Sources */, + DC5BDCA724589177009C65A3 /* Frameworks */, + DC5BDCA824589177009C65A3 /* Resources */, + DC5BDF2E24589263009C65A3 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + DCFC51462466F42900A0B8CF /* PBXTargetDependency */, + ); + name = VoiceMemos; + packageProductDependencies = ( + DC1394332469E59600EE1157 /* ComposableArchitecture */, + ); + productName = VoiceMemos; + productReference = DC5BDCAA24589177009C65A3 /* VoiceMemos.app */; + productType = "com.apple.product-type.application"; + }; + DC5BDCBF24589179009C65A3 /* VoiceMemosTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DC5BDCCC24589179009C65A3 /* Build configuration list for PBXNativeTarget "VoiceMemosTests" */; + buildPhases = ( + DC5BDCBC24589179009C65A3 /* Sources */, + DC5BDCBD24589179009C65A3 /* Frameworks */, + DC5BDCBE24589179009C65A3 /* Resources */, + DC5BDF3224589267009C65A3 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + DC5BDCC224589179009C65A3 /* PBXTargetDependency */, + ); + name = VoiceMemosTests; + packageProductDependencies = ( + ); + productName = VoiceMemosTests; + productReference = DC5BDCC024589179009C65A3 /* VoiceMemosTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + DC5BDCA224589177009C65A3 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 1140; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = "Point-Free"; + TargetAttributes = { + DC5BDCA924589177009C65A3 = { + CreatedOnToolsVersion = 11.4.1; + }; + DC5BDCBF24589179009C65A3 = { + CreatedOnToolsVersion = 11.4.1; + TestTargetID = DC5BDCA924589177009C65A3; + }; + }; + }; + buildConfigurationList = DC5BDCA524589177009C65A3 /* Build configuration list for PBXProject "VoiceMemos" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = DC5BDCA124589177009C65A3; + productRefGroup = DC5BDCAB24589177009C65A3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + DC5BDCA924589177009C65A3 /* VoiceMemos */, + DC5BDCBF24589179009C65A3 /* VoiceMemosTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + DC5BDCA824589177009C65A3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DC5BDCB424589178009C65A3 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC5BDCBE24589179009C65A3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + DC5BDCA624589177009C65A3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DC5BDF362458939C009C65A3 /* AudioRecorderClient.swift in Sources */, + DC5BDF3D245893E6009C65A3 /* AudioPlayerClient.swift in Sources */, + CA93D05E249BF46E00A6F65D /* Helpers.swift in Sources */, + DC5BDF3A245893C1009C65A3 /* LiveAudioRecorderClient.swift in Sources */, + DC5BDF3F24589406009C65A3 /* LiveAudioPlayerClient.swift in Sources */, + DC52A010288F01B30092F7DB /* Dependencies.swift in Sources */, + CA93D05C249BF42500A6F65D /* VoiceMemo.swift in Sources */, + DC5BDCB024589177009C65A3 /* VoiceMemosApp.swift in Sources */, + CABAB49028A2B5F900122307 /* RecordingMemo.swift in Sources */, + DC5BDCB224589177009C65A3 /* VoiceMemos.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DC5BDCBC24589179009C65A3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DC5BDCC524589179009C65A3 /* VoiceMemosTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + DC5BDCC224589179009C65A3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DC5BDCA924589177009C65A3 /* VoiceMemos */; + targetProxy = DC5BDCC124589179009C65A3 /* PBXContainerItemProxy */; + }; + DCFC51462466F42900A0B8CF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + DC5BDCC724589179009C65A3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_STRICT_CONCURRENCY = complete; + }; + name = Debug; + }; + DC5BDCC824589179009C65A3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_STRICT_CONCURRENCY = complete; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + DC5BDCCA24589179009C65A3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = VoiceMemos/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.VoiceMemos; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + DC5BDCCB24589179009C65A3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = VoiceMemos/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.VoiceMemos; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + DC5BDCCD24589179009C65A3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = VoiceMemos/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.VoiceMemosTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/VoiceMemos.app/VoiceMemos"; + }; + name = Debug; + }; + DC5BDCCE24589179009C65A3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = VoiceMemos/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.VoiceMemosTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/VoiceMemos.app/VoiceMemos"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + DC5BDCA524589177009C65A3 /* Build configuration list for PBXProject "VoiceMemos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DC5BDCC724589179009C65A3 /* Debug */, + DC5BDCC824589179009C65A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DC5BDCC924589179009C65A3 /* Build configuration list for PBXNativeTarget "VoiceMemos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DC5BDCCA24589179009C65A3 /* Debug */, + DC5BDCCB24589179009C65A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DC5BDCCC24589179009C65A3 /* Build configuration list for PBXNativeTarget "VoiceMemosTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DC5BDCCD24589179009C65A3 /* Debug */, + DC5BDCCE24589179009C65A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + DC1394332469E59600EE1157 /* ComposableArchitecture */ = { + isa = XCSwiftPackageProductDependency; + productName = ComposableArchitecture; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = DC5BDCA224589177009C65A3 /* Project object */; +} diff --git a/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/VoiceMemos/VoiceMemos.xcodeproj/xcshareddata/xcschemes/VoiceMemos.xcscheme b/Examples/VoiceMemos/VoiceMemos.xcodeproj/xcshareddata/xcschemes/VoiceMemos.xcscheme new file mode 100644 index 0000000..ad4176d --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos.xcodeproj/xcshareddata/xcschemes/VoiceMemos.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png b/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b1516e5a122b534ae5a9d14706d6248718aeb03a GIT binary patch literal 7569 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 literal 0 HcmV?d00001 diff --git a/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png b/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..869cd81f3aee14834f60b9fb9bb87b3ec53a2840 GIT binary patch literal 9893 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 XN$)>5c`(j700000NkvXXu0mjfLN#h7 literal 0 HcmV?d00001 diff --git a/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png b/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/AppIcon-iPadPro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..94a32fd65c0f0b6cd8af035b2d10286b49c8732b GIT binary patch literal 15226 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 literal 0 HcmV?d00001 diff --git a/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..4f45077 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,103 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "AppIcon.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-iPadPro@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "transparent.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/transparent.png b/Examples/VoiceMemos/VoiceMemos/Assets.xcassets/AppIcon.appiconset/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..bae1e0d7424038acc03d0981da831baf5752e49e GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7#M*hLwK5)9*|-x3GxeOU?`h>)&j_z=IP=X tQo;E4U?WJ$;RU~g Bool +} + +extension AudioPlayerClient: TestDependencyKey { + static let previewValue = Self( + play: { _ in + try await Task.sleep(for: .seconds(5)) + return true + } + ) + + static let testValue = Self() +} + +extension DependencyValues { + var audioPlayer: AudioPlayerClient { + get { self[AudioPlayerClient.self] } + set { self[AudioPlayerClient.self] = newValue } + } +} diff --git a/Examples/VoiceMemos/VoiceMemos/AudioPlayerClient/LiveAudioPlayerClient.swift b/Examples/VoiceMemos/VoiceMemos/AudioPlayerClient/LiveAudioPlayerClient.swift new file mode 100644 index 0000000..ece4954 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/AudioPlayerClient/LiveAudioPlayerClient.swift @@ -0,0 +1,54 @@ +@preconcurrency import AVFoundation +import Dependencies + +extension AudioPlayerClient: DependencyKey { + static let liveValue = Self { url in + let stream = AsyncThrowingStream { continuation in + do { + let delegate = try Delegate( + url: url, + didFinishPlaying: { successful in + continuation.yield(successful) + continuation.finish() + }, + decodeErrorDidOccur: { error in + continuation.finish(throwing: error) + } + ) + delegate.player.play() + continuation.onTermination = { _ in + delegate.player.stop() + } + } catch { + continuation.finish(throwing: error) + } + } + return try await stream.first(where: { _ in true }) ?? false + } +} + +private final class Delegate: NSObject, AVAudioPlayerDelegate, Sendable { + let didFinishPlaying: @Sendable (Bool) -> Void + let decodeErrorDidOccur: @Sendable (Error?) -> Void + let player: AVAudioPlayer + + init( + url: URL, + didFinishPlaying: @escaping @Sendable (Bool) -> Void, + decodeErrorDidOccur: @escaping @Sendable (Error?) -> Void + ) throws { + self.didFinishPlaying = didFinishPlaying + self.decodeErrorDidOccur = decodeErrorDidOccur + self.player = try AVAudioPlayer(contentsOf: url) + super.init() + self.player.delegate = self + } + + func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { + self.didFinishPlaying(flag) + } + + func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) { + self.decodeErrorDidOccur(error) + } +} diff --git a/Examples/VoiceMemos/VoiceMemos/AudioRecorderClient/AudioRecorderClient.swift b/Examples/VoiceMemos/VoiceMemos/AudioRecorderClient/AudioRecorderClient.swift new file mode 100644 index 0000000..a4cc63a --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/AudioRecorderClient/AudioRecorderClient.swift @@ -0,0 +1,43 @@ +import ComposableArchitecture +import Foundation + +@DependencyClient +struct AudioRecorderClient { + var currentTime: @Sendable () async -> TimeInterval? + var requestRecordPermission: @Sendable () async -> Bool = { false } + var startRecording: @Sendable (_ url: URL) async throws -> Bool + var stopRecording: @Sendable () async -> Void +} + +extension AudioRecorderClient: TestDependencyKey { + static var previewValue: Self { + let isRecording = ActorIsolated(false) + let currentTime = ActorIsolated(0.0) + + return Self( + currentTime: { await currentTime.value }, + requestRecordPermission: { true }, + startRecording: { _ in + await isRecording.setValue(true) + while await isRecording.value { + try await Task.sleep(for: .seconds(1)) + await currentTime.withValue { $0 += 1 } + } + return true + }, + stopRecording: { + await isRecording.setValue(false) + await currentTime.setValue(0) + } + ) + } + + static let testValue = Self() +} + +extension DependencyValues { + var audioRecorder: AudioRecorderClient { + get { self[AudioRecorderClient.self] } + set { self[AudioRecorderClient.self] = newValue } + } +} diff --git a/Examples/VoiceMemos/VoiceMemos/AudioRecorderClient/LiveAudioRecorderClient.swift b/Examples/VoiceMemos/VoiceMemos/AudioRecorderClient/LiveAudioRecorderClient.swift new file mode 100644 index 0000000..5aedb6b --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/AudioRecorderClient/LiveAudioRecorderClient.swift @@ -0,0 +1,103 @@ +import AVFoundation +import Dependencies + +extension AudioRecorderClient: DependencyKey { + static var liveValue: Self { + let audioRecorder = AudioRecorder() + return Self( + currentTime: { await audioRecorder.currentTime }, + requestRecordPermission: { await AudioRecorder.requestPermission() }, + startRecording: { url in try await audioRecorder.start(url: url) }, + stopRecording: { await audioRecorder.stop() } + ) + } +} + +private actor AudioRecorder { + var delegate: Delegate? + var recorder: AVAudioRecorder? + + var currentTime: TimeInterval? { + guard + let recorder = self.recorder, + recorder.isRecording + else { return nil } + return recorder.currentTime + } + + static func requestPermission() async -> Bool { + await AVAudioApplication.requestRecordPermission() + } + + func stop() { + self.recorder?.stop() + try? AVAudioSession.sharedInstance().setActive(false) + } + + func start(url: URL) async throws -> Bool { + self.stop() + + let stream = AsyncThrowingStream { continuation in + do { + self.delegate = Delegate( + didFinishRecording: { flag in + continuation.yield(flag) + continuation.finish() + try? AVAudioSession.sharedInstance().setActive(false) + }, + encodeErrorDidOccur: { error in + continuation.finish(throwing: error) + try? AVAudioSession.sharedInstance().setActive(false) + } + ) + let recorder = try AVAudioRecorder( + url: url, + settings: [ + AVFormatIDKey: Int(kAudioFormatMPEG4AAC), + AVSampleRateKey: 44100, + AVNumberOfChannelsKey: 1, + AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue, + ]) + self.recorder = recorder + recorder.delegate = self.delegate + + continuation.onTermination = { [recorder = UncheckedSendable(recorder)] _ in + recorder.wrappedValue.stop() + } + + try AVAudioSession.sharedInstance().setCategory( + .playAndRecord, mode: .default, options: .defaultToSpeaker) + try AVAudioSession.sharedInstance().setActive(true) + self.recorder?.record() + } catch { + continuation.finish(throwing: error) + } + } + + for try await didFinish in stream { + return didFinish + } + throw CancellationError() + } +} + +private final class Delegate: NSObject, AVAudioRecorderDelegate, Sendable { + let didFinishRecording: @Sendable (Bool) -> Void + let encodeErrorDidOccur: @Sendable (Error?) -> Void + + init( + didFinishRecording: @escaping @Sendable (Bool) -> Void, + encodeErrorDidOccur: @escaping @Sendable (Error?) -> Void + ) { + self.didFinishRecording = didFinishRecording + self.encodeErrorDidOccur = encodeErrorDidOccur + } + + func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) { + self.didFinishRecording(flag) + } + + func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) { + self.encodeErrorDidOccur(error) + } +} diff --git a/Examples/VoiceMemos/VoiceMemos/Dependencies.swift b/Examples/VoiceMemos/VoiceMemos/Dependencies.swift new file mode 100644 index 0000000..18225f5 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/Dependencies.swift @@ -0,0 +1,28 @@ +import Dependencies +import SwiftUI + +extension DependencyValues { + var openSettings: @Sendable () async -> Void { + get { self[OpenSettingsKey.self] } + set { self[OpenSettingsKey.self] = newValue } + } + + private enum OpenSettingsKey: DependencyKey { + typealias Value = @Sendable () async -> Void + + static let liveValue: @Sendable () async -> Void = { + await MainActor.run { + UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!) + } + } + } + + var temporaryDirectory: @Sendable () -> URL { + get { self[TemporaryDirectoryKey.self] } + set { self[TemporaryDirectoryKey.self] = newValue } + } + + private enum TemporaryDirectoryKey: DependencyKey { + static let liveValue: @Sendable () -> URL = { URL(fileURLWithPath: NSTemporaryDirectory()) } + } +} diff --git a/Examples/VoiceMemos/VoiceMemos/Helpers.swift b/Examples/VoiceMemos/VoiceMemos/Helpers.swift new file mode 100644 index 0000000..c100e12 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/Helpers.swift @@ -0,0 +1,8 @@ +import Foundation + +let dateComponentsFormatter: DateComponentsFormatter = { + let formatter = DateComponentsFormatter() + formatter.allowedUnits = [.minute, .second] + formatter.zeroFormattingBehavior = .pad + return formatter +}() diff --git a/Examples/VoiceMemos/VoiceMemos/Info.plist b/Examples/VoiceMemos/VoiceMemos/Info.plist new file mode 100644 index 0000000..23a53a8 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/Info.plist @@ -0,0 +1,62 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + NSMicrophoneUsageDescription + Your microphone will be used to record your speech when you press the "Start Recording" button. + + diff --git a/Examples/VoiceMemos/VoiceMemos/RecordingMemo.swift b/Examples/VoiceMemos/VoiceMemos/RecordingMemo.swift new file mode 100644 index 0000000..5de28b8 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/RecordingMemo.swift @@ -0,0 +1,122 @@ +import ComposableArchitecture +import SwiftUI + +@Reducer +struct RecordingMemo { + @ObservableState + struct State: Equatable, Sendable { + var date: Date + var duration: TimeInterval = 0 + var mode: Mode = .recording + var url: URL + + enum Mode { + case recording + case encoding + } + } + + enum Action: Sendable { + case audioRecorderDidFinish(Result) + case delegate(Delegate) + case finalRecordingTime(TimeInterval) + case onTask + case timerUpdated + case stopButtonTapped + + @CasePathable + enum Delegate: Sendable { + case didFinish(Result) + } + } + + struct Failed: Equatable, Error {} + + @Dependency(\.audioRecorder) var audioRecorder + @Dependency(\.continuousClock) var clock + + var body: some Reducer { + Reduce { state, action in + switch action { + case .audioRecorderDidFinish(.success(true)): + return .send(.delegate(.didFinish(.success(state)))) + + case .audioRecorderDidFinish(.success(false)): + return .send(.delegate(.didFinish(.failure(Failed())))) + + case let .audioRecorderDidFinish(.failure(error)): + return .send(.delegate(.didFinish(.failure(error)))) + + case .delegate: + return .none + + case let .finalRecordingTime(duration): + state.duration = duration + return .none + + case .stopButtonTapped: + state.mode = .encoding + return .run { send in + if let currentTime = await self.audioRecorder.currentTime() { + await send(.finalRecordingTime(currentTime)) + } + await self.audioRecorder.stopRecording() + } + + case .onTask: + return .run { [url = state.url] send in + async let startRecording: Void = send( + .audioRecorderDidFinish( + Result { try await self.audioRecorder.startRecording(url: url) } + ) + ) + for await _ in self.clock.timer(interval: .seconds(1)) { + await send(.timerUpdated) + } + await startRecording + } + + case .timerUpdated: + state.duration += 1 + return .none + } + } + } +} + +struct RecordingMemoView: View { + let store: StoreOf + + var body: some View { + VStack(spacing: 12) { + Text("Recording") + .font(.title) + .colorMultiply(Color(Int(store.duration).isMultiple(of: 2) ? .systemRed : .label)) + .animation(.easeInOut(duration: 0.5), value: store.duration) + + if let formattedDuration = dateComponentsFormatter.string(from: store.duration) { + Text(formattedDuration) + .font(.body.monospacedDigit().bold()) + .foregroundColor(.black) + } + + ZStack { + Circle() + .foregroundColor(Color(.label)) + .frame(width: 74, height: 74) + + Button { + store.send(.stopButtonTapped, animation: .default) + } label: { + RoundedRectangle(cornerRadius: 4) + .foregroundColor(Color(.systemRed)) + .padding(17) + } + .frame(width: 70, height: 70) + } + } + .task { + await store.send(.onTask).finish() + } + } +} diff --git a/Examples/VoiceMemos/VoiceMemos/VoiceMemo.swift b/Examples/VoiceMemos/VoiceMemos/VoiceMemo.swift new file mode 100644 index 0000000..b5c07d6 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/VoiceMemo.swift @@ -0,0 +1,145 @@ +import ComposableArchitecture +import SwiftUI + +@Reducer +struct VoiceMemo { + @ObservableState + struct State: Equatable, Identifiable { + var date: Date + var duration: TimeInterval + var mode = Mode.notPlaying + var title = "" + var url: URL + + var id: URL { self.url } + + @CasePathable + @dynamicMemberLookup + enum Mode: Equatable { + case notPlaying + case playing(progress: Double) + } + } + + enum Action { + case audioPlayerClient(Result) + case delegate(Delegate) + case playButtonTapped + case timerUpdated(TimeInterval) + case titleTextFieldChanged(String) + + @CasePathable + enum Delegate { + case playbackStarted + case playbackFailed + } + } + + @Dependency(\.audioPlayer) var audioPlayer + @Dependency(\.continuousClock) var clock + private enum CancelID { case play } + + var body: some Reducer { + Reduce { state, action in + switch action { + case .audioPlayerClient(.failure): + state.mode = .notPlaying + return .merge( + .cancel(id: CancelID.play), + .send(.delegate(.playbackFailed)) + ) + + case .audioPlayerClient: + state.mode = .notPlaying + return .cancel(id: CancelID.play) + + case .delegate: + return .none + + case .playButtonTapped: + switch state.mode { + case .notPlaying: + state.mode = .playing(progress: 0) + + return .run { [url = state.url] send in + await send(.delegate(.playbackStarted)) + + async let playAudio: Void = send( + .audioPlayerClient(Result { try await self.audioPlayer.play(url: url) }) + ) + + var start: TimeInterval = 0 + for await _ in self.clock.timer(interval: .milliseconds(500)) { + start += 0.5 + await send(.timerUpdated(start)) + } + + await playAudio + } + .cancellable(id: CancelID.play, cancelInFlight: true) + + case .playing: + state.mode = .notPlaying + return .cancel(id: CancelID.play) + } + + case let .timerUpdated(time): + switch state.mode { + case .notPlaying: + break + case .playing: + state.mode = .playing(progress: time / state.duration) + } + return .none + + case let .titleTextFieldChanged(text): + state.title = text + return .none + } + } + } +} + +struct VoiceMemoView: View { + @Bindable var store: StoreOf + + var body: some View { + let currentTime = + store.mode.playing.map { $0 * store.duration } ?? store.duration + HStack { + TextField( + "Untitled, \(store.date.formatted(date: .numeric, time: .shortened))", + text: $store.title.sending(\.titleTextFieldChanged) + ) + + Spacer() + + dateComponentsFormatter.string(from: currentTime).map { + Text($0) + .font(.footnote.monospacedDigit()) + .foregroundColor(Color(.systemGray)) + } + + Button { + store.send(.playButtonTapped) + } label: { + Image(systemName: store.mode.is(\.playing) ? "stop.circle" : "play.circle") + .font(.system(size: 22)) + } + } + .buttonStyle(.borderless) + .frame(maxHeight: .infinity, alignment: .center) + .padding(.horizontal) + .listRowBackground(store.mode.is(\.playing) ? Color(.systemGray6) : .clear) + .listRowInsets(EdgeInsets()) + .background( + Color(.systemGray5) + .frame(maxWidth: store.mode.is(\.playing) ? .infinity : 0) + .animation( + store.mode.is(\.playing) ? .linear(duration: store.duration) : nil, + value: store.mode.is(\.playing) + ), + alignment: .leading + ) + } +} diff --git a/Examples/VoiceMemos/VoiceMemos/VoiceMemos.swift b/Examples/VoiceMemos/VoiceMemos/VoiceMemos.swift new file mode 100644 index 0000000..2cb1ffc --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/VoiceMemos.swift @@ -0,0 +1,229 @@ +import AVFoundation +import ComposableArchitecture +import SwiftUI + +@Reducer +struct VoiceMemos { + @ObservableState + struct State: Equatable { + @Presents var alert: AlertState? + var audioRecorderPermission = RecorderPermission.undetermined + @Presents var recordingMemo: RecordingMemo.State? + var voiceMemos: IdentifiedArrayOf = [] + + enum RecorderPermission { + case allowed + case denied + case undetermined + } + } + + enum Action: Sendable { + case alert(PresentationAction) + case onDelete(IndexSet) + case openSettingsButtonTapped + case recordButtonTapped + case recordPermissionResponse(Bool) + case recordingMemo(PresentationAction) + case voiceMemos(IdentifiedActionOf) + + enum Alert: Equatable {} + } + + @Dependency(\.audioRecorder.requestRecordPermission) var requestRecordPermission + @Dependency(\.date) var date + @Dependency(\.openSettings) var openSettings + @Dependency(\.temporaryDirectory) var temporaryDirectory + @Dependency(\.uuid) var uuid + + var body: some Reducer { + Reduce { state, action in + switch action { + case .alert: + return .none + + case let .onDelete(indexSet): + state.voiceMemos.remove(atOffsets: indexSet) + return .none + + case .openSettingsButtonTapped: + return .run { _ in + await self.openSettings() + } + + case .recordButtonTapped: + switch state.audioRecorderPermission { + case .undetermined: + return .run { send in + await send(.recordPermissionResponse(self.requestRecordPermission())) + } + + case .denied: + state.alert = AlertState { TextState("Permission is required to record voice memos.") } + return .none + + case .allowed: + state.recordingMemo = newRecordingMemo + return .none + } + + case let .recordingMemo(.presented(.delegate(.didFinish(.success(recordingMemo))))): + state.recordingMemo = nil + state.voiceMemos.insert( + VoiceMemo.State( + date: recordingMemo.date, + duration: recordingMemo.duration, + url: recordingMemo.url + ), + at: 0 + ) + return .none + + case .recordingMemo(.presented(.delegate(.didFinish(.failure)))): + state.alert = AlertState { TextState("Voice memo recording failed.") } + state.recordingMemo = nil + return .none + + case .recordingMemo: + return .none + + case let .recordPermissionResponse(permission): + state.audioRecorderPermission = permission ? .allowed : .denied + if permission { + state.recordingMemo = newRecordingMemo + return .none + } else { + state.alert = AlertState { TextState("Permission is required to record voice memos.") } + return .none + } + + case let .voiceMemos(.element(id: id, action: .delegate(delegateAction))): + switch delegateAction { + case .playbackFailed: + state.alert = AlertState { TextState("Voice memo playback failed.") } + return .none + case .playbackStarted: + for memoID in state.voiceMemos.ids where memoID != id { + state.voiceMemos[id: memoID]?.mode = .notPlaying + } + return .none + } + + case .voiceMemos: + return .none + } + } + .ifLet(\.$alert, action: \.alert) + .ifLet(\.$recordingMemo, action: \.recordingMemo) { + RecordingMemo() + } + .forEach(\.voiceMemos, action: \.voiceMemos) { + VoiceMemo() + } + } + + private var newRecordingMemo: RecordingMemo.State { + RecordingMemo.State( + date: self.date.now, + url: self.temporaryDirectory() + .appendingPathComponent(self.uuid().uuidString) + .appendingPathExtension("m4a") + ) + } +} + +struct VoiceMemosView: View { + @Bindable var store: StoreOf + + var body: some View { + NavigationStack { + VStack { + List { + ForEach(store.scope(state: \.voiceMemos, action: \.voiceMemos)) { store in + VoiceMemoView(store: store) + } + .onDelete { store.send(.onDelete($0)) } + } + + Group { + if let store = store.scope( + state: \.recordingMemo, action: \.recordingMemo.presented + ) { + RecordingMemoView(store: store) + } else { + RecordButton(permission: store.audioRecorderPermission) { + store.send(.recordButtonTapped, animation: .spring()) + } settingsAction: { + store.send(.openSettingsButtonTapped) + } + } + } + .padding() + .frame(maxWidth: .infinity) + .background(Color.init(white: 0.95)) + } + .alert($store.scope(state: \.alert, action: \.alert)) + .navigationTitle("Voice memos") + } + } +} + +struct RecordButton: View { + let permission: VoiceMemos.State.RecorderPermission + let action: () -> Void + let settingsAction: () -> Void + + var body: some View { + ZStack { + Group { + Circle() + .foregroundColor(Color(.label)) + .frame(width: 74, height: 74) + + Button(action: action) { + RoundedRectangle(cornerRadius: 35) + .foregroundColor(Color(.systemRed)) + .padding(2) + } + .frame(width: 70, height: 70) + } + .opacity(permission == .denied ? 0.1 : 1) + + if permission == .denied { + VStack(spacing: 10) { + Text("Recording requires microphone access.") + .multilineTextAlignment(.center) + Button("Open Settings", action: settingsAction) + } + .frame(maxWidth: .infinity, maxHeight: 74) + } + } + } +} + +#Preview { + VoiceMemosView( + store: Store( + initialState: VoiceMemos.State( + voiceMemos: [ + VoiceMemo.State( + date: Date(), + duration: 5, + mode: .notPlaying, + title: "Functions", + url: URL(string: "https://www.pointfree.co/functions")! + ), + VoiceMemo.State( + date: Date(), + duration: 5, + mode: .notPlaying, + title: "", + url: URL(string: "https://www.pointfree.co/untitled")! + ), + ] + ) + ) { + VoiceMemos() + } + ) +} diff --git a/Examples/VoiceMemos/VoiceMemos/VoiceMemosApp.swift b/Examples/VoiceMemos/VoiceMemos/VoiceMemosApp.swift new file mode 100644 index 0000000..e0a5357 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemos/VoiceMemosApp.swift @@ -0,0 +1,15 @@ +import ComposableArchitecture +import SwiftUI + +@main +struct VoiceMemosApp: App { + var body: some Scene { + WindowGroup { + VoiceMemosView( + store: Store(initialState: VoiceMemos.State()) { + VoiceMemos()._printChanges() + } + ) + } + } +} diff --git a/Examples/VoiceMemos/VoiceMemosTests/VoiceMemosTests.swift b/Examples/VoiceMemos/VoiceMemosTests/VoiceMemosTests.swift new file mode 100644 index 0000000..dc69d86 --- /dev/null +++ b/Examples/VoiceMemos/VoiceMemosTests/VoiceMemosTests.swift @@ -0,0 +1,457 @@ +import ComposableArchitecture +import XCTest + +@testable import VoiceMemos + +let deadbeefID = UUID(uuidString: "DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF")! +let deadbeefURL = URL(fileURLWithPath: "/tmp/DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF.m4a") + +final class VoiceMemosTests: XCTestCase { + @MainActor + func testRecordAndPlayback() async throws { + let didFinish = AsyncThrowingStream.makeStream(of: Bool.self) + let clock = TestClock() + let store = TestStore(initialState: VoiceMemos.State()) { + VoiceMemos() + } withDependencies: { + $0.audioPlayer.play = { @Sendable _ in + try await clock.sleep(for: .milliseconds(2_500)) + return true + } + $0.audioRecorder.currentTime = { 2.5 } + $0.audioRecorder.requestRecordPermission = { true } + $0.audioRecorder.startRecording = { @Sendable _ in + try await didFinish.stream.first { _ in true }! + } + $0.audioRecorder.stopRecording = { + didFinish.continuation.yield(true) + didFinish.continuation.finish() + } + $0.date = .constant(Date(timeIntervalSinceReferenceDate: 0)) + $0.continuousClock = clock + $0.temporaryDirectory = { URL(fileURLWithPath: "/tmp") } + $0.uuid = .constant(deadbeefID) + } + + await store.send(.recordButtonTapped) + await store.receive(\.recordPermissionResponse) { + $0.audioRecorderPermission = .allowed + $0.recordingMemo = RecordingMemo.State( + date: Date(timeIntervalSinceReferenceDate: 0), + mode: .recording, + url: deadbeefURL + ) + } + await store.send(\.recordingMemo.onTask) + await store.send(\.recordingMemo.stopButtonTapped) { + $0.recordingMemo?.mode = .encoding + } + await store.receive(\.recordingMemo.finalRecordingTime) { + $0.recordingMemo?.duration = 2.5 + } + await store.receive(\.recordingMemo.audioRecorderDidFinish.success) + await store.receive(\.recordingMemo.delegate.didFinish.success) { + $0.recordingMemo = nil + $0.voiceMemos = [ + VoiceMemo.State( + date: Date(timeIntervalSinceReferenceDate: 0), + duration: 2.5, + mode: .notPlaying, + title: "", + url: deadbeefURL + ) + ] + } + await store.send(\.voiceMemos[id:deadbeefURL].playButtonTapped) { + $0.voiceMemos[id: deadbeefURL]?.mode = .playing(progress: 0) + } + await store.receive(\.voiceMemos[id:deadbeefURL].delegate.playbackStarted) + await clock.run() + + await store.receive(\.voiceMemos[id:deadbeefURL].timerUpdated) { + $0.voiceMemos[id: deadbeefURL]?.mode = .playing(progress: 0.2) + } + await store.receive(\.voiceMemos[id:deadbeefURL].timerUpdated) { + $0.voiceMemos[id: deadbeefURL]?.mode = .playing(progress: 0.4) + } + await store.receive(\.voiceMemos[id:deadbeefURL].timerUpdated) { + $0.voiceMemos[id: deadbeefURL]?.mode = .playing(progress: 0.6) + } + await store.receive(\.voiceMemos[id:deadbeefURL].timerUpdated) { + $0.voiceMemos[id: deadbeefURL]?.mode = .playing(progress: 0.8) + } + await store.receive(\.voiceMemos[id:deadbeefURL].audioPlayerClient.success) { + $0.voiceMemos[id: deadbeefURL]?.mode = .notPlaying + } + } + + @MainActor + func testRecordMemoHappyPath() async throws { + let didFinish = AsyncThrowingStream.makeStream(of: Bool.self) + let clock = TestClock() + let store = TestStore(initialState: VoiceMemos.State()) { + VoiceMemos() + } withDependencies: { + $0.audioRecorder.currentTime = { 2.5 } + $0.audioRecorder.requestRecordPermission = { true } + $0.audioRecorder.startRecording = { @Sendable _ in + try await didFinish.stream.first { _ in true }! + } + $0.audioRecorder.stopRecording = { + didFinish.continuation.yield(true) + didFinish.continuation.finish() + } + $0.date = .constant(Date(timeIntervalSinceReferenceDate: 0)) + $0.continuousClock = clock + $0.temporaryDirectory = { URL(fileURLWithPath: "/tmp") } + $0.uuid = .constant(UUID(uuidString: "DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF")!) + } + + await store.send(.recordButtonTapped) + await clock.advance() + await store.receive(\.recordPermissionResponse) { + $0.audioRecorderPermission = .allowed + $0.recordingMemo = RecordingMemo.State( + date: Date(timeIntervalSinceReferenceDate: 0), + mode: .recording, + url: URL(fileURLWithPath: "/tmp/DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF.m4a") + ) + } + let recordingMemoTask = await store.send(\.recordingMemo.onTask) + await clock.advance(by: .seconds(1)) + await store.receive(\.recordingMemo.timerUpdated) { + $0.recordingMemo?.duration = 1 + } + await clock.advance(by: .seconds(1)) + await store.receive(\.recordingMemo.timerUpdated) { + $0.recordingMemo?.duration = 2 + } + await clock.advance(by: .milliseconds(500)) + await store.send(\.recordingMemo.stopButtonTapped) { + $0.recordingMemo?.mode = .encoding + } + await store.receive(\.recordingMemo.finalRecordingTime) { + $0.recordingMemo?.duration = 2.5 + } + await store.receive(\.recordingMemo.audioRecorderDidFinish.success) + await store.receive(\.recordingMemo.delegate.didFinish.success) { + $0.recordingMemo = nil + $0.voiceMemos = [ + VoiceMemo.State( + date: Date(timeIntervalSinceReferenceDate: 0), + duration: 2.5, + mode: .notPlaying, + title: "", + url: URL(fileURLWithPath: "/tmp/DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF.m4a") + ) + ] + } + await recordingMemoTask.cancel() + } + + @MainActor + func testPermissionDenied() async { + var didOpenSettings = false + let store = TestStore(initialState: VoiceMemos.State()) { + VoiceMemos() + } withDependencies: { + $0.audioRecorder.requestRecordPermission = { false } + $0.openSettings = { @MainActor in didOpenSettings = true } + } + + await store.send(.recordButtonTapped) + await store.receive(\.recordPermissionResponse) { + $0.alert = AlertState { TextState("Permission is required to record voice memos.") } + $0.audioRecorderPermission = .denied + } + await store.send(\.alert.dismiss) { + $0.alert = nil + } + await store.send(.openSettingsButtonTapped).finish() + XCTAssert(didOpenSettings) + } + + @MainActor + func testRecordMemoFailure() async { + struct SomeError: Error, Equatable {} + let didFinish = AsyncThrowingStream.makeStream(of: Bool.self) + let clock = TestClock() + let store = TestStore(initialState: VoiceMemos.State()) { + VoiceMemos() + } withDependencies: { + $0.audioRecorder.requestRecordPermission = { true } + $0.audioRecorder.startRecording = { @Sendable _ in + try await didFinish.stream.first { _ in true }! + } + $0.continuousClock = clock + $0.date = .constant(Date(timeIntervalSinceReferenceDate: 0)) + $0.temporaryDirectory = { URL(fileURLWithPath: "/tmp") } + $0.uuid = .constant(deadbeefID) + } + + await store.send(.recordButtonTapped) + await store.receive(\.recordPermissionResponse) { + $0.audioRecorderPermission = .allowed + $0.recordingMemo = RecordingMemo.State( + date: Date(timeIntervalSinceReferenceDate: 0), + mode: .recording, + url: deadbeefURL + ) + } + await store.send(\.recordingMemo.onTask) + + didFinish.continuation.finish(throwing: SomeError()) + await store.receive(\.recordingMemo.audioRecorderDidFinish.failure) + await store.receive(\.recordingMemo.delegate.didFinish.failure) { + $0.alert = AlertState { TextState("Voice memo recording failed.") } + $0.recordingMemo = nil + } + } + + // Demonstration of how to write a non-exhaustive test for recording a memo and it failing to + // record. + @MainActor + func testRecordMemoFailure_NonExhaustive() async { + struct SomeError: Error, Equatable {} + let didFinish = AsyncThrowingStream.makeStream(of: Bool.self) + let clock = TestClock() + let store = TestStore(initialState: VoiceMemos.State()) { + VoiceMemos() + } withDependencies: { + $0.audioRecorder.currentTime = { 2.5 } + $0.audioRecorder.requestRecordPermission = { true } + $0.audioRecorder.startRecording = { @Sendable _ in + try await didFinish.stream.first { _ in true }! + } + $0.continuousClock = clock + $0.date = .constant(Date(timeIntervalSinceReferenceDate: 0)) + $0.temporaryDirectory = { URL(fileURLWithPath: "/tmp") } + $0.uuid = .constant(deadbeefID) + } + store.exhaustivity = .off(showSkippedAssertions: true) + + await store.send(.recordButtonTapped) + await store.send(\.recordingMemo.onTask) + didFinish.continuation.finish(throwing: SomeError()) + await store.receive(\.recordingMemo.delegate.didFinish.failure) { + $0.alert = AlertState { TextState("Voice memo recording failed.") } + $0.recordingMemo = nil + } + } + + @MainActor + func testPlayMemoHappyPath() async { + let url = URL(fileURLWithPath: "pointfreeco/functions.m4a") + let clock = TestClock() + let store = TestStore( + initialState: VoiceMemos.State( + voiceMemos: [ + VoiceMemo.State( + date: Date(), + duration: 1.25, + mode: .notPlaying, + title: "", + url: url + ) + ] + ) + ) { + VoiceMemos() + } withDependencies: { + $0.audioPlayer.play = { @Sendable _ in + try await clock.sleep(for: .milliseconds(1_250)) + return true + } + $0.continuousClock = clock + } + + await store.send(\.voiceMemos[id:url].playButtonTapped) { + $0.voiceMemos[id: url]?.mode = .playing(progress: 0) + } + await store.receive(\.voiceMemos[id:url].delegate.playbackStarted) + await clock.advance(by: .milliseconds(500)) + await store.receive(\.voiceMemos[id:url].timerUpdated) { + $0.voiceMemos[id: url]?.mode = .playing(progress: 0.4) + } + await clock.advance(by: .milliseconds(500)) + await store.receive(\.voiceMemos[id:url].timerUpdated) { + $0.voiceMemos[id: url]?.mode = .playing(progress: 0.8) + } + await clock.advance(by: .milliseconds(250)) + await store.receive(\.voiceMemos[id:url].audioPlayerClient.success) { + $0.voiceMemos[id: url]?.mode = .notPlaying + } + } + + @MainActor + func testPlayMemoFailure() async { + struct SomeError: Error, Equatable {} + + let url = URL(fileURLWithPath: "pointfreeco/functions.m4a") + let clock = TestClock() + let store = TestStore( + initialState: VoiceMemos.State( + voiceMemos: [ + VoiceMemo.State( + date: Date(), + duration: 30, + mode: .notPlaying, + title: "", + url: url + ) + ] + ) + ) { + VoiceMemos() + } withDependencies: { + $0.audioPlayer.play = { @Sendable _ in throw SomeError() } + $0.continuousClock = clock + } + + let task = await store.send(\.voiceMemos[id:url].playButtonTapped) { + $0.voiceMemos[id: url]?.mode = .playing(progress: 0) + } + await store.receive(\.voiceMemos[id:url].delegate.playbackStarted) + await store.receive(\.voiceMemos[id:url].audioPlayerClient.failure) { + $0.voiceMemos[id: url]?.mode = .notPlaying + } + await store.receive(\.voiceMemos[id:url].delegate.playbackFailed) { + $0.alert = AlertState { TextState("Voice memo playback failed.") } + } + await task.cancel() + } + + @MainActor + func testStopMemo() async { + let url = URL(fileURLWithPath: "pointfreeco/functions.m4a") + let store = TestStore( + initialState: VoiceMemos.State( + voiceMemos: [ + VoiceMemo.State( + date: Date(), + duration: 30, + mode: .playing(progress: 0.3), + title: "", + url: url + ) + ] + ) + ) { + VoiceMemos() + } + + await store.send(\.voiceMemos[id:url].playButtonTapped) { + $0.voiceMemos[id: url]?.mode = .notPlaying + } + } + + @MainActor + func testDeleteMemo() async { + let url = URL(fileURLWithPath: "pointfreeco/functions.m4a") + let store = TestStore( + initialState: VoiceMemos.State( + voiceMemos: [ + VoiceMemo.State( + date: Date(), + duration: 30, + mode: .playing(progress: 0.3), + title: "", + url: url + ) + ] + ) + ) { + VoiceMemos() + } + + await store.send(.onDelete([0])) { + $0.voiceMemos = [] + } + } + + @MainActor + func testDeleteMemos() async { + let date = Date() + let store = TestStore( + initialState: VoiceMemos.State( + voiceMemos: [ + VoiceMemo.State( + date: date, + duration: 30, + mode: .playing(progress: 0.3), + title: "Episode 1", + url: URL(fileURLWithPath: "pointfreeco/1.m4a") + ), + VoiceMemo.State( + date: date, + duration: 30, + mode: .playing(progress: 0.3), + title: "Episode 2", + url: URL(fileURLWithPath: "pointfreeco/2.m4a") + ), + VoiceMemo.State( + date: date, + duration: 30, + mode: .playing(progress: 0.3), + title: "Episode 3", + url: URL(fileURLWithPath: "pointfreeco/3.m4a") + ), + ] + ) + ) { + VoiceMemos() + } + + await store.send(.onDelete([1])) { + $0.voiceMemos = [ + VoiceMemo.State( + date: date, + duration: 30, + mode: .playing(progress: 0.3), + title: "Episode 1", + url: URL(fileURLWithPath: "pointfreeco/1.m4a") + ), + VoiceMemo.State( + date: date, + duration: 30, + mode: .playing(progress: 0.3), + title: "Episode 3", + url: URL(fileURLWithPath: "pointfreeco/3.m4a") + ), + ] + } + } + + @MainActor + func testDeleteMemoWhilePlaying() async { + let url = URL(fileURLWithPath: "pointfreeco/functions.m4a") + let clock = TestClock() + let store = TestStore( + initialState: VoiceMemos.State( + voiceMemos: [ + VoiceMemo.State( + date: Date(), + duration: 10, + mode: .notPlaying, + title: "", + url: url + ) + ] + ) + ) { + VoiceMemos() + } withDependencies: { + $0.audioPlayer.play = { @Sendable _ in try await Task.never() } + $0.continuousClock = clock + } + + await store.send(\.voiceMemos[id:url].playButtonTapped) { + $0.voiceMemos[id: url]?.mode = .playing(progress: 0) + } + await store.receive(\.voiceMemos[id:url].delegate.playbackStarted) + await store.send(.onDelete([0])) { + $0.voiceMemos = [] + } + await store.finish() + } +} diff --git a/README.md b/README.md index 0ce0fed..891fe15 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ import PackageDescription let package = Package( name: "SomeProject", dependencies: [ - .package(url: "https://github.com/dankinsoid/VDStore.git", from: "0.22.0") + .package(url: "https://github.com/dankinsoid/VDStore.git", from: "0.23.0") ], targets: [ .target(name: "SomeProject", dependencies: ["VDStore"]) diff --git a/Sources/VDStore/Store.swift b/Sources/VDStore/Store.swift index 31d8510..317b725 100644 --- a/Sources/VDStore/Store.swift +++ b/Sources/VDStore/Store.swift @@ -25,7 +25,7 @@ import Foundation /// /// ### Scoping /// -/// The most important operation defined on ``Store`` is the ``scope(get:set:)`` or ``scope(_ keyPayh:)`` methods, +/// The most important operation defined on ``Store`` is the ``scope(get:set:)`` or ``scope(_ keyPath:)`` methods, /// which allows you to transform a store into one that deals with child state. This is /// necessary for passing stores to subviews that only care about a small portion of the entire /// application's domain. @@ -62,17 +62,17 @@ import Foundation /// var body: some View { /// TabView { /// ActivityView( -/// $state.activity +/// $state.activity // same as $state.scope(\.activity) /// ) /// .tabItem { Text("Activity") } /// /// SearchView( -/// $state.search +/// $state.search // same as $state.scope(\.search) /// ) /// .tabItem { Text("Search") } /// /// ProfileView( -/// $state.profile +/// $state.profile // same as $state.scope(\.profile) /// ) /// .tabItem { Text("Profile") } /// } @@ -206,7 +206,7 @@ public struct Store { /// // Construct a login view by scoping the store /// // to one that works with only login domain. /// LoginView( - /// store.scope(state: \.login) + /// store.scope(\.login) /// ) /// ``` /// @@ -299,8 +299,8 @@ public struct Store { /// Suspends the store from updating the UI until the block returns. public func update(_ update: () throws -> T) rethrows -> T { + box.startUpdate() defer { box.endUpdate() } - box.startUpdate() let result = try update() return result } diff --git a/Sources/VDStore/ViewStore.swift b/Sources/VDStore/ViewStore.swift index d888f9a..4d1d256 100644 --- a/Sources/VDStore/ViewStore.swift +++ b/Sources/VDStore/ViewStore.swift @@ -16,7 +16,7 @@ public struct ViewStore: DynamicProperty { public var wrappedValue: State { get { projectedValue.state } - set { projectedValue.state = newValue } + nonmutating set { projectedValue.state = newValue } } public var projectedValue: Store {