diff --git a/WooCommerce/Classes/AppDelegate.swift b/WooCommerce/Classes/AppDelegate.swift index f94809ecd11..6e6d91fe5c0 100644 --- a/WooCommerce/Classes/AppDelegate.swift +++ b/WooCommerce/Classes/AppDelegate.swift @@ -1,10 +1,13 @@ import UIKit import CoreData + import CocoaLumberjack +import WordPressUI import WordPressKit import WordPressAuthenticator + // MARK: - Woo's App Delegate! // @UIApplicationMain @@ -30,7 +33,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Setup the Interface! setupMainWindow() - setupInterfaceAppearance() + setupComponentsAppearance() // Setup Components setupAuthenticationManager() @@ -88,9 +91,16 @@ private extension AppDelegate { window?.makeKeyAndVisible() } + /// Sets up all of the component(s) Appearance. + /// + func setupComponentsAppearance() { + setupWooAppearance() + setupFancyButtonAppearance() + } + /// Sets up WooCommerce's UIAppearance. /// - func setupInterfaceAppearance() { + func setupWooAppearance() { UINavigationBar.appearance().barTintColor = StyleManager.wooCommerceBrandColor UINavigationBar.appearance().titleTextAttributes = [.foregroundColor: UIColor.white] UINavigationBar.appearance().isTranslucent = false @@ -98,6 +108,19 @@ private extension AppDelegate { UIApplication.shared.statusBarStyle = .lightContent } + /// Sets up FancyButton's UIAppearance. + /// + func setupFancyButtonAppearance() { + let appearance = FancyButton.appearance() + appearance.titleFont = UIFont.font(forStyle: .headline, weight: .bold) + appearance.primaryNormalBackgroundColor = StyleManager.buttonPrimaryColor + appearance.primaryNormalBorderColor = StyleManager.buttonPrimaryHighlightedColor + appearance.primaryHighlightBackgroundColor = StyleManager.buttonPrimaryHighlightedColor + appearance.primaryHighlightBorderColor = StyleManager.buttonPrimaryHighlightedColor + appearance.disabledBorderColor = StyleManager.buttonPrimaryHighlightedColor + appearance.disabledBackgroundColor = StyleManager.buttonPrimaryHighlightedColor + } + /// Sets up the WordPress Authenticator. /// func setupAuthenticationManager() { @@ -135,7 +158,7 @@ private extension AppDelegate { fatalError() } - authenticationManager.showLogin(from: rootViewController) + authenticationManager.displayAuthentication(from: rootViewController) } /// Indicates if there's a default WordPress.com account. diff --git a/WooCommerce/Classes/Authentication/AuthenticationManager.swift b/WooCommerce/Classes/Authentication/AuthenticationManager.swift index d2335e7a946..55cc2445ad2 100644 --- a/WooCommerce/Classes/Authentication/AuthenticationManager.swift +++ b/WooCommerce/Classes/Authentication/AuthenticationManager.swift @@ -1,5 +1,6 @@ import Foundation import WordPressAuthenticator +import WordPressUI @@ -13,7 +14,7 @@ class AuthenticationManager { let configuration = WordPressAuthenticatorConfiguration(wpcomClientId: ApiCredentials.dotcomAppId, wpcomSecret: ApiCredentials.dotcomSecret, wpcomScheme: ApiCredentials.dotcomAuthScheme, - wpcomTermsOfServiceURL: Constants.termsOfServiceURL, + wpcomTermsOfServiceURL: WooConstants.termsOfServiceUrl, googleLoginClientId: ApiCredentials.googleClientId, googleLoginServerClientId: ApiCredentials.googleServerId, googleLoginScheme: ApiCredentials.googleAuthScheme, @@ -26,12 +27,10 @@ class AuthenticationManager { /// Displays the Login Flow using the specified UIViewController as presenter. /// - func showLogin(from presenter: UIViewController) { - let loginViewController = WordPressAuthenticator.signinForWordPress() - loginViewController.restrictToWPCom = true - loginViewController.offerSignupOption = false + func displayAuthentication(from presenter: UIViewController) { + let prologueViewController = LoginPrologueViewController() + let navigationController = LoginNavigationController(rootViewController: prologueViewController) - let navigationController = LoginNavigationController(rootViewController: loginViewController) presenter.present(navigationController, animated: true, completion: nil) } @@ -169,16 +168,3 @@ extension AuthenticationManager: WordPressAuthenticatorDelegate { // TODO: Integrate Tracks } } - - -/// Nested Types -/// -extension AuthenticationManager { - - struct Constants { - - /// Terms of Service Website. Displayed by the Authenticator (when / if needed). - /// - static let termsOfServiceURL = "https://wordpress.com/tos/" - } -} diff --git a/WooCommerce/Classes/Authentication/Prologue/LoginPrologueViewController.swift b/WooCommerce/Classes/Authentication/Prologue/LoginPrologueViewController.swift new file mode 100644 index 00000000000..234aef81335 --- /dev/null +++ b/WooCommerce/Classes/Authentication/Prologue/LoginPrologueViewController.swift @@ -0,0 +1,154 @@ +import Foundation +import UIKit +import SafariServices +import WordPressAuthenticator + + +/// Displays the WooCommerce Prologue UI. +/// +class LoginPrologueViewController: UIViewController { + + /// White-Background View, to be placed surrounding the bottom area. + /// + @IBOutlet var backgroundView: UIView! + + /// Label to be displayed at the top of the Prologue. + /// + @IBOutlet var upperLabel: UILabel! + + /// Disclaimer Label + /// + @IBOutlet var disclaimerTextView: UITextView! + + /// Jetpack Logo ImageVIew + /// + @IBOutlet var jetpackImageView: UIImageView! + + /// Default Action Button. + /// + @IBOutlet var loginButton: UIButton! + + + // MARK: - Overridden Properties + + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return .portrait + } + + + // MARK: - Overridden Methods + + override func viewDidLoad() { + super.viewDidLoad() + + setupMainView() + setupBackgroundView() + setupJetpackImage() + setupDisclaimerLabel() + setupUpperLabel() + setupLoginButton() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + navigationController?.setNavigationBarHidden(true, animated: animated) + } +} + + +// MARK: - Initialization Methods +// +private extension LoginPrologueViewController { + + func setupMainView() { + view.backgroundColor = StyleManager.wooCommerceBrandColor + } + + func setupBackgroundView() { + backgroundView.layer.masksToBounds = false + backgroundView.layer.shadowOpacity = 0.2 + } + + func setupUpperLabel() { + upperLabel.text = NSLocalizedString("Check your WooCommerce store on the go, fulfill your orders and get notifications of new sales.", comment: "Login Prologue Legend") + upperLabel.font = UIFont.font(forStyle: .subheadline, weight: .bold) + upperLabel.textColor = .white + } + + func setupJetpackImage() { + jetpackImageView.image = UIImage.jetpackLogoImage.imageWithTintColor(.jetpackGreen) + } + + func setupDisclaimerLabel() { + disclaimerTextView.attributedText = disclaimerAttributedText + disclaimerTextView.textContainerInset = .zero + } + + func setupLoginButton() { + let title = NSLocalizedString("Log in with Jetpack", comment: "Authentication Login Button") + loginButton.setTitle(title, for: .normal) + loginButton.backgroundColor = .clear + } +} + + +// MARK: - UITextViewDeletgate Conformance +// +extension LoginPrologueViewController: UITextViewDelegate { + + func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { + displaySafariViewController(at: URL) + return false + } +} + + +// MARK: - Action Handlers +// +extension LoginPrologueViewController { + + /// Opens SafariViewController at the specified URL. + /// + func displaySafariViewController(at url: URL) { + let safariViewController = SafariViewController(url: url) + safariViewController.modalPresentationStyle = .pageSheet + present(safariViewController, animated: true, completion: nil) + } + + /// Proceeds with the Login Flow. + /// + @IBAction func loginWasPressed() { + let loginViewController = WordPressAuthenticator.signinForWordPress() + loginViewController.restrictToWPCom = true + loginViewController.offerSignupOption = false + + navigationController?.pushViewController(loginViewController, animated: true) + navigationController?.setNavigationBarHidden(false, animated: true) + } +} + + +// MARK: - Private Methods +// +private extension LoginPrologueViewController { + + /// Returns the Disclaimer Attributed Text (which contains a link to the Jetpack Setup URL). + /// + var disclaimerAttributedText: NSAttributedString { + let disclaimerText = NSLocalizedString("This app requires Jetpack to be able to connect to your WooCommerce Store.\nFor configuration instructions, ", comment: "Login Disclaimer Text") + let disclaimerAttributes: [NSAttributedStringKey: Any] = [ + .font: UIFont.font(forStyle: .caption1, weight: .thin), + .foregroundColor: UIColor.black + ] + + let readText = NSLocalizedString("read here.", comment: "Login Disclaimer Linked Text") + var readAttributes = disclaimerAttributes + readAttributes[.link] = URL(string: WooConstants.jetpackSetupUrl) + + let readAttrText = NSMutableAttributedString(string: readText, attributes: readAttributes) + let disclaimerAttrText = NSMutableAttributedString(string: disclaimerText, attributes: disclaimerAttributes) + disclaimerAttrText.append(readAttrText) + + return disclaimerAttrText + } +} diff --git a/WooCommerce/Classes/Authentication/Prologue/LoginPrologueViewController.xib b/WooCommerce/Classes/Authentication/Prologue/LoginPrologueViewController.xib new file mode 100644 index 00000000000..d1966264bdf --- /dev/null +++ b/WooCommerce/Classes/Authentication/Prologue/LoginPrologueViewController.xib @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L1 +L2 +L3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WooCommerce/Classes/Extensions/UIColor+Woo.swift b/WooCommerce/Classes/Extensions/UIColor+Woo.swift new file mode 100644 index 00000000000..cf8a4537724 --- /dev/null +++ b/WooCommerce/Classes/Extensions/UIColor+Woo.swift @@ -0,0 +1,14 @@ +import Foundation +import UIKit + + +/// WooCommerce Color Constants +/// +extension UIColor { + + /// Returns Jetpack Green Color + /// + static var jetpackGreen: UIColor { + return UIColor(red: 83.0/255.0, green: 186.0/255.0, blue: 68.0/255.0, alpha: 1.0) + } +} diff --git a/WooCommerce/Classes/Extensions/UIFont+Helpers.swift b/WooCommerce/Classes/Extensions/UIFont+Helpers.swift index bde6913fc98..09e7bd297f3 100644 --- a/WooCommerce/Classes/Extensions/UIFont+Helpers.swift +++ b/WooCommerce/Classes/Extensions/UIFont+Helpers.swift @@ -1,5 +1,8 @@ import UIKit + +/// WooCommerce UIFont Constants +/// extension UIFont { static var largeTitle: UIFont { return .preferredFont(forTextStyle: .largeTitle) @@ -45,3 +48,26 @@ extension UIFont { return .preferredFont(forTextStyle: .caption2) } } + + +/// WooCommerce UIFont Helpers +/// +extension UIFont { + + /// Returns a UIFont instance for the specified Style + Weight. + /// + class func font(forStyle style: UIFontTextStyle, weight: UIFont.Weight) -> UIFont { + let targetSize = pointSize(for: style) + return UIFont.systemFont(ofSize: targetSize, weight: weight) + } + + /// Returns the System's Point Size for the specified Style. + /// + private class func pointSize(for style: UIFontTextStyle) -> CGFloat { + let descriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: style) + let initialFont = UIFont(descriptor: descriptor, size: CGFloat(0.0)) + let scaledFont = UIFontMetrics(forTextStyle: style).scaledFont(for: initialFont) + + return scaledFont.pointSize + } +} diff --git a/WooCommerce/Classes/Extensions/UIImage+Woo.swift b/WooCommerce/Classes/Extensions/UIImage+Woo.swift new file mode 100644 index 00000000000..b76dc6c02ee --- /dev/null +++ b/WooCommerce/Classes/Extensions/UIImage+Woo.swift @@ -0,0 +1,14 @@ +import Foundation +import UIKit + + +/// WooCommerce UIImage Assets +/// +extension UIImage { + + /// Jetpack Logo Image + /// + static var jetpackLogoImage: UIImage { + return UIImage(named: "icon-jetpack-gray")! + } +} diff --git a/WooCommerce/Classes/Styles/PaddedLabel.swift b/WooCommerce/Classes/Styles/PaddedLabel.swift index 0b366ccb83f..4ea12158530 100644 --- a/WooCommerce/Classes/Styles/PaddedLabel.swift +++ b/WooCommerce/Classes/Styles/PaddedLabel.swift @@ -10,7 +10,7 @@ import UIKit @IBInspectable var textInsets = Constants.defaultInsets - // MARK: - Overriden Methods + // MARK: - Overridden Methods override func drawText(in rect: CGRect) { super.drawText(in: UIEdgeInsetsInsetRect(rect, textInsets)) diff --git a/WooCommerce/Classes/Styles/Style.swift b/WooCommerce/Classes/Styles/Style.swift index 3f58e789aa0..db1c5614449 100644 --- a/WooCommerce/Classes/Styles/Style.swift +++ b/WooCommerce/Classes/Styles/Style.swift @@ -15,6 +15,8 @@ protocol Style { var statusNotIdentifiedBoldColor: UIColor { get } var defaultTextColor: UIColor { get } var sectionTitleColor: UIColor { get } + var buttonPrimaryColor: UIColor { get } + var buttonPrimaryHighlightedColor: UIColor { get } } // MARK: - WooCommerce's Default Style @@ -31,6 +33,8 @@ class DefaultStyle: Style { let statusNotIdentifiedBoldColor = UIColor(red: 226.0/255.0, green: 226.0/255.0, blue: 226.0/255.0, alpha: 1.0) let defaultTextColor = UIColor.black let sectionTitleColor = UIColor.darkGray + let buttonPrimaryColor = UIColor(red: 0x96/255.0, green: 0x58/255.0, blue: 0x8A/255.0, alpha: 0xFF/255.0) + let buttonPrimaryHighlightedColor = UIColor(red: 0x6E/255.0, green: 0x29/255.0, blue: 0x67/255.0, alpha: 0xFF/255.0) } @@ -94,4 +98,12 @@ class StyleManager { static var sectionTitleColor: UIColor { return active.sectionTitleColor } + + static var buttonPrimaryColor: UIColor { + return active.buttonPrimaryColor + } + + static var buttonPrimaryHighlightedColor: UIColor { + return active.buttonPrimaryHighlightedColor + } } diff --git a/WooCommerce/Classes/System/WooConstants.swift b/WooCommerce/Classes/System/WooConstants.swift new file mode 100644 index 00000000000..f961211a0c2 --- /dev/null +++ b/WooCommerce/Classes/System/WooConstants.swift @@ -0,0 +1,19 @@ +import Foundation + + +/// WooCommerce Constants +/// +struct WooConstants { + + /// Private: No-OP! + /// + private init() {} + + /// Jetpack Setup URL + /// + static let jetpackSetupUrl = "https://jetpack.com/support/getting-started-with-jetpack/" + + /// Terms of Service Website. Displayed by the Authenticator (when / if needed). + /// + static let termsOfServiceUrl = "https://wordpress.com/tos/" +} diff --git a/WooCommerce/Classes/Tools/SafariViewController.swift b/WooCommerce/Classes/Tools/SafariViewController.swift new file mode 100644 index 00000000000..f040c11c76f --- /dev/null +++ b/WooCommerce/Classes/Tools/SafariViewController.swift @@ -0,0 +1,32 @@ +import Foundation +import SafariServices + + +/// WooCommerce SafariViewController: Allows us to control the StatusBar Style +/// +class SafariViewController: SFSafariViewController { + + /// Preserves the StatusBar Style present, prior to when this ViewController gets displayed. + /// + private var previousStatusBarStyle: UIStatusBarStyle? + + /// StatusBarStyle to be applied + /// + var statusBarStyle: UIStatusBarStyle = .default + + + // MARK: - Overridden Methods + + override open func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + previousStatusBarStyle = UIApplication.shared.statusBarStyle + UIApplication.shared.statusBarStyle = statusBarStyle + } + + override open func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + UIApplication.shared.statusBarStyle = previousStatusBarStyle ?? .lightContent + } +} diff --git a/WooCommerce/Resources/Base.lproj/LaunchScreen.storyboard b/WooCommerce/Resources/Base.lproj/LaunchScreen.storyboard index 90e0b926f31..1920cd2a970 100644 --- a/WooCommerce/Resources/Base.lproj/LaunchScreen.storyboard +++ b/WooCommerce/Resources/Base.lproj/LaunchScreen.storyboard @@ -1,11 +1,10 @@ - + - - + @@ -20,6 +19,10 @@ + + + + diff --git a/WooCommerce/Resources/Images.xcassets/Contents.json b/WooCommerce/Resources/Images.xcassets/Contents.json new file mode 100644 index 00000000000..da4a164c918 --- /dev/null +++ b/WooCommerce/Resources/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/WooCommerce/Resources/Images.xcassets/icon-jetpack-gray.imageset/Contents.json b/WooCommerce/Resources/Images.xcassets/icon-jetpack-gray.imageset/Contents.json new file mode 100644 index 00000000000..d7356eb26c2 --- /dev/null +++ b/WooCommerce/Resources/Images.xcassets/icon-jetpack-gray.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon-jetpack-gray.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/WooCommerce/Resources/Images.xcassets/icon-jetpack-gray.imageset/icon-jetpack-gray.pdf b/WooCommerce/Resources/Images.xcassets/icon-jetpack-gray.imageset/icon-jetpack-gray.pdf new file mode 100644 index 00000000000..581669c8bce Binary files /dev/null and b/WooCommerce/Resources/Images.xcassets/icon-jetpack-gray.imageset/icon-jetpack-gray.pdf differ diff --git a/WooCommerce/Resources/Images.xcassets/prologue-hands.imageset/Contents.json b/WooCommerce/Resources/Images.xcassets/prologue-hands.imageset/Contents.json new file mode 100644 index 00000000000..fa033c3b6d6 --- /dev/null +++ b/WooCommerce/Resources/Images.xcassets/prologue-hands.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "illustration-hands.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/WooCommerce/Resources/Images.xcassets/prologue-hands.imageset/illustration-hands.pdf b/WooCommerce/Resources/Images.xcassets/prologue-hands.imageset/illustration-hands.pdf new file mode 100644 index 00000000000..95fd44601a8 Binary files /dev/null and b/WooCommerce/Resources/Images.xcassets/prologue-hands.imageset/illustration-hands.pdf differ diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 7f89d4d07fd..26f0f0ba4af 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -42,6 +42,13 @@ B56DB3D42049BFAA00D4AA8E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B56DB3D32049BFAA00D4AA8E /* Assets.xcassets */; }; B56DB3D72049BFAA00D4AA8E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B56DB3D52049BFAA00D4AA8E /* LaunchScreen.storyboard */; }; B5A8F8A920B84D3F00D211DE /* ApiCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5A8F8A720B84D3F00D211DE /* ApiCredentials.swift */; }; + B5A8F8AD20B88D9900D211DE /* LoginPrologueViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5A8F8AC20B88D9900D211DE /* LoginPrologueViewController.swift */; }; + B5A8F8AF20B88DCC00D211DE /* LoginPrologueViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B5A8F8AE20B88DCC00D211DE /* LoginPrologueViewController.xib */; }; + B5BE368E20BED80B00BE0A8C /* SafariViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BE368D20BED80B00BE0A8C /* SafariViewController.swift */; }; + B5D1AFB420BC445A00DB0E8C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B5D1AFB320BC445900DB0E8C /* Images.xcassets */; }; + B5D1AFB820BC510200DB0E8C /* UIImage+Woo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5D1AFB720BC510200DB0E8C /* UIImage+Woo.swift */; }; + B5D1AFBA20BC515600DB0E8C /* UIColor+Woo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5D1AFB920BC515600DB0E8C /* UIColor+Woo.swift */; }; + B5D1AFC020BC67C200DB0E8C /* WooConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5D1AFBF20BC67C200DB0E8C /* WooConstants.swift */; }; B5EE26C020A5EE6600468622 /* Storage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5EE26BF20A5EE6600468622 /* Storage.framework */; }; B5EE26C120A5EE8100468622 /* Storage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5EE26BF20A5EE6600468622 /* Storage.framework */; }; B5EE26C220A5EE8100468622 /* Storage.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B5EE26BF20A5EE6600468622 /* Storage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -143,6 +150,13 @@ B56DB3E32049BFAA00D4AA8E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B5A8F8A720B84D3F00D211DE /* ApiCredentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ApiCredentials.swift; path = DerivedSources/ApiCredentials.swift; sourceTree = SOURCE_ROOT; }; B5A8F8A820B84D3F00D211DE /* InfoPlist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoPlist.h; path = DerivedSources/InfoPlist.h; sourceTree = SOURCE_ROOT; }; + B5A8F8AC20B88D9900D211DE /* LoginPrologueViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginPrologueViewController.swift; sourceTree = ""; }; + B5A8F8AE20B88DCC00D211DE /* LoginPrologueViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LoginPrologueViewController.xib; sourceTree = ""; }; + B5BE368D20BED80B00BE0A8C /* SafariViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariViewController.swift; sourceTree = ""; }; + B5D1AFB320BC445900DB0E8C /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + B5D1AFB720BC510200DB0E8C /* UIImage+Woo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Woo.swift"; sourceTree = ""; }; + B5D1AFB920BC515600DB0E8C /* UIColor+Woo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Woo.swift"; sourceTree = ""; }; + B5D1AFBF20BC67C200DB0E8C /* WooConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WooConstants.swift; sourceTree = ""; }; B5EE26BF20A5EE6600468622 /* Storage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Storage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CE17C2E020ACA06800AFBD20 /* BillingDetailsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BillingDetailsTableViewCell.swift; sourceTree = ""; }; CE17C2E120ACA06800AFBD20 /* BillingDetailsTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BillingDetailsTableViewCell.xib; sourceTree = ""; }; @@ -244,6 +258,7 @@ B55D4C0420B6026700D7A50F /* Authentication */ = { isa = PBXGroup; children = ( + B5A8F8AB20B88D8400D211DE /* Prologue */, B55D4C0520B6027100D7A50F /* AuthenticationManager.swift */, ); path = Authentication; @@ -253,6 +268,7 @@ isa = PBXGroup; children = ( B55D4C2620B717C000D7A50F /* UserAgent.swift */, + B5BE368D20BED80B00BE0A8C /* SafariViewController.swift */, ); path = Tools; sourceTree = ""; @@ -311,6 +327,7 @@ B55D4C0420B6026700D7A50F /* Authentication */, CE1CCB4C20572444000EE3AC /* Extensions */, CE1CCB3E2056F204000EE3AC /* Styles */, + B5D1AFBE20BC67B500DB0E8C /* System */, B509112B2049CFDF007D25DC /* Model */, CE85535B209B5B6A00938BDC /* ViewModels */, B56DB3EF2049C06D00D4AA8E /* ViewRelated */, @@ -323,10 +340,11 @@ isa = PBXGroup; children = ( B56DB3D32049BFAA00D4AA8E /* Assets.xcassets */, + B5D1AFB320BC445900DB0E8C /* Images.xcassets */, + CE1CCB4620570A6B000EE3AC /* en.lproj */, B56DB3D82049BFAA00D4AA8E /* Info.plist */, B56DB3D52049BFAA00D4AA8E /* LaunchScreen.storyboard */, B56DB3D02049BFAA00D4AA8E /* WooCommerce.xcdatamodeld */, - CE1CCB4620570A6B000EE3AC /* en.lproj */, CEE005FF2077CA5A0079161F /* fake data */, ); path = Resources; @@ -341,6 +359,23 @@ path = DerivedSources; sourceTree = ""; }; + B5A8F8AB20B88D8400D211DE /* Prologue */ = { + isa = PBXGroup; + children = ( + B5A8F8AC20B88D9900D211DE /* LoginPrologueViewController.swift */, + B5A8F8AE20B88DCC00D211DE /* LoginPrologueViewController.xib */, + ); + path = Prologue; + sourceTree = ""; + }; + B5D1AFBE20BC67B500DB0E8C /* System */ = { + isa = PBXGroup; + children = ( + B5D1AFBF20BC67C200DB0E8C /* WooConstants.swift */, + ); + path = System; + sourceTree = ""; + }; CE1CCB3E2056F204000EE3AC /* Styles */ = { isa = PBXGroup; children = ( @@ -366,8 +401,10 @@ children = ( CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */, CE1F51262064345B00C6C810 /* UIColor+Helpers.swift */, + B5D1AFB920BC515600DB0E8C /* UIColor+Woo.swift */, CE1F512820697F0100C6C810 /* UIFont+Helpers.swift */, CE1F51242064179A00C6C810 /* UILabel+Helpers.swift */, + B5D1AFB720BC510200DB0E8C /* UIImage+Woo.swift */, ); path = Extensions; sourceTree = ""; @@ -518,6 +555,7 @@ buildActionMask = 2147483647; files = ( B56DB3D72049BFAA00D4AA8E /* LaunchScreen.storyboard in Resources */, + B5A8F8AF20B88DCC00D211DE /* LoginPrologueViewController.xib in Resources */, CED6021E20B35FDF0032C639 /* NoResultsTableViewCell.xib in Resources */, B557DA1620979904005962F4 /* CustomerNoteTableViewCell.xib in Resources */, B56DB3D42049BFAA00D4AA8E /* Assets.xcassets in Resources */, @@ -525,6 +563,7 @@ B559EBAF20A0BF8F00836CD4 /* README.md in Resources */, CEE005F82077C9690079161F /* order-list.json in Resources */, CEE005FC2077CA030079161F /* order-949.json in Resources */, + B5D1AFB420BC445A00DB0E8C /* Images.xcassets in Resources */, CEE005F62076C4040079161F /* Orders.storyboard in Resources */, CE855367209BA6A700938BDC /* ShowHideSectionFooter.xib in Resources */, CEE005FE2077CA2F0079161F /* order-937.json in Resources */, @@ -674,12 +713,14 @@ CE85535D209B5BB700938BDC /* OrderDetailsViewModel.swift in Sources */, CE263DE6206ACD220015A693 /* NotificationsViewController.swift in Sources */, B50911312049E27A007D25DC /* OrdersViewController.swift in Sources */, + B5A8F8AD20B88D9900D211DE /* LoginPrologueViewController.swift in Sources */, B5A8F8A920B84D3F00D211DE /* ApiCredentials.swift in Sources */, CE17C2E220ACA06800AFBD20 /* BillingDetailsTableViewCell.swift in Sources */, B55D4C2720B717C000D7A50F /* UserAgent.swift in Sources */, CE1CCB402056F21C000EE3AC /* Style.swift in Sources */, B50911322049E27A007D25DC /* SettingsViewController.swift in Sources */, B55D4C0620B6027200D7A50F /* AuthenticationManager.swift in Sources */, + B5BE368E20BED80B00BE0A8C /* SafariViewController.swift in Sources */, CE855364209BA6A700938BDC /* ShowHideSectionFooter.swift in Sources */, B56DB3CA2049BFAA00D4AA8E /* AppDelegate.swift in Sources */, CE1F512B206985DF00C6C810 /* PaddedLabel.swift in Sources */, @@ -687,6 +728,7 @@ CE855366209BA6A700938BDC /* CustomerInfoTableViewCell.swift in Sources */, CE1F51252064179A00C6C810 /* UILabel+Helpers.swift in Sources */, B50911302049E27A007D25DC /* DashboardViewController.swift in Sources */, + B5D1AFB820BC510200DB0E8C /* UIImage+Woo.swift in Sources */, CEE006082077D14C0079161F /* OrderDetailsViewController.swift in Sources */, CE34DA2520A1ECD6005D8523 /* ContactViewModel.swift in Sources */, CE4296B920A5E9E400B2AFBD /* CNContact+Helpers.swift in Sources */, @@ -696,7 +738,9 @@ CE263DE8206ACE3E0015A693 /* MainTabBarController.swift in Sources */, B56DB3D22049BFAA00D4AA8E /* WooCommerce.xcdatamodeld in Sources */, B50911342049E493007D25DC /* Order.swift in Sources */, + B5D1AFBA20BC515600DB0E8C /* UIColor+Woo.swift in Sources */, CE1CCB4B20570B1F000EE3AC /* OrderListCell.swift in Sources */, + B5D1AFC020BC67C200DB0E8C /* WooConstants.swift in Sources */, CE1F512920697F0100C6C810 /* UIFont+Helpers.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0;