6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit 704c91dd
Changed files
comwell_key_app/assets/translations/da-DK.json | 4 +- comwell_key_app/assets/translations/en-US.json | 4 +- .../Pods-Runner-acknowledgements.markdown | 2534 -------------------- ...frameworks-Debug-Develop-input-files.xcfilelist | 30 - ...rameworks-Debug-Develop-output-files.xcfilelist | 29 - ...-Runner-frameworks-Debug-input-files.xcfilelist | 30 - ...Runner-frameworks-Debug-output-files.xcfilelist | 29 - ...unner-frameworks-Profile-input-files.xcfilelist | 30 - ...nner-frameworks-Profile-output-files.xcfilelist | 29 - ...-frameworks-Release-Prod-input-files.xcfilelist | 30 - ...frameworks-Release-Prod-output-files.xcfilelist | 29 - ...frameworks-Release-Stage-input-files.xcfilelist | 30 - ...rameworks-Release-Stage-output-files.xcfilelist | 29 - ...unner-frameworks-Release-input-files.xcfilelist | 30 - ...nner-frameworks-Release-output-files.xcfilelist | 29 - .../Pods-Runner/Pods-Runner-frameworks.sh | 583 ----- .../models/add_card_payment_method.g.dart | 29 + .../models/add_card_payment_method.g.dart | 29 - .../.generated/profile_settings/model/user.g.dart | 35 - .../lib/.generated/services/models/user_dto.g.dart | 45 + .../lib/check_out/bloc/check_out_cubit.dart | 14 +- comwell_key_app/lib/comwell_app.dart | 1 + .../components/get_a_phone_call_section.dart | 41 +- comwell_key_app/lib/database/daos/user_dao.dart | 29 +- comwell_key_app/lib/login/auth.dart | 4 +- .../lib/login/components/azure_b2c_widget.dart | 8 +- .../lib/notifications/notifications_page.dart | 9 +- .../notifications/notifications_repository.dart | 7 +- .../payment_cards/bloc/payment_cards_cubit.dart | 13 +- .../lib/payment_cards/components/add_card.dart | 2 +- .../lib/payment_cards/payment_cards_page.dart | 2 +- .../pregistration/bloc/preregistration_cubit.dart | 218 ++ .../pregistration/bloc/preregistration_state.dart | 60 + .../pregistration/components/card_item.dart | 66 + .../components/clickable_card_item.dart | 31 + .../pregistration/components/information_card.dart | 39 + .../models/add_card_payment_method.dart | 21 + .../pages/prereg_confirmation_page.dart | 92 + .../pages/prereg_information_page.dart | 82 + .../pregistration/pregistration_repository.dart | 121 + .../pregistration/preregistration_flow.dart | 127 + .../pregistration/bloc/preregistration_cubit.dart | 217 -- .../pregistration/bloc/preregistration_state.dart | 60 - .../lib/pregistration/components/card_item.dart | 66 - .../components/clickable_card_item.dart | 31 - .../pregistration/components/information_card.dart | 39 - .../models/add_card_payment_method.dart | 25 - .../pages/prereg_confirmation_page.dart | 92 - .../pages/prereg_information_page.dart | 83 - .../pregistration/pregistration_repository.dart | 121 - .../lib/pregistration/preregistration_flow.dart | 127 - .../lib/profile/cubit/profile_cubit.dart | 17 +- .../lib/profile/cubit/profile_state.dart | 29 +- comwell_key_app/lib/profile/profile_page.dart | 325 +-- .../lib/profile/profile_repository.dart | 29 + .../components/address_bottom_sheet.dart | 247 +- .../components/comwell_text_field.dart | 21 +- .../components/date_time_picker.dart | 21 +- .../components/intl_phone_field.dart | 74 +- .../cubit/profile_settings_cubit.dart | 70 +- .../cubit/profile_settings_state.dart | 58 +- .../lib/profile_settings/model/address.dart | 21 +- .../lib/profile_settings/model/user.dart | 46 +- .../profile_settings/profile_settings_page.dart | 140 +- .../repostiory/profile_settings_repository.dart | 26 +- comwell_key_app/lib/routing/app_router.dart | 30 +- comwell_key_app/lib/services/api.dart | 16 +- .../lib/services/mappers/user_mapper.dart | 49 + comwell_key_app/lib/services/models/user_dto.dart | 69 + comwell_key_app/lib/utils/locator.dart | 2 +- .../profile_settings_cubit_test.dart | 31 +- 71 files changed, 1892 insertions(+), 4894 deletions(-)
Diff
diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index 4dddc8f9..bcd45acc 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -7,6 +7,7 @@
"generic_credit_card": "Kreditkort",
"generic_apple_pay": "Apple Pay",
"generic_google_pay": "Google Pay",
+ "generic_error": "Der skete en fejl. Prøv igen.",
"welcome_headline": "Velkommen hos Comwell Hotels",
"welcome_button": "Fortsæt",
"welcome_error": "Der er sket en fejl. Genstart app.",
@@ -212,5 +213,6 @@
"digital_media_subtitle": "Ja, jeg vil gerne se personligt tilpassede digitale reklamer med nyheder, inspiration og invitationer til events. Jeg kan til enhver tid, afslutte min tilmelding.",
"sms": "SMS",
"sms_subtitle": "Ja, jeg vil gerne modtage SMS med nyheder, inspiration og invitationer til events. Jeg kan til enhver tid, afslutte min tilmelding.",
- "notifications_error": "Der skete en fejl. Prøv igen."
+ "update_profile": "Opdater profil",
+ "profil_settings_invalid_date": "Ugyldigt dato"
}
\ No newline at end of file
diff --git a/comwell_key_app/assets/translations/en-US.json b/comwell_key_app/assets/translations/en-US.json
index c3bee793..d4bfcf1a 100644
--- a/comwell_key_app/assets/translations/en-US.json
+++ b/comwell_key_app/assets/translations/en-US.json
@@ -7,6 +7,7 @@
"generic_credit_card": "Credit Card",
"generic_apple_pay": "Apple Pay",
"generic_google_pay": "Google Pay",
+ "generic_error": "An error occurred. Please try again later.",
"welcome_headline": "Welcome at Comwell Hotels",
"welcome_button": "Continue",
"welcome_error": "An error occurred. Please try again later.",
@@ -212,5 +213,6 @@
"digital_media_subtitle": "Yes, I would like see personalized digital media advertising with news, inspiration and invitations to events. I can at any time, unsubscribe.",
"sms": "SMS",
"sms_subtitle": "Yes, I would like to recieve SMS with news, inspiration and invitations to events. I can at any time, unsubscribe.",
- "notifications_error": "An error occurred. Please try again later."
+ "update_profile": "Update profile",
+ "profil_settings_invalid_date": "Invalid date"
}
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.markdown b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.markdown
deleted file mode 100644
index 258b816d..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.markdown
+++ /dev/null
@@ -1,2534 +0,0 @@
-# Acknowledgements
-This application makes use of the following third party libraries:
-
-## Adyen
-
-The MIT License
-
-Copyright (c) Adyen B.V. (https://www.adyen.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-
-## Adyen3DS2
-
-Copyright 2018 Adyen
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-
-## AdyenNetworking
-
-MIT License
-
-Copyright (c) 2021 Adyen
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-## BerTlv
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-## CocoaLumberjack
-
-BSD 3-Clause License
-
-Copyright (c) 2010-2024, Deusty, LLC
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-3. Neither the name of Deusty nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## Firebase
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-## FirebaseAnalytics
-
-Copyright 2022 Google
-
-## FirebaseCore
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-## FirebaseCoreInternal
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-## FirebaseInstallations
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-## GoogleAppMeasurement
-
-Copyright 2022 Google
-
-## GoogleUtilities
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-================================================================================
-
-Copyright (c) 2017 Landon J. Fuller <landon@landonf.org>
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-## JSONModel
-
-Copyright (c) 2012-2016 Marin Todorov and JSONModel contributors
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-## PromisesObjC
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-## SQLCipher
-
-Copyright (c) 2008-2023, ZETETIC LLC
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the ZETETIC LLC nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## Sentry
-
-The MIT License (MIT)
-
-Copyright (c) 2015 Sentry
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-## adyen_checkout
-
-MIT License
-
-Copyright (c) 2023 Adyen
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-## device_info_plus
-
-Copyright 2017 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## firebase_analytics
-
-Copyright 2017, the Chromium project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-## firebase_core
-
-// Copyright 2017 The Chromium Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-## flutter_native_splash
-
-MIT License
-
-Copyright (c) 2022 Jon Hanson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-## flutter_secure_storage
-
-BSD 3-Clause License
-
-Copyright 2017 German Saprykin
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-## nanopb
-
-Copyright (c) 2011 Petteri Aimonen <jpa at nanopb.mail.kapsi.fi>
-
-This software is provided 'as-is', without any express or
-implied warranty. In no event will the authors be held liable
-for any damages arising from the use of this software.
-
-Permission is granted to anyone to use this software for any
-purpose, including commercial applications, and to alter it and
-redistribute it freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you
- must not claim that you wrote the original software. If you use
- this software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
-2. Altered source versions must be plainly marked as such, and
- must not be misrepresented as being the original software.
-
-3. This notice may not be removed or altered from any source
- distribution.
-
-
-## package_info_plus
-
-Copyright 2017 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## path_provider_foundation
-
-Copyright 2013 The Flutter Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## pay_ios
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-## permission_handler_apple
-
-MIT License
-
-Copyright (c) 2018 Baseflow
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-## sentry_flutter
-
-MIT License
-
-Copyright (c) 2019 Sentry
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-## seos_mobile_keys_plugin
-
-TODO: Add your license here.
-
-
-## share_plus
-
-Copyright 2017, the Flutter project authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## shared_preferences_foundation
-
-Copyright 2013 The Flutter Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## sqlcipher_flutter_libs
-
-sqlcipher_flutter_libs
-
-MIT License
-
-Copyright (c) 2020 Simon Binder
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---------------------------------------------------------------------------------
-OpenSSL
-
-
- Apache License
- Version 2.0, January 2004
- https://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
---------------------------------------------------------------------------------
-SQLCipher
-
-Copyright (c) 2008-2020 Zetetic LLC
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the ZETETIC LLC nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## url_launcher_ios
-
-Copyright 2013 The Flutter Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## vibration
-
-BSD 2-Clause License
-
-Copyright (c) 2018, Benjamin Dean
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## webview_flutter_wkwebview
-
-Copyright 2013 The Flutter Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Generated by CocoaPods - https://cocoapods.org
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-Develop-input-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-Develop-input-files.xcfilelist
deleted file mode 100644
index 6632bf37..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-Develop-input-files.xcfilelist
+++ /dev/null
@@ -1,30 +0,0 @@
-${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh
-${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework
-${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework
-${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework
-${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
-${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework
-${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
-${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework
-${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
-${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework
-${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework
-${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework
-${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework
-${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework
-${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework
-${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
-${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework
-${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework
-${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework
-${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework
-${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework
-${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework
-${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework
-${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework
-${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework
-${BUILT_PRODUCTS_DIR}/vibration/vibration.framework
-${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework
-${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework/Adyen3DS2
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-Develop-output-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-Develop-output-files.xcfilelist
deleted file mode 100644
index 5524fa4a..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-Develop-output-files.xcfilelist
+++ /dev/null
@@ -1,29 +0,0 @@
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AdyenNetworking.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BerTlv.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JSONModel.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SQLCipher.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/adyen_checkout.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_native_splash.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/pay_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/seos_mobile_keys_plugin.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlcipher_flutter_libs.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibration.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter_wkwebview.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen3DS2.framework
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-input-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-input-files.xcfilelist
deleted file mode 100644
index 6632bf37..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-input-files.xcfilelist
+++ /dev/null
@@ -1,30 +0,0 @@
-${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh
-${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework
-${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework
-${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework
-${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
-${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework
-${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
-${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework
-${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
-${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework
-${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework
-${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework
-${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework
-${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework
-${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework
-${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
-${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework
-${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework
-${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework
-${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework
-${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework
-${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework
-${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework
-${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework
-${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework
-${BUILT_PRODUCTS_DIR}/vibration/vibration.framework
-${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework
-${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework/Adyen3DS2
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-output-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-output-files.xcfilelist
deleted file mode 100644
index 5524fa4a..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-output-files.xcfilelist
+++ /dev/null
@@ -1,29 +0,0 @@
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AdyenNetworking.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BerTlv.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JSONModel.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SQLCipher.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/adyen_checkout.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_native_splash.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/pay_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/seos_mobile_keys_plugin.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlcipher_flutter_libs.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibration.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter_wkwebview.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen3DS2.framework
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Profile-input-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Profile-input-files.xcfilelist
deleted file mode 100644
index 6632bf37..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Profile-input-files.xcfilelist
+++ /dev/null
@@ -1,30 +0,0 @@
-${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh
-${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework
-${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework
-${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework
-${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
-${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework
-${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
-${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework
-${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
-${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework
-${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework
-${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework
-${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework
-${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework
-${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework
-${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
-${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework
-${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework
-${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework
-${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework
-${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework
-${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework
-${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework
-${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework
-${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework
-${BUILT_PRODUCTS_DIR}/vibration/vibration.framework
-${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework
-${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework/Adyen3DS2
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Profile-output-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Profile-output-files.xcfilelist
deleted file mode 100644
index 5524fa4a..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Profile-output-files.xcfilelist
+++ /dev/null
@@ -1,29 +0,0 @@
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AdyenNetworking.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BerTlv.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JSONModel.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SQLCipher.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/adyen_checkout.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_native_splash.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/pay_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/seos_mobile_keys_plugin.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlcipher_flutter_libs.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibration.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter_wkwebview.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen3DS2.framework
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Prod-input-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Prod-input-files.xcfilelist
deleted file mode 100644
index 6632bf37..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Prod-input-files.xcfilelist
+++ /dev/null
@@ -1,30 +0,0 @@
-${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh
-${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework
-${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework
-${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework
-${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
-${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework
-${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
-${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework
-${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
-${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework
-${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework
-${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework
-${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework
-${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework
-${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework
-${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
-${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework
-${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework
-${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework
-${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework
-${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework
-${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework
-${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework
-${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework
-${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework
-${BUILT_PRODUCTS_DIR}/vibration/vibration.framework
-${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework
-${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework/Adyen3DS2
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Prod-output-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Prod-output-files.xcfilelist
deleted file mode 100644
index 5524fa4a..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Prod-output-files.xcfilelist
+++ /dev/null
@@ -1,29 +0,0 @@
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AdyenNetworking.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BerTlv.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JSONModel.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SQLCipher.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/adyen_checkout.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_native_splash.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/pay_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/seos_mobile_keys_plugin.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlcipher_flutter_libs.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibration.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter_wkwebview.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen3DS2.framework
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Stage-input-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Stage-input-files.xcfilelist
deleted file mode 100644
index 6632bf37..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Stage-input-files.xcfilelist
+++ /dev/null
@@ -1,30 +0,0 @@
-${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh
-${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework
-${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework
-${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework
-${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
-${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework
-${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
-${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework
-${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
-${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework
-${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework
-${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework
-${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework
-${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework
-${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework
-${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
-${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework
-${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework
-${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework
-${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework
-${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework
-${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework
-${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework
-${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework
-${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework
-${BUILT_PRODUCTS_DIR}/vibration/vibration.framework
-${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework
-${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework/Adyen3DS2
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Stage-output-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Stage-output-files.xcfilelist
deleted file mode 100644
index 5524fa4a..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-Stage-output-files.xcfilelist
+++ /dev/null
@@ -1,29 +0,0 @@
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AdyenNetworking.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BerTlv.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JSONModel.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SQLCipher.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/adyen_checkout.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_native_splash.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/pay_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/seos_mobile_keys_plugin.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlcipher_flutter_libs.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibration.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter_wkwebview.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen3DS2.framework
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-input-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-input-files.xcfilelist
deleted file mode 100644
index 6632bf37..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-input-files.xcfilelist
+++ /dev/null
@@ -1,30 +0,0 @@
-${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh
-${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework
-${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework
-${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework
-${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
-${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
-${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework
-${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
-${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework
-${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
-${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework
-${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework
-${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework
-${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework
-${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework
-${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework
-${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
-${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework
-${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework
-${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework
-${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework
-${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework
-${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework
-${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework
-${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework
-${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework
-${BUILT_PRODUCTS_DIR}/vibration/vibration.framework
-${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework
-${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework/Adyen3DS2
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-output-files.xcfilelist b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-output-files.xcfilelist
deleted file mode 100644
index 5524fa4a..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-output-files.xcfilelist
+++ /dev/null
@@ -1,29 +0,0 @@
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AdyenNetworking.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BerTlv.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JSONModel.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SQLCipher.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/adyen_checkout.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_native_splash.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/pay_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/seos_mobile_keys_plugin.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlcipher_flutter_libs.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibration.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter_wkwebview.framework
-${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Adyen3DS2.framework
\ No newline at end of file
diff --git a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh b/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh
deleted file mode 100755
index f715324f..00000000
--- a/comwell_key_app/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh
+++ /dev/null
@@ -1,583 +0,0 @@
-#!/bin/sh
-set -e
-set -u
-set -o pipefail
-
-function on_error {
- echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
-}
-trap 'on_error $LINENO' ERR
-
-if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
- # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
- # frameworks to, so exit 0 (signalling the script phase was successful).
- exit 0
-fi
-
-echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-
-COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
-SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
-BCSYMBOLMAP_DIR="BCSymbolMaps"
-
-
-# This protects against multiple targets copying the same framework dependency at the same time. The solution
-# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
-RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
-
-# Copies and strips a vendored framework
-install_framework()
-{
- if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
- local source="${BUILT_PRODUCTS_DIR}/$1"
- elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
- local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
- elif [ -r "$1" ]; then
- local source="$1"
- fi
-
- local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-
- if [ -L "${source}" ]; then
- echo "Symlinked..."
- source="$(readlink -f "${source}")"
- fi
-
- if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then
- # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied
- find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do
- echo "Installing $f"
- install_bcsymbolmap "$f" "$destination"
- rm "$f"
- done
- rmdir "${source}/${BCSYMBOLMAP_DIR}"
- fi
-
- # Use filter instead of exclude so missing patterns don't throw errors.
- echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
- rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
-
- local basename
- basename="$(basename -s .framework "$1")"
- binary="${destination}/${basename}.framework/${basename}"
-
- if ! [ -r "$binary" ]; then
- binary="${destination}/${basename}"
- elif [ -L "${binary}" ]; then
- echo "Destination binary is symlinked..."
- dirname="$(dirname "${binary}")"
- binary="${dirname}/$(readlink "${binary}")"
- fi
-
- # Strip invalid architectures so "fat" simulator / device frameworks work on device
- if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
- strip_invalid_archs "$binary"
- fi
-
- # Resign the code if required by the build settings to avoid unstable apps
- code_sign_if_enabled "${destination}/$(basename "$1")"
-
- # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
- if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
- local swift_runtime_libs
- swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u)
- for lib in $swift_runtime_libs; do
- echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
- rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
- code_sign_if_enabled "${destination}/${lib}"
- done
- fi
-}
-# Copies and strips a vendored dSYM
-install_dsym() {
- local source="$1"
- warn_missing_arch=${2:-true}
- if [ -r "$source" ]; then
- # Copy the dSYM into the targets temp dir.
- echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
- rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
-
- local basename
- basename="$(basename -s .dSYM "$source")"
- binary_name="$(ls "$source/Contents/Resources/DWARF")"
- binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}"
-
- # Strip invalid architectures from the dSYM.
- if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then
- strip_invalid_archs "$binary" "$warn_missing_arch"
- fi
- if [[ $STRIP_BINARY_RETVAL == 0 ]]; then
- # Move the stripped file into its final destination.
- echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
- rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
- else
- # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
- mkdir -p "${DWARF_DSYM_FOLDER_PATH}"
- touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM"
- fi
- fi
-}
-
-# Used as a return value for each invocation of `strip_invalid_archs` function.
-STRIP_BINARY_RETVAL=0
-
-# Strip invalid architectures
-strip_invalid_archs() {
- binary="$1"
- warn_missing_arch=${2:-true}
- # Get architectures for current target binary
- binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
- # Intersect them with the architectures we are building for
- intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
- # If there are no archs supported by this binary then warn the user
- if [[ -z "$intersected_archs" ]]; then
- if [[ "$warn_missing_arch" == "true" ]]; then
- echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
- fi
- STRIP_BINARY_RETVAL=1
- return
- fi
- stripped=""
- for arch in $binary_archs; do
- if ! [[ "${ARCHS}" == *"$arch"* ]]; then
- # Strip non-valid architectures in-place
- lipo -remove "$arch" -output "$binary" "$binary"
- stripped="$stripped $arch"
- fi
- done
- if [[ "$stripped" ]]; then
- echo "Stripped $binary of architectures:$stripped"
- fi
- STRIP_BINARY_RETVAL=0
-}
-
-# Copies the bcsymbolmap files of a vendored framework
-install_bcsymbolmap() {
- local bcsymbolmap_path="$1"
- local destination="${BUILT_PRODUCTS_DIR}"
- echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}""
- rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"
-}
-
-# Signs a framework with the provided identity
-code_sign_if_enabled() {
- if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
- # Use the current code_sign_identity
- echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
- local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
-
- if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
- code_sign_cmd="$code_sign_cmd &"
- fi
- echo "$code_sign_cmd"
- eval "$code_sign_cmd"
- fi
-}
-
-if [[ "$CONFIGURATION" == "Debug" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Debug-debugtest" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Debug-develop" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Develop" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Prod" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Profile" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Release" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Release-Prod" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Release-Stage" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Release-releasetest" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Stage" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Test-Debug" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [[ "$CONFIGURATION" == "Test-Release" ]]; then
- install_framework "${BUILT_PRODUCTS_DIR}/Adyen/Adyen.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/AdyenNetworking/AdyenNetworking.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/BerTlv/BerTlv.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/SQLCipher/SQLCipher.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/adyen_checkout/adyen_checkout.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_native_splash/flutter_native_splash.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/pay_ios/pay_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/seos_mobile_keys_plugin/seos_mobile_keys_plugin.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/sqlcipher_flutter_libs/sqlcipher_flutter_libs.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework"
- install_framework "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework"
- install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Adyen3DS2/Adyen3DS2.framework"
-fi
-if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
- wait
-fi
diff --git a/comwell_key_app/lib/.generated/payment_cards/pregistration/models/add_card_payment_method.g.dart b/comwell_key_app/lib/.generated/payment_cards/pregistration/models/add_card_payment_method.g.dart
new file mode 100644
index 00000000..f9009f6b
--- /dev/null
+++ b/comwell_key_app/lib/.generated/payment_cards/pregistration/models/add_card_payment_method.g.dart
@@ -0,0 +1,29 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of '../../../../payment_cards/pregistration/models/add_card_payment_method.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+AddCardPaymentMethod _$AddCardPaymentMethodFromJson(Map json) =>
+ AddCardPaymentMethod(
+ brands: (json['brands'] as List<dynamic>)
+ .map((e) => $enumDecode(_$CardTypeEnumMap, e)),
+ name: json['name'] as String,
+ type: json['type'] as String,
+ );
+
+Map<String, dynamic> _$AddCardPaymentMethodToJson(
+ AddCardPaymentMethod instance) =>
+ <String, dynamic>{
+ 'brands': instance.brands.map((e) => _$CardTypeEnumMap[e]!).toList(),
+ 'name': instance.name,
+ 'type': instance.type,
+ };
+
+const _$CardTypeEnumMap = {
+ CardType.visa: 'visa',
+ CardType.mc: 'mc',
+ CardType.amex: 'amex',
+};
diff --git a/comwell_key_app/lib/.generated/pregistration/models/add_card_payment_method.g.dart b/comwell_key_app/lib/.generated/pregistration/models/add_card_payment_method.g.dart
deleted file mode 100644
index c2aeecc0..00000000
--- a/comwell_key_app/lib/.generated/pregistration/models/add_card_payment_method.g.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of '../../../pregistration/models/add_card_payment_method.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-AddCardPaymentMethod _$AddCardPaymentMethodFromJson(Map json) =>
- AddCardPaymentMethod(
- brands: (json['brands'] as List<dynamic>)
- .map((e) => $enumDecode(_$CardTypeEnumMap, e)),
- name: json['name'] as String,
- type: json['type'] as String,
- );
-
-Map<String, dynamic> _$AddCardPaymentMethodToJson(
- AddCardPaymentMethod instance) =>
- <String, dynamic>{
- 'brands': instance.brands.map((e) => _$CardTypeEnumMap[e]!).toList(),
- 'name': instance.name,
- 'type': instance.type,
- };
-
-const _$CardTypeEnumMap = {
- CardType.visa: 'visa',
- CardType.mc: 'mc',
- CardType.amex: 'amex',
-};
diff --git a/comwell_key_app/lib/.generated/profile_settings/model/user.g.dart b/comwell_key_app/lib/.generated/profile_settings/model/user.g.dart
deleted file mode 100644
index cea1d8e1..00000000
--- a/comwell_key_app/lib/.generated/profile_settings/model/user.g.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of '../../../profile_settings/model/user.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-User _$UserFromJson(Map json) => User(
- id: (json['id'] as num).toInt(),
- firstName: json['firstName'] as String,
- lastName: json['lastName'] as String,
- countryCode: json['countryCode'] as String?,
- phone: json['phone'] as String?,
- email: json['email'] as String,
- address: json['address'] == null
- ? null
- : Address.fromJson(Map<String, dynamic>.from(json['address'] as Map)),
- birthDate: DateTime.parse(json['birthDate'] as String),
- shopperReference: json['shopperReference'] as String?,
- points: (json['points'] as num?)?.toInt(),
- );
-
-Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
- 'id': instance.id,
- 'firstName': instance.firstName,
- 'lastName': instance.lastName,
- 'countryCode': instance.countryCode,
- 'phone': instance.phone,
- 'email': instance.email,
- 'address': instance.address?.toJson(),
- 'birthDate': instance.birthDate.toIso8601String(),
- 'shopperReference': instance.shopperReference,
- 'points': instance.points,
- };
diff --git a/comwell_key_app/lib/.generated/services/models/user_dto.g.dart b/comwell_key_app/lib/.generated/services/models/user_dto.g.dart
new file mode 100644
index 00000000..1a05bd57
--- /dev/null
+++ b/comwell_key_app/lib/.generated/services/models/user_dto.g.dart
@@ -0,0 +1,45 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of '../../../services/models/user_dto.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+UserDto _$UserDtoFromJson(Map json) => UserDto(
+ id: (json['id'] as num).toInt(),
+ firstName: json['firstName'] as String,
+ lastName: json['lastName'] as String,
+ email: json['email'] as String,
+ clubId: json['clubId'] as String,
+ clubLevel: json['clubLevel'] as String,
+ clubLevelName: json['clubLevelName'] as String,
+ birthDate: DateTime.parse(json['birthDate'] as String),
+ phoneNumber: json['phoneNumber'] as String,
+ gender: json['gender'] as String,
+ addressStreet: json['addressStreet'] as String,
+ addressZip: json['addressZip'] as String,
+ addressCity: json['addressCity'] as String,
+ addressCountry: json['addressCountry'] as String,
+ points: (json['points'] as num).toInt(),
+ locale: json['locale'] as String,
+ );
+
+Map<String, dynamic> _$UserDtoToJson(UserDto instance) => <String, dynamic>{
+ 'id': instance.id,
+ 'firstName': instance.firstName,
+ 'lastName': instance.lastName,
+ 'email': instance.email,
+ 'clubId': instance.clubId,
+ 'clubLevel': instance.clubLevel,
+ 'clubLevelName': instance.clubLevelName,
+ 'birthDate': instance.birthDate.toIso8601String(),
+ 'phoneNumber': instance.phoneNumber,
+ 'gender': instance.gender,
+ 'addressStreet': instance.addressStreet,
+ 'addressZip': instance.addressZip,
+ 'addressCity': instance.addressCity,
+ 'addressCountry': instance.addressCountry,
+ 'points': instance.points,
+ 'locale': instance.locale,
+ };
diff --git a/comwell_key_app/lib/check_out/bloc/check_out_cubit.dart b/comwell_key_app/lib/check_out/bloc/check_out_cubit.dart
index c90bd31c..5b66a771 100644
--- a/comwell_key_app/lib/check_out/bloc/check_out_cubit.dart
+++ b/comwell_key_app/lib/check_out/bloc/check_out_cubit.dart
@@ -6,15 +6,15 @@ import 'package:comwell_key_app/check_out/models/checkout_processing_state.dart'
import 'package:comwell_key_app/check_out/models/payment_method.dart';
import 'package:comwell_key_app/check_out/pages/check_out_page.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
-import 'package:comwell_key_app/pregistration/pregistration_repository.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/pregistration_repository.dart';
+import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
import 'package:comwell_key_app/services/adyen/adyen_amount.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:flutter/material.dart';
class CheckoutCubit extends Cubit<CheckoutState> {
- final ProfileSettingsRepository profileSettingsRepository =
- locator<ProfileSettingsRepository>();
+ final ProfileRepository profileRepository = locator<ProfileRepository>();
final PreregistrationRepository preregistrationRepository =
locator<PreregistrationRepository>();
final pageController = PageController();
@@ -28,7 +28,7 @@ class CheckoutCubit extends Cubit<CheckoutState> {
void init() async {
try {
- final user = await profileSettingsRepository.fetchProfileSettings();
+ final user = await profileRepository.fetchProfileSettings();
emit(state.clubPointsFetched(user!.points ?? 0));
} catch (e) {
// Todo handle error
@@ -117,8 +117,10 @@ class CheckoutCubit extends Cubit<CheckoutState> {
value: priceInCents,
currency: "DKK",
);
- final paymentConfigurations = await preregistrationRepository.sessionCheckout(amount, booking.hotelCode);
- emit(state.processingStateUpdated(CheckoutProcessingStateSessionReceived(paymentConfigurations: paymentConfigurations)));
+ final paymentConfigurations = await preregistrationRepository
+ .sessionCheckout(amount, booking.hotelCode);
+ emit(state.processingStateUpdated(CheckoutProcessingStateSessionReceived(
+ paymentConfigurations: paymentConfigurations)));
} catch (e) {
emit(state.processingStateUpdated(CheckoutProcessingStateError()));
}
diff --git a/comwell_key_app/lib/comwell_app.dart b/comwell_key_app/lib/comwell_app.dart
index 01398afc..a259b023 100644
--- a/comwell_key_app/lib/comwell_app.dart
+++ b/comwell_key_app/lib/comwell_app.dart
@@ -67,6 +67,7 @@ final List<BlocProvider> blocProviderList = [
BlocProvider<ProfileSettingsCubit>(
lazy: false,
create: (BuildContext context) => ProfileSettingsCubit(
+ profileRepository: locator<ProfileRepository>(),
profileSettingsRepository: locator<ProfileSettingsRepository>(),
authenticationRepository: locator<AuthenticationRepository>()),
),
diff --git a/comwell_key_app/lib/contact/components/get_a_phone_call_section.dart b/comwell_key_app/lib/contact/components/get_a_phone_call_section.dart
index d0e743f0..c3969c10 100644
--- a/comwell_key_app/lib/contact/components/get_a_phone_call_section.dart
+++ b/comwell_key_app/lib/contact/components/get_a_phone_call_section.dart
@@ -4,9 +4,9 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
class GetAPhoneCallSection extends StatelessWidget {
-
final VoidCallback onPressed;
- const GetAPhoneCallSection({super.key,
+ const GetAPhoneCallSection({
+ super.key,
required this.onPressed,
});
@@ -21,34 +21,37 @@ class GetAPhoneCallSection extends StatelessWidget {
style: theme.textTheme.headlineMedium,
),
const SizedBox(height: 8),
- Text('get_a_call_description'.tr(),style: theme.textTheme.bodySmall),
+ Text('get_a_call_description'.tr(), style: theme.textTheme.bodySmall),
const SizedBox(height: 8),
- Text('telephone_number'.tr(),style: theme.textTheme.labelLarge),
- const IntlPhoneField(title: 'Telefonnummer', phoneNumber: '28960099'),
+ Text('telephone_number'.tr(), style: theme.textTheme.labelLarge),
+ IntlPhoneField(
+ readOnly: true,
+ title: 'Telefonnummer',
+ phoneNumber: '28960099',
+ controller: TextEditingController(),
+ ),
const SizedBox(height: 16),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 0),
child: ElevatedButton(
- style: ElevatedButton.styleFrom(
- backgroundColor: sandColor,
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(25),
+ style: ElevatedButton.styleFrom(
+ backgroundColor: sandColor,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(25),
+ ),
+ minimumSize: const Size(double.infinity, 52),
),
- minimumSize: const Size(double.infinity, 52),
- ),
- onPressed: () async {
- // await makePhoneCall('comwell_telefon_number'.tr());
- },
- child:
- Text(
+ onPressed: () async {
+ // await makePhoneCall('comwell_telefon_number'.tr());
+ },
+ child: Text(
'get_a_call'.tr(),
style: theme.textTheme.headlineSmall?.copyWith(
color: Colors.white,
),
- )
- ),
+ )),
)
],
);
}
-}
\ No newline at end of file
+}
diff --git a/comwell_key_app/lib/database/daos/user_dao.dart b/comwell_key_app/lib/database/daos/user_dao.dart
index a0494163..aa618d81 100644
--- a/comwell_key_app/lib/database/daos/user_dao.dart
+++ b/comwell_key_app/lib/database/daos/user_dao.dart
@@ -2,6 +2,8 @@ import 'dart:convert';
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
+import 'package:comwell_key_app/services/mappers/user_mapper.dart';
+import 'package:comwell_key_app/services/models/user_dto.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:drift/drift.dart';
@@ -13,25 +15,30 @@ part '../../.generated/database/daos/user_dao.g.dart';
class UserDAO extends DatabaseAccessor<ComwellDatabase> with _$UserDAOMixin {
UserDAO(super.attachedDatabase);
- Future<void> saveUser(User user) async {
- final json = jsonEncode(user.toJson());
- final insertOp = UserEntityCompanion.insert(id: user.id, json: json);
- await (update(userEntity)..where((table) => table.id.equals(user.id)))
- .write(insertOp);
+ Future<void> saveUser(UserDto user) async {
+ await insert([user]);
}
- Future<User> getUser(int id) async {
- final user =
- await (select(userEntity)..where((table) => table.id.equals(id))).get();
+ Future<void> insert(Iterable<UserDto> users) async {
+ final entities = users.map((user) {
+ final json = jsonEncode(user.toJson());
+ return UserEntityCompanion.insert(id: user.id, json: json);
+ });
+ await batch((batch) => batch.insertAll(userEntity, entities,
+ mode: InsertMode.insertOrReplace));
+ }
+
+ Future<User> getUser() async {
+ final user = await select(userEntity).get();
final json = jsonDecode(user.first.json) as Json;
- return User.fromJson(json);
+ return UserDto.fromJson(json).toUser();
}
- Stream<User> watchUser() {
+ Stream<UserDto> watchUser() {
return (select(userEntity).watch()).map((users) {
final userTable = users.first;
final json = jsonDecode(userTable.json) as Json;
- return User.fromJson(json);
+ return UserDto.fromJson(json);
});
}
}
diff --git a/comwell_key_app/lib/login/auth.dart b/comwell_key_app/lib/login/auth.dart
index 2fedbbd6..9cf08dd5 100644
--- a/comwell_key_app/lib/login/auth.dart
+++ b/comwell_key_app/lib/login/auth.dart
@@ -1,5 +1,5 @@
enum Auth {
login,
- createUser
-
+ createUser,
+ changePassword,
}
diff --git a/comwell_key_app/lib/login/components/azure_b2c_widget.dart b/comwell_key_app/lib/login/components/azure_b2c_widget.dart
index c0d2d79c..78184cd4 100644
--- a/comwell_key_app/lib/login/components/azure_b2c_widget.dart
+++ b/comwell_key_app/lib/login/components/azure_b2c_widget.dart
@@ -26,9 +26,11 @@ class AzureB2CWidget extends StatelessWidget {
Widget build(BuildContext context) {
return ADB2CEmbedWebView(
tenantBaseUrl: dotenv.env['AAD_B2C_USER_AUTH_FLOW']!,
- userFlowName: Auth.login == authEnum
- ? dotenv.env['AAD_B2C_USER_FLOW_NAME_LOGIN']!
- : dotenv.env['AAD_B2C_USER_FLOW_NAME_CREATE_USER']!,
+ userFlowName: switch (authEnum) {
+ Auth.login => dotenv.env['AAD_B2C_USER_FLOW_NAME_LOGIN']!,
+ Auth.createUser => dotenv.env['AAD_B2C_USER_FLOW_NAME_CREATE_USER']!,
+ Auth.changePassword => dotenv.env['AAD_B2C_USER_FLOW_NAME_CHANGE_PASSWORD']!,
+ },
clientId: dotenv.env['AAD_B2C_CLIENT_ID']!,
redirectUrl: dotenv.env['AAD_B2C_REDIRECT_URL']!,
scopes: dotenv.env['AAD_B2C_SCOPES']!.split(','),
diff --git a/comwell_key_app/lib/notifications/notifications_page.dart b/comwell_key_app/lib/notifications/notifications_page.dart
index ed59edb1..44792523 100644
--- a/comwell_key_app/lib/notifications/notifications_page.dart
+++ b/comwell_key_app/lib/notifications/notifications_page.dart
@@ -8,15 +8,10 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:comwell_key_app/notifications/cubit/notifications_cubit.dart';
import 'components/communications_list.dart';
-class NotificationsPage extends StatefulWidget {
+class NotificationsPage extends StatelessWidget {
final Iterable<NotificationPermission> notificationPermissions;
const NotificationsPage({super.key, required this.notificationPermissions});
- @override
- State<NotificationsPage> createState() => _NotificationsPageState();
-}
-
-class _NotificationsPageState extends State<NotificationsPage> {
@override
Widget build(BuildContext context) {
final cubit = context.read<NotificationsCubit>();
@@ -30,7 +25,7 @@ class _NotificationsPageState extends State<NotificationsPage> {
} else if (state.error != null) {
return Center(
child: Text(
- "notifications_error".tr(),
+ "generic_error".tr(),
),
);
} else {
diff --git a/comwell_key_app/lib/notifications/notifications_repository.dart b/comwell_key_app/lib/notifications/notifications_repository.dart
index d3886840..c556da6e 100644
--- a/comwell_key_app/lib/notifications/notifications_repository.dart
+++ b/comwell_key_app/lib/notifications/notifications_repository.dart
@@ -1,7 +1,7 @@
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/notifications/models/notification_permission.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
-import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
+import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:comwell_key_app/utils/locator.dart';
@@ -9,13 +9,12 @@ import 'package:comwell_key_app/utils/locator.dart';
class NotificationsRepository {
final Api api = Api();
final db = locator<ComwellDatabase>();
- final ProfileSettingsRepository profileSettingsRepository =
- locator<ProfileSettingsRepository>();
+ final ProfileRepository profileRepository = locator<ProfileRepository>();
late User user;
late Iterable<NotificationPermission> notificationPermissions;
Future<User> fetchUser() async {
- user = await profileSettingsRepository.fetchProfileSettings();
+ user = await profileRepository.fetchProfileSettings();
return user;
}
diff --git a/comwell_key_app/lib/payment_cards/bloc/payment_cards_cubit.dart b/comwell_key_app/lib/payment_cards/bloc/payment_cards_cubit.dart
index c229cb50..c3e85d25 100644
--- a/comwell_key_app/lib/payment_cards/bloc/payment_cards_cubit.dart
+++ b/comwell_key_app/lib/payment_cards/bloc/payment_cards_cubit.dart
@@ -4,8 +4,8 @@ import 'package:comwell_key_app/check_out/models/payment_configurations.dart';
import 'package:comwell_key_app/overview/repository/overview_repository.dart';
import 'package:comwell_key_app/payment_cards/bloc/payment_cards_state.dart';
import 'package:comwell_key_app/payment_cards/payment_cards_repository.dart';
-import 'package:comwell_key_app/pregistration/pregistration_repository.dart';
-import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/pregistration_repository.dart';
+import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/services/adyen/payment_event_handler.dart';
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/utils/locator.dart';
@@ -15,8 +15,7 @@ class PaymentCardsCubit extends Cubit<PaymentCardsState> {
PaymentCardsRepository();
final PreregistrationRepository _preregistrationRepository =
locator<PreregistrationRepository>();
- final ProfileSettingsRepository profileSettingsRepository =
- locator<ProfileSettingsRepository>();
+ final ProfileRepository profileRepository = locator<ProfileRepository>();
final Api _api = Api();
late PaymentConfigurations paymentConfigurations;
@@ -56,7 +55,7 @@ class PaymentCardsCubit extends Cubit<PaymentCardsState> {
return AdvancedCheckout(
onSubmit: (data, [extra]) async {
try {
- final user = await profileSettingsRepository.fetchProfileSettings();
+ final user = await profileRepository.fetchProfileSettings();
final shopperRef = user?.shopperReference ?? "Test reference";
final response = await _api.submitPayment(data, shopperRef);
return PaymentEventHandler().handleResponse(jsonResponse: response);
@@ -71,7 +70,5 @@ class PaymentCardsCubit extends Cubit<PaymentCardsState> {
);
}
- void onRemoveCard(String cardId) {
-
- }
+ void onRemoveCard(String cardId) {}
}
diff --git a/comwell_key_app/lib/payment_cards/components/add_card.dart b/comwell_key_app/lib/payment_cards/components/add_card.dart
index 61a5d2a0..25af292c 100644
--- a/comwell_key_app/lib/payment_cards/components/add_card.dart
+++ b/comwell_key_app/lib/payment_cards/components/add_card.dart
@@ -1,6 +1,6 @@
import 'package:adyen_checkout/adyen_checkout.dart';
import 'package:comwell_key_app/payment_cards/bloc/payment_cards_cubit.dart';
-import 'package:comwell_key_app/pregistration/models/add_card_payment_method.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/models/add_card_payment_method.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
diff --git a/comwell_key_app/lib/payment_cards/payment_cards_page.dart b/comwell_key_app/lib/payment_cards/payment_cards_page.dart
index a32bafa3..9fdecec1 100644
--- a/comwell_key_app/lib/payment_cards/payment_cards_page.dart
+++ b/comwell_key_app/lib/payment_cards/payment_cards_page.dart
@@ -3,7 +3,7 @@ import 'package:comwell_key_app/payment_cards/bloc/payment_cards_state.dart';
import 'package:comwell_key_app/payment_cards/components/add_card.dart';
import 'package:comwell_key_app/payment_cards/components/edit_card_dialog.dart';
import 'package:comwell_key_app/payment_cards/components/remove_card_button.dart';
-import 'package:comwell_key_app/pregistration/components/card_item.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/components/card_item.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/comwell_key_app/lib/payment_cards/pregistration/bloc/preregistration_cubit.dart b/comwell_key_app/lib/payment_cards/pregistration/bloc/preregistration_cubit.dart
new file mode 100644
index 00000000..f8f36d2b
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/bloc/preregistration_cubit.dart
@@ -0,0 +1,218 @@
+import 'package:adyen_checkout/src/common/model/payment_result.dart';
+import 'package:bloc/bloc.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/bloc/preregistration_state.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/preregistration_flow.dart';
+import 'package:comwell_key_app/profile/profile_repository.dart';
+import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
+import 'package:comwell_key_app/tracking/comwell_tracking.dart';
+import 'package:comwell_key_app/tracking/models/analytics_event_item.dart';
+import 'package:comwell_key_app/utils/locator.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/cupertino.dart';
+
+class PreregistrationCubit extends Cubit<PreregistrationState> {
+ final _profileRepository = locator<ProfileRepository>();
+ final _tracking = locator<ComwellTracking>();
+
+ final pageController = PageController();
+ final addressTextController = TextEditingController();
+ final postalCodeTextController = TextEditingController();
+ final cityTextController = TextEditingController();
+ final countryTextController = TextEditingController();
+
+ PreregistrationPage get currentPage =>
+ PreregistrationPage.fromIndex(pageController.page?.toInt() ?? 0);
+ bool _isAnimating = false;
+
+ PreregistrationCubit() : super(const PreregistrationState(loading: false)) {
+ _tracking.trackScreenView(
+ "Pre-registration - Betalingskort",
+ "/pre-registration/betalingskort",
+ );
+ }
+
+ void init() async {
+ emit(state.copyWith(loading: true, error: null));
+ try {
+ final user = await _profileRepository.fetchProfileSettings();
+ if (user != null) {
+ addressTextController.text = user.address?.street ?? "";
+ postalCodeTextController.text = user.address?.zipCode ?? "";
+ cityTextController.text = user.address?.city ?? "";
+ countryTextController.text = user.address?.country ?? "";
+ } else {
+ emit(state.copyWith(
+ loading: false, error: Exception("Der skete en fejl")));
+ }
+ } on Exception catch (e) {
+ emit(state.copyWith(error: e));
+ }
+ }
+
+ void onInformationContinueClicked() {
+ if (isAddressValid && isPostalCodeValid && isCityValid && isCountryValid) {
+ _navigateNextPage();
+ } else {
+ emit(state.copyWith(missingInformation: true));
+ }
+ }
+
+ void onContinueClicked() {
+ if (_isAnimating) return;
+ switch (currentPage) {
+ case PreregistrationPage.information:
+ onInformationContinueClicked();
+ break;
+ case PreregistrationPage.confirmation:
+ _onConfirmPressed();
+ break;
+ }
+ }
+
+ void addToCart() {
+ final analyticsEventItem = AnalyticsEventItem(
+ hotelName: "Comwell",
+ currency: "DKK",
+ value: 500,
+ placement: "placement",
+ items: ["items"],
+ itemId: "itemId",
+ itemName: "itemName",
+ price: 200,
+ quantity: 200);
+ _tracking.trackAddToCart(analyticsEventItem);
+ }
+
+ void removeToCard() {
+ final analyticsEventItem = AnalyticsEventItem(
+ hotelName: "Comwell",
+ currency: "DKK",
+ value: 500,
+ placement: "placement",
+ items: ["items"],
+ itemId: "itemId",
+ itemName: "itemName",
+ price: 200,
+ quantity: 200);
+ _tracking.trackRemoveFromCart(analyticsEventItem);
+ }
+
+ void _onConfirmPressed() async {
+ final analyticsEventItem = AnalyticsEventItem(
+ hotelName: "Comwell",
+ currency: "DKK",
+ value: 500,
+ placement: "placement",
+ items: ["items"],
+ itemId: "itemId",
+ itemName: "itemName",
+ price: 200,
+ quantity: 200);
+ _tracking.trackBeginCheckout(analyticsEventItem);
+ emit(state.copyWith(loading: true));
+ Future.delayed(const Duration(seconds: 3), () {
+ emit(state.copyWith(loading: false));
+ });
+ }
+
+ void onEditProfileClicked() {
+ // Not implemented
+ }
+
+ void onEditAddressClicked() {
+ _navigateTo(PreregistrationPage.information);
+ }
+
+ void onEditExtrasClicked() {
+ // Not implemented
+ }
+
+ bool onBackClicked() {
+ if (_isAnimating) return true;
+ final hasPage = pageController.page != null;
+ if (hasPage && pageController.page! >= 1.0) {
+ _navigatePreviousPage();
+ return true;
+ }
+ return false;
+ }
+
+ void _navigateTo(PreregistrationPage page) async {
+ if (_isAnimating) return;
+ _isAnimating = true;
+ await pageController.animateToPage(page.index,
+ duration: const Duration(milliseconds: 500),
+ curve: Curves.fastOutSlowIn);
+ emit(state.copyWith(forceUpdate: true));
+ _isAnimating = false;
+ }
+
+ void _navigateNextPage() async {
+ if (_isAnimating) return;
+ _isAnimating = true;
+ await pageController.nextPage(
+ duration: const Duration(milliseconds: 500),
+ curve: Curves.fastOutSlowIn);
+ emit(state.copyWith(forceUpdate: true));
+ _isAnimating = false;
+ }
+
+ void _navigatePreviousPage() async {
+ if (_isAnimating) return;
+ _isAnimating = true;
+ await pageController.previousPage(
+ duration: const Duration(milliseconds: 500),
+ curve: Curves.fastOutSlowIn);
+ emit(state.copyWith(forceUpdate: true));
+ _isAnimating = false;
+ }
+
+ @override
+ Future<void> close() {
+ addressTextController.dispose();
+ postalCodeTextController.dispose();
+ cityTextController.dispose();
+ countryTextController.dispose();
+ pageController.dispose();
+ return super.close();
+ }
+
+ bool get isAddressValid => addressTextController.text.isNotEmpty;
+
+ bool get isPostalCodeValid =>
+ postalCodeTextController.text.isNotEmpty &&
+ postalCodeTextController.text.length <= 4;
+
+ bool get isCityValid => cityTextController.text.isNotEmpty;
+
+ bool get isCountryValid => countryTextController.text.isNotEmpty;
+
+ bool get canContinue {
+ int page = pageController.page?.ceil() ?? 0;
+ final preregPage = PreregistrationPage.fromIndex(page);
+ switch (preregPage) {
+ case PreregistrationPage.information:
+ return isAddressValid &&
+ isPostalCodeValid &&
+ isCityValid &&
+ isCityValid;
+ case PreregistrationPage.confirmation:
+ return true;
+ }
+ }
+
+ String get buttonText {
+ int page = pageController.page?.ceil() ?? 0;
+ final preregPage = PreregistrationPage.fromIndex(page);
+ switch (preregPage) {
+ case PreregistrationPage.information:
+ return "generic_continue".tr();
+ case PreregistrationPage.confirmation:
+ return "generic_confirm".tr();
+ }
+ }
+
+ void onTermsAndConditionsToggled(bool toggle) {
+ emit(state.copyWith(termsAndConditionsAccepted: toggle));
+ }
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/bloc/preregistration_state.dart b/comwell_key_app/lib/payment_cards/pregistration/bloc/preregistration_state.dart
new file mode 100644
index 00000000..a07663b4
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/bloc/preregistration_state.dart
@@ -0,0 +1,60 @@
+import 'package:equatable/equatable.dart';
+
+import '../../../profile_settings/model/user.dart';
+
+class PreregistrationState extends Equatable {
+ final bool forceUpdate;
+ final bool loading;
+ final User? user;
+ final Exception? error;
+ final bool missingInformation;
+ final int numOfExtras;
+ final int extrasTotalPrice;
+ final bool termsAndConditionsAccepted;
+
+ const PreregistrationState({
+ required this.loading,
+ this.missingInformation = false,
+ this.numOfExtras = 0,
+ this.extrasTotalPrice = 0,
+ this.termsAndConditionsAccepted = false,
+ this.forceUpdate = false,
+ this.user,
+ this.error,
+ });
+
+ @override
+ List<Object?> get props => [
+ loading,
+ user,
+ error,
+ missingInformation,
+ numOfExtras,
+ extrasTotalPrice,
+ termsAndConditionsAccepted,
+ forceUpdate,
+ ];
+
+ PreregistrationState copyWith({
+ bool? loading,
+ User? user,
+ Exception? error,
+ bool? missingInformation,
+ int? numOfExtras,
+ int? extrasTotalPrice,
+ String? buttonTextStringId,
+ bool? termsAndConditionsAccepted,
+ bool forceUpdate = false,
+ }) {
+ return PreregistrationState(
+ forceUpdate: forceUpdate ? !this.forceUpdate : this.forceUpdate,
+ loading: loading ?? this.loading,
+ missingInformation: missingInformation ?? this.missingInformation,
+ user: user ?? this.user,
+ numOfExtras: numOfExtras ?? this.numOfExtras,
+ termsAndConditionsAccepted:
+ termsAndConditionsAccepted ?? this.termsAndConditionsAccepted,
+ extrasTotalPrice: extrasTotalPrice ?? this.extrasTotalPrice,
+ error: error);
+ }
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/components/card_item.dart b/comwell_key_app/lib/payment_cards/pregistration/components/card_item.dart
new file mode 100644
index 00000000..1e45fa8f
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/components/card_item.dart
@@ -0,0 +1,66 @@
+import 'package:comwell_key_app/common/components/payment_card_image.dart';
+import 'package:comwell_key_app/overview/models/payment_details.dart';
+import 'package:comwell_key_app/services/adyen/stored_payment_method.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+
+class CardItem extends StatelessWidget {
+ final StoredPaymentMethod paymentMethod;
+ final bool isSelected;
+ final VoidCallback? onClick;
+
+ const CardItem({
+ super.key,
+ required this.paymentMethod,
+ this.onClick,
+ this.isSelected = false,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ return InkWell(
+ onTap: onClick,
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ PaymentCardImage(cardType: CardType.fromString(paymentMethod.brand)),
+ const SizedBox(width: 12),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ paymentMethod.holderName,
+ style: Theme.of(context).textTheme.bodySmall,
+ ),
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ ..."**** **** **** ".characters.map((char) {
+ if (char == '*') {
+ return Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 1.0),
+ child: Container(
+ width: 5,
+ height: 5,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle, color: Colors.black),
+ ),
+ );
+ }
+ return const SizedBox(width: 8);
+ }),
+ Text(
+ paymentMethod.lastFour,
+ style: Theme.of(context).textTheme.bodyMedium,
+ )
+ ],
+ ),
+ ],
+ ),
+ const Expanded(child: SizedBox()),
+ if (isSelected) SvgPicture.asset("assets/icons/ic_checkmark.svg")
+ ],
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/components/clickable_card_item.dart b/comwell_key_app/lib/payment_cards/pregistration/components/clickable_card_item.dart
new file mode 100644
index 00000000..4c148ccc
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/components/clickable_card_item.dart
@@ -0,0 +1,31 @@
+import 'package:comwell_key_app/payment_cards/pregistration/components/card_item.dart';
+import 'package:comwell_key_app/services/adyen/stored_payment_method.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:flutter/material.dart';
+
+class ClickableCardItem extends StatelessWidget {
+ final StoredPaymentMethod paymentMethod;
+ final VoidCallback onClick;
+ final bool isSelected;
+
+ const ClickableCardItem({
+ super.key,
+ required this.paymentMethod,
+ required this.onClick,
+ this.isSelected = false,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ return InkWell(
+ onTap: onClick,
+ child: Container(
+ decoration: BoxDecoration(
+ border: Border.all(color: colorDivider),
+ ),
+ padding: const EdgeInsets.all(12),
+ child: CardItem(paymentMethod: paymentMethod, isSelected: isSelected),
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/components/information_card.dart b/comwell_key_app/lib/payment_cards/pregistration/components/information_card.dart
new file mode 100644
index 00000000..3cfbde80
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/components/information_card.dart
@@ -0,0 +1,39 @@
+import 'package:comwell_key_app/themes/dark_theme.dart';
+import 'package:flutter/material.dart';
+
+class InformationCard extends StatelessWidget {
+ final String title;
+ final VoidCallback onEditClick;
+ final Widget child;
+
+ const InformationCard({
+ super.key,
+ required this.title,
+ required this.onEditClick,
+ required this.child,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ padding: const EdgeInsets.all(12),
+ decoration: BoxDecoration(
+ color: sandColor[20],
+ borderRadius: const BorderRadius.all(Radius.circular(10))),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(title),
+ TextButton(onPressed: onEditClick, child: const Text("Rediger"))
+ ],
+ ),
+ const SizedBox(height: 40),
+ child
+ ],
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/models/add_card_payment_method.dart b/comwell_key_app/lib/payment_cards/pregistration/models/add_card_payment_method.dart
new file mode 100644
index 00000000..504f5c6d
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/models/add_card_payment_method.dart
@@ -0,0 +1,21 @@
+import 'package:comwell_key_app/utils/json.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+part '../../../.generated/payment_cards/pregistration/models/add_card_payment_method.g.dart';
+
+enum CardType { visa, mc, amex }
+
+@JsonSerializable()
+class AddCardPaymentMethod {
+ final Iterable<CardType> brands;
+ final String name;
+ final String type;
+
+ AddCardPaymentMethod({
+ required this.brands,
+ required this.name,
+ required this.type,
+ });
+
+ Json toJson() => _$AddCardPaymentMethodToJson(this);
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/pages/prereg_confirmation_page.dart b/comwell_key_app/lib/payment_cards/pregistration/pages/prereg_confirmation_page.dart
new file mode 100644
index 00000000..8ef4a978
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/pages/prereg_confirmation_page.dart
@@ -0,0 +1,92 @@
+import 'package:comwell_key_app/payment_cards/pregistration/bloc/preregistration_cubit.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/components/information_card.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class PreregConfirmationPage extends StatelessWidget {
+ const PreregConfirmationPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final cubit = context.read<PreregistrationCubit>();
+ final state = cubit.state;
+ final user = state.user!;
+
+ String extrasTitleText;
+ if (state.numOfExtras == 1) {
+ extrasTitleText =
+ "preregistration_confirmation_extras_card_title_singular".tr();
+ } else {
+ extrasTitleText = "preregistration_confirmation_extras_card_title_plural"
+ .tr(args: [state.numOfExtras.toString()]);
+ }
+
+ return ListView(
+ children: [
+ const SizedBox(height: 40),
+ Text("preregistration_confirmation_title".tr(),
+ style: Theme.of(context).textTheme.headlineLarge),
+ const SizedBox(height: 40),
+ InformationCard(
+ title: "preregistration_confirmation_profile_card_title".tr(),
+ onEditClick: cubit.onEditProfileClicked,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ "${user.firstName} ${user.lastName}",
+ style: Theme.of(context).textTheme.bodyMedium,
+ ),
+ Text(
+ user.email,
+ style: Theme.of(context).textTheme.bodyMedium,
+ ),
+ Text(
+ "${user.addressCountry} ${user.phoneNumber}",
+ style: Theme.of(context).textTheme.bodyMedium,
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(height: 12),
+ InformationCard(
+ title: "preregistration_confirmation_address_card_title".tr(),
+ onEditClick: cubit.onEditAddressClicked,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ user.address?.street ?? "",
+ style: Theme.of(context).textTheme.bodyMedium,
+ ),
+ Text(
+ "${user.address?.zipCode}, ${user.address?.city}, ${user.address?.country}",
+ style: Theme.of(context).textTheme.bodyMedium,
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(height: 12),
+ InformationCard(
+ title: extrasTitleText,
+ onEditClick: cubit.onEditExtrasClicked,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ "${state.extrasTotalPrice} kr.",
+ style: Theme.of(context).textTheme.bodySmall,
+ ),
+ Text(
+ "preregistration_confirmation_extras_card_subtitle".tr(),
+ style: Theme.of(context).textTheme.bodyMedium,
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(height: 40),
+ ],
+ );
+ }
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/pages/prereg_information_page.dart b/comwell_key_app/lib/payment_cards/pregistration/pages/prereg_information_page.dart
new file mode 100644
index 00000000..58cacc4c
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/pages/prereg_information_page.dart
@@ -0,0 +1,82 @@
+import 'package:comwell_key_app/common/components/comwell_text_field.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/bloc/preregistration_cubit.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/bloc/preregistration_state.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class PreregInformationPage extends StatelessWidget {
+ const PreregInformationPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return BlocBuilder<PreregistrationCubit, PreregistrationState>(
+ builder: (context, state) {
+ final cubit = context.read<PreregistrationCubit>();
+ final state = cubit.state;
+ if (state.loading) {
+ return const Center(child: CircularProgressIndicator());
+ }
+ if (state.error != null) {
+ return const Center(child: Text("Error"));
+ }
+ final addressErrorMessage =
+ !cubit.isAddressValid && state.missingInformation
+ ? "generic_information_required".tr()
+ : null;
+ final postalCodeErrorMessage =
+ !cubit.isPostalCodeValid && state.missingInformation
+ ? "generic_information_required".tr()
+ : null;
+ final cityErrorMessage = !cubit.isCityValid && state.missingInformation
+ ? "generic_information_required".tr()
+ : null;
+ final countryErrorMessage =
+ !cubit.isCountryValid && state.missingInformation
+ ? "generic_information_required".tr()
+ : null;
+ return ListView(
+ key: const PageStorageKey("information_form"),
+ children: [
+ const SizedBox(height: 40),
+ Text("preregistration_address_title".tr(),
+ style: Theme.of(context).textTheme.headlineLarge),
+ const SizedBox(height: 18),
+ Text("preregistration_address_subtitle".tr(),
+ style: Theme.of(context).textTheme.bodySmall),
+ const SizedBox(height: 40),
+ ComwellTextField(
+ key: const Key("address"),
+ fieldName: "preregistration_address_label_address".tr(),
+ initialValue: "",
+ readOnly: false,
+ errorMessage: addressErrorMessage,
+ controller: cubit.addressTextController),
+ const SizedBox(height: 12),
+ ComwellTextField(
+ fieldName: "preregistration_address_label_postal_code".tr(),
+ initialValue: "",
+ textInputType: TextInputType.number,
+ errorMessage: postalCodeErrorMessage,
+ readOnly: false,
+ controller: cubit.postalCodeTextController),
+ const SizedBox(height: 12),
+ ComwellTextField(
+ fieldName: "preregistration_address_label_city".tr(),
+ initialValue: "",
+ readOnly: false,
+ errorMessage: cityErrorMessage,
+ controller: cubit.cityTextController),
+ const SizedBox(height: 12),
+ ComwellTextField(
+ fieldName: "preregistration_address_label_country".tr(),
+ initialValue: "",
+ errorMessage: countryErrorMessage,
+ readOnly: false,
+ controller: cubit.countryTextController),
+ const SizedBox(height: 100),
+ ],
+ );
+ });
+ }
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/pregistration_repository.dart b/comwell_key_app/lib/payment_cards/pregistration/pregistration_repository.dart
new file mode 100644
index 00000000..48c8af10
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/pregistration_repository.dart
@@ -0,0 +1,121 @@
+import 'package:adyen_checkout/adyen_checkout.dart';
+import 'package:comwell_key_app/check_out/models/payment_configurations.dart';
+import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
+import 'package:comwell_key_app/services/adyen/stored_payment_method.dart';
+import 'package:comwell_key_app/services/api.dart';
+import 'package:comwell_key_app/utils/locator.dart';
+
+class PreregistrationRepository {
+ final Api _api = Api();
+ final ProfileSettingsRepository profileSettingsRepository =
+ locator<ProfileSettingsRepository>();
+
+ PreregistrationRepository();
+
+ Future<PaymentConfigurations> sessionCheckout(
+ Amount amount,
+ String hotelCode,
+ ) async {
+ final response = await _api.createAdyenSession(amount, hotelCode);
+ final clientKey = response["clientKey"] as String;
+ final sessionResponse = response["sessionResponse"];
+ final id = sessionResponse["id"] as String;
+ final sessionData = sessionResponse["sessionData"] as String;
+ final session = await AdyenCheckout.session.create(
+ sessionId: id,
+ sessionData: sessionData,
+ configuration: dropInConfiguration(amount, clientKey));
+ return PaymentConfigurations(
+ sessionCheckout: session,
+ googlePayConfiguration: _getGooglePayComponentConfig(clientKey),
+ dropInConfiguration: dropInConfiguration(amount, clientKey),
+ cardComponentConfiguration:
+ cardComponentConfiguration(amount, clientKey),
+ applePayConfiguration:
+ _applePayComponentConfiguration(clientKey, amount));
+ }
+
+ CardComponentConfiguration cardComponentConfiguration(
+ Amount amount,
+ String clientKey,
+ ) {
+ return CardComponentConfiguration(
+ environment: Environment.test,
+ amount: amount,
+ cardConfiguration: const CardConfiguration(showStorePaymentField: true),
+ clientKey: clientKey,
+ countryCode: "DK",
+ );
+ }
+
+ DropInConfiguration dropInConfiguration(Amount amount, String clientKey) {
+ // TODO: missing endpoint to retrieve client key
+ return DropInConfiguration(
+ environment: Environment.test,
+ clientKey: clientKey,
+ countryCode: "DK",
+ skipListWhenSinglePaymentMethod: true,
+ googlePayConfiguration: _googlePayConfiguration,
+ applePayConfiguration: _getApplePlayConfig(amount),
+ cardConfiguration: const CardConfiguration(showStorePaymentField: true),
+ paymentMethodNames: {
+ "scheme": "Credit card",
+ },
+ );
+ }
+
+ GooglePayConfiguration get _googlePayConfiguration =>
+ const GooglePayConfiguration(
+ googlePayEnvironment: GooglePayEnvironment.test,
+ );
+
+ GooglePayComponentConfiguration _getGooglePayComponentConfig(
+ String clientKey,
+ ) {
+ return GooglePayComponentConfiguration(
+ environment: Environment.test,
+ countryCode: "DK",
+ clientKey: clientKey,
+ googlePayConfiguration: _googlePayConfiguration,
+ );
+ }
+
+ ApplePayComponentConfiguration _applePayComponentConfiguration(
+ String clientKey,
+ Amount amount,
+ ) {
+ return ApplePayComponentConfiguration(
+ environment: Environment.test,
+ countryCode: "DK",
+ clientKey: clientKey,
+ applePayConfiguration: _getApplePlayConfig(amount),
+ );
+ }
+
+ ApplePayConfiguration _getApplePlayConfig(Amount amount) {
+ return ApplePayConfiguration(
+ merchantId: "merchant.ComwellHotelsECOM",
+ merchantName: "Comwell",
+ allowOnboarding: true,
+ allowShippingContactEditing: true,
+ applePaySummaryItems: [
+ ApplePaySummaryItem(
+ label: "Total",
+ amount: Amount(value: amount.value, currency: amount.currency),
+ type: ApplePaySummaryItemType.definite)
+ ]);
+ }
+
+ static final Iterable<StoredPaymentMethod> mockStoredPaymentData = [
+ 1,
+ 2,
+ 3,
+ 4
+ ].map((i) => StoredPaymentMethod(
+ expiryMonth: "12",
+ expiryYear: "2035",
+ holderName: "holder name",
+ id: "id $i",
+ lastFour: "$i$i$i$i",
+ brand: "visa"));
+}
diff --git a/comwell_key_app/lib/payment_cards/pregistration/preregistration_flow.dart b/comwell_key_app/lib/payment_cards/pregistration/preregistration_flow.dart
new file mode 100644
index 00000000..f7e2a51c
--- /dev/null
+++ b/comwell_key_app/lib/payment_cards/pregistration/preregistration_flow.dart
@@ -0,0 +1,127 @@
+import 'package:comwell_key_app/payment_cards/pregistration/bloc/preregistration_state.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/bloc/preregistration_cubit.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/pages/prereg_confirmation_page.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/pages/prereg_information_page.dart';
+import 'package:comwell_key_app/themes/dark_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:go_router/go_router.dart';
+
+enum PreregistrationPage {
+ information,
+ confirmation;
+
+ static PreregistrationPage fromIndex(int index) {
+ return PreregistrationPage.values[index];
+ }
+
+ static Iterable<Widget> getPages(Key key) {
+ return PreregistrationPage.values.map((page) {
+ switch (page) {
+ case PreregistrationPage.information:
+ return PreregInformationPage(key: key);
+ case PreregistrationPage.confirmation:
+ return PreregConfirmationPage(key: key);
+ }
+ });
+ }
+}
+
+class PreregistrationFlow extends StatefulWidget {
+ const PreregistrationFlow({super.key});
+
+ @override
+ State<PreregistrationFlow> createState() => _PreregistrationFlowState();
+}
+
+class _PreregistrationFlowState extends State<PreregistrationFlow> {
+ @override
+ Widget build(BuildContext context) {
+ return BlocProvider(
+ create: (context) => PreregistrationCubit()..init(),
+ child: BlocConsumer<PreregistrationCubit, PreregistrationState>(
+ listener: (context, state) {},
+ builder: (context, state) {
+ final cubit = context.read<PreregistrationCubit>();
+ return Scaffold(
+ backgroundColor: colorBackground,
+ appBar: AppBar(
+ backgroundColor: colorSecondary,
+ shape: const RoundedRectangleBorder(
+ borderRadius:
+ BorderRadius.vertical(bottom: Radius.circular(24))),
+ toolbarOpacity: 1.0,
+ leading: BackButton(
+ color: Colors.black,
+ onPressed: () {
+ if (!cubit.onBackClicked()) {
+ context.pop();
+ }
+ },
+ ),
+ ),
+ bottomNavigationBar: Builder(builder: (context) {
+ if (state.loading) return const SizedBox();
+ return Column(
+ // BOTTOM NAVIGATION
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ const Divider(
+ color: Colors.black12,
+ height: 0,
+ ),
+ Row(
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: ElevatedButton(
+ onPressed: cubit.canContinue
+ ? cubit.onContinueClicked
+ : null,
+ style: ButtonStyle(
+ backgroundColor:
+ WidgetStateProperty.resolveWith((states) {
+ if (states.contains(WidgetState.disabled)) {
+ return Colors.grey;
+ }
+ return const Color(0xffAA8D65);
+ }),
+ foregroundColor:
+ const WidgetStatePropertyAll(Colors.white)),
+ child: Padding(
+ padding:
+ const EdgeInsets.symmetric(vertical: 16.0),
+ child: Text(cubit.buttonText),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ );
+ }),
+ body: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 12.0),
+ child: Builder(
+ builder: (context) {
+ if (state.loading) {
+ return const Center(child: CircularProgressIndicator());
+ }
+ return PageView(
+ key: const PageStorageKey("prereg_flow"),
+ physics: const NeverScrollableScrollPhysics(),
+ controller: cubit.pageController,
+ children:
+ PreregistrationPage.getPages(ValueKey(state)).toList(),
+ );
+ },
+ ),
+ ),
+ );
+ },
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/pregistration/bloc/preregistration_cubit.dart b/comwell_key_app/lib/pregistration/bloc/preregistration_cubit.dart
deleted file mode 100644
index 82daba1f..00000000
--- a/comwell_key_app/lib/pregistration/bloc/preregistration_cubit.dart
+++ /dev/null
@@ -1,217 +0,0 @@
-import 'package:adyen_checkout/src/common/model/payment_result.dart';
-import 'package:bloc/bloc.dart';
-import 'package:comwell_key_app/pregistration/bloc/preregistration_state.dart';
-import 'package:comwell_key_app/pregistration/preregistration_flow.dart';
-import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
-import 'package:comwell_key_app/tracking/comwell_tracking.dart';
-import 'package:comwell_key_app/tracking/models/analytics_event_item.dart';
-import 'package:comwell_key_app/utils/locator.dart';
-import 'package:easy_localization/easy_localization.dart';
-import 'package:flutter/cupertino.dart';
-
-class PreregistrationCubit extends Cubit<PreregistrationState> {
- final _profileSettingsRepository = locator<ProfileSettingsRepository>();
- final _tracking = locator<ComwellTracking>();
-
- final pageController = PageController();
- final addressTextController = TextEditingController();
- final postalCodeTextController = TextEditingController();
- final cityTextController = TextEditingController();
- final countryTextController = TextEditingController();
-
- PreregistrationPage get currentPage =>
- PreregistrationPage.fromIndex(pageController.page?.toInt() ?? 0);
- bool _isAnimating = false;
-
- PreregistrationCubit() : super(const PreregistrationState(loading: false)) {
- _tracking.trackScreenView(
- "Pre-registration - Betalingskort",
- "/pre-registration/betalingskort",
- );
- }
-
- void init() async {
- emit(state.copyWith(loading: true, error: null));
- try {
- final user = await _profileSettingsRepository.fetchProfileSettings();
- if (user != null) {
- addressTextController.text = user.address?.street ?? "";
- postalCodeTextController.text = user.address?.zipCode ?? "";
- cityTextController.text = user.address?.city ?? "";
- countryTextController.text = user.address?.country ?? "";
- } else {
- emit(state.copyWith(
- loading: false, error: Exception("Der skete en fejl")));
- }
- } on Exception catch (e) {
- emit(state.copyWith(error: e));
- }
- }
-
- void onInformationContinueClicked() {
- if (isAddressValid && isPostalCodeValid && isCityValid && isCountryValid) {
- _navigateNextPage();
- } else {
- emit(state.copyWith(missingInformation: true));
- }
- }
-
- void onContinueClicked() {
- if (_isAnimating) return;
- switch (currentPage) {
- case PreregistrationPage.information:
- onInformationContinueClicked();
- break;
- case PreregistrationPage.confirmation:
- _onConfirmPressed();
- break;
- }
- }
-
- void addToCart() {
- final analyticsEventItem = AnalyticsEventItem(
- hotelName: "Comwell",
- currency: "DKK",
- value: 500,
- placement: "placement",
- items: ["items"],
- itemId: "itemId",
- itemName: "itemName",
- price: 200,
- quantity: 200);
- _tracking.trackAddToCart(analyticsEventItem);
- }
-
- void removeToCard() {
- final analyticsEventItem = AnalyticsEventItem(
- hotelName: "Comwell",
- currency: "DKK",
- value: 500,
- placement: "placement",
- items: ["items"],
- itemId: "itemId",
- itemName: "itemName",
- price: 200,
- quantity: 200);
- _tracking.trackRemoveFromCart(analyticsEventItem);
- }
-
- void _onConfirmPressed() async {
- final analyticsEventItem = AnalyticsEventItem(
- hotelName: "Comwell",
- currency: "DKK",
- value: 500,
- placement: "placement",
- items: ["items"],
- itemId: "itemId",
- itemName: "itemName",
- price: 200,
- quantity: 200);
- _tracking.trackBeginCheckout(analyticsEventItem);
- emit(state.copyWith(loading: true));
- Future.delayed(const Duration(seconds: 3), () {
- emit(state.copyWith(loading: false));
- });
- }
-
- void onEditProfileClicked() {
- // Not implemented
- }
-
- void onEditAddressClicked() {
- _navigateTo(PreregistrationPage.information);
- }
-
- void onEditExtrasClicked() {
- // Not implemented
- }
-
- bool onBackClicked() {
- if (_isAnimating) return true;
- final hasPage = pageController.page != null;
- if (hasPage && pageController.page! >= 1.0) {
- _navigatePreviousPage();
- return true;
- }
- return false;
- }
-
- void _navigateTo(PreregistrationPage page) async {
- if (_isAnimating) return;
- _isAnimating = true;
- await pageController.animateToPage(page.index,
- duration: const Duration(milliseconds: 500),
- curve: Curves.fastOutSlowIn);
- emit(state.copyWith(forceUpdate: true));
- _isAnimating = false;
- }
-
- void _navigateNextPage() async {
- if (_isAnimating) return;
- _isAnimating = true;
- await pageController.nextPage(
- duration: const Duration(milliseconds: 500),
- curve: Curves.fastOutSlowIn);
- emit(state.copyWith(forceUpdate: true));
- _isAnimating = false;
- }
-
- void _navigatePreviousPage() async {
- if (_isAnimating) return;
- _isAnimating = true;
- await pageController.previousPage(
- duration: const Duration(milliseconds: 500),
- curve: Curves.fastOutSlowIn);
- emit(state.copyWith(forceUpdate: true));
- _isAnimating = false;
- }
-
- @override
- Future<void> close() {
- addressTextController.dispose();
- postalCodeTextController.dispose();
- cityTextController.dispose();
- countryTextController.dispose();
- pageController.dispose();
- return super.close();
- }
-
- bool get isAddressValid => addressTextController.text.isNotEmpty;
-
- bool get isPostalCodeValid =>
- postalCodeTextController.text.isNotEmpty &&
- postalCodeTextController.text.length <= 4;
-
- bool get isCityValid => cityTextController.text.isNotEmpty;
-
- bool get isCountryValid => countryTextController.text.isNotEmpty;
-
- bool get canContinue {
- int page = pageController.page?.ceil() ?? 0;
- final preregPage = PreregistrationPage.fromIndex(page);
- switch (preregPage) {
- case PreregistrationPage.information:
- return isAddressValid &&
- isPostalCodeValid &&
- isCityValid &&
- isCityValid;
- case PreregistrationPage.confirmation:
- return true;
- }
- }
-
- String get buttonText {
- int page = pageController.page?.ceil() ?? 0;
- final preregPage = PreregistrationPage.fromIndex(page);
- switch (preregPage) {
- case PreregistrationPage.information:
- return "generic_continue".tr();
- case PreregistrationPage.confirmation:
- return "generic_confirm".tr();
- }
- }
-
- void onTermsAndConditionsToggled(bool toggle) {
- emit(state.copyWith(termsAndConditionsAccepted: toggle));
- }
-}
diff --git a/comwell_key_app/lib/pregistration/bloc/preregistration_state.dart b/comwell_key_app/lib/pregistration/bloc/preregistration_state.dart
deleted file mode 100644
index f6088e0e..00000000
--- a/comwell_key_app/lib/pregistration/bloc/preregistration_state.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-import 'package:equatable/equatable.dart';
-
-import '../../profile_settings/model/user.dart';
-
-class PreregistrationState extends Equatable {
- final bool forceUpdate;
- final bool loading;
- final User? user;
- final Exception? error;
- final bool missingInformation;
- final int numOfExtras;
- final int extrasTotalPrice;
- final bool termsAndConditionsAccepted;
-
- const PreregistrationState({
- required this.loading,
- this.missingInformation = false,
- this.numOfExtras = 0,
- this.extrasTotalPrice = 0,
- this.termsAndConditionsAccepted = false,
- this.forceUpdate = false,
- this.user,
- this.error,
- });
-
- @override
- List<Object?> get props => [
- loading,
- user,
- error,
- missingInformation,
- numOfExtras,
- extrasTotalPrice,
- termsAndConditionsAccepted,
- forceUpdate,
- ];
-
- PreregistrationState copyWith({
- bool? loading,
- User? user,
- Exception? error,
- bool? missingInformation,
- int? numOfExtras,
- int? extrasTotalPrice,
- String? buttonTextStringId,
- bool? termsAndConditionsAccepted,
- bool forceUpdate = false,
- }) {
- return PreregistrationState(
- forceUpdate: forceUpdate ? !this.forceUpdate : this.forceUpdate,
- loading: loading ?? this.loading,
- missingInformation: missingInformation ?? this.missingInformation,
- user: user ?? this.user,
- numOfExtras: numOfExtras ?? this.numOfExtras,
- termsAndConditionsAccepted:
- termsAndConditionsAccepted ?? this.termsAndConditionsAccepted,
- extrasTotalPrice: extrasTotalPrice ?? this.extrasTotalPrice,
- error: error);
- }
-}
diff --git a/comwell_key_app/lib/pregistration/components/card_item.dart b/comwell_key_app/lib/pregistration/components/card_item.dart
deleted file mode 100644
index 1e45fa8f..00000000
--- a/comwell_key_app/lib/pregistration/components/card_item.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-import 'package:comwell_key_app/common/components/payment_card_image.dart';
-import 'package:comwell_key_app/overview/models/payment_details.dart';
-import 'package:comwell_key_app/services/adyen/stored_payment_method.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_svg/flutter_svg.dart';
-
-class CardItem extends StatelessWidget {
- final StoredPaymentMethod paymentMethod;
- final bool isSelected;
- final VoidCallback? onClick;
-
- const CardItem({
- super.key,
- required this.paymentMethod,
- this.onClick,
- this.isSelected = false,
- });
-
- @override
- Widget build(BuildContext context) {
- return InkWell(
- onTap: onClick,
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- PaymentCardImage(cardType: CardType.fromString(paymentMethod.brand)),
- const SizedBox(width: 12),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- paymentMethod.holderName,
- style: Theme.of(context).textTheme.bodySmall,
- ),
- Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- ..."**** **** **** ".characters.map((char) {
- if (char == '*') {
- return Padding(
- padding: const EdgeInsets.symmetric(horizontal: 1.0),
- child: Container(
- width: 5,
- height: 5,
- decoration: const BoxDecoration(
- shape: BoxShape.circle, color: Colors.black),
- ),
- );
- }
- return const SizedBox(width: 8);
- }),
- Text(
- paymentMethod.lastFour,
- style: Theme.of(context).textTheme.bodyMedium,
- )
- ],
- ),
- ],
- ),
- const Expanded(child: SizedBox()),
- if (isSelected) SvgPicture.asset("assets/icons/ic_checkmark.svg")
- ],
- ),
- );
- }
-}
diff --git a/comwell_key_app/lib/pregistration/components/clickable_card_item.dart b/comwell_key_app/lib/pregistration/components/clickable_card_item.dart
deleted file mode 100644
index 6e6663ce..00000000
--- a/comwell_key_app/lib/pregistration/components/clickable_card_item.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-import 'package:comwell_key_app/pregistration/components/card_item.dart';
-import 'package:comwell_key_app/services/adyen/stored_payment_method.dart';
-import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:flutter/material.dart';
-
-class ClickableCardItem extends StatelessWidget {
- final StoredPaymentMethod paymentMethod;
- final VoidCallback onClick;
- final bool isSelected;
-
- const ClickableCardItem({
- super.key,
- required this.paymentMethod,
- required this.onClick,
- this.isSelected = false,
- });
-
- @override
- Widget build(BuildContext context) {
- return InkWell(
- onTap: onClick,
- child: Container(
- decoration: BoxDecoration(
- border: Border.all(color: colorDivider),
- ),
- padding: const EdgeInsets.all(12),
- child: CardItem(paymentMethod: paymentMethod, isSelected: isSelected),
- ),
- );
- }
-}
diff --git a/comwell_key_app/lib/pregistration/components/information_card.dart b/comwell_key_app/lib/pregistration/components/information_card.dart
deleted file mode 100644
index 3cfbde80..00000000
--- a/comwell_key_app/lib/pregistration/components/information_card.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-import 'package:comwell_key_app/themes/dark_theme.dart';
-import 'package:flutter/material.dart';
-
-class InformationCard extends StatelessWidget {
- final String title;
- final VoidCallback onEditClick;
- final Widget child;
-
- const InformationCard({
- super.key,
- required this.title,
- required this.onEditClick,
- required this.child,
- });
-
- @override
- Widget build(BuildContext context) {
- return Container(
- padding: const EdgeInsets.all(12),
- decoration: BoxDecoration(
- color: sandColor[20],
- borderRadius: const BorderRadius.all(Radius.circular(10))),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Text(title),
- TextButton(onPressed: onEditClick, child: const Text("Rediger"))
- ],
- ),
- const SizedBox(height: 40),
- child
- ],
- ),
- );
- }
-}
diff --git a/comwell_key_app/lib/pregistration/models/add_card_payment_method.dart b/comwell_key_app/lib/pregistration/models/add_card_payment_method.dart
deleted file mode 100644
index 6c71825f..00000000
--- a/comwell_key_app/lib/pregistration/models/add_card_payment_method.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-import 'package:comwell_key_app/utils/json.dart';
-import 'package:json_annotation/json_annotation.dart';
-
-part '../../.generated/pregistration/models/add_card_payment_method.g.dart';
-
-enum CardType {
- visa,
- mc,
- amex
-}
-
-@JsonSerializable()
-class AddCardPaymentMethod {
- final Iterable<CardType> brands;
- final String name;
- final String type;
-
- AddCardPaymentMethod({
- required this.brands,
- required this.name,
- required this.type,
- });
-
- Json toJson() => _$AddCardPaymentMethodToJson(this);
-}
\ No newline at end of file
diff --git a/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart b/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart
deleted file mode 100644
index eb7fdf1f..00000000
--- a/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart
+++ /dev/null
@@ -1,92 +0,0 @@
-import 'package:comwell_key_app/pregistration/bloc/preregistration_cubit.dart';
-import 'package:comwell_key_app/pregistration/components/information_card.dart';
-import 'package:easy_localization/easy_localization.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-
-class PreregConfirmationPage extends StatelessWidget {
- const PreregConfirmationPage({super.key});
-
- @override
- Widget build(BuildContext context) {
- final cubit = context.read<PreregistrationCubit>();
- final state = cubit.state;
- final user = state.user!;
-
- String extrasTitleText;
- if (state.numOfExtras == 1) {
- extrasTitleText =
- "preregistration_confirmation_extras_card_title_singular".tr();
- } else {
- extrasTitleText = "preregistration_confirmation_extras_card_title_plural"
- .tr(args: [state.numOfExtras.toString()]);
- }
-
- return ListView(
- children: [
- const SizedBox(height: 40),
- Text("preregistration_confirmation_title".tr(),
- style: Theme.of(context).textTheme.headlineLarge),
- const SizedBox(height: 40),
- InformationCard(
- title: "preregistration_confirmation_profile_card_title".tr(),
- onEditClick: cubit.onEditProfileClicked,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- "${user.firstName} ${user.lastName}",
- style: Theme.of(context).textTheme.bodyMedium,
- ),
- Text(
- user.email,
- style: Theme.of(context).textTheme.bodyMedium,
- ),
- Text(
- "${user.countryCode} ${user.phone}",
- style: Theme.of(context).textTheme.bodyMedium,
- ),
- ],
- ),
- ),
- const SizedBox(height: 12),
- InformationCard(
- title: "preregistration_confirmation_address_card_title".tr(),
- onEditClick: cubit.onEditAddressClicked,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- user.address?.street ?? "",
- style: Theme.of(context).textTheme.bodyMedium,
- ),
- Text(
- "${user.address?.zipCode}, ${user.address?.city}, ${user.address?.country}",
- style: Theme.of(context).textTheme.bodyMedium,
- ),
- ],
- ),
- ),
- const SizedBox(height: 12),
- InformationCard(
- title: extrasTitleText,
- onEditClick: cubit.onEditExtrasClicked,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- "${state.extrasTotalPrice} kr.",
- style: Theme.of(context).textTheme.bodySmall,
- ),
- Text(
- "preregistration_confirmation_extras_card_subtitle".tr(),
- style: Theme.of(context).textTheme.bodyMedium,
- ),
- ],
- ),
- ),
- const SizedBox(height: 40),
- ],
- );
- }
-}
diff --git a/comwell_key_app/lib/pregistration/pages/prereg_information_page.dart b/comwell_key_app/lib/pregistration/pages/prereg_information_page.dart
deleted file mode 100644
index 3f9c18cd..00000000
--- a/comwell_key_app/lib/pregistration/pages/prereg_information_page.dart
+++ /dev/null
@@ -1,83 +0,0 @@
-import 'package:comwell_key_app/common/components/comwell_text_field.dart';
-import 'package:comwell_key_app/pregistration/bloc/preregistration_cubit.dart';
-import 'package:comwell_key_app/pregistration/bloc/preregistration_state.dart';
-import 'package:easy_localization/easy_localization.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-
-class PreregInformationPage extends StatelessWidget {
- const PreregInformationPage({super.key});
-
- @override
- Widget build(BuildContext context) {
- return BlocBuilder<PreregistrationCubit, PreregistrationState>(
- builder: (context, state) {
- final cubit = context.read<PreregistrationCubit>();
- final state = cubit.state;
- if (state.loading) {
- return const Center(child: CircularProgressIndicator());
- }
- if (state.error != null) {
- return const Center(child: Text("Error"));
- }
- final addressErrorMessage =
- !cubit.isAddressValid && state.missingInformation
- ? "generic_information_required".tr()
- : null;
- final postalCodeErrorMessage =
- !cubit.isPostalCodeValid && state.missingInformation
- ? "generic_information_required".tr()
- : null;
- final cityErrorMessage = !cubit.isCityValid && state.missingInformation
- ? "generic_information_required".tr()
- : null;
- final countryErrorMessage =
- !cubit.isCountryValid && state.missingInformation
- ? "generic_information_required".tr()
- : null;
- return ListView(
- key: const PageStorageKey("information_form"),
- children: [
- const SizedBox(height: 40),
- Text("preregistration_address_title".tr(),
- style: Theme.of(context).textTheme.headlineLarge),
- const SizedBox(height: 18),
- Text("preregistration_address_subtitle".tr(),
- style: Theme.of(context).textTheme.bodySmall),
- const SizedBox(height: 40),
- ComwellTextField(
- key: const Key("address"),
- fieldName: "preregistration_address_label_address".tr(),
- initialValue: "",
- readOnly: false,
- errorMessage: addressErrorMessage,
- controller: cubit.addressTextController),
- const SizedBox(height: 12),
- ComwellTextField(
- fieldName: "preregistration_address_label_postal_code".tr(),
- initialValue: "",
- textInputType: TextInputType.number,
- errorMessage: postalCodeErrorMessage,
- readOnly: false,
- controller: cubit.postalCodeTextController),
- const SizedBox(height: 12),
- ComwellTextField(
- fieldName: "preregistration_address_label_city".tr(),
- initialValue: "",
- readOnly: false,
- errorMessage: cityErrorMessage,
- controller: cubit.cityTextController),
- const SizedBox(height: 12),
- ComwellTextField(
- fieldName: "preregistration_address_label_country".tr(),
- initialValue: "",
- errorMessage: countryErrorMessage,
- readOnly: false,
- controller: cubit.countryTextController),
- const SizedBox(height: 100),
- ],
- );
- }
- );
- }
-}
diff --git a/comwell_key_app/lib/pregistration/pregistration_repository.dart b/comwell_key_app/lib/pregistration/pregistration_repository.dart
deleted file mode 100644
index 48c8af10..00000000
--- a/comwell_key_app/lib/pregistration/pregistration_repository.dart
+++ /dev/null
@@ -1,121 +0,0 @@
-import 'package:adyen_checkout/adyen_checkout.dart';
-import 'package:comwell_key_app/check_out/models/payment_configurations.dart';
-import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
-import 'package:comwell_key_app/services/adyen/stored_payment_method.dart';
-import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/utils/locator.dart';
-
-class PreregistrationRepository {
- final Api _api = Api();
- final ProfileSettingsRepository profileSettingsRepository =
- locator<ProfileSettingsRepository>();
-
- PreregistrationRepository();
-
- Future<PaymentConfigurations> sessionCheckout(
- Amount amount,
- String hotelCode,
- ) async {
- final response = await _api.createAdyenSession(amount, hotelCode);
- final clientKey = response["clientKey"] as String;
- final sessionResponse = response["sessionResponse"];
- final id = sessionResponse["id"] as String;
- final sessionData = sessionResponse["sessionData"] as String;
- final session = await AdyenCheckout.session.create(
- sessionId: id,
- sessionData: sessionData,
- configuration: dropInConfiguration(amount, clientKey));
- return PaymentConfigurations(
- sessionCheckout: session,
- googlePayConfiguration: _getGooglePayComponentConfig(clientKey),
- dropInConfiguration: dropInConfiguration(amount, clientKey),
- cardComponentConfiguration:
- cardComponentConfiguration(amount, clientKey),
- applePayConfiguration:
- _applePayComponentConfiguration(clientKey, amount));
- }
-
- CardComponentConfiguration cardComponentConfiguration(
- Amount amount,
- String clientKey,
- ) {
- return CardComponentConfiguration(
- environment: Environment.test,
- amount: amount,
- cardConfiguration: const CardConfiguration(showStorePaymentField: true),
- clientKey: clientKey,
- countryCode: "DK",
- );
- }
-
- DropInConfiguration dropInConfiguration(Amount amount, String clientKey) {
- // TODO: missing endpoint to retrieve client key
- return DropInConfiguration(
- environment: Environment.test,
- clientKey: clientKey,
- countryCode: "DK",
- skipListWhenSinglePaymentMethod: true,
- googlePayConfiguration: _googlePayConfiguration,
- applePayConfiguration: _getApplePlayConfig(amount),
- cardConfiguration: const CardConfiguration(showStorePaymentField: true),
- paymentMethodNames: {
- "scheme": "Credit card",
- },
- );
- }
-
- GooglePayConfiguration get _googlePayConfiguration =>
- const GooglePayConfiguration(
- googlePayEnvironment: GooglePayEnvironment.test,
- );
-
- GooglePayComponentConfiguration _getGooglePayComponentConfig(
- String clientKey,
- ) {
- return GooglePayComponentConfiguration(
- environment: Environment.test,
- countryCode: "DK",
- clientKey: clientKey,
- googlePayConfiguration: _googlePayConfiguration,
- );
- }
-
- ApplePayComponentConfiguration _applePayComponentConfiguration(
- String clientKey,
- Amount amount,
- ) {
- return ApplePayComponentConfiguration(
- environment: Environment.test,
- countryCode: "DK",
- clientKey: clientKey,
- applePayConfiguration: _getApplePlayConfig(amount),
- );
- }
-
- ApplePayConfiguration _getApplePlayConfig(Amount amount) {
- return ApplePayConfiguration(
- merchantId: "merchant.ComwellHotelsECOM",
- merchantName: "Comwell",
- allowOnboarding: true,
- allowShippingContactEditing: true,
- applePaySummaryItems: [
- ApplePaySummaryItem(
- label: "Total",
- amount: Amount(value: amount.value, currency: amount.currency),
- type: ApplePaySummaryItemType.definite)
- ]);
- }
-
- static final Iterable<StoredPaymentMethod> mockStoredPaymentData = [
- 1,
- 2,
- 3,
- 4
- ].map((i) => StoredPaymentMethod(
- expiryMonth: "12",
- expiryYear: "2035",
- holderName: "holder name",
- id: "id $i",
- lastFour: "$i$i$i$i",
- brand: "visa"));
-}
diff --git a/comwell_key_app/lib/pregistration/preregistration_flow.dart b/comwell_key_app/lib/pregistration/preregistration_flow.dart
deleted file mode 100644
index dbd57cb4..00000000
--- a/comwell_key_app/lib/pregistration/preregistration_flow.dart
+++ /dev/null
@@ -1,127 +0,0 @@
-import 'package:comwell_key_app/pregistration/bloc/preregistration_state.dart';
-import 'package:comwell_key_app/pregistration/bloc/preregistration_cubit.dart';
-import 'package:comwell_key_app/pregistration/pages/prereg_confirmation_page.dart';
-import 'package:comwell_key_app/pregistration/pages/prereg_information_page.dart';
-import 'package:comwell_key_app/themes/dark_theme.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:go_router/go_router.dart';
-
-enum PreregistrationPage {
- information,
- confirmation;
-
- static PreregistrationPage fromIndex(int index) {
- return PreregistrationPage.values[index];
- }
-
- static Iterable<Widget> getPages(Key key) {
- return PreregistrationPage.values.map((page) {
- switch (page) {
- case PreregistrationPage.information:
- return PreregInformationPage(key: key);
- case PreregistrationPage.confirmation:
- return PreregConfirmationPage(key: key);
- }
- });
- }
-}
-
-class PreregistrationFlow extends StatefulWidget {
- const PreregistrationFlow({super.key});
-
- @override
- State<PreregistrationFlow> createState() => _PreregistrationFlowState();
-}
-
-class _PreregistrationFlowState extends State<PreregistrationFlow> {
- @override
- Widget build(BuildContext context) {
- return BlocProvider(
- create: (context) => PreregistrationCubit()..init(),
- child: BlocConsumer<PreregistrationCubit, PreregistrationState>(
- listener: (context, state) {},
- builder: (context, state) {
- final cubit = context.read<PreregistrationCubit>();
- return Scaffold(
- backgroundColor: colorBackground,
- appBar: AppBar(
- backgroundColor: colorSecondary,
- shape: const RoundedRectangleBorder(
- borderRadius:
- BorderRadius.vertical(bottom: Radius.circular(24))),
- toolbarOpacity: 1.0,
- leading: BackButton(
- color: Colors.black,
- onPressed: () {
- if (!cubit.onBackClicked()) {
- context.pop();
- }
- },
- ),
- ),
- bottomNavigationBar: Builder(builder: (context) {
- if (state.loading) return const SizedBox();
- return Column(
- // BOTTOM NAVIGATION
- mainAxisSize: MainAxisSize.min,
- children: [
- const Divider(
- color: Colors.black12,
- height: 0,
- ),
- Row(
- children: [
- Expanded(
- child: Padding(
- padding: const EdgeInsets.all(16.0),
- child: ElevatedButton(
- onPressed: cubit.canContinue
- ? cubit.onContinueClicked
- : null,
- style: ButtonStyle(
- backgroundColor:
- WidgetStateProperty.resolveWith((states) {
- if (states.contains(WidgetState.disabled)) {
- return Colors.grey;
- }
- return const Color(0xffAA8D65);
- }),
- foregroundColor:
- const WidgetStatePropertyAll(Colors.white)),
- child: Padding(
- padding:
- const EdgeInsets.symmetric(vertical: 16.0),
- child: Text(cubit.buttonText),
- ),
- ),
- ),
- ),
- ],
- ),
- ],
- );
- }),
- body: Padding(
- padding: const EdgeInsets.symmetric(horizontal: 12.0),
- child: Builder(
- builder: (context) {
- if (state.loading) {
- return const Center(child: CircularProgressIndicator());
- }
- return PageView(
- key: const PageStorageKey("prereg_flow"),
- physics: const NeverScrollableScrollPhysics(),
- controller: cubit.pageController,
- children:
- PreregistrationPage.getPages(ValueKey(state)).toList(),
- );
- },
- ),
- ),
- );
- },
- ),
- );
- }
-}
diff --git a/comwell_key_app/lib/profile/cubit/profile_cubit.dart b/comwell_key_app/lib/profile/cubit/profile_cubit.dart
index 888deef9..15671059 100644
--- a/comwell_key_app/lib/profile/cubit/profile_cubit.dart
+++ b/comwell_key_app/lib/profile/cubit/profile_cubit.dart
@@ -1,5 +1,6 @@
import 'package:bloc/bloc.dart';
import 'package:comwell_key_app/profile/profile_repository.dart';
+import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:equatable/equatable.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
@@ -7,7 +8,8 @@ part 'profile_state.dart';
class ProfileCubit extends Cubit<ProfileState> {
final ProfileRepository profileRepository;
- ProfileCubit({required this.profileRepository}) : super(ProfileInitial());
+ ProfileCubit({required this.profileRepository})
+ : super(const ProfileState(isLoading: false, user: null, error: null));
void sendPageViewEvent() async {
await FirebaseAnalytics.instance.logScreenView(
@@ -16,7 +18,16 @@ class ProfileCubit extends Cubit<ProfileState> {
);
}
- void deleteAllInfoOnLogOut() async {
- emit(ProfileLogOut());
+ void init() async {
+ emit(const ProfileState(isLoading: true, user: null, error: null));
+ try {
+ final user = await profileRepository.fetchProfileSettings();
+ emit(ProfileState(user: user, isLoading: false));
+ } catch (e) {
+ print("error in profile cubit: ${e.toString()}");
+ emit(ProfileState(user: null, isLoading: false, error: Error()));
+ }
}
+
+ void deleteAllInfoOnLogOut() async {}
}
diff --git a/comwell_key_app/lib/profile/cubit/profile_state.dart b/comwell_key_app/lib/profile/cubit/profile_state.dart
index f412a994..36fe49b3 100644
--- a/comwell_key_app/lib/profile/cubit/profile_state.dart
+++ b/comwell_key_app/lib/profile/cubit/profile_state.dart
@@ -1,12 +1,29 @@
part of 'profile_cubit.dart';
-sealed class ProfileState extends Equatable {
- const ProfileState();
+class ProfileState extends Equatable {
+ final Error? error;
+ final bool isLoading;
+ final User? user;
+
+ const ProfileState({this.error, required this.isLoading, this.user});
@override
- List<Object> get props => [];
-}
+ List<Object> get props => [isLoading];
-final class ProfileInitial extends ProfileState {}
+ const ProfileState.initial()
+ : isLoading = false,
+ user = null,
+ error = null;
-final class ProfileLogOut extends ProfileState {}
+ ProfileState userFetched({required User user}) => _copyWith(user: user);
+ ProfileState loading() => _copyWith(isLoading: true);
+ ProfileState setError(Error error) => _copyWith(error: error);
+
+ ProfileState _copyWith({User? user, Error? error, bool? isLoading}) {
+ return ProfileState(
+ user: user ?? this.user,
+ error: error ?? this.error,
+ isLoading: isLoading ?? this.isLoading,
+ );
+ }
+}
diff --git a/comwell_key_app/lib/profile/profile_page.dart b/comwell_key_app/lib/profile/profile_page.dart
index ed9822e4..bc417ae6 100644
--- a/comwell_key_app/lib/profile/profile_page.dart
+++ b/comwell_key_app/lib/profile/profile_page.dart
@@ -2,6 +2,7 @@ import 'package:comwell_key_app/authentication/bloc/authentication_bloc.dart';
import 'package:comwell_key_app/common/components/round_icon_button.dart';
import 'package:comwell_key_app/profile/components/profile_settings_item.dart';
import 'package:comwell_key_app/profile/cubit/profile_cubit.dart';
+import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/secure_storage.dart';
@@ -12,175 +13,197 @@ import 'package:go_router/go_router.dart';
class ProfilePage extends StatelessWidget {
final SecureStorage secureStorage = SecureStorage();
+
ProfilePage({super.key});
@override
Widget build(BuildContext context) {
- context.read<ProfileCubit>().sendPageViewEvent();
+ final cubit = context.read<ProfileCubit>();
+ cubit.sendPageViewEvent();
return Scaffold(
backgroundColor: sandColor[20],
- body: SafeArea(
- child: Column(
- children: [
- Padding(
- padding: const EdgeInsets.only(top: 20),
- child: Container(
- alignment: Alignment.centerRight,
- child: RoundIconButton(
- icon: "assets/icons/close-icon.svg",
- color: Colors.white,
- onPressed: () {
- context.pop();
- }),
+ body: BlocBuilder<ProfileCubit, ProfileState>(
+ builder: (context, state) {
+ if (state.isLoading) {
+ return const Center(child: CircularProgressIndicator());
+ } else if (state.error != null) {
+ return Center(
+ child: Text(
+ "generic_error".tr(),
),
+ );
+ } else {
+ return _buildProfilePage(cubit, context);
+ }
+ },
+ ),
+ );
+ }
+
+ Widget _buildProfilePage(ProfileCubit cubit, BuildContext context) {
+ final user = cubit.state.user;
+
+ return SafeArea(
+ child: Column(
+ children: [
+ Padding(
+ padding: const EdgeInsets.only(top: 20),
+ child: Container(
+ alignment: Alignment.centerRight,
+ child: RoundIconButton(
+ icon: "assets/icons/close-icon.svg",
+ color: Colors.white,
+ onPressed: () {
+ context.pop();
+ }),
+ ),
+ ),
+ Expanded(
+ flex: 2,
+ child: Column(
+ children: [
+ const Spacer(),
+ Stack(children: [
+ Image.asset('assets/images/cc_inactive.png'),
+ Positioned(
+ bottom: 20,
+ left: 20,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'name_cc_sign'.tr(),
+ style: const TextStyle(
+ color: Colors.black,
+ fontSize: 14,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ Text(
+ '${user?.firstName} ${user?.lastName}',
+ style: const TextStyle(
+ color: Colors.black,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ]),
+ ),
+ ]),
+ const SizedBox(
+ height: 20,
+ )
+ ],
),
- Expanded(
- flex: 2,
- child: Column(
- children: [
- const Spacer(),
- Stack(children: [
- Image.asset('assets/images/cc_inactive.png'),
- Positioned(
- bottom: 20,
- left: 20,
- child: Column(
+ ),
+ Container(
+ color: Colors.white,
+ child: Column(
+ children: [
+ const SizedBox(height: 10),
+ Container(
+ margin: const EdgeInsets.symmetric(horizontal: 16),
+ padding: const EdgeInsets.symmetric(vertical: 16),
+ decoration: BoxDecoration(
+ color: sandColor[10],
+ borderRadius: const BorderRadius.all(Radius.circular(10)),
+ ),
+ height: 115,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceAround,
+ children: [
+ Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Text(
- 'name_cc_sign'.tr(),
- style: const TextStyle(
- color: Colors.black,
- fontSize: 14,
- fontWeight: FontWeight.w600,
- ),
- ),
- const Text(
- 'Nikolaj King Lykkegaard',
- style: TextStyle(
- color: Colors.black,
- fontSize: 16,
- fontWeight: FontWeight.w600,
+ Text("become_cc_member_title".tr(),
+ textAlign: TextAlign.start,
+ style: const TextStyle(
+ color: Colors.black,
+ fontSize: 16,
+ fontWeight: FontWeight.w600)),
+ SizedBox(
+ width: 250,
+ child: Text(
+ "become_cc_member_subtitle".tr(),
+ textAlign: TextAlign.start,
+ maxLines: 4,
+ style: const TextStyle(
+ color: Colors.black,
+ fontSize: 14,
+ fontWeight: FontWeight.w500),
),
),
- ]),
+ ],
+ ),
+ const Icon(
+ Icons.chevron_right,
+ color: Colors.black,
+ size: 24,
+ ),
+ ],
+ )),
+ const SizedBox(height: 10),
+ profileSettingsItem(
+ context,
+ icon: Image.asset('assets/icons/user-circle.png'),
+ text: 'profile_settings_profile_menu'.tr(),
+ trailingIcon: Icons.chevron_right,
+ onTap: () async {
+ await context.pushNamed(AppRoutes.profileSettings.name);
+ cubit.init();
+ },
+ ),
+ const Padding(
+ padding: EdgeInsets.symmetric(horizontal: 16.0),
+ child: Divider(color: colorDivider),
+ ),
+ profileSettingsItem(
+ context,
+ icon: Image.asset('assets/icons/card.png'),
+ text: 'payment_card_profile_menu'.tr(),
+ trailingIcon: Icons.chevron_right,
+ onTap: () {
+ context.pushNamed(AppRoutes.paymentCards.name);
+ },
+ ),
+ const Padding(
+ padding: EdgeInsets.symmetric(horizontal: 16.0),
+ child: Divider(color: colorDivider),
+ ),
+ profileSettingsItem(
+ context,
+ icon: Image.asset('assets/icons/bell.png'),
+ trailingIcon: Icons.chevron_right,
+ text: 'notifications_profile_menu'.tr(),
+ onTap: () {
+ context.pushNamed(AppRoutes.notifications.name);
+ },
+ ),
+ const Padding(
+ padding: EdgeInsets.symmetric(horizontal: 16.0),
+ child: Divider(color: colorDivider),
+ ),
+ const SizedBox(height: 10),
+ Center(
+ child: OutlinedButton(
+ style: OutlinedButton.styleFrom(
+ side: const BorderSide(color: colorDivider),
),
- ]),
- const SizedBox(
- height: 20,
- )
- ],
- ),
- ),
- Container(
- color: Colors.white,
- child: Column(
- children: [
- const SizedBox(height: 10),
- Container(
- margin: const EdgeInsets.symmetric(horizontal: 16),
- padding: const EdgeInsets.symmetric(vertical: 16),
- decoration: BoxDecoration(
- color: sandColor[10],
- borderRadius:
- const BorderRadius.all(Radius.circular(10)),
- ),
- height: 115,
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceAround,
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text("become_cc_member_title".tr(),
- textAlign: TextAlign.start,
- style: const TextStyle(
- color: Colors.black,
- fontSize: 16,
- fontWeight: FontWeight.w600)),
- SizedBox(
- width: 250,
- child: Text(
- "become_cc_member_subtitle".tr(),
- textAlign: TextAlign.start,
- maxLines: 4,
- style: const TextStyle(
- color: Colors.black,
- fontSize: 14,
- fontWeight: FontWeight.w500),
- ),
- ),
- ],
- ),
- const Icon(
- Icons.chevron_right,
- color: Colors.black,
- size: 24,
- ),
- ],
- )),
- const SizedBox(height: 10),
- profileSettingsItem(
- context,
- icon: Image.asset('assets/icons/user-circle.png'),
- text: 'profile_settings_profile_menu'.tr(),
- trailingIcon: Icons.chevron_right,
- onTap: () {
- context.pushNamed(AppRoutes.profileSettings.name);
- },
- ),
- const Padding(
- padding: EdgeInsets.symmetric(horizontal: 16.0),
- child: Divider(color: colorDivider),
- ),
- profileSettingsItem(
- context,
- icon: Image.asset('assets/icons/card.png'),
- text: 'payment_card_profile_menu'.tr(),
- trailingIcon: Icons.chevron_right,
- onTap: () {
- context.pushNamed(AppRoutes.paymentCards.name);
- },
- ),
- const Padding(
- padding: EdgeInsets.symmetric(horizontal: 16.0),
- child: Divider(color: colorDivider),
- ),
- profileSettingsItem(
- context,
- icon: Image.asset('assets/icons/bell.png'),
- trailingIcon: Icons.chevron_right,
- text: 'notifications_profile_menu'.tr(),
- onTap: () {
- context.pushNamed(AppRoutes.notifications.name);
+ onPressed: () {
+ showLogoutDialog(context);
},
- ),
- const Padding(
- padding: EdgeInsets.symmetric(horizontal: 16.0),
- child: Divider(color: colorDivider),
- ),
- const SizedBox(height: 10),
- Center(
- child: OutlinedButton(
- style: OutlinedButton.styleFrom(
- side: const BorderSide(color: colorDivider),
- ),
- onPressed: () {
- showLogoutDialog(context);
- },
- child: Text(
- 'logout_profile_menu'.tr(),
- style: TextStyle(color: Colors.grey[600]),
- ),
+ child: Text(
+ 'logout_profile_menu'.tr(),
+ style: TextStyle(color: Colors.grey[600]),
),
),
- const SizedBox(height: 20),
- ],
- ),
+ ),
+ const SizedBox(height: 20),
+ ],
),
- ],
- ),
+ ),
+ ],
),
);
}
diff --git a/comwell_key_app/lib/profile/profile_repository.dart b/comwell_key_app/lib/profile/profile_repository.dart
index c71dfee4..bfea5796 100644
--- a/comwell_key_app/lib/profile/profile_repository.dart
+++ b/comwell_key_app/lib/profile/profile_repository.dart
@@ -1,5 +1,11 @@
+import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/database/comwell_db.dart';
+import 'package:comwell_key_app/profile_settings/model/user.dart';
+import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
import 'package:comwell_key_app/services/api.dart';
+import 'package:comwell_key_app/services/mappers/user_mapper.dart';
+import 'package:comwell_key_app/services/models/user_dto.dart';
+import 'package:comwell_key_app/utils/json.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:comwell_key_app/utils/secure_storage.dart';
import 'package:comwell_key_app/utils/seos_repository.dart';
@@ -7,8 +13,31 @@ import 'package:seos_mobile_keys_plugin/seos_mobile_keys_plugin.dart';
class ProfileRepository {
final SecureStorage secureStorage = SecureStorage();
+ final AuthenticationRepository authenticationRepository =
+ locator<AuthenticationRepository>();
final SeosMobileKeysPlugin seosMobileKeysPlugin =
SeosRepository().seosMobileKeysPlugin;
+ final ProfileSettingsRepository profileSettingsRepository =
+ locator<ProfileSettingsRepository>();
final Api api = Api();
final db = locator<ComwellDatabase>();
+ late User user;
+
+ Future<void> logOut() async {
+ await authenticationRepository.logOut();
+ }
+
+ Future<User> fetchProfileSettings() async {
+ try {
+ final user = await db.userDAO.getUser();
+ return user;
+ } catch (e) {
+ final response = await api.fetchProfileSettings();
+ final data = response.data as Json;
+ final userDto = UserDto.fromJson(data);
+ final user = userDto.toUser();
+ await db.userDAO.saveUser(userDto);
+ return user;
+ }
+ }
}
diff --git a/comwell_key_app/lib/profile_settings/components/address_bottom_sheet.dart b/comwell_key_app/lib/profile_settings/components/address_bottom_sheet.dart
index e42444ad..76ce3a35 100644
--- a/comwell_key_app/lib/profile_settings/components/address_bottom_sheet.dart
+++ b/comwell_key_app/lib/profile_settings/components/address_bottom_sheet.dart
@@ -4,131 +4,178 @@ import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.da
import 'package:comwell_key_app/profile_settings/model/address.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:country_code_picker/country_code_picker.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
-class AddressBottomSheet extends StatelessWidget {
+class AddressBottomSheet extends StatefulWidget {
final User user;
- final TextEditingController _addressController = TextEditingController();
- final TextEditingController _zipCodeController = TextEditingController();
- final TextEditingController _cityController = TextEditingController();
- final TextEditingController _countryController = TextEditingController();
- AddressBottomSheet({
+ const AddressBottomSheet({
required this.user,
super.key,
});
+ @override
+ State<AddressBottomSheet> createState() => _AddressBottomSheetState();
+}
+
+class _AddressBottomSheetState extends State<AddressBottomSheet> {
+ late final TextEditingController _addressController;
+ late final TextEditingController _zipCodeController;
+ late final TextEditingController _cityController;
+ String _selectedCountry = '';
+
+ @override
+ void initState() {
+ super.initState();
+ _addressController =
+ TextEditingController(text: widget.user.address.street);
+ _zipCodeController =
+ TextEditingController(text: widget.user.address.zipCode);
+ _cityController = TextEditingController(text: widget.user.address.city);
+ _selectedCountry = widget.user.address.country;
+ }
+
+ @override
+ void dispose() {
+ _addressController.dispose();
+ _zipCodeController.dispose();
+ _cityController.dispose();
+ super.dispose();
+ }
+
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
+ final cubit = context.read<ProfileSettingsCubit>();
- _addressController.text = user.address?.street ?? "";
- _zipCodeController.text = user.address?.zipCode ?? "";
- _cityController.text = user.address?.city ?? "";
- _countryController.text = user.address?.country ?? "";
return Wrap(children: [
- Container(
- decoration: const BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.only(
- topLeft: Radius.circular(24),
- topRight: Radius.circular(24),
+ Padding(
+ padding: MediaQuery.of(context).viewInsets,
+ child: Container(
+ decoration: const BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.only(
+ topLeft: Radius.circular(24),
+ topRight: Radius.circular(24),
+ ),
),
- ),
- height: MediaQuery.of(context).copyWith().size.height * 0.7,
- child: Column(children: [
- Padding(
- padding: const EdgeInsets.only(top: 40, left: 16),
- child: Container(
- height: 47,
- color: Colors.white,
- child: Stack(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Text('profil_settings_address'.tr(),
- style: theme.textTheme.headlineLarge),
- RoundIconButton(
- icon: 'assets/icons/close-icon.svg',
- color: sandColor[20]!,
- onPressed: () {
- context.pop();
- }),
- ],
- )
- ],
+ height: MediaQuery.of(context).copyWith().size.height * 0.7,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: const EdgeInsets.only(top: 40, left: 16),
+ child: Container(
+ height: 47,
+ color: Colors.white,
+ child: Stack(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text('profil_settings_address'.tr(),
+ style: theme.textTheme.headlineLarge),
+ RoundIconButton(
+ icon: 'assets/icons/close-icon.svg',
+ color: sandColor[20]!,
+ onPressed: () {
+ context.pop();
+ }),
+ ],
+ )
+ ],
+ ),
),
),
- ),
- const SizedBox(height: 24),
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: ComwellTextField(
- fieldName: "profil_settings_address".tr(),
- initialValue: user.address?.street ?? "",
- readOnly: false,
- controller: _addressController)),
- const SizedBox(height: 8),
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: ComwellTextField(
- fieldName: "zipCode".tr(),
- initialValue: user.address?.zipCode ?? "",
- readOnly: false,
- controller: _zipCodeController)),
- const SizedBox(height: 8),
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: ComwellTextField(
- fieldName: "city".tr(),
- initialValue: user.address?.city ?? "",
- readOnly: false,
- controller: _cityController)),
- const SizedBox(height: 8),
- Padding(
+ const SizedBox(height: 24),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: ComwellTextField(
+ fieldName: "profil_settings_address".tr(),
+ initialValue: widget.user.address.street,
+ readOnly: false,
+ controller: _addressController)),
+ const SizedBox(height: 8),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: ComwellTextField(
+ fieldName: "zipCode".tr(),
+ initialValue: widget.user.address.zipCode,
+ readOnly: false,
+ controller: _zipCodeController)),
+ const SizedBox(height: 8),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: ComwellTextField(
+ fieldName: "city".tr(),
+ initialValue: widget.user.address.city,
+ readOnly: false,
+ controller: _cityController)),
+ const SizedBox(height: 8),
+ Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
- child: ComwellTextField(
- fieldName: "country".tr(),
- initialValue: user.address?.country ?? "",
- readOnly: false,
- controller: _countryController)),
- const Spacer(),
- const Divider(color: colorDivider),
- const SizedBox(height: 10),
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: ElevatedButton(
- style: ElevatedButton.styleFrom(
- backgroundColor: sandColor,
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(25),
+ child: Container(
+ height: 62,
+ width: double.infinity,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(8),
+ border: Border.all(color: colorDivider),
+ ),
+ child: CountryCodePicker(
+ alignLeft: true,
+ textOverflow: TextOverflow.visible,
+ initialSelection: _selectedCountry,
+ showFlag: true,
+ favorite: const ['DK', 'SE', 'NO', 'DE'],
+ showDropDownButton: true,
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ textStyle: Theme.of(context).textTheme.headlineSmall,
+ showCountryOnly: true,
+ showOnlyCountryWhenClosed: true,
+ onChanged: (CountryCode countryCode) {
+ setState(() {
+ _selectedCountry = countryCode.name ?? '';
+ });
+ },
),
- minimumSize: const Size(double.infinity, 52),
),
- onPressed: () async {
- context.read<ProfileSettingsCubit>().updateAddress(
- user,
- Address(
- street: _addressController.text,
- zipCode: _zipCodeController.text,
- city: _cityController.text,
- country: _countryController.text));
- context.pop();
- },
- child: Text(
- 'save'.tr(),
- style: theme.textTheme.headlineSmall?.copyWith(
- color: Colors.white,
+ ),
+ const Spacer(),
+ const Divider(color: colorDivider),
+ const SizedBox(height: 10),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: ElevatedButton(
+ style: ElevatedButton.styleFrom(
+ backgroundColor: sandColor,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(25),
+ ),
+ minimumSize: const Size(double.infinity, 52),
+ ),
+ onPressed: () async {
+ final address = Address(
+ street: _addressController.text,
+ zipCode: _zipCodeController.text,
+ city: _cityController.text,
+ country: _selectedCountry);
+ context.pop(address);
+ },
+ child: Text(
+ 'save'.tr(),
+ style: theme.textTheme.headlineSmall?.copyWith(
+ color: Colors.white,
+ ),
),
),
),
- ),
- const SizedBox(height: 40),
- ]))
+ const SizedBox(height: 40),
+ ])),
+ )
]);
}
}
diff --git a/comwell_key_app/lib/profile_settings/components/comwell_text_field.dart b/comwell_key_app/lib/profile_settings/components/comwell_text_field.dart
index 78ef6aa1..fd313342 100644
--- a/comwell_key_app/lib/profile_settings/components/comwell_text_field.dart
+++ b/comwell_key_app/lib/profile_settings/components/comwell_text_field.dart
@@ -1,32 +1,34 @@
+import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
class ComwellTextField extends StatefulWidget {
final String fieldName;
final String initialValue;
final bool readOnly;
final TextEditingController controller;
-
+ final void Function(String)? onSubmitted;
const ComwellTextField({
super.key,
required this.fieldName,
required this.initialValue,
required this.readOnly,
required this.controller,
+ this.onSubmitted,
});
@override
ComwellTextFieldState createState() => ComwellTextFieldState();
}
class ComwellTextFieldState extends State<ComwellTextField> {
-
late FocusNode _focusNode;
bool _isFocused = false;
@override
void initState() {
super.initState();
-
+
_focusNode = FocusNode();
_focusNode.addListener(() {
@@ -36,11 +38,10 @@ class ComwellTextFieldState extends State<ComwellTextField> {
});
}
-
-
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
+ final cubit = context.read<ProfileSettingsCubit>();
return Container(
height: 62,
decoration: BoxDecoration(
@@ -55,18 +56,20 @@ class ComwellTextFieldState extends State<ComwellTextField> {
focusNode: _focusNode,
decoration: InputDecoration(
label: Text(widget.fieldName,
- style: _isFocused
- ? theme.textTheme.bodySmall
- ?.copyWith(color: Colors.black.withAlpha((0.65 * 255).toInt()))
+ style: _isFocused && !widget.readOnly
+ ? theme.textTheme.bodySmall?.copyWith(
+ color: Colors.black.withAlpha((0.65 * 255).toInt()))
: theme.textTheme.headlineSmall
?.copyWith(color: Colors.black)),
isDense: true,
border: InputBorder.none,
contentPadding: const EdgeInsets.symmetric(vertical: 0),
+
),
style: Theme.of(context).textTheme.headlineSmall,
+ onSubmitted: widget.onSubmitted,
),
),
);
}
-}
\ No newline at end of file
+}
diff --git a/comwell_key_app/lib/profile_settings/components/date_time_picker.dart b/comwell_key_app/lib/profile_settings/components/date_time_picker.dart
index d22f5c10..910284f5 100644
--- a/comwell_key_app/lib/profile_settings/components/date_time_picker.dart
+++ b/comwell_key_app/lib/profile_settings/components/date_time_picker.dart
@@ -1,13 +1,17 @@
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
+import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.dart';
class DateTimePicker extends StatefulWidget {
final String title;
final DateTime initialValue;
- const DateTimePicker(
- {required this.title, required this.initialValue, super.key});
+ const DateTimePicker({
+ required this.title,
+ required this.initialValue,
+ super.key});
@override
State<DateTimePicker> createState() => _DatePickerState();
@@ -16,14 +20,21 @@ class DateTimePicker extends StatefulWidget {
class _DatePickerState extends State<DateTimePicker> {
DateTime? _selectedDate;
+ DateTime get _maxDate {
+ final today = DateTime.now();
+ return DateTime(today.year - 18, today.month, today.day);
+ }
+
Future<void> _selectDate(BuildContext context) async => showDatePicker(
context: context,
- initialDate: DateTime.now(),
- firstDate: DateTime(2000),
- lastDate: DateTime(2050),
+ initialDate: widget.initialValue,
+ firstDate: DateTime(1930),
+ lastDate: _maxDate,
+ errorInvalidText: "profil_settings_invalid_date".tr(),
).then((DateTime? selected) {
if (selected != null && selected != _selectedDate) {
setState(() => _selectedDate = selected);
+ context.read<ProfileSettingsCubit>().updateBirthDate(selected);
}
});
diff --git a/comwell_key_app/lib/profile_settings/components/intl_phone_field.dart b/comwell_key_app/lib/profile_settings/components/intl_phone_field.dart
index 91a6ca37..15441acf 100644
--- a/comwell_key_app/lib/profile_settings/components/intl_phone_field.dart
+++ b/comwell_key_app/lib/profile_settings/components/intl_phone_field.dart
@@ -1,13 +1,24 @@
+import 'package:comwell_key_app/profile_settings/components/comwell_text_field.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:country_code_picker/country_code_picker.dart';
import 'package:flutter/material.dart';
-
+import 'package:flutter/services.dart';
class IntlPhoneField extends StatefulWidget {
final String title;
final String phoneNumber;
- const IntlPhoneField(
- {required this.title, required this.phoneNumber, super.key});
+ final TextEditingController controller;
+ final bool readOnly;
+ final void Function(String)? onSubmitted;
+
+ const IntlPhoneField({
+ required this.title,
+ required this.phoneNumber,
+ required this.controller,
+ this.readOnly = false,
+ this.onSubmitted,
+ super.key,
+ });
@override
IntlPhoneFieldState createState() => IntlPhoneFieldState();
@@ -15,6 +26,21 @@ class IntlPhoneField extends StatefulWidget {
class IntlPhoneFieldState extends State<IntlPhoneField> {
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
+ late FocusNode _focusNode;
+ bool _isFocused = false;
+
+ @override
+ void initState() {
+ super.initState();
+
+ _focusNode = FocusNode();
+
+ _focusNode.addListener(() {
+ setState(() {
+ _isFocused = _focusNode.hasFocus;
+ });
+ });
+ }
@override
Widget build(BuildContext context) {
@@ -51,23 +77,30 @@ class IntlPhoneFieldState extends State<IntlPhoneField> {
const SizedBox(
width: 20,
),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- Text(
- widget.title,
- textAlign: TextAlign.start,
- style: theme.textTheme.bodySmall?.copyWith(
- color: Colors.black.withAlpha((0.65 * 255).toInt()),
- ),
- ),
-
- const SizedBox(height: 0.0),
- Text(widget.phoneNumber, style: theme.textTheme.headlineSmall),
- ],
- ),
- /* InternationalPhoneNumberInput(
+ const SizedBox(height: 0.0),
+ Expanded(
+ child: TextField(
+ focusNode: _focusNode,
+ controller: widget.controller,
+ readOnly: widget.readOnly,
+ style: theme.textTheme.headlineSmall,
+ onSubmitted: widget.onSubmitted,
+ keyboardType:const TextInputType.numberWithOptions(signed: true),
+ inputFormatters: [
+ FilteringTextInputFormatter.digitsOnly,
+ ],
+ decoration: InputDecoration(
+ border: InputBorder.none,
+ label: Text(widget.title,
+ style: _isFocused
+ ? theme.textTheme.bodySmall?.copyWith(
+ color:
+ Colors.black.withAlpha((0.65 * 255).toInt()))
+ : theme.textTheme.headlineSmall
+ ?.copyWith(color: Colors.black)),
+ ),
+ ),
+ /* InternationalPhoneNumberInput(
inputBorder: InputBorder.none,
onInputChanged: (PhoneNumber number) {
@@ -96,6 +129,7 @@ class IntlPhoneFieldState extends State<IntlPhoneField> {
print('On Saved: $number');
},
), */
+ )
],
),
),
diff --git a/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart b/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
index c72dab6a..5a53c07e 100644
--- a/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
+++ b/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
@@ -1,5 +1,6 @@
import 'package:bloc/bloc.dart';
import 'package:comwell_key_app/authentication/authentication_repository.dart';
+import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/profile_settings/model/address.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
@@ -10,41 +11,78 @@ import 'package:equatable/equatable.dart';
part 'profile_settings_state.dart';
class ProfileSettingsCubit extends Cubit<ProfileSettingsState> {
+ final ProfileRepository profileRepository;
final ProfileSettingsRepository profileSettingsRepository;
final AuthenticationRepository authenticationRepository;
- ProfileSettingsCubit({required this.profileSettingsRepository, required this.authenticationRepository}) : super(ProfileSettingsInitial());
+ ProfileSettingsCubit(
+ {required this.profileRepository,
+ required this.profileSettingsRepository,
+ required this.authenticationRepository})
+ : super(const ProfileSettingsState.initial());
- void fetchProfileSettings() async {
- emit(ProfileSettingsLoading());
+ void init() async {
+ emit(const ProfileSettingsState(isLoading: true, user: null, error: null));
try {
// Fetch profile settings
- final user = await profileSettingsRepository.fetchProfileSettings();
- emit(ProfileSettingsLoaded(user!));
+ final user = await profileRepository.fetchProfileSettings();
+ emit(ProfileSettingsState(isLoading: false, user: user, error: null));
} catch (e) {
- emit(ProfileSettingsError());
+ emit(ProfileSettingsState(isLoading: false, user: null, error: Error()));
}
}
void deleteProfile() async {
- try {
+ try {
await profileSettingsRepository.deleteProfile();
- locator<ComwellTracking>().trackEvent(
- 'delete_profile');
+ locator<ComwellTracking>().trackEvent('delete_profile');
await authenticationRepository.logOut();
- emit(ProfileSettingsDeleted());
+ emit(const ProfileSettingsState(
+ isDeleted: true, isLoading: false, user: null, error: null));
} catch (e) {
- emit(ProfileSettingsError());
+ emit(ProfileSettingsState(
+ isDeleted: false, isLoading: false, user: null, error: Error()));
+ }
+ }
+
+ void updateBirthDate(DateTime birthDate) {
+ if (state.user != null) {
+ final updatedUser = state.user!.copyWith(birthDate: birthDate);
+ emit(state.userLoaded(user: updatedUser));
}
}
- void updateAddress( User user, Address address) async {
+ void updateAddress(User user, Address address) {
+ print("update address: ${address}");
+ final updatedUser = state.user!.copyWith(address: address);
+
+ emit(state.userLoaded(user: updatedUser));
+ }
- final updatedUser = user.copyWith(address: address);
+ void updateProfile(User user) async {
+ print("update profile: ${user}");
+ emit(ProfileSettingsState(isLoading: true, user: user, error: null));
try {
- await profileSettingsRepository.updateUser(updatedUser);
- emit(ProfileSettingsLoaded(updatedUser));
+ print("user in cubit: $user");
+ await profileSettingsRepository.updateUser(user);
+ emit(ProfileSettingsState(isLoading: false, user: user, error: null));
} catch (e) {
- emit(ProfileSettingsError());
+ print("error in cubit: $e");
+ emit(ProfileSettingsState(isLoading: false, user: null, error: Error()));
}
}
+
+ void updateLastName(String value) {
+ final updatedUser = state.user!.copyWith(lastName: value);
+ emit(state.userLoaded(user: updatedUser));
+ }
+
+ void updateFirstName(String value) {
+ final updatedUser = state.user!.copyWith(firstName: value);
+ emit(state.userLoaded(user: updatedUser));
+ }
+
+ void updatePhoneNumber(String value) {
+ final updatedUser = state.user!.copyWith(phoneNumber: value);
+ emit(state.userLoaded(user: updatedUser));
+ }
}
diff --git a/comwell_key_app/lib/profile_settings/cubit/profile_settings_state.dart b/comwell_key_app/lib/profile_settings/cubit/profile_settings_state.dart
index ee20acb2..5628af93 100644
--- a/comwell_key_app/lib/profile_settings/cubit/profile_settings_state.dart
+++ b/comwell_key_app/lib/profile_settings/cubit/profile_settings_state.dart
@@ -1,27 +1,41 @@
part of 'profile_settings_cubit.dart';
-sealed class ProfileSettingsState extends Equatable {
- const ProfileSettingsState();
+class ProfileSettingsState extends Equatable {
+ final Error? error;
+ final bool isLoading;
+ final User? user;
+ final bool isDeleted;
+
+ const ProfileSettingsState({
+ this.error,
+ required this.isLoading,
+ this.user,
+ this.isDeleted = false,
+ });
@override
- List<Object> get props => [];
+ List<Object?> get props => [isLoading, isDeleted, user, error];
+
+ const ProfileSettingsState.initial()
+ : isLoading = false,
+ user = null,
+ error = null,
+ isDeleted = false;
+
+ ProfileSettingsState userLoaded({required User user}) =>
+ _copyWith(user: user);
+
+ ProfileSettingsState _copyWith({
+ User? user,
+ Error? error,
+ bool? isLoading,
+ bool? isDeleted,
+ }) {
+ return ProfileSettingsState(
+ user: user ?? this.user,
+ error: error ?? this.error,
+ isLoading: isLoading ?? this.isLoading,
+ isDeleted: isDeleted ?? this.isDeleted,
+ );
+ }
}
-
-final class ProfileSettingsInitial extends ProfileSettingsState {}
-
-final class ProfileSettingsLoading extends ProfileSettingsState {}
-
-final class ProfileSettingsLoaded extends ProfileSettingsState {
- final User user;
-
- const ProfileSettingsLoaded(this.user);
-
- @override
- List<Object> get props => [user];
-}
-
-final class ProfileSettingsError extends ProfileSettingsState {}
-
-final class ProfileSettingsDeleted extends ProfileSettingsState {}
-
-
diff --git a/comwell_key_app/lib/profile_settings/model/address.dart b/comwell_key_app/lib/profile_settings/model/address.dart
index 4a7258c8..31a5bbb9 100644
--- a/comwell_key_app/lib/profile_settings/model/address.dart
+++ b/comwell_key_app/lib/profile_settings/model/address.dart
@@ -11,21 +11,8 @@ class Address {
required this.zipCode,
});
- factory Address.fromJson(Map<String, dynamic> json) {
- return Address(
- street: json['street'] as String,
- city: json['city'] as String,
- country: json['state'] as String,
- zipCode: json['zipCode'] as String,
- );
+ @override
+ String toString() {
+ return 'Address(street: $street, city: $city, country: $country, zipCode: $zipCode)';
}
-
- Map<String, dynamic> toJson() {
- return {
- 'street': street,
- 'city': city,
- 'state': country,
- 'zipCode': zipCode,
- };
- }
-}
\ No newline at end of file
+}
diff --git a/comwell_key_app/lib/profile_settings/model/user.dart b/comwell_key_app/lib/profile_settings/model/user.dart
index 1d3e007f..dd039fac 100644
--- a/comwell_key_app/lib/profile_settings/model/user.dart
+++ b/comwell_key_app/lib/profile_settings/model/user.dart
@@ -1,61 +1,61 @@
import 'package:comwell_key_app/profile_settings/model/address.dart';
-import 'package:json_annotation/json_annotation.dart';
+import 'package:comwell_key_app/services/models/user_dto.dart';
-import '../../utils/json.dart';
-
-part '../../.generated/profile_settings/model/user.g.dart';
-
-@JsonSerializable()
class User {
final int id;
final String firstName;
final String lastName;
- final String? countryCode;
- final String? phone;
+ final String addressCountry;
+ final String phoneNumber;
final String email;
- final Address? address;
+ final Address address;
final DateTime birthDate;
- final String? shopperReference;
- final int? points;
+ final String shopperReference;
+ final int points;
User({
required this.id,
required this.firstName,
required this.lastName,
- required this.countryCode,
- required this.phone,
+ required this.addressCountry,
+ required this.phoneNumber,
required this.email,
required this.address,
required this.birthDate,
- this.shopperReference,
- this.points,
+ required this.shopperReference,
+ required this.points,
});
- factory User.fromJson(Json json) => _$UserFromJson(json);
-
- Json toJson() => _$UserToJson(this);
+ @override
+ String toString() {
+ return 'User(id: $id, firstName: $firstName, lastName: $lastName, addressCountry: $addressCountry, phone: $phoneNumber, email: $email, address: $address, birthDate: $birthDate, shopperReference: $shopperReference, points: $points)';
+ }
User copyWith({
int? id,
String? firstName,
String? lastName,
- String? countryCode,
- String? phone,
+ String? addressCountry,
+ String? phoneNumber,
String? email,
Address? address,
String? shopperReference,
- DateTime? birthday,
+ DateTime? birthDate,
+ int? points,
}) {
return User(
id: id ?? this.id,
firstName: firstName ?? this.firstName,
lastName: lastName ?? this.lastName,
- countryCode: countryCode ?? this.countryCode,
- phone: phone ?? this.phone,
+ addressCountry: addressCountry ?? this.addressCountry,
+ phoneNumber: phoneNumber ?? this.phoneNumber,
email: email ?? this.email,
address: address ?? this.address,
birthDate: birthDate ?? this.birthDate,
shopperReference: shopperReference ?? this.shopperReference,
+ points: points ?? this.points,
);
}
+
+
}
diff --git a/comwell_key_app/lib/profile_settings/profile_settings_page.dart b/comwell_key_app/lib/profile_settings/profile_settings_page.dart
index 69b438ea..4b1fdc0d 100644
--- a/comwell_key_app/lib/profile_settings/profile_settings_page.dart
+++ b/comwell_key_app/lib/profile_settings/profile_settings_page.dart
@@ -1,5 +1,8 @@
+import 'package:comwell_key_app/authentication/bloc/authentication_bloc.dart';
import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
import 'package:comwell_key_app/common/components/generic_dialog.dart';
+import 'package:comwell_key_app/login/auth.dart';
+import 'package:comwell_key_app/login/components/azure_b2c_widget.dart';
import 'package:comwell_key_app/profile_settings/components/address_bottom_sheet.dart';
import 'package:comwell_key_app/profile_settings/components/comwell_text_field.dart';
import 'package:comwell_key_app/profile_settings/components/date_time_picker.dart';
@@ -7,29 +10,34 @@ import 'package:comwell_key_app/profile_settings/components/intl_phone_field.dar
import 'package:comwell_key_app/profile_settings/components/text_field_with_trailing_icon.dart';
import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.dart';
import 'package:comwell_key_app/profile_settings/model/address.dart';
+import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
+import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
class ProfileSettingsPage extends StatelessWidget {
- const ProfileSettingsPage({super.key});
+ final TextEditingController _firstNameController = TextEditingController();
+ final TextEditingController _lastNameController = TextEditingController();
+ final TextEditingController _phoneNumberController = TextEditingController();
+ ProfileSettingsPage({super.key});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
- context.read<ProfileSettingsCubit>().fetchProfileSettings();
return BlocBuilder<ProfileSettingsCubit, ProfileSettingsState>(
builder: (context, state) {
- if (state is ProfileSettingsLoading) {
+ if (state.isLoading) {
return const Scaffold(
appBar: ComwellAppBar(
shouldShowProfileButton: false,
),
backgroundColor: Colors.white,
body: Center(child: CircularProgressIndicator()));
- } else if (state is ProfileSettingsLoaded) {
+ } else if (state.user != null) {
return _buildProfileSettingsPage(theme, state, context);
} else {
return Scaffold(
@@ -39,7 +47,7 @@ class ProfileSettingsPage extends StatelessWidget {
backgroundColor: Colors.white,
body: Center(
child: Text(
- "profile_settings_error".tr(),
+ "generic_error".tr(),
style: theme.textTheme.headlineLarge,
)));
}
@@ -49,8 +57,13 @@ class ProfileSettingsPage extends StatelessWidget {
Widget _buildProfileSettingsPage(
ThemeData theme, ProfileSettingsState state, BuildContext context) {
- final ProfileSettingsLoaded loadedState = state as ProfileSettingsLoaded;
+ _firstNameController.text = state.user!.firstName;
+ _lastNameController.text = state.user!.lastName;
+ _phoneNumberController.text = state.user!.phoneNumber;
+ final cubit = context.read<ProfileSettingsCubit>();
+
return Scaffold(
+ resizeToAvoidBottomInset: false,
backgroundColor: Colors.white,
appBar: const ComwellAppBar(
shouldShowProfileButton: false,
@@ -69,54 +82,107 @@ class ProfileSettingsPage extends StatelessWidget {
const SizedBox(height: 36),
ComwellTextField(
fieldName: "profil_settings_firstname".tr(),
- initialValue: loadedState.user.firstName,
- readOnly: true,
- controller: TextEditingController()),
+ initialValue: state.user!.firstName,
+ readOnly: false,
+ controller: _firstNameController,
+ onSubmitted: (value) {
+ print("onSubmitted: $value");
+ cubit.updateFirstName(value);
+ }),
const SizedBox(height: 8),
ComwellTextField(
fieldName: "profil_settings_lastname".tr(),
- initialValue: loadedState.user.lastName,
- readOnly: true,
- controller: TextEditingController()),
+ initialValue: state.user!.lastName,
+ readOnly: false,
+ controller: _lastNameController,
+ onSubmitted: (value) {
+ cubit.updateLastName(value);
+ }),
const SizedBox(height: 8),
ComwellTextField(
fieldName: "profil_settings_email".tr(),
- initialValue: loadedState.user.email,
+ initialValue: state.user!.email,
readOnly: true,
- controller: TextEditingController()),
+ controller: TextEditingController(text: state.user!.email),
+ ),
const SizedBox(height: 8),
IntlPhoneField(
title: "profil_settings_phone".tr(),
- phoneNumber: loadedState.user.phone ?? "",
+ phoneNumber: state.user!.phoneNumber,
+ controller: _phoneNumberController,
+ readOnly: false,
+ onSubmitted: (value) {
+ cubit.updatePhoneNumber(value);
+ },
),
const SizedBox(height: 8),
TextFieldWithTrailingIcon(
title: "profil_settings_address".tr(),
text:
- "${loadedState.user.address?.street}, ${loadedState.user.address?.city}, ${loadedState.user.address?.zipCode}, ${loadedState.user.address?.country}",
+ "${state.user!.address.street}, ${state.user!.address.city}, ${state.user!.address.zipCode}, ${state.user!.address.country}",
trailingIcon: "assets/icons/edit-alt.svg",
- onTap: () {
- showModalBottomSheet<Address>(
+ onTap: () async {
+ final response = await showModalBottomSheet<Address>(
context: context,
isScrollControlled: true,
backgroundColor: Colors.white,
builder: (context) =>
- AddressBottomSheet(user: loadedState.user));
+ AddressBottomSheet(user: state.user!));
+
+ if (response is Address) {
+ cubit.updateAddress(state.user!, response);
+ } else {
+ print("Not an address $response");
+ }
},
showTitle: true),
const SizedBox(height: 8),
DateTimePicker(
title: "profil_settings_birthday".tr(),
- initialValue: loadedState.user.birthDate,
+ initialValue: state.user!.birthDate,
),
const SizedBox(height: 8),
TextFieldWithTrailingIcon(
title: "",
text: "profil_settings_edit_password".tr(),
trailingIcon: "assets/icons/arrow-left.svg",
- onTap: () {},
+ onTap: () {
+ openChangePasswordModal(context, Auth.changePassword);
+ },
showTitle: false),
- const SizedBox(height: 40),
+ const SizedBox(height: 20),
+ Center(
+ child: OutlinedButton(
+ onPressed: () {
+ cubit.updateProfile(
+ User(
+ id: state.user!.id,
+ firstName: _firstNameController.text,
+ lastName: _lastNameController.text,
+ email: state.user!.email,
+ phoneNumber: _phoneNumberController.text,
+ birthDate: state.user!.birthDate,
+ address: state.user!.address,
+ shopperReference: state.user!.shopperReference,
+ points: state.user!.points,
+ addressCountry: state.user!.addressCountry,
+ ),
+ );
+ },
+ style: OutlinedButton.styleFrom(
+ backgroundColor: Colors.black,
+ elevation: 0,
+ minimumSize: const Size(135, 40),
+ maximumSize: const Size(155, 40),
+ ),
+ child: Text(
+ 'update_profile'.tr(),
+ style: const TextStyle(
+ color: Colors.white,
+ ),
+ ),
+ ),
+ ),
Center(
child: OutlinedButton(
onPressed: () {
@@ -132,15 +198,15 @@ class ProfileSettingsPage extends StatelessWidget {
maximumSize: const Size(155, 40),
),
child: Row(
- mainAxisAlignment: MainAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset("assets/icons/trash-can.svg",
height: 16),
const SizedBox(width: 4),
Text(
"delete_profile".tr(),
- style: theme.textTheme.labelLarge
- ?.copyWith(color: Colors.red),
+ style: theme.textTheme.labelLarge?.copyWith(
+ color: Colors.red, fontWeight: FontWeight.w600),
),
]),
),
@@ -153,6 +219,30 @@ class ProfileSettingsPage extends StatelessWidget {
);
}
+ Future<dynamic> openChangePasswordModal(BuildContext context, Auth authEnum) {
+ return showCupertinoModalBottomSheet(
+ enableDrag: false,
+ backgroundColor: Colors.orange,
+ topRadius: const Radius.circular(30),
+ elevation: 5,
+ useRootNavigator: true,
+ context: context,
+ builder: (BuildContext context) {
+ return SizedBox(
+ height: 700,
+ child: SingleChildScrollView(
+ dragStartBehavior: DragStartBehavior.start,
+ scrollDirection: Axis.vertical,
+ child: SizedBox(
+ height: 700,
+ width: 400,
+ child: AzureB2CWidget(authEnum: authEnum, authBloc: context.read<AuthenticationBloc>()),
+ ),
+ ),
+ );
+ });
+ }
+
Future<void> showDeleteProfileDialog(BuildContext context) {
return showDialog<void>(
context: context,
diff --git a/comwell_key_app/lib/profile_settings/repostiory/profile_settings_repository.dart b/comwell_key_app/lib/profile_settings/repostiory/profile_settings_repository.dart
index 975b9ff7..334636a5 100644
--- a/comwell_key_app/lib/profile_settings/repostiory/profile_settings_repository.dart
+++ b/comwell_key_app/lib/profile_settings/repostiory/profile_settings_repository.dart
@@ -1,6 +1,9 @@
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
+
import 'package:comwell_key_app/services/api.dart';
+import 'package:comwell_key_app/services/mappers/user_mapper.dart';
+import 'package:comwell_key_app/services/models/user_dto.dart';
import 'dart:convert';
import 'package:comwell_key_app/utils/json.dart';
@@ -10,19 +13,20 @@ class ProfileSettingsRepository {
final Api api = Api();
final db = locator<ComwellDatabase>();
- Future<User> fetchProfileSettings() async {
- final response = await api.fetchProfileSettings();
- final data = response.data as Map<String, dynamic>;
- if (data != null) {
- final user = User.fromJson(data);
- db.userDAO.saveUser(user);
- return user;
- }
- throw Exception('Failed to fetch profile settings');
+ Future<User> updateUser(User updatedUser) async {
+ final userDto = updatedUser.toUserDto();
+ final response = await api.updateUser(userDto);
+
+ final data = response.data as Json;
+ final responseDto = UserDto.fromJson(data);
+ final user = responseDto.toUser();
+ await db.userDAO.saveUser(responseDto);
+ return user;
}
- Future<void> updateUser(User updatedUser) async {
- return api.updateUser(updatedUser);
+ Future<void> updateAddress(User updatedUser) async {
+ final userDto = updatedUser.toUserDto();
+ await db.userDAO.saveUser(userDto);
}
Future<void> deleteProfile() {
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index 0f4311e1..2e7a74f2 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -1,3 +1,4 @@
+import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/authentication/bloc/authentication_bloc.dart';
import 'package:comwell_key_app/check_in/bloc/check_in_cubit.dart';
import 'package:comwell_key_app/check_in/check_in_page.dart';
@@ -26,10 +27,15 @@ import 'package:comwell_key_app/overview/cubit/overview_cubit.dart';
import 'package:comwell_key_app/overview/repository/overview_repository.dart';
import 'package:comwell_key_app/payment_cards/bloc/payment_cards_cubit.dart';
import 'package:comwell_key_app/payment_cards/payment_cards_page.dart';
-import 'package:comwell_key_app/pregistration/preregistration_flow.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/preregistration_flow.dart';
+import 'package:comwell_key_app/profile/cubit/profile_cubit.dart';
import 'package:comwell_key_app/profile/profile_page.dart';
+import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/profile_settings/components/change_password_modal.dart';
+import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.dart';
+import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/profile_settings/profile_settings_page.dart';
+import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
import 'package:comwell_key_app/redeem_debug/redeem_page.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/routing/go_router_observer.dart';
@@ -193,13 +199,29 @@ GoRouter goRouter(AuthenticationBloc authBloc) {
path: "profile",
name: AppRoutes.profile.name,
builder: (context, state) {
- return ProfilePage(); //mobileKey: key);
+ return BlocProvider<ProfileCubit>(
+ create: (BuildContext context) => ProfileCubit(
+ profileRepository: locator<ProfileRepository>())
+ ..init(),
+ child: ProfilePage(), //mobileKey: key);
+ );
},
routes: [
GoRoute(
- path: "profilesettings",
+ path: "profile_settings",
name: AppRoutes.profileSettings.name,
- builder: (context, state) => const ProfileSettingsPage(),
+ builder: (context, state) {
+ return BlocProvider<ProfileSettingsCubit>(
+ create: (BuildContext context) => ProfileSettingsCubit(
+ profileRepository: locator<ProfileRepository>(),
+ profileSettingsRepository:
+ locator<ProfileSettingsRepository>(),
+ authenticationRepository:
+ locator<AuthenticationRepository>())
+ ..init(),
+ child: ProfileSettingsPage(),
+ );
+ },
routes: [
GoRoute(
path: 'change_password',
diff --git a/comwell_key_app/lib/services/api.dart b/comwell_key_app/lib/services/api.dart
index afe60604..483df776 100644
--- a/comwell_key_app/lib/services/api.dart
+++ b/comwell_key_app/lib/services/api.dart
@@ -5,6 +5,7 @@ import 'package:comwell_key_app/hotel_information/models/hotel.dart';
import 'package:comwell_key_app/notifications/models/notification_permission.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/services/http_client.dart';
+import 'package:comwell_key_app/services/models/user_dto.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:dio/dio.dart';
@@ -76,6 +77,7 @@ class Api {
Future<Response<dynamic>> fetchProfileSettings() async {
final response = await dio.get('/Members/v1/GetGuestProfile');
+ print("response in api: $response");
return response;
}
@@ -120,16 +122,14 @@ class Api {
return response;
}
- Future<void> updateUser(User updatedUser) {
- return dio.post<void>(
+ Future<dynamic> updateUser(UserDto updatedUser) {
+ final json = jsonEncode(updatedUser);
+ print("json in api: $json");
+ final response = dio.put<void>(
'/Members/v1/UpdateGuestData',
- data: {
- 'addressStreet': updatedUser.address?.street,
- 'adressCity': updatedUser.address?.city,
- 'addressCountry': updatedUser.address?.country,
- 'addressZip': updatedUser.address?.zipCode,
- },
+ data: json,
);
+ return response;
}
// Check in
diff --git a/comwell_key_app/lib/services/mappers/user_mapper.dart b/comwell_key_app/lib/services/mappers/user_mapper.dart
new file mode 100644
index 00000000..044ac312
--- /dev/null
+++ b/comwell_key_app/lib/services/mappers/user_mapper.dart
@@ -0,0 +1,49 @@
+import 'package:comwell_key_app/profile_settings/model/address.dart';
+import 'package:comwell_key_app/profile_settings/model/user.dart';
+import 'package:comwell_key_app/services/models/user_dto.dart';
+
+extension UserMapper on UserDto {
+ User toUser() {
+ return User(
+ id: id,
+ firstName: firstName,
+ lastName: lastName,
+ email: email,
+ addressCountry: addressCountry,
+ phoneNumber: phoneNumber,
+ address: Address(
+ street: addressStreet,
+ city: addressCity,
+ country: addressCountry,
+ zipCode: addressZip,
+ ),
+ birthDate: birthDate,
+ shopperReference: clubId,
+ points: points,
+ );
+ }
+
+}
+
+extension UserDtoMapper on User {
+ UserDto toUserDto() {
+ return UserDto(
+ id: id,
+ firstName: firstName,
+ lastName: lastName,
+ email: email,
+ clubId: shopperReference,
+ clubLevel: '',
+ clubLevelName: '',
+ birthDate: birthDate,
+ phoneNumber: phoneNumber,
+ gender: '',
+ addressStreet: address.street,
+ addressZip: address.zipCode,
+ addressCity: address.city,
+ addressCountry: addressCountry,
+ points: points,
+ locale: 'en',
+ );
+ }
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/services/models/user_dto.dart b/comwell_key_app/lib/services/models/user_dto.dart
new file mode 100644
index 00000000..94b0576b
--- /dev/null
+++ b/comwell_key_app/lib/services/models/user_dto.dart
@@ -0,0 +1,69 @@
+import 'package:comwell_key_app/profile_settings/model/user.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+part '../../.generated/services/models/user_dto.g.dart';
+
+@JsonSerializable()
+class UserDto {
+ final int id;
+ final String firstName;
+ final String lastName;
+ final String email;
+ final String clubId;
+ final String clubLevel;
+ final String clubLevelName;
+ final DateTime birthDate;
+ final String phoneNumber;
+ final String gender;
+ final String addressStreet;
+ final String addressZip;
+ final String addressCity;
+ final String addressCountry;
+ final int points;
+ final String locale;
+
+ UserDto({
+ required this.id,
+ required this.firstName,
+ required this.lastName,
+ required this.email,
+ required this.clubId,
+ required this.clubLevel,
+ required this.clubLevelName,
+ required this.birthDate,
+ required this.phoneNumber,
+ required this.gender,
+ required this.addressStreet,
+ required this.addressZip,
+ required this.addressCity,
+ required this.addressCountry,
+ required this.points,
+ required this.locale,
+ });
+
+ factory UserDto.fromJson(Map<String, dynamic> json) =>
+ _$UserDtoFromJson(json);
+
+ Map<String, dynamic> toJson() => _$UserDtoToJson(this);
+
+ UserDto toUserDto(User user) {
+ return UserDto(
+ id: user.id,
+ firstName: user.firstName,
+ lastName: user.lastName,
+ email: user.email,
+ clubId: user.shopperReference,
+ clubLevel: '',
+ clubLevelName: '',
+ birthDate: user.birthDate,
+ phoneNumber: user.phoneNumber,
+ gender: '',
+ addressStreet: user.address.street,
+ addressZip: user.address.zipCode,
+ addressCity: user.address.city,
+ addressCountry: user.addressCountry,
+ points: user.points,
+ locale: 'en',
+ );
+ }
+}
diff --git a/comwell_key_app/lib/utils/locator.dart b/comwell_key_app/lib/utils/locator.dart
index 7c72b707..08489893 100644
--- a/comwell_key_app/lib/utils/locator.dart
+++ b/comwell_key_app/lib/utils/locator.dart
@@ -4,7 +4,7 @@ import 'package:comwell_key_app/hotel_information/repository/hotel_information_r
import 'package:comwell_key_app/key/repository/key_repository.dart';
import 'package:comwell_key_app/notifications/notifications_repository.dart';
import 'package:comwell_key_app/overview/repository/overview_repository.dart';
-import 'package:comwell_key_app/pregistration/pregistration_repository.dart';
+import 'package:comwell_key_app/payment_cards/pregistration/pregistration_repository.dart';
import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
import 'package:comwell_key_app/tracking/comwell_tracking.dart';
diff --git a/comwell_key_app/test/profile_settings_test/profile_settings_cubit_test.dart b/comwell_key_app/test/profile_settings_test/profile_settings_cubit_test.dart
index bc50e9d8..ecaae12a 100644
--- a/comwell_key_app/test/profile_settings_test/profile_settings_cubit_test.dart
+++ b/comwell_key_app/test/profile_settings_test/profile_settings_cubit_test.dart
@@ -1,5 +1,6 @@
import 'package:bloc_test/bloc_test.dart';
import 'package:comwell_key_app/authentication/authentication_repository.dart';
+import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/profile_settings/model/address.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
@@ -13,15 +14,19 @@ class MockProfileSettingsRepository extends Mock
class MockAuthenticationRepository extends Mock
implements AuthenticationRepository {}
+class MockProfileRepository extends Mock implements ProfileRepository {}
+
void main() {
late ProfileSettingsCubit profileSettingsCubit;
late MockProfileSettingsRepository mockProfileSettingsRepository;
late MockAuthenticationRepository mockAuthenticationRepository;
-
+ late MockProfileRepository mockProfileRepository;
setUp(() {
mockProfileSettingsRepository = MockProfileSettingsRepository();
mockAuthenticationRepository = MockAuthenticationRepository();
+ mockProfileRepository = MockProfileRepository();
profileSettingsCubit = ProfileSettingsCubit(
+ profileRepository: mockProfileRepository,
profileSettingsRepository: mockProfileSettingsRepository,
authenticationRepository: mockAuthenticationRepository);
});
@@ -36,7 +41,7 @@ void main() {
firstName: 'John',
lastName: 'Doe',
email: 'john.doe@example.com',
- phone: '1234567890',
+ phoneNumber: '1234567890',
address: Address(
street: '123 Main St',
city: 'Anytown',
@@ -44,34 +49,34 @@ void main() {
country: 'USA',
),
birthDate: DateTime(1990, 1, 1),
- countryCode: '',
+ addressCountry: 'SE',
+ shopperReference: '1234567890',
+ points: 100,
);
blocTest<ProfileSettingsCubit, ProfileSettingsState>(
'emits [ProfileSettingsLoading, ProfileSettingsLoaded] when fetchProfileSettings is successful',
build: () {
- when(() => mockProfileSettingsRepository.fetchProfileSettings())
+ when(() => mockProfileRepository.fetchProfileSettings())
.thenAnswer((_) async => user);
return profileSettingsCubit;
},
- act: (cubit) => cubit.fetchProfileSettings(),
+ act: (cubit) => cubit.init(),
expect: () => [
- ProfileSettingsLoading(),
- ProfileSettingsLoaded(user),
+ ProfileSettingsState(user: user, isLoading: false, error: Error()),
],
);
blocTest<ProfileSettingsCubit, ProfileSettingsState>(
'emits [ProfileSettingsLoading, ProfileSettingsError] when fetchProfileSettings fails',
build: () {
- when(() => mockProfileSettingsRepository.fetchProfileSettings())
+ when(() => mockProfileRepository.fetchProfileSettings())
.thenThrow(Exception('Failed to fetch profile settings'));
return profileSettingsCubit;
},
- act: (cubit) => cubit.fetchProfileSettings(),
+ act: (cubit) => cubit.init(),
expect: () => [
- ProfileSettingsLoading(),
- ProfileSettingsError(),
+ ProfileSettingsState(user: null, isLoading: false, error: Error()),
],
);
@@ -86,7 +91,7 @@ void main() {
},
act: (cubit) => cubit.deleteProfile(),
expect: () => [
- ProfileSettingsDeleted(),
+ ProfileSettingsState(user: null, isLoading: false, error: Error()),
],
);
@@ -99,7 +104,7 @@ void main() {
},
act: (cubit) => cubit.deleteProfile(),
expect: () => [
- ProfileSettingsError(),
+ ProfileSettingsState(user: null, isLoading: false, error: Error()),
],
);
});