Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Unified Account View with rethought Account Service Model (StanfordSp…
…ezi#7) # Unified Account View with rethought Account Service Model ## ♻️ Current situation & Problem Currently, `SepziAccount` exposes two distinct views: `Login` and `SignUp`. While visually identical (expect for customizations), the AccountService buttons navigate to the respective Login or SignUp views for data entry. This introduces several navigation steps for the user even for simple workflows (e.g. just signing in a returning user). Further, it is not clear where to place Identity Provider buttons (e.g., Sign in with Apple), as these create a new account or just sign you in to your existing one with the same, single button. ## 💡 Proposed solution This PR makes the following changes: * Unifying `Login` and `SignUp` views to be represented by a single view, placing identity providers on the same page as regular Account Services, the `AccountSetup` view. * Restructure the Account Service Model: * Make the necessary preparations to support third-party Identity providers * Introduce the concept of an `EmbeddableAccountService` and a new `KeyPasswordBasedAccountService` as new abstraction layers. This replaces the current `UsernamePasswordAccountService` and `EmailPasswordAccountService` implementations. Those we really only Mock implementations which provided extensibility through class inheritance. This was replaced by providing the same functionality with a hierarchy of protocols being more powerful and providing much more flexibility. Further, we introduce new Mock Account services (e.g., used by PreviewProviders) which more clearly communicate their use through their updated name. * Move the UI parts of an AccountService out into a distinct abstraction layer (`AccountSetupViewStyle`s). * Introduce the `Account Value` (through `AccountKey` implementations) abstraction to support arbitrary account values * They provide a name, a category (for optimized placement in the UI), and a initial value * The provide the UI components do display (`DataDisplayView`) and setup or edit (`DataEntryView`) account values * The provide easy to use accessors using extensions on `AccountKeys` and `AccountValues` * Optimized API surface for end-users: * Exposes the `signedIn` published property (same as previously) * Exposees the `details` shared repository to access the `AccountDetails` of the currently logged in use. This also provides access to the `AccountService` and its configuration that was used to setup the user account. * Provide a new `AccountOverview` view: * Allows to view arbitrary account values * Allows to edit arbitrary account values * Provide Logout and account Removal functionality * Enabled through StanfordSpezi/Spezi#72, one can easily configure `SpeziAccount` centrally while other configured components can provide their AccountServices via [Component Communication](https://swiftpackageindex.com/stanfordspezi/spezi/documentation/spezi/component#Communication). This PR tries to provide extensive documentation for all areas. To provide some insights into the new user-facing API surface. This is how you would configure Spezi Account now: ```swift class YourAppDelegate: SpeziAppDelegate { override var configuration: Configuration { AccountConfiguration(configuration: [ // the user defines what account values are used and if they are `required`, `collected` or just `supported` .requires(\.userId), .requires(\.password), .requires(\.name), .collects(\.dateOfBirth), .collects(\.genderIdentity) ]) } } ``` Below is an example on how to use the account setup view: ```swift struct MyOnboardingView: View { var body: some View { AccountSetup { NavigationLink { // ... next view if already signed in } label: { Text("Continue") } } } } ``` Lastly, the account overview is equally as easy to use: ```swift struct MyView: View { var body: some View { AccountOverview() } } ``` ## ⚙️ Release Notes * New, unified `AccountSetup` view * New `AccountOverview` view * Introduce new `AccountService` abstraction * Support arbitrary account values through `AccountKey`-based shared repository implementation ## ➕ Additional Information ### Related PRs and Issues * This PR provides the groundwork necessary for StanfordSpezi/SpeziFirebase#7 * The updated Firebase implementation: StanfordSpezi/SpeziFirebase#8 ### Testing Substantial UI tests were updated and added. ### Reviewer Nudging As this is quite a large PR it would make sense to start reviewing by reading through the documentation. First of all reviewing the documentation itself (structure and readability). Code example on the DocC article already explain a lot of the concepts. The areas that sparked your attention, where you think that something is off or hard to understand, I would recommend to deep dive into the respective code area. ### Code of Conduct & Contributing Guidelines By submitting creating this pull request, you agree to follow our [Code of Conduct](https://github.com/StanfordSpezi/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/StanfordSpezi/.github/blob/main/CONTRIBUTING.md): - [x] I agree to follow the [Code of Conduct](https://github.com/StanfordSpezi/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/StanfordSpezi/.github/blob/main/CONTRIBUTING.md). --------- Co-authored-by: Paul Schmiedmayer <PSchmiedmayer@users.noreply.github.com>
- Loading branch information