import ManaCore import SwiftUI /// "Passwort vergessen"-Screen: Email-Eingabe + Submit-Button. /// Bei Erfolg zeigt der View einen generischen Hinweis (User- /// Enumeration-Schutz). public struct ManaForgotPasswordView: View { @Environment(\.manaBrand) private var brand @State private var model: ForgotPasswordViewModel private let onDone: () -> Void /// - Parameters: /// - auth: gemeinsamer `AuthClient` der App. /// - resetUniversalLink: Universal-Link für den Reset-Klick /// aus der Email (z.B. `https://cardecky.mana.how/auth/reset`). /// - onDone: Callback wenn der User "Fertig" auf dem Hinweis- /// Screen drückt — Apps schließen das Sheet. public init( auth: AuthClient, resetUniversalLink: URL, onDone: @escaping () -> Void ) { _model = State(initialValue: ForgotPasswordViewModel( auth: auth, resetUniversalLink: resetUniversalLink )) self.onDone = onDone } public var body: some View { switch model.status { case .sent: sentView default: formView } } @ViewBuilder private var formView: some View { ManaAuthScaffold { VStack(spacing: 16) { Text("Passwort vergessen?") .font(.title2) .fontWeight(.semibold) .foregroundStyle(brand.foreground) .frame(maxWidth: .infinity, alignment: .leading) Text("Gib deine Email-Adresse ein. Wir schicken dir einen Link zum Zurücksetzen.") .font(.subheadline) .foregroundStyle(brand.mutedForeground) .frame(maxWidth: .infinity, alignment: .leading) ManaTextField("Email", text: $model.email) .manaEmailField() ManaPrimaryButton( "Reset-Link senden", isLoading: model.isSending, isEnabled: model.canSubmit ) { Task { await model.submit() } } if case let .error(message) = model.status { Text(message) .font(.footnote) .foregroundStyle(brand.error) .multilineTextAlignment(.center) .padding(.top, 4) } } .padding(.top, 16) Button("Abbrechen", action: onDone) .font(.subheadline) .foregroundStyle(brand.mutedForeground) .padding(.top, 12) } } @ViewBuilder private var sentView: some View { ManaAuthScaffold { VStack(spacing: 16) { Image(systemName: "envelope.fill") .font(.system(size: 56, weight: .light)) .foregroundStyle(brand.primary) Text("Schau in deinen Posteingang") .font(.title2) .fontWeight(.semibold) .foregroundStyle(brand.foreground) .multilineTextAlignment(.center) Text( "Wenn ein Account für diese Email existiert, ist eine Mail mit " + "einem Reset-Link unterwegs." ) .font(.subheadline) .foregroundStyle(brand.mutedForeground) .multilineTextAlignment(.center) ManaPrimaryButton("Fertig") { onDone() } .padding(.top, 16) } } } }