diff --git a/Sources/App/DependencyRegistrator.swift b/Sources/App/DependencyRegistrator.swift index 9102274af7c0c37ce986b8aba6b2607a33cd66ca..2a886995871ac2b82dd2fb0c5e01b1b0187a71bb 100644 --- a/Sources/App/DependencyRegistrator.swift +++ b/Sources/App/DependencyRegistrator.swift @@ -185,7 +185,7 @@ struct DependencyRegistrator { container.register( RequestsCoordinator( - searchFactory: SearchController.init, + searchFactory: SearchContainerController.init, contactFactory: ContactController.init(_:), singleChatFactory: SingleChatController.init(_:), groupChatFactory: GroupChatController.init(_:), @@ -197,7 +197,7 @@ struct DependencyRegistrator { OnboardingCoordinator( emailFactory: OnboardingEmailController.init, phoneFactory: OnboardingPhoneController.init, - searchFactory: SearchController.init, + searchFactory: SearchContainerController.init, welcomeFactory: OnboardingWelcomeController.init, chatListFactory: ChatListController.init, usernameFactory: OnboardingUsernameController.init(_:), @@ -211,7 +211,7 @@ struct DependencyRegistrator { container.register( ContactListCoordinator( scanFactory: ScanContainerController.init, - searchFactory: SearchController.init, + searchFactory: SearchContainerController.init, newGroupFactory: CreateGroupController.init, requestsFactory: RequestsContainerController.init, contactFactory: ContactController.init(_:), @@ -235,7 +235,7 @@ struct DependencyRegistrator { container.register( ChatListCoordinator( scanFactory: ScanContainerController.init, - searchFactory: SearchController.init, + searchFactory: SearchContainerController.init, newGroupFactory: CreateGroupController.init, contactsFactory: ContactListController.init, contactFactory: ContactController.init(_:), diff --git a/Sources/ScanFeature/Views/ScanContainerView.swift b/Sources/ScanFeature/Views/ScanContainerView.swift index b9b35cef12d02a3a8ea88ead84692938e31ed773..7e5eeee37a1a32765a33735ec8e1c65a05473dd5 100644 --- a/Sources/ScanFeature/Views/ScanContainerView.swift +++ b/Sources/ScanFeature/Views/ScanContainerView.swift @@ -3,7 +3,7 @@ import Shared final class ScanContainerView: UIView { let scrollView = UIScrollView() - let segmentedControl = SegmentedControl() + let segmentedControl = ScanSegmentedControl() init() { super.init(frame: .zero) diff --git a/Sources/ScanFeature/Views/SegmentedControl.swift b/Sources/ScanFeature/Views/ScanSegmentedControl.swift similarity index 93% rename from Sources/ScanFeature/Views/SegmentedControl.swift rename to Sources/ScanFeature/Views/ScanSegmentedControl.swift index 11faf5a55448b39530fc66a71610a8b49852dfd0..f3fd72acf3326b05b8057e5a9fe0948aa113688c 100644 --- a/Sources/ScanFeature/Views/SegmentedControl.swift +++ b/Sources/ScanFeature/Views/ScanSegmentedControl.swift @@ -2,15 +2,15 @@ import UIKit import Shared import SnapKit -final class SegmentedControl: UIView { +final class ScanSegmentedControl: UIView { private let trackHeight = 2.0 private let numberOfTabs = 2.0 private let trackView = UIView() private let stackView = UIStackView() private var leftConstraint: Constraint? private let trackIndicatorView = UIView() - private(set) var leftButton = SegmentedControlButton() - private(set) var rightButton = SegmentedControlButton() + private(set) var leftButton = ScanSegmentedControlButton() + private(set) var rightButton = ScanSegmentedControlButton() init() { super.init(frame: .zero) diff --git a/Sources/ScanFeature/Views/SegmentedControlButton.swift b/Sources/ScanFeature/Views/ScanSegmentedControlButton.swift similarity index 95% rename from Sources/ScanFeature/Views/SegmentedControlButton.swift rename to Sources/ScanFeature/Views/ScanSegmentedControlButton.swift index c23f16c1539338457198024f84216ffffdca1590..b9e711c614b239dfb55158c530adbe121f0ca691 100644 --- a/Sources/ScanFeature/Views/SegmentedControlButton.swift +++ b/Sources/ScanFeature/Views/ScanSegmentedControlButton.swift @@ -1,7 +1,7 @@ import UIKit import Shared -final class SegmentedControlButton: UIControl { +final class ScanSegmentedControlButton: UIControl { private let titleLabel = UILabel() private let imageView = UIImageView() diff --git a/Sources/SearchFeature/Controllers/SearchContainerController.swift b/Sources/SearchFeature/Controllers/SearchContainerController.swift new file mode 100644 index 0000000000000000000000000000000000000000..f42bb1ad0dd5d18fdaac51d5cc831e7b0d918ecf --- /dev/null +++ b/Sources/SearchFeature/Controllers/SearchContainerController.swift @@ -0,0 +1,48 @@ +import UIKit +import Theme +import Shared +import DependencyInjection + +public final class SearchContainerController: UIViewController { + @Dependency private var statusBarController: StatusBarStyleControlling + + lazy private var screenView = SearchContainerView() + + public override func loadView() { + view = screenView + } + + public override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + statusBarController.style.send(.darkContent) + + navigationController?.navigationBar.customize( + backgroundColor: Asset.neutralWhite.color + ) + } + + public override func viewDidLoad() { + super.viewDidLoad() + setupNavigationBar() + } + + private func setupNavigationBar() { + navigationItem.backButtonTitle = " " + + let titleLabel = UILabel() + titleLabel.text = Localized.Ud.title + titleLabel.textColor = Asset.neutralActive.color + titleLabel.font = Fonts.Mulish.semiBold.font(size: 18.0) + + let backButton = UIButton.back() + backButton.addTarget(self, action: #selector(didTapBack), for: .touchUpInside) + + navigationItem.leftBarButtonItem = UIBarButtonItem( + customView: UIStackView(arrangedSubviews: [backButton, titleLabel]) + ) + } + + @objc private func didTapBack() { + navigationController?.popViewController(animated: true) + } +} diff --git a/Sources/SearchFeature/Controllers/SearchController.swift b/Sources/SearchFeature/Controllers/SearchController.swift index 795c60009cb827d2aacca5d3e27eb89e7114b26b..809682d6d1a8f2a7225406aa4563f9a726170d91 100644 --- a/Sources/SearchFeature/Controllers/SearchController.swift +++ b/Sources/SearchFeature/Controllers/SearchController.swift @@ -11,7 +11,7 @@ import DrawerFeature import DependencyInjection import ScrollViewController -public final class SearchController: UIViewController { +final class SearchController: UIViewController { @KeyObject(.email, defaultValue: nil) var email: String? @KeyObject(.phone, defaultValue: nil) var phone: String? @KeyObject(.sharingEmail, defaultValue: false) var isSharingEmail: Bool @@ -19,26 +19,25 @@ public final class SearchController: UIViewController { @Dependency private var hud: HUDType @Dependency private var coordinator: SearchCoordinating - @Dependency private var statusBarController: StatusBarStyleControlling lazy private var tableController = SearchTableController(viewModel) lazy private var screenView = SearchView { let actionButton = CapsuleButton() actionButton.set( style: .seeThrough, - title: Localized.ContactSearch.Placeholder.Drawer.action + title: Localized.Ud.Placeholder.Drawer.action ) let drawer = DrawerController(with: [ DrawerText( font: Fonts.Mulish.bold.font(size: 26.0), - text: Localized.ContactSearch.Placeholder.Drawer.title, + text: Localized.Ud.Placeholder.Drawer.title, color: Asset.neutralActive.color, alignment: .left, spacingAfter: 19 ), DrawerLinkText( - text: Localized.ContactSearch.Placeholder.Drawer.subtitle, + text: Localized.Ud.Placeholder.Drawer.subtitle, urlString: "https://links.xx.network/adrp", spacingAfter: 37 ), @@ -64,26 +63,16 @@ public final class SearchController: UIViewController { private var cancellables = Set<AnyCancellable>() private var drawerCancellables = Set<AnyCancellable>() - public override func loadView() { + override func loadView() { view = screenView } - public override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - statusBarController.style.send(.darkContent) - - navigationController?.navigationBar.customize( - backgroundColor: Asset.neutralWhite.color, - shadowColor: Asset.neutralDisabled.color - ) - } - - public override func viewDidAppear(_ animated: Bool) { + override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) viewModel.didAppear() } - public override func viewDidLoad() { + override func viewDidLoad() { super.viewDidLoad() setupNavigationBar() setupTableView() @@ -110,7 +99,7 @@ public final class SearchController: UIViewController { navigationItem.backButtonTitle = " " let titleLabel = UILabel() - titleLabel.text = Localized.ContactSearch.title + titleLabel.text = Localized.Ud.title titleLabel.textColor = Asset.neutralActive.color titleLabel.font = Fonts.Mulish.semiBold.font(size: 18.0) @@ -231,7 +220,7 @@ public final class SearchController: UIViewController { navigationController?.popViewController(animated: true) } - public func tableView(_: UITableView, didSelectRowAt indexPath: IndexPath) { + func tableView(_: UITableView, didSelectRowAt indexPath: IndexPath) { let contact = viewModel.itemsRelay.value[indexPath.row] guard contact.authStatus == .stranger else { @@ -253,7 +242,7 @@ extension SearchController { let drawerTitle = DrawerText( font: Fonts.Mulish.extraBold.font(size: 26.0), - text: Localized.ContactSearch.RequestDrawer.title, + text: Localized.Ud.RequestDrawer.title, color: Asset.neutralDark.color, spacingAfter: 20 ) @@ -288,7 +277,7 @@ extension SearchController { if let email = email { let drawerEmail = DrawerSwitch( - title: Localized.ContactSearch.RequestDrawer.email, + title: Localized.Ud.RequestDrawer.email, content: email, spacingAfter: phone != nil ? 23 : 31, isInitiallyOn: isSharingEmail @@ -304,7 +293,7 @@ extension SearchController { if let phone = phone { let drawerPhone = DrawerSwitch( - title: Localized.ContactSearch.RequestDrawer.phone, + title: Localized.Ud.RequestDrawer.phone, content: "\(Country.findFrom(phone).prefix) \(phone.dropLast(2))", spacingAfter: 31, isInitiallyOn: isSharingPhone @@ -320,14 +309,14 @@ extension SearchController { let drawerSendButton = DrawerCapsuleButton( model: .init( - title: Localized.ContactSearch.RequestDrawer.send, + title: Localized.Ud.RequestDrawer.send, style: .brandColored ), spacingAfter: 5 ) let drawerCancelButton = DrawerCapsuleButton( model: .init( - title: Localized.ContactSearch.RequestDrawer.cancel, + title: Localized.Ud.RequestDrawer.cancel, style: .simplestColoredBrand ), spacingAfter: 5 ) @@ -423,14 +412,14 @@ extension SearchController { let drawerTitle = DrawerText( font: Fonts.Mulish.extraBold.font(size: 26.0), - text: Localized.ContactSearch.NicknameDrawer.title, + text: Localized.Ud.NicknameDrawer.title, color: Asset.neutralDark.color, spacingAfter: 20 ) let drawerSubtitle = DrawerText( font: Fonts.Mulish.regular.font(size: 16.0), - text: Localized.ContactSearch.NicknameDrawer.subtitle, + text: Localized.Ud.NicknameDrawer.subtitle, color: Asset.neutralDark.color, spacingAfter: 20 ) @@ -454,7 +443,7 @@ extension SearchController { let drawerSaveButton = DrawerCapsuleButton( model: .init( - title: Localized.ContactSearch.NicknameDrawer.save, + title: Localized.Ud.NicknameDrawer.save, style: .brandColored ), spacingAfter: 5 ) diff --git a/Sources/SearchFeature/Views/SearchContainerView.swift b/Sources/SearchFeature/Views/SearchContainerView.swift new file mode 100644 index 0000000000000000000000000000000000000000..5b3509055302c958da178a02c9b7dd12a1ea385e --- /dev/null +++ b/Sources/SearchFeature/Views/SearchContainerView.swift @@ -0,0 +1,28 @@ +import UIKit +import Shared + +final class SearchContainerView: UIView { + let scrollView = UIScrollView() + let segmentedControl = SearchSegmentedControl() + + init() { + super.init(frame: .zero) + + backgroundColor = Asset.neutralWhite.color + addSubview(segmentedControl) + addSubview(scrollView) + + scrollView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + segmentedControl.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide).offset(10) + $0.left.equalToSuperview() + $0.right.equalToSuperview() + $0.height.equalTo(60) + } + } + + required init?(coder: NSCoder) { nil } +} diff --git a/Sources/SearchFeature/Views/SearchPlaceholderView.swift b/Sources/SearchFeature/Views/SearchPlaceholderView.swift index e6697688f13ab4b13c023f9e8579f081ff00be44..84ae459286df757555853e8fd4eb7369c323d476 100644 --- a/Sources/SearchFeature/Views/SearchPlaceholderView.swift +++ b/Sources/SearchFeature/Views/SearchPlaceholderView.swift @@ -60,6 +60,6 @@ final class SearchEmptyView: UIView { required init?(coder: NSCoder) { nil } func set(filter: String) { - title.text = Localized.ContactSearch.noneFound(filter) + title.text = Localized.Ud.noneFound(filter) } } diff --git a/Sources/SearchFeature/Views/SearchSegmentedButton.swift b/Sources/SearchFeature/Views/SearchSegmentedButton.swift new file mode 100644 index 0000000000000000000000000000000000000000..1142ead739213297ceeff7fdd80e19b5a814d317 --- /dev/null +++ b/Sources/SearchFeature/Views/SearchSegmentedButton.swift @@ -0,0 +1,42 @@ +import UIKit +import Shared + +final class SearchSegmentedButton: UIControl { + let titleLabel = UILabel() + let imageView = UIImageView() + + init() { + super.init(frame: .zero) + + imageView.contentMode = .center + titleLabel.textAlignment = .center + titleLabel.textColor = Asset.neutralWhite.color + titleLabel.font = Fonts.Mulish.semiBold.font(size: 13.0) + + addSubview(titleLabel) + addSubview(imageView) + + imageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(7.5) + $0.centerX.equalToSuperview() + } + + titleLabel.snp.makeConstraints { + $0.top.equalTo(imageView.snp.bottom).offset(2) + $0.centerX.equalToSuperview() + $0.bottom.equalToSuperview().offset(-7.5) + } + } + + required init?(coder: NSCoder) { nil } + + func setup(title: String, icon: UIImage) { + titleLabel.text = title + imageView.image = icon + } + + func update(color: UIColor) { + imageView.tintColor = color + titleLabel.textColor = color + } +} diff --git a/Sources/SearchFeature/Views/SearchSegmentedControl.swift b/Sources/SearchFeature/Views/SearchSegmentedControl.swift new file mode 100644 index 0000000000000000000000000000000000000000..af0e4271cf53e611fcd604f4410f3d3b812fad33 --- /dev/null +++ b/Sources/SearchFeature/Views/SearchSegmentedControl.swift @@ -0,0 +1,120 @@ +import UIKit +import Shared +import SnapKit + +final class SearchSegmentedControl: UIView { + private let trackView = UIView() + private let stackView = UIStackView() + private var leftConstraint: Constraint? + private let trackIndicatorView = UIView() + private(set) var usernameButton = SearchSegmentedButton() + private(set) var emailButton = SearchSegmentedButton() + private(set) var phoneButton = SearchSegmentedButton() + private(set) var qrCodeButton = SearchSegmentedButton() + + init() { + super.init(frame: .zero) + trackView.backgroundColor = Asset.neutralLine.color + trackIndicatorView.backgroundColor = Asset.brandPrimary.color + + qrCodeButton.titleLabel.text = Localized.Ud.Tab.qr + emailButton.titleLabel.text = Localized.Ud.Tab.email + phoneButton.titleLabel.text = Localized.Ud.Tab.phone + usernameButton.titleLabel.text = Localized.Ud.Tab.username + + usernameButton.titleLabel.textColor = Asset.brandPrimary.color + emailButton.titleLabel.textColor = Asset.neutralDisabled.color + phoneButton.titleLabel.textColor = Asset.neutralDisabled.color + qrCodeButton.titleLabel.textColor = Asset.neutralDisabled.color + + usernameButton.imageView.tintColor = Asset.brandPrimary.color + emailButton.imageView.tintColor = Asset.neutralDisabled.color + phoneButton.imageView.tintColor = Asset.neutralDisabled.color + qrCodeButton.imageView.tintColor = Asset.neutralDisabled.color + + qrCodeButton.imageView.image = Asset.searchTabQr.image + emailButton.imageView.image = Asset.searchTabEmail.image + phoneButton.imageView.image = Asset.searchTabPhone.image + usernameButton.imageView.image = Asset.searchTabUsername.image + + stackView.addArrangedSubview(usernameButton) + stackView.addArrangedSubview(emailButton) + stackView.addArrangedSubview(phoneButton) + stackView.addArrangedSubview(qrCodeButton) + stackView.distribution = .fillEqually + stackView.backgroundColor = Asset.neutralWhite.color + + addSubview(stackView) + addSubview(trackView) + trackView.addSubview(trackIndicatorView) + + stackView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + trackView.snp.makeConstraints { + $0.left.equalToSuperview() + $0.right.equalToSuperview() + $0.bottom.equalToSuperview() + $0.height.equalTo(2) + } + + trackIndicatorView.snp.makeConstraints { + $0.top.equalToSuperview() + leftConstraint = $0.left.equalToSuperview().constraint + $0.width.equalToSuperview().dividedBy(4) + $0.bottom.equalToSuperview() + } + } + + required init?(coder: NSCoder) { nil } + + func updateSwipePercentage(_ percentageScrolled: CGFloat) { + let amountOfTabs = 4.0 + let tabWidth = bounds.width / amountOfTabs + let leftOffset = percentageScrolled * tabWidth + + leftConstraint?.update(offset: leftOffset) + + let usernamePercentage = percentageScrolled > 1 ? 1 : percentageScrolled + let phonePercentage = percentageScrolled <= 1 ? 0 : percentageScrolled - 1 + let emailPercentage = percentageScrolled > 1 ? 1 - (percentageScrolled-1) : percentageScrolled + let qrPercentage = percentageScrolled > 1 ? 1 - (percentageScrolled-1) : percentageScrolled + + let usernameColor = UIColor.fade( + from: Asset.brandPrimary.color, + to: Asset.neutralDisabled.color, + pcent: usernamePercentage + ) + + let emailColor = UIColor.fade( + from: Asset.neutralDisabled.color, + to: Asset.brandPrimary.color, + pcent: emailPercentage + ) + + let phoneColor = UIColor.fade( + from: Asset.neutralDisabled.color, + to: Asset.brandPrimary.color, + pcent: phonePercentage + ) + + let qrColor = UIColor.fade( + from: Asset.brandPrimary.color, + to: Asset.neutralDisabled.color, + pcent: qrPercentage + ) + + usernameButton.imageView.tintColor = usernameColor + usernameButton.titleLabel.textColor = usernameColor + + emailButton.imageView.tintColor = emailColor + emailButton.titleLabel.textColor = emailColor + + phoneButton.imageView.tintColor = phoneColor + phoneButton.titleLabel.textColor = phoneColor + + qrCodeButton.imageView.tintColor = qrColor + qrCodeButton.titleLabel.textColor = qrColor + } +} diff --git a/Sources/SearchFeature/Views/SearchView.swift b/Sources/SearchFeature/Views/SearchView.swift index 86f929b1000aca396cd1fd8c63de372ff399472f..e4b6b63844aea298d89a881a7d529a5e0ea002d5 100644 --- a/Sources/SearchFeature/Views/SearchView.swift +++ b/Sources/SearchFeature/Views/SearchView.swift @@ -4,9 +4,9 @@ import InputField final class SearchView: UIView { private enum Constants { - static let phone = Localized.ContactSearch.Filter.phone - static let email = Localized.ContactSearch.Filter.email - static let username = Localized.ContactSearch.Filter.username + static let phone = Localized.Ud.Tab.phone + static let email = Localized.Ud.Tab.email + static let username = Localized.Ud.Tab.username } let input = InputField() @@ -66,7 +66,7 @@ final class SearchView: UIView { backgroundColor = Asset.neutralWhite.color input.setup( - placeholder: Localized.ContactSearch.title, + placeholder: Localized.Ud.title, leftView: .image(Asset.lens.image.withTintColor(Asset.neutralDisabled.color)), accessibility: Localized.Accessibility.Search.input, allowsEmptySpace: false, diff --git a/Sources/Shared/AutoGenerated/Assets.swift b/Sources/Shared/AutoGenerated/Assets.swift index 2b2248fb83ad430ec95d9378a5d5762e8d74c046..0f3b9d9280e9df670205e4f58eb7adc194456358 100644 --- a/Sources/Shared/AutoGenerated/Assets.swift +++ b/Sources/Shared/AutoGenerated/Assets.swift @@ -113,6 +113,10 @@ public enum Asset { public static let searchLens = ImageAsset(name: "search_lens") public static let searchPhone = ImageAsset(name: "search_phone") public static let searchPlaceholderImage = ImageAsset(name: "search_placeholder_image") + public static let searchTabEmail = ImageAsset(name: "search_tab_email") + public static let searchTabPhone = ImageAsset(name: "search_tab_phone") + public static let searchTabQr = ImageAsset(name: "search_tab_qr") + public static let searchTabUsername = ImageAsset(name: "search_tab_username") public static let searchUsername = ImageAsset(name: "search_username") public static let icon32 = ImageAsset(name: "Icon-32") public static let settingsAdvanced = ImageAsset(name: "settings_advanced") diff --git a/Sources/Shared/AutoGenerated/Strings.swift b/Sources/Shared/AutoGenerated/Strings.swift index 07f2cee03ff185b2bd7f9fd768d00758302c74a2..a7b424f76629a0d52e217855b372e1a332da30c3 100644 --- a/Sources/Shared/AutoGenerated/Strings.swift +++ b/Sources/Shared/AutoGenerated/Strings.swift @@ -534,57 +534,6 @@ public enum Localized { } } - public enum ContactSearch { - /// There are no users with that %@. - public static func noneFound(_ p1: Any) -> String { - return Localized.tr("Localizable", "contactSearch.noneFound", String(describing: p1)) - } - /// User - public static let sectionTitle = Localized.tr("Localizable", "contactSearch.sectionTitle") - /// Search - public static let title = Localized.tr("Localizable", "contactSearch.title") - public enum Filter { - /// Email - public static let email = Localized.tr("Localizable", "contactSearch.filter.email") - /// Phone - public static let phone = Localized.tr("Localizable", "contactSearch.filter.phone") - /// Username - public static let username = Localized.tr("Localizable", "contactSearch.filter.username") - } - public enum NicknameDrawer { - /// Save - public static let save = Localized.tr("Localizable", "contactSearch.nicknameDrawer.save") - /// Edit your new contact’s nickname so you know who they are. - public static let subtitle = Localized.tr("Localizable", "contactSearch.nicknameDrawer.subtitle") - /// Add a nickname - public static let title = Localized.tr("Localizable", "contactSearch.nicknameDrawer.title") - } - public enum Placeholder { - /// Searching is private by nature. The network cannot identify who a search request came from. - public static let title = Localized.tr("Localizable", "contactSearch.placeholder.title") - public enum Drawer { - /// Got it - public static let action = Localized.tr("Localizable", "contactSearch.placeholder.drawer.action") - /// You can search for users by their username, email, or phone number using the xx network’s #Anonymous Data Retrieval protocol# which keeps a user’s identity anonymous while requesting data. All sent requests contain salted hashes of what you are searching for. Raw data on emails, usernames, and phone numbers do not leave your phone. - public static let subtitle = Localized.tr("Localizable", "contactSearch.placeholder.drawer.subtitle") - /// Search - public static let title = Localized.tr("Localizable", "contactSearch.placeholder.drawer.title") - } - } - public enum RequestDrawer { - /// Cancel - public static let cancel = Localized.tr("Localizable", "contactSearch.requestDrawer.cancel") - /// EMAIL ADDRESS - public static let email = Localized.tr("Localizable", "contactSearch.requestDrawer.email") - /// PHONE NUMBER - public static let phone = Localized.tr("Localizable", "contactSearch.requestDrawer.phone") - /// Send Contact Request - public static let send = Localized.tr("Localizable", "contactSearch.requestDrawer.send") - /// Request Contact - public static let title = Localized.tr("Localizable", "contactSearch.requestDrawer.title") - } - } - public enum Countries { /// Country Code public static let title = Localized.tr("Localizable", "countries.title") @@ -1231,6 +1180,59 @@ public enum Localized { } } + public enum Ud { + /// There are no users with that %@. + public static func noneFound(_ p1: Any) -> String { + return Localized.tr("Localizable", "ud.noneFound", String(describing: p1)) + } + /// User + public static let sectionTitle = Localized.tr("Localizable", "ud.sectionTitle") + /// Search + public static let title = Localized.tr("Localizable", "ud.title") + public enum NicknameDrawer { + /// Save + public static let save = Localized.tr("Localizable", "ud.nicknameDrawer.save") + /// Edit your new contact’s nickname so you know who they are. + public static let subtitle = Localized.tr("Localizable", "ud.nicknameDrawer.subtitle") + /// Add a nickname + public static let title = Localized.tr("Localizable", "ud.nicknameDrawer.title") + } + public enum Placeholder { + /// Searching is private by nature. The network cannot identify who a search request came from. + public static let title = Localized.tr("Localizable", "ud.placeholder.title") + public enum Drawer { + /// Got it + public static let action = Localized.tr("Localizable", "ud.placeholder.drawer.action") + /// You can search for users by their username, email, or phone number using the xx network’s #Anonymous Data Retrieval protocol# which keeps a user’s identity anonymous while requesting data. All sent requests contain salted hashes of what you are searching for. Raw data on emails, usernames, and phone numbers do not leave your phone. + public static let subtitle = Localized.tr("Localizable", "ud.placeholder.drawer.subtitle") + /// Search + public static let title = Localized.tr("Localizable", "ud.placeholder.drawer.title") + } + } + public enum RequestDrawer { + /// Cancel + public static let cancel = Localized.tr("Localizable", "ud.requestDrawer.cancel") + /// EMAIL ADDRESS + public static let email = Localized.tr("Localizable", "ud.requestDrawer.email") + /// PHONE NUMBER + public static let phone = Localized.tr("Localizable", "ud.requestDrawer.phone") + /// Send Contact Request + public static let send = Localized.tr("Localizable", "ud.requestDrawer.send") + /// Request Contact + public static let title = Localized.tr("Localizable", "ud.requestDrawer.title") + } + public enum Tab { + /// Email + public static let email = Localized.tr("Localizable", "ud.tab.email") + /// Phone + public static let phone = Localized.tr("Localizable", "ud.tab.phone") + /// QR Code + public static let qr = Localized.tr("Localizable", "ud.tab.qr") + /// Username + public static let username = Localized.tr("Localizable", "ud.tab.username") + } + } + public enum Validator { public enum Code { /// Code length should be at least 4 chars diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Contents.json b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..d9a97df899595ebc48148baa9cbedb9be8f763fa --- /dev/null +++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "Icon.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Icon.pdf b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Icon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..488ddd5591377db8b2e8c7e3199c76dfe643394f --- /dev/null +++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Icon.pdf @@ -0,0 +1,87 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 3.000000 4.599121 cm +0.809948 0.827749 0.850000 scn +16.199999 0.000879 m +1.800000 0.000879 l +0.805887 0.000879 0.000000 0.806765 0.000000 1.800879 c +0.000000 12.679177 l +0.041948 13.642586 0.835680 14.401790 1.800000 14.400878 c +16.199999 14.400878 l +17.194113 14.400878 18.000000 13.594990 18.000000 12.600878 c +18.000000 1.800879 l +18.000000 0.806765 17.194113 0.000879 16.199999 0.000879 c +h +1.800000 10.919678 m +1.800000 1.800878 l +16.199999 1.800878 l +16.199999 10.919678 l +9.000000 6.120877 l +1.800000 10.919678 l +h +2.520000 12.600878 m +9.000000 8.280877 l +15.480000 12.600878 l +2.520000 12.600878 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 681 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000000771 00000 n +0000000793 00000 n +0000000966 00000 n +0000001040 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +1099 +%%EOF \ No newline at end of file diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Contents.json b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..d9a97df899595ebc48148baa9cbedb9be8f763fa --- /dev/null +++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "Icon.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Icon.pdf b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Icon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e53e9789a38f9a7ffb48759a3c5c0e8c23dbd900 --- /dev/null +++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Icon.pdf @@ -0,0 +1,202 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 3.000000 0.831543 cm +0.809948 0.827749 0.850000 scn +5.310195 13.179303 m +4.370402 13.521046 l +4.207593 13.073322 l +4.452703 12.664807 l +5.310195 13.179303 l +h +5.934925 14.897307 m +5.006448 15.268698 l +5.000554 15.253963 l +4.995131 15.239050 l +5.934925 14.897307 l +h +6.052061 16.107719 m +7.032641 16.303835 l +7.027975 16.327169 l +7.022203 16.350256 l +6.052061 16.107719 l +h +5.036876 20.168457 m +6.007019 20.410994 l +5.787323 21.289776 l +4.891161 21.157784 l +5.036876 20.168457 l +h +0.000000 19.426592 m +-0.145715 20.415918 l +-1.053928 20.282150 l +-0.998153 19.365835 l +0.000000 19.426592 l +h +5.310195 7.517696 m +4.598751 6.814928 l +4.603089 6.810590 l +5.310195 7.517696 l +h +17.414316 2.168457 m +17.363102 1.169769 l +18.311787 1.121119 l +18.409060 2.066057 l +17.414316 2.168457 l +h +17.960955 7.478652 m +18.955698 7.376251 l +19.046246 8.255862 l +18.184332 8.453384 l +17.960955 7.478652 l +h +14.212583 8.337654 m +14.435959 9.312387 l +14.413817 9.317461 l +14.391468 9.321525 l +14.212583 8.337654 l +h +12.963124 8.181472 m +13.363943 7.265314 l +13.387419 7.275585 l +13.410338 7.287045 l +12.963124 8.181472 l +h +11.088938 7.361515 m +10.574442 6.504023 l +11.016961 6.238511 l +11.489756 6.445358 l +11.088938 7.361515 l +h +6.249989 12.837560 m +6.874718 14.555564 l +4.995131 15.239050 l +4.370402 13.521046 l +6.249989 12.837560 l +h +6.863401 14.525917 m +7.089864 15.092072 7.149697 15.718555 7.032641 16.303835 c +5.071480 15.911604 l +5.110607 15.715972 5.092350 15.483454 5.006448 15.268698 c +6.863401 14.525917 l +h +7.022203 16.350256 m +6.007019 20.410994 l +4.066734 19.925920 l +5.081918 15.865184 l +7.022203 16.350256 l +h +4.891161 21.157784 m +-0.145715 20.415918 l +0.145715 18.437265 l +5.182591 19.179131 l +4.891161 21.157784 l +h +-0.998153 19.365835 m +-0.710203 14.635235 1.265032 10.189831 4.598764 6.814941 c +6.021627 8.220452 l +3.029979 11.249034 1.256841 15.237471 0.998153 19.487349 c +-0.998153 19.365835 l +h +4.603089 6.810590 m +8.022314 3.391365 12.552481 1.416468 17.363102 1.169769 c +17.465532 3.167145 l +13.139493 3.388992 9.079639 5.162467 6.017303 8.224804 c +4.603089 6.810590 l +h +18.409060 2.066057 m +18.955698 7.376251 l +16.966211 7.581052 l +16.419573 2.270857 l +18.409060 2.066057 l +h +18.184332 8.453384 m +14.435959 9.312387 l +13.989206 7.362922 l +17.737579 6.503920 l +18.184332 8.453384 l +h +14.391468 9.321525 m +13.786641 9.431493 13.131458 9.383673 12.515911 9.075899 c +13.410338 7.287045 l +13.575702 7.369726 13.779521 7.399999 14.033697 7.353785 c +14.391468 9.321525 l +h +12.562305 9.097629 m +10.688119 8.277673 l +11.489756 6.445358 l +13.363943 7.265314 l +12.562305 9.097629 l +h +11.603433 8.219008 m +10.504310 8.878483 9.475373 9.686473 8.555264 10.606584 c +7.141050 9.192369 l +8.173217 8.160202 9.330832 7.250189 10.574442 6.504023 c +11.603433 8.219008 l +h +8.555264 10.606584 m +7.605314 11.556533 6.834208 12.582933 6.167688 13.693798 c +4.452703 12.664807 l +5.191823 11.432940 6.060631 10.272789 7.141050 9.192369 c +8.555264 10.606584 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 3012 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000003102 00000 n +0000003125 00000 n +0000003298 00000 n +0000003372 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +3431 +%%EOF \ No newline at end of file diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Contents.json b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..d9a97df899595ebc48148baa9cbedb9be8f763fa --- /dev/null +++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "Icon.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Icon.pdf b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Icon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8ff4fc0bf67f1a731cc8516ce77a2de344bc843c --- /dev/null +++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Icon.pdf @@ -0,0 +1,189 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 5.000000 12.871094 cm +0.809948 0.827749 0.850000 scn +5.685554 6.128906 m +0.435554 6.128906 l +0.378356 6.128906 0.321724 6.117636 0.268880 6.095747 c +0.216036 6.073858 0.168026 6.041771 0.127580 6.001326 c +0.087135 5.960881 0.055048 5.912870 0.033159 5.860026 c +0.011270 5.807182 0.000000 5.750551 0.000000 5.693353 c +0.000000 0.443353 l +-0.000018 0.327108 0.045616 0.215499 0.127082 0.132578 c +0.208548 0.049657 0.319328 0.002053 0.435554 0.000013 c +5.685554 0.000013 l +5.802508 0.002013 5.914114 0.049368 5.996826 0.132080 c +6.079538 0.214792 6.126893 0.326398 6.128893 0.443353 c +6.128893 5.693353 l +6.126853 5.809579 6.079249 5.920358 5.996328 6.001824 c +5.913407 6.083291 5.801798 6.128924 5.685554 6.128906 c +h +4.371108 1.757799 m +1.750000 1.757799 l +1.750000 4.378906 l +4.371108 4.378906 l +4.371108 1.757799 l +h +f +n +Q +q +1.000000 0.000000 -0.000000 1.000000 5.000000 5.000000 cm +0.809948 0.827749 0.850000 scn +5.685554 6.128906 m +0.435554 6.128906 l +0.319328 6.126867 0.208548 6.079262 0.127082 5.996341 c +0.045616 5.913420 -0.000018 5.801811 0.000000 5.685567 c +0.000000 0.435567 l +0.000000 0.378369 0.011270 0.321738 0.033159 0.268894 c +0.055048 0.216050 0.087135 0.168039 0.127580 0.127594 c +0.168026 0.087149 0.216036 0.055061 0.268880 0.033173 c +0.321724 0.011284 0.378356 0.000013 0.435554 0.000013 c +5.685554 0.000013 l +5.801798 -0.000004 5.913407 0.045629 5.996328 0.127095 c +6.079249 0.208562 6.126853 0.319341 6.128893 0.435567 c +6.128893 5.685567 l +6.126893 5.802522 6.079538 5.914128 5.996826 5.996840 c +5.914114 6.079551 5.802508 6.126906 5.685554 6.128906 c +h +4.371108 1.750013 m +1.750000 1.750013 l +1.750000 4.371121 l +4.371108 4.371121 l +4.371108 1.750013 l +h +f +n +Q +q +1.000000 0.000000 -0.000000 1.000000 12.871094 12.871094 cm +0.809948 0.827749 0.850000 scn +5.693339 6.128906 m +0.443339 6.128906 l +0.327095 6.128924 0.215486 6.083291 0.132565 6.001824 c +0.049644 5.920358 0.002039 5.809579 0.000000 5.693353 c +0.000000 0.443353 l +0.002000 0.326398 0.049355 0.214792 0.132067 0.132080 c +0.214778 0.049368 0.326384 0.002013 0.443339 0.000013 c +5.693339 0.000013 l +5.809565 0.002053 5.920344 0.049657 6.001811 0.132578 c +6.083277 0.215499 6.128911 0.327108 6.128893 0.443353 c +6.128893 5.693353 l +6.128893 5.808869 6.082995 5.919643 6.001312 6.001326 c +5.919630 6.083008 5.808856 6.128906 5.693339 6.128906 c +h +4.378893 1.757799 m +1.757785 1.757799 l +1.757785 4.378906 l +4.378893 4.378906 l +4.378893 1.757799 l +h +f +n +Q +q +1.000000 0.000000 -0.000000 1.000000 12.871094 8.500000 cm +0.809948 0.827749 0.850000 scn +0.443339 0.000013 m +0.327095 -0.000005 0.215486 0.045629 0.132565 0.127095 c +0.049644 0.208562 0.002039 0.319341 0.000000 0.435567 c +0.000000 2.185567 l +0.002000 2.302522 0.049355 2.414128 0.132067 2.496840 c +0.214778 2.579551 0.326384 2.626907 0.443339 2.628906 c +2.193339 2.628906 l +2.309565 2.626867 2.420345 2.579262 2.501811 2.496341 c +2.583277 2.413420 2.628911 2.301811 2.628893 2.185567 c +2.628893 0.435567 l +2.628893 0.320050 2.582995 0.209276 2.501312 0.127594 c +2.419630 0.045911 2.308856 0.000013 2.193339 0.000013 c +0.443339 0.000013 l +h +f +n +Q +q +1.000000 0.000000 -0.000000 1.000000 12.871094 5.000000 cm +0.809948 0.827749 0.850000 scn +5.693339 6.128906 m +4.814446 6.128906 l +4.698220 6.126867 4.587441 6.079262 4.505975 5.996341 c +4.424509 5.913420 4.378875 5.801811 4.378893 5.685567 c +4.378893 3.500014 l +3.064446 3.500014 l +2.948930 3.500014 2.838156 3.454116 2.756473 3.372433 c +2.674791 3.290751 2.628893 3.179976 2.628893 3.064460 c +2.628893 1.750013 l +0.443339 1.750013 l +0.327095 1.750031 0.215486 1.704398 0.132565 1.622931 c +0.049644 1.541465 0.002039 1.430686 0.000000 1.314460 c +0.000000 0.435567 l +0.002039 0.319341 0.049644 0.208562 0.132565 0.127095 c +0.215486 0.045629 0.327095 -0.000004 0.443339 0.000013 c +5.693339 0.000013 l +5.808856 0.000013 5.919630 0.045911 6.001312 0.127594 c +6.082995 0.209276 6.128893 0.320051 6.128893 0.435567 c +6.128893 5.685567 l +6.128911 5.801811 6.083277 5.913420 6.001811 5.996341 c +5.920344 6.079262 5.809565 6.126867 5.693339 6.128906 c +h +f +n +Q + +endstream +endobj + +3 0 obj + 4107 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000004197 00000 n +0000004220 00000 n +0000004393 00000 n +0000004467 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +4526 +%%EOF \ No newline at end of file diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Contents.json b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..d9a97df899595ebc48148baa9cbedb9be8f763fa --- /dev/null +++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "Icon.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Icon.pdf b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Icon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5f75d04ba8fcb3c602e0eb08226b68a3e6cc3d1c --- /dev/null +++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Icon.pdf @@ -0,0 +1,95 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 4.000000 11.000000 cm +0.809948 0.827749 0.850000 scn +3.000000 5.000000 m +3.000000 7.761424 5.238576 10.000000 8.000000 10.000000 c +10.761423 10.000000 13.000000 7.761424 13.000000 5.000000 c +13.000000 2.238576 10.761423 0.000000 8.000000 0.000000 c +5.238576 0.000000 3.000000 2.238576 3.000000 5.000000 c +h +8.000000 2.000000 m +9.656855 2.000000 11.000000 3.343146 11.000000 5.000000 c +11.000000 6.656854 9.656855 8.000000 8.000000 8.000000 c +6.343146 8.000000 5.000000 6.656854 5.000000 5.000000 c +5.000000 3.343146 6.343146 2.000000 8.000000 2.000000 c +h +f +n +Q +q +1.000000 0.000000 -0.000000 1.000000 4.000000 13.000000 cm +0.809948 0.827749 0.850000 scn +2.343146 -5.343145 m +0.842855 -6.843436 0.000000 -8.878267 0.000000 -11.000000 c +2.000000 -11.000000 l +2.000000 -9.408701 2.632141 -7.882577 3.757360 -6.757359 c +4.882578 -5.632140 6.408701 -5.000000 8.000000 -5.000000 c +9.591299 -5.000000 11.117423 -5.632140 12.242641 -6.757359 c +13.367860 -7.882577 14.000000 -9.408701 14.000000 -11.000000 c +16.000000 -11.000000 l +16.000000 -8.878267 15.157146 -6.843436 13.656855 -5.343145 c +12.156564 -3.842854 10.121732 -3.000000 8.000000 -3.000000 c +5.878268 -3.000000 3.843437 -3.842854 2.343146 -5.343145 c +h +f +n +Q + +endstream +endobj + +3 0 obj + 1279 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001369 00000 n +0000001392 00000 n +0000001565 00000 n +0000001639 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +1698 +%%EOF \ No newline at end of file diff --git a/Sources/Shared/Resources/en.lproj/Localizable.strings b/Sources/Shared/Resources/en.lproj/Localizable.strings index aebff7b7bcdb9b2c872577060b8f9244300baa90..7c8da3fd206e97854424e16b94dbbc91a22b9d5f 100644 --- a/Sources/Shared/Resources/en.lproj/Localizable.strings +++ b/Sources/Shared/Resources/en.lproj/Localizable.strings @@ -931,41 +931,43 @@ // SearchFeature -"contactSearch.title" +"ud.title" = "Search"; -"contactSearch.placeholder.title" +"ud.placeholder.title" = "Searching is private by nature. The network cannot identify who a search request came from."; -"contactSearch.placeholder.drawer.title" +"ud.placeholder.drawer.title" = "Search"; -"contactSearch.placeholder.drawer.subtitle" +"ud.placeholder.drawer.subtitle" = "You can search for users by their username, email, or phone number using the xx network’s #Anonymous Data Retrieval protocol# which keeps a user’s identity anonymous while requesting data. All sent requests contain salted hashes of what you are searching for. Raw data on emails, usernames, and phone numbers do not leave your phone."; -"contactSearch.placeholder.drawer.action" +"ud.placeholder.drawer.action" = "Got it"; -"contactSearch.filter.phone" +"ud.tab.phone" = "Phone"; -"contactSearch.filter.email" +"ud.tab.email" = "Email"; -"contactSearch.filter.username" +"ud.tab.username" = "Username"; -"contactSearch.sectionTitle" +"ud.tab.qr" += "QR Code"; +"ud.sectionTitle" = "User"; -"contactSearch.noneFound" +"ud.noneFound" = "There are no users with that %@."; -"contactSearch.requestDrawer.title" +"ud.requestDrawer.title" = "Request Contact"; -"contactSearch.requestDrawer.email" +"ud.requestDrawer.email" = "EMAIL ADDRESS"; -"contactSearch.requestDrawer.phone" +"ud.requestDrawer.phone" = "PHONE NUMBER"; -"contactSearch.requestDrawer.send" +"ud.requestDrawer.send" = "Send Contact Request"; -"contactSearch.requestDrawer.cancel" +"ud.requestDrawer.cancel" = "Cancel"; -"contactSearch.nicknameDrawer.title" +"ud.nicknameDrawer.title" = "Add a nickname"; -"contactSearch.nicknameDrawer.subtitle" +"ud.nicknameDrawer.subtitle" = "Edit your new contact’s nickname so you know who they are."; -"contactSearch.nicknameDrawer.save" +"ud.nicknameDrawer.save" = "Save"; // LaunchFeature