From 2c28474ca5ec26750888cb8d98ae619a0bd9ed84 Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Thu, 13 Jun 2024 17:53:31 +0200 Subject: [PATCH] Add register view --- Linphone.xcodeproj/project.pbxproj | 28 +- .../Contents.json | 21 ++ .../confirm_sms_code_illu.png | Bin 0 -> 18364 bytes Linphone/Localizable.xcstrings | 174 ++++++++++- .../assistant_linphone_default_values | 2 +- .../assistant_third_party_default_values | 8 + Linphone/Ressources/linphonerc-default | 6 +- Linphone/Ressources/linphonerc-factory | 14 +- .../Assistant/Fragments/LoginFragment.swift | 10 +- .../RegisterCodeConfirmationFragment.swift | 228 ++++++++++++++ .../Fragments/RegisterFragment.swift | 285 ++++++++++++++++-- .../Viewmodel/RegisterViewModel.swift | 57 ++++ 12 files changed, 772 insertions(+), 61 deletions(-) create mode 100644 Linphone/Assets.xcassets/confirm_sms_code_illu.imageset/Contents.json create mode 100644 Linphone/Assets.xcassets/confirm_sms_code_illu.imageset/confirm_sms_code_illu.png create mode 100644 Linphone/UI/Assistant/Fragments/RegisterCodeConfirmationFragment.swift create mode 100644 Linphone/UI/Assistant/Viewmodel/RegisterViewModel.swift diff --git a/Linphone.xcodeproj/project.pbxproj b/Linphone.xcodeproj/project.pbxproj index 137de0f75..2fc9d6d40 100644 --- a/Linphone.xcodeproj/project.pbxproj +++ b/Linphone.xcodeproj/project.pbxproj @@ -57,6 +57,8 @@ D70A26F22B7F5D95006CC8FC /* ConversationFragment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D70A26F12B7F5D95006CC8FC /* ConversationFragment.swift */; }; D70C93DE2AC2D0F60063CA3B /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = D70C93DD2AC2D0F60063CA3B /* Localizable.xcstrings */; }; D714035B2BE11E00004BD8CA /* CallMediaEncryptionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D714035A2BE11E00004BD8CA /* CallMediaEncryptionModel.swift */; }; + D714DE602C1B3B34006C1F1D /* RegisterViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D714DE5F2C1B3B34006C1F1D /* RegisterViewModel.swift */; }; + D714DE622C1C4636006C1F1D /* RegisterCodeConfirmationFragment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D714DE612C1C4636006C1F1D /* RegisterCodeConfirmationFragment.swift */; }; D717071E2AC5922E0037746F /* ColorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D717071D2AC5922E0037746F /* ColorExtension.swift */; }; D71707202AC5989C0037746F /* TextExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D717071F2AC5989C0037746F /* TextExtension.swift */; }; D7173EBE2B7A5C0A00BCC481 /* LinphoneUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7173EBD2B7A5C0A00BCC481 /* LinphoneUtils.swift */; }; @@ -229,6 +231,8 @@ D70A26F12B7F5D95006CC8FC /* ConversationFragment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationFragment.swift; sourceTree = ""; }; D70C93DD2AC2D0F60063CA3B /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; D714035A2BE11E00004BD8CA /* CallMediaEncryptionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallMediaEncryptionModel.swift; sourceTree = ""; }; + D714DE5F2C1B3B34006C1F1D /* RegisterViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterViewModel.swift; sourceTree = ""; }; + D714DE612C1C4636006C1F1D /* RegisterCodeConfirmationFragment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterCodeConfirmationFragment.swift; sourceTree = ""; }; D717071D2AC5922E0037746F /* ColorExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorExtension.swift; sourceTree = ""; }; D717071F2AC5989C0037746F /* TextExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextExtension.swift; sourceTree = ""; }; D7173EBD2B7A5C0A00BCC481 /* LinphoneUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinphoneUtils.swift; sourceTree = ""; }; @@ -578,6 +582,7 @@ D719ABCE2ABC779A00B41C10 /* AccountLoginViewModel.swift */, D72343332ACEFFC3009AA24E /* QRScanner.swift */, D72343312ACEFF58009AA24E /* QRScannerController.swift */, + D714DE5F2C1B3B34006C1F1D /* RegisterViewModel.swift */, ); path = Viewmodel; sourceTree = ""; @@ -837,6 +842,7 @@ D7FB55102AD447FD00A5AB15 /* RegisterFragment.swift */, D748BF2B2ACD82D2004844EB /* ThirdPartySipAccountLoginFragment.swift */, D748BF2D2ACD82E7004844EB /* ThirdPartySipAccountWarningFragment.swift */, + D714DE612C1C4636006C1F1D /* RegisterCodeConfirmationFragment.swift */, ); path = Fragments; sourceTree = ""; @@ -1123,9 +1129,11 @@ D726E43F2B19E56F0083C415 /* StartCallViewModel.swift in Sources */, D70A26EE2B7CF60B006CC8FC /* ConversationsListBottomSheet.swift in Sources */, D7D1698C2AE66FA500109A5C /* MagicSearchSingleton.swift in Sources */, + D714DE602C1B3B34006C1F1D /* RegisterViewModel.swift in Sources */, D74DA0122C047F0700A8561D /* HistoryModel.swift in Sources */, D72250692ADFBF2D008FB426 /* SideMenu.swift in Sources */, C6DC4E3F2C19C289009096FD /* SideMenuEntry.swift in Sources */, + D714DE622C1C4636006C1F1D /* RegisterCodeConfirmationFragment.swift in Sources */, D7CEE0352B7A210300FD79B7 /* ConversationsView.swift in Sources */, D717071E2AC5922E0037746F /* ColorExtension.swift in Sources */, D71968922B86369D00DF4459 /* ChatBubbleView.swift in Sources */, @@ -1171,6 +1179,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "DEBUG=1", + "USE_CRASHLYTICS=1", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = msgNotificationService/Info.plist; @@ -1184,7 +1193,7 @@ ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; - OTHER_SWIFT_FLAGS = "$(inherited)"; + OTHER_SWIFT_FLAGS = "$(inherited) -DUSE_CRASHLYTICS"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1210,7 +1219,10 @@ DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "USE_CRASHLYTICS=1", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = msgNotificationService/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = msgNotificationService; @@ -1223,7 +1235,7 @@ ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; - OTHER_SWIFT_FLAGS = "$(inherited)"; + OTHER_SWIFT_FLAGS = "$(inherited) -DUSE_CRASHLYTICS"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1370,6 +1382,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "DEBUG=1", + "USE_CRASHLYTICS=1", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Linphone/Info.plist; @@ -1396,7 +1409,7 @@ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 13.3; MARKETING_VERSION = 6.0; - OTHER_SWIFT_FLAGS = "$(inherited)"; + OTHER_SWIFT_FLAGS = "$(inherited) -DUSE_CRASHLYTICS"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1422,7 +1435,10 @@ DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "USE_CRASHLYTICS=1", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Linphone/Info.plist; INFOPLIST_KEY_NSCameraUsageDescription = "Camera usage is required for video VOIP calls"; @@ -1448,7 +1464,7 @@ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 13.3; MARKETING_VERSION = 6.0; - OTHER_SWIFT_FLAGS = "$(inherited)"; + OTHER_SWIFT_FLAGS = "$(inherited) -DUSE_CRASHLYTICS"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; diff --git a/Linphone/Assets.xcassets/confirm_sms_code_illu.imageset/Contents.json b/Linphone/Assets.xcassets/confirm_sms_code_illu.imageset/Contents.json new file mode 100644 index 000000000..eed2e9663 --- /dev/null +++ b/Linphone/Assets.xcassets/confirm_sms_code_illu.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "confirm_sms_code_illu.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Linphone/Assets.xcassets/confirm_sms_code_illu.imageset/confirm_sms_code_illu.png b/Linphone/Assets.xcassets/confirm_sms_code_illu.imageset/confirm_sms_code_illu.png new file mode 100644 index 0000000000000000000000000000000000000000..e25974c02e227acb5c0c169c8ae0250cec0c6837 GIT binary patch literal 18364 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 XI4yEpN4jd)00000NkvXXu0mjf535Sb literal 0 HcmV?d00001 diff --git a/Linphone/Localizable.xcstrings b/Linphone/Localizable.xcstrings index 77a3aaae4..827ba45ed 100644 --- a/Linphone/Localizable.xcstrings +++ b/Linphone/Localizable.xcstrings @@ -207,6 +207,54 @@ }, "Appel chiffré de bout en bout" : { + }, + "assistant_account_create" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Create" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Créer" + } + } + } + }, + "assistant_account_creation_sms_confirmation_explanation" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "We have sent a verification code on your phone number %@.

