From c9e2b9e941a7cc9899a2a9c04f59daae82486a78 Mon Sep 17 00:00:00 2001 From: Rodrigo Felipe Date: Thu, 13 Mar 2025 15:01:34 -0300 Subject: [PATCH] create base project --- .DS_Store | Bin 0 -> 6148 bytes .idea/.DS_Store | Bin 0 -> 6148 bytes .idea/libraries/Dart_SDK.xml | 19 + .idea/libraries/KotlinJavaRuntime.xml | 15 + .idea/modules.xml | 9 + .idea/runConfigurations/main_dart.xml | 6 + .idea/workspace.xml | 36 + .metadata | 30 + .vscode/launch.json | 25 + README.md | 166 ++--- analysis_options.yaml | 28 + android/.DS_Store | Bin 0 -> 6148 bytes android/.gitignore | 14 + android/app/build.gradle.kts | 44 ++ android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 45 ++ .../com/exemplo/base_project/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 7 + android/base_project_android.iml | 29 + android/build.gradle.kts | 21 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle.kts | 25 + base_project.iml | 17 + ios/.DS_Store | Bin 0 -> 6148 bytes ios/.gitignore | 34 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 619 +++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 99 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 49 ++ ios/Runner/Runner-Bridging-Header.h | 1 + ios/RunnerTests/RunnerTests.swift | 12 + lib/main.dart | 6 + lib/src/app_widget.dart | 23 + lib/src/core/base/base.dart | 3 + .../core/base/constants/app_constants.dart | 3 + lib/src/core/base/constants/constants.dart | 1 + lib/src/core/base/errors/errors.dart | 1 + lib/src/core/base/errors/infra_error.dart | 13 + lib/src/core/base/interfaces/failures.dart | 18 + lib/src/core/base/interfaces/interfaces.dart | 2 + .../base/interfaces/usecase_interface.dart | 24 + lib/src/core/core.dart | 2 + lib/src/core/utils/converter_helper.dart | 29 + lib/src/core/utils/extensions.dart | 5 + lib/src/core/utils/utils.dart | 2 + lib/src/modules/payments/data/data.dart | 3 + .../payments/data/datasource/datasource.dart | 1 + .../data/datasource/payments_datasource.dart | 5 + .../modules/payments/data/model/model.dart | 1 + .../data/model/payments/payments.dart | 5 + .../model/payments/payments_info_model.dart | 31 + .../payments/payments_scheduled_model.dart | 30 + .../payments/payments_summary_model.dart | 10 + .../payments_transactions_header_model.dart | 13 + .../payments/payments_transactions_model.dart | 48 ++ .../repository/payment_repository_impl.dart | 19 + .../payments/data/repository/repository.dart | 1 + lib/src/modules/payments/domain/domain.dart | 3 + .../payments/domain/entity/entity.dart | 5 + .../domain/entity/payments_info_entity.dart | 20 + .../entity/payments_schedule_entity.dart | 38 + .../entity/payments_summary_entity.dart | 11 + .../entity/payments_transactions_entity.dart | 44 ++ .../payments_transactions_filter_entity.dart | 12 + .../domain/repository/payment_repository.dart | 7 + .../domain/repository/repository.dart | 1 + .../domain/usecase/get_payments_use_case.dart | 26 + .../payments/domain/usecase/usecase.dart | 1 + .../payments/infra/datasource/datasource.dart | 1 + .../datasource/payments_datasource_impl.dart | 21 + lib/src/modules/payments/infra/mock/mock.dart | 1 + .../payments/infra/mock/payments_json.dart | 704 ++++++++++++++++++ pubspec.lock | 237 ++++++ pubspec.yaml | 92 +++ test/widget_test.dart | 1 + 117 files changed, 3161 insertions(+), 93 deletions(-) create mode 100644 .DS_Store create mode 100644 .idea/.DS_Store create mode 100644 .idea/libraries/Dart_SDK.xml create mode 100644 .idea/libraries/KotlinJavaRuntime.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations/main_dart.xml create mode 100644 .idea/workspace.xml create mode 100644 .metadata create mode 100644 .vscode/launch.json create mode 100644 analysis_options.yaml create mode 100644 android/.DS_Store create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle.kts create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/br/com/exemplo/base_project/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/base_project_android.iml create mode 100644 android/build.gradle.kts create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle.kts create mode 100644 base_project.iml create mode 100644 ios/.DS_Store create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 ios/RunnerTests/RunnerTests.swift create mode 100644 lib/main.dart create mode 100644 lib/src/app_widget.dart create mode 100644 lib/src/core/base/base.dart create mode 100644 lib/src/core/base/constants/app_constants.dart create mode 100644 lib/src/core/base/constants/constants.dart create mode 100644 lib/src/core/base/errors/errors.dart create mode 100644 lib/src/core/base/errors/infra_error.dart create mode 100644 lib/src/core/base/interfaces/failures.dart create mode 100644 lib/src/core/base/interfaces/interfaces.dart create mode 100644 lib/src/core/base/interfaces/usecase_interface.dart create mode 100644 lib/src/core/core.dart create mode 100644 lib/src/core/utils/converter_helper.dart create mode 100644 lib/src/core/utils/extensions.dart create mode 100644 lib/src/core/utils/utils.dart create mode 100644 lib/src/modules/payments/data/data.dart create mode 100644 lib/src/modules/payments/data/datasource/datasource.dart create mode 100644 lib/src/modules/payments/data/datasource/payments_datasource.dart create mode 100644 lib/src/modules/payments/data/model/model.dart create mode 100644 lib/src/modules/payments/data/model/payments/payments.dart create mode 100644 lib/src/modules/payments/data/model/payments/payments_info_model.dart create mode 100644 lib/src/modules/payments/data/model/payments/payments_scheduled_model.dart create mode 100644 lib/src/modules/payments/data/model/payments/payments_summary_model.dart create mode 100644 lib/src/modules/payments/data/model/payments/payments_transactions_header_model.dart create mode 100644 lib/src/modules/payments/data/model/payments/payments_transactions_model.dart create mode 100644 lib/src/modules/payments/data/repository/payment_repository_impl.dart create mode 100644 lib/src/modules/payments/data/repository/repository.dart create mode 100644 lib/src/modules/payments/domain/domain.dart create mode 100644 lib/src/modules/payments/domain/entity/entity.dart create mode 100644 lib/src/modules/payments/domain/entity/payments_info_entity.dart create mode 100644 lib/src/modules/payments/domain/entity/payments_schedule_entity.dart create mode 100644 lib/src/modules/payments/domain/entity/payments_summary_entity.dart create mode 100644 lib/src/modules/payments/domain/entity/payments_transactions_entity.dart create mode 100644 lib/src/modules/payments/domain/entity/payments_transactions_filter_entity.dart create mode 100644 lib/src/modules/payments/domain/repository/payment_repository.dart create mode 100644 lib/src/modules/payments/domain/repository/repository.dart create mode 100644 lib/src/modules/payments/domain/usecase/get_payments_use_case.dart create mode 100644 lib/src/modules/payments/domain/usecase/usecase.dart create mode 100644 lib/src/modules/payments/infra/datasource/datasource.dart create mode 100644 lib/src/modules/payments/infra/datasource/payments_datasource_impl.dart create mode 100644 lib/src/modules/payments/infra/mock/mock.dart create mode 100644 lib/src/modules/payments/infra/mock/payments_json.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/widget_test.dart diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..12630dfe06e20498e0ffad36b20832b86f10bd70 GIT binary patch literal 6148 zcmeHLJx{|h5Ir|RR7DjXnNSwQ1cHGP2yIzdyCeF60I4MvDP5ZpiT}XH#?A;6j36=a z1DN4A@Xj`kowQ;@2z-+L65n0k`L(g@5|OB$ch-q2L{vm$^h@X_82h>9te{60fI>c_ z**#isw4+`>7wZO`0#1S7rvSgZGqg%4)S*MlyuZt@wzn76>#c6o!f0_+-h8~feb~uH zbiRq`ADb(LTqtJ2Kctx26mb>y8dBH*LngwkqxN#OccbdaMWwY&kFx9Gbr5V#Iz=UC zs0X@O^({PKp+eU? z1)Ku50-n09@czF${rqnyxjUzTQ{Yc2ApClxUd5F3-kO^n@3jHi0U8^}B?@Hx;8uy?Kfn=S9kqSBO47yG@6GEK9*%+MQszFsBoA7ArBo~wbL)uuhO!*Fzg z%y#rd3o4->kn0+4$@T?xvEldDj^guSQSJQSswV#d^A+XKdVUw#U7!5#OpF0zz!*3> z130rqqBBL)#(*(k3^WYL_rakE#sO6Y6=8v}h5|K| z!xMuw9CjD{;()cHh7A%D^|^%3>G* literal 0 HcmV?d00001 diff --git a/.idea/libraries/Dart_SDK.xml b/.idea/libraries/Dart_SDK.xml new file mode 100644 index 0000000..5c60742 --- /dev/null +++ b/.idea/libraries/Dart_SDK.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/KotlinJavaRuntime.xml b/.idea/libraries/KotlinJavaRuntime.xml new file mode 100644 index 0000000..2b96ac4 --- /dev/null +++ b/.idea/libraries/KotlinJavaRuntime.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..8d65d96 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/runConfigurations/main_dart.xml b/.idea/runConfigurations/main_dart.xml new file mode 100644 index 0000000..aab7b5c --- /dev/null +++ b/.idea/runConfigurations/main_dart.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..5b3388c --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..b4fb385 --- /dev/null +++ b/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "35c388afb57ef061d06a39b537336c87e0e3d1b1" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + - platform: ios + create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6771c8c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Debug", + "request": "launch", + "type": "dart" + }, + { + "name": "Profile", + "request": "launch", + "type": "dart", + "flutterMode": "profile" + }, + { + "name": "Release", + "request": "launch", + "type": "dart", + "flutterMode": "release" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index bea8c78..6d36325 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,73 @@ -# teste-flutter - - - -## Getting started - -To make it easy for you to get started with GitLab, here's a list of recommended next steps. - -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! - -## Add your files - -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: - -``` -cd existing_repo -git remote add origin https://git.rarolabs.com.br/teste-conhecimento/teste-flutter.git -git branch -M main -git push -uf origin main -``` - -## Integrate with your tools - -- [ ] [Set up project integrations](https://git.rarolabs.com.br/teste-conhecimento/teste-flutter/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README - -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. +# Teste Técnico - Desenvolvedor Flutter + +## Objetivo +O objetivo deste teste técnico é avaliar suas habilidades no desenvolvimento de interfaces em Flutter, seguindo boas práticas de código, organização do projeto e implementação de testes. Você deverá dar sequência à base do projeto fornecido, reproduzindo a tela conforme o protótipo no [Figma](https://www.figma.com/design/QWC5IksyTx2k65ZzkPz3r1/Processo-seletivo---Dev-flutter?node-id=1-4313&t=WNNCW8T4MMI6Z9M8-1). + +***Alguns packages já foram incluídos no projeto, fique a vontade para substitui-los, propor melhorias na arquitetura atual.*** + +## Requisitos +- Implementar uma tela onde o usuário poderá visualizar uma **lista de informações** sobre **transactions** e **schedules**. +- Implementar um **BottomSheet** que permitirá ocultar ou exibir dados sobre os itens do **schedule**. +- Seguir as diretrizes do **protótipo no Figma**. +- Escrever **testes unitários** e **testes de widget**. +- Utilizar o BLoC como gerenciamento de estado. +- Comportamentos esperados para a tela: + - Em estado de loading os widgets devem exibir um shimmer no lugar dos dados; + - A tela deve ter um scroll único de forma geral, não sendo permitido a existência de scrolls aninhados; + +## Boas Práticas +Para garantir um código bem estruturado e manutenível, siga as seguintes diretrizes: + +- **Responsividade:** Certifique-se de que a tela funcione corretamente em diferentes tamanhos de dispositivos. +- **Componentização:** Separe os widgets reutilizáveis para facilitar a organização do código. +- **Acessibilidade:** Considere a acessibilidade ao desenvolver os componentes visuais. +- **Manutenção:** Nomeie variáveis, métodos e classes de forma clara e significativa. +- **Tratamento de Erros:** Implemente tratamento de erros para melhorar a experiência do usuário. +- **Seguir a Arquitetura do Projeto:** Mantenha o código organizado e dentro da estrutura já existente no projeto base. + +## Testes +- É **obrigatório** implementar **testes unitários** para as regras de negócio, validações e/ou camadas que julgar necessário. +- **Opcional:** Implementação de **testes de integração** para garantir a funcionalidade correta da interface e interação do usuário. + +## Entrega +1. Faça um fork ou clone do repositório base fornecido. +2. Desenvolva as funcionalidades seguindo os requisitos. +3. Submeta o código em um repositório público ou envie um link para o repositório privado. + +Boa sorte! 🚀 + +## Informações adicionais +- Versão do Flutter utilizado para criação do projeto base: 3.29.0; +- As telas do Figma estão em protótipo, então é possível navegar para entender melhor o comportamento das telas; +- Estrutura base do Projeto + ``` + lib/ + └── src/ + ├── core/ + │ ├── base/ + │ │ ├── constants/ # Constantes globais do projeto + │ │ ├── errors/ # Definições de erros e exceções + │ │ ├── interfaces/ # Interfaces para abstração + │ │ ├── base.dart + │ ├── utils/ # Funções auxiliares e extensões + │ ├── core.dart # Arquivo principal do core + ├── modules/ + │ ├── payments/ # Módulo de pagamentos + │ │ ├── data/ # Camada de dados + │ │ │ ├── datasource/ + │ │ │ ├── model/ + │ │ │ ├── repository/ + │ │ ├── domain/ # Camada de domínio + │ │ │ ├── entity/ + │ │ │ ├── repository/ + │ │ │ ├── usecase/ + │ │ ├── infra/ # Infraestrutura + │ │ │ ├── datasource/ + │ │ │ ├── mock/ + │ │ ├── presentation/ # Camada de apresentação + │ │ │ ├── bloc/ + │ │ │ ├── page/ + ├── app_widget.dart # Widget principal do app + ├── main.dart # Ponto de entrada do app + test/ # Testes unitários + ``` \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.DS_Store b/android/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e3719c81a6d9224f435c8549faf60f6b167da6d5 GIT binary patch literal 6148 zcmeHK%}T>S5T0#{ruf%`2aoYCLeCzIC0-Tm3uuj0Fd;$k9-qROuxH=E2k=RJ1i#rC z+r%{Bsff(L?zfqro!u`>CQC$a{FIJ}hC~#iG4=-NRtVd6g3v@Y43kizJz5#T1q>Jh>Xo-`>wwd8NPbD)0HU zXtq5*hZJBXC6#iHzAfSD(o)ZV5zKcqzsBXoGH=`3$hTi{zKzb^)5qmcdp-Bz^U?TK z_THGIzJe~F#yaSe*I{A|7z4(@x)?ysW(l_htv3dY0b^jn0Dm7MG{#u567-)Abp8qe z>_hDZWB(5aj93AT6)Qn#AWlMo66*Ad;UpaTNd02PN>IYd`OKI{GdsPZIG-K*$h(t^ z1+6y*jDaQtfjkbm{-1Z>|C>SfWDFPs|B3 + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..44ec250 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/br/com/exemplo/base_project/MainActivity.kt b/android/app/src/main/kotlin/br/com/exemplo/base_project/MainActivity.kt new file mode 100644 index 0000000..0c7ff12 --- /dev/null +++ b/android/app/src/main/kotlin/br/com/exemplo/base_project/MainActivity.kt @@ -0,0 +1,5 @@ +package br.com.exemplo.base_project + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/base_project_android.iml b/android/base_project_android.iml new file mode 100644 index 0000000..1899969 --- /dev/null +++ b/android/base_project_android.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..89176ef --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..f018a61 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..afa1e8e --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..a439442 --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/base_project.iml b/base_project.iml new file mode 100644 index 0000000..f66303d --- /dev/null +++ b/base_project.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ios/.DS_Store b/ios/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..94e1cb0ae32746d8439a6629896f5475e856c445 GIT binary patch literal 6148 zcmeHK%Sr<=6uqgXEp}7Ig&@NGfMPd-uEx>|?!@X+&_1we$EkgwxSCJ#19a_9aO2L6 zKcJuDxk;u@oDQ9Cib(E|oHV&Nx#zT#G(;pSqgI)yL_`G?#_S@h3C81GVwTZ8D?lOV z7*d=1-HUR)>BqcnhgHBT@YfXJcQ;S_)TI#(@r>VJucuPYKgK;gzglf{{RTz~!P?;D z_4#dYl2l6KEO7=edSG756L{T%PoJ)6 z0B+~t**3XlI%(sg{7yHvLw>2&jB=bc*5tXxJc|a;V|;G|{K5w&GqIlR8Ras}?Sxzs z=8a}Q-P_EU&)>Nl&TO_qQK7A^0#*U5z*qs^9~=}$S7V@1ZXKxP6#$q;w=}fnUIuiy z1L$fD6ru+vR47n|3Vp>8DjfZe_H#7`3RO4>xiaR_D+_%?5qc*Tj&vvCDzvp#z$#!W zu%JGc`24RW-~Y`Z`^hR`75G;Qh-|f9t$>m~TVv$-taVV%P}tZnP$)xC>El>7_$XdQ bk%lpc8$efMpb$MU`$s^^U@NP@Tow2R0e{*E literal 0 HcmV?d00001 diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..05cdc9a --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,619 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = FN8N8V3YS6; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = br.com.exemplo.baseProject; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = br.com.exemplo.baseProject.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = br.com.exemplo.baseProject.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = br.com.exemplo.baseProject.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = FN8N8V3YS6; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = br.com.exemplo.baseProject; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = FN8N8V3YS6; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = br.com.exemplo.baseProject; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..15cada4 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..6266644 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..cb022b0 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Base Project + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + base_project + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..d78d105 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:base_project/src/app_widget.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(const AppWidget()); +} diff --git a/lib/src/app_widget.dart b/lib/src/app_widget.dart new file mode 100644 index 0000000..522238e --- /dev/null +++ b/lib/src/app_widget.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class AppWidget extends StatelessWidget { + const AppWidget({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Color(0xFF232F69))), + home: const PaymentsTransactionsPage(), + ); + } +} + +class PaymentsTransactionsPage extends StatelessWidget { + const PaymentsTransactionsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold(body: Container(color: Color(0xFF232F69))); + } +} diff --git a/lib/src/core/base/base.dart b/lib/src/core/base/base.dart new file mode 100644 index 0000000..0ddb74c --- /dev/null +++ b/lib/src/core/base/base.dart @@ -0,0 +1,3 @@ +export 'constants/constants.dart'; +export 'errors/errors.dart'; +export 'interfaces/interfaces.dart'; diff --git a/lib/src/core/base/constants/app_constants.dart b/lib/src/core/base/constants/app_constants.dart new file mode 100644 index 0000000..2d83cdd --- /dev/null +++ b/lib/src/core/base/constants/app_constants.dart @@ -0,0 +1,3 @@ +abstract class AppConstants { + static String genericError001 = 'Sorry, we couldn’t process your request. Please try again later.'; +} diff --git a/lib/src/core/base/constants/constants.dart b/lib/src/core/base/constants/constants.dart new file mode 100644 index 0000000..399560b --- /dev/null +++ b/lib/src/core/base/constants/constants.dart @@ -0,0 +1 @@ +export 'app_constants.dart'; diff --git a/lib/src/core/base/errors/errors.dart b/lib/src/core/base/errors/errors.dart new file mode 100644 index 0000000..d4087b3 --- /dev/null +++ b/lib/src/core/base/errors/errors.dart @@ -0,0 +1 @@ +export 'infra_error.dart'; diff --git a/lib/src/core/base/errors/infra_error.dart b/lib/src/core/base/errors/infra_error.dart new file mode 100644 index 0000000..c2bb386 --- /dev/null +++ b/lib/src/core/base/errors/infra_error.dart @@ -0,0 +1,13 @@ +import 'package:equatable/equatable.dart'; + +enum InfraCode { unexpected } + +class InfraError extends Equatable { + final InfraCode code; + final dynamic error; + + const InfraError(this.code, {this.error}); + + @override + List get props => [code, error]; +} diff --git a/lib/src/core/base/interfaces/failures.dart b/lib/src/core/base/interfaces/failures.dart new file mode 100644 index 0000000..b696aab --- /dev/null +++ b/lib/src/core/base/interfaces/failures.dart @@ -0,0 +1,18 @@ +import 'package:base_project/src/core/base/constants/app_constants.dart'; +import 'package:equatable/equatable.dart'; + +abstract class Failure extends Equatable { + final String message; + final String? errorDetail; + final dynamic error; + + const Failure({required this.message, this.errorDetail, this.error}); + + @override + List get props => [message, error, errorDetail]; +} + +class GenericFailure extends Failure { + GenericFailure({String? message, super.errorDetail, super.error}) + : super(message: message ?? AppConstants.genericError001); +} diff --git a/lib/src/core/base/interfaces/interfaces.dart b/lib/src/core/base/interfaces/interfaces.dart new file mode 100644 index 0000000..d33131d --- /dev/null +++ b/lib/src/core/base/interfaces/interfaces.dart @@ -0,0 +1,2 @@ +export 'failures.dart'; +export 'usecase_interface.dart'; diff --git a/lib/src/core/base/interfaces/usecase_interface.dart b/lib/src/core/base/interfaces/usecase_interface.dart new file mode 100644 index 0000000..6e56ef2 --- /dev/null +++ b/lib/src/core/base/interfaces/usecase_interface.dart @@ -0,0 +1,24 @@ +import 'package:base_project/src/core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:equatable/equatable.dart'; + +abstract class UseCase { + Future> call(Params params); +} + +class NoParams extends Equatable { + @override + List get props => []; +} + +abstract class DefaultBlocState extends Equatable { + final Failure? failure; + final T? refreshEvent; + + const DefaultBlocState({this.failure, this.refreshEvent}); + + bool get shouldRefresh => failure != null && refreshEvent != null; + + @override + List get props => [failure, refreshEvent]; +} diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart new file mode 100644 index 0000000..0511e5f --- /dev/null +++ b/lib/src/core/core.dart @@ -0,0 +1,2 @@ +export 'base/base.dart'; +export 'utils/utils.dart'; diff --git a/lib/src/core/utils/converter_helper.dart b/lib/src/core/utils/converter_helper.dart new file mode 100644 index 0000000..5202464 --- /dev/null +++ b/lib/src/core/utils/converter_helper.dart @@ -0,0 +1,29 @@ +import 'package:intl/intl.dart'; + +class ConverterHelper { + ConverterHelper._(); + + static double dynamicToDouble(dynamic value) { + if (value is double) { + return value; + } else if (value is int) { + return value + 0.0; + } else { + throw Exception('ConverterHelper.intToDouble: Invalid type'); + } + } + + static String stringNullableToMMDDYYYY(String? date) { + if (date == null || date.isEmpty) return ''; + final formattedString = DateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(date); + final inputDate = DateTime.parse(formattedString.toString()); + return DateFormat('MM/dd/yyyy').format(inputDate); + } + + static String currencyFormatter(double value, [String replacedSymbol = '--']) { + if (value == 0.0) return replacedSymbol; + final bool isWholeNumber = value % 1 == 0; + final String formattedValue = isWholeNumber ? value.toInt().toString() : value.toStringAsFixed(2); + return '\$$formattedValue'; + } +} diff --git a/lib/src/core/utils/extensions.dart b/lib/src/core/utils/extensions.dart new file mode 100644 index 0000000..2228647 --- /dev/null +++ b/lib/src/core/utils/extensions.dart @@ -0,0 +1,5 @@ +import 'package:dartz/dartz.dart'; + +extension EitherExt on Either { + R asRight() => (this as Right).value; +} diff --git a/lib/src/core/utils/utils.dart b/lib/src/core/utils/utils.dart new file mode 100644 index 0000000..99dcc21 --- /dev/null +++ b/lib/src/core/utils/utils.dart @@ -0,0 +1,2 @@ +export 'converter_helper.dart'; +export 'extensions.dart'; diff --git a/lib/src/modules/payments/data/data.dart b/lib/src/modules/payments/data/data.dart new file mode 100644 index 0000000..18cedcc --- /dev/null +++ b/lib/src/modules/payments/data/data.dart @@ -0,0 +1,3 @@ +export 'datasource/datasource.dart'; +export 'model/model.dart'; +export 'repository/repository.dart'; diff --git a/lib/src/modules/payments/data/datasource/datasource.dart b/lib/src/modules/payments/data/datasource/datasource.dart new file mode 100644 index 0000000..5b17157 --- /dev/null +++ b/lib/src/modules/payments/data/datasource/datasource.dart @@ -0,0 +1 @@ +export 'payments_datasource.dart'; diff --git a/lib/src/modules/payments/data/datasource/payments_datasource.dart b/lib/src/modules/payments/data/datasource/payments_datasource.dart new file mode 100644 index 0000000..7559b5d --- /dev/null +++ b/lib/src/modules/payments/data/datasource/payments_datasource.dart @@ -0,0 +1,5 @@ +import 'package:base_project/src/modules/payments/domain/domain.dart'; + +abstract class PaymentsDataSource { + Future getPaymentsInfo(); +} diff --git a/lib/src/modules/payments/data/model/model.dart b/lib/src/modules/payments/data/model/model.dart new file mode 100644 index 0000000..ffcf92e --- /dev/null +++ b/lib/src/modules/payments/data/model/model.dart @@ -0,0 +1 @@ +export 'payments/payments.dart'; diff --git a/lib/src/modules/payments/data/model/payments/payments.dart b/lib/src/modules/payments/data/model/payments/payments.dart new file mode 100644 index 0000000..9b4603c --- /dev/null +++ b/lib/src/modules/payments/data/model/payments/payments.dart @@ -0,0 +1,5 @@ +export 'payments_info_model.dart'; +export 'payments_scheduled_model.dart'; +export 'payments_summary_model.dart'; +export 'payments_transactions_header_model.dart'; +export 'payments_transactions_model.dart'; diff --git a/lib/src/modules/payments/data/model/payments/payments_info_model.dart b/lib/src/modules/payments/data/model/payments/payments_info_model.dart new file mode 100644 index 0000000..8390039 --- /dev/null +++ b/lib/src/modules/payments/data/model/payments/payments_info_model.dart @@ -0,0 +1,31 @@ +import 'package:base_project/src/modules/payments/data/data.dart'; +import 'package:base_project/src/modules/payments/domain/domain.dart'; + +class PaymentsInfoModel extends PaymentsInfoEntity { + PaymentsInfoModel.fromJson(Map json) + : super( + paymentsScheduled: + json['paymentsScheduled'] != null + ? json['paymentsScheduled'] + .map((json) => PaymentsScheduledModel.fromJson(json)) + .toList() + : [], + transactionFilter: + json['transactionFilters'] != null + ? json['transactionFilters'] + .map((json) => PaymentsTransactionHeadersModel.fromJson(json)) + .toList() + : [], + transactions: + json['transactions'] != null + ? json['transactions'] + .map((json) => PaymentsTransactionsModel.fromJson(json)) + .toList() + : [], + summary: + json['summary'] != null + ? json['summary'].map((json) => PaymentsSummaryModel.fromJson(json)).toList() + : [], + ); + PaymentsInfoModel.empty() : this.fromJson({}); +} diff --git a/lib/src/modules/payments/data/model/payments/payments_scheduled_model.dart b/lib/src/modules/payments/data/model/payments/payments_scheduled_model.dart new file mode 100644 index 0000000..e6ae260 --- /dev/null +++ b/lib/src/modules/payments/data/model/payments/payments_scheduled_model.dart @@ -0,0 +1,30 @@ +import 'package:base_project/src/core/core.dart'; +import 'package:base_project/src/modules/payments/domain/domain.dart'; + +class PaymentsScheduledModel extends PaymentsScheduledEntity { + const PaymentsScheduledModel({ + required super.paymentDate, + required super.principal, + required super.interest, + required super.total, + required super.outstandingBalance, + required super.pastDue, + required super.status, + required super.paymentType, + required super.paymentDateFormatted, + }); + + factory PaymentsScheduledModel.fromJson(Map map) { + return PaymentsScheduledModel( + paymentDate: DateTime.parse(map['paymentDate'] ?? ""), + paymentDateFormatted: ConverterHelper.stringNullableToMMDDYYYY(map['paymentDate']), + principal: ConverterHelper.dynamicToDouble(map['principal'] ?? 0.0), + interest: ConverterHelper.dynamicToDouble(map['interest'] ?? 0.0), + total: ConverterHelper.dynamicToDouble(map['total'] ?? 0.0), + outstandingBalance: ConverterHelper.dynamicToDouble(map['outstandingBalance'] ?? 0.0), + pastDue: map['pastDue'] ?? false, + status: map['status'] ?? "", + paymentType: map['paymentType'] ?? "", + ); + } +} diff --git a/lib/src/modules/payments/data/model/payments/payments_summary_model.dart b/lib/src/modules/payments/data/model/payments/payments_summary_model.dart new file mode 100644 index 0000000..81fcb1e --- /dev/null +++ b/lib/src/modules/payments/data/model/payments/payments_summary_model.dart @@ -0,0 +1,10 @@ +import 'package:base_project/src/core/core.dart'; +import 'package:base_project/src/modules/payments/domain/domain.dart'; + +class PaymentsSummaryModel extends PaymentsSummaryEntity { + const PaymentsSummaryModel({required super.label, required super.value}); + + factory PaymentsSummaryModel.fromJson(Map map) { + return PaymentsSummaryModel(label: map["label"] ?? "", value: ConverterHelper.dynamicToDouble(map['value'] ?? 0.0)); + } +} diff --git a/lib/src/modules/payments/data/model/payments/payments_transactions_header_model.dart b/lib/src/modules/payments/data/model/payments/payments_transactions_header_model.dart new file mode 100644 index 0000000..b7d5f6f --- /dev/null +++ b/lib/src/modules/payments/data/model/payments/payments_transactions_header_model.dart @@ -0,0 +1,13 @@ +import 'package:base_project/src/modules/payments/domain/domain.dart'; + +class PaymentsTransactionHeadersModel extends PaymentsTransactionFilterEntity { + const PaymentsTransactionHeadersModel({required super.key, required super.label, required super.isDefault}); + + factory PaymentsTransactionHeadersModel.fromJson(Map map) { + return PaymentsTransactionHeadersModel( + key: map['key'] ?? "", + label: map['label'] ?? "", + isDefault: map['isDefault'] ?? false, + ); + } +} diff --git a/lib/src/modules/payments/data/model/payments/payments_transactions_model.dart b/lib/src/modules/payments/data/model/payments/payments_transactions_model.dart new file mode 100644 index 0000000..9fc821c --- /dev/null +++ b/lib/src/modules/payments/data/model/payments/payments_transactions_model.dart @@ -0,0 +1,48 @@ +import 'package:base_project/src/core/core.dart'; +import 'package:base_project/src/modules/payments/domain/domain.dart'; + +class PaymentsTransactionsModel extends PaymentsTransactionsEntity { + const PaymentsTransactionsModel({ + required super.key, + required super.actualPaymentPostDate, + required super.processDate, + required super.actualPaymentAmount, + required super.actualPrincipalPaymentAmount, + required super.actualInterestPaymentAmount, + required super.outstandingPrincipalBalance, + required super.outstandingLoanBalance, + required super.actualFee, + required super.paymentType, + }); + + factory PaymentsTransactionsModel.fromJson(Map map) { + return PaymentsTransactionsModel( + key: map['key'] ?? "", + actualPaymentPostDate: DateTime.parse(map['actualPaymentPostDate']), + processDate: DateTime.parse(map['processDate']), + actualPaymentAmount: ConverterHelper.dynamicToDouble(map['actualPaymentAmount'] ?? 0.0), + actualPrincipalPaymentAmount: ConverterHelper.dynamicToDouble(map['actualPrincipalPaymentAmount'] ?? 0.0), + actualInterestPaymentAmount: ConverterHelper.dynamicToDouble(map['actualInterestPaymentAmount'] ?? 0.0), + outstandingPrincipalBalance: ConverterHelper.dynamicToDouble(map['outstandingPrincipalBalance'] ?? 0.0), + outstandingLoanBalance: ConverterHelper.dynamicToDouble(map['outstandingLoanBalance'] ?? 0.0), + actualFee: ConverterHelper.dynamicToDouble(map['actualFee'] ?? 0.0), + paymentType: map['paymentType'] ?? "", + ); + } + + @override + Map toMap() { + return { + 'key': key, + 'actualPaymentPostDate': ConverterHelper.stringNullableToMMDDYYYY(actualPaymentPostDate.toIso8601String()), + 'processDate': ConverterHelper.stringNullableToMMDDYYYY(processDate.toIso8601String()), + 'actualPaymentAmount': ConverterHelper.currencyFormatter(actualPaymentAmount, "--"), + 'actualPrincipalPaymentAmount': ConverterHelper.currencyFormatter(actualPrincipalPaymentAmount, "--"), + 'actualInterestPaymentAmount': ConverterHelper.currencyFormatter(actualInterestPaymentAmount, "--"), + 'outstandingPrincipalBalance': ConverterHelper.currencyFormatter(outstandingPrincipalBalance, "--"), + 'outstandingLoanBalance': ConverterHelper.currencyFormatter(outstandingLoanBalance, "--"), + 'actualFee': ConverterHelper.currencyFormatter(actualFee, "--"), + 'type': paymentType, + }; + } +} diff --git a/lib/src/modules/payments/data/repository/payment_repository_impl.dart b/lib/src/modules/payments/data/repository/payment_repository_impl.dart new file mode 100644 index 0000000..70910ad --- /dev/null +++ b/lib/src/modules/payments/data/repository/payment_repository_impl.dart @@ -0,0 +1,19 @@ +import 'package:base_project/src/core/core.dart'; +import 'package:base_project/src/modules/payments/data/data.dart'; +import 'package:base_project/src/modules/payments/domain/domain.dart'; +import 'package:dartz/dartz.dart'; + +class PaymentsRepositoryImpl implements PaymentsRepository { + final PaymentsDataSource _datasource; + + const PaymentsRepositoryImpl(this._datasource); + + @override + Future> getPayments() async { + try { + return Right(await _datasource.getPaymentsInfo()); + } catch (e) { + return Left(GenericFailure(error: e)); + } + } +} diff --git a/lib/src/modules/payments/data/repository/repository.dart b/lib/src/modules/payments/data/repository/repository.dart new file mode 100644 index 0000000..c521fdc --- /dev/null +++ b/lib/src/modules/payments/data/repository/repository.dart @@ -0,0 +1 @@ +export 'payment_repository_impl.dart'; diff --git a/lib/src/modules/payments/domain/domain.dart b/lib/src/modules/payments/domain/domain.dart new file mode 100644 index 0000000..4b7d743 --- /dev/null +++ b/lib/src/modules/payments/domain/domain.dart @@ -0,0 +1,3 @@ +export 'entity/entity.dart'; +export 'repository/repository.dart'; +export 'usecase/usecase.dart'; diff --git a/lib/src/modules/payments/domain/entity/entity.dart b/lib/src/modules/payments/domain/entity/entity.dart new file mode 100644 index 0000000..c0e8722 --- /dev/null +++ b/lib/src/modules/payments/domain/entity/entity.dart @@ -0,0 +1,5 @@ +export 'payments_info_entity.dart'; +export 'payments_schedule_entity.dart'; +export 'payments_summary_entity.dart'; +export 'payments_transactions_entity.dart'; +export 'payments_transactions_filter_entity.dart'; diff --git a/lib/src/modules/payments/domain/entity/payments_info_entity.dart b/lib/src/modules/payments/domain/entity/payments_info_entity.dart new file mode 100644 index 0000000..3650896 --- /dev/null +++ b/lib/src/modules/payments/domain/entity/payments_info_entity.dart @@ -0,0 +1,20 @@ +import 'package:equatable/equatable.dart'; + +import 'entity.dart'; + +abstract class PaymentsInfoEntity extends Equatable { + final List paymentsScheduled; + final List summary; + final List transactionFilter; + final List transactions; + + const PaymentsInfoEntity({ + required this.paymentsScheduled, + required this.summary, + required this.transactionFilter, + required this.transactions, + }); + + @override + List get props => [paymentsScheduled, summary, transactionFilter, transactions]; +} diff --git a/lib/src/modules/payments/domain/entity/payments_schedule_entity.dart b/lib/src/modules/payments/domain/entity/payments_schedule_entity.dart new file mode 100644 index 0000000..fecd557 --- /dev/null +++ b/lib/src/modules/payments/domain/entity/payments_schedule_entity.dart @@ -0,0 +1,38 @@ +import 'package:equatable/equatable.dart'; + +abstract class PaymentsScheduledEntity extends Equatable { + final DateTime paymentDate; + final String paymentDateFormatted; + final double principal; + final double interest; + final double total; + final double outstandingBalance; + final bool pastDue; + final String status; + final String paymentType; + + const PaymentsScheduledEntity({ + required this.paymentDateFormatted, + required this.paymentDate, + required this.principal, + required this.interest, + required this.total, + required this.outstandingBalance, + required this.pastDue, + required this.status, + required this.paymentType, + }); + + @override + List get props => [ + paymentDate, + principal, + interest, + total, + outstandingBalance, + pastDue, + status, + paymentType, + paymentDateFormatted, + ]; +} diff --git a/lib/src/modules/payments/domain/entity/payments_summary_entity.dart b/lib/src/modules/payments/domain/entity/payments_summary_entity.dart new file mode 100644 index 0000000..8d3adf9 --- /dev/null +++ b/lib/src/modules/payments/domain/entity/payments_summary_entity.dart @@ -0,0 +1,11 @@ +import 'package:equatable/equatable.dart'; + +abstract class PaymentsSummaryEntity extends Equatable { + final String label; + final double value; + + const PaymentsSummaryEntity({required this.label, required this.value}); + + @override + List get props => [label, value]; +} diff --git a/lib/src/modules/payments/domain/entity/payments_transactions_entity.dart b/lib/src/modules/payments/domain/entity/payments_transactions_entity.dart new file mode 100644 index 0000000..3be868a --- /dev/null +++ b/lib/src/modules/payments/domain/entity/payments_transactions_entity.dart @@ -0,0 +1,44 @@ +import 'package:equatable/equatable.dart'; + +abstract class PaymentsTransactionsEntity extends Equatable { + final String key; + final DateTime actualPaymentPostDate; + final DateTime processDate; + final double actualPaymentAmount; + final double actualPrincipalPaymentAmount; + final double actualInterestPaymentAmount; + final double outstandingPrincipalBalance; + final double outstandingLoanBalance; + final double actualFee; + final String paymentType; + + const PaymentsTransactionsEntity({ + required this.key, + required this.actualPaymentPostDate, + required this.processDate, + required this.actualPaymentAmount, + required this.actualPrincipalPaymentAmount, + required this.actualInterestPaymentAmount, + required this.outstandingPrincipalBalance, + required this.outstandingLoanBalance, + required this.actualFee, + required this.paymentType, + }); + + @override + List get props { + return [ + actualPaymentPostDate, + processDate, + actualPaymentAmount, + actualPrincipalPaymentAmount, + actualInterestPaymentAmount, + outstandingPrincipalBalance, + outstandingLoanBalance, + actualFee, + paymentType, + ]; + } + + Map toMap(); +} diff --git a/lib/src/modules/payments/domain/entity/payments_transactions_filter_entity.dart b/lib/src/modules/payments/domain/entity/payments_transactions_filter_entity.dart new file mode 100644 index 0000000..95d6ad0 --- /dev/null +++ b/lib/src/modules/payments/domain/entity/payments_transactions_filter_entity.dart @@ -0,0 +1,12 @@ +import 'package:equatable/equatable.dart'; + +abstract class PaymentsTransactionFilterEntity extends Equatable { + final String key; + final String label; + final bool isDefault; + + const PaymentsTransactionFilterEntity({required this.key, required this.label, required this.isDefault}); + + @override + List get props => [key, label, isDefault]; +} diff --git a/lib/src/modules/payments/domain/repository/payment_repository.dart b/lib/src/modules/payments/domain/repository/payment_repository.dart new file mode 100644 index 0000000..83ac1d3 --- /dev/null +++ b/lib/src/modules/payments/domain/repository/payment_repository.dart @@ -0,0 +1,7 @@ +import 'package:base_project/src/core/core.dart'; +import 'package:base_project/src/modules/payments/domain/domain.dart'; +import 'package:dartz/dartz.dart'; + +abstract class PaymentsRepository { + Future> getPayments(); +} diff --git a/lib/src/modules/payments/domain/repository/repository.dart b/lib/src/modules/payments/domain/repository/repository.dart new file mode 100644 index 0000000..c41d0c2 --- /dev/null +++ b/lib/src/modules/payments/domain/repository/repository.dart @@ -0,0 +1 @@ +export 'payment_repository.dart'; diff --git a/lib/src/modules/payments/domain/usecase/get_payments_use_case.dart b/lib/src/modules/payments/domain/usecase/get_payments_use_case.dart new file mode 100644 index 0000000..6c16d48 --- /dev/null +++ b/lib/src/modules/payments/domain/usecase/get_payments_use_case.dart @@ -0,0 +1,26 @@ +import 'package:base_project/src/core/core.dart'; +import 'package:base_project/src/modules/payments/domain/domain.dart'; +import 'package:dartz/dartz.dart'; + +class GetPaymentsUseCase implements UseCase { + final PaymentsRepository _repository; + + GetPaymentsUseCase(this._repository); + + @override + Future> call([NoParams? params]) async { + final result = await _repository.getPayments(); + + if (result.isRight()) { + final paymentsInfo = result.asRight(); + + paymentsInfo.paymentsScheduled + ..removeWhere((payment) => payment.paymentDate.isBefore(DateTime.now())) + ..sort((a, b) => a.paymentDate.compareTo(b.paymentDate)); + + return Right(paymentsInfo); + } else { + return result; + } + } +} diff --git a/lib/src/modules/payments/domain/usecase/usecase.dart b/lib/src/modules/payments/domain/usecase/usecase.dart new file mode 100644 index 0000000..67571e0 --- /dev/null +++ b/lib/src/modules/payments/domain/usecase/usecase.dart @@ -0,0 +1 @@ +export 'get_payments_use_case.dart'; diff --git a/lib/src/modules/payments/infra/datasource/datasource.dart b/lib/src/modules/payments/infra/datasource/datasource.dart new file mode 100644 index 0000000..96d0e7b --- /dev/null +++ b/lib/src/modules/payments/infra/datasource/datasource.dart @@ -0,0 +1 @@ +export 'payments_datasource_impl.dart'; diff --git a/lib/src/modules/payments/infra/datasource/payments_datasource_impl.dart b/lib/src/modules/payments/infra/datasource/payments_datasource_impl.dart new file mode 100644 index 0000000..2ff2442 --- /dev/null +++ b/lib/src/modules/payments/infra/datasource/payments_datasource_impl.dart @@ -0,0 +1,21 @@ +import 'package:base_project/src/core/core.dart'; +import 'package:base_project/src/modules/payments/data/data.dart'; +import 'package:base_project/src/modules/payments/domain/domain.dart'; +import 'package:base_project/src/modules/payments/infra/mock/mock.dart'; + +class PaymentsDatasourceImpl implements PaymentsDataSource { + PaymentsDatasourceImpl(); + + @override + Future getPaymentsInfo() async { + try { + final response = await Future.delayed(Duration(milliseconds: 1500)).then((_) { + // INFO: use mockEmptyJson or mockPaymentsJson + return mockPaymentsJson; /* mockEmptyJson */ + }); + return PaymentsInfoModel.fromJson(response); + } catch (e) { + throw InfraError(InfraCode.unexpected, error: e); + } + } +} diff --git a/lib/src/modules/payments/infra/mock/mock.dart b/lib/src/modules/payments/infra/mock/mock.dart new file mode 100644 index 0000000..cad765e --- /dev/null +++ b/lib/src/modules/payments/infra/mock/mock.dart @@ -0,0 +1 @@ +export 'payments_json.dart'; diff --git a/lib/src/modules/payments/infra/mock/payments_json.dart b/lib/src/modules/payments/infra/mock/payments_json.dart new file mode 100644 index 0000000..c90400f --- /dev/null +++ b/lib/src/modules/payments/infra/mock/payments_json.dart @@ -0,0 +1,704 @@ +final mockPaymentsJson = { + "paymentsScheduled": [ + { + "paymentDate": "2024-07-03T00:00:00", + "principal": 0, + "interest": 40, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-07-18T00:00:00", + "principal": 0, + "interest": 40, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-08-01T00:00:00", + "principal": 0, + "interest": 40, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-08-15T00:00:00", + "principal": 0, + "interest": 40, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-08-29T00:00:00", + "principal": 10.75, + "interest": 29.25, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-09-12T00:00:00", + "principal": 14.09, + "interest": 25.91, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-09-26T00:00:00", + "principal": 14.27, + "interest": 25.73, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-10-10T00:00:00", + "principal": 14.46, + "interest": 25.54, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-10-24T00:00:00", + "principal": 14.65, + "interest": 25.35, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-11-07T00:00:00", + "principal": 14.84, + "interest": 25.16, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-11-21T00:00:00", + "principal": 15.03, + "interest": 24.97, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-12-05T00:00:00", + "principal": 15.23, + "interest": 24.77, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2024-12-19T00:00:00", + "principal": 15.42, + "interest": 24.58, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2025-01-02T00:00:00", + "principal": 15.63, + "interest": 24.37, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "ok", + "paymentType": "PaymentType1", + }, + { + "paymentDate": "2025-01-16T00:00:00", + "principal": 0, + "interest": 0, + "total": 40, + "outstandingBalance": 0, + "pastDue": true, + "loanModification": false, + "status": "past_duo", + "paymentType": "", + }, + { + "paymentDate": "2025-01-30T00:00:00", + "principal": 0, + "interest": 0, + "total": 40, + "outstandingBalance": 0, + "pastDue": true, + "loanModification": false, + "status": "past_duo", + "paymentType": "", + }, + { + "paymentDate": "2025-02-13T00:00:00", + "principal": 0, + "interest": 0, + "total": 40, + "outstandingBalance": 0, + "pastDue": true, + "loanModification": false, + "status": "past_duo", + "paymentType": "", + }, + { + "paymentDate": "2025-02-27T00:00:00", + "principal": 16.07, + "interest": 23.93, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-03-13T00:00:00", + "principal": 16.28, + "interest": 23.72, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-03-27T00:00:00", + "principal": 16.49, + "interest": 23.51, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-04-10T00:00:00", + "principal": 16.7, + "interest": 23.3, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-04-24T00:00:00", + "principal": 16.92, + "interest": 23.08, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-05-08T00:00:00", + "principal": 17.14, + "interest": 22.86, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-05-22T00:00:00", + "principal": 17.37, + "interest": 22.63, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-06-05T00:00:00", + "principal": 17.59, + "interest": 22.41, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-06-19T00:00:00", + "principal": 17.82, + "interest": 22.18, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-07-03T00:00:00", + "principal": 18.06, + "interest": 21.94, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-07-17T00:00:00", + "principal": 18.29, + "interest": 21.71, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-07-31T00:00:00", + "principal": 18.53, + "interest": 21.47, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-08-14T00:00:00", + "principal": 18.77, + "interest": 21.23, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-08-28T00:00:00", + "principal": 19.02, + "interest": 20.98, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-09-11T00:00:00", + "principal": 19.27, + "interest": 20.73, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-09-25T00:00:00", + "principal": 19.52, + "interest": 20.48, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-10-09T00:00:00", + "principal": 19.77, + "interest": 20.23, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-10-23T00:00:00", + "principal": 20.03, + "interest": 19.97, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-11-06T00:00:00", + "principal": 20.29, + "interest": 19.71, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-11-20T00:00:00", + "principal": 20.56, + "interest": 19.44, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + { + "paymentDate": "2025-12-04T00:00:00", + "principal": 20.83, + "interest": 19.17, + "total": 40, + "outstandingBalance": 0, + "pastDue": false, + "loanModification": false, + "status": "scheduled", + "paymentType": "", + }, + ], + "summary": [ + {"label": "Outstanding Balance", "value": 8888.88}, + {"label": "Total Paid", "value": 777}, + {"label": "Principal Paid", "value": 666.66}, + {"label": "Interest Paid", "value": 555.55}, + ], + "transactionFilters": [ + {"key": "processDate", "label": "Process Date", "isDefault": true}, + {"key": "actualPaymentAmount", "label": "Amount", "isDefault": true}, + {"key": "type", "label": "Type", "isDefault": true}, + {"key": "actualPrincipalPaymentAmount", "label": "Principal", "isDefault": false}, + {"key": "actualInterestPaymentAmount", "label": "Interest", "isDefault": false}, + {"key": "actualFee", "label": "Late Fee", "isDefault": false}, + {"key": "actualPaymentPostDate", "label": "Post Date", "isDefault": false}, + {"key": "outstandingPrincipalBalance", "label": "Principal Balance", "isDefault": false}, + ], + "transactions": [ + { + "paymentId": 1, + "actualPaymentPostDate": "2024-06-20T00:00:00", + "processDate": "2024-06-20T02:24:00", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 0, + "actualInterestPaymentAmount": 40, + "outstandingPrincipalBalance": 2000, + "outstandingLoanBalance": 2040, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 2, + "actualPaymentPostDate": "2024-07-03T00:00:00", + "processDate": "2024-07-04T05:23:51", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 0, + "actualInterestPaymentAmount": 40, + "outstandingPrincipalBalance": 2000, + "outstandingLoanBalance": 2040, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 3, + "actualPaymentPostDate": "2024-07-18T00:00:00", + "processDate": "2024-07-18T12:58:55", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 0, + "actualInterestPaymentAmount": 40, + "outstandingPrincipalBalance": 2000, + "outstandingLoanBalance": 2040, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 4, + "actualPaymentPostDate": "2024-08-01T00:00:00", + "processDate": "2024-08-01T13:01:28", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 0, + "actualInterestPaymentAmount": 40, + "outstandingPrincipalBalance": 2000, + "outstandingLoanBalance": 2040, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 5, + "actualPaymentPostDate": "2024-08-15T00:00:00", + "processDate": "2024-08-15T12:47:22", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 10.75, + "actualInterestPaymentAmount": 29.25, + "outstandingPrincipalBalance": 1989.25, + "outstandingLoanBalance": 2029.25, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 6, + "actualPaymentPostDate": "2024-08-29T00:00:00", + "processDate": "2024-08-29T12:46:23", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 14.09, + "actualInterestPaymentAmount": 25.91, + "outstandingPrincipalBalance": 1975.16, + "outstandingLoanBalance": 2015.16, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 7, + "actualPaymentPostDate": "2024-09-12T00:00:00", + "processDate": "2024-09-12T12:47:22", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 14.27, + "actualInterestPaymentAmount": 25.73, + "outstandingPrincipalBalance": 1960.89, + "outstandingLoanBalance": 2000.89, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 8, + "actualPaymentPostDate": "2024-09-26T00:00:00", + "processDate": "2024-09-26T12:46:54", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 14.46, + "actualInterestPaymentAmount": 25.54, + "outstandingPrincipalBalance": 1946.43, + "outstandingLoanBalance": 1986.43, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 9, + "actualPaymentPostDate": "2024-10-10T00:00:00", + "processDate": "2024-10-10T12:52:27", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 14.65, + "actualInterestPaymentAmount": 25.35, + "outstandingPrincipalBalance": 1931.78, + "outstandingLoanBalance": 1971.78, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 10, + "actualPaymentPostDate": "2024-10-24T00:00:00", + "processDate": "2024-10-24T13:01:22", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 14.84, + "actualInterestPaymentAmount": 25.16, + "outstandingPrincipalBalance": 1916.94, + "outstandingLoanBalance": 1956.94, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 11, + "actualPaymentPostDate": "2024-11-07T00:00:00", + "processDate": "2024-11-07T13:03:37", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 15.03, + "actualInterestPaymentAmount": 24.97, + "outstandingPrincipalBalance": 1901.91, + "outstandingLoanBalance": 1941.91, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 12, + "actualPaymentPostDate": "2024-11-21T00:00:00", + "processDate": "2024-11-21T13:05:14", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 15.23, + "actualInterestPaymentAmount": 24.77, + "outstandingPrincipalBalance": 1886.68, + "outstandingLoanBalance": 1926.68, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 13, + "actualPaymentPostDate": "2024-12-05T00:00:00", + "processDate": "2024-12-05T13:09:57", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 15.42, + "actualInterestPaymentAmount": 24.58, + "outstandingPrincipalBalance": 1871.26, + "outstandingLoanBalance": 1911.26, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + { + "paymentId": 14, + "actualPaymentPostDate": "2024-12-19T00:00:00", + "processDate": "2024-12-19T22:06:13", + "actualPaymentAmount": 40, + "actualPrincipalPaymentAmount": 15.63, + "actualInterestPaymentAmount": 24.37, + "outstandingPrincipalBalance": 1855.63, + "outstandingLoanBalance": 1895.63, + "actualFee": 0, + "paymentType": "PaymentType1", + "note": "", + "userName": "", + "type": 1, + "status": null, + "reversedAt": "0001-01-01T00:00:00", + "reimbursementMade": false, + }, + ], +}; + +final mockEmptyJson = { + "paymentsScheduled": [], + "summary": [ + {"label": "Outstanding Balance", "value": 0}, + {"label": "Total Paid", "value": 0}, + {"label": "Principal Paid", "value": 0}, + {"label": "Interest Paid", "value": 0}, + ], + "transactionHeaders": [], + "transactions": [], +}; diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..effe281 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,237 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + url: "https://pub.dev" + source: hosted + version: "2.12.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dartz: + dependency: "direct main" + description: + name: dartz + sha256: e6acf34ad2e31b1eb00948692468c30ab48ac8250e0f0df661e29f12dd252168 + url: "https://pub.dev" + source: hosted + version: "0.10.1" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" + url: "https://pub.dev" + source: hosted + version: "2.0.7" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + url: "https://pub.dev" + source: hosted + version: "1.3.2" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + url: "https://pub.dev" + source: hosted + version: "10.0.8" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" + source: hosted + version: "0.7.4" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + url: "https://pub.dev" + source: hosted + version: "14.3.1" +sdks: + dart: ">=3.7.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..191987f --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,92 @@ +name: base_project +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ^3.7.0 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + equatable: ^2.0.7 + dartz: ^0.10.1 + intl: ^0.20.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..ab73b3a --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1 @@ +void main() {} -- GitLab