mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
6.3 KiB
Swift
159 lines
6.3 KiB
Swift
// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
|
|
|
|
import SwiftUI
|
|
import SessionUIKit
|
|
import SessionMessagingKit
|
|
import SignalUtilitiesKit
|
|
import SessionUtilitiesKit
|
|
|
|
struct DisplayNameScreen: View {
|
|
@EnvironmentObject var host: HostWrapper
|
|
|
|
@State private var displayName: String = ""
|
|
@State private var error: String? = nil
|
|
|
|
private let dependencies: Dependencies
|
|
|
|
public init(using dependencies: Dependencies) {
|
|
self.dependencies = dependencies
|
|
}
|
|
|
|
var body: some View {
|
|
ZStack(alignment: .center) {
|
|
ThemeManager.currentTheme.colorSwiftUI(for: .backgroundPrimary).ignoresSafeArea()
|
|
|
|
VStack(
|
|
alignment: .leading,
|
|
spacing: 0
|
|
) {
|
|
Spacer(minLength: 0)
|
|
|
|
let title: String = (dependencies[cache: .onboarding].initialFlow == .register ?
|
|
"displayNamePick".localized() :
|
|
"displayNameNew".localized()
|
|
)
|
|
Text(title)
|
|
.bold()
|
|
.font(.system(size: Values.veryLargeFontSize))
|
|
.foregroundColor(themeColor: .textPrimary)
|
|
|
|
Spacer(minLength: 0)
|
|
.frame(maxHeight: 2 * Values.mediumSpacing)
|
|
|
|
let explanation: String = (dependencies[cache: .onboarding].initialFlow == .register ?
|
|
"displayNameDescription".localized() :
|
|
"displayNameErrorNew".localized()
|
|
)
|
|
Text(explanation)
|
|
.font(.system(size: Values.smallFontSize))
|
|
.foregroundColor(themeColor: .textPrimary)
|
|
.fixedSize(horizontal: false, vertical: true)
|
|
|
|
Spacer(minLength: 0)
|
|
.frame(maxHeight: 2 * Values.mediumSpacing)
|
|
|
|
SessionTextField(
|
|
$displayName,
|
|
placeholder: "displayNameEnter".localized(),
|
|
error: $error,
|
|
accessibility: Accessibility(
|
|
identifier: "Enter display name",
|
|
label: "Enter display name"
|
|
)
|
|
)
|
|
|
|
Spacer(minLength: 0)
|
|
.frame(maxHeight: Values.massiveSpacing)
|
|
|
|
Spacer(minLength: 0)
|
|
}
|
|
.padding(.horizontal, Values.veryLargeSpacing)
|
|
.padding(.bottom, Values.largeButtonHeight)
|
|
|
|
VStack() {
|
|
Spacer(minLength: 0)
|
|
|
|
Button {
|
|
register()
|
|
} label: {
|
|
Text("theContinue".localized())
|
|
.bold()
|
|
.font(.system(size: Values.smallFontSize))
|
|
.foregroundColor(themeColor: .sessionButton_text)
|
|
.frame(
|
|
maxWidth: .infinity,
|
|
maxHeight: Values.largeButtonHeight,
|
|
alignment: .center
|
|
)
|
|
.overlay(
|
|
Capsule()
|
|
.stroke(themeColor: .sessionButton_border)
|
|
)
|
|
}
|
|
.accessibility(
|
|
Accessibility(
|
|
identifier: "Continue",
|
|
label: "Continue"
|
|
)
|
|
)
|
|
.padding(.horizontal, Values.massiveSpacing)
|
|
}
|
|
.padding(.vertical, Values.mediumSpacing)
|
|
}
|
|
}
|
|
|
|
private func register() {
|
|
let displayName = self.displayName.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
|
|
guard !displayName.isEmpty else {
|
|
error = "displayNameErrorDescription".localized()
|
|
return
|
|
}
|
|
guard !Profile.isTooLong(profileName: displayName) else {
|
|
error = "displayNameErrorDescriptionShorter".localized()
|
|
return
|
|
}
|
|
|
|
// Store the new name in the onboarding cache
|
|
dependencies.mutate(cache: .onboarding) { $0.setDisplayName(displayName) }
|
|
|
|
// If we are not in the registration flow then we are finished and should go straight
|
|
// to the home screen
|
|
guard dependencies[cache: .onboarding].initialFlow == .register else {
|
|
return dependencies.mutate(cache: .onboarding) { [dependencies] onboarding in
|
|
// If the `initialFlow` is `none` then it means the user is just providing a missing displayName
|
|
// and so shouldn't change the APNS setting, otherwise we should base it on the users selection
|
|
// during the onboarding process
|
|
let shouldSyncPushTokens: Bool = (onboarding.initialFlow != .none && onboarding.useAPNS)
|
|
|
|
onboarding.completeRegistration {
|
|
// Trigger the 'SyncPushTokensJob' directly as we don't want to wait for paths to build
|
|
// before requesting the permission from the user
|
|
if shouldSyncPushTokens {
|
|
SyncPushTokensJob
|
|
.run(uploadOnlyIfStale: false, using: dependencies)
|
|
.sinkUntilComplete()
|
|
}
|
|
|
|
// Go to the home screen
|
|
let homeVC: HomeVC = HomeVC(using: dependencies)
|
|
dependencies[singleton: .app].setHomeViewController(homeVC)
|
|
self.host.controller?.navigationController?.setViewControllers([ homeVC ], animated: true)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Need to get the PN mode if registering
|
|
let viewController: SessionHostingViewController = SessionHostingViewController(
|
|
rootView: PNModeScreen(using: dependencies)
|
|
)
|
|
viewController.setUpNavBarSessionIcon(using: dependencies)
|
|
self.host.controller?.navigationController?.pushViewController(viewController, animated: true)
|
|
}
|
|
}
|
|
|
|
struct DisplayNameView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
DisplayNameScreen(using: Dependencies.createEmpty())
|
|
}
|
|
}
|