Please enter the verification code below:" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "On vous a envoyé un code de vérification par SMS au numéro %@.

Merci de le saisir ci-dessous :" + } + } + } + }, + "assistant_account_creation_wrong_phone_number" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wrong number?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mauvais numéro ?" + } + } + } }, "assistant_account_login" : { "extractionState" : "manual", @@ -225,6 +273,87 @@ } } }, + "assistant_account_register" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Register" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "S’inscrire" + } + } + } + }, + "assistant_already_have_an_account" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Already have an account?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous avez déjà un compte ?" + } + } + } + }, + "assistant_create_account_using_email_on_our_web_platform" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Create an account with your email on:" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Créez un compte avec votre email ici :" + } + } + } + }, + "assistant_dialog_confirm_phone_number_message" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Are you sure you want to use %@ phone number?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Êtes-vous sûr de vouloir utiliser le numéro de téléphone %@ ?" + } + } + } + }, + "assistant_dialog_confirm_phone_number_title" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confirm phone number" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confirmez votre numéro de téléphone" + } + } + } + }, "Attended transfer" : { }, @@ -265,7 +394,20 @@ }, "Cancel" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancel" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annuler" + } + } + } }, "Ce mode vous permet d’être interopérable avec d’autres services SIP.\nVos communications seront chiffrées de point à point. " : { @@ -304,7 +446,20 @@ }, "Continue" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continue" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuer" + } + } + } }, "Conversations" : { @@ -642,6 +797,9 @@ }, "Log out" : { + }, + "Login" : { + }, "Logout" : { @@ -807,7 +965,14 @@ } }, "Register" : { - + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "S’inscrire" + } + } + } }, "Rejoindre" : { @@ -910,6 +1075,9 @@ }, "Subject" : { + }, + "subscribe.linphone.org" : { + }, "Suggestions" : { diff --git a/Linphone/Ressources/assistant_linphone_default_values b/Linphone/Ressources/assistant_linphone_default_values index c1e26073c..54453d542 100644 --- a/Linphone/Ressources/assistant_linphone_default_values +++ b/Linphone/Ressources/assistant_linphone_default_values @@ -29,7 +29,7 @@
zrtp - 1 + 1
1 diff --git a/Linphone/Ressources/assistant_third_party_default_values b/Linphone/Ressources/assistant_third_party_default_values index 78927cf4e..bd9c9b79f 100644 --- a/Linphone/Ressources/assistant_third_party_default_values +++ b/Linphone/Ressources/assistant_third_party_default_values @@ -22,4 +22,12 @@ 0
+
+ stun.linphone.org + stun,ice +
+
+ srtp + 0 +
diff --git a/Linphone/Ressources/linphonerc-default b/Linphone/Ressources/linphonerc-default index 8126cf1cc..80f2f4736 100644 --- a/Linphone/Ressources/linphonerc-default +++ b/Linphone/Ressources/linphonerc-default @@ -25,9 +25,9 @@ automatically_accept_direction=2 #receive only [app] tunnel=disabled -auto_start=1 -record_aware=1 -disable_chat_feature=0 +auto_download_incoming_voice_recordings=1 +auto_download_incoming_icalendars=1 + [tunnel] host= diff --git a/Linphone/Ressources/linphonerc-factory b/Linphone/Ressources/linphonerc-factory index eb16b25f2..eb87047ef 100644 --- a/Linphone/Ressources/linphonerc-factory +++ b/Linphone/Ressources/linphonerc-factory @@ -42,16 +42,11 @@ notify_each_friend_individually_when_presence_received=0 store_friends=0 [app] -activation_code_length=4 -prefer_basic_chat_room=1 record_aware=1 -disable_chat_feature=0 [account_creator] -backend=1 -# 1 means FlexiAPI, 0 is XMLRPC -url=https://subscribe.linphone.org/api/ -# replace above URL by https://staging-subscribe.linphone.org/api/ for testing +url=https://flexisip-staging-master.linphone.org/login # For testing +# url=https://subscribe.linphone.org/api/ [lime] lime_update_threshold=86400 @@ -59,9 +54,4 @@ lime_update_threshold=86400 [alerts] alerts_enabled=1 -[assistant] -algorithm=SHA-256 -password_min_length=6 -username_regex=^[a-z0-9+_.\-]*$ - ## End of factory rc diff --git a/Linphone/UI/Assistant/Fragments/LoginFragment.swift b/Linphone/UI/Assistant/Fragments/LoginFragment.swift index 35c629ede..a53421ab8 100644 --- a/Linphone/UI/Assistant/Fragments/LoginFragment.swift +++ b/Linphone/UI/Assistant/Fragments/LoginFragment.swift @@ -259,19 +259,15 @@ struct LoginFragment: View { .foregroundStyle(Color.grayMain2c700) .padding(.horizontal, 10) - NavigationLink(destination: RegisterFragment(), isActive: $isLinkREGActive, label: {Text("Register") - .default_text_style_orange_600(styleSize: 20) + NavigationLink(destination: RegisterFragment(registerViewModel: RegisterViewModel()), isActive: $isLinkREGActive, label: {Text("Register") + .default_text_style_white_600(styleSize: 20) .frame(height: 35) }) .disabled(!sharedMainViewModel.generalTermsAccepted) .padding(.horizontal, 20) .padding(.vertical, 10) + .background(Color.orangeMain500) .cornerRadius(60) - .overlay( - RoundedRectangle(cornerRadius: 60) - .inset(by: 0.5) - .stroke(Color.orangeMain500, lineWidth: 1) - ) .padding(.horizontal, 10) .simultaneousGesture( TapGesture().onEnded { diff --git a/Linphone/UI/Assistant/Fragments/RegisterCodeConfirmationFragment.swift b/Linphone/UI/Assistant/Fragments/RegisterCodeConfirmationFragment.swift new file mode 100644 index 000000000..2a0107edc --- /dev/null +++ b/Linphone/UI/Assistant/Fragments/RegisterCodeConfirmationFragment.swift @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-iphone + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import SwiftUI + +struct RegisterCodeConfirmationFragment: View { + @ObservedObject private var sharedMainViewModel = SharedMainViewModel.shared + @ObservedObject var registerViewModel: RegisterViewModel + + @Environment(\.dismiss) var dismiss + + @StateObject var viewModel = ViewModel() + @FocusState var isFocused: Bool + + let textLimit = 4 + let textBoxWidth = UIScreen.main.bounds.width / 5 + let textBoxHeight = (UIScreen.main.bounds.width / 5) + 20 + let spaceBetweenBoxes: CGFloat = 10 + let paddingOfBox: CGFloat = 1 + var textFieldOriginalWidth: CGFloat { + (textBoxWidth*4)+(spaceBetweenBoxes*3)+((paddingOfBox*2)*3) + } + + var body: some View { + NavigationView { + GeometryReader { geometry in + ScrollView(.vertical) { + VStack { + ZStack { + Image("mountain") + .resizable() + .scaledToFill() + .frame(width: geometry.size.width, height: 100) + .clipped() + + VStack(alignment: .leading) { + HStack { + Image("caret-left") + .renderingMode(.template) + .resizable() + .foregroundStyle(Color.grayMain2c500) + .frame(width: 25, height: 25, alignment: .leading) + .padding(.all, 10) + .padding(.top, -75) + .padding(.leading, -10) + .onTapGesture { + withAnimation { + dismiss() + } + } + + Spacer() + } + .padding(.leading) + } + .frame(width: geometry.size.width) + + Text("assistant_account_register") + .default_text_style_white_800(styleSize: 20) + .padding(.top, 20) + } + .padding(.top, 35) + .padding(.bottom, 10) + + ZStack { + VStack { + Spacer() + HStack { + Spacer() + Image("confirm_sms_code_illu") + .padding(.bottom, -geometry.safeAreaInsets.bottom) + } + } + VStack(alignment: .center) { + Spacer() + + Text(String(format: NSLocalizedString("assistant_account_creation_sms_confirmation_explanation", comment: ""), registerViewModel.phoneNumber)) + .default_text_style(styleSize: 15) + .foregroundStyle(Color.grayMain2c700) + .padding(.horizontal, 10) + .frame(maxWidth: .infinity, alignment: .center) + .multilineTextAlignment(.center) + + VStack { + ZStack { + + HStack(spacing: spaceBetweenBoxes) { + otpText(text: viewModel.otp1, focused: viewModel.otpField.isEmpty) + otpText(text: viewModel.otp2, focused: viewModel.otpField.count == 1) + otpText(text: viewModel.otp3, focused: viewModel.otpField.count == 2) + otpText(text: viewModel.otp4, focused: viewModel.otpField.count == 3) + } + + TextField("", text: $viewModel.otpField) + .default_text_style_600(styleSize: 80) + .frame(width: isFocused ? 0 : textFieldOriginalWidth, height: textBoxHeight) + .textContentType(.oneTimeCode) + .foregroundColor(.clear) + .accentColor(.clear) + .background(.clear) + .keyboardType(.numberPad) + .focused($isFocused) + .onChange(of: viewModel.otpField) { _ in + limitText(textLimit) + } + } + } + .frame(maxWidth: .infinity, alignment: .center) + .padding(.vertical, 20) + + Button(action: { + dismiss() + }, label: { + Text("assistant_account_creation_wrong_phone_number") + .default_text_style_orange_600(styleSize: 15) + .frame(height: 35) + }) + .padding(.horizontal, 15) + .padding(.vertical, 5) + .cornerRadius(60) + .overlay( + RoundedRectangle(cornerRadius: 60) + .inset(by: 0.5) + .stroke(Color.orangeMain500, lineWidth: 1) + ) + .padding(.bottom) + .frame(maxWidth: .infinity) + + Spacer() + Spacer() + } + .frame(maxWidth: sharedMainViewModel.maxWidth) + .padding(.horizontal, 20) + } + } + .frame(minHeight: geometry.size.height) + } + } + .navigationTitle("") + .navigationBarHidden(true) + } + .navigationViewStyle(StackNavigationViewStyle()) + .navigationTitle("") + .navigationBarHidden(true) + } + + private func otpText(text: String, focused: Bool) -> some View { + + return Text(text) + .foregroundStyle(isFocused && focused ? Color.orangeMain500 : Color.grayMain2c600) + .default_text_style_600(styleSize: 40) + .frame(width: textBoxWidth, height: textBoxHeight) + .overlay( + RoundedRectangle(cornerRadius: 20) + .inset(by: 0.5) + .stroke(isFocused && focused ? Color.orangeMain500 : Color.grayMain2c600, lineWidth: 1) + ) + .padding(paddingOfBox) + } + + func limitText(_ upper: Int) { + if viewModel.otpField.count > upper { + viewModel.otpField = String(viewModel.otpField.prefix(upper)) + } + } +} + +class ViewModel: ObservableObject { + + @Published var otpField = "" { + didSet { + guard otpField.count <= 5, + otpField.last?.isNumber ?? true else { + otpField = oldValue + return + } + } + } + var otp1: String { + guard otpField.count >= 1 else { + return "" + } + return String(Array(otpField)[0]) + } + var otp2: String { + guard otpField.count >= 2 else { + return "" + } + return String(Array(otpField)[1]) + } + var otp3: String { + guard otpField.count >= 3 else { + return "" + } + return String(Array(otpField)[2]) + } + var otp4: String { + guard otpField.count >= 4 else { + return "" + } + return String(Array(otpField)[3]) + } + + @Published var borderColor: Color = .black + var successCompletionHandler: (() -> Void)? + @Published var showResendText = false + +} + +#Preview { + RegisterCodeConfirmationFragment(registerViewModel: RegisterViewModel()) +} diff --git a/Linphone/UI/Assistant/Fragments/RegisterFragment.swift b/Linphone/UI/Assistant/Fragments/RegisterFragment.swift index 5b8178f30..2a9510835 100644 --- a/Linphone/UI/Assistant/Fragments/RegisterFragment.swift +++ b/Linphone/UI/Assistant/Fragments/RegisterFragment.swift @@ -20,51 +20,278 @@ import SwiftUI struct RegisterFragment: View { + @ObservedObject private var sharedMainViewModel = SharedMainViewModel.shared + @ObservedObject var registerViewModel: RegisterViewModel @Environment(\.dismiss) var dismiss + @State private var isSecured: Bool = true + + @FocusState var isNameFocused: Bool + @FocusState var isPhoneNumberFocused: Bool + @FocusState var isPasswordFocused: Bool + + @State private var isLinkActive = false + @State private var isShowPopup = false + var body: some View { NavigationView { GeometryReader { geometry in - ScrollView(.vertical) { - VStack { - ZStack { - Image("mountain") - .resizable() - .scaledToFill() - .frame(width: geometry.size.width, height: 100) - .clipped() + ZStack { + ScrollView(.vertical) { + VStack { + ZStack { + Image("mountain") + .resizable() + .scaledToFill() + .frame(width: geometry.size.width, height: 100) + .clipped() + + VStack(alignment: .leading) { + HStack { + Image("caret-left") + .renderingMode(.template) + .resizable() + .foregroundStyle(Color.grayMain2c500) + .frame(width: 25, height: 25, alignment: .leading) + .padding(.all, 10) + .padding(.top, -75) + .padding(.leading, -10) + .onTapGesture { + withAnimation { + dismiss() + } + } + + Spacer() + } + .padding(.leading) + } + .frame(width: geometry.size.width) + + Text("assistant_account_register") + .default_text_style_white_800(styleSize: 20) + .padding(.top, 20) + } + .padding(.top, 35) + .padding(.bottom, 10) VStack(alignment: .leading) { + Text(String(localized: "username")+"*") + .default_text_style_700(styleSize: 15) + .padding(.bottom, -5) + + TextField("username", text: $registerViewModel.username) + .default_text_style(styleSize: 15) + .disableAutocorrection(true) + .autocapitalization(.none) + .frame(height: 25) + .padding(.horizontal, 20) + .padding(.vertical, 15) + .cornerRadius(60) + .overlay( + RoundedRectangle(cornerRadius: 60) + .inset(by: 0.5) + .stroke(isNameFocused ? Color.orangeMain500 : Color.gray200, lineWidth: 1) + ) + .padding(.bottom) + .focused($isNameFocused) + + Text(String(localized: "Phone number")+"*") + .default_text_style_700(styleSize: 15) + .padding(.bottom, -5) + HStack { - Image("caret-left") - .renderingMode(.template) - .resizable() - .foregroundStyle(Color.grayMain2c500) - .frame(width: 25, height: 25, alignment: .leading) - .padding(.all, 10) - .padding(.top, -75) - .padding(.leading, -10) - .onTapGesture { - withAnimation { - dismiss() + Menu { + Picker("", selection: $registerViewModel.dialPlanSelected) { + ForEach(Array(registerViewModel.dialPlansLabelList.enumerated()), id: \.offset) { index, dialPlan in + Text(dialPlan).tag(registerViewModel.dialPlansShortLabelList[index]) } } + } label: { + HStack { + Text(registerViewModel.dialPlanSelected) + + Image("caret-down") + .renderingMode(.template) + .resizable() + .foregroundStyle(Color.blue) + .frame(width: 15, height: 15) + } + } + .padding(.trailing, 5) + + Divider() + + TextField("Phone number", text: $registerViewModel.phoneNumber) + .default_text_style(styleSize: 15) + .disableAutocorrection(true) + .autocapitalization(.none) + .padding(.leading, 5) + .keyboardType(.numberPad) + } + .frame(height: 25) + .padding(.horizontal, 20) + .padding(.vertical, 15) + .cornerRadius(60) + .overlay( + RoundedRectangle(cornerRadius: 60) + .inset(by: 0.5) + .stroke(isPhoneNumberFocused ? Color.orangeMain500 : Color.gray200, lineWidth: 1) + ) + .padding(.bottom) + .focused($isPhoneNumberFocused) + + Text(String(localized: "password")+"*") + .default_text_style_700(styleSize: 15) + .padding(.bottom, -5) + + ZStack(alignment: .trailing) { + Group { + if isSecured { + SecureField("password", text: $registerViewModel.passwd) + .default_text_style(styleSize: 15) + .frame(height: 25) + .focused($isPasswordFocused) + } else { + TextField("password", text: $registerViewModel.passwd) + .default_text_style(styleSize: 15) + .disableAutocorrection(true) + .autocapitalization(.none) + .frame(height: 25) + .focused($isPasswordFocused) + } + } + + Button(action: { + isSecured.toggle() + }, label: { + Image(self.isSecured ? "eye-slash" : "eye") + .renderingMode(.template) + .resizable() + .foregroundStyle(Color.grayMain2c500) + .frame(width: 20, height: 20) + }) + } + .padding(.horizontal, 20) + .padding(.vertical, 15) + .cornerRadius(60) + .overlay( + RoundedRectangle(cornerRadius: 60) + .inset(by: 0.5) + .stroke(isPasswordFocused ? Color.orangeMain500 : Color.gray200, lineWidth: 1) + ) + .padding(.bottom) + + NavigationLink(isActive: $isLinkActive, destination: { + RegisterCodeConfirmationFragment(registerViewModel: registerViewModel) + }, label: { + Text("assistant_account_create") + .default_text_style_white_600(styleSize: 20) + .frame(height: 35) + .frame(maxWidth: .infinity) + + }) + .padding(.horizontal, 20) + .padding(.vertical, 10) + .background((registerViewModel.username.isEmpty || registerViewModel.phoneNumber.isEmpty || registerViewModel.passwd.isEmpty) ? Color.orangeMain100 : Color.orangeMain500) + .cornerRadius(60) + .disabled(!isLinkActive) + .padding(.bottom) + .simultaneousGesture( + TapGesture().onEnded { + if !(registerViewModel.username.isEmpty || registerViewModel.phoneNumber.isEmpty || registerViewModel.passwd.isEmpty) { + withAnimation { + self.isShowPopup = true + } + } + } + ) + + Spacer() + + Text("assistant_create_account_using_email_on_our_web_platform") + .default_text_style(styleSize: 15) + .foregroundStyle(Color.grayMain2c700) + .padding(.horizontal, 10) + .frame(maxWidth: .infinity, alignment: .center) + + Button(action: { + UIApplication.shared.open(URL(string: "https://subscribe.linphone.org/register/email")!) + }, label: { + Text("subscribe.linphone.org") + .default_text_style_orange_600(styleSize: 15) + .frame(height: 35) + }) + .padding(.horizontal, 15) + .padding(.vertical, 5) + .cornerRadius(60) + .overlay( + RoundedRectangle(cornerRadius: 60) + .inset(by: 0.5) + .stroke(Color.orangeMain500, lineWidth: 1) + ) + .padding(.bottom) + .frame(maxWidth: .infinity) + + Spacer() + + HStack(alignment: .center) { + + Spacer() + + Text("assistant_already_have_an_account") + .default_text_style(styleSize: 15) + .foregroundStyle(Color.grayMain2c700) + .padding(.horizontal, 10) + + Button(action: { + dismiss() + }, label: { + Text("Login") + .default_text_style_white_600(styleSize: 20) + .frame(height: 35) + }) + .padding(.horizontal, 20) + .padding(.vertical, 10) + .background(Color.orangeMain500) + .cornerRadius(60) + .padding(.horizontal, 10) Spacer() } - .padding(.leading) + .padding(.bottom) } - .frame(width: geometry.size.width) - - Text("Register") - .default_text_style_white_800(styleSize: 20) - .padding(.top, 20) + .frame(maxWidth: sharedMainViewModel.maxWidth) + .padding(.horizontal, 20) } - .padding(.top, 35) - .padding(.bottom, 10) - + .frame(minHeight: geometry.size.height) } + + if self.isShowPopup { + let titlePopup = Text("assistant_dialog_confirm_phone_number_title") + let contentPopup = Text(String(format: NSLocalizedString("assistant_dialog_confirm_phone_number_message", comment: ""), registerViewModel.phoneNumber)) + + PopupView( + isShowPopup: $isShowPopup, + title: titlePopup, + content: contentPopup, + titleFirstButton: Text("Cancel"), + actionFirstButton: { + self.isShowPopup = false + }, + titleSecondButton: Text("Continue"), + actionSecondButton: { + self.isShowPopup = false + self.isLinkActive = true + } + ) + .background(.black.opacity(0.65)) + .onTapGesture { + self.isShowPopup = false + } + } + } } .navigationTitle("") @@ -77,5 +304,5 @@ struct RegisterFragment: View { } #Preview { - RegisterFragment() + RegisterFragment(registerViewModel: RegisterViewModel()) } diff --git a/Linphone/UI/Assistant/Viewmodel/RegisterViewModel.swift b/Linphone/UI/Assistant/Viewmodel/RegisterViewModel.swift new file mode 100644 index 000000000..bebc94fa4 --- /dev/null +++ b/Linphone/UI/Assistant/Viewmodel/RegisterViewModel.swift @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-iphone + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import Foundation +import linphonesw + +class RegisterViewModel: ObservableObject { + + private var coreContext = CoreContext.shared + + @Published var username: String = "" + @Published var phoneNumber: String = "" + @Published var passwd: String = "" + @Published var domain: String = "sip.linphone.org" + @Published var displayName: String = "" + @Published var transportType: String = "TLS" + + @Published var dialPlanSelected: String = "🇫🇷 +33" + @Published var dialPlansList: [DialPlan] = [] + @Published var dialPlansLabelList: [String] = [] + @Published var dialPlansShortLabelList: [String] = [] + + init() { + getDialPlansList() + } + + func getDialPlansList() { + coreContext.doOnCoreQueue { core in + let dialPlans = Factory.Instance.dialPlans + dialPlans.forEach { dialPlan in + self.dialPlansList.append(dialPlan) + self.dialPlansLabelList.append( + "\(dialPlan.flag) \(dialPlan.country) | +\(dialPlan.countryCallingCode)" + ) + self.dialPlansShortLabelList.append( + "\(dialPlan.flag) +\(dialPlan.countryCallingCode)" + ) + } + } + } +}