Files
lockdown-iOS-mirror/LockdowniOS/Scenes/Questionnaire/ViewModel/SelectCountryViewModel.swift
Pavel Vilbik 8383a57f22 fixed title
2023-06-29 15:37:31 +03:00

55 lines
2.2 KiB
Swift

//
// SelectCountryViewModel.swift
// Lockdown
//
// Created by Pavel Vilbik on 27.06.23.
// Copyright © 2023 Confirmed Inc. All rights reserved.
//
import Foundation
class SelectCountryViewModel: BaseSelectCountryViewModel, SelectCountryViewModelProtocol {
var title: String {
NSLocalizedString("Select country", comment: "")
}
override func generateCountryList() -> [Country] {
if #available(iOS 16, *) {
return Locale.Region.isoRegions.filter { $0.subRegions.isEmpty } .map { region in
Country(
title: Locale.current.localizedString(forRegionCode: region.identifier) ?? "",
emojiSymbol: emojiFlag(for: region.identifier)
)
}.sorted { $0.title < $1.title }
} else {
return Locale.isoRegionCodes.map { identifier in
Country(
title: Locale.current.localizedString(forRegionCode: identifier) ?? "",
emojiSymbol: emojiFlag(for: identifier)
)
}.sorted { $0.title < $1.title }
}
}
private func emojiFlag(for countryCode: String) -> String! {
func isLowercaseASCIIScalar(_ scalar: Unicode.Scalar) -> Bool {
return scalar.value >= 0x61 && scalar.value <= 0x7A
}
func regionalIndicatorSymbol(for scalar: Unicode.Scalar) -> Unicode.Scalar {
precondition(isLowercaseASCIIScalar(scalar))
// 0x1F1E6 marks the start of the Regional Indicator Symbol range and corresponds to 'A'
// 0x61 marks the start of the lowercase ASCII alphabet: 'a'
return Unicode.Scalar(scalar.value + (0x1F1E6 - 0x61))!
}
let lowercasedCode = countryCode.lowercased()
guard lowercasedCode.count == 2 else { return nil }
guard lowercasedCode.unicodeScalars.reduce(true, { accum, scalar in accum && isLowercaseASCIIScalar(scalar) }) else { return nil }
let indicatorSymbols = lowercasedCode.unicodeScalars.map({ regionalIndicatorSymbol(for: $0) })
return String(indicatorSymbols.map({ Character($0) }))
}
}