From cd9d7982bccf61f0f2430b916bce5298204d7456 Mon Sep 17 00:00:00 2001 From: CMK Date: Thu, 4 Nov 2021 19:24:06 +0800 Subject: [PATCH] chore: display illustration in welcome scene --- .../xcschemes/xcschememanagement.plist | 19 +++-- .../MastodonRegisterViewController.swift | 71 ++++++++++++++++--- .../OnboardingViewControllerAppearance.swift | 6 +- 3 files changed, 77 insertions(+), 19 deletions(-) diff --git a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist index 1bf25c43..921a5219 100644 --- a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,17 +7,17 @@ AppShared.xcscheme_^#shared#^_ orderHint - 38 + 36 CoreDataStack.xcscheme_^#shared#^_ orderHint - 37 + 38 Mastodon - ASDK.xcscheme_^#shared#^_ orderHint - 3 + 4 Mastodon - RTL.xcscheme_^#shared#^_ @@ -27,7 +27,7 @@ Mastodon - Release.xcscheme_^#shared#^_ orderHint - 2 + 3 Mastodon - ar.xcscheme_^#shared#^_ @@ -37,18 +37,23 @@ Mastodon - ca.xcscheme_^#shared#^_ orderHint - 17 + 18 Mastodon - de.xcscheme_^#shared#^_ orderHint 12 - Mastodon - en.xcscheme_^#shared#^_ + Mastodon - double length.xcscheme_^#shared#^_ orderHint 1 + Mastodon - en.xcscheme_^#shared#^_ + + orderHint + 2 + Mastodon - es-419.xcscheme_^#shared#^_ orderHint @@ -117,7 +122,7 @@ ShareActionExtension.xcscheme_^#shared#^_ orderHint - 41 + 37 SuppressBuildableAutocreation diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift index 4cf4da14..8428aaa7 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift @@ -802,23 +802,48 @@ extension MastodonRegisterViewController { let password = viewModel.password.value let locale: String = { - let fallbackLanguageCode = Locale.current.languageCode ?? "en" + guard let url = Bundle.main.url(forResource: "local-codes", withExtension: "json"), + let data = try? Data(contentsOf: url), + let localCode = try? JSONDecoder().decode(MastodonLocalCode.self, from: data) + else { + assertionFailure() + return "en" + } + let fallbackLanguageCode: String = { + let code = Locale.current.languageCode ?? "en" + guard localCode[code] != nil else { return "en" } + return code + }() + + // pick device preferred language guard let identifier = Locale.preferredLanguages.first else { return fallbackLanguageCode } + // prepare languageCode and validate then return fallback if needs let local = Locale(identifier: identifier) - guard let languageCode = local.languageCode else { + guard let languageCode = local.languageCode, + localCode[languageCode] != nil + else { return fallbackLanguageCode } - switch languageCode { - case "zh": - // Check Simplified Chinese / Traditional Chinese - // https://github.com/gunchleoc/mastodon/blob/ed6153b8f24d3a8f5a124cc95683bd1f20aec882/app/helpers/settings_helper.rb - guard let regionCode = local.regionCode else { return languageCode } - return "zh" + "-" + regionCode - default: + // prepare extendCode and validate then return fallback if needs + let extendCodes: [String] = { + let locales = Locale.preferredLanguages.map { Locale(identifier: $0) } + return locales.compactMap { locale in + guard let languageCode = locale.languageCode, + let regionCode = locale.regionCode + else { return nil } + return languageCode + "-" + regionCode + } + }() + let _firstMatchExtendCode = extendCodes.first { code in + localCode[code] != nil + } + guard let firstMatchExtendCode = _firstMatchExtendCode else { return languageCode } + return firstMatchExtendCode + }() let query = Mastodon.API.Account.RegisterQuery( reason: viewModel.reason.value, @@ -828,6 +853,8 @@ extension MastodonRegisterViewController { agreement: true, // user confirmed in the server rules scene locale: locale ) + + var retryCount = 0 // register without show server rules context.apiService.accountRegister( @@ -835,6 +862,32 @@ extension MastodonRegisterViewController { query: query, authorization: viewModel.applicationAuthorization ) + .tryCatch { [weak self] error -> AnyPublisher, Error> in + guard let self = self else { throw error } + guard let error = self.viewModel.error.value as? Mastodon.API.Error, + case let .generic(errorEntity) = error.mastodonError, + errorEntity.error == "Validation failed: Locale is not included in the list" + else { + throw error + } + guard retryCount == 0 else { + throw error + } + let retryQuery = Mastodon.API.Account.RegisterQuery( + reason: query.reason, + username: query.username, + email: query.email, + password: query.password, + agreement: query.agreement, + locale: self.viewModel.instance.languages?.first ?? "en" + ) + retryCount += 1 + return self.context.apiService.accountRegister( + domain: self.viewModel.domain, + query: retryQuery, + authorization: self.viewModel.applicationAuthorization + ) + } .receive(on: DispatchQueue.main) .sink { [weak self] completion in guard let self = self else { return } diff --git a/Mastodon/Scene/Onboarding/Share/OnboardingViewControllerAppearance.swift b/Mastodon/Scene/Onboarding/Share/OnboardingViewControllerAppearance.swift index 4a4d04bf..17c4699e 100644 --- a/Mastodon/Scene/Onboarding/Share/OnboardingViewControllerAppearance.swift +++ b/Mastodon/Scene/Onboarding/Share/OnboardingViewControllerAppearance.swift @@ -80,8 +80,8 @@ extension OnboardingViewControllerAppearance { extension OnboardingViewControllerAppearance { static var viewEdgeMargin: CGFloat { guard UIDevice.current.userInterfaceIdiom == .pad else { return .zero } - - let shortEdgeWidth = min(UIScreen.main.bounds.height, UIScreen.main.bounds.width) - return shortEdgeWidth * 0.17 // magic + return 20 +// let shortEdgeWidth = min(UIScreen.main.bounds.height, UIScreen.main.bounds.width) +// return shortEdgeWidth * 0.17 // magic } }