diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..39704b11 Binary files /dev/null and b/.DS_Store differ diff --git a/CleanSwift_template.zip b/CleanSwift_template.zip deleted file mode 100644 index da082bfb..00000000 Binary files a/CleanSwift_template.zip and /dev/null differ diff --git a/README.md b/README.md index 9ed47234..49599b94 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,3 @@ # Show me the code -Esse repositório contem todo o material necessário para realizar o teste: -- A especificação do layout está na pasta 'bank_app_layout' abrindo o index.html, os icones estão na pasta 'assets' - -- Os dados da Api estão mockados, os exemplos e a especificação dos serviços (login e statements) se encontram no arquivo BankApp.postman_collection.json ( é necessário instalar o postman e importar a colection https://www.getpostman.com/apps) - -![Image of Yaktocat](https://github.com/SantanderTecnologia/TesteiOS/blob/new_test/telas.png) - -### # DESAFIO: - -Na primeira tela teremos um formulario de login, o campo user deve aceitar email ou cpf, -o campo password deve validar se a senha tem pelo menos uma letra maiuscula, um caracter especial e um caracter alfanumérico. -Apos a validação, realizar o login no endpoint https://bank-app-test.herokuapp.com/api/login e exibir os dados de retorno na próxima tela. -O ultimo usuário logado deve ser salvo de forma segura localmente, e exibido na tela de login se houver algum salvo. - -Na segunda tela será exibido os dados formatados do retorno do login e será necessário fazer um segundo request para obter os lançamentos do usuário, no endpoint https://bank-app-test.herokuapp.com/api/statements/{idUser} que retornará uma lista de lançamentos - -### # Avaliação - -Você será avaliado pela usabilidade, por respeitar o design e pela arquitetura do app. É esperado que você consiga explicar as decisões que tomou durante o desenvolvimento através de commits. - -Obrigatórios: - -* Swift 3.0 ou superior -* Autolayout -* O app deve funcionar no iOS 9 -* Testes unitários, pode usar a ferramenta que você tem mais experiência, só nos explique o que ele tem de bom. -* Arquitetura a ser utilizada: Swift Clean ([https://clean-swift.com/handbook/](https://clean-swift.com/handbook/) && [https://github.com/Clean-Swift/CleanStore](https://github.com/Clean-Swift/CleanStore) -* Uso do git. - -### # Observações gerais - -Adicione um arquivo [README.md](http://README.md) com os procedimentos para executar o projeto. -Pedimos que trabalhe sozinho e não divulgue o resultado na internet. - -Faça um fork desse desse repositório em seu Github e comece a partir da branch **new_test**. -Ao finalizar nos envie um Pull Request com o resultado, por favor informe por qual empresa você esta se candidatando. - -# Importante: não há prazo de entrega, faça com qualidade! - -# BOA SORTE! +Para executar o projeto, basta executar o projeto no Xcode (Command + R). diff --git a/TesteiOS/.DS_Store b/TesteiOS/.DS_Store new file mode 100644 index 00000000..5e3012bd Binary files /dev/null and b/TesteiOS/.DS_Store differ diff --git a/TesteiOS/TesteiOS.xcodeproj/project.pbxproj b/TesteiOS/TesteiOS.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c45258b9 --- /dev/null +++ b/TesteiOS/TesteiOS.xcodeproj/project.pbxproj @@ -0,0 +1,595 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 15226862217E7697007B4797 /* RequestAndPostDataWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1522685F217E7697007B4797 /* RequestAndPostDataWorker.swift */; }; + 15226863217E7697007B4797 /* DataRequestWorkers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15226860217E7697007B4797 /* DataRequestWorkers.swift */; }; + 15226864217E7697007B4797 /* PostDataWorkers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15226861217E7697007B4797 /* PostDataWorkers.swift */; }; + 15226866217E76A9007B4797 /* LoginWorkers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15226865217E76A9007B4797 /* LoginWorkers.swift */; }; + 154F94F6217AA1E40002584C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154F94F5217AA1E40002584C /* AppDelegate.swift */; }; + 154F94F8217AA1E40002584C /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154F94F7217AA1E40002584C /* LoginViewController.swift */; }; + 154F94FB217AA1E40002584C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 154F94F9217AA1E40002584C /* Main.storyboard */; }; + 154F94FD217AA1E50002584C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 154F94FC217AA1E50002584C /* Assets.xcassets */; }; + 154F9500217AA1E50002584C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 154F94FE217AA1E50002584C /* LaunchScreen.storyboard */; }; + 154F9509217B4AEB0002584C /* UserTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154F9508217B4AEB0002584C /* UserTextField.swift */; }; + 154F950B217B4D790002584C /* PasswordTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154F950A217B4D790002584C /* PasswordTextField.swift */; }; + 154F950D217B4DDC0002584C /* BankImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154F950C217B4DDC0002584C /* BankImage.swift */; }; + 154F950F217B4E4A0002584C /* LoginButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154F950E217B4E4A0002584C /* LoginButton.swift */; }; + 154F9512217B4FAD0002584C /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154F9511217B4FAD0002584C /* Extensions.swift */; }; + 154F9515217CB2710002584C /* UserAndSafeDataDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154F9514217CB2710002584C /* UserAndSafeDataDelegate.swift */; }; + 158B25CA217E986E00BA561D /* LoginInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25C9217E986E00BA561D /* LoginInteractor.swift */; }; + 158B25CF217E99CB00BA561D /* PostDataPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25CE217E99CB00BA561D /* PostDataPresenter.swift */; }; + 158B25D1217EA42E00BA561D /* RouterLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25D0217EA42E00BA561D /* RouterLoginViewController.swift */; }; + 158B25D3217EA4D200BA561D /* TransactionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25D2217EA4D200BA561D /* TransactionsViewController.swift */; }; + 158B25D5217EA4E700BA561D /* TransactionsInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25D4217EA4E700BA561D /* TransactionsInteractor.swift */; }; + 158B25D7217EA4F000BA561D /* TransactionsPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25D6217EA4F000BA561D /* TransactionsPresenter.swift */; }; + 158B25DB217EA5E400BA561D /* UserTransactionsCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25DA217EA5E400BA561D /* UserTransactionsCollectionView.swift */; }; + 158B25DD217EA83E00BA561D /* UserTransactionsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25DC217EA83E00BA561D /* UserTransactionsCollectionViewCell.swift */; }; + 158B25E42182A0E300BA561D /* LocalAuthentication.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 158B25E32182A0E300BA561D /* LocalAuthentication.framework */; }; + 158B25EC218406BF00BA561D /* TesteiOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158B25EB218406BF00BA561D /* TesteiOSTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 158B25EE218406BF00BA561D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 154F94EA217AA1E40002584C /* Project object */; + proxyType = 1; + remoteGlobalIDString = 154F94F1217AA1E40002584C; + remoteInfo = TesteiOS; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1522685F217E7697007B4797 /* RequestAndPostDataWorker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestAndPostDataWorker.swift; sourceTree = ""; }; + 15226860217E7697007B4797 /* DataRequestWorkers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataRequestWorkers.swift; sourceTree = ""; }; + 15226861217E7697007B4797 /* PostDataWorkers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostDataWorkers.swift; sourceTree = ""; }; + 15226865217E76A9007B4797 /* LoginWorkers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginWorkers.swift; sourceTree = ""; }; + 154F94F2217AA1E40002584C /* TesteiOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TesteiOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 154F94F5217AA1E40002584C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 154F94F7217AA1E40002584C /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + 154F94FA217AA1E40002584C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 154F94FC217AA1E50002584C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 154F94FF217AA1E50002584C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 154F9501217AA1E50002584C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 154F9508217B4AEB0002584C /* UserTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTextField.swift; sourceTree = ""; }; + 154F950A217B4D790002584C /* PasswordTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordTextField.swift; sourceTree = ""; }; + 154F950C217B4DDC0002584C /* BankImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BankImage.swift; sourceTree = ""; }; + 154F950E217B4E4A0002584C /* LoginButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginButton.swift; sourceTree = ""; }; + 154F9511217B4FAD0002584C /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; + 154F9514217CB2710002584C /* UserAndSafeDataDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAndSafeDataDelegate.swift; sourceTree = ""; }; + 158B25C9217E986E00BA561D /* LoginInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginInteractor.swift; sourceTree = ""; }; + 158B25CE217E99CB00BA561D /* PostDataPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostDataPresenter.swift; sourceTree = ""; }; + 158B25D0217EA42E00BA561D /* RouterLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouterLoginViewController.swift; sourceTree = ""; }; + 158B25D2217EA4D200BA561D /* TransactionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsViewController.swift; sourceTree = ""; }; + 158B25D4217EA4E700BA561D /* TransactionsInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsInteractor.swift; sourceTree = ""; }; + 158B25D6217EA4F000BA561D /* TransactionsPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsPresenter.swift; sourceTree = ""; }; + 158B25DA217EA5E400BA561D /* UserTransactionsCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTransactionsCollectionView.swift; sourceTree = ""; }; + 158B25DC217EA83E00BA561D /* UserTransactionsCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTransactionsCollectionViewCell.swift; sourceTree = ""; }; + 158B25E32182A0E300BA561D /* LocalAuthentication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LocalAuthentication.framework; path = System/Library/Frameworks/LocalAuthentication.framework; sourceTree = SDKROOT; }; + 158B25E9218406BF00BA561D /* TesteiOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TesteiOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 158B25EB218406BF00BA561D /* TesteiOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TesteiOSTests.swift; sourceTree = ""; }; + 158B25ED218406BF00BA561D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 154F94EF217AA1E40002584C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 158B25E42182A0E300BA561D /* LocalAuthentication.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 158B25E6218406BF00BA561D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 154F94E9217AA1E40002584C = { + isa = PBXGroup; + children = ( + 154F94F4217AA1E40002584C /* TesteiOS */, + 158B25EA218406BF00BA561D /* TesteiOSTests */, + 154F94F3217AA1E40002584C /* Products */, + 158B25E22182A0E200BA561D /* Frameworks */, + ); + sourceTree = ""; + }; + 154F94F3217AA1E40002584C /* Products */ = { + isa = PBXGroup; + children = ( + 154F94F2217AA1E40002584C /* TesteiOS.app */, + 158B25E9218406BF00BA561D /* TesteiOSTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 154F94F4217AA1E40002584C /* TesteiOS */ = { + isa = PBXGroup; + children = ( + 154F94F5217AA1E40002584C /* AppDelegate.swift */, + 158B25CC217E997500BA561D /* Network */, + 158B25CB217E996800BA561D /* Workers */, + 154F9507217B49B00002584C /* Login */, + 158B25D8217EA4F800BA561D /* Transactions */, + 154F94F9217AA1E40002584C /* Main.storyboard */, + 154F94FC217AA1E50002584C /* Assets.xcassets */, + 154F94FE217AA1E50002584C /* LaunchScreen.storyboard */, + 154F9501217AA1E50002584C /* Info.plist */, + 154F9511217B4FAD0002584C /* Extensions.swift */, + ); + path = TesteiOS; + sourceTree = ""; + }; + 154F9507217B49B00002584C /* Login */ = { + isa = PBXGroup; + children = ( + 158B25CD217E999900BA561D /* ObjectsFromLoginVC */, + 154F94F7217AA1E40002584C /* LoginViewController.swift */, + 154F9514217CB2710002584C /* UserAndSafeDataDelegate.swift */, + 158B25C9217E986E00BA561D /* LoginInteractor.swift */, + 158B25CE217E99CB00BA561D /* PostDataPresenter.swift */, + 158B25D0217EA42E00BA561D /* RouterLoginViewController.swift */, + ); + path = Login; + sourceTree = ""; + }; + 158B25CB217E996800BA561D /* Workers */ = { + isa = PBXGroup; + children = ( + 15226860217E7697007B4797 /* DataRequestWorkers.swift */, + 15226865217E76A9007B4797 /* LoginWorkers.swift */, + 15226861217E7697007B4797 /* PostDataWorkers.swift */, + ); + path = Workers; + sourceTree = ""; + }; + 158B25CC217E997500BA561D /* Network */ = { + isa = PBXGroup; + children = ( + 1522685F217E7697007B4797 /* RequestAndPostDataWorker.swift */, + ); + path = Network; + sourceTree = ""; + }; + 158B25CD217E999900BA561D /* ObjectsFromLoginVC */ = { + isa = PBXGroup; + children = ( + 154F9508217B4AEB0002584C /* UserTextField.swift */, + 154F950A217B4D790002584C /* PasswordTextField.swift */, + 154F950C217B4DDC0002584C /* BankImage.swift */, + 154F950E217B4E4A0002584C /* LoginButton.swift */, + ); + path = ObjectsFromLoginVC; + sourceTree = ""; + }; + 158B25D8217EA4F800BA561D /* Transactions */ = { + isa = PBXGroup; + children = ( + 158B25D2217EA4D200BA561D /* TransactionsViewController.swift */, + 158B25D4217EA4E700BA561D /* TransactionsInteractor.swift */, + 158B25D6217EA4F000BA561D /* TransactionsPresenter.swift */, + 158B25DA217EA5E400BA561D /* UserTransactionsCollectionView.swift */, + 158B25DC217EA83E00BA561D /* UserTransactionsCollectionViewCell.swift */, + ); + path = Transactions; + sourceTree = ""; + }; + 158B25E22182A0E200BA561D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 158B25E32182A0E300BA561D /* LocalAuthentication.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 158B25EA218406BF00BA561D /* TesteiOSTests */ = { + isa = PBXGroup; + children = ( + 158B25EB218406BF00BA561D /* TesteiOSTests.swift */, + 158B25ED218406BF00BA561D /* Info.plist */, + ); + path = TesteiOSTests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 154F94F1217AA1E40002584C /* TesteiOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 154F9504217AA1E50002584C /* Build configuration list for PBXNativeTarget "TesteiOS" */; + buildPhases = ( + 154F94EE217AA1E40002584C /* Sources */, + 154F94EF217AA1E40002584C /* Frameworks */, + 154F94F0217AA1E40002584C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TesteiOS; + productName = TesteiOS; + productReference = 154F94F2217AA1E40002584C /* TesteiOS.app */; + productType = "com.apple.product-type.application"; + }; + 158B25E8218406BF00BA561D /* TesteiOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 158B25F0218406BF00BA561D /* Build configuration list for PBXNativeTarget "TesteiOSTests" */; + buildPhases = ( + 158B25E5218406BF00BA561D /* Sources */, + 158B25E6218406BF00BA561D /* Frameworks */, + 158B25E7218406BF00BA561D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 158B25EF218406BF00BA561D /* PBXTargetDependency */, + ); + name = TesteiOSTests; + productName = TesteiOSTests; + productReference = 158B25E9218406BF00BA561D /* TesteiOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 154F94EA217AA1E40002584C /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1000; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "Gabriel Sória Souza"; + TargetAttributes = { + 154F94F1217AA1E40002584C = { + CreatedOnToolsVersion = 10.0; + }; + 158B25E8218406BF00BA561D = { + CreatedOnToolsVersion = 10.0; + TestTargetID = 154F94F1217AA1E40002584C; + }; + }; + }; + buildConfigurationList = 154F94ED217AA1E40002584C /* Build configuration list for PBXProject "TesteiOS" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 154F94E9217AA1E40002584C; + productRefGroup = 154F94F3217AA1E40002584C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 154F94F1217AA1E40002584C /* TesteiOS */, + 158B25E8218406BF00BA561D /* TesteiOSTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 154F94F0217AA1E40002584C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 154F9500217AA1E50002584C /* LaunchScreen.storyboard in Resources */, + 154F94FD217AA1E50002584C /* Assets.xcassets in Resources */, + 154F94FB217AA1E40002584C /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 158B25E7218406BF00BA561D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 154F94EE217AA1E40002584C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 154F94F8217AA1E40002584C /* LoginViewController.swift in Sources */, + 158B25CA217E986E00BA561D /* LoginInteractor.swift in Sources */, + 15226863217E7697007B4797 /* DataRequestWorkers.swift in Sources */, + 154F950F217B4E4A0002584C /* LoginButton.swift in Sources */, + 158B25DB217EA5E400BA561D /* UserTransactionsCollectionView.swift in Sources */, + 15226866217E76A9007B4797 /* LoginWorkers.swift in Sources */, + 158B25DD217EA83E00BA561D /* UserTransactionsCollectionViewCell.swift in Sources */, + 15226862217E7697007B4797 /* RequestAndPostDataWorker.swift in Sources */, + 158B25D3217EA4D200BA561D /* TransactionsViewController.swift in Sources */, + 154F94F6217AA1E40002584C /* AppDelegate.swift in Sources */, + 158B25D5217EA4E700BA561D /* TransactionsInteractor.swift in Sources */, + 154F950B217B4D790002584C /* PasswordTextField.swift in Sources */, + 154F9509217B4AEB0002584C /* UserTextField.swift in Sources */, + 158B25D1217EA42E00BA561D /* RouterLoginViewController.swift in Sources */, + 154F950D217B4DDC0002584C /* BankImage.swift in Sources */, + 154F9515217CB2710002584C /* UserAndSafeDataDelegate.swift in Sources */, + 15226864217E7697007B4797 /* PostDataWorkers.swift in Sources */, + 158B25CF217E99CB00BA561D /* PostDataPresenter.swift in Sources */, + 154F9512217B4FAD0002584C /* Extensions.swift in Sources */, + 158B25D7217EA4F000BA561D /* TransactionsPresenter.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 158B25E5218406BF00BA561D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 158B25EC218406BF00BA561D /* TesteiOSTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 158B25EF218406BF00BA561D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 154F94F1217AA1E40002584C /* TesteiOS */; + targetProxy = 158B25EE218406BF00BA561D /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 154F94F9217AA1E40002584C /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 154F94FA217AA1E40002584C /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 154F94FE217AA1E50002584C /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 154F94FF217AA1E50002584C /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 154F9502217AA1E50002584C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 154F9503217AA1E50002584C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 154F9505217AA1E50002584C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = H929RNU2C4; + INFOPLIST_FILE = TesteiOS/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = GabrielSoriaSouza.TesteiOS; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 154F9506217AA1E50002584C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = H929RNU2C4; + INFOPLIST_FILE = TesteiOS/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = GabrielSoriaSouza.TesteiOS; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 158B25F1218406BF00BA561D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = H929RNU2C4; + INFOPLIST_FILE = TesteiOSTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = GabrielSoriaSouza.TesteiOSTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TesteiOS.app/TesteiOS"; + }; + name = Debug; + }; + 158B25F2218406BF00BA561D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = H929RNU2C4; + INFOPLIST_FILE = TesteiOSTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = GabrielSoriaSouza.TesteiOSTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TesteiOS.app/TesteiOS"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 154F94ED217AA1E40002584C /* Build configuration list for PBXProject "TesteiOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 154F9502217AA1E50002584C /* Debug */, + 154F9503217AA1E50002584C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 154F9504217AA1E50002584C /* Build configuration list for PBXNativeTarget "TesteiOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 154F9505217AA1E50002584C /* Debug */, + 154F9506217AA1E50002584C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 158B25F0218406BF00BA561D /* Build configuration list for PBXNativeTarget "TesteiOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 158B25F1218406BF00BA561D /* Debug */, + 158B25F2218406BF00BA561D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 154F94EA217AA1E40002584C /* Project object */; +} diff --git a/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..313ba99d --- /dev/null +++ b/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/xcuserdata/maczepp.xcuserdatad/UserInterfaceState.xcuserstate b/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/xcuserdata/maczepp.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 00000000..cad42cb2 Binary files /dev/null and b/TesteiOS/TesteiOS.xcodeproj/project.xcworkspace/xcuserdata/maczepp.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/TesteiOS/TesteiOS.xcodeproj/xcuserdata/maczepp.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/TesteiOS/TesteiOS.xcodeproj/xcuserdata/maczepp.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..5cace26e --- /dev/null +++ b/TesteiOS/TesteiOS.xcodeproj/xcuserdata/maczepp.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/TesteiOS/TesteiOS.xcodeproj/xcuserdata/maczepp.xcuserdatad/xcschemes/xcschememanagement.plist b/TesteiOS/TesteiOS.xcodeproj/xcuserdata/maczepp.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..a7655117 --- /dev/null +++ b/TesteiOS/TesteiOS.xcodeproj/xcuserdata/maczepp.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + TesteiOS.xcscheme + + orderHint + 0 + + + + diff --git a/TesteiOS/TesteiOS/AppDelegate.swift b/TesteiOS/TesteiOS/AppDelegate.swift new file mode 100644 index 00000000..9f5d12ef --- /dev/null +++ b/TesteiOS/TesteiOS/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 19/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/TesteiOS/TesteiOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/TesteiOS/TesteiOS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d8db8d65 --- /dev/null +++ b/TesteiOS/TesteiOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TesteiOS/TesteiOS/Assets.xcassets/Contents.json b/TesteiOS/TesteiOS/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/TesteiOS/TesteiOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Contents.json b/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Contents.json new file mode 100644 index 00000000..83f10a73 --- /dev/null +++ b/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Logo-1.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Logo.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Logo-2.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/bank_app_layout/assets/Logo.png b/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Logo-1.png similarity index 100% rename from bank_app_layout/assets/Logo.png rename to TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Logo-1.png diff --git a/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Logo-2.png b/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Logo-2.png new file mode 100644 index 00000000..66bdc8d5 Binary files /dev/null and b/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Logo-2.png differ diff --git a/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Logo.png b/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Logo.png new file mode 100644 index 00000000..66bdc8d5 Binary files /dev/null and b/TesteiOS/TesteiOS/Assets.xcassets/Logo.imageset/Logo.png differ diff --git a/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/Contents.json b/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/Contents.json new file mode 100644 index 00000000..60b7ade3 --- /dev/null +++ b/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icons8-touch-id-30.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icons8-touch-id-60.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icons8-touch-id-90.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-30.png b/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-30.png new file mode 100644 index 00000000..a23a29b7 Binary files /dev/null and b/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-30.png differ diff --git a/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-60.png b/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-60.png new file mode 100644 index 00000000..08258112 Binary files /dev/null and b/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-60.png differ diff --git a/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-90.png b/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-90.png new file mode 100644 index 00000000..03d8ef41 Binary files /dev/null and b/TesteiOS/TesteiOS/Assets.xcassets/auth.imageset/icons8-touch-id-90.png differ diff --git a/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/Contents.json b/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/Contents.json new file mode 100644 index 00000000..3efcce8a --- /dev/null +++ b/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "logout 2-1.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "logout 2.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "logout 2-2.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/bank_app_layout/assets/logout 2.png b/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/logout 2-1.png similarity index 100% rename from bank_app_layout/assets/logout 2.png rename to TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/logout 2-1.png diff --git a/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/logout 2-2.png b/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/logout 2-2.png new file mode 100644 index 00000000..de1e4ae3 Binary files /dev/null and b/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/logout 2-2.png differ diff --git a/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/logout 2.png b/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/logout 2.png new file mode 100644 index 00000000..de1e4ae3 Binary files /dev/null and b/TesteiOS/TesteiOS/Assets.xcassets/logout.imageset/logout 2.png differ diff --git a/TesteiOS/TesteiOS/Base.lproj/LaunchScreen.storyboard b/TesteiOS/TesteiOS/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..bfa36129 --- /dev/null +++ b/TesteiOS/TesteiOS/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TesteiOS/TesteiOS/Base.lproj/Main.storyboard b/TesteiOS/TesteiOS/Base.lproj/Main.storyboard new file mode 100644 index 00000000..88ce35cc --- /dev/null +++ b/TesteiOS/TesteiOS/Base.lproj/Main.storyboard @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TesteiOS/TesteiOS/Extensions.swift b/TesteiOS/TesteiOS/Extensions.swift new file mode 100644 index 00000000..8c07efb9 --- /dev/null +++ b/TesteiOS/TesteiOS/Extensions.swift @@ -0,0 +1,41 @@ +// +// Extensions.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 20/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +extension UIColor { + + /// Takes integer values for Red, Green, and Blue channels to make + /// creating colors from RGB a bit easier. + /// + /// Note: Assertions will fire during development if inappropriate values are passed. + /// + /// - Parameters: + /// - r: An integer between 0 and 255 representing the red channel value + /// - g: An integer between 0 and 255 representing the green channel value + /// - b: An integer between 0 and 255 representing the blue channel value + /// - a: A CGFloat between 0.0 and 1.0 representing the alpha (0.0 is transparent, 1.0 is opaque). + /// - Returns: The created UIColor + public static func spc_from(r: Int, g: Int, b: Int, a: CGFloat = 1.0) -> UIColor { + assert((0 <= r && r <= 255), "Use a red value between 0 and 255!") + assert((0 <= g && g <= 255), "Use a green value between 0 and 255!") + assert((0 <= b && b <= 255), "Use a blue value between 0 and 255!") + assert((0.0 <= a && a <= 1.0), "Use and alpha value between 0 and 1!") + return UIColor(red: CGFloat(r) / 255.0, + green: CGFloat(g) / 255.0, + blue: CGFloat(b) / 255.0, + alpha: a) + } +} + +extension Notification.Name { + static let didReceiveData = Notification.Name("didReceiveData") + static let didCompleteTask = Notification.Name("didCompleteTask") + static let completedLengthyDownload = Notification.Name("completedLengthyDownload") +} diff --git a/TesteiOS/TesteiOS/Info.plist b/TesteiOS/TesteiOS/Info.plist new file mode 100644 index 00000000..7008ef6d --- /dev/null +++ b/TesteiOS/TesteiOS/Info.plist @@ -0,0 +1,47 @@ + + + + + + + NSFaceIDUsageDescription + Necessário para acessar sua conta. + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/TesteiOS/TesteiOS/Login/LoginInteractor.swift b/TesteiOS/TesteiOS/Login/LoginInteractor.swift new file mode 100644 index 00000000..de9eac66 --- /dev/null +++ b/TesteiOS/TesteiOS/Login/LoginInteractor.swift @@ -0,0 +1,117 @@ +// +// PostDataInteractor.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 22/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import LocalAuthentication +import UIKit + + +protocol PostAndAuthInteractorProtocol { + func post(dataToBePosted: DetailDataToBePosted, viewController: LoginViewController) + var lastUserLogged: String! { get set } + func checkAuthentication(context: LAContext, loginViewController: LoginViewController, credentialsDelegate: UserAndSafeDataDelegate) + func authentication(loginViewController: LoginViewController, credentialsDelegate: UserAndSafeDataDelegate) + func login(loginViewController: LoginViewController, delegate: UserAndSafeDataDelegate, router: UserTransactionsRouter) +} + +protocol ToBePosted { + var data: DetailDataToBePosted! { get set } + var delegate: UserAndSafeDataDelegate? { get set } +} + +class LoginInteractor: PostAndAuthInteractorProtocol, ToBePosted { + + + var lastUserLogged: String! + var presenter: LoginPresenter? + var data: DetailDataToBePosted! + var delegate: UserAndSafeDataDelegate? + + func post(dataToBePosted: DetailDataToBePosted, viewController: LoginViewController) { + let loginData = UserDataForLogin(userId: dataToBePosted.userId, name: dataToBePosted.name, bankAccount: dataToBePosted.bankAccount, agency: dataToBePosted.agency, balance: dataToBePosted.balance) + let completeLoginData = LoginData.init(userData: loginData, error: nil) + + RequestAndPostDataWorker.postData(loginData: completeLoginData, completion: { (sucess) in + DispatchQueue.main.async { + viewController.performSegue(withIdentifier: "segue", sender: nil) + viewController.activityIndicator.stopAnimating() + viewController.activityIndicator.removeFromSuperview() + viewController.view.alpha = 1.0 + } + }) { (error) in + viewController.activityIndicator.stopAnimating() + viewController.activityIndicator.removeFromSuperview() + viewController.view.alpha = 1.0 + let ac = UIAlertController(title: "Ops!", message: "Erro ao entrar, verifique sua conexão ou tente mais tarde", preferredStyle: .alert) + ac.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) + viewController.present(ac, animated: true, completion: nil) + } + } + + func authentication(loginViewController: LoginViewController, credentialsDelegate: UserAndSafeDataDelegate) { + let context = LAContext() + if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthentication, error: nil) { + self.checkAuthentication(context: context, loginViewController: loginViewController, credentialsDelegate: credentialsDelegate) + } + } + + func checkAuthentication(context: LAContext, loginViewController: LoginViewController, credentialsDelegate: UserAndSafeDataDelegate) { + let reason = "Use suas credenciais para acessar sua conta" + var error: NSError? + + if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) { + context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { [unowned self] (success, error) in + DispatchQueue.main.async { + if success { + guard let user = UserDefaults.standard.string(forKey: "userData") else { return } + let passwordReturn = credentialsDelegate.loadKeys(credentials: user) + + if let passwordData = passwordReturn { + loginViewController.passwordTextField.text = passwordData.password + loginViewController.loginAction() + } + } else { + print("error") + } + } + } + } else { + let ac = UIAlertController(title: "Biometria não disponível", message: "Seu aparelho não está configurado para autenticar com biometria", preferredStyle: .alert) + ac.addAction(UIAlertAction(title: "OK", style: .default)) + loginViewController.present(ac, animated: true) + } + } + + func login(loginViewController: LoginViewController, delegate: UserAndSafeDataDelegate, router: UserTransactionsRouter) { + guard let userTF = loginViewController.userTextField.text else { return } + guard let passwordTF = loginViewController.passwordTextField.text else { return } + + if (delegate.isValidEmail(email: userTF) || delegate.isValidCPF(cpfInput: userTF)) && delegate.isValidPassword(input: passwordTF) { + self.lastUserLogged = userTF + UserDefaults.standard.set(userTF, forKey: "userData") + let credentials = Credentials(username: userTF, password: passwordTF) + do { + try delegate.saveKeys(credentials: credentials) + } catch { + let alert = UIAlertController(title: "Erro", message: "Verifique suas credenciais e tente outra vez", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) + loginViewController.present(alert, animated: true, completion: nil) + } + + self.data = DetailDataToBePosted(userId: 1, name: "Jose da Silva Teste", bankAccount: "2050", agency: "01.231456-4", balance: 3.3445) + router.toBePosted = data + loginViewController.addActivityIndicator() + self.post(dataToBePosted: data, viewController: loginViewController) + loginViewController.passwordTextField.text?.removeAll() + + } else { + let alert = UIAlertController(title: "Dados inválidos", message: "Verifique seus dados", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) + loginViewController.present(alert, animated: true, completion: nil) + } + } +} diff --git a/TesteiOS/TesteiOS/Login/LoginViewController.swift b/TesteiOS/TesteiOS/Login/LoginViewController.swift new file mode 100644 index 00000000..367d3216 --- /dev/null +++ b/TesteiOS/TesteiOS/Login/LoginViewController.swift @@ -0,0 +1,148 @@ +// +// ViewController.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 19/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import UIKit +import LocalAuthentication + +class LoginViewController: UIViewController, UserAndSafeDataDelegate { + + lazy var bankImage: UIImageView = { + let image = UIImage(named: "Logo.png") + let imageView = BankImage(image: image) + imageView.translatesAutoresizingMaskIntoConstraints = false + return imageView + }() + lazy var userTextField: UITextField = { + let textField = UserTextField(frame: .zero) + textField.translatesAutoresizingMaskIntoConstraints = false + return textField + }() + lazy var passwordTextField: UITextField = { + let textField = PasswordTextField(frame: .zero) + textField.translatesAutoresizingMaskIntoConstraints = false + return textField + }() + lazy var loginButton: UIButton = { + let button = LoginButton(frame: .zero) + button.translatesAutoresizingMaskIntoConstraints = false + button.addTarget(self, action: #selector(loginAction), for: .touchUpInside) + return button + }() + lazy var stack: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [userTextField, passwordTextField]) + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.axis = .vertical + stackView.distribution = .equalSpacing + stackView.spacing = 15.0 + return stackView + }() + lazy var authButton: UIButton = { + let button = UIButton(frame: .zero) + let image = UIImage(named: "auth") + button.translatesAutoresizingMaskIntoConstraints = false + button.setImage(image, for: .normal) + button.addTarget(self, action: #selector(authFromPresenter), for: .touchUpInside) + return button + }() + let activityIndicator = UIActivityIndicatorView(style: .gray) + var delegate: UserAndSafeDataDelegate? + var interactor: PostAndAuthInteractorProtocol? + var routing: ShowTransacionsRouter? + var transactionsInteractor: GetTransactions? + var detailDataToBePosted: DetailDataToBePosted! + let router = UserTransactionsRouter() + var presenter: PresentPostData? + + override func viewDidLoad() { + super.viewDidLoad() + + setup() + + self.view.addSubview(bankImage) + self.stack.addSubview(userTextField) + self.stack.addSubview(passwordTextField) + self.view.addSubview(loginButton) + self.view.addSubview(stack) + self.view.addSubview(authButton) + self.delegate = self + + + guard let user = UserDefaults.standard.string(forKey: "userData") else { return } + + if !user.isEmpty { + self.userTextField.text = user + guard let safeDelegate = delegate else { return } + self.presenter?.authenticateData(loginViewController: self, credentialsDelegate: safeDelegate) + } + } + + override func viewDidLayoutSubviews() { + self.userTextField.heightAnchor.constraint(equalToConstant: 50).isActive = true + self.passwordTextField.heightAnchor.constraint(equalToConstant: 50).isActive = true + self.loginButton.heightAnchor.constraint(equalToConstant: 50).isActive = true + self.bankImage.heightAnchor.constraint(equalToConstant: 70).isActive = true + self.bankImage.widthAnchor.constraint(equalToConstant: 125).isActive = true + self.authButton.widthAnchor.constraint(equalToConstant: 50).isActive = true + self.authButton.heightAnchor.constraint(greaterThanOrEqualToConstant: 44).isActive = true + self.bankImage.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 50).isActive = true + self.bankImage.centerXAnchor.constraint(equalTo: self.view.centerXAnchor, constant: 0).isActive = true + self.view.trailingAnchor.constraint(equalTo: self.stack.trailingAnchor, constant: 15).isActive = true + self.stack.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 15).isActive = true + self.stack.centerXAnchor.constraint(equalTo: self.view.centerXAnchor, constant: 0).isActive = true + self.stack.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 0).isActive = true + self.authButton.topAnchor.constraint(equalTo: self.stack.bottomAnchor, constant: 25).isActive = true + self.authButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true + self.loginButton.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 100).isActive = true + self.view.trailingAnchor.constraint(equalTo: self.loginButton.trailingAnchor, constant: 100).isActive = true + self.view.bottomAnchor.constraint(equalTo: self.loginButton.bottomAnchor, constant: 50).isActive = true + + loginButton.layer.shadowColor = UIColor.black.cgColor + loginButton.layer.shadowOffset = CGSize(width: 0, height: 5) + loginButton.layer.shadowRadius = 2.0 + loginButton.layer.shadowOpacity = 0.3 + loginButton.layer.masksToBounds = false + loginButton.layer.shadowPath = UIBezierPath(roundedRect: loginButton.bounds, cornerRadius: loginButton.layer.cornerRadius).cgPath + + } + + func setup() { + let viewController = self + let interactor = LoginInteractor() + let presenter = LoginPresenter() + viewController.interactor = interactor + viewController.routing = router + viewController.presenter = presenter + } + + @objc func loginAction() { + guard let safeDelegate = delegate else { return } + self.presenter?.login(loginViewController: self, delegate: safeDelegate, router: router) + } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "segue" { + guard let vc = segue.destination as? UserTransactionsViewController else { return } + router.routeToTransactions(destination: vc) + } + } + + @objc func authFromPresenter() { + guard let safeDelegate = delegate else { return } + self.presenter?.authenticateData(loginViewController: self, credentialsDelegate: safeDelegate) + } + + + func addActivityIndicator() { + self.view.alpha = 0.5 + view.addSubview(activityIndicator) + activityIndicator.translatesAutoresizingMaskIntoConstraints = false + activityIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true + activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true + activityIndicator.startAnimating() + } +} diff --git a/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/BankImage.swift b/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/BankImage.swift new file mode 100644 index 00000000..99745cb4 --- /dev/null +++ b/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/BankImage.swift @@ -0,0 +1,25 @@ +// +// BankImage.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 20/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +class BankImage: UIImageView { + + + + override init(image: UIImage?) { + super.init(image: image) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + +} diff --git a/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/LoginButton.swift b/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/LoginButton.swift new file mode 100644 index 00000000..a187810a --- /dev/null +++ b/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/LoginButton.swift @@ -0,0 +1,24 @@ +// +// LoginButton.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 20/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import UIKit + +class LoginButton: UIButton { + + override init(frame: CGRect) { + super.init(frame: frame) + self.setTitle("Login", for: .normal) + self.backgroundColor = UIColor.spc_from(r: 59, g: 72, b: 238) + self.layer.cornerRadius = 3 + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/PasswordTextField.swift b/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/PasswordTextField.swift new file mode 100644 index 00000000..a4a640e6 --- /dev/null +++ b/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/PasswordTextField.swift @@ -0,0 +1,46 @@ +// +// PasswordTextField.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 20/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +class PasswordTextField: UITextField { + + override init(frame: CGRect) { + super.init(frame: frame) + self.placeholder = " Password" + self.layer.borderWidth = 0.25 + self.layer.cornerRadius = 3 + self.autocorrectionType = .no + self.keyboardType = .default + self.returnKeyType = .done + self.isSecureTextEntry = true + self.delegate = self + if #available(iOS 10.0, *) { + if #available(iOS 11.0, *) { + self.textContentType = UITextContentType.password + } else { + // Fallback on earlier versions + } + } else { + // Fallback on earlier versions + } + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension PasswordTextField: UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + var firstResponder = textField.resignFirstResponder() + firstResponder = true + return firstResponder + } +} diff --git a/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/UserTextField.swift b/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/UserTextField.swift new file mode 100644 index 00000000..7c7b3b46 --- /dev/null +++ b/TesteiOS/TesteiOS/Login/ObjectsFromLoginVC/UserTextField.swift @@ -0,0 +1,36 @@ +// +// UserTextField.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 20/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +class UserTextField: UITextField { + + override init(frame: CGRect) { + super.init(frame: frame) + self.placeholder = " User" + self.layer.borderWidth = 0.25 + self.layer.cornerRadius = 3 + self.autocorrectionType = .no + self.returnKeyType = .next + if #available(iOS 10.0, *) { + if #available(iOS 11.0, *) { + self.textContentType = UITextContentType.username + } else { + // Fallback on earlier versions + } + } else { + // Fallback on earlier versions + } + + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/TesteiOS/TesteiOS/Login/PostDataPresenter.swift b/TesteiOS/TesteiOS/Login/PostDataPresenter.swift new file mode 100644 index 00000000..3e466212 --- /dev/null +++ b/TesteiOS/TesteiOS/Login/PostDataPresenter.swift @@ -0,0 +1,36 @@ +// +// PostDataPresenter.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 22/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +protocol PresentPostData { + func presentingPostData(data: DetailDataToBePosted) + func authenticateData(loginViewController: LoginViewController, credentialsDelegate: UserAndSafeDataDelegate) + func login(loginViewController: LoginViewController, delegate: UserAndSafeDataDelegate, router: UserTransactionsRouter) +} + +class LoginPresenter: PresentPostData { + + var viewController: LoginViewController? + var interactor: LoginInteractor? + func presentingPostData(data: DetailDataToBePosted) { + + } + + func authenticateData(loginViewController: LoginViewController, credentialsDelegate: UserAndSafeDataDelegate) { + interactor = LoginInteractor() + interactor?.authentication(loginViewController: loginViewController, credentialsDelegate: credentialsDelegate) + } + + func login(loginViewController: LoginViewController, delegate: UserAndSafeDataDelegate, router: UserTransactionsRouter) { + interactor = LoginInteractor() + interactor?.login(loginViewController: loginViewController, delegate: delegate, router: router) + } + +} diff --git a/TesteiOS/TesteiOS/Login/RouterLoginViewController.swift b/TesteiOS/TesteiOS/Login/RouterLoginViewController.swift new file mode 100644 index 00000000..99d3a9c3 --- /dev/null +++ b/TesteiOS/TesteiOS/Login/RouterLoginViewController.swift @@ -0,0 +1,30 @@ +// +// RouterLoginViewController.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 22/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +protocol ShowTransacionsRouter { + func routeToTransactions(destination: UserTransactionsViewController) +} + +protocol ShowTransactionsDataPassing { + var toBePosted: DetailDataToBePosted? { get } +} + +class UserTransactionsRouter: ShowTransacionsRouter, ShowTransactionsDataPassing { + + var viewController: LoginViewController? + var toBePosted: DetailDataToBePosted? + var destinationInteractor: TransactionsInteractor? + + func routeToTransactions(destination: UserTransactionsViewController) { + destination.userData = toBePosted + } + +} diff --git a/TesteiOS/TesteiOS/Login/UserAndSafeDataDelegate.swift b/TesteiOS/TesteiOS/Login/UserAndSafeDataDelegate.swift new file mode 100644 index 00000000..dfc65b57 --- /dev/null +++ b/TesteiOS/TesteiOS/Login/UserAndSafeDataDelegate.swift @@ -0,0 +1,98 @@ +// +// UserAndSafeDataDelegate.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 21/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation + +enum KeychainError: Error { + case noPassword + case unexpectedPasswordData + case unhandledError(status: OSStatus) +} + +struct Credentials { + var username: String + var password: String +} + +protocol UserAndSafeDataDelegate { + func isValidPassword(input: String) -> Bool + func isValidEmail(email: String) -> Bool + func isValidCPF(cpfInput: String) -> Bool +} + +extension UserAndSafeDataDelegate { + + func isValidPassword(input: String) -> Bool { + //guard input.count > 8 else { return false } + let setOfUppercase: CharacterSet = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZ") + let setOfNumbersAndAlpha = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyz0123456789") + let setOfUpperNormalandNumbers = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + if input.rangeOfCharacter(from: setOfUpperNormalandNumbers.inverted) == nil { + return false + } else if input.rangeOfCharacter(from: setOfUppercase) == nil { + return false + } else if input.rangeOfCharacter(from: setOfNumbersAndAlpha) == nil { + return false + } else { + return true + } + } + + func isValidEmail(email: String) -> Bool { + let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" + let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) + return emailTest.evaluate(with: email) + } + + func isValidCPF(cpfInput: String) -> Bool { + let numbers = cpfInput.filter { "0123456789".contains($0) } + if numbers.count < 11 { + return false + } else { + return true + } + } + + @discardableResult + func saveKeys(credentials: Credentials) throws -> OSStatus? { + guard let encodedPassword = credentials.password.data(using: String.Encoding.utf8) else { return nil } + let queryCredentials: [String: Any] = [ + kSecClass as String : kSecClassGenericPassword, + kSecAttrAccount as String : credentials.username, + kSecAttrService as String: "SantanderTest", + kSecValueData as String : encodedPassword + ] + + SecItemDelete(queryCredentials as CFDictionary) + + let status = SecItemAdd(queryCredentials as CFDictionary, nil) + guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) } + return status + } + + func loadKeys(credentials: String) -> Credentials? { + + var passwordData: AnyObject? + var returnString: String + let queryCredentials: [String: Any] = [ + kSecClass as String : kSecClassGenericPassword, + kSecAttrAccount as String : credentials, + kSecReturnData as String : kCFBooleanTrue, + kSecMatchLimit as String : kSecMatchLimitOne + ] + let status: OSStatus = SecItemCopyMatching(queryCredentials as CFDictionary, &passwordData) + + if status == noErr { + if let retrievedData = passwordData as? Data { + returnString = String(data: retrievedData, encoding: String.Encoding.utf8)! + return Credentials(username: credentials, password: returnString) + } + } + return nil + } +} diff --git a/TesteiOS/TesteiOS/Network/RequestAndPostDataWorker.swift b/TesteiOS/TesteiOS/Network/RequestAndPostDataWorker.swift new file mode 100644 index 00000000..92ee9152 --- /dev/null +++ b/TesteiOS/TesteiOS/Network/RequestAndPostDataWorker.swift @@ -0,0 +1,95 @@ +import Foundation + +class RequestAndPostDataWorker { + private static let configuration: URLSessionConfiguration = { + let config = URLSessionConfiguration.default + config.timeoutIntervalForRequest = 30.0 + return config + }() + private static let session = URLSession(configuration: configuration) + + class func getData(id: Int, completion: @escaping (T) -> Void, onError: @escaping (LoadError) -> Void) { + + let path = "https://bank-app-test.herokuapp.com/api/statements/\(id)" + + guard let url = URL(string: path) else { + return onError(.url) + } + + let dataTask = session.dataTask(with: url) { (data, response, error) in + + self.requestResponse(completion: completion, onError: onError)(data, response, error) + + } + dataTask.resume() + } + + class func postData(loginData: LoginData, completion: @escaping (Bool) -> Void, onError: @escaping (LoadError) -> Void) { + + let path = "https://bank-app-test.herokuapp.com/api/login" + + guard let url = URL(string: path) else { + return onError(.url) + } + + var request = URLRequest(url: url) + request.httpMethod = "POST" + + + guard let data = try? JSONEncoder().encode(loginData) else { + completion(false) + return + } + print(data) + request.httpBody = data + + let dataTask = session.dataTask(with: request) { (data, response, error) in + + self.postRequestResponse(completion: completion, onError: onError)(data, response, error) + + } + dataTask.resume() + + } + + class func requestResponse(completion: @escaping (T) -> Void, onError: @escaping (LoadError) -> Void) -> ((Data?, URLResponse?, Error?) -> Void) { + + return { data, response, error in + if error == nil { + guard let response = response as? HTTPURLResponse else { + onError(.noResponse) + return + } + if response.statusCode == 200 { + guard let data = data else { return } + do { + let returnData = try JSONDecoder().decode(T.self, from: data) + print("return data \(returnData)") + completion(returnData) + } catch { + onError(.invalidJSON) + } + + } else { + onError(.responseStatusCode(code: response.statusCode)) + } + } else { + onError(.taskError(error: error!)) + } + } + } + + class func postRequestResponse(completion: @escaping(Bool) -> Void, onError: @escaping(LoadError) -> Void) -> ((Data?, URLResponse?, Error?) -> Void) { + return { data, response, error in + if error == nil { + guard let response = response as? HTTPURLResponse, response.statusCode == 200, let _ = data else { + onError(.noResponse) + return + } + completion(true) + } else { + completion(false) + } + } + } +} diff --git a/TesteiOS/TesteiOS/Transactions/TransactionsInteractor.swift b/TesteiOS/TesteiOS/Transactions/TransactionsInteractor.swift new file mode 100644 index 00000000..e0a6bac6 --- /dev/null +++ b/TesteiOS/TesteiOS/Transactions/TransactionsInteractor.swift @@ -0,0 +1,41 @@ +// +// TransactionsInteractor.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 22/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import UIKit + +protocol GetTransactions { + func getTransactions(userTransactionsViewController: UserTransactionsViewController) +} + +protocol TransactionsOfUserWithId { + var id: Int? { get set } +} + +class TransactionsInteractor: GetTransactions, TransactionsOfUserWithId { + + var presenter: GetTransactionsPresenter? + var id: Int? + var statementRequest: StatementsRequest? + + func getTransactions(userTransactionsViewController: UserTransactionsViewController) { + guard let newId = id else { return } + RequestAndPostDataWorker.getData(id: newId, completion: { (statement: StatementsRequest) in + self.statementRequest = StatementsRequest.init(statementList: statement.statementList, error: statement.error) + guard let list = self.statementRequest?.statementList else { return } + DispatchQueue.main.async { + self.presenter?.getTransactions(statementRequestList: list) + } + }) { (error) in + let ac = UIAlertController(title: "Ops!", message: "Erro ao carregar seus dados, verifique sua conexão ou tente mais tarde", preferredStyle: .alert) + ac.addAction(UIAlertAction(title: "OK", style: .default, handler: { (alert) in + self.presenter?.dismissViewController(viewController: userTransactionsViewController) + + })) + } + } +} diff --git a/TesteiOS/TesteiOS/Transactions/TransactionsPresenter.swift b/TesteiOS/TesteiOS/Transactions/TransactionsPresenter.swift new file mode 100644 index 00000000..99ebb7d6 --- /dev/null +++ b/TesteiOS/TesteiOS/Transactions/TransactionsPresenter.swift @@ -0,0 +1,28 @@ +// +// TransactionsPresenter.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 22/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import UIKit + +protocol GetTransactionsPresenter { + func getTransactions(statementRequestList: [StatementListRequest]) + func dismissViewController(viewController: UserTransactionsViewController) +} + +class TransactionsPresenter: GetTransactionsPresenter { + + weak var viewController: UserTransactionsViewController? + + func getTransactions(statementRequestList: [StatementListRequest]) { + viewController?.data = statementRequestList + viewController?.finishLoadingContent() + } + + func dismissViewController(viewController: UserTransactionsViewController) { + viewController.dismiss(animated: true, completion: nil) + } +} diff --git a/TesteiOS/TesteiOS/Transactions/TransactionsViewController.swift b/TesteiOS/TesteiOS/Transactions/TransactionsViewController.swift new file mode 100644 index 00000000..306d13c2 --- /dev/null +++ b/TesteiOS/TesteiOS/Transactions/TransactionsViewController.swift @@ -0,0 +1,150 @@ +// +// TransactionsViewController.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 22/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +class UserTransactionsViewController: UIViewController { + + let accountInformationView = UIView() + var router: UserTransactionsRouter? + var data: [StatementListRequest]? + var userData: DetailDataToBePosted? + var interactor: GetTransactions? + override var preferredStatusBarStyle: UIStatusBarStyle { + return .lightContent + } + + @IBOutlet weak var userAccountView: UIView! + @IBOutlet weak var userNameLabel: UILabel! + @IBOutlet weak var logoutButton: UIButton! + @IBOutlet weak var agencyAccountNumberLabel: UILabel! + @IBOutlet weak var balanceLabel: UILabel! + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var activity: UIActivityIndicatorView! + + override func viewDidAppear(_ animated: Bool) { + guard let returnedUserData = userData else { return } + super.viewDidAppear(animated) + userNameLabel.text = returnedUserData.name + agencyAccountNumberLabel.text = "\(String(describing: returnedUserData.bankAccount)) / \(String(describing: returnedUserData.agency))" + balanceLabel.text = "R$ " + convertDoubleFormat(input: returnedUserData.balance) + } + + override func viewDidLoad() { + super.viewDidLoad() + setup() + view.addSubview(activity) + activity.startAnimating() + collectionView.delegate = self + collectionView.dataSource = self + userAccountView.backgroundColor = UIColor.spc_from(r: 59, g: 73, b: 238) + } + + @IBAction func dismissViewController(_ sender: UIButton) { + self.dismiss(animated: true, completion: nil) + } + + + func setup() { + let viewController = self + let router = UserTransactionsRouter() + let presenter = TransactionsPresenter() + let interactor = TransactionsInteractor() + viewController.router = router + viewController.interactor = interactor + interactor.presenter = presenter + presenter.viewController = viewController + interactor.id = userData?.userId + interactor.getTransactions(userTransactionsViewController: self) + } + + func finishLoadingContent() { + self.activity.stopAnimating() + self.activity.removeFromSuperview() + self.collectionView.reloadData() + } + +} + +extension UserTransactionsViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let width = collectionView.bounds.size.width - 32 + let height: CGFloat = 80.0 + return CGSize(width: width, height: height) + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + return UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16) + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { + return 15 + } + + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { + if let sectionHeader = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "sectionHeader", for: indexPath) as? SectionHeader { + sectionHeader.sectionHeaderLabel.text = "Recentes" + return sectionHeader + } + return UICollectionReusableView() + } + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return 1 + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + guard let data = data else { return 0 } + return data.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "transactionCell", for: indexPath) as! UserTransactionsCollectionViewCell + cell.layer.cornerRadius = 5 + cell.layer.borderColor = UIColor.lightGray.cgColor + cell.layer.borderWidth = 0.2 + guard let data = data else { return UICollectionViewCell() } + + cell.typeOfTransaction.text = data[indexPath.row].title + cell.date.text = convertDateFormat(input: data[indexPath.row].date) + cell.nameOfTransaction.text = data[indexPath.row].desc + cell.amount.text = "R$ " + convertDoubleFormat(input: (data[indexPath.row].value)) + //cell.amount.text = "R$ \(data[indexPath.row].value)" + + cell.contentView.layer.masksToBounds = true + cell.backgroundColor = .white + cell.layer.shadowColor = UIColor.black.cgColor + cell.layer.shadowOffset = CGSize(width: 0, height: 3) + cell.layer.shadowRadius = 2.0 + cell.layer.shadowOpacity = 0.1 + cell.layer.masksToBounds = false + cell.layer.shadowPath = UIBezierPath(roundedRect: cell.bounds, cornerRadius: cell.layer.cornerRadius).cgPath + + return cell + } + + func convertDateFormat(input: String) -> String { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + let date = dateFormatter.date(from: input) + dateFormatter.dateFormat = "dd/MM/yyyy" + guard let returnDate = date else { return "" } + return dateFormatter.string(from: returnDate) + + } + + func convertDoubleFormat(input: Double) -> String { + let formatter = NumberFormatter() + formatter.decimalSeparator = "," + formatter.maximumFractionDigits = 2 + return formatter.string(from: NSNumber(value: input)) ?? "0" + } +} diff --git a/TesteiOS/TesteiOS/Transactions/UserTransactionsCollectionView.swift b/TesteiOS/TesteiOS/Transactions/UserTransactionsCollectionView.swift new file mode 100644 index 00000000..a2c608bb --- /dev/null +++ b/TesteiOS/TesteiOS/Transactions/UserTransactionsCollectionView.swift @@ -0,0 +1,14 @@ +// +// UserTransactionsTableView.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 22/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +class SectionHeader: UICollectionReusableView { + @IBOutlet weak var sectionHeaderLabel: UILabel! +} diff --git a/TesteiOS/TesteiOS/Transactions/UserTransactionsCollectionViewCell.swift b/TesteiOS/TesteiOS/Transactions/UserTransactionsCollectionViewCell.swift new file mode 100644 index 00000000..f7a3bf94 --- /dev/null +++ b/TesteiOS/TesteiOS/Transactions/UserTransactionsCollectionViewCell.swift @@ -0,0 +1,19 @@ +// +// UserTransactionsCollectionViewCell.swift +// TesteiOS +// +// Created by Gabriel Soria Souza on 22/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import Foundation +import UIKit + +class UserTransactionsCollectionViewCell: UICollectionViewCell { + + @IBOutlet weak var typeOfTransaction: UILabel! + @IBOutlet weak var nameOfTransaction: UILabel! + @IBOutlet weak var date: UILabel! + @IBOutlet weak var amount: UILabel! + +} diff --git a/TesteiOS/TesteiOS/Workers/DataRequestWorkers.swift b/TesteiOS/TesteiOS/Workers/DataRequestWorkers.swift new file mode 100644 index 00000000..e0823625 --- /dev/null +++ b/TesteiOS/TesteiOS/Workers/DataRequestWorkers.swift @@ -0,0 +1,60 @@ +import Foundation + +public enum LoadError { + case url + case taskError(error: Error) + case noResponse + case noData + case responseStatusCode(code: Int) + case invalidJSON +} + +struct StatementsRequest: Codable { + let statementList: [StatementListRequest] + let error: EmptyErrorData? + + init(statementList: [StatementListRequest], error: EmptyErrorData?) { + self.statementList = statementList + self.error = error + } +} + +struct StatementListRequest: Codable { + var title: String + var desc: String + var date: String + var value: Double +} + +struct EmptyErrorData: Codable { + +} + +public struct TransactionDataList { + public var transaction: TransactionDataModel + + public init(transaction: TransactionDataModel) { + self.transaction = transaction + } +} + +public struct TransactionDataModel { + var title: String + var desc: String + var date: String + var value: Double + + public init(title: String, desc: String, date: String, value: Double) { + self.title = title + self.desc = desc + self.date = date + self.value = value + } +} + +public struct ViewModelOfTransaction { + var title: String + var desc: String + var date: String + var value: Double +} diff --git a/TesteiOS/TesteiOS/Workers/LoginWorkers.swift b/TesteiOS/TesteiOS/Workers/LoginWorkers.swift new file mode 100644 index 00000000..5678aa06 --- /dev/null +++ b/TesteiOS/TesteiOS/Workers/LoginWorkers.swift @@ -0,0 +1,28 @@ +import Foundation + +struct LoginData: Codable { + let userData: UserDataForLogin + let error: EmptyErrorData? + + init(userData: UserDataForLogin, error: EmptyErrorData?) { + self.userData = userData + self.error = error + } +} + +struct UserDataForLogin: Codable { + let userId: Int + let name: String + let bankAccount: String + let agency: String + let balance: Double + + init(userId: Int, name: String, bankAccount: String, agency: String, balance: Double) { + self.userId = userId + self.name = name + self.bankAccount = bankAccount + self.agency = agency + self.balance = balance + } +} + diff --git a/TesteiOS/TesteiOS/Workers/PostDataWorkers.swift b/TesteiOS/TesteiOS/Workers/PostDataWorkers.swift new file mode 100644 index 00000000..502c45f8 --- /dev/null +++ b/TesteiOS/TesteiOS/Workers/PostDataWorkers.swift @@ -0,0 +1,37 @@ +import Foundation + +struct PostData { + let userAccount: DataFromPostData +} + +struct DataFromPostData: Codable { + let userID: Int + let name: String + let bankAccount: String + let agency: String + let balance: Double + + init(userID: Int, name: String, bankAccount: String, agency: String, balance: Double) { + self.userID = userID + self.name = name + self.bankAccount = bankAccount + self.agency = agency + self.balance = balance + } +} + +struct DataToBePosted { + var userAccount: DetailDataToBePosted +} + +struct DetailDataToBePosted { + var userId: Int + var name: String + var bankAccount: String + var agency: String + var balance: Double +} + +struct ViewModelPostData { + +} diff --git a/TesteiOS/TesteiOSTests/Info.plist b/TesteiOS/TesteiOSTests/Info.plist new file mode 100644 index 00000000..6c40a6cd --- /dev/null +++ b/TesteiOS/TesteiOSTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/TesteiOS/TesteiOSTests/TesteiOSTests.swift b/TesteiOS/TesteiOSTests/TesteiOSTests.swift new file mode 100644 index 00000000..b757a187 --- /dev/null +++ b/TesteiOS/TesteiOSTests/TesteiOSTests.swift @@ -0,0 +1,114 @@ +// +// TesteiOSTests.swift +// TesteiOSTests +// +// Created by Gabriel Soria Souza on 26/10/18. +// Copyright © 2018 Gabriel Sória Souza. All rights reserved. +// + +import XCTest +import LocalAuthentication +@testable import TesteiOS + +class TesteiOSTests: XCTestCase { + + var loginInteractor: LoginInteractor! + var detailDataToBePosted: DetailDataToBePosted! + var viewController: LoginViewController! + let storyboard = UIStoryboard(name: "Main", bundle: nil) + var userTransactionsViewController: UserTransactionsViewController! + + override func setUp() { + loginInteractor = LoginInteractor() + viewController = LoginViewController() + } + + override func tearDown() { + + } + + func test_loadLoginViewControllerInteractor() { + viewController.loadViewIfNeeded() + XCTAssertNotNil(viewController.interactor) + } + + func test_loadLoginViewControllerPresenter() { + viewController.loadViewIfNeeded() + XCTAssertNotNil(viewController.presenter) + } + + func test_loadLoginViewControllerRouter() { + viewController.loadViewIfNeeded() + XCTAssertNotNil(viewController.router) + } + + func test_loadLoginViewControllerDelegate() { + viewController.loadViewIfNeeded() + XCTAssertNotNil(viewController.delegate) + } + + func test_postingData() { + detailDataToBePosted = DetailDataToBePosted(userId: 2, name: "Teste Gabriel", bankAccount: "123123", agency: "1231", balance: 1000.00) + let loginData = UserDataForLogin(userId: detailDataToBePosted.userId, name: detailDataToBePosted.name, bankAccount: detailDataToBePosted.bankAccount, agency: detailDataToBePosted.agency, balance: detailDataToBePosted.balance) + let completeLoginData = LoginData.init(userData: loginData, error: nil) + + RequestAndPostDataWorker.postData(loginData: completeLoginData, completion: { (success) in + XCTAssertTrue(success) + }) { (error) in + XCTAssertNil(error) + } + } + + func test_password() { + viewController.loadViewIfNeeded() + //password + XCTAssertFalse(viewController.delegate!.isValidPassword(input: "aaa")) + XCTAssertFalse(viewController.delegate!.isValidPassword(input: "aaa...")) + XCTAssertFalse(viewController.delegate!.isValidPassword(input: "aaaHHH")) + XCTAssertFalse(viewController.delegate!.isValidPassword(input: "HHH...")) + XCTAssertFalse(viewController.delegate!.isValidPassword(input: ".1")) + XCTAssertTrue(viewController.delegate!.isValidPassword(input: "1G>")) + XCTAssertTrue(viewController.delegate!.isValidPassword(input: "K&a")) + + //CPF + XCTAssertFalse(viewController.delegate!.isValidCPF(cpfInput: "4177579580")) + XCTAssertFalse(viewController.delegate!.isValidCPF(cpfInput: "417757958")) + XCTAssertFalse(viewController.delegate!.isValidCPF(cpfInput: "gabrielss.rock@me.com")) + + //EMAIL + XCTAssertFalse(viewController.delegate!.isValidEmail(email: "@gmail.com")) + XCTAssertFalse(viewController.delegate!.isValidEmail(email: "a@.com")) + XCTAssertFalse(viewController.delegate!.isValidEmail(email: "a@.com")) + XCTAssertFalse(viewController.delegate!.isValidEmail(email: "a@gmail.")) + XCTAssertTrue(viewController.delegate!.isValidEmail(email: "gabrielss.rock@me.com")) + + } + + func test_saveAndLoadKeys() { + viewController.loadViewIfNeeded() + let delegate = viewController.delegate + let credentialTest = Credentials(username: "gabrielss.rock@me.com", password: "H.1") + try? XCTAssertNotNil(delegate?.saveKeys(credentials: credentialTest)) + XCTAssertNotNil(delegate?.loadKeys(credentials: credentialTest.username)) + } + + func test_authentication() { + viewController.loadViewIfNeeded() + XCTAssertNotNil(viewController.delegate) + viewController.userTextField.text = "41775795800" + viewController.passwordTextField.text = "H.1" + + let context = LAContext() + var theError: NSError? + + if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &theError) { + context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "TEST") { (success, error) in + XCTAssertTrue(success) + if success { + UserDefaults.standard.set(self.viewController.userTextField.text, forKey: "userData") + } + XCTAssertNil(error) + } + } + } +} diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@0.5x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@0.5x.png deleted file mode 100644 index 53a1cdeb..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@0.5x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@1x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@1x.png deleted file mode 100644 index fb33afda..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@1x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@2x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@2x.png deleted file mode 100644 index 5f731302..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@2x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@3x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@3x.png deleted file mode 100644 index 1eda7465..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@3x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@0.5x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@0.5x.png deleted file mode 100644 index b79e2ecf..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@0.5x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@1x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@1x.png deleted file mode 100644 index b961132e..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@1x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@2x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@2x.png deleted file mode 100644 index a9483ea0..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@2x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@3x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@3x.png deleted file mode 100644 index af2a6f7b..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@3x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@0.5x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@0.5x.png deleted file mode 100644 index 08ae82bd..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@0.5x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@1x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@1x.png deleted file mode 100644 index 66948cab..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@1x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@2x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@2x.png deleted file mode 100644 index 0d20e802..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@2x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@3x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@3x.png deleted file mode 100644 index 8d42293a..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@3x.png and /dev/null differ diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/artboard.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/artboard.png deleted file mode 100644 index 20c1aa4b..00000000 Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/artboard.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@0.5x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@0.5x.png deleted file mode 100644 index fed7233b..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@0.5x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@1x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@1x.png deleted file mode 100644 index 5899f020..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@1x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@2x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@2x.png deleted file mode 100644 index 2315098f..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@2x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@3x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@3x.png deleted file mode 100644 index e47f4601..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@3x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@0.5x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@0.5x.png deleted file mode 100644 index 242c3fda..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@0.5x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@1x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@1x.png deleted file mode 100644 index 23ff4626..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@1x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@2x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@2x.png deleted file mode 100644 index 35d07a14..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@2x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@3x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@3x.png deleted file mode 100644 index 97b68a58..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@3x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@0.5x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@0.5x.png deleted file mode 100644 index 117de969..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@0.5x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@1x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@1x.png deleted file mode 100644 index 5ff77a67..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@1x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@2x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@2x.png deleted file mode 100644 index 73b2edba..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@2x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@3x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@3x.png deleted file mode 100644 index beba6c0c..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@3x.png and /dev/null differ diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/artboard.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/artboard.png deleted file mode 100644 index 9befa0cc..00000000 Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/artboard.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@0.5x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@0.5x.png deleted file mode 100644 index 10ad360f..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@0.5x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@1x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@1x.png deleted file mode 100644 index 5fbb1241..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@1x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@2x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@2x.png deleted file mode 100644 index fde4b9b7..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@2x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@3x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@3x.png deleted file mode 100644 index af0e0ac7..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@3x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@0.5x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@0.5x.png deleted file mode 100644 index ec991238..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@0.5x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@1x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@1x.png deleted file mode 100644 index 7307b9e1..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@1x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@2x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@2x.png deleted file mode 100644 index 1178f890..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@2x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@3x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@3x.png deleted file mode 100644 index f0d400be..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@3x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@0.5x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@0.5x.png deleted file mode 100644 index 5066a058..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@0.5x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@1x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@1x.png deleted file mode 100644 index 831e7bb4..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@1x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@2x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@2x.png deleted file mode 100644 index d857b805..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@2x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@3x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@3x.png deleted file mode 100644 index d91b98e6..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@3x.png and /dev/null differ diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/artboard.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/artboard.png deleted file mode 100644 index 2acdd074..00000000 Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/artboard.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@0.5x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@0.5x.png deleted file mode 100644 index 535dafe1..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@0.5x.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@1x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@1x.png deleted file mode 100644 index 466ef1c0..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@1x.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@2x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@2x.png deleted file mode 100644 index cb118e91..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@2x.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@3x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@3x.png deleted file mode 100644 index a650b819..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@3x.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@0.5x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@0.5x.png deleted file mode 100644 index de8e4b18..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@0.5x.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@1x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@1x.png deleted file mode 100644 index d720a4f0..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@1x.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@2x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@2x.png deleted file mode 100644 index 9f57e790..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@2x.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@3x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@3x.png deleted file mode 100644 index fee69c19..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@3x.png and /dev/null differ diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/artboard.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/artboard.png deleted file mode 100644 index c620ef44..00000000 Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/artboard.png and /dev/null differ diff --git a/bank_app_layout/data.js b/bank_app_layout/data.js deleted file mode 100644 index a692702f..00000000 --- a/bank_app_layout/data.js +++ /dev/null @@ -1 +0,0 @@ -var pageData = {"exportEveryLayer":1,"sketchName":"","language":"en","I18N":{"UNIT":"Unit","SIZE":"Size","SHOWSLICE":"Show slices","DRAGTOSAVE":"Drag to desktop to save.","WIDTH":"Width","HEIGHT":"Height","BORDER":"Border","COLOR":"Color","FILLCOLOR":"Fill","RADIUS":"Radius","LAYERTEXT":"Content","FONTSIZE":"Font Size","CODE":"Code","EXPORT":"Export","FORMAT":"Format","EXPORTLAYER":"Export Activity Layer","COPYSUCCESS":"Copy Success","TEXTSHAREDSTYLE":"Text Styles","SHAPESHAREDSTYLE":"Layer Styles"},"pageOrder":["E1DD8600-6E88-4482-9447-55D03DD87354","6774A219-5AFB-46B1-8AD2-8BE278B93378"],"pageData":{"E1DD8600-6E88-4482-9447-55D03DD87354":{"pageId":"E1DD8600-6E88-4482-9447-55D03DD87354","name":"Symbols","artboardId":["D66AAA24-D61F-44D2-8D53-8B219D009DBF","CCA3949D-B416-466A-8949-425E5DCD35B5"]},"6774A219-5AFB-46B1-8AD2-8BE278B93378":{"pageId":"6774A219-5AFB-46B1-8AD2-8BE278B93378","name":"Page%201","artboardId":["E822A087-B20C-42DD-8665-FE03A4AA8211","83F6DA3D-9F1B-4816-92B9-A74AAED40206"]}},"artboard":{"D66AAA24-D61F-44D2-8D53-8B219D009DBF":{"id":"D66AAA24-D61F-44D2-8D53-8B219D009DBF","src":"D66AAA24-D61F-44D2-8D53-8B219D009DBF","name":"Status%20Bar%2FBlack%2F100%25","type":"MSSymbolMaster","x":100,"y":0,"zIndex":0,"width":375,"height":20,"sharedStyleType":"","sharedStyle":"","symbolId":"8F28FC9A-816F-4541-8734-BC8EF14D685F","slice":[],"layer":[{"id":"372B9348-D602-4A3B-8E91-A66250670461","src":"372B9348-D602-4A3B-8E91-A66250670461","name":"Battery","type":"MSShapeGroup","x":445,"y":6,"zIndex":1,"width":25,"height":10,"sharedStyleType":"","sharedStyle":"","style":{"background":"#030303","border-radius":"1.5px","width":"25px","height":"10px"},"radius":"1.5","background":"#030303"},{"id":"6CE93654-D8D2-4BD3-85AF-C2D9A33E8979","src":"6CE93654-D8D2-4BD3-85AF-C2D9A33E8979","name":"100%25","type":"MSTextLayer","x":409,"y":4,"zIndex":2,"width":33,"height":14,"sharedStyleType":"","sharedStyle":"","html":"100%25","style":{"font-family":"Helvetica","font-size":"12px","color":"#030303","letter-spacing":"0","text-align":"right"}},{"id":"5DE5A561-10FF-40B7-864C-B93F09A30B82","src":"5DE5A561-10FF-40B7-864C-B93F09A30B82","name":"9%3A41%20AM","type":"MSTextLayer","x":263,"y":4,"zIndex":3,"width":49,"height":14,"sharedStyleType":"","sharedStyle":"","html":"9%3A41%20AM","style":{"font-family":"Helvetica","font-size":"12px","color":"#030303","letter-spacing":"0","text-align":"center"}},{"id":"05376719-28C6-4537-A0B4-097E3C72AB41","src":"05376719-28C6-4537-A0B4-097E3C72AB41","name":"Wi-Fi","type":"MSShapeGroup","x":188,"y":6,"zIndex":4,"width":13,"height":10,"sharedStyleType":"","sharedStyle":"","style":{"background":"#030303","width":"13px","height":"10px"},"background":"#030303"},{"id":"5B618E12-BBE6-411D-85B1-8668F4646AC1","src":"5B618E12-BBE6-411D-85B1-8668F4646AC1","name":"Carrier","type":"MSTextLayer","x":144,"y":4,"zIndex":5,"width":40,"height":14,"sharedStyleType":"","sharedStyle":"","html":"Sketch","style":{"font-family":"Helvetica","font-size":"12px","color":"#030303","letter-spacing":"0","text-align":"left"}},{"id":"D78AA366-D361-4FA8-AACE-0B91A0581654","src":"D78AA366-D361-4FA8-AACE-0B91A0581654","name":"Mobile%20Signal","type":"MSShapeGroup","x":107,"y":8,"zIndex":6,"width":34,"height":6,"sharedStyleType":"","sharedStyle":"","style":{"background":"#030303","width":"34px","height":"6px"},"background":"#030303"}],"mask":{}},"CCA3949D-B416-466A-8949-425E5DCD35B5":{"id":"CCA3949D-B416-466A-8949-425E5DCD35B5","src":"CCA3949D-B416-466A-8949-425E5DCD35B5","name":"Status%20Bar%2FWhite%2F100%25","type":"MSSymbolMaster","x":100,"y":120,"zIndex":0,"width":375,"height":20,"sharedStyleType":"","sharedStyle":"","symbolId":"FC386540-E94F-407E-88AC-44E4621D13CF","slice":[],"layer":[{"id":"68A7CB4F-8C7B-480B-B544-271AB428EE8A","src":"68A7CB4F-8C7B-480B-B544-271AB428EE8A","name":"Battery","type":"MSShapeGroup","x":445,"y":126,"zIndex":1,"width":25,"height":10,"sharedStyleType":"","sharedStyle":"","style":{"background":"#ffffff","border-radius":"1.5px","width":"25px","height":"10px"},"radius":"1.5","background":"#ffffff"},{"id":"D4D25776-86EB-4EB6-8037-476B91D3D811","src":"D4D25776-86EB-4EB6-8037-476B91D3D811","name":"100%25","type":"MSTextLayer","x":409,"y":124,"zIndex":2,"width":33,"height":14,"sharedStyleType":"","sharedStyle":"","html":"100%25","style":{"font-family":"Helvetica","font-size":"12px","color":"#ffffff","letter-spacing":"0","text-align":"right"}},{"id":"A14DAE1C-2900-467F-B2EA-41189DAF5B7D","src":"A14DAE1C-2900-467F-B2EA-41189DAF5B7D","name":"9%3A41%20AM","type":"MSTextLayer","x":263,"y":124,"zIndex":3,"width":49,"height":14,"sharedStyleType":"","sharedStyle":"","html":"9%3A41%20AM","style":{"font-family":"Helvetica","font-size":"12px","color":"#ffffff","letter-spacing":"0","text-align":"center"}},{"id":"39D04EF6-4A67-4ED6-A6AC-624922CFD8A1","src":"39D04EF6-4A67-4ED6-A6AC-624922CFD8A1","name":"Wi-Fi","type":"MSShapeGroup","x":188,"y":126,"zIndex":4,"width":13,"height":10,"sharedStyleType":"","sharedStyle":"","style":{"background":"#ffffff","width":"13px","height":"10px"},"background":"#ffffff"},{"id":"FDA2694C-D63C-41E9-A93A-4BF70C3F3364","src":"FDA2694C-D63C-41E9-A93A-4BF70C3F3364","name":"Carrier","type":"MSTextLayer","x":144,"y":124,"zIndex":5,"width":40,"height":14,"sharedStyleType":"","sharedStyle":"","html":"Sketch","style":{"font-family":"Helvetica","font-size":"12px","color":"#ffffff","letter-spacing":"0","text-align":"left"}},{"id":"4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805","src":"4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805","name":"Mobile%20Signal","type":"MSShapeGroup","x":107,"y":128,"zIndex":6,"width":34,"height":6,"sharedStyleType":"","sharedStyle":"","style":{"background":"#ffffff","width":"34px","height":"6px"},"background":"#ffffff"}],"mask":{}},"E822A087-B20C-42DD-8665-FE03A4AA8211":{"id":"E822A087-B20C-42DD-8665-FE03A4AA8211","src":"E822A087-B20C-42DD-8665-FE03A4AA8211","name":"Location","type":"MSArtboardGroup","x":513,"y":55,"zIndex":0,"width":375,"height":667,"sharedStyleType":"","sharedStyle":"","slice":[],"layer":[{"id":"12DBC3B3-F637-40BB-AE47-0B1653A29FFC","src":"12DBC3B3-F637-40BB-AE47-0B1653A29FFC","name":"login","type":"MSTextLayer","x":680,"y":644,"zIndex":0,"width":42,"height":36,"sharedStyleType":"","sharedStyle":"","html":"Login%0A","style":{"font-family":"HelveticaNeue","font-size":"16px","color":"#ffffff","letter-spacing":"0.44px","text-align":"left"}},{"id":"A9F8A6FB-8379-4EF3-A6A9-B93581CF3A25","src":"A9F8A6FB-8379-4EF3-A6A9-B93581CF3A25","name":"Password","type":"MSTextLayer","x":543,"y":370,"zIndex":1,"width":69,"height":23,"sharedStyleType":"","sharedStyle":"","html":"Password","style":{"font-family":"HelveticaNeue","font-size":"15px","color":"#a8b4c4","letter-spacing":"0.29px","text-align":"center","line-height":"23px"}},{"id":"4D1D953A-F49D-42D4-AC1B-051E802681E8","src":"4D1D953A-F49D-42D4-AC1B-051E802681E8","name":"User","type":"MSTextLayer","x":543,"y":298,"zIndex":2,"width":33,"height":23,"sharedStyleType":"","sharedStyle":"","html":"User","style":{"font-family":"HelveticaNeue","font-size":"15px","color":"#a8b4c4","letter-spacing":"0.29px","text-align":"center","line-height":"23px"}},{"id":"CDEBC6CD-73C4-47CB-B879-8A426D8163E1","src":"CDEBC6CD-73C4-47CB-B879-8A426D8163E1","name":"Screen%20Shot%202018-10-18%20at%2022.49.51","type":"MSBitmapLayer","x":639,"y":111,"zIndex":3,"width":125,"height":70,"sharedStyleType":"","sharedStyle":""},{"id":"E3013759-B45A-4E98-8B34-278A50F98591","src":"E3013759-B45A-4E98-8B34-278A50F98591","name":"Status%20Bar%2FBlack%2F100%25","type":"MSSymbolInstance","x":513,"y":55,"zIndex":4,"width":375,"height":20,"sharedStyleType":"","sharedStyle":"","symbolId":"8F28FC9A-816F-4541-8734-BC8EF14D685F"}],"mask":{}},"83F6DA3D-9F1B-4816-92B9-A74AAED40206":{"id":"83F6DA3D-9F1B-4816-92B9-A74AAED40206","src":"83F6DA3D-9F1B-4816-92B9-A74AAED40206","name":"Currency","type":"MSArtboardGroup","x":988,"y":55,"zIndex":0,"width":375,"height":667,"sharedStyleType":"","sharedStyle":"","slice":[],"layer":[{"id":"09BAE240-CC06-46A5-B01E-A15117109EAC","src":"09BAE240-CC06-46A5-B01E-A15117109EAC","name":"Find%20out%20where","type":"MSTextLayer","x":1127,"y":491,"zIndex":0,"width":118,"height":18,"sharedStyleType":"","sharedStyle":"","html":"Find%20out%20where%20","style":{"font-family":"HelveticaNeue","font-size":"16px","color":"#ffffff","letter-spacing":"0.44px","text-align":"left"}},{"id":"2E3D38C9-2ED3-499B-BF39-008733AAE30C","src":"2E3D38C9-2ED3-499B-BF39-008733AAE30C","name":"Market%20rate%3A%201%20USD%20%3D","type":"MSTextLayer","x":1064,"y":420,"zIndex":1,"width":212,"height":17,"sharedStyleType":"","sharedStyle":"","html":"Market%20rate%3A%201%20USD%20%3D%200.8900%20EUR","style":{"font-family":"HelveticaNeue","font-size":"14px","color":"#a8b4c4","text-align":"center"}},{"id":"07B6D69B-B539-432D-A0F1-45428FCF5C13","src":"07B6D69B-B539-432D-A0F1-45428FCF5C13","name":"890%2C10","type":"MSTextLayer","x":1239,"y":351,"zIndex":2,"width":89,"height":33,"sharedStyleType":"","sharedStyle":"","html":"890%2C10","style":{"font-family":"HelveticaNeue-Light","font-size":"28px","color":"#485465","letter-spacing":"0.5px","text-align":"center"}},{"id":"99544A31-44A6-4BAD-B88E-99DDD345E9EA","src":"99544A31-44A6-4BAD-B88E-99DDD345E9EA","name":"1%20EUR%20%3D%201.123%20USD","type":"MSTextLayer","x":1216,"y":331,"zIndex":3,"width":110,"height":14,"sharedStyleType":"","sharedStyle":"","html":"1%20EUR%20%3D%201.123%20USD","style":{"font-family":"HelveticaNeue","font-size":"12px","color":"#a8b4c4","letter-spacing":"0.2px","text-align":"center"}},{"id":"66E60EFF-B648-4673-85F3-323550B705D3","src":"66E60EFF-B648-4673-85F3-323550B705D3","name":"EUR","type":"MSTextLayer","x":1065,"y":356,"zIndex":4,"width":49,"height":29,"sharedStyleType":"","sharedStyle":"","html":"EUR","style":{"font-family":"HelveticaNeue-Light","font-size":"25px","color":"#485465","text-align":"center"}},{"id":"B9A6B04C-614B-4F9E-8BD4-E59A0D050361","src":"B9A6B04C-614B-4F9E-8BD4-E59A0D050361","name":"I%20want","type":"MSTextLayer","x":1024,"y":325,"zIndex":5,"width":44,"height":18,"sharedStyleType":"","sharedStyle":"","html":"I%20want","style":{"font-family":"HelveticaNeue","font-size":"16px","color":"#a8b4c4","text-align":"center"}},{"id":"2B156AE2-C7CC-403A-AD6A-8414CCB60279","src":"2B156AE2-C7CC-403A-AD6A-8414CCB60279","name":"1%20000%2C00","type":"MSTextLayer","x":1214,"y":245,"zIndex":6,"width":113,"height":33,"sharedStyleType":"","sharedStyle":"","html":"1%20000%2C00","style":{"font-family":"HelveticaNeue-Light","font-size":"28px","color":"#485465","letter-spacing":"0.5px","text-align":"center"}},{"id":"246AE036-104B-41CF-B0F4-FCAEDF1CFC25","src":"246AE036-104B-41CF-B0F4-FCAEDF1CFC25","name":"1%20USD%20%3D%200.8900%20EUR","type":"MSTextLayer","x":1209,"y":224,"zIndex":7,"width":117,"height":14,"sharedStyleType":"","sharedStyle":"","html":"1%20USD%20%3D%200.8900%20EUR","style":{"font-family":"HelveticaNeue","font-size":"12px","color":"#a8b4c4","letter-spacing":"0.2px","text-align":"center"}},{"id":"3817562E-CBB6-4CAD-BBCF-FD468BAA446F","src":"3817562E-CBB6-4CAD-BBCF-FD468BAA446F","name":"Shape","type":"MSShapeGroup","x":1025,"y":247,"zIndex":8,"width":15,"height":15,"sharedStyleType":"","sharedStyle":"","style":{"background":"#0052b4","width":"15px","height":"15px"},"background":"#0052b4"},{"id":"D8815B79-8031-4DBF-AC66-0A035AD9905D","src":"D8815B79-8031-4DBF-AC66-0A035AD9905D","name":"USD","type":"MSTextLayer","x":1065,"y":248,"zIndex":9,"width":50,"height":29,"sharedStyleType":"","sharedStyle":"","html":"USD","style":{"font-family":"HelveticaNeue-Light","font-size":"25px","color":"#485465","text-align":"center"}},{"id":"4D7068B6-0C46-4E07-A300-CF23125F168C","src":"4D7068B6-0C46-4E07-A300-CF23125F168C","name":"I%20have","type":"MSTextLayer","x":1024,"y":218,"zIndex":10,"width":43,"height":18,"sharedStyleType":"","sharedStyle":"","html":"I%20have","style":{"font-family":"HelveticaNeue","font-size":"16px","color":"#a8b4c4","text-align":"center"}},{"id":"B27D4452-A3F9-4F53-991A-9E914520B88A","src":"B27D4452-A3F9-4F53-991A-9E914520B88A","name":"Shape","type":"MSShapeGroup","x":1016,"y":142,"zIndex":11,"width":11,"height":16,"sharedStyleType":"","sharedStyle":"","style":{"background":"#485465","width":"11px","height":"16px"},"background":"#485465"},{"id":"904C402D-FC98-45E0-9270-068D9717010D","src":"904C402D-FC98-45E0-9270-068D9717010D","name":"Paris%2C%20France","type":"MSTextLayer","x":1042,"y":143,"zIndex":12,"width":100,"height":20,"sharedStyleType":"","sharedStyle":"","html":"Paris%2C%20France","style":{"font-family":"HelveticaNeue","font-size":"17px","color":"#485465","text-align":"center"}},{"id":"4EE21DE4-3DDC-4464-B264-4223F0236C08","src":"4EE21DE4-3DDC-4464-B264-4223F0236C08","name":"Looking%20for%20the%20best","type":"MSTextLayer","x":1012,"y":168,"zIndex":13,"width":284,"height":16,"sharedStyleType":"","sharedStyle":"","html":"Looking%20for%20the%20best%20exchange%20rates%20in%20Paris%3F","style":{"font-family":"HelveticaNeue","font-size":"14px","color":"#a8b4c4","text-align":"center"}},{"id":"45B169DE-B3B5-4D12-B1B3-25F826B339CB","src":"45B169DE-B3B5-4D12-B1B3-25F826B339CB","name":"Currency","type":"MSTextLayer","x":1142,"y":87,"zIndex":14,"width":67,"height":20,"sharedStyleType":"","sharedStyle":"","html":"Currency","style":{"font-family":".SFNSText","font-size":"17px","color":"#ffffff","letter-spacing":"-0.41px","text-align":"center"}},{"id":"CA2B476F-0F1E-42F9-B119-2A2B3380A4D4","src":"CA2B476F-0F1E-42F9-B119-2A2B3380A4D4","name":"Status%20Bar%2FWhite%2F100%25","type":"MSSymbolInstance","x":988,"y":55,"zIndex":15,"width":375,"height":20,"sharedStyleType":"","sharedStyle":"","symbolId":"FC386540-E94F-407E-88AC-44E4621D13CF"}],"mask":{}}}} \ No newline at end of file diff --git a/bank_app_layout/index.html b/bank_app_layout/index.html deleted file mode 100644 index 28125fac..00000000 --- a/bank_app_layout/index.html +++ /dev/null @@ -1,1569 +0,0 @@ - - - - - - - Spec Export - Sketch Measure 2.4 - - - - - - - diff --git a/bank_app_layout/links/page-1-currency.html b/bank_app_layout/links/page-1-currency.html deleted file mode 100644 index 5652fa21..00000000 --- a/bank_app_layout/links/page-1-currency.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/bank_app_layout/links/page-1-location.html b/bank_app_layout/links/page-1-location.html deleted file mode 100644 index 5ca1854a..00000000 --- a/bank_app_layout/links/page-1-location.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/bank_app_layout/preview/page-1-currency.png b/bank_app_layout/preview/page-1-currency.png deleted file mode 100644 index d0c17135..00000000 Binary files a/bank_app_layout/preview/page-1-currency.png and /dev/null differ diff --git a/bank_app_layout/preview/page-1-location.png b/bank_app_layout/preview/page-1-location.png deleted file mode 100644 index c620ef44..00000000 Binary files a/bank_app_layout/preview/page-1-location.png and /dev/null differ diff --git a/telas.png b/telas.png deleted file mode 100644 index 78337444..00000000 Binary files a/telas.png and /dev/null differ