diff --git a/.env.local b/.env.local
index 8ccdefd9048..cb6d89c9673 100644
--- a/.env.local
+++ b/.env.local
@@ -83,14 +83,14 @@ NATIVE_LOGIN_ENABLED=YES
# Fast login max retries
FAST_LOGIN_MAX_RETRIES=3
# Fast login opt-in
-FAST_LOGIN_OPTIN=NO
+FAST_LOGIN_OPTIN=YES
# Enable CIE login flow with emulator and dev server
CIE_LOGIN_WITH_DEV_SERVER_ENABLED=NO
-# Enable CDU flow new screen
-CDU_NEW_FLOW=NO
# Relay State for SPID
SPID_RELAY_STATE='appio-dev'
# Wallet V3 RESTful API
WALLET_API_BASEURL='http://127.0.0.1:3000'
# Wallet V3 test/env RESTful API
WALLET_API_UAT_BASEURL='https://api.uat.platform.pagopa.it'
+# Redesign of the services section
+NEW_SERVICES_ENABLED=NO
\ No newline at end of file
diff --git a/.env.production b/.env.production
index 964c21771b0..07db02cf403 100644
--- a/.env.production
+++ b/.env.production
@@ -86,11 +86,11 @@ FAST_LOGIN_MAX_RETRIES=3
FAST_LOGIN_OPTIN=YES
# Enable CIE login flow with emulator and dev server
CIE_LOGIN_WITH_DEV_SERVER_ENABLED=NO
-# Enable CDU flow new screen
-CDU_NEW_FLOW=YES
# Relay State for SPID
SPID_RELAY_STATE='appio'
# Wallet RESTful API
WALLET_API_BASEURL='https://api.platform.pagopa.it'
# Wallet test/env RESTful API
WALLET_API_UAT_BASEURL='https://api.uat.platform.pagopa.it'
+# Redesign of the services section
+NEW_SERVICES_ENABLED=NO
diff --git a/.github/actions/setup-composite/action.yml b/.github/actions/setup-composite/action.yml
index 705495bf838..bcf2e107204 100644
--- a/.github/actions/setup-composite/action.yml
+++ b/.github/actions/setup-composite/action.yml
@@ -17,11 +17,7 @@ runs:
with:
# npm cache files are stored in `~/.npm` on Linux/macOS
path: ~/.npm
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}
- id: install-packages
run: yarn install --frozen-lockfile
shell: bash
diff --git a/.github/scripts/run-e2e-tests.sh b/.github/scripts/run-e2e-tests.sh
index 9a2c01b2b31..7217ccb2aad 100644
--- a/.github/scripts/run-e2e-tests.sh
+++ b/.github/scripts/run-e2e-tests.sh
@@ -1,10 +1,21 @@
+#!/bin/sh
+
+# Check if the correct number of arguments is provided
+if [ "$#" -ne 1 ]; then
+ echo "Usage: $0 "
+ exit 1
+fi
+
+# Navigate to the API server directory and start setup
cd _io-dev-api-server_
cp ../scripts/api-config.json config/config.json
yarn
yarn generate
yarn start &> /tmp/io-dev-api-server.log &
+
# wait for the server to be up and running
sleep 10
+
cd ..
yarn detox clean-framework-cache
yarn detox build-framework-cache
@@ -17,4 +28,4 @@ yarn detox test \
--take-screenshots all \
--record-videos failing \
--debug-synchronization 1000 \
- --retries 3
\ No newline at end of file
+ --retries 3 "$1"
\ No newline at end of file
diff --git a/.github/workflows/release-fl.yml b/.github/workflows/release-fl.yml
index 56bb3da4a7e..29be9a64d1b 100644
--- a/.github/workflows/release-fl.yml
+++ b/.github/workflows/release-fl.yml
@@ -46,10 +46,10 @@ jobs:
release-ios:
needs: run-static-checks
environment: prod
- runs-on: macos-12
+ runs-on: macos-13-xlarge
steps:
- id: set-xcode-version
- run: sudo xcode-select -s '/Applications/Xcode_14.2.app/Contents/Developer'
+ run: sudo xcode-select -s '/Applications/Xcode_15.2.app/Contents/Developer'
shell: bash
- id: checkout
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab #v3.5.2
@@ -58,7 +58,7 @@ jobs:
- id: setup
uses: ./.github/actions/setup-composite
- id: setup-ruby
- uses: ruby/setup-ruby@d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c #v1.149.0
+ uses: ruby/setup-ruby@5f19ec79cedfadb78ab837f95b87734d0003c899 #v1.173.0
with:
bundler-cache: true
- id: prepare-ios-build
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 62f1e5aaf5e..50536ccf973 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -47,10 +47,10 @@ jobs:
release-ios:
needs: run-static-checks
environment: prod
- runs-on: macos-12
+ runs-on: macos-13-xlarge
steps:
- id: set-xcode-version
- run: sudo xcode-select -s '/Applications/Xcode_14.2.app/Contents/Developer'
+ run: sudo xcode-select -s '/Applications/Xcode_15.2.app/Contents/Developer'
shell: bash
- id: checkout
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab #v3.5.2
@@ -59,7 +59,7 @@ jobs:
- id: setup
uses: ./.github/actions/setup-composite
- id: setup-ruby
- uses: ruby/setup-ruby@d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c #v1.149.0
+ uses: ruby/setup-ruby@5f19ec79cedfadb78ab837f95b87734d0003c899 #v1.173.0
with:
bundler-cache: true
- id: prepare-ios-build
@@ -90,6 +90,17 @@ jobs:
APP_STORE_API_KEY_ISSUER_ID: ${{secrets.APP_STORE_API_KEY_ISSUER_ID}}
ITMSTRANSPORTER_FORCE_ITMS_PACKAGE_UPLOAD: ${{secrets.ITMSTRANSPORTER_FORCE_ITMS_PACKAGE_UPLOAD}}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
+ - id: upload-dsym-files
+ # Sometimes the build-upload-app-store step fails for timeout,
+ # in this case we want to upload the dSYM files anyway
+ if: ${{ always() }}
+ # We don't want to fail whole job if the dSYM upload step fails
+ continue-on-error: true
+ uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.0.3
+ with:
+ name: ItaliaApp.app.dSYM.zip
+ path: ios/ItaliaApp.app.dSYM.zip
+ retention-days: 60
notify-new-version:
environment: dev
runs-on: ubuntu-latest
diff --git a/.github/workflows/staticcheck.yaml b/.github/workflows/staticcheck.yaml
index 6cda17b269b..28e71a1b417 100644
--- a/.github/workflows/staticcheck.yaml
+++ b/.github/workflows/staticcheck.yaml
@@ -21,4 +21,4 @@ jobs:
- id: run-test
run: yarn test:ci
- id: codecov-script
- run: ./scripts/codecov.sh
\ No newline at end of file
+ run: ./scripts/codecov.sh
diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml
index c49ae1f34ad..59a4294e144 100644
--- a/.github/workflows/test-e2e.yml
+++ b/.github/workflows/test-e2e.yml
@@ -1,25 +1,27 @@
name: Run e2e tests
on:
+ workflow_dispatch:
push:
branches:
- master
jobs:
run-static-checks:
- uses: ./.github/workflows/staticcheck.yaml
- run-e2e-test-ios:
+ uses: ./.github/workflows/staticcheck.yaml
+ build-detox-app:
needs: run-static-checks
- runs-on: macos-latest
- environment: dev
+ runs-on: macos-12
concurrency:
- group: ${{ github.workflow }}-e2e-tests-${{ github.head_ref || github.run_id }}
+ group: ${{ github.workflow }}-e2e-tests-${{ github.ref || github.run_id }}
cancel-in-progress: true
steps:
- id: checkout
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
- id: setup
uses: ./.github/actions/setup-composite
+ with:
+ use-cache: 'true'
- id: setup-ruby
- uses: ruby/setup-ruby@d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c # v1.148.0
+ uses: ruby/setup-ruby@5f19ec79cedfadb78ab837f95b87734d0003c899 #v1.173.0
with:
bundler-cache: true
- id: prepare-dependencies
@@ -32,9 +34,7 @@ jobs:
with:
path: ios/Pods
key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }}
- restore-keys: |
- ${{ runner.os }}-pods-
- - id: install-detox
+ - id: install-applesimutils
run: |
brew tap wix/brew
brew install applesimutils
@@ -46,29 +46,70 @@ jobs:
with:
path: ios/build
key: ${{ runner.os }}-detox-build
- restore-keys: |
- ${{ runner.os }}-detox-build
- id: setup-pods
run: cd ios ; bundle exec pod install --verbose ; cd ..
shell: bash
- id: prepare-detox-build
run: RN_SRC_EXT=e2e.ts yarn detox build -c ios.sim.release
shell: bash
+ - id: upload-detox-build
+ uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.0.3
+ with:
+ name: ItaliaApp.app
+ path: ios/build/Build/Products/Release-iphonesimulator/ItaliaApp.app
+ retention-days: 2
+ run-e2e-tests:
+ needs: build-detox-app
+ runs-on: macos-latest
+ environment: dev
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - test: "ts/__e2e__/"
+ name: "Base_e2e"
+ - test: "ts/features/bonus/cgn/__e2e__/"
+ name: "cgn_e2e"
+ - test: "ts/features/messages/__e2e__/"
+ name: "messages_e2e"
+ - test: "ts/features/euCovidCert/__e2e__/"
+ name: "eucovidcert_e2e"
+ - test: "ts/features/wallet/onboarding/__e2e__/"
+ name: "wallet_onboarding_e2e"
+ steps:
+ - id: install-applesimutils
+ run: |
+ brew tap wix/brew
+ brew install applesimutils
+ shell: bash
+ - id: checkout
+ uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
+ - id: download-detox-build
+ uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
+ with:
+ name: ItaliaApp.app
+ path: ios/build/Build/Products/Release-iphonesimulator/ItaliaApp.app
+ - id: setup
+ uses: ./.github/actions/setup-composite
+ with:
+ use-cache: 'true'
- id: checkout-dev-server
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
with:
repository: pagopa/io-dev-api-server
path: './_io-dev-api-server_'
- id: run-e2e-tests
- run: bash ./.github/scripts/run-e2e-tests.sh
+ run: bash ./.github/scripts/run-e2e-tests.sh ${{ matrix.test }}
- id: notify-test-failure
if: failure()
uses: ./.github/actions/notify-e2e
env:
+ TEST: ${{ matrix.name }}
IO_APP_SLACK_HELPER_BOT_TOKEN: ${{ secrets.IO_APP_SLACK_HELPER_BOT_TOKEN }}
- id: upload-artifacts
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v.3.1.2
+ uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v.3.1.2
if: always()
with:
- name: detox-artifacts
- path: /tmp/e2e_artifacts/
\ No newline at end of file
+ name: detox-artifacts-${{ matrix.name }}
+ path: /tmp/e2e_artifacts/
+ retention-days: 2
diff --git a/.gitignore b/.gitignore
index c880c3a4cab..2a5b814922d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,7 @@ local.properties
*.iml
*.hprof
Google Play Android Developer-04750d2c0cf8.json
+.cxx/
**/fastlane/report.xml
**/fastlane/Preview.html
diff --git a/.hound.yml b/.hound.yml
deleted file mode 100644
index 74b81cf446d..00000000000
--- a/.hound.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-tslint:
- enabled: true
- config_file: tslint.json
-
diff --git a/.node-version b/.node-version
index e65243f2ea3..a9d087399d7 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-16.19.0
+18.19.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a3ea94b888d..b9744fdb9bf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,342 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+## [2.58.0-rc.0](https://github.com/pagopa/io-app/compare/2.57.0-rc.1...2.58.0-rc.0) (2024-04-09)
+
+
+### Features
+
+* [[IOCOM-1199](https://pagopa.atlassian.net/browse/IOCOM-1199)] Vertically ordered CTAs and Payment button on new DS message details screen ([#5636](https://github.com/pagopa/io-app/issues/5636)) ([0fa34fb](https://github.com/pagopa/io-app/commit/0fa34fb1c76ab5b11e87f2aed5dfdf5ff0d82929))
+* [[IOCOM-870](https://pagopa.atlassian.net/browse/IOCOM-870)] New DS on payment list in the SEND message details ([#5650](https://github.com/pagopa/io-app/issues/5650)) ([1f31acb](https://github.com/pagopa/io-app/commit/1f31acb4c1d7a4348b7504bf35affc99f82b752e))
+* [[IOCOM-874](https://pagopa.atlassian.net/browse/IOCOM-874)] Bottom menu on SEND message details, with "Support" action item ([#5644](https://github.com/pagopa/io-app/issues/5644)) ([9f72690](https://github.com/pagopa/io-app/commit/9f72690a37c11038935afb2ce40ec82051f94355))
+
+
+### Chores
+
+* **Cross:** [[IOAPPX-271](https://pagopa.atlassian.net/browse/IOAPPX-271)] Delete components and assets no longer referenced ([#5646](https://github.com/pagopa/io-app/issues/5646)) ([fe14f08](https://github.com/pagopa/io-app/commit/fe14f08e597b4a943cdd8aa1b4f8aab509e13dd7))
+* **deps:** bump react-native-document-picker from 9.0.1 to 9.1.1 ([#5520](https://github.com/pagopa/io-app/issues/5520)) ([cb1af3e](https://github.com/pagopa/io-app/commit/cb1af3e236fc2e2826aa8e6a87adf01c65c1996c)), closes [rnmods/react-native-document-picker#698](https://github.com/rnmods/react-native-document-picker/issues/698) [rnmods/react-native-document-picker#689](https://github.com/rnmods/react-native-document-picker/issues/689) [rnmods/react-native-document-picker#654](https://github.com/rnmods/react-native-document-picker/issues/654) [rnmods/react-native-document-picker#660](https://github.com/rnmods/react-native-document-picker/issues/660) [rnmods/react-native-document-picker#666](https://github.com/rnmods/react-native-document-picker/issues/666) [rnmods/react-native-document-picker#667](https://github.com/rnmods/react-native-document-picker/issues/667) [rnmods/react-native-document-picker#670](https://github.com/rnmods/react-native-document-picker/issues/670) [rnmods/react-native-document-picker#686](https://github.com/rnmods/react-native-document-picker/issues/686) [rnmods/react-native-document-picker#687](https://github.com/rnmods/react-native-document-picker/issues/687) [rnmods/react-native-document-picker#689](https://github.com/rnmods/react-native-document-picker/issues/689) [#698](https://github.com/pagopa/io-app/issues/698) [#689](https://github.com/pagopa/io-app/issues/689) [#687](https://github.com/pagopa/io-app/issues/687) [#686](https://github.com/pagopa/io-app/issues/686) [#670](https://github.com/pagopa/io-app/issues/670) [#667](https://github.com/pagopa/io-app/issues/667) [#666](https://github.com/pagopa/io-app/issues/666) [#660](https://github.com/pagopa/io-app/issues/660)
+* **IT Wallet:** [[SIW-951](https://pagopa.atlassian.net/browse/SIW-951)] Add user payment methods in new wallet section ([#5639](https://github.com/pagopa/io-app/issues/5639)) ([86087cc](https://github.com/pagopa/io-app/commit/86087cc684685f5e6aa650201fd7bbf9645b1078))
+* **IT Wallet:** [[SIW-963](https://pagopa.atlassian.net/browse/SIW-963)] Add wallet cards onboarding screen ([#5648](https://github.com/pagopa/io-app/issues/5648)) ([902faae](https://github.com/pagopa/io-app/commit/902faae6b4f8ef8c47065abbd002dfa716acc8ed))
+* [[IOBP-615](https://pagopa.atlassian.net/browse/IOBP-615)] Add new `paymentCard` component to `PaymentsMethodDetailsScreen` ([#5665](https://github.com/pagopa/io-app/issues/5665)) ([afb6fd6](https://github.com/pagopa/io-app/commit/afb6fd6141260ec5caa94d3bda97b4b5f09c29e5))
+* [[IOPID-1720](https://pagopa.atlassian.net/browse/IOPID-1720)] Add features to OperationResultScreenContent ([#5666](https://github.com/pagopa/io-app/issues/5666)) ([4e9a9a9](https://github.com/pagopa/io-app/commit/4e9a9a9cabd389531b59e03db5b4f3e49973e5d2))
+
+## [2.57.0-rc.1](https://github.com/pagopa/io-app/compare/2.57.0-rc.0...2.57.0-rc.1) (2024-04-04)
+
+
+### Features
+
+* [[IOCOM-1172](https://pagopa.atlassian.net/browse/IOCOM-1172)] Update business logic for payment reminder on a message details screen with the new DS ([#5613](https://github.com/pagopa/io-app/issues/5613)) ([2a34b40](https://github.com/pagopa/io-app/commit/2a34b40a9eba194f8716824364d87d3610a77c2d))
+* [[IOCOM-873](https://pagopa.atlassian.net/browse/IOCOM-873)] IUN code on SEND message details with new DS ([#5643](https://github.com/pagopa/io-app/issues/5643)) ([4df62f9](https://github.com/pagopa/io-app/commit/4df62f9ca0e68987f03b841176dc6d736631df89))
+* [[IOCOM-882](https://pagopa.atlassian.net/browse/IOCOM-882)] New DS on a paid payment screen for a cancelled PN message ([#5621](https://github.com/pagopa/io-app/issues/5621)) ([6658689](https://github.com/pagopa/io-app/commit/6658689b8e4fd5ae592427d479d104ffaf854561))
+* [[IOPID-1541](https://pagopa.atlassian.net/browse/IOPID-1541),[IOPID-1542](https://pagopa.atlassian.net/browse/IOPID-1542)] Adopt the new DS to `RootedModal` ([#5641](https://github.com/pagopa/io-app/issues/5641)) ([8de52b5](https://github.com/pagopa/io-app/commit/8de52b5f2e2b10bca2290a728f0c50bf857c7d3f))
+* [[IOPID-1611](https://pagopa.atlassian.net/browse/IOPID-1611)] Add en copy on modal cie not supported ([#5652](https://github.com/pagopa/io-app/issues/5652)) ([5178c00](https://github.com/pagopa/io-app/commit/5178c005ab470f9a099425148de9323148243c9c))
+* [[IOPID-1611](https://pagopa.atlassian.net/browse/IOPID-1611)] Adopt new DS on CIE not supported modal ([#5647](https://github.com/pagopa/io-app/issues/5647)) ([65dfab0](https://github.com/pagopa/io-app/commit/65dfab0c201f93c52aef2530a949c48c4ce91540))
+
+
+### Bug Fixes
+
+* [[IOPID-1714](https://pagopa.atlassian.net/browse/IOPID-1714)] IOS crashes on EIC malformed URLs ([#5660](https://github.com/pagopa/io-app/issues/5660)) ([9c640a4](https://github.com/pagopa/io-app/commit/9c640a401d5c1c59c4c37d72e6fca544e18ad23f))
+* cgn test failing for new services FF ([#5649](https://github.com/pagopa/io-app/issues/5649)) ([5a78655](https://github.com/pagopa/io-app/commit/5a786552cf99ffd4b5a0a44579f3e8480c6a62c7))
+* Translations on Services Preference Screens and Identification Modal ([#5653](https://github.com/pagopa/io-app/issues/5653)) ([319706e](https://github.com/pagopa/io-app/commit/319706e8112ca67f8b86e3f74bcae10acda8bbe9))
+
+
+### Chores
+
+* [[IOBP-576](https://pagopa.atlassian.net/browse/IOBP-576)] Payment manual input A11y and UX fixes ([#5556](https://github.com/pagopa/io-app/issues/5556)) ([c4ee44c](https://github.com/pagopa/io-app/commit/c4ee44cd9f5a91531eb7de71ebb3e6bb065de84c))
+* [[IOBP-607](https://pagopa.atlassian.net/browse/IOBP-607)] Fix payments landing screen scrollview behavior ([#5656](https://github.com/pagopa/io-app/issues/5656)) ([03940ba](https://github.com/pagopa/io-app/commit/03940baef962d4af843726f8e804217cbad61205))
+* [[IOBP-610](https://pagopa.atlassian.net/browse/IOBP-610)] Refactor `payments` feature ([#5654](https://github.com/pagopa/io-app/issues/5654)) ([cc7aabe](https://github.com/pagopa/io-app/commit/cc7aabee62a53816854f9f6560be86005f651f08))
+* [[IOPAE-1046](https://pagopa.atlassian.net/browse/IOPAE-1046)] Add Service header to `ServiceDetailsScreen` ([#5633](https://github.com/pagopa/io-app/issues/5633)) ([6e6bb73](https://github.com/pagopa/io-app/commit/6e6bb73fedeb75dba83dc736407a4fd8abfe7f31))
+* [[IOPAE-1047](https://pagopa.atlassian.net/browse/IOPAE-1047)] Add service description to `ServiceDetailsScreen` ([#5640](https://github.com/pagopa/io-app/issues/5640)) ([8fbdc80](https://github.com/pagopa/io-app/commit/8fbdc8048c15aabd0d9f92824ab1f63d602548d2))
+* [[IOPAE-1066](https://pagopa.atlassian.net/browse/IOPAE-1066)] Service details failure state ([#5642](https://github.com/pagopa/io-app/issues/5642)) ([94271fc](https://github.com/pagopa/io-app/commit/94271fc149c100fd273994d8d9767bd72165ecf0))
+* **IT Wallet:** [[SIW-962](https://pagopa.atlassian.net/browse/SIW-962)] Add cards onboarding CTA in the new wallet section ([#5645](https://github.com/pagopa/io-app/issues/5645)) ([4a25d67](https://github.com/pagopa/io-app/commit/4a25d67d266c3ef8f0ecd319b619ce4fa33dfc82))
+
+## [2.57.0-rc.0](https://github.com/pagopa/io-app/compare/2.56.0-rc.3...2.57.0-rc.0) (2024-03-28)
+
+
+### Features
+
+* [[IOCOM-872](https://pagopa.atlassian.net/browse/IOCOM-872)] Base F24 section with new DS for SEND messages ([#5595](https://github.com/pagopa/io-app/issues/5595)) ([10a2f27](https://github.com/pagopa/io-app/commit/10a2f276b1e6fc7673c36af2a1c3fc92fe9806a0))
+* [[IOCOM-879](https://pagopa.atlassian.net/browse/IOCOM-879)] Bottom sheet for SEND's F24 with the new DS ([#5603](https://github.com/pagopa/io-app/issues/5603)) ([7271904](https://github.com/pagopa/io-app/commit/72719047270e00326d122519dc4f14de0bccf78b))
+* [[IOPID-1509](https://pagopa.atlassian.net/browse/IOPID-1509),[IOPID-1484](https://pagopa.atlassian.net/browse/IOPID-1484)] Integrate new DS on email insert/validation in onboarding flow and integrate new MP events ([#5632](https://github.com/pagopa/io-app/issues/5632)) ([2e0aeab](https://github.com/pagopa/io-app/commit/2e0aeab57ec1d7fe9bcc8ffd477f440ce8fe834c))
+* [[IOPID-1540](https://pagopa.atlassian.net/browse/IOPID-1540)] Adopt the new DS to `IdentificationModal` ([#5581](https://github.com/pagopa/io-app/issues/5581)) ([4d49bdb](https://github.com/pagopa/io-app/commit/4d49bdb114c1c82fc4733a97991cf5314b80a124))
+* [[IOPID-1566](https://pagopa.atlassian.net/browse/IOPID-1566),[IOPID-1567](https://pagopa.atlassian.net/browse/IOPID-1567),[IOPID-1570](https://pagopa.atlassian.net/browse/IOPID-1570)] Adopt the new DS to FL modals ([#5614](https://github.com/pagopa/io-app/issues/5614)) ([27146a9](https://github.com/pagopa/io-app/commit/27146a9bde2c467f1a8c8ff35fdbe0e6fc1913fd))
+* [[IOPLT-341](https://pagopa.atlassian.net/browse/IOPLT-341)] Rework e2e test job with matrix ([#5616](https://github.com/pagopa/io-app/issues/5616)) ([8892d5e](https://github.com/pagopa/io-app/commit/8892d5ec7a717889e83437c6ae92c315b1316bba))
+* [[IOPLT-359](https://pagopa.atlassian.net/browse/IOPLT-359)] Upgrade `react-native-svg` to 15.1.0 and `@pagopa/io-app-design-system` to 1.30.0 ([#5609](https://github.com/pagopa/io-app/issues/5609)) ([7d858bf](https://github.com/pagopa/io-app/commit/7d858bf260e3b7a09dbb05f8c7dec3e2bfb65b46))
+* [[IOPLT-384](https://pagopa.atlassian.net/browse/IOPLT-384)] Removes Mixpanel community library to use the official npm package ([#5601](https://github.com/pagopa/io-app/issues/5601)) ([93394d8](https://github.com/pagopa/io-app/commit/93394d803dfbb3ba5ad2be675b3801c669d1b2a2)), closes [/github.com/mixpanel/mixpanel-react-native/issues/89#issuecomment-904192090](https://github.com/pagopa//github.com/mixpanel/mixpanel-react-native/issues/89/issues/issuecomment-904192090)
+* [[IOPLT-394](https://pagopa.atlassian.net/browse/IOPLT-394)] Bump Xcode version used to build the app ([#5611](https://github.com/pagopa/io-app/issues/5611)) ([9352f2c](https://github.com/pagopa/io-app/commit/9352f2c063081514d59d5142073ce9e037ca5ae0))
+* **Firma con IO:** [[SFEQS-2137](https://pagopa.atlassian.net/browse/SFEQS-2137)] Make PDF annotations read-only on iOS ([#5599](https://github.com/pagopa/io-app/issues/5599)) ([eb1ec7e](https://github.com/pagopa/io-app/commit/eb1ec7e37d9cb0b97d0021b332e8fb2275ff24fb))
+
+
+### Bug Fixes
+
+* [[IOBP-593](https://pagopa.atlassian.net/browse/IOBP-593)] Fix back button in PSP selection screen during payment ([#5634](https://github.com/pagopa/io-app/issues/5634)) ([1ad5a34](https://github.com/pagopa/io-app/commit/1ad5a3434ea4a723a7a036516bd293a7f83eedfa))
+* update minor version on cocoapods ([#5638](https://github.com/pagopa/io-app/issues/5638)) ([ff938f8](https://github.com/pagopa/io-app/commit/ff938f8db2a34587cc7b209911e9368803fa1b54))
+* **Cross:** [[IOAPPX-263](https://pagopa.atlassian.net/browse/IOAPPX-263)] IOS crash during root modal hiding ([#5600](https://github.com/pagopa/io-app/issues/5600)) ([56ffbf8](https://github.com/pagopa/io-app/commit/56ffbf82ab444e6a8e1902f397050e590ce908f7))
+* **Cross:** [[IOAPPX-266](https://pagopa.atlassian.net/browse/IOAPPX-266)] Fix crash coming from background due to Native Base ([af4be64](https://github.com/pagopa/io-app/commit/af4be645c06318b5804dd841b7d206e4b141ff44))
+
+
+### Chores
+
+* [[IOPAE-1045](https://pagopa.atlassian.net/browse/IOPAE-1045)] Add new service details base screen ([#5607](https://github.com/pagopa/io-app/issues/5607)) ([9eddc94](https://github.com/pagopa/io-app/commit/9eddc945e25083f3dab8734dc0b941d255e886b1))
+* **IT Wallet:** [[SIW-952](https://pagopa.atlassian.net/browse/SIW-952)] Add CGN card in new wallet section ([#5626](https://github.com/pagopa/io-app/issues/5626)) ([aa74914](https://github.com/pagopa/io-app/commit/aa74914df4dd7e7560ce9e96e3b945c2e7833ee3))
+* [[IOBP-606](https://pagopa.atlassian.net/browse/IOBP-606)] Add new payments section ([#5635](https://github.com/pagopa/io-app/issues/5635)) ([d670a68](https://github.com/pagopa/io-app/commit/d670a6898bffddef1db05b5d86aceec8777e67af))
+* **Cross:** [[IOAPPX-256](https://pagopa.atlassian.net/browse/IOAPPX-256)] Remove local ToastProvider ([#5557](https://github.com/pagopa/io-app/issues/5557)) ([49e2fc0](https://github.com/pagopa/io-app/commit/49e2fc021d5886268d7d7e878722a3789db68818))
+* **Cross:** [[IOAPPX-270](https://pagopa.atlassian.net/browse/IOAPPX-270)] Update `io-app-design-system` to `1.31.0` ([#5637](https://github.com/pagopa/io-app/issues/5637)) ([df52001](https://github.com/pagopa/io-app/commit/df52001d953791aabb8862375b124c892970d52b))
+* **IT Wallet:** [[SIW-950](https://pagopa.atlassian.net/browse/SIW-950)] Add ID Pay initiatives cards in new wallet section ([#5625](https://github.com/pagopa/io-app/issues/5625)) ([c0df60f](https://github.com/pagopa/io-app/commit/c0df60f943c54037fb1be5c0ff5b27947dbd1a52))
+* **IT Wallet:** [[SIW-954](https://pagopa.atlassian.net/browse/SIW-954)] Add new wallet base UI components ([#5619](https://github.com/pagopa/io-app/issues/5619)) ([dc01ce1](https://github.com/pagopa/io-app/commit/dc01ce162b3d7b28bd981bd7f5bd9e34ea8cbb10))
+* [[IOBP-562](https://pagopa.atlassian.net/browse/IOBP-562)] Full state layout and basics for new payments page ([#5535](https://github.com/pagopa/io-app/issues/5535)) ([e9aa9a5](https://github.com/pagopa/io-app/commit/e9aa9a5b353eccc8a5542eac8059f485bcaf8fda))
+* [[IOBP-568](https://pagopa.atlassian.net/browse/IOBP-568)] Add email to payment outcome 17 description ([#5615](https://github.com/pagopa/io-app/issues/5615)) ([2a3d57d](https://github.com/pagopa/io-app/commit/2a3d57d86c12c74ff6284f87cd9c16c895e836dc))
+* [[IOBP-578](https://pagopa.atlassian.net/browse/IOBP-578),[IOBP-577](https://pagopa.atlassian.net/browse/IOBP-577)] Add dynamic payment method logos ([#5612](https://github.com/pagopa/io-app/issues/5612)) ([dd59b52](https://github.com/pagopa/io-app/commit/dd59b5272ff35c666e42de33babb130f64914250))
+* [[IOBP-592](https://pagopa.atlassian.net/browse/IOBP-592)] Updated wallet and e-commerce definitions ([#5618](https://github.com/pagopa/io-app/issues/5618)) ([9a968a0](https://github.com/pagopa/io-app/commit/9a968a0ab6a74a695fe9d49ebf8da671e4062b4c))
+* [[IOBP-597](https://pagopa.atlassian.net/browse/IOBP-597)] Add new payment card component ([#5608](https://github.com/pagopa/io-app/issues/5608)) ([6bdf41d](https://github.com/pagopa/io-app/commit/6bdf41d78436c6b6a5b64b433513351ae8a6ba39))
+* [[PE-564](https://pagopa.atlassian.net/browse/PE-564)] CGN Activation KO pages ([#5629](https://github.com/pagopa/io-app/issues/5629)) ([de6a9f7](https://github.com/pagopa/io-app/commit/de6a9f75f04501a3b2e34d83d664d3a9fbf0a5a4))
+* **release:** 2.56.0-rc.4 ([9604c2d](https://github.com/pagopa/io-app/commit/9604c2d04d8cc37e7049870670e43b29727f831f))
+* [[IOPAE-1058](https://pagopa.atlassian.net/browse/IOPAE-1058)] Add services local feature flag ([#5605](https://github.com/pagopa/io-app/issues/5605)) ([18e480e](https://github.com/pagopa/io-app/commit/18e480eb5668ab4cb8d21534f3bad7e0fde46e74))
+* **IT Wallet:** [[SIW-957](https://pagopa.atlassian.net/browse/SIW-957)] Add wallet card component for IdPay initiatives ([#5610](https://github.com/pagopa/io-app/issues/5610)) ([13b1983](https://github.com/pagopa/io-app/commit/13b1983cc97659b6e6d0df3d344dfe0d3888a232))
+
+## [2.56.0-rc.4](https://github.com/pagopa/io-app/compare/2.56.0-rc.3...2.56.0-rc.4) (2024-03-25)
+
+
+### Chores
+
+* update patches.md ([9361cfb](https://github.com/pagopa/io-app/commit/9361cfbaa4e51ecac4911594d0be49cb7200e763))
+
+## [2.56.0-rc.3](https://github.com/pagopa/io-app/compare/2.56.0-rc.2...2.56.0-rc.3) (2024-03-20)
+
+
+### Features
+
+* [[IOPID-1511](https://pagopa.atlassian.net/browse/IOPID-1511)] [[IOPID-1529](https://pagopa.atlassian.net/browse/IOPID-1529)] Add new DS in Services Preference Screen (Profile and Onboarding) ([#5544](https://github.com/pagopa/io-app/issues/5544)) ([9e0452a](https://github.com/pagopa/io-app/commit/9e0452ae870925acf854c06c8b3216cb58a8fb63))
+
+## [2.56.0-rc.2](https://github.com/pagopa/io-app/compare/2.56.0-rc.1...2.56.0-rc.2) (2024-03-20)
+
+
+### Chores
+
+* bump io-app-design-system from 1.28.0 to 1.28.1 ([57dc0b5](https://github.com/pagopa/io-app/commit/57dc0b556a8e96d4eaefd5a6359a6af5df517859))
+
+## [2.56.0-rc.1](https://github.com/pagopa/io-app/compare/2.56.0-rc.0...2.56.0-rc.1) (2024-03-19)
+
+
+### Features
+
+* [[IOCOM-856](https://pagopa.atlassian.net/browse/IOCOM-856)] Add CTAs to `MessageDetailsScreen` ([#5582](https://github.com/pagopa/io-app/issues/5582)) ([e524884](https://github.com/pagopa/io-app/commit/e524884e5e403c78c94ab81909abbad1f6c91504))
+* [[IOCOM-859](https://pagopa.atlassian.net/browse/IOCOM-859)] New DS payment button on standard message details ([#5583](https://github.com/pagopa/io-app/issues/5583)) ([3ae055f](https://github.com/pagopa/io-app/commit/3ae055f2863316077829ba757c392af4ce8af007))
+* [[IOPLT-367](https://pagopa.atlassian.net/browse/IOPLT-367)] Adds the local dark mode toggle for development purpose ([#5576](https://github.com/pagopa/io-app/issues/5576)) ([af772e5](https://github.com/pagopa/io-app/commit/af772e53f23309f44d2beaacb56822d4d511ca51))
+
+
+### Bug Fixes
+
+* [[IABT-1540](https://pagopa.atlassian.net/browse/IABT-1540)] Fix expired session handling in payment flow ([#5568](https://github.com/pagopa/io-app/issues/5568)) ([c2be1bd](https://github.com/pagopa/io-app/commit/c2be1bd4398ec8dd5f668976b6be7eeed2037198))
+* [[IOBP-596](https://pagopa.atlassian.net/browse/IOBP-596)] Fix unexpected behavior in wallet onboarding Webview on Android devices ([#5594](https://github.com/pagopa/io-app/issues/5594)) ([4e47fda](https://github.com/pagopa/io-app/commit/4e47fdad8bb6a6b2a7525455e4e0b186c325a2f8))
+* theme experimental switch doesn't rerender ([#5591](https://github.com/pagopa/io-app/issues/5591)) ([9b8f9f7](https://github.com/pagopa/io-app/commit/9b8f9f7d3458fd05a076796821235d995d0deee8))
+
+
+### Chores
+
+* [[IOBP-589](https://pagopa.atlassian.net/browse/IOBP-589)] Adapted new payment flow with new swagger definitions ([#5593](https://github.com/pagopa/io-app/issues/5593)) ([c64e253](https://github.com/pagopa/io-app/commit/c64e2538363a5865f92427c6fbbf7ac241a4949b))
+* **Cross:** [[IOAPPX-261](https://pagopa.atlassian.net/browse/IOAPPX-261)] Add the new `contrast` variant to `ButtonLink` in the DS section ([#5590](https://github.com/pagopa/io-app/issues/5590)) ([5a6b185](https://github.com/pagopa/io-app/commit/5a6b18512855b466cd48b2166315435f3d401db0))
+* **IT Wallet:** [[SIW-907](https://pagopa.atlassian.net/browse/SIW-907)] Add StrongBox Mixpanel tracking for Lollipop keys ([#5580](https://github.com/pagopa/io-app/issues/5580)) ([892f473](https://github.com/pagopa/io-app/commit/892f473ca2819de9eaf8b1e6fac5313bf75836da))
+* **IT Wallet:** [[SIW-940](https://pagopa.atlassian.net/browse/SIW-940)] Add new wallet section screen with empty state ([#5588](https://github.com/pagopa/io-app/issues/5588)) ([ad7c9e8](https://github.com/pagopa/io-app/commit/ad7c9e8432569c8eeb07e9c877cb560e237bb475))
+* **IT Wallet:** [[SIW-941](https://pagopa.atlassian.net/browse/SIW-941)] Update Pr title with SIW id ([#5587](https://github.com/pagopa/io-app/issues/5587)) ([f4f60b3](https://github.com/pagopa/io-app/commit/f4f60b345c11bd2d9a87d559c1cf2540602cc6cc))
+* **IT Wallet:** [[SIW-942](https://pagopa.atlassian.net/browse/SIW-942)] Add payments section redirect banner within wallet section ([#5589](https://github.com/pagopa/io-app/issues/5589)) ([e9624d0](https://github.com/pagopa/io-app/commit/e9624d0768f6de8a716ea5ac203f96fb28365284))
+* **IT Wallet:** [[SIW-948](https://pagopa.atlassian.net/browse/SIW-948)] Add reducers and selectors for cards in the new wallet section ([#5604](https://github.com/pagopa/io-app/issues/5604)) ([1f561f4](https://github.com/pagopa/io-app/commit/1f561f44622337b7c3b1652c07793c8b617fdfe3))
+* [[SIW-939](https://pagopa.atlassian.net/browse/SIW-939)] Add new wallet section FF ([#5584](https://github.com/pagopa/io-app/issues/5584)) ([5ce9adb](https://github.com/pagopa/io-app/commit/5ce9adb04d83e04bbaa7db7ca341c42c3059935c))
+
+## [2.56.0-rc.0](https://github.com/pagopa/io-app/compare/2.55.0-rc.3...2.56.0-rc.0) (2024-03-12)
+
+
+### Features
+
+* [[IOCOM-854](https://pagopa.atlassian.net/browse/IOCOM-854)] Add bottom sheet to display message contacts ([#5570](https://github.com/pagopa/io-app/issues/5570)) ([063fe4d](https://github.com/pagopa/io-app/commit/063fe4d3bbd306f5dcb3872d58ed7c42e7f51e76))
+* [[IOCOM-857](https://pagopa.atlassian.net/browse/IOCOM-857)] Payment data on message details ([#5575](https://github.com/pagopa/io-app/issues/5575)) ([32da27d](https://github.com/pagopa/io-app/commit/32da27d5e0a0cc98c14fb6b1a5138abd0ac658fb))
+* [[IOPID-1499](https://pagopa.atlassian.net/browse/IOPID-1499)] Adopt the new DS layout to splash screens ([#5554](https://github.com/pagopa/io-app/issues/5554)) ([a8b32f4](https://github.com/pagopa/io-app/commit/a8b32f47efe1d6402a96c9313b77aef69b70197a))
+* [[IOPID-1504](https://pagopa.atlassian.net/browse/IOPID-1504)] Adopt the new DS to `IdpSuccessfulAuthentication` ([#5547](https://github.com/pagopa/io-app/issues/5547)) ([7357f9f](https://github.com/pagopa/io-app/commit/7357f9f55f88e80b6c8bcd257bc5d1093e9eaecd))
+* [[IOPID-1512](https://pagopa.atlassian.net/browse/IOPID-1512)] New DS on onboarding finished thank you page ([#5562](https://github.com/pagopa/io-app/issues/5562)) ([c73b6a4](https://github.com/pagopa/io-app/commit/c73b6a4a2764e27cd379999e8786fee0c21d951d))
+* [[IOPLT-342](https://pagopa.atlassian.net/browse/IOPLT-342)] Bump react-native version to 0.70 ([#5506](https://github.com/pagopa/io-app/issues/5506)) ([033eec2](https://github.com/pagopa/io-app/commit/033eec2e547f364d4b6ada6a1004cdbfb59e9bb5))
+
+
+### Bug Fixes
+
+* [[IOBP-513](https://pagopa.atlassian.net/browse/IOBP-513)] Added loading state in onboarding list wallet ([#5456](https://github.com/pagopa/io-app/issues/5456)) ([6f11e44](https://github.com/pagopa/io-app/commit/6f11e4447fa8478a8aaa317115d52c04d9e902f8))
+* [[IOBP-582](https://pagopa.atlassian.net/browse/IOBP-582)] Behavior of the new payment go back with only one PSP ([#5572](https://github.com/pagopa/io-app/issues/5572)) ([3687d7e](https://github.com/pagopa/io-app/commit/3687d7e443ec050fd73edb471da6c5149d0872d6))
+* e2e cache restore issue ([#5585](https://github.com/pagopa/io-app/issues/5585)) ([6050eee](https://github.com/pagopa/io-app/commit/6050eeeeb96a1dcb41ef96db887404abd1abd608))
+
+
+### Chores
+
+* [[IOBP-574](https://pagopa.atlassian.net/browse/IOBP-574)] Adds `success` flag to payment's Zendesk support payload ([#5546](https://github.com/pagopa/io-app/issues/5546)) ([93120f0](https://github.com/pagopa/io-app/commit/93120f0704c0349193c7f05f5a712d31a84d2568))
+* **Cross:** [[IOAPPX-249](https://pagopa.atlassian.net/browse/IOAPPX-249)] Update `build.gradle` ([#5512](https://github.com/pagopa/io-app/issues/5512)) ([51ce2d0](https://github.com/pagopa/io-app/commit/51ce2d06fdbcb50a7b6c61077ecf573e5fde0fc8))
+* **Cross:** [[IOAPPX-257](https://pagopa.atlassian.net/browse/IOAPPX-257)] Upload iOS dSYM files as artifact ([#5574](https://github.com/pagopa/io-app/issues/5574)) ([c51c295](https://github.com/pagopa/io-app/commit/c51c295bc0c7360f5271f9478e60402e182a86aa))
+* [[IOBP-581](https://pagopa.atlassian.net/browse/IOBP-581)] Changed text into payment cancelled by user outcome screen ([#5573](https://github.com/pagopa/io-app/issues/5573)) ([63e1746](https://github.com/pagopa/io-app/commit/63e1746f30be410c440886571d42b77b32ff3d7f))
+
+## [2.55.0-rc.3](https://github.com/pagopa/io-app/compare/2.55.0-rc.2...2.55.0-rc.3) (2024-03-05)
+
+
+### Features
+
+* [[IOCOM-853](https://pagopa.atlassian.net/browse/IOCOM-853)] Add footer component to MessageDetailsScreen ([#5560](https://github.com/pagopa/io-app/issues/5560)) ([b3ad3e4](https://github.com/pagopa/io-app/commit/b3ad3e427dd21d0842af6ee8253b5dbda9222a6d))
+* [[IOCOM-855](https://pagopa.atlassian.net/browse/IOCOM-855)] Add bottom sheet to display message extra data ([#5565](https://github.com/pagopa/io-app/issues/5565)) ([dc46b30](https://github.com/pagopa/io-app/commit/dc46b301590cb6ce953cb76af52be8bf7b205b65))
+* [[IOCOM-858](https://pagopa.atlassian.net/browse/IOCOM-858)] Generic payment update for messages ([#5567](https://github.com/pagopa/io-app/issues/5567)) ([8557640](https://github.com/pagopa/io-app/commit/8557640d7ad7d420db0ddd5d8f8e21cf1a552018))
+* [[IOPID-1500](https://pagopa.atlassian.net/browse/IOPID-1500)] Adopt the new DS to `IngressScreen` ([#5548](https://github.com/pagopa/io-app/issues/5548)) ([7350615](https://github.com/pagopa/io-app/commit/7350615dc6586efed94c52f17eec7038536a56db))
+
+
+### Bug Fixes
+
+* [[IOPID-1630](https://pagopa.atlassian.net/browse/IOPID-1630)] EIC error component navigation object not found ([#5571](https://github.com/pagopa/io-app/issues/5571)) ([8cb08e6](https://github.com/pagopa/io-app/commit/8cb08e6e253cff229c74bbf163573569749b5db2))
+* **Firma con IO:** [[SFEQS-2132](https://pagopa.atlassian.net/browse/SFEQS-2132)] Rerender when starting from page 0 in PDF preview ([#5569](https://github.com/pagopa/io-app/issues/5569)) ([b3c521f](https://github.com/pagopa/io-app/commit/b3c521fadf6df98d4492d1d490036c2afcbc0de2))
+
+
+### Chores
+
+* **Cross:** [[IOAPPX-259](https://pagopa.atlassian.net/browse/IOAPPX-259)] Upgrade `io-app-design-system` to `v.1.25.1` ([#5566](https://github.com/pagopa/io-app/issues/5566)) ([67f8ba0](https://github.com/pagopa/io-app/commit/67f8ba0a77fbe7ae4ee7b4405fc80694d587db27))
+* 🇩🇪 updates ([#5564](https://github.com/pagopa/io-app/issues/5564)) ([46ec138](https://github.com/pagopa/io-app/commit/46ec13805bcedcdbb37743ed64819f8fc847fb57))
+* **Cross:** [[IOAPPX-254](https://pagopa.atlassian.net/browse/IOAPPX-254)] Add iOS smooth corners to specific components ([#5552](https://github.com/pagopa/io-app/issues/5552)) ([7d5f362](https://github.com/pagopa/io-app/commit/7d5f362ddb4cb946b5f66cb2d2399e9bdd3a7c0a))
+
+## [2.55.0-rc.2](https://github.com/pagopa/io-app/compare/2.55.0-rc.1...2.55.0-rc.2) (2024-03-01)
+
+
+### Bug Fixes
+
+* [[IOCOM-1154](https://pagopa.atlassian.net/browse/IOCOM-1154)] Fix for `undefined` value on `isDesignSystemEnabled` (and double navigation bar) ([#5563](https://github.com/pagopa/io-app/issues/5563)) ([7d4414d](https://github.com/pagopa/io-app/commit/7d4414d6f745f7f5f68f5587a9dfc76e53542a92))
+
+
+### Chores
+
+* [[IOBP-561](https://pagopa.atlassian.net/browse/IOBP-561)] Addition of new payments page playground ([#5529](https://github.com/pagopa/io-app/issues/5529)) ([09b490a](https://github.com/pagopa/io-app/commit/09b490a888a4db071dc4477a6e71e97e97d30dba))
+* [[IOBP-569](https://pagopa.atlassian.net/browse/IOBP-569)] Removed expiry date from payment summary module checkout ([#5542](https://github.com/pagopa/io-app/issues/5542)) ([3355897](https://github.com/pagopa/io-app/commit/33558975ad36a8a75c1e166d8d21b9a76960dd28))
+
+## [2.55.0-rc.1](https://github.com/pagopa/io-app/compare/2.55.0-rc.0...2.55.0-rc.1) (2024-03-01)
+
+
+### Features
+
+* [[IOPID-1501](https://pagopa.atlassian.net/browse/IOPID-1501)] Adapt LandingScreen to the new DS ([#5536](https://github.com/pagopa/io-app/issues/5536)) ([9c4c4d1](https://github.com/pagopa/io-app/commit/9c4c4d14cedbe79a2d3738ffc9ce0ad73e6cb402))
+
+
+### Bug Fixes
+
+* [[IOCOM-1154](https://pagopa.atlassian.net/browse/IOCOM-1154)] Fix for double navigation bar on message details ([#5559](https://github.com/pagopa/io-app/issues/5559)) ([3bad813](https://github.com/pagopa/io-app/commit/3bad813f1aeafe8117c76de95bfa134a6a24ce4b))
+
+## [2.55.0-rc.0](https://github.com/pagopa/io-app/compare/2.54.0-rc.1...2.55.0-rc.0) (2024-02-28)
+
+
+### Features
+
+* [[IOCOM-1051](https://pagopa.atlassian.net/browse/IOCOM-1051)] Native HTTP client ([#5550](https://github.com/pagopa/io-app/issues/5550)) ([910a39c](https://github.com/pagopa/io-app/commit/910a39cc3de5a168cc0843e2e5b84078685b95fb))
+* **Firma con IO:** [[SFEQS-2083](https://pagopa.atlassian.net/browse/SFEQS-2083)] Replace abort bottom sheet with alert ([#5425](https://github.com/pagopa/io-app/issues/5425)) ([9d33b39](https://github.com/pagopa/io-app/commit/9d33b39b0db8c318a4047ef2879cbc4d441bfacf))
+* [[IOCOM-848](https://pagopa.atlassian.net/browse/IOCOM-848)] Message content with new DS System ([#5519](https://github.com/pagopa/io-app/issues/5519)) ([1560834](https://github.com/pagopa/io-app/commit/1560834b6bc3d964b252172a8988388e45edccda))
+* [[IOCOM-881](https://pagopa.atlassian.net/browse/IOCOM-881)] Update message attachment preview ([#5537](https://github.com/pagopa/io-app/issues/5537)) ([541e5c7](https://github.com/pagopa/io-app/commit/541e5c72357fc857d1ef52b2154bf95ecd7fad04))
+
+
+### Bug Fixes
+
+* [[IOCOM-1154](https://pagopa.atlassian.net/browse/IOCOM-1154)] Fix for double navigation bar on message details ([#5555](https://github.com/pagopa/io-app/issues/5555)) ([86ba3d3](https://github.com/pagopa/io-app/commit/86ba3d3a9424c1fe4a693db020de56b1b8ddda7f))
+* **Firma con IO:** [[SFEQS-2123](https://pagopa.atlassian.net/browse/SFEQS-2123)] Loading spinner not following DS toggle ([#5545](https://github.com/pagopa/io-app/issues/5545)) ([106c7df](https://github.com/pagopa/io-app/commit/106c7df8e95e2c9d7c7dd982f75d6103b0d4a768))
+* **Firma con IO:** [[SFEQS-2124](https://pagopa.atlassian.net/browse/SFEQS-2124)] Wrong margins in FCI flow ([#5543](https://github.com/pagopa/io-app/issues/5543)) ([dd16b6b](https://github.com/pagopa/io-app/commit/dd16b6b1756fa6d282c38279cc763ae49642e6cc))
+* [[IOBP-542](https://pagopa.atlassian.net/browse/IOBP-542)] StatusBar background color for Android devices in wallet details screen ([#5539](https://github.com/pagopa/io-app/issues/5539)) ([fe64210](https://github.com/pagopa/io-app/commit/fe642100928e85557293d29617d172d23f35d6bc))
+
+
+### Chores
+
+* [[IOBP-498](https://pagopa.atlassian.net/browse/IOBP-498)] Adds stepper in payment's screens header ([#5525](https://github.com/pagopa/io-app/issues/5525)) ([d09e9b0](https://github.com/pagopa/io-app/commit/d09e9b08b452bcef8526483d2956c05b014a4fe9))
+* [[IOBP-503](https://pagopa.atlassian.net/browse/IOBP-503)] Add payment attempts tracking ([#5401](https://github.com/pagopa/io-app/issues/5401)) ([54f967a](https://github.com/pagopa/io-app/commit/54f967a30ecf44bc60a43a0d33f1b5175a13182a))
+* [[IOBP-530](https://pagopa.atlassian.net/browse/IOBP-530)] Removed CTA button in payment confirmation screen with one PSP element ([#5488](https://github.com/pagopa/io-app/issues/5488)) ([69af3d9](https://github.com/pagopa/io-app/commit/69af3d923da3e2e5bdfea47c97eb3cc78eed2761))
+* [[IOBP-566](https://pagopa.atlassian.net/browse/IOBP-566)] Renames `walletV3` feature to `payments` ([#5533](https://github.com/pagopa/io-app/issues/5533)) ([4e32f86](https://github.com/pagopa/io-app/commit/4e32f8679863b0ef1d080ef57a9cb18af6c50374))
+* [[IOBP-572](https://pagopa.atlassian.net/browse/IOBP-572)] Move currency symbol to the right of the amount ([#5540](https://github.com/pagopa/io-app/issues/5540)) ([691b194](https://github.com/pagopa/io-app/commit/691b194855b0e8cb6071f22d65fcc9fa27a8e097))
+* [[IOPID-1481](https://pagopa.atlassian.net/browse/IOPID-1481)], [[IOPID-1482](https://pagopa.atlassian.net/browse/IOPID-1482)] Countdown 60 seconds ([#5514](https://github.com/pagopa/io-app/issues/5514)) ([2befb34](https://github.com/pagopa/io-app/commit/2befb345ab417d41a0a33c84c522331f4bdbb64a))
+
+## [2.54.0-rc.1](https://github.com/pagopa/io-app/compare/2.54.0-rc.0...2.54.0-rc.1) (2024-02-21)
+
+
+### Features
+
+* [[IOCOM-1059](https://pagopa.atlassian.net/browse/IOCOM-1059)] Remove 'Open' CTA on Android attachment preview (new DS) ([#5523](https://github.com/pagopa/io-app/issues/5523)) ([eb0691f](https://github.com/pagopa/io-app/commit/eb0691f0eef1ae3bf352fb2dc4f86362896f1ba2))
+* [[IOCOM-851](https://pagopa.atlassian.net/browse/IOCOM-851)] Add calendar event for messages with `due_date` ([#5524](https://github.com/pagopa/io-app/issues/5524)) ([12acdbe](https://github.com/pagopa/io-app/commit/12acdbe5a9c0309a63050f2464ae43d412d7785b))
+* [[IOCOM-851](https://pagopa.atlassian.net/browse/IOCOM-851)] Removed view reference ([#5511](https://github.com/pagopa/io-app/issues/5511)) ([39a2611](https://github.com/pagopa/io-app/commit/39a26119bf56ac5f517628888998dbe3be741504))
+
+
+### Bug Fixes
+
+* HeaderFirstLevel glitching on tab change ([#5530](https://github.com/pagopa/io-app/issues/5530)) ([d69e091](https://github.com/pagopa/io-app/commit/d69e091d888cca94c8ce9717659ff295412e559d))
+* **Cross:** [[IOAPPX-250](https://pagopa.atlassian.net/browse/IOAPPX-250)] Crash when consuming safe area insets outside of navigation context ([#5522](https://github.com/pagopa/io-app/issues/5522)) ([5ce18c2](https://github.com/pagopa/io-app/commit/5ce18c2d58c26eb00cc5d460474c7453c543c939))
+
+
+### Chores
+
+* **deps:** bump ip from 1.1.5 to 1.1.9 ([#5532](https://github.com/pagopa/io-app/issues/5532)) ([afc36a7](https://github.com/pagopa/io-app/commit/afc36a7742ac872f12a454b711d791509bcf01ee))
+* [[IOBP-555](https://pagopa.atlassian.net/browse/IOBP-555)] Add payment outcome screen for the outcome 17 and 15 ([#5527](https://github.com/pagopa/io-app/issues/5527)) ([755926d](https://github.com/pagopa/io-app/commit/755926d48cf101286847f934b59c3173f7f24b3b))
+* **Cross:** [[IOAPPX-252](https://pagopa.atlassian.net/browse/IOAPPX-252)] Update IO app icon in the main README ([#5531](https://github.com/pagopa/io-app/issues/5531)) ([f29ae25](https://github.com/pagopa/io-app/commit/f29ae2520e841554c13ee2d094749067d66a977d))
+* [[IOBP-544](https://pagopa.atlassian.net/browse/IOBP-544)] Add `usePagoPaPayment` custom hook ([#5503](https://github.com/pagopa/io-app/issues/5503)) ([b7257ad](https://github.com/pagopa/io-app/commit/b7257ad29a0c7ccf0d39a87e22c0a08559286c41))
+* [[IOBP-549](https://pagopa.atlassian.net/browse/IOBP-549)] Add new wallet payments history tracking ([#5515](https://github.com/pagopa/io-app/issues/5515)) ([ca54cd8](https://github.com/pagopa/io-app/commit/ca54cd8352b97bd4fe50b91c37c29c3987d43fb2))
+* [[IOBP-552](https://pagopa.atlassian.net/browse/IOBP-552),[IOBP-556](https://pagopa.atlassian.net/browse/IOBP-556)] Additional onboarding outcome screen for BPay ([#5518](https://github.com/pagopa/io-app/issues/5518)) ([de192e6](https://github.com/pagopa/io-app/commit/de192e6e4e48303bc9a037bdcf39d866c918c365))
+* [[IOBP-557](https://pagopa.atlassian.net/browse/IOBP-557)] Handled 404 response status with empty list from user wallet list ([#5528](https://github.com/pagopa/io-app/issues/5528)) ([a78bbce](https://github.com/pagopa/io-app/commit/a78bbce292b7987cdbe742e2c074a3fe15bf43d8))
+* [[IOBP-558](https://pagopa.atlassian.net/browse/IOBP-558)] Handle BancomatPay in method details screen ([#5517](https://github.com/pagopa/io-app/issues/5517)) ([505662b](https://github.com/pagopa/io-app/commit/505662b72745b377188360371c3aa7513a3975c1))
+* [[IOPLT-327](https://pagopa.atlassian.net/browse/IOPLT-327)] Updates Zendesk npm package version ([#5489](https://github.com/pagopa/io-app/issues/5489)) ([1dce8d5](https://github.com/pagopa/io-app/commit/1dce8d5329f34cdb0dd8dad375ddc21a8d413f5d)), closes [pagopa/io-react-native-zendesk#30](https://github.com/pagopa/io-react-native-zendesk/issues/30)
+* **Cross:** [[IOAPPX-212](https://pagopa.atlassian.net/browse/IOAPPX-212)] Removes current route selector logic from header first level handler logic ([#5510](https://github.com/pagopa/io-app/issues/5510)) ([4400127](https://github.com/pagopa/io-app/commit/44001272b06441ba3644ba2c89ac8c083f2860c8))
+* **Cross:** [[IOAPPX-230](https://pagopa.atlassian.net/browse/IOAPPX-230)] Remove `datetimepicker` and `react-native-modal-datetime-picker` dependencies ([#5451](https://github.com/pagopa/io-app/issues/5451)) ([76c841d](https://github.com/pagopa/io-app/commit/76c841d7b9b574ea1dfe99c4bb166be313bf4582))
+
+## [2.54.0-rc.0](https://github.com/pagopa/io-app/compare/2.53.0-rc.1...2.54.0-rc.0) (2024-02-15)
+
+
+### Features
+
+* [[IOCOM-1011](https://pagopa.atlassian.net/browse/IOCOM-1011)] Accessibility on "Includes Attachments"-Icon on the new DS Message Details screen ([#5497](https://github.com/pagopa/io-app/issues/5497)) ([416aff7](https://github.com/pagopa/io-app/commit/416aff73e508ad2bf9950f20c30cafdca3eb4c25))
+* [[IOCOM-1012](https://pagopa.atlassian.net/browse/IOCOM-1012)] Better accessibility on PDF preview with the new DS system ([#5494](https://github.com/pagopa/io-app/issues/5494)) ([7689647](https://github.com/pagopa/io-app/commit/76896474e9d982178af94e06fa1351ff6b8b5173))
+* [[IOCOM-1029](https://pagopa.atlassian.net/browse/IOCOM-1029)] Add support for multi image in the detail of a message ([#5508](https://github.com/pagopa/io-app/issues/5508)) ([69c9be1](https://github.com/pagopa/io-app/commit/69c9be10f76ac84ff4447dd9a4c03461231d3405))
+* [[IOCOM-849](https://pagopa.atlassian.net/browse/IOCOM-849),[IOCOM-850](https://pagopa.atlassian.net/browse/IOCOM-850)] Add `MessageDetailsComponent` in the detail of a message ([#5495](https://github.com/pagopa/io-app/issues/5495)) ([2501d29](https://github.com/pagopa/io-app/commit/2501d2953cd2bfe798af69c98763279113a302fa))
+* [[IOCOM-851](https://pagopa.atlassian.net/browse/IOCOM-851)] Add `Alert` in the detail of a message that contains an expiring payment ([#5507](https://github.com/pagopa/io-app/issues/5507)) ([1e87608](https://github.com/pagopa/io-app/commit/1e876081caa635aebf6eb2db121ad3963153e86e))
+* [[IOCOM-862](https://pagopa.atlassian.net/browse/IOCOM-862),[IOCOM-863](https://pagopa.atlassian.net/browse/IOCOM-863)] New DS on the message's attachments list ([#5485](https://github.com/pagopa/io-app/issues/5485)) ([f06e592](https://github.com/pagopa/io-app/commit/f06e5921ca8652227b82da640a8140b29712331e))
+
+
+### Bug Fixes
+
+* [[IABT-1530](https://pagopa.atlassian.net/browse/IABT-1530)] Enabled header shown property on Transaction details screens ([#5493](https://github.com/pagopa/io-app/issues/5493)) ([333a40e](https://github.com/pagopa/io-app/commit/333a40e845440b27a7bbf38843b8743409d89082))
+* [[IOBP-460](https://pagopa.atlassian.net/browse/IOBP-460),[IOBP-461](https://pagopa.atlassian.net/browse/IOBP-461),[IOBP-463](https://pagopa.atlassian.net/browse/IOBP-463)] A11y for list item info components into transaction detail screen ([#5478](https://github.com/pagopa/io-app/issues/5478)) ([a49be25](https://github.com/pagopa/io-app/commit/a49be25c9a5766e59067801830a89a2b1095d320))
+* [[IOCOM-1091](https://pagopa.atlassian.net/browse/IOCOM-1091)] Fix for duplicate message in messages list ([#5509](https://github.com/pagopa/io-app/issues/5509)) ([cb14f8a](https://github.com/pagopa/io-app/commit/cb14f8ad0191d9ae66356bda5ef1dc67e39b5602))
+* [[IOPID-1423](https://pagopa.atlassian.net/browse/IOPID-1423),[IOPID-1439](https://pagopa.atlassian.net/browse/IOPID-1439)] Fix double MP event tracking ([#5496](https://github.com/pagopa/io-app/issues/5496)) ([fbd8cb3](https://github.com/pagopa/io-app/commit/fbd8cb3949d4f330949a65ad3d80e35044ef4129))
+* [[IOPID-1546](https://pagopa.atlassian.net/browse/IOPID-1546)] Fix services refresh token error ([#5505](https://github.com/pagopa/io-app/issues/5505)) ([366f208](https://github.com/pagopa/io-app/commit/366f2088b1f73eea784dd1f2ef0720088d054191))
+
+
+### Chores
+
+* **Cross:** [[IOAPPX-234](https://pagopa.atlassian.net/browse/IOAPPX-234)] Remove `@react-native-picker/picker` dependency ([#5454](https://github.com/pagopa/io-app/issues/5454)) ([3e98819](https://github.com/pagopa/io-app/commit/3e9881974908a2932320e45260b517b8827c8101))
+* **Cross:** [[IOAPPX-241](https://pagopa.atlassian.net/browse/IOAPPX-241)] Replace legacy `FooterWithButtons` in the `DownloadProfileData` screen ([#5472](https://github.com/pagopa/io-app/issues/5472)) ([027d442](https://github.com/pagopa/io-app/commit/027d442e945d7b9784cdeb5cbfc00df9b91f39b5))
+* **Cross:** [[IOAPPX-242](https://pagopa.atlassian.net/browse/IOAPPX-242)] Replace legacy `FooterWithButtons` in the 'Remove account' flow ([#5470](https://github.com/pagopa/io-app/issues/5470)) ([6cd3b34](https://github.com/pagopa/io-app/commit/6cd3b348064d277ed1fb5138ae8d45521ce84ec5))
+* **Cross:** [[IOAPPX-243](https://pagopa.atlassian.net/browse/IOAPPX-243)] Remove `native-base` components from private screens + Add new header managed by `react-navigation` ([#5482](https://github.com/pagopa/io-app/issues/5482)) ([912604e](https://github.com/pagopa/io-app/commit/912604e5f2723c21f15cd28a3a634e45dc3d5da6))
+* **Cross:** [[IOAPPX-245](https://pagopa.atlassian.net/browse/IOAPPX-245)] Remove `hound.yml` ([#5500](https://github.com/pagopa/io-app/issues/5500)) ([96ac530](https://github.com/pagopa/io-app/commit/96ac5307c65e8d3099b8284329b997abe04691f5))
+* **Cross:** [[IOAPPX-247](https://pagopa.atlassian.net/browse/IOAPPX-247)] Remove `_editorconfig` ([#5501](https://github.com/pagopa/io-app/issues/5501)) ([932b8bf](https://github.com/pagopa/io-app/commit/932b8bfbfd2e4893466f54dd6012f0ca6af7ff92))
+* [[IOBP-525](https://pagopa.atlassian.net/browse/IOBP-525)] Fix payment authorization webview on Android devices ([#5474](https://github.com/pagopa/io-app/issues/5474)) ([d67f85f](https://github.com/pagopa/io-app/commit/d67f85f14bd5cb415e1779c91899aeb56b64031d))
+* [[IOBP-533](https://pagopa.atlassian.net/browse/IOBP-533)] Navigation to payment confirm screen if method with only one PSP ([#5487](https://github.com/pagopa/io-app/issues/5487)) ([7e7c2c9](https://github.com/pagopa/io-app/commit/7e7c2c9336ecd47eba953f9f0d2999063895496c))
+* [[IOBP-535](https://pagopa.atlassian.net/browse/IOBP-535)] Added german language for iOS app ([#5491](https://github.com/pagopa/io-app/issues/5491)) ([ae5ffeb](https://github.com/pagopa/io-app/commit/ae5ffeb80012092caf87890c5b0a98a01593f3d2))
+* [[IOBP-546](https://pagopa.atlassian.net/browse/IOBP-546)] Fix payment E2E tests ([#5498](https://github.com/pagopa/io-app/issues/5498)) ([eae6e83](https://github.com/pagopa/io-app/commit/eae6e833dd5c7201f4ee061d87ee67220c53fcd4))
+* [[IOPID-1416](https://pagopa.atlassian.net/browse/IOPID-1416)] Fix logic to show toast error ([#5502](https://github.com/pagopa/io-app/issues/5502)) ([50ad939](https://github.com/pagopa/io-app/commit/50ad93995196c4228b1691748fb99dcc0c79548f))
+* [[IOPID-1448](https://pagopa.atlassian.net/browse/IOPID-1448)] Fix double profile upsert ([#5486](https://github.com/pagopa/io-app/issues/5486)) ([0d72c2a](https://github.com/pagopa/io-app/commit/0d72c2af4330af9a6ea53cd5984b80356766c6df)), closes [/github.com/pagopa/io-app/pull/5486/files#diff-a48057473d6b62f0ea5bfaf0ed2ba3e8a390fdef1e1e3ff7e9760fd8c4a86ff6](https://github.com/pagopa//github.com/pagopa/io-app/pull/5486/files/issues/diff-a48057473d6b62f0ea5bfaf0ed2ba3e8a390fdef1e1e3ff7e9760fd8c4a86ff6) [/github.com/pagopa/io-app/pull/5486/files#diff-8a5b2f3967d681b976fe673762bd1061f5b430130c880c1195b76af06362cf31](https://github.com/pagopa//github.com/pagopa/io-app/pull/5486/files/issues/diff-8a5b2f3967d681b976fe673762bd1061f5b430130c880c1195b76af06362cf31)
+* **Cross:** [[IOAPPX-218](https://pagopa.atlassian.net/browse/IOAPPX-218)] Add the new `Titillium Sans Pro` typeface to the codebase ([#5459](https://github.com/pagopa/io-app/issues/5459)) ([20e54f4](https://github.com/pagopa/io-app/commit/20e54f4925c5bd460e49f6662d0f58d792d0317d))
+* **Cross:** [[IOAPPX-246](https://pagopa.atlassian.net/browse/IOAPPX-246)] Update `Podfile.lock` for `io-react-native-login-utils` ([#5499](https://github.com/pagopa/io-app/issues/5499)) ([e7ed331](https://github.com/pagopa/io-app/commit/e7ed3310efecc62b68b2d2b77808ffee42996496))
+
+## [2.53.0-rc.1](https://github.com/pagopa/io-app/compare/2.53.0-rc.0...2.53.0-rc.1) (2024-02-06)
+
+
+### Features
+
+* **Firma con IO:** [[SFEQS-2071](https://pagopa.atlassian.net/browse/SFEQS-2071)] Update `Firma con IO` with new DS components ([#5377](https://github.com/pagopa/io-app/issues/5377)) ([e34d79d](https://github.com/pagopa/io-app/commit/e34d79db5afdb45c5c91247c70afc54f911534aa))
+* [[IOCOM-867](https://pagopa.atlassian.net/browse/IOCOM-867)] Add service info in MessageDetailsScreen ([#5461](https://github.com/pagopa/io-app/issues/5461)) ([b2ea541](https://github.com/pagopa/io-app/commit/b2ea541609ff95afef6be15bb09cbffa682860fa))
+
+
+### Bug Fixes
+
+* [[IOBP-458](https://pagopa.atlassian.net/browse/IOBP-458),[IOBP-459](https://pagopa.atlassian.net/browse/IOBP-459)] Added accessibility label to the RNavScreenWithLargeHeader component ([#5467](https://github.com/pagopa/io-app/issues/5467)) ([a57d5e2](https://github.com/pagopa/io-app/commit/a57d5e2342be768bea5f3d5a92ae254dbd3e3725))
+* [[IOPID-1436](https://pagopa.atlassian.net/browse/IOPID-1436)], [[IOPID-1453](https://pagopa.atlassian.net/browse/IOPID-1453)] Delete helper button and header title on email validate screen and add logic to show support buttons in faq screen ([#5484](https://github.com/pagopa/io-app/issues/5484)) ([00743fd](https://github.com/pagopa/io-app/commit/00743fd5708ce4af62039ca7f6422bd22dbd747e)), closes [/github.com/pagopa/io-app/blob/6c076a1fee25c0a0853644d63aa894ff26854aa3/ts/sagas/startup.ts#L492](https://github.com/pagopa//github.com/pagopa/io-app/blob/6c076a1fee25c0a0853644d63aa894ff26854aa3/ts/sagas/startup.ts/issues/L492)
+* align podfile.lock io-react-native-zendesk version ([#5483](https://github.com/pagopa/io-app/issues/5483)) ([6c076a1](https://github.com/pagopa/io-app/commit/6c076a1fee25c0a0853644d63aa894ff26854aa3))
+
+
+### Chores
+
+* **Cross:** [[IOAPPX-210](https://pagopa.atlassian.net/browse/IOAPPX-210)] Upgrade `react-navigation` to v6 ([#5415](https://github.com/pagopa/io-app/issues/5415)) ([f730e55](https://github.com/pagopa/io-app/commit/f730e55d493df6230319494fad43626bf2070a98))
+* [[IOBP-529](https://pagopa.atlassian.net/browse/IOBP-529)] Retrieve payments methods list from eCommerce client endpoint ([#5479](https://github.com/pagopa/io-app/issues/5479)) ([63fd1c2](https://github.com/pagopa/io-app/commit/63fd1c2a73bd3408996cd35d02e145e9e195579a))
+* 🇩🇪 language adjustments ([#5490](https://github.com/pagopa/io-app/issues/5490)) ([957e245](https://github.com/pagopa/io-app/commit/957e2455330caae4af29f3a33bda6b7360ffb1d2))
+
## [2.53.0-rc.0](https://github.com/pagopa/io-app/compare/2.52.0-rc.0...2.53.0-rc.0) (2024-02-02)
diff --git a/Gemfile b/Gemfile
index 5afbf1ed051..956c32566e2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -4,5 +4,6 @@ source "https://rubygems.org"
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
ruby '>=2.6.10'
-gem "cocoapods", ">= 1.12.1"
+gem "cocoapods", ">= 1.15.2"
gem "fastlane", "~> 2.212.2"
+gem 'activesupport', '>= 6.1.7.3', '< 7.1.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 83c42a47175..0079aaf3314 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,14 +1,16 @@
GEM
remote: https://rubygems.org/
specs:
- CFPropertyList (3.0.6)
+ CFPropertyList (3.0.7)
+ base64
+ nkf
rexml
- activesupport (7.0.7.2)
+ activesupport (7.0.8.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
- addressable (2.8.1)
+ addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
@@ -32,13 +34,14 @@ GEM
aws-sigv4 (1.8.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
+ base64 (0.2.0)
claide (1.1.0)
- cocoapods (1.12.1)
+ cocoapods (1.15.2)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
- cocoapods-core (= 1.12.1)
+ cocoapods-core (= 1.15.2)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
- cocoapods-downloader (>= 1.6.0, < 2.0)
+ cocoapods-downloader (>= 2.1, < 3.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
cocoapods-search (>= 1.0.0, < 2.0)
cocoapods-trunk (>= 1.6.0, < 2.0)
@@ -50,8 +53,8 @@ GEM
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 2.3.0, < 3.0)
- xcodeproj (>= 1.21.0, < 2.0)
- cocoapods-core (1.12.1)
+ xcodeproj (>= 1.23.0, < 2.0)
+ cocoapods-core (1.15.2)
activesupport (>= 5.0, < 8)
addressable (~> 2.8)
algoliasearch (~> 1.0)
@@ -62,7 +65,7 @@ GEM
public_suffix (~> 4.0)
typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5)
- cocoapods-downloader (1.6.3)
+ cocoapods-downloader (2.1)
cocoapods-plugins (1.0.0)
nap
cocoapods-search (1.0.1)
@@ -74,7 +77,7 @@ GEM
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
- concurrent-ruby (1.2.2)
+ concurrent-ruby (1.2.3)
declarative (0.0.20)
digest-crc (0.6.5)
rake (>= 12.0.0, < 14.0.0)
@@ -153,7 +156,7 @@ GEM
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
- ffi (1.15.5)
+ ffi (1.16.3)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
@@ -198,14 +201,14 @@ GEM
http-cookie (1.0.5)
domain_name (~> 0.5)
httpclient (2.8.3)
- i18n (1.14.1)
+ i18n (1.14.4)
concurrent-ruby (~> 1.0)
jmespath (1.6.2)
- json (2.6.3)
+ json (2.7.1)
jwt (2.7.1)
mini_magick (4.12.0)
mini_mime (1.1.5)
- minitest (5.19.0)
+ minitest (5.22.3)
molinillo (0.8.0)
multi_json (1.15.0)
multipart-post (2.0.0)
@@ -213,6 +216,7 @@ GEM
nap (1.1.0)
naturally (2.2.1)
netrc (0.11.0)
+ nkf (0.2.0)
optparse (0.1.1)
os (1.1.4)
plist (3.7.1)
@@ -223,7 +227,7 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
- rexml (3.2.5)
+ rexml (3.2.6)
rouge (2.0.7)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
@@ -245,14 +249,14 @@ GEM
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
- typhoeus (1.4.0)
+ typhoeus (1.4.1)
ethon (>= 0.9.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uber (0.1.0)
unicode-display_width (1.8.0)
word_wrap (1.0.0)
- xcodeproj (1.22.0)
+ xcodeproj (1.24.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
@@ -268,7 +272,8 @@ PLATFORMS
ruby
DEPENDENCIES
- cocoapods (>= 1.12.1)
+ activesupport (>= 6.1.7.3, < 7.1.0)
+ cocoapods (>= 1.15.2)
fastlane (~> 2.212.2)
RUBY VERSION
diff --git a/README.md b/README.md
index 8c1c79dec8c..27ba14798fd 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
IO - The public services app
diff --git a/_editorconfig b/_editorconfig
deleted file mode 100644
index 7c286132fe9..00000000000
--- a/_editorconfig
+++ /dev/null
@@ -1,3 +0,0 @@
-# Windows files
-[*.bat]
-end_of_line = crlf
diff --git a/android/app/build.gradle b/android/app/build.gradle
index d8c0b7bb2ed..c57ea58be7f 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -7,6 +7,7 @@ apply plugin: "com.android.application"
apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"
import com.android.build.OutputFile
+import org.apache.tools.ant.taskdefs.condition.Os
/**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
@@ -144,26 +145,18 @@ android {
applicationId "it.pagopa.io.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 100154794
- versionName "2.53.0.0"
+ versionCode 100154809
+ versionName "2.58.0.0"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
if (isNewArchitectureEnabled()) {
- // We configure the NDK build only if you decide to opt-in for the New Architecture.
+ // We configure the CMake build only if you decide to opt-in for the New Architecture.
externalNativeBuild {
- ndkBuild {
- arguments "APP_PLATFORM=android-21",
- "APP_STL=c++_shared",
- "NDK_TOOLCHAIN_VERSION=clang",
- "GENERATED_SRC_DIR=$buildDir/generated/source",
- "PROJECT_BUILD_DIR=$buildDir",
- "REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
- "REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build",
- "NODE_MODULES_DIR=$rootDir/../node_modules"
- cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
- cppFlags "-std=c++17"
- // Make sure this target name is the same you specify inside the
- // src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
- targets "ioapp_appmodules"
+ cmake {
+ arguments "-DPROJECT_BUILD_DIR=$buildDir",
+ "-DREACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
+ "-DREACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build",
+ "-DNODE_MODULES_DIR=$rootDir/../node_modules",
+ "-DANDROID_STL=c++_shared"
}
}
if (!enableSeparateBuildPerCPUArchitecture) {
@@ -179,8 +172,8 @@ android {
if (isNewArchitectureEnabled()) {
// We configure the NDK build only if you decide to opt-in for the New Architecture.
externalNativeBuild {
- ndkBuild {
- path "$projectDir/src/main/jni/Android.mk"
+ cmake {
+ path "$projectDir/src/main/jni/CMakeLists.txt"
}
}
def reactAndroidProjectDir = project(':ReactAndroid').projectDir
@@ -201,15 +194,15 @@ android {
preDebugBuild.dependsOn(packageReactNdkDebugLibs)
preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
// Due to a bug inside AGP, we have to explicitly set a dependency
- // between configureNdkBuild* tasks and the preBuild tasks.
+ // between configureCMakeDebug* tasks and the preBuild tasks.
// This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
- configureNdkBuildRelease.dependsOn(preReleaseBuild)
- configureNdkBuildDebug.dependsOn(preDebugBuild)
+ configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild)
+ configureCMakeDebug.dependsOn(preDebugBuild)
reactNativeArchitectures().each { architecture ->
- tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure {
+ tasks.findByName("configureCMakeDebug[${architecture}]")?.configure {
dependsOn("preDebugBuild")
}
- tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure {
+ tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure {
dependsOn("preReleaseBuild")
}
}
@@ -334,13 +327,13 @@ dependencies {
}
}
}
- implementation project(':@react-native-community_datetimepicker')
implementation project(':react-native-fingerprint-scanner')
implementation project(':react-native-art')
implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.41"
implementation('com.google.firebase:firebase-iid:21.1.0') {
because "Firebase messaging 22.0.0 removes Firebase Instance ID API but out current version of the mixpanel sdk requires it https://github.com/mixpanel/mixpanel-android/issues/744 https://firebase.google.com/support/release-notes/android#messaging_v22-0-0"
}
+ implementation "androidx.constraintlayout:constraintlayout:2.1.4"
}
// Run this once to be able to run the application with BUCK
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-Black.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-Black.otf
new file mode 100644
index 00000000000..3cd95e37eaf
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-Black.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-BlackItalic.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-BlackItalic.otf
new file mode 100644
index 00000000000..a6fd8bc8af7
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-BlackItalic.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-Bold.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-Bold.otf
new file mode 100644
index 00000000000..3d774ef1a03
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-Bold.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-BoldItalic.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-BoldItalic.otf
new file mode 100644
index 00000000000..bdf1aaedfc9
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-BoldItalic.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-Italic.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-Italic.otf
new file mode 100644
index 00000000000..51f58e72f82
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-Italic.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-Light.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-Light.otf
new file mode 100644
index 00000000000..c75c48c9763
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-Light.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-LightItalic.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-LightItalic.otf
new file mode 100644
index 00000000000..3146a822c96
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-LightItalic.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-Regular.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-Regular.otf
new file mode 100644
index 00000000000..4bd7bcf2d5a
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-Regular.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-Semibold.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-Semibold.otf
new file mode 100644
index 00000000000..fc7186dda82
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-Semibold.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-SemiboldItalic.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-SemiboldItalic.otf
new file mode 100644
index 00000000000..8242da46cf5
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-SemiboldItalic.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-Thin.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-Thin.otf
new file mode 100644
index 00000000000..e9f73560c42
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-Thin.otf differ
diff --git a/android/app/src/main/assets/fonts/TitilliumSansPro-ThinItalic.otf b/android/app/src/main/assets/fonts/TitilliumSansPro-ThinItalic.otf
new file mode 100644
index 00000000000..869febf3eea
Binary files /dev/null and b/android/app/src/main/assets/fonts/TitilliumSansPro-ThinItalic.otf differ
diff --git a/android/app/src/main/jni/Android.mk b/android/app/src/main/jni/Android.mk
deleted file mode 100644
index ebb715535f1..00000000000
--- a/android/app/src/main/jni/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-THIS_DIR := $(call my-dir)
-include $(REACT_ANDROID_DIR)/Android-prebuilt.mk
-# If you wish to add a custom TurboModule or Fabric component in your app you
-# will have to include the following autogenerated makefile.
-# include $(GENERATED_SRC_DIR)/codegen/jni/Android.mk
-include $(CLEAR_VARS)
-LOCAL_PATH := $(THIS_DIR)
-# You can customize the name of your application .so file here.
-LOCAL_MODULE := ioapp_appmodules
-LOCAL_C_INCLUDES := $(LOCAL_PATH)
-LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
-LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
-# If you wish to add a custom TurboModule or Fabric component in your app you
-# will have to uncomment those lines to include the generated source
-# files from the codegen (placed in $(GENERATED_SRC_DIR)/codegen/jni)
-#
-# LOCAL_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
-# LOCAL_SRC_FILES += $(wildcard $(GENERATED_SRC_DIR)/codegen/jni/*.cpp)
-# LOCAL_EXPORT_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
-# Here you should add any native library you wish to depend on.
-LOCAL_SHARED_LIBRARIES := \
- libfabricjni \
- libfbjni \
- libfolly_runtime \
- libglog \
- libjsi \
- libreact_codegen_rncore \
- libreact_debug \
- libreact_nativemodule_core \
- libreact_render_componentregistry \
- libreact_render_core \
- libreact_render_debug \
- libreact_render_graphics \
- librrc_view \
- libruntimeexecutor \
- libturbomodulejsijni \
- libyoga
-LOCAL_CFLAGS := -DLOG_TAG=\"ReactNative\" -fexceptions -frtti -std=c++17 -Wall
-include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file
diff --git a/android/app/src/main/jni/CMakeLists.txt b/android/app/src/main/jni/CMakeLists.txt
new file mode 100644
index 00000000000..0dd7f25118c
--- /dev/null
+++ b/android/app/src/main/jni/CMakeLists.txt
@@ -0,0 +1,7 @@
+cmake_minimum_required(VERSION 3.13)
+
+# Define the library name here.
+project(ioapp_appmodules)
+
+# This file includes all the necessary to let you build your application with the New Architecture.
+include(${REACT_ANDROID_DIR}/cmake-utils/ReactNative-application.cmake)
diff --git a/android/app/src/main/jni/MainApplicationModuleProvider.cpp b/android/app/src/main/jni/MainApplicationModuleProvider.cpp
index 640a5baac65..1e04d15b34f 100644
--- a/android/app/src/main/jni/MainApplicationModuleProvider.cpp
+++ b/android/app/src/main/jni/MainApplicationModuleProvider.cpp
@@ -1,9 +1,10 @@
#include "MainApplicationModuleProvider.h"
+#include
#include
namespace facebook {
namespace react {
std::shared_ptr MainApplicationModuleProvider(
- const std::string moduleName,
+ const std::string &moduleName,
const JavaTurboModule::InitParams ¶ms) {
// Here you can provide your own module provider for TurboModules coming from
// either your application or from external libraries. The approach to follow
@@ -14,6 +15,12 @@ std::shared_ptr MainApplicationModuleProvider(
// return module;
// }
// return rncore_ModuleProvider(moduleName, params);
+ // Module providers autolinked by RN CLI
+ auto rncli_module = rncli_ModuleProvider(moduleName, params);
+ if (rncli_module != nullptr) {
+ return rncli_module;
+ }
+
return rncore_ModuleProvider(moduleName, params);
}
} // namespace react
diff --git a/android/app/src/main/jni/MainApplicationModuleProvider.h b/android/app/src/main/jni/MainApplicationModuleProvider.h
index f89ddbd02d5..4515c40bb83 100644
--- a/android/app/src/main/jni/MainApplicationModuleProvider.h
+++ b/android/app/src/main/jni/MainApplicationModuleProvider.h
@@ -5,7 +5,7 @@
namespace facebook {
namespace react {
std::shared_ptr MainApplicationModuleProvider(
- const std::string moduleName,
+ const std::string &moduleName,
const JavaTurboModule::InitParams ¶ms);
} // namespace react
} // namespace facebook
\ No newline at end of file
diff --git a/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp b/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp
index decb4e17e00..8439888b532 100644
--- a/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp
+++ b/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp
@@ -18,19 +18,19 @@ void MainApplicationTurboModuleManagerDelegate::registerNatives() {
}
std::shared_ptr
MainApplicationTurboModuleManagerDelegate::getTurboModule(
- const std::string name,
- const std::shared_ptr jsInvoker) {
+ const std::string &name,
+ const std::shared_ptr &jsInvoker) {
// Not implemented yet: provide pure-C++ NativeModules here.
return nullptr;
}
std::shared_ptr
MainApplicationTurboModuleManagerDelegate::getTurboModule(
- const std::string name,
+ const std::string &name,
const JavaTurboModule::InitParams ¶ms) {
return MainApplicationModuleProvider(name, params);
}
bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule(
- std::string name) {
+ const std::string n&ame) {
return getTurboModule(name, nullptr) != nullptr ||
getTurboModule(name, {.moduleName = name}) != nullptr;
}
diff --git a/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h b/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h
index 3dc56868f80..c31481973d3 100644
--- a/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h
+++ b/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h
@@ -15,16 +15,16 @@ class MainApplicationTurboModuleManagerDelegate
static jni::local_ref initHybrid(jni::alias_ref);
static void registerNatives();
std::shared_ptr getTurboModule(
- const std::string name,
- const std::shared_ptr jsInvoker) override;
+ const std::string &name,
+ const std::shared_ptr &jsInvoker) override;
std::shared_ptr getTurboModule(
- const std::string name,
+ const std::string &name,
const JavaTurboModule::InitParams ¶ms) override;
/**
* Test-only method. Allows user to verify whether a TurboModule can be
* created by instances of this class.
*/
- bool canCreateTurboModule(std::string name);
+ bool canCreateTurboModule(const std::string &name);
};
} // namespace react
} // namespace facebook
diff --git a/android/app/src/main/jni/MainComponentsRegistry.cpp b/android/app/src/main/jni/MainComponentsRegistry.cpp
index 01da5875a8e..c634fa5bb2e 100644
--- a/android/app/src/main/jni/MainComponentsRegistry.cpp
+++ b/android/app/src/main/jni/MainComponentsRegistry.cpp
@@ -3,12 +3,17 @@
#include
#include
#include
+#include
+
namespace facebook {
namespace react {
MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {}
std::shared_ptr
MainComponentsRegistry::sharedProviderRegistry() {
auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
+
+ // Autolinked providers registered by RN CLI
+ rncli_registerProviders(providerRegistry);
// Custom Fabric Components go here. You can register custom
// components coming from your App or from 3rd party libraries here.
//
diff --git a/android/app/src/main/res/drawable/eu_next_logo.xml b/android/app/src/main/res/drawable/eu_next_logo.xml
new file mode 100644
index 00000000000..897c986a5a1
--- /dev/null
+++ b/android/app/src/main/res/drawable/eu_next_logo.xml
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/logo_io.xml b/android/app/src/main/res/drawable/logo_io.xml
new file mode 100644
index 00000000000..e6243fb2683
--- /dev/null
+++ b/android/app/src/main/res/drawable/logo_io.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/logo_pagopa.xml b/android/app/src/main/res/drawable/logo_pagopa.xml
new file mode 100644
index 00000000000..4e44899d259
--- /dev/null
+++ b/android/app/src/main/res/drawable/logo_pagopa.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/layout/launch_screen.xml b/android/app/src/main/res/layout/launch_screen.xml
index 823ddd4beeb..783da7e2ec8 100644
--- a/android/app/src/main/res/layout/launch_screen.xml
+++ b/android/app/src/main/res/layout/launch_screen.xml
@@ -1,103 +1,66 @@
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_height="30dp"
+ android:layout_marginTop="16dp"
+ android:gravity="center"
+ android:text="@string/splash_io_name"
+ android:textColor="#FFFFFF"
+ android:textSize="16sp"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/ioLogo" />
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-hdpi/eu_next_logo.png b/android/app/src/main/res/mipmap-hdpi/eu_next_logo.png
deleted file mode 100644
index a37f053a9ee..00000000000
Binary files a/android/app/src/main/res/mipmap-hdpi/eu_next_logo.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-hdpi/logo_io.png b/android/app/src/main/res/mipmap-hdpi/logo_io.png
deleted file mode 100644
index 2734d0b64d5..00000000000
Binary files a/android/app/src/main/res/mipmap-hdpi/logo_io.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-hdpi/logo_pagopa.png b/android/app/src/main/res/mipmap-hdpi/logo_pagopa.png
deleted file mode 100644
index 65fcac8645d..00000000000
Binary files a/android/app/src/main/res/mipmap-hdpi/logo_pagopa.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-mdpi/eu_next_logo.png b/android/app/src/main/res/mipmap-mdpi/eu_next_logo.png
deleted file mode 100644
index 99cc7c5710a..00000000000
Binary files a/android/app/src/main/res/mipmap-mdpi/eu_next_logo.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-mdpi/logo_io.png b/android/app/src/main/res/mipmap-mdpi/logo_io.png
deleted file mode 100644
index c9364152e28..00000000000
Binary files a/android/app/src/main/res/mipmap-mdpi/logo_io.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-mdpi/logo_pagopa.png b/android/app/src/main/res/mipmap-mdpi/logo_pagopa.png
deleted file mode 100644
index 15ffa878a1b..00000000000
Binary files a/android/app/src/main/res/mipmap-mdpi/logo_pagopa.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/eu_next_logo.png b/android/app/src/main/res/mipmap-xhdpi/eu_next_logo.png
deleted file mode 100644
index 4c19d91e38e..00000000000
Binary files a/android/app/src/main/res/mipmap-xhdpi/eu_next_logo.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/logo_io.png b/android/app/src/main/res/mipmap-xhdpi/logo_io.png
deleted file mode 100644
index c9364152e28..00000000000
Binary files a/android/app/src/main/res/mipmap-xhdpi/logo_io.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/logo_pagopa.png b/android/app/src/main/res/mipmap-xhdpi/logo_pagopa.png
deleted file mode 100644
index 15ffa878a1b..00000000000
Binary files a/android/app/src/main/res/mipmap-xhdpi/logo_pagopa.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/eu_next_logo.png b/android/app/src/main/res/mipmap-xxhdpi/eu_next_logo.png
deleted file mode 100644
index 3d33a008152..00000000000
Binary files a/android/app/src/main/res/mipmap-xxhdpi/eu_next_logo.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/logo_io.png b/android/app/src/main/res/mipmap-xxhdpi/logo_io.png
deleted file mode 100644
index 333146f2cc5..00000000000
Binary files a/android/app/src/main/res/mipmap-xxhdpi/logo_io.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/logo_pagopa.png b/android/app/src/main/res/mipmap-xxhdpi/logo_pagopa.png
deleted file mode 100644
index 26ae73dd950..00000000000
Binary files a/android/app/src/main/res/mipmap-xxhdpi/logo_pagopa.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/eu_next_logo.png b/android/app/src/main/res/mipmap-xxxhdpi/eu_next_logo.png
deleted file mode 100644
index e915ebfd602..00000000000
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/eu_next_logo.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/logo_io.png b/android/app/src/main/res/mipmap-xxxhdpi/logo_io.png
deleted file mode 100644
index 333146f2cc5..00000000000
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/logo_io.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/logo_pagopa.png b/android/app/src/main/res/mipmap-xxxhdpi/logo_pagopa.png
deleted file mode 100644
index 26ae73dd950..00000000000
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/logo_pagopa.png and /dev/null differ
diff --git a/android/build.gradle b/android/build.gradle
index 4c47f1fa60f..200c0cdea90 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -23,7 +23,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.1.1'
+ classpath 'com.android.tools.build:gradle:7.2.1'
classpath 'com.facebook.react:react-native-gradle-plugin'
classpath 'de.undercouch:gradle-download-task:5.0.1'
classpath 'com.google.gms:google-services:4.3.3'
@@ -36,21 +36,6 @@ buildscript {
allprojects {
repositories {
- exclusiveContent {
- // We get React Native's Android binaries exclusively through npm,
- // from a local Maven repo inside node_modules/react-native/.
- // (The use of exclusiveContent prevents looking elsewhere like Maven Central
- // and potentially getting a wrong version.)
- filter {
- includeGroup "com.facebook.react"
- }
- forRepository {
- maven {
- url "$rootDir/../node_modules/react-native/android"
- }
- }
- }
- mavenLocal()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url("$rootDir/../node_modules/react-native/android")
@@ -68,10 +53,7 @@ allprojects {
}
google()
jcenter()
- maven { url 'https://www.jitpack.io' }
+ maven { url 'https://www.jitpack.io' }
maven { url 'https://zendesk.jfrog.io/zendesk/repo' }
- }
- configurations.all {
- resolutionStrategy.force "com.android.support:support-v4:${rootProject.ext.supportLibVersion}"
}
}
diff --git a/android/gradle.properties b/android/gradle.properties
index 24a536f45dc..8088bf34d62 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -10,7 +10,7 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
-org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m -XX:MaxPermSize=512m
+org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
index 7454180f2ae..41d9927a4d4 100644
Binary files a/android/gradle/wrapper/gradle-wrapper.jar and b/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 669386b870a..8fad3f5a98b 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/android/link-assets-manifest.json b/android/link-assets-manifest.json
index 2327e470f54..2b9428a8c65 100644
--- a/android/link-assets-manifest.json
+++ b/android/link-assets-manifest.json
@@ -45,6 +45,54 @@
"path": "assets/fonts/TitilliumWeb/TitilliumWeb-SemiBoldItalic.ttf",
"sha1": "f81d3a5f38c6bda1fb3547bf91fe0b68b54066c5"
},
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Black.otf",
+ "sha1": "becf8bd5053f5529785c9d1d975f2d6f54446d47"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-BlackItalic.otf",
+ "sha1": "079c243911ef9d6cbb25f5e25b0a0fcdc80e217a"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Bold.otf",
+ "sha1": "5348d5fdb96da25b0b444b6cf433100e17b2c944"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-BoldItalic.otf",
+ "sha1": "19b6af581aa9de369c5551b5c81af4567e96fd33"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Italic.otf",
+ "sha1": "149caa0987bb4765e34a34ccc315d89a9d5b259c"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Light.otf",
+ "sha1": "096f9b521b0fc0e7ebe6c60890fbfe312e7e4b01"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-LightItalic.otf",
+ "sha1": "9a74303f47edd127dc6f2c48301c9b0d4ffbbf17"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Regular.otf",
+ "sha1": "0a8be559a9a9d8ce47eb6ca3de9db16f42a00580"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Semibold.otf",
+ "sha1": "fa6cff8c0046996bc9fb124abf5799408eb3b369"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-SemiboldItalic.otf",
+ "sha1": "8502e9c211803bb2b0446348c69cf56763c987a3"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Thin.otf",
+ "sha1": "dd3f889e6ca51de7e2006418b0125c02421fe574"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-ThinItalic.otf",
+ "sha1": "fb0f0fcc215d93fd4241f3af18408b7c42b33b3d"
+ },
{
"path": "assets/fonts/ReadexPro/ReadexPro-Regular.ttf",
"sha1": "93e4080794b725f216a94b57ed62a51bc77bce91"
diff --git a/android/settings.gradle b/android/settings.gradle
index cf96c09a5b7..42a3d842c85 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -62,7 +62,5 @@ if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true")
include(":ReactAndroid:hermes-engine")
project(":ReactAndroid:hermes-engine").projectDir = file('../node_modules/react-native/ReactAndroid/hermes-engine')
}
-include ':@react-native-community_datetimepicker'
-project(':@react-native-community_datetimepicker').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/datetimepicker/android')
include ':react-native-art'
project(':react-native-art').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/art/android')
diff --git a/assets/fonts/TitilliumSansPro-OFL.txt b/assets/fonts/TitilliumSansPro-OFL.txt
new file mode 100644
index 00000000000..5ffcfe18ea6
--- /dev/null
+++ b/assets/fonts/TitilliumSansPro-OFL.txt
@@ -0,0 +1,92 @@
+Copyright (c) 2024 The Titillium Pro Project Authors (https://github.com/chialab/titillium_pro)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION AND CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-Black.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Black.otf
new file mode 100644
index 00000000000..3cd95e37eaf
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Black.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-BlackItalic.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-BlackItalic.otf
new file mode 100644
index 00000000000..a6fd8bc8af7
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-BlackItalic.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-Bold.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Bold.otf
new file mode 100644
index 00000000000..3d774ef1a03
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Bold.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-BoldItalic.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-BoldItalic.otf
new file mode 100644
index 00000000000..bdf1aaedfc9
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-BoldItalic.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-Italic.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Italic.otf
new file mode 100644
index 00000000000..51f58e72f82
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Italic.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-Light.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Light.otf
new file mode 100644
index 00000000000..c75c48c9763
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Light.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-LightItalic.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-LightItalic.otf
new file mode 100644
index 00000000000..3146a822c96
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-LightItalic.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-Regular.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Regular.otf
new file mode 100644
index 00000000000..4bd7bcf2d5a
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Regular.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-Semibold.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Semibold.otf
new file mode 100644
index 00000000000..fc7186dda82
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Semibold.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-SemiboldItalic.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-SemiboldItalic.otf
new file mode 100644
index 00000000000..8242da46cf5
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-SemiboldItalic.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-Thin.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Thin.otf
new file mode 100644
index 00000000000..e9f73560c42
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-Thin.otf differ
diff --git a/assets/fonts/TitilliumSansPro/TitilliumSansPro-ThinItalic.otf b/assets/fonts/TitilliumSansPro/TitilliumSansPro-ThinItalic.otf
new file mode 100644
index 00000000000..869febf3eea
Binary files /dev/null and b/assets/fonts/TitilliumSansPro/TitilliumSansPro-ThinItalic.otf differ
diff --git a/img/app-logo.svg b/img/app-logo.svg
index 71c7b51020d..41663cea693 100644
--- a/img/app-logo.svg
+++ b/img/app-logo.svg
@@ -1,16 +1,9 @@
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
diff --git a/img/cie/CIE-onboarding-illustration.png b/img/cie/CIE-onboarding-illustration.png
deleted file mode 100644
index 3acf74bee10..00000000000
Binary files a/img/cie/CIE-onboarding-illustration.png and /dev/null differ
diff --git a/img/cie/CIE-onboarding-illustration@2x.png b/img/cie/CIE-onboarding-illustration@2x.png
deleted file mode 100644
index 3a1a7640204..00000000000
Binary files a/img/cie/CIE-onboarding-illustration@2x.png and /dev/null differ
diff --git a/img/cie/CIE-onboarding-illustration@3x.png b/img/cie/CIE-onboarding-illustration@3x.png
deleted file mode 100644
index 5d3a7890c1d..00000000000
Binary files a/img/cie/CIE-onboarding-illustration@3x.png and /dev/null differ
diff --git a/img/error.png b/img/error.png
deleted file mode 100644
index 55fab097d3e..00000000000
Binary files a/img/error.png and /dev/null differ
diff --git a/img/features/cdc/bonus.svg b/img/features/cdc/bonus.svg
deleted file mode 100644
index cfd865ed045..00000000000
--- a/img/features/cdc/bonus.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/img/features/cgn/cgn_card.svg b/img/features/cgn/cgn_card.svg
new file mode 100644
index 00000000000..6494a89f257
--- /dev/null
+++ b/img/features/cgn/cgn_card.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/features/idpay/bonus_bg_svg.svg b/img/features/idpay/bonus_bg_svg.svg
deleted file mode 100644
index dba6c003dfd..00000000000
--- a/img/features/idpay/bonus_bg_svg.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/img/features/idpay/creditcard.svg b/img/features/idpay/creditcard.svg
deleted file mode 100644
index fb1183a224f..00000000000
--- a/img/features/idpay/creditcard.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/img/features/idpay/empty_initiative.svg b/img/features/idpay/empty_initiative.svg
deleted file mode 100644
index 5da49215e81..00000000000
--- a/img/features/idpay/empty_initiative.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/img/features/idpay/institution.svg b/img/features/idpay/institution.svg
deleted file mode 100644
index 676d45e605b..00000000000
--- a/img/features/idpay/institution.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/img/features/idpay/wallet_card.svg b/img/features/idpay/wallet_card.svg
new file mode 100644
index 00000000000..8d816bc7c21
--- /dev/null
+++ b/img/features/idpay/wallet_card.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/img/features/payments/Amount.svg b/img/features/payments/Amount.svg
deleted file mode 100644
index bbdfc07ae08..00000000000
--- a/img/features/payments/Amount.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/img/features/payments/Giacenza.svg b/img/features/payments/Giacenza.svg
deleted file mode 100644
index 8ec5322da8f..00000000000
--- a/img/features/payments/Giacenza.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/img/features/payments/calendar.svg b/img/features/payments/calendar.svg
deleted file mode 100644
index 7f0c8dc39b8..00000000000
--- a/img/features/payments/calendar.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/img/landing/01.png b/img/landing/01.png
deleted file mode 100644
index b6fcef5ac73..00000000000
Binary files a/img/landing/01.png and /dev/null differ
diff --git a/img/landing/02.png b/img/landing/02.png
deleted file mode 100644
index 07d941b54ce..00000000000
Binary files a/img/landing/02.png and /dev/null differ
diff --git a/img/landing/03.png b/img/landing/03.png
deleted file mode 100644
index bad6fb3d47f..00000000000
Binary files a/img/landing/03.png and /dev/null differ
diff --git a/img/landing/04.png b/img/landing/04.png
deleted file mode 100644
index 78ef93000da..00000000000
Binary files a/img/landing/04.png and /dev/null differ
diff --git a/img/landing/05.png b/img/landing/05.png
deleted file mode 100644
index 64ac5687988..00000000000
Binary files a/img/landing/05.png and /dev/null differ
diff --git a/img/landing/session_expired.png b/img/landing/session_expired.png
deleted file mode 100644
index 4ad33dda6f7..00000000000
Binary files a/img/landing/session_expired.png and /dev/null differ
diff --git a/img/logo-it-square-icon.png b/img/logo-it-square-icon.png
deleted file mode 100644
index e12edad85ec..00000000000
Binary files a/img/logo-it-square-icon.png and /dev/null differ
diff --git a/img/logo-it.png b/img/logo-it.png
deleted file mode 100644
index d4a2a74b738..00000000000
Binary files a/img/logo-it.png and /dev/null differ
diff --git a/img/pictograms/fireworks.png b/img/pictograms/fireworks.png
deleted file mode 100644
index 0ce0e95f08c..00000000000
Binary files a/img/pictograms/fireworks.png and /dev/null differ
diff --git a/img/pictograms/hourglass.png b/img/pictograms/hourglass.png
deleted file mode 100644
index ad2d20d3262..00000000000
Binary files a/img/pictograms/hourglass.png and /dev/null differ
diff --git a/img/pictograms/payment-completed.svg b/img/pictograms/payment-completed.svg
deleted file mode 100644
index d9e061ce403..00000000000
--- a/img/pictograms/payment-completed.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
- 686AD73B-1535-427E-9A17-D2F9A04978DB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/img/rooted/broken-phone.png b/img/rooted/broken-phone.png
deleted file mode 100644
index b98349e31a4..00000000000
Binary files a/img/rooted/broken-phone.png and /dev/null differ
diff --git a/img/rooted/broken-phone@2x.png b/img/rooted/broken-phone@2x.png
deleted file mode 100644
index 1bca58dad94..00000000000
Binary files a/img/rooted/broken-phone@2x.png and /dev/null differ
diff --git a/img/rooted/broken-phone@3x.png b/img/rooted/broken-phone@3x.png
deleted file mode 100644
index 7eed13352d5..00000000000
Binary files a/img/rooted/broken-phone@3x.png and /dev/null differ
diff --git a/img/test/fingerprint.svg b/img/test/fingerprint.svg
deleted file mode 100644
index e9b91053189..00000000000
--- a/img/test/fingerprint.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/img/wallet/errors/domain-unknown-icon.png b/img/wallet/errors/domain-unknown-icon.png
deleted file mode 100755
index 4eb89cda1c0..00000000000
Binary files a/img/wallet/errors/domain-unknown-icon.png and /dev/null differ
diff --git a/img/wallet/errors/domain-unknown-icon.svg b/img/wallet/errors/domain-unknown-icon.svg
deleted file mode 100755
index eb69484a010..00000000000
--- a/img/wallet/errors/domain-unknown-icon.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- A14060FF-4435-46E0-894B-36B05046628C
- Created with sketchtool.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/img/wallet/errors/domain-unknown-icon@2x.png b/img/wallet/errors/domain-unknown-icon@2x.png
deleted file mode 100755
index 11d34bfbc37..00000000000
Binary files a/img/wallet/errors/domain-unknown-icon@2x.png and /dev/null differ
diff --git a/img/wallet/errors/domain-unknown-icon@3x.png b/img/wallet/errors/domain-unknown-icon@3x.png
deleted file mode 100755
index 222d19bb0c6..00000000000
Binary files a/img/wallet/errors/domain-unknown-icon@3x.png and /dev/null differ
diff --git a/img/wallet/errors/invalid-amount-icon.png b/img/wallet/errors/invalid-amount-icon.png
deleted file mode 100755
index 56ecd84761f..00000000000
Binary files a/img/wallet/errors/invalid-amount-icon.png and /dev/null differ
diff --git a/img/wallet/errors/invalid-amount-icon.svg b/img/wallet/errors/invalid-amount-icon.svg
deleted file mode 100755
index c05d74d2f17..00000000000
--- a/img/wallet/errors/invalid-amount-icon.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- 56267611-7536-4E1D-B42D-210C092C1A4D
- Created with sketchtool.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/img/wallet/errors/invalid-amount-icon@2x.png b/img/wallet/errors/invalid-amount-icon@2x.png
deleted file mode 100755
index d1daf05e8ff..00000000000
Binary files a/img/wallet/errors/invalid-amount-icon@2x.png and /dev/null differ
diff --git a/img/wallet/errors/invalid-amount-icon@3x.png b/img/wallet/errors/invalid-amount-icon@3x.png
deleted file mode 100755
index 40593f510a0..00000000000
Binary files a/img/wallet/errors/invalid-amount-icon@3x.png and /dev/null differ
diff --git a/img/wallet/errors/missing-payment-id-icon.png b/img/wallet/errors/missing-payment-id-icon.png
deleted file mode 100755
index 54c6b853368..00000000000
Binary files a/img/wallet/errors/missing-payment-id-icon.png and /dev/null differ
diff --git a/img/wallet/errors/missing-payment-id-icon.svg b/img/wallet/errors/missing-payment-id-icon.svg
deleted file mode 100755
index 9db4b1c20b6..00000000000
--- a/img/wallet/errors/missing-payment-id-icon.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- AE37566F-F38B-4066-8A01-2481839012A3
- Created with sketchtool.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/img/wallet/errors/missing-payment-id-icon@2x.png b/img/wallet/errors/missing-payment-id-icon@2x.png
deleted file mode 100755
index cc2b7a1662e..00000000000
Binary files a/img/wallet/errors/missing-payment-id-icon@2x.png and /dev/null differ
diff --git a/img/wallet/errors/missing-payment-id-icon@3x.png b/img/wallet/errors/missing-payment-id-icon@3x.png
deleted file mode 100755
index 4d439e33570..00000000000
Binary files a/img/wallet/errors/missing-payment-id-icon@3x.png and /dev/null differ
diff --git a/img/wallet/errors/payment-duplicated-icon.png b/img/wallet/errors/payment-duplicated-icon.png
deleted file mode 100755
index f339cabe4e1..00000000000
Binary files a/img/wallet/errors/payment-duplicated-icon.png and /dev/null differ
diff --git a/img/wallet/errors/payment-duplicated-icon.svg b/img/wallet/errors/payment-duplicated-icon.svg
deleted file mode 100755
index 82727b8ce5c..00000000000
--- a/img/wallet/errors/payment-duplicated-icon.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- 48E36FE0-0865-477B-B31D-3066D01401D9
- Created with sketchtool.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/img/wallet/errors/payment-duplicated-icon@2x.png b/img/wallet/errors/payment-duplicated-icon@2x.png
deleted file mode 100755
index 2ea734fc91f..00000000000
Binary files a/img/wallet/errors/payment-duplicated-icon@2x.png and /dev/null differ
diff --git a/img/wallet/errors/payment-duplicated-icon@3x.png b/img/wallet/errors/payment-duplicated-icon@3x.png
deleted file mode 100755
index 67ff5cf8bb4..00000000000
Binary files a/img/wallet/errors/payment-duplicated-icon@3x.png and /dev/null differ
diff --git a/img/wallet/errors/payment-ongoing-icon.png b/img/wallet/errors/payment-ongoing-icon.png
deleted file mode 100755
index b9dea78b5e2..00000000000
Binary files a/img/wallet/errors/payment-ongoing-icon.png and /dev/null differ
diff --git a/img/wallet/errors/payment-ongoing-icon.svg b/img/wallet/errors/payment-ongoing-icon.svg
deleted file mode 100755
index 75309723227..00000000000
--- a/img/wallet/errors/payment-ongoing-icon.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- B72CED6E-F033-4114-9030-C2BB7AAEB8F9
- Created with sketchtool.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/img/wallet/errors/payment-ongoing-icon@2x.png b/img/wallet/errors/payment-ongoing-icon@2x.png
deleted file mode 100755
index e98f8fbb017..00000000000
Binary files a/img/wallet/errors/payment-ongoing-icon@2x.png and /dev/null differ
diff --git a/img/wallet/errors/payment-ongoing-icon@3x.png b/img/wallet/errors/payment-ongoing-icon@3x.png
deleted file mode 100755
index 06764f5a89a..00000000000
Binary files a/img/wallet/errors/payment-ongoing-icon@3x.png and /dev/null differ
diff --git a/img/wallet/initiatives.svg b/img/wallet/initiatives.svg
deleted file mode 100644
index 355d5217c8f..00000000000
--- a/img/wallet/initiatives.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/img/wallet/logo-pagopa-test.png b/img/wallet/logo-pagopa-test.png
deleted file mode 100644
index 83c44b1361f..00000000000
Binary files a/img/wallet/logo-pagopa-test.png and /dev/null differ
diff --git a/img/wallet/logo-pagopa.png b/img/wallet/logo-pagopa.png
deleted file mode 100644
index d653cf5ffa5..00000000000
Binary files a/img/wallet/logo-pagopa.png and /dev/null differ
diff --git a/img/wallet/payment-methods/paypal/paypal_logo_ext.svg b/img/wallet/payment-methods/paypal/paypal_logo_ext.svg
new file mode 100644
index 00000000000..fff548e5d45
--- /dev/null
+++ b/img/wallet/payment-methods/paypal/paypal_logo_ext.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/wallet/payment-methods/postepay-logo.png b/img/wallet/payment-methods/postepay-logo.png
deleted file mode 100644
index a69b231bd6e..00000000000
Binary files a/img/wallet/payment-methods/postepay-logo.png and /dev/null differ
diff --git a/img/wallet/payment-methods/satispay-logo.png b/img/wallet/payment-methods/satispay-logo.png
deleted file mode 100644
index 479246b4a0c..00000000000
Binary files a/img/wallet/payment-methods/satispay-logo.png and /dev/null differ
diff --git a/img/wallet/payment-methods/satispay-logo.svg b/img/wallet/payment-methods/satispay-logo.svg
deleted file mode 100644
index 7c50b7c675a..00000000000
--- a/img/wallet/payment-methods/satispay-logo.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/img/wallet/payment-methods/venpay-logo.png b/img/wallet/payment-methods/venpay-logo.png
deleted file mode 100644
index 44a14ca7e87..00000000000
Binary files a/img/wallet/payment-methods/venpay-logo.png and /dev/null differ
diff --git a/img/wallet/unknown-gdo-2x.png b/img/wallet/unknown-gdo-2x.png
deleted file mode 100644
index 04a01915fb6..00000000000
Binary files a/img/wallet/unknown-gdo-2x.png and /dev/null differ
diff --git a/img/wallet/unknown-gdo-primary.svg b/img/wallet/unknown-gdo-primary.svg
deleted file mode 100644
index 407b5d8004c..00000000000
--- a/img/wallet/unknown-gdo-primary.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/img/wallet/unknown-gdo.png b/img/wallet/unknown-gdo.png
deleted file mode 100644
index 904fa267e25..00000000000
Binary files a/img/wallet/unknown-gdo.png and /dev/null differ
diff --git a/img/wallet/unknown-gdo.svg b/img/wallet/unknown-gdo.svg
deleted file mode 100644
index f8a31fdcc24..00000000000
--- a/img/wallet/unknown-gdo.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- unknown-gdo
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ios/ItaliaApp.xcodeproj/project.pbxproj b/ios/ItaliaApp.xcodeproj/project.pbxproj
index e625fd411f9..2a640f8fb6b 100644
--- a/ios/ItaliaApp.xcodeproj/project.pbxproj
+++ b/ios/ItaliaApp.xcodeproj/project.pbxproj
@@ -14,15 +14,16 @@
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
16E38CBD19D4437A9C020B21 /* RobotoMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 76E4CEA78E3F4060ABB59808 /* RobotoMono-Regular.ttf */; };
194A5D2B1F027F5A0078620E /* Podfile in Resources */ = {isa = PBXBuildFile; fileRef = 194A5D2A1F027F5A0078620E /* Podfile */; };
- 1CD9CAEA755BFC30AE893F46 /* libPods-ItaliaApp-ItaliaAppTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A0A336CDDAE56472931AD9F /* libPods-ItaliaApp-ItaliaAppTests.a */; };
28E4866232804051B865FC10 /* RobotoMono-RegularItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5389C36762A04AE69D762289 /* RobotoMono-RegularItalic.ttf */; };
2AD40B9924CB049500E4124A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2AD40B9824CB049500E4124A /* LaunchScreen.storyboard */; };
3A3CA4696BA44782A02FE37E /* TitilliumWeb-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B021D4CC17ED4D54B7944FED /* TitilliumWeb-SemiBold.ttf */; };
4D331CF68DAC4800A6D6297A /* TitilliumWeb-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 11C2483C363E432BB4D0A583 /* TitilliumWeb-Regular.ttf */; };
+ 544D7A6A6990E1AD0E113BF2 /* libPods-ItaliaApp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A88AAE92C2AA92D33DB25F0C /* libPods-ItaliaApp.a */; };
570BBC8FC70C4A76ABF035AC /* TitilliumWeb-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 163BC670599B42509D4D138E /* TitilliumWeb-Light.ttf */; };
69A5E1839C924EE5B8CD9470 /* ReadexPro-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2C584AD92CB24628B1AA76DE /* ReadexPro-Regular.ttf */; };
6B44A74498354CC19B90FE9C /* TitilliumWeb-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6754714BBEF54AA59833C0EB /* TitilliumWeb-ExtraLightItalic.ttf */; };
72E4B1EFF7D4414483079F91 /* TitilliumWeb-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CED8B1FF1E254583BB3F285F /* TitilliumWeb-SemiBoldItalic.ttf */; };
+ 7578F223A01E0E15E7072DAF /* libPods-ItaliaApp-ItaliaAppTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 59BCC34321A36ABA56F255E3 /* libPods-ItaliaApp-ItaliaAppTests.a */; };
859781B477BB45579FB9A9F2 /* TitilliumWeb-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F709D4AE20E44EFAAB255A8E /* TitilliumWeb-Italic.ttf */; };
862C0E693C864E76BADCDFCC /* TitilliumWeb-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6A786CC45B2D4B77BDF55C1D /* TitilliumWeb-Black.ttf */; };
8788744508D34396942D3DB4 /* RobotoMono-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFE8D23873DE458BB54EB46B /* RobotoMono-Light.ttf */; };
@@ -33,11 +34,22 @@
9975E38DE95949D28D07A275 /* RobotoMono-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B7088D9B42BA4275A767BEFF /* RobotoMono-Bold.ttf */; };
BE1A42156484487BABBC4DED /* TitilliumWeb-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 309BA0207AA24FE9A0EBE61C /* TitilliumWeb-Bold.ttf */; };
C2CF038002D24FEEAB41B336 /* RobotoMono-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 640E574519CA4183B230AF22 /* RobotoMono-LightItalic.ttf */; };
- CD4FC1EC91E60128F3E01292 /* libPods-ItaliaApp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A6F417D3B8F84EA607A5C6F3 /* libPods-ItaliaApp.a */; };
D18E075B28304466B6CA2381 /* TitilliumWeb-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B65D221FCB5A461FBC44285D /* TitilliumWeb-LightItalic.ttf */; };
EFFA620FCD2D46F6B942663B /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = 2D52800996AA471A87A7F975 /* LICENSE.txt */; };
F0625E7F2326825600EDEF90 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; };
F09FEB3C231818E3007071DB /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F09FEB0D231818E3007071DB /* Localizable.strings */; };
+ F2B1630E2B753C9D00F6E487 /* TitilliumSansPro-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B163022B753C9D00F6E487 /* TitilliumSansPro-Black.otf */; };
+ F2B1630F2B753C9D00F6E487 /* TitilliumSansPro-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B163032B753C9D00F6E487 /* TitilliumSansPro-Semibold.otf */; };
+ F2B163102B753C9D00F6E487 /* TitilliumSansPro-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B163042B753C9D00F6E487 /* TitilliumSansPro-LightItalic.otf */; };
+ F2B163112B753C9D00F6E487 /* TitilliumSansPro-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B163052B753C9D00F6E487 /* TitilliumSansPro-Italic.otf */; };
+ F2B163122B753C9D00F6E487 /* TitilliumSansPro-SemiboldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B163062B753C9D00F6E487 /* TitilliumSansPro-SemiboldItalic.otf */; };
+ F2B163132B753C9D00F6E487 /* TitilliumSansPro-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B163072B753C9D00F6E487 /* TitilliumSansPro-Thin.otf */; };
+ F2B163142B753C9D00F6E487 /* TitilliumSansPro-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B163082B753C9D00F6E487 /* TitilliumSansPro-BoldItalic.otf */; };
+ F2B163152B753C9D00F6E487 /* TitilliumSansPro-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B163092B753C9D00F6E487 /* TitilliumSansPro-Light.otf */; };
+ F2B163162B753C9D00F6E487 /* TitilliumSansPro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B1630A2B753C9D00F6E487 /* TitilliumSansPro-Regular.otf */; };
+ F2B163172B753C9D00F6E487 /* TitilliumSansPro-BlackItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B1630B2B753C9D00F6E487 /* TitilliumSansPro-BlackItalic.otf */; };
+ F2B163182B753C9D00F6E487 /* TitilliumSansPro-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B1630C2B753C9D00F6E487 /* TitilliumSansPro-Bold.otf */; };
+ F2B163192B753C9D00F6E487 /* TitilliumSansPro-ThinItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = F2B1630D2B753C9D00F6E487 /* TitilliumSansPro-ThinItalic.otf */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -68,6 +80,7 @@
00E356EE1AD99517003FC87E /* ItaliaAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ItaliaAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
00E356F21AD99517003FC87E /* ItaliaAppTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ItaliaAppTests.m; sourceTree = ""; };
+ 058F4F4927B1B1C84C7F1137 /* Pods-ItaliaApp-ItaliaAppTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ItaliaApp-ItaliaAppTests.release.xcconfig"; path = "Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests.release.xcconfig"; sourceTree = ""; };
11C2483C363E432BB4D0A583 /* TitilliumWeb-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-Regular.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-Regular.ttf"; sourceTree = ""; };
133638FB213D788900B0C079 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
133638FD213D78DB00B0C079 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; };
@@ -86,23 +99,25 @@
2C584AD92CB24628B1AA76DE /* ReadexPro-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ReadexPro-Regular.ttf"; path = "../assets/fonts/ReadexPro/ReadexPro-Regular.ttf"; sourceTree = ""; };
2D52800996AA471A87A7F975 /* LICENSE.txt */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = LICENSE.txt; path = ../assets/fonts/RobotoMono/LICENSE.txt; sourceTree = ""; };
309BA0207AA24FE9A0EBE61C /* TitilliumWeb-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-Bold.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-Bold.ttf"; sourceTree = ""; };
- 3A0A336CDDAE56472931AD9F /* libPods-ItaliaApp-ItaliaAppTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ItaliaApp-ItaliaAppTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
- 4F044D1214BF98AC6510D261 /* Pods-ItaliaApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ItaliaApp.debug.xcconfig"; path = "Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp.debug.xcconfig"; sourceTree = ""; };
5389C36762A04AE69D762289 /* RobotoMono-RegularItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "RobotoMono-RegularItalic.ttf"; path = "../assets/fonts/RobotoMono/RobotoMono-RegularItalic.ttf"; sourceTree = ""; };
+ 59BCC34321A36ABA56F255E3 /* libPods-ItaliaApp-ItaliaAppTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ItaliaApp-ItaliaAppTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
640E574519CA4183B230AF22 /* RobotoMono-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "RobotoMono-LightItalic.ttf"; path = "../assets/fonts/RobotoMono/RobotoMono-LightItalic.ttf"; sourceTree = ""; };
6754714BBEF54AA59833C0EB /* TitilliumWeb-ExtraLightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-ExtraLightItalic.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-ExtraLightItalic.ttf"; sourceTree = ""; };
6A786CC45B2D4B77BDF55C1D /* TitilliumWeb-Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-Black.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-Black.ttf"; sourceTree = ""; };
6C4A0A2AB90C8575993DF1E1 /* Instabug.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Instabug.framework; path = "../node_modules/instabug-reactnative/ios/Instabug.framework"; sourceTree = ""; };
+ 6D0115BDF703AEBFD8B86A12 /* Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig"; path = "Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig"; sourceTree = ""; };
+ 6F8C6AF94C801CE01EC3D81A /* Pods-ItaliaApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ItaliaApp.release.xcconfig"; path = "Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp.release.xcconfig"; sourceTree = ""; };
+ 722056DF161D843DD91D88A7 /* Pods-ItaliaApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ItaliaApp.debug.xcconfig"; path = "Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp.debug.xcconfig"; sourceTree = ""; };
76E4CEA78E3F4060ABB59808 /* RobotoMono-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "RobotoMono-Regular.ttf"; path = "../assets/fonts/RobotoMono/RobotoMono-Regular.ttf"; sourceTree = ""; };
7A83F0572152B12C000C6389 /* ItaliaApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = ItaliaApp.entitlements; path = ItaliaApp/ItaliaApp.entitlements; sourceTree = ""; };
875B0C3A5326413494A9311A /* DMMono-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "DMMono-Medium.ttf"; path = "../assets/fonts/DMMono/DMMono-Medium.ttf"; sourceTree = ""; };
- A6F417D3B8F84EA607A5C6F3 /* libPods-ItaliaApp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ItaliaApp.a"; sourceTree = BUILT_PRODUCTS_DIR; };
- AE2A89F5F6A57BDBD22D81D9 /* Pods-ItaliaApp-ItaliaAppTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ItaliaApp-ItaliaAppTests.release.xcconfig"; path = "Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests.release.xcconfig"; sourceTree = ""; };
+ A88AAE92C2AA92D33DB25F0C /* libPods-ItaliaApp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ItaliaApp.a"; sourceTree = BUILT_PRODUCTS_DIR; };
AFE8D23873DE458BB54EB46B /* RobotoMono-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "RobotoMono-Light.ttf"; path = "../assets/fonts/RobotoMono/RobotoMono-Light.ttf"; sourceTree = ""; };
B021D4CC17ED4D54B7944FED /* TitilliumWeb-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-SemiBold.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-SemiBold.ttf"; sourceTree = ""; };
+ B57593872B70FFA400674515 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; };
+ B57593882B70FFA400674515 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = ItaliaApp/de.lproj/Localizable.strings; sourceTree = ""; };
B65D221FCB5A461FBC44285D /* TitilliumWeb-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-LightItalic.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-LightItalic.ttf"; sourceTree = ""; };
B7088D9B42BA4275A767BEFF /* RobotoMono-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "RobotoMono-Bold.ttf"; path = "../assets/fonts/RobotoMono/RobotoMono-Bold.ttf"; sourceTree = ""; };
- B7EF7760029EB39299B837EA /* Pods-ItaliaApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ItaliaApp.release.xcconfig"; path = "Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp.release.xcconfig"; sourceTree = ""; };
CED8B1FF1E254583BB3F285F /* TitilliumWeb-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-SemiBoldItalic.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-SemiBoldItalic.ttf"; sourceTree = ""; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
EE4F83DB63254F5285C36A40 /* TitilliumWeb-ExtraLight.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-ExtraLight.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-ExtraLight.ttf"; sourceTree = ""; };
@@ -110,8 +125,19 @@
F0625E7B2326822400EDEF90 /* libReact-RCTImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libReact-RCTImage.a"; sourceTree = BUILT_PRODUCTS_DIR; };
F09FEB0E231818E3007071DB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = ItaliaApp/en.lproj/Localizable.strings; sourceTree = ""; };
F09FEB3D231818F0007071DB /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = ItaliaApp/it.lproj/Localizable.strings; sourceTree = ""; };
+ F2B163022B753C9D00F6E487 /* TitilliumSansPro-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-Black.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-Black.otf"; sourceTree = ""; };
+ F2B163032B753C9D00F6E487 /* TitilliumSansPro-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-Semibold.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-Semibold.otf"; sourceTree = ""; };
+ F2B163042B753C9D00F6E487 /* TitilliumSansPro-LightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-LightItalic.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-LightItalic.otf"; sourceTree = ""; };
+ F2B163052B753C9D00F6E487 /* TitilliumSansPro-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-Italic.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-Italic.otf"; sourceTree = ""; };
+ F2B163062B753C9D00F6E487 /* TitilliumSansPro-SemiboldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-SemiboldItalic.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-SemiboldItalic.otf"; sourceTree = ""; };
+ F2B163072B753C9D00F6E487 /* TitilliumSansPro-Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-Thin.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-Thin.otf"; sourceTree = ""; };
+ F2B163082B753C9D00F6E487 /* TitilliumSansPro-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-BoldItalic.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-BoldItalic.otf"; sourceTree = ""; };
+ F2B163092B753C9D00F6E487 /* TitilliumSansPro-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-Light.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-Light.otf"; sourceTree = ""; };
+ F2B1630A2B753C9D00F6E487 /* TitilliumSansPro-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-Regular.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-Regular.otf"; sourceTree = ""; };
+ F2B1630B2B753C9D00F6E487 /* TitilliumSansPro-BlackItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-BlackItalic.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-BlackItalic.otf"; sourceTree = ""; };
+ F2B1630C2B753C9D00F6E487 /* TitilliumSansPro-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-Bold.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-Bold.otf"; sourceTree = ""; };
+ F2B1630D2B753C9D00F6E487 /* TitilliumSansPro-ThinItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "TitilliumSansPro-ThinItalic.otf"; path = "../assets/fonts/TitilliumSansPro/TitilliumSansPro-ThinItalic.otf"; sourceTree = ""; };
F709D4AE20E44EFAAB255A8E /* TitilliumWeb-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "TitilliumWeb-Italic.ttf"; path = "../assets/fonts/TitilliumWeb/TitilliumWeb-Italic.ttf"; sourceTree = ""; };
- FCE075AF22EBCD57D83AD630 /* Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig"; path = "Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -119,7 +145,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 1CD9CAEA755BFC30AE893F46 /* libPods-ItaliaApp-ItaliaAppTests.a in Frameworks */,
+ 7578F223A01E0E15E7072DAF /* libPods-ItaliaApp-ItaliaAppTests.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -128,7 +154,7 @@
buildActionMask = 2147483647;
files = (
F0625E7F2326825600EDEF90 /* JavaScriptCore.framework in Frameworks */,
- CD4FC1EC91E60128F3E01292 /* libPods-ItaliaApp.a in Frameworks */,
+ 544D7A6A6990E1AD0E113BF2 /* libPods-ItaliaApp.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -181,6 +207,18 @@
36F229EFB63F4CD98EF610EC /* Resources */ = {
isa = PBXGroup;
children = (
+ F2B163022B753C9D00F6E487 /* TitilliumSansPro-Black.otf */,
+ F2B1630B2B753C9D00F6E487 /* TitilliumSansPro-BlackItalic.otf */,
+ F2B1630C2B753C9D00F6E487 /* TitilliumSansPro-Bold.otf */,
+ F2B163082B753C9D00F6E487 /* TitilliumSansPro-BoldItalic.otf */,
+ F2B163052B753C9D00F6E487 /* TitilliumSansPro-Italic.otf */,
+ F2B163092B753C9D00F6E487 /* TitilliumSansPro-Light.otf */,
+ F2B163042B753C9D00F6E487 /* TitilliumSansPro-LightItalic.otf */,
+ F2B1630A2B753C9D00F6E487 /* TitilliumSansPro-Regular.otf */,
+ F2B163032B753C9D00F6E487 /* TitilliumSansPro-Semibold.otf */,
+ F2B163062B753C9D00F6E487 /* TitilliumSansPro-SemiboldItalic.otf */,
+ F2B163072B753C9D00F6E487 /* TitilliumSansPro-Thin.otf */,
+ F2B1630D2B753C9D00F6E487 /* TitilliumSansPro-ThinItalic.otf */,
6A786CC45B2D4B77BDF55C1D /* TitilliumWeb-Black.ttf */,
309BA0207AA24FE9A0EBE61C /* TitilliumWeb-Bold.ttf */,
1E4EECD1122B401CAC190472 /* TitilliumWeb-BoldItalic.ttf */,
@@ -208,10 +246,10 @@
591602A69619994F43D34A93 /* Pods */ = {
isa = PBXGroup;
children = (
- 4F044D1214BF98AC6510D261 /* Pods-ItaliaApp.debug.xcconfig */,
- B7EF7760029EB39299B837EA /* Pods-ItaliaApp.release.xcconfig */,
- FCE075AF22EBCD57D83AD630 /* Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig */,
- AE2A89F5F6A57BDBD22D81D9 /* Pods-ItaliaApp-ItaliaAppTests.release.xcconfig */,
+ 722056DF161D843DD91D88A7 /* Pods-ItaliaApp.debug.xcconfig */,
+ 6F8C6AF94C801CE01EC3D81A /* Pods-ItaliaApp.release.xcconfig */,
+ 6D0115BDF703AEBFD8B86A12 /* Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig */,
+ 058F4F4927B1B1C84C7F1137 /* Pods-ItaliaApp-ItaliaAppTests.release.xcconfig */,
);
path = Pods;
sourceTree = "";
@@ -256,8 +294,8 @@
F0625E7B2326822400EDEF90 /* libReact-RCTImage.a */,
F0625E792326820B00EDEF90 /* libReact-RCTImage.a */,
6C4A0A2AB90C8575993DF1E1 /* Instabug.framework */,
- A6F417D3B8F84EA607A5C6F3 /* libPods-ItaliaApp.a */,
- 3A0A336CDDAE56472931AD9F /* libPods-ItaliaApp-ItaliaAppTests.a */,
+ A88AAE92C2AA92D33DB25F0C /* libPods-ItaliaApp.a */,
+ 59BCC34321A36ABA56F255E3 /* libPods-ItaliaApp-ItaliaAppTests.a */,
);
name = Frameworks;
sourceTree = "";
@@ -269,12 +307,12 @@
isa = PBXNativeTarget;
buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ItaliaAppTests" */;
buildPhases = (
- CC25A055C342FAAE3D4A7914 /* [CP] Check Pods Manifest.lock */,
+ 352F3B8D397ADE20251EED97 /* [CP] Check Pods Manifest.lock */,
00E356EA1AD99517003FC87E /* Sources */,
00E356EB1AD99517003FC87E /* Frameworks */,
00E356EC1AD99517003FC87E /* Resources */,
- 798F586C1A40477B6340BEA7 /* [CP] Embed Pods Frameworks */,
- F162F3AB6F2574EDC5D74D51 /* [CP] Copy Pods Resources */,
+ F08399D3BEE675C55F82C6BE /* [CP] Embed Pods Frameworks */,
+ 68F41393BCCEDD7F8C939A70 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -290,7 +328,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ItaliaApp" */;
buildPhases = (
- 02908AF96918A81891FE2AAA /* [CP] Check Pods Manifest.lock */,
+ CC23EFFCB8098D26BE7DBAA5 /* [CP] Check Pods Manifest.lock */,
95AEBF4A23D0A295000598A9 /* Start Packager */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
@@ -298,8 +336,8 @@
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
61CC933C2135818C00206602 /* Embed Frameworks */,
7A034949213D55CA0064B689 /* Work around InputMask.xcodeproj embedding an extra set of Swift libraries */,
- 78409FB602D7E5A8BB0D890D /* [CP] Embed Pods Frameworks */,
- 93CC51473253477B8DB84D24 /* [CP] Copy Pods Resources */,
+ 520BD832C8035EF5E68D9913 /* [CP] Embed Pods Frameworks */,
+ 963519164D766C5238AA1B42 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -344,6 +382,7 @@
en,
Base,
it,
+ de,
);
mainGroup = 83CBB9F61A601CBA00E9B192;
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
@@ -370,7 +409,9 @@
files = (
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
133638FA213D788900B0C079 /* InfoPlist.strings in Resources */,
+ F2B163152B753C9D00F6E487 /* TitilliumSansPro-Light.otf in Resources */,
194A5D2B1F027F5A0078620E /* Podfile in Resources */,
+ F2B1630F2B753C9D00F6E487 /* TitilliumSansPro-Semibold.otf in Resources */,
862C0E693C864E76BADCDFCC /* TitilliumWeb-Black.ttf in Resources */,
BE1A42156484487BABBC4DED /* TitilliumWeb-Bold.ttf in Resources */,
8D109BF3B47F46FDA6B105CE /* TitilliumWeb-BoldItalic.ttf in Resources */,
@@ -379,18 +420,28 @@
859781B477BB45579FB9A9F2 /* TitilliumWeb-Italic.ttf in Resources */,
2AD40B9924CB049500E4124A /* LaunchScreen.storyboard in Resources */,
F09FEB3C231818E3007071DB /* Localizable.strings in Resources */,
+ F2B163162B753C9D00F6E487 /* TitilliumSansPro-Regular.otf in Resources */,
570BBC8FC70C4A76ABF035AC /* TitilliumWeb-Light.ttf in Resources */,
D18E075B28304466B6CA2381 /* TitilliumWeb-LightItalic.ttf in Resources */,
+ F2B163102B753C9D00F6E487 /* TitilliumSansPro-LightItalic.otf in Resources */,
+ F2B163182B753C9D00F6E487 /* TitilliumSansPro-Bold.otf in Resources */,
4D331CF68DAC4800A6D6297A /* TitilliumWeb-Regular.ttf in Resources */,
3A3CA4696BA44782A02FE37E /* TitilliumWeb-SemiBold.ttf in Resources */,
72E4B1EFF7D4414483079F91 /* TitilliumWeb-SemiBoldItalic.ttf in Resources */,
+ F2B163192B753C9D00F6E487 /* TitilliumSansPro-ThinItalic.otf in Resources */,
+ F2B163112B753C9D00F6E487 /* TitilliumSansPro-Italic.otf in Resources */,
+ F2B163172B753C9D00F6E487 /* TitilliumSansPro-BlackItalic.otf in Resources */,
EFFA620FCD2D46F6B942663B /* LICENSE.txt in Resources */,
9975E38DE95949D28D07A275 /* RobotoMono-Bold.ttf in Resources */,
8E7BB01F1A6D4D79B17B4210 /* RobotoMono-BoldItalic.ttf in Resources */,
8788744508D34396942D3DB4 /* RobotoMono-Light.ttf in Resources */,
+ F2B1630E2B753C9D00F6E487 /* TitilliumSansPro-Black.otf in Resources */,
+ F2B163132B753C9D00F6E487 /* TitilliumSansPro-Thin.otf in Resources */,
C2CF038002D24FEEAB41B336 /* RobotoMono-LightItalic.ttf in Resources */,
16E38CBD19D4437A9C020B21 /* RobotoMono-Regular.ttf in Resources */,
28E4866232804051B865FC10 /* RobotoMono-RegularItalic.ttf in Resources */,
+ F2B163122B753C9D00F6E487 /* TitilliumSansPro-SemiboldItalic.otf in Resources */,
+ F2B163142B753C9D00F6E487 /* TitilliumSansPro-BoldItalic.otf in Resources */,
69A5E1839C924EE5B8CD9470 /* ReadexPro-Regular.ttf in Resources */,
97F089B39469411991377615 /* DMMono-Medium.ttf in Resources */,
);
@@ -413,7 +464,7 @@
shellPath = /bin/sh;
shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
};
- 02908AF96918A81891FE2AAA /* [CP] Check Pods Manifest.lock */ = {
+ 352F3B8D397ADE20251EED97 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -428,14 +479,14 @@
outputFileListPaths = (
);
outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-ItaliaApp-checkManifestLockResult.txt",
+ "$(DERIVED_FILE_DIR)/Pods-ItaliaApp-ItaliaAppTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
- 78409FB602D7E5A8BB0D890D /* [CP] Embed Pods Frameworks */ = {
+ 520BD832C8035EF5E68D9913 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -481,50 +532,22 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
- 798F586C1A40477B6340BEA7 /* [CP] Embed Pods Frameworks */ = {
+ 68F41393BCCEDD7F8C939A70 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests-frameworks.sh",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/Flipper-DoubleConversion/double-conversion.framework/double-conversion",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/Flipper-Glog/glog.framework/glog",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskAnswerBotProvidersSDK/AnswerBotProvidersSDK.framework/AnswerBotProvidersSDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskAnswerBotSDK/AnswerBotSDK.framework/AnswerBotSDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskChatProvidersSDK/ChatProvidersSDK.framework/ChatProvidersSDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskChatSDK/ChatSDK.framework/ChatSDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskCommonUISDK/CommonUISDK.framework/CommonUISDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskCoreSDK/ZendeskCoreSDK.framework/ZendeskCoreSDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskMessagingAPISDK/MessagingAPI.framework/MessagingAPI",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskMessagingSDK/MessagingSDK.framework/MessagingSDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskSDKConfigurationsSDK/SDKConfigurations.framework/SDKConfigurations",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskSupportProvidersSDK/SupportProvidersSDK.framework/SupportProvidersSDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskSupportSDK/SupportSDK.framework/SupportSDK",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/hermes.framework/hermes",
+ "${PODS_ROOT}/Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests-resources.sh",
+ "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
);
- name = "[CP] Embed Pods Frameworks";
+ name = "[CP] Copy Pods Resources";
outputPaths = (
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/double-conversion.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/glog.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AnswerBotProvidersSDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AnswerBotSDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ChatProvidersSDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ChatSDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CommonUISDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZendeskCoreSDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MessagingAPI.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MessagingSDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDKConfigurations.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SupportProvidersSDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SupportSDK.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
7A034949213D55CA0064B689 /* Work around InputMask.xcodeproj embedding an extra set of Swift libraries */ = {
@@ -541,77 +564,43 @@
shellPath = /bin/sh;
shellScript = "# see https://github.com/react-native-community/react-native-text-input-mask/issues/22#issuecomment-344765116\n\nEXTRA_DIR=\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Frameworks/InputMask.framework/Frameworks\"\n\nif [[ -d \"${EXTRA_DIR}\" ]]; then\n rm -rf \"${EXTRA_DIR}\"\nfi\n";
};
- 93CC51473253477B8DB84D24 /* [CP] Copy Pods Resources */ = {
+ 95AEBF4A23D0A295000598A9 /* Start Packager */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
+ inputFileListPaths = (
+ );
inputPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp-resources.sh",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPArrowLeft.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPArrowLeft@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPArrowRight.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPArrowRight@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCheckmark.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCheckmark@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCloseButton.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCloseButton@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCloseButton@3x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPDismissKeyboard.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPDismissKeyboard@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPLogo.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPLogo@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/placeholder-image.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/MPTakeoverNotificationViewController~ipad.xib",
- "${PODS_ROOT}/Mixpanel/Mixpanel/MPTakeoverNotificationViewController~iphonelandscape.xib",
- "${PODS_ROOT}/Mixpanel/Mixpanel/MPTakeoverNotificationViewController~iphoneportrait.xib",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
);
- name = "[CP] Copy Pods Resources";
+ name = "Start Packager";
+ outputFileListPaths = (
+ );
outputPaths = (
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPArrowLeft.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPArrowLeft@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPArrowRight.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPArrowRight@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCheckmark.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCheckmark@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCloseButton.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCloseButton@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCloseButton@3x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPDismissKeyboard.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPDismissKeyboard@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPLogo.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPLogo@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/placeholder-image.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPTakeoverNotificationViewController~ipad.nib",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPTakeoverNotificationViewController~iphonelandscape.nib",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPTakeoverNotificationViewController~iphoneportrait.nib",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp-resources.sh\"\n";
- showEnvVarsInLog = 0;
+ shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\nif nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\nif ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\necho \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\nexit 2\nfi\nelse\nopen \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\nfi\nfi\n";
};
- 95AEBF4A23D0A295000598A9 /* Start Packager */ = {
+ 963519164D766C5238AA1B42 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
- inputFileListPaths = (
- );
inputPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp-resources.sh",
+ "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
);
- name = "Start Packager";
- outputFileListPaths = (
- );
+ name = "[CP] Copy Pods Resources";
outputPaths = (
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\nif nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\nif ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\necho \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\nexit 2\nfi\nelse\nopen \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\nfi\nfi\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ItaliaApp/Pods-ItaliaApp-resources.sh\"\n";
+ showEnvVarsInLog = 0;
};
- CC25A055C342FAAE3D4A7914 /* [CP] Check Pods Manifest.lock */ = {
+ CC23EFFCB8098D26BE7DBAA5 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -626,63 +615,57 @@
outputFileListPaths = (
);
outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-ItaliaApp-ItaliaAppTests-checkManifestLockResult.txt",
+ "$(DERIVED_FILE_DIR)/Pods-ItaliaApp-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
- F162F3AB6F2574EDC5D74D51 /* [CP] Copy Pods Resources */ = {
+ F08399D3BEE675C55F82C6BE /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests-resources.sh",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPArrowLeft.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPArrowLeft@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPArrowRight.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPArrowRight@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCheckmark.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCheckmark@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCloseButton.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCloseButton@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPCloseButton@3x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPDismissKeyboard.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPDismissKeyboard@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPLogo.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/MPLogo@2x.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/Images/placeholder-image.png",
- "${PODS_ROOT}/Mixpanel/Mixpanel/MPTakeoverNotificationViewController~ipad.xib",
- "${PODS_ROOT}/Mixpanel/Mixpanel/MPTakeoverNotificationViewController~iphonelandscape.xib",
- "${PODS_ROOT}/Mixpanel/Mixpanel/MPTakeoverNotificationViewController~iphoneportrait.xib",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
+ "${PODS_ROOT}/Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests-frameworks.sh",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/Flipper-DoubleConversion/double-conversion.framework/double-conversion",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/Flipper-Glog/glog.framework/glog",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskAnswerBotProvidersSDK/AnswerBotProvidersSDK.framework/AnswerBotProvidersSDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskAnswerBotSDK/AnswerBotSDK.framework/AnswerBotSDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskChatProvidersSDK/ChatProvidersSDK.framework/ChatProvidersSDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskChatSDK/ChatSDK.framework/ChatSDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskCommonUISDK/CommonUISDK.framework/CommonUISDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskCoreSDK/ZendeskCoreSDK.framework/ZendeskCoreSDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskMessagingAPISDK/MessagingAPI.framework/MessagingAPI",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskMessagingSDK/MessagingSDK.framework/MessagingSDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskSDKConfigurationsSDK/SDKConfigurations.framework/SDKConfigurations",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskSupportProvidersSDK/SupportProvidersSDK.framework/SupportProvidersSDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ZendeskSupportSDK/SupportSDK.framework/SupportSDK",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/hermes.framework/hermes",
);
- name = "[CP] Copy Pods Resources";
+ name = "[CP] Embed Pods Frameworks";
outputPaths = (
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPArrowLeft.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPArrowLeft@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPArrowRight.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPArrowRight@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCheckmark.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCheckmark@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCloseButton.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCloseButton@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPCloseButton@3x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPDismissKeyboard.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPDismissKeyboard@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPLogo.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPLogo@2x.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/placeholder-image.png",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPTakeoverNotificationViewController~ipad.nib",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPTakeoverNotificationViewController~iphonelandscape.nib",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MPTakeoverNotificationViewController~iphoneportrait.nib",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/double-conversion.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/glog.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AnswerBotProvidersSDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AnswerBotSDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ChatProvidersSDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ChatSDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CommonUISDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZendeskCoreSDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MessagingAPI.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MessagingSDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDKConfigurations.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SupportProvidersSDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SupportSDK.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests-resources.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ItaliaApp-ItaliaAppTests/Pods-ItaliaApp-ItaliaAppTests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
@@ -721,6 +704,7 @@
children = (
133638FB213D788900B0C079 /* en */,
133638FD213D78DB00B0C079 /* it */,
+ B57593872B70FFA400674515 /* de */,
);
name = InfoPlist.strings;
path = ItaliaApp;
@@ -731,6 +715,7 @@
children = (
F09FEB0E231818E3007071DB /* en */,
F09FEB3D231818F0007071DB /* it */,
+ B57593882B70FFA400674515 /* de */,
);
name = Localizable.strings;
sourceTree = "";
@@ -740,7 +725,7 @@
/* Begin XCBuildConfiguration section */
00E356F61AD99517003FC87E /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = FCE075AF22EBCD57D83AD630 /* Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig */;
+ baseConfigurationReference = 6D0115BDF703AEBFD8B86A12 /* Pods-ItaliaApp-ItaliaAppTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
DEVELOPMENT_TEAM = M2X5YQ4BJ7;
@@ -752,7 +737,7 @@
INFOPLIST_FILE = ItaliaAppTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- LIBRARY_SEARCH_PATHS = "$(inherited)";
+ LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)";
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
@@ -765,7 +750,7 @@
};
00E356F71AD99517003FC87E /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = AE2A89F5F6A57BDBD22D81D9 /* Pods-ItaliaApp-ItaliaAppTests.release.xcconfig */;
+ baseConfigurationReference = 058F4F4927B1B1C84C7F1137 /* Pods-ItaliaApp-ItaliaAppTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
COPY_PHASE_STRIP = NO;
@@ -774,7 +759,7 @@
INFOPLIST_FILE = ItaliaAppTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- LIBRARY_SEARCH_PATHS = "$(inherited)";
+ LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)";
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
@@ -787,7 +772,7 @@
};
13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 4F044D1214BF98AC6510D261 /* Pods-ItaliaApp.debug.xcconfig */;
+ baseConfigurationReference = 722056DF161D843DD91D88A7 /* Pods-ItaliaApp.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
@@ -828,7 +813,7 @@
};
13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = B7EF7760029EB39299B837EA /* Pods-ItaliaApp.release.xcconfig */;
+ baseConfigurationReference = 6F8C6AF94C801CE01EC3D81A /* Pods-ItaliaApp.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
@@ -871,7 +856,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
@@ -905,6 +890,7 @@
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
+ _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION,
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -922,6 +908,11 @@
);
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-Wl",
+ "-ld_classic",
+ );
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
};
@@ -932,7 +923,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
@@ -962,6 +953,10 @@
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "$(inherited)",
+ _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION,
+ );
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
@@ -976,6 +971,11 @@
"\"$(SDKROOT)/usr/lib/swift\"",
);
MTL_ENABLE_DEBUG_INFO = NO;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-Wl",
+ "-ld_classic",
+ );
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
diff --git a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/Contents.json b/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/Contents.json
index 98fd313ae23..35e7856f312 100644
--- a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/Contents.json
+++ b/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/Contents.json
@@ -1,23 +1,15 @@
{
"images" : [
{
- "filename" : "IT Finanziato dall'Unione europea.svg",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "filename" : "IT Finanziato dall'Unione europea 1.svg",
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "filename" : "IT Finanziato dall'Unione europea 2.svg",
- "idiom" : "universal",
- "scale" : "3x"
+ "filename" : "eu_next_logo.svg",
+ "idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
+ },
+ "properties" : {
+ "preserves-vector-representation" : true
}
}
diff --git a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea 1.svg b/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea 1.svg
deleted file mode 100644
index 244bce156e3..00000000000
--- a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea 1.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea 2.svg b/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea 2.svg
deleted file mode 100644
index 244bce156e3..00000000000
--- a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea 2.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea.svg b/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea.svg
deleted file mode 100644
index 244bce156e3..00000000000
--- a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/IT Finanziato dall'Unione europea.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/eu_next_logo.svg b/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/eu_next_logo.svg
new file mode 100644
index 00000000000..fbe13d7d535
--- /dev/null
+++ b/ios/ItaliaApp/Images.xcassets/euNextLogo.imageset/eu_next_logo.svg
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/Contents.json b/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/Contents.json
index 1a9c9cf6045..9b0051f53d9 100644
--- a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/Contents.json
+++ b/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/Contents.json
@@ -1,23 +1,15 @@
{
"images" : [
{
- "filename" : "logo_ConsiglioMInistri.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "filename" : "logo ConsiglioMInistri@2x.png",
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "filename" : "logo ConsiglioMInistri@3x.png",
- "idiom" : "universal",
- "scale" : "3x"
+ "filename" : "logo_consiglio_ministri.svg",
+ "idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
+ },
+ "properties" : {
+ "preserves-vector-representation" : true
}
}
diff --git a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo ConsiglioMInistri@2x.png b/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo ConsiglioMInistri@2x.png
deleted file mode 100644
index fea6caf2353..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo ConsiglioMInistri@2x.png and /dev/null differ
diff --git a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo ConsiglioMInistri@3x.png b/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo ConsiglioMInistri@3x.png
deleted file mode 100644
index 722aff5ec14..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo ConsiglioMInistri@3x.png and /dev/null differ
diff --git a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo_ConsiglioMInistri.png b/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo_ConsiglioMInistri.png
deleted file mode 100644
index 1d3df27ef4a..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo_ConsiglioMInistri.png and /dev/null differ
diff --git a/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo_consiglio_ministri.svg b/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo_consiglio_ministri.svg
new file mode 100644
index 00000000000..6b00504a44b
--- /dev/null
+++ b/ios/ItaliaApp/Images.xcassets/logo_consiglio_ministri.imageset/logo_consiglio_ministri.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/Contents.json b/ios/ItaliaApp/Images.xcassets/logo_io.imageset/Contents.json
index 8217da938e6..b96ee49db12 100644
--- a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/Contents.json
+++ b/ios/ItaliaApp/Images.xcassets/logo_io.imageset/Contents.json
@@ -1,23 +1,15 @@
{
"images" : [
{
- "filename" : "io-app-logo.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "filename" : "io-app-logo@2x.png",
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "filename" : "io-app-logo@3x.png",
- "idiom" : "universal",
- "scale" : "3x"
+ "filename" : "logo_io.svg",
+ "idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
+ },
+ "properties" : {
+ "preserves-vector-representation" : true
}
}
diff --git a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo.png b/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo.png
deleted file mode 100644
index 2734d0b64d5..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo.png and /dev/null differ
diff --git a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo@2x.png b/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo@2x.png
deleted file mode 100644
index c9364152e28..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo@2x.png and /dev/null differ
diff --git a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo@3x.png b/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo@3x.png
deleted file mode 100644
index 333146f2cc5..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/io-app-logo@3x.png and /dev/null differ
diff --git a/ios/ItaliaApp/Images.xcassets/logo_io.imageset/logo_io.svg b/ios/ItaliaApp/Images.xcassets/logo_io.imageset/logo_io.svg
new file mode 100644
index 00000000000..cded5bf083e
--- /dev/null
+++ b/ios/ItaliaApp/Images.xcassets/logo_io.imageset/logo_io.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/Contents.json b/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/Contents.json
index 4d1d95eeb61..b499e9e931e 100644
--- a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/Contents.json
+++ b/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/Contents.json
@@ -1,23 +1,15 @@
{
"images" : [
{
- "filename" : "logo_pagopa.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "filename" : "pagopa - logo - darkbg - grayscale - transparency@2x.png",
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "filename" : "pagopa - logo - darkbg - grayscale - transparency@3x.png",
- "idiom" : "universal",
- "scale" : "3x"
+ "filename" : "logo_pagopa.svg",
+ "idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
+ },
+ "properties" : {
+ "preserves-vector-representation" : true
}
}
diff --git a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/logo_pagopa.png b/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/logo_pagopa.png
deleted file mode 100644
index 65fcac8645d..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/logo_pagopa.png and /dev/null differ
diff --git a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/logo_pagopa.svg b/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/logo_pagopa.svg
new file mode 100644
index 00000000000..744feee4f31
--- /dev/null
+++ b/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/logo_pagopa.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/pagopa - logo - darkbg - grayscale - transparency@2x.png b/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/pagopa - logo - darkbg - grayscale - transparency@2x.png
deleted file mode 100644
index 15ffa878a1b..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/pagopa - logo - darkbg - grayscale - transparency@2x.png and /dev/null differ
diff --git a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/pagopa - logo - darkbg - grayscale - transparency@3x.png b/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/pagopa - logo - darkbg - grayscale - transparency@3x.png
deleted file mode 100644
index 26ae73dd950..00000000000
Binary files a/ios/ItaliaApp/Images.xcassets/logo_pagopa.imageset/pagopa - logo - darkbg - grayscale - transparency@3x.png and /dev/null differ
diff --git a/ios/ItaliaApp/Info.plist b/ios/ItaliaApp/Info.plist
index fb5ab19ec9d..29a5eb5a6b2 100644
--- a/ios/ItaliaApp/Info.plist
+++ b/ios/ItaliaApp/Info.plist
@@ -17,7 +17,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 2.53.0
+ 2.58.0
CFBundleSignature
????
CFBundleURLTypes
@@ -110,6 +110,18 @@
RobotoMono-RegularItalic.ttf
ReadexPro-Regular.ttf
DMMono-Medium.ttf
+ TitilliumSansPro-Black.otf
+ TitilliumSansPro-BlackItalic.otf
+ TitilliumSansPro-Bold.otf
+ TitilliumSansPro-BoldItalic.otf
+ TitilliumSansPro-Italic.otf
+ TitilliumSansPro-Light.otf
+ TitilliumSansPro-LightItalic.otf
+ TitilliumSansPro-Regular.otf
+ TitilliumSansPro-Semibold.otf
+ TitilliumSansPro-SemiboldItalic.otf
+ TitilliumSansPro-Thin.otf
+ TitilliumSansPro-ThinItalic.otf
UIBackgroundModes
diff --git a/ios/ItaliaApp/LaunchScreen.storyboard b/ios/ItaliaApp/LaunchScreen.storyboard
index fe52cff7812..a4d279bc190 100644
--- a/ios/ItaliaApp/LaunchScreen.storyboard
+++ b/ios/ItaliaApp/LaunchScreen.storyboard
@@ -1,9 +1,9 @@
-
+
-
+
@@ -22,69 +22,50 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
+
-
-
-
-
-
-
+
+
-
-
-
+
+
-
+
-
+
+
+
@@ -95,10 +76,10 @@
-
-
+
+
-
+
diff --git a/ios/ItaliaApp/de.lproj/InfoPlist.strings b/ios/ItaliaApp/de.lproj/InfoPlist.strings
new file mode 100644
index 00000000000..80f19a40455
--- /dev/null
+++ b/ios/ItaliaApp/de.lproj/InfoPlist.strings
@@ -0,0 +1,7 @@
+"NSCameraUsageDescription" = "Du kannst QR-Codes lesen und pagoPA-Mitteilungen bezahlen.";
+"NSCalendarsUsageDescription" = "Du kannst Fälligkeiten in deinem Kalender eintragen und eine Benachrichtigung einstellen.";
+"NSContactsUsageDescription" = "IO benötigt Zugriff auf deine Kontakte, damit du sie als Teilnehmer zu Terminen hinzufügen kannst.";
+"NSFaceIDUsageDescription" = "IO benötigt Zugriff auf Face ID, um eine schnellere Authentifizierung zu ermöglichen.";
+"NSPhotoLibraryUsageDescription" = "Du kannst Gutscheine und Zertifikate speichern und Screenshots und Zahlungsmitteilungen hochladen.";
+"NSMicrophoneUsageDescription" = "IO benötigt Zugriff auf das Mikrofon, wenn du eine Sprachnachricht senden möchtest.";
+"NSPhotoLibraryAddUsageDescription" = "Du kannst Bilder aus der App auf deinem Gerät speichern.";
\ No newline at end of file
diff --git a/ios/ItaliaApp/de.lproj/Localizable.strings b/ios/ItaliaApp/de.lproj/Localizable.strings
new file mode 100755
index 00000000000..43bb22c1062
--- /dev/null
+++ b/ios/ItaliaApp/de.lproj/Localizable.strings
@@ -0,0 +1,2 @@
+"ALERT_DEVICE_ROOTED_TITLE" = "Gerät mit Jailbreak";
+"ALERT_DEVICE_ROOTED_DESC" = "Dieses Gerät ist gejailbreakt, du kannst diese App aus Sicherheitsgründen nicht verwenden";
diff --git a/ios/ItaliaAppTests/Info.plist b/ios/ItaliaAppTests/Info.plist
index 23908b163b5..d4c8a536487 100644
--- a/ios/ItaliaAppTests/Info.plist
+++ b/ios/ItaliaAppTests/Info.plist
@@ -15,7 +15,7 @@
CFBundlePackageType
BNDL
CFBundleShortVersionString
- 2.53.0
+ 2.58.0
CFBundleSignature
????
CFBundleVersion
diff --git a/ios/Podfile b/ios/Podfile
index 74b7bbb04aa..e90b1202f53 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -23,8 +23,9 @@ target 'ItaliaApp' do
pod 'ReactNativeART', :podspec => '../node_modules/@react-native-community/art/ReactNativeART.podspec'
use_react_native!(
:path => config[:reactNativePath],
- # to enable hermes on iOS, change `false` to `true` and then install pods
- :production => production,
+ # Hermes is now enabled by default. Disable by setting this flag to false.
+ # Upcoming versions of React Native may rely on get_default_flags(), but
+ # we make it explicit here to aid in the React Native upgrade process.
:hermes_enabled => true,
:fabric_enabled => false,
# An absolute path to your application root.
@@ -44,10 +45,26 @@ target 'ItaliaApp' do
end
post_install do |installer|
- react_native_post_install(installer)
+ react_native_post_install(
+ installer,
+ # Set `mac_catalyst_enabled` to `true` in order to apply patches
+ # necessary for Mac Catalyst builds
+ :mac_catalyst_enabled => false
+ )
+ __apply_Xcode_12_5_M1_post_install_workaround(installer)
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
+ if target.name == 'Flipper'
+ file_path = 'Pods/Flipper/xplat/Flipper/FlipperTransportTypes.h'
+ contents = File.read(file_path)
+ unless contents.include?('#include ')
+ File.open(file_path, 'w') do |file|
+ file.puts('#include ')
+ file.puts(contents)
+ end
+ end
+ end
# This is needed in order to build the project on Apple silicon.
# Beware that after this modification you need Rosetta to run the app
# on the simulator.
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 3e3269eef8a..7e61b148698 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,17 +1,18 @@
PODS:
+ - Alamofire (5.8.1)
- boost (1.76.0)
- BVLinearGradient (2.5.6):
- React
- CocoaAsyncSocket (7.6.5)
- DoubleConversion (1.1.6)
- - FBLazyVector (0.69.9)
- - FBReactNativeSpec (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - RCTRequired (= 0.69.9)
- - RCTTypeSafety (= 0.69.9)
- - React-Core (= 0.69.9)
- - React-jsi (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
+ - FBLazyVector (0.70.15)
+ - FBReactNativeSpec (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTRequired (= 0.70.15)
+ - RCTTypeSafety (= 0.70.15)
+ - React-Core (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
- Flipper (0.154.0):
- Flipper-Folly (~> 2.6)
- Flipper-Boost-iOSX (1.76.0.1.11)
@@ -74,15 +75,15 @@ PODS:
- FlipperKit/FlipperKitNetworkPlugin
- fmt (6.2.1)
- glog (0.3.5)
- - GoogleDataTransport (9.1.2):
- - GoogleUtilities/Environment (~> 7.2)
- - nanopb (~> 2.30908.0)
+ - GoogleDataTransport (9.3.0):
+ - GoogleUtilities/Environment (~> 7.7)
+ - nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- - GoogleMLKit/BarcodeScanning (2.5.0):
+ - GoogleMLKit/BarcodeScanning (4.0.0):
- GoogleMLKit/MLKitCore
- - MLKitBarcodeScanning (~> 1.6.0)
- - GoogleMLKit/MLKitCore (2.5.0):
- - MLKitCommon (~> 5.0.0)
+ - MLKitBarcodeScanning (~> 3.0.0)
+ - GoogleMLKit/MLKitCore (4.0.0):
+ - MLKitCommon (~> 9.0.0)
- GoogleToolboxForMac/DebugUtils (2.3.2):
- GoogleToolboxForMac/Defines (= 2.3.2)
- GoogleToolboxForMac/Defines (2.3.2)
@@ -95,277 +96,288 @@ PODS:
- GoogleToolboxForMac/Defines (= 2.3.2)
- "GoogleToolboxForMac/NSString+URLArguments (= 2.3.2)"
- "GoogleToolboxForMac/NSString+URLArguments (2.3.2)"
- - GoogleUtilities/Environment (7.7.0):
+ - GoogleUtilities/Environment (7.12.0):
- PromisesObjC (< 3.0, >= 1.2)
- - GoogleUtilities/Logger (7.7.0):
+ - GoogleUtilities/Logger (7.12.0):
- GoogleUtilities/Environment
- - GoogleUtilities/UserDefaults (7.7.0):
+ - GoogleUtilities/UserDefaults (7.12.0):
- GoogleUtilities/Logger
- GoogleUtilitiesComponents (1.1.0):
- GoogleUtilities/Logger
- - GTMSessionFetcher/Core (1.7.0)
- - hermes-engine (0.69.9)
+ - GTMSessionFetcher/Core (2.3.0)
+ - hermes-engine (0.70.15)
- jail-monkey (2.3.2):
- React
- libevent (2.1.12)
- - Mixpanel (3.6.5)
- - MLImage (1.0.0-beta2)
- - MLKitBarcodeScanning (1.6.0):
- - MLKitCommon (~> 5.0)
- - MLKitVision (~> 3.0)
- - MLKitCommon (5.0.0):
+ - Mixpanel-swift (4.2.0):
+ - Mixpanel-swift/Complete (= 4.2.0)
+ - Mixpanel-swift/Complete (4.2.0)
+ - MixpanelReactNative (2.4.1):
+ - Mixpanel-swift (= 4.2.0)
+ - React-Core
+ - MLImage (1.0.0-beta4)
+ - MLKitBarcodeScanning (3.0.0):
+ - MLKitCommon (~> 9.0)
+ - MLKitVision (~> 5.0)
+ - MLKitCommon (9.0.0):
- GoogleDataTransport (~> 9.0)
- GoogleToolboxForMac/Logger (~> 2.1)
- "GoogleToolboxForMac/NSData+zlib (~> 2.1)"
- "GoogleToolboxForMac/NSDictionary+URLArguments (~> 2.1)"
- GoogleUtilities/UserDefaults (~> 7.0)
- GoogleUtilitiesComponents (~> 1.0)
- - GTMSessionFetcher/Core (~> 1.1)
- - Protobuf (~> 3.12)
- - MLKitVision (3.0.0):
+ - GTMSessionFetcher/Core (< 3.0, >= 1.1)
+ - MLKitVision (5.0.0):
- GoogleToolboxForMac/Logger (~> 2.1)
- "GoogleToolboxForMac/NSData+zlib (~> 2.1)"
- - GTMSessionFetcher/Core (~> 1.1)
- - MLImage (= 1.0.0-beta2)
- - MLKitCommon (~> 5.0)
- - Protobuf (~> 3.12)
- - nanopb (2.30908.0):
- - nanopb/decode (= 2.30908.0)
- - nanopb/encode (= 2.30908.0)
- - nanopb/decode (2.30908.0)
- - nanopb/encode (2.30908.0)
+ - GTMSessionFetcher/Core (< 3.0, >= 1.1)
+ - MLImage (= 1.0.0-beta4)
+ - MLKitCommon (~> 9.0)
+ - nanopb (2.30909.1):
+ - nanopb/decode (= 2.30909.1)
+ - nanopb/encode (= 2.30909.1)
+ - nanopb/decode (2.30909.1)
+ - nanopb/encode (2.30909.1)
- OpenSSL-Universal (1.1.1100)
- - pagopa-io-react-native-crypto (0.2.1):
+ - pagopa-io-react-native-crypto (0.3.0):
+ - React-Core
+ - pagopa-io-react-native-http-client (0.1.3):
+ - Alamofire
- React-Core
- - pagopa-io-react-native-login-utils (0.2.2):
+ - pagopa-io-react-native-login-utils (1.0.0):
- React-Core
- - PromisesObjC (2.0.0)
- - Protobuf (3.19.1)
- - RCT-Folly (2021.06.28.00-v2):
+ - pagopa-react-native-zendesk (0.3.29):
+ - React-Core
+ - ZendeskAnswerBotSDK
+ - ZendeskChatSDK
+ - ZendeskMessagingAPISDK
+ - ZendeskSupportSDK
+ - PromisesObjC (2.3.1)
+ - RCT-Folly (2021.07.22.00):
- boost
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- - RCT-Folly/Default (= 2021.06.28.00-v2)
- - RCT-Folly/Default (2021.06.28.00-v2):
+ - RCT-Folly/Default (= 2021.07.22.00)
+ - RCT-Folly/Default (2021.07.22.00):
- boost
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- - RCT-Folly/Futures (2021.06.28.00-v2):
+ - RCT-Folly/Futures (2021.07.22.00):
- boost
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- libevent
- - RCTRequired (0.69.9)
- - RCTTypeSafety (0.69.9):
- - FBLazyVector (= 0.69.9)
- - RCTRequired (= 0.69.9)
- - React-Core (= 0.69.9)
- - React (0.69.9):
- - React-Core (= 0.69.9)
- - React-Core/DevSupport (= 0.69.9)
- - React-Core/RCTWebSocket (= 0.69.9)
- - React-RCTActionSheet (= 0.69.9)
- - React-RCTAnimation (= 0.69.9)
- - React-RCTBlob (= 0.69.9)
- - React-RCTImage (= 0.69.9)
- - React-RCTLinking (= 0.69.9)
- - React-RCTNetwork (= 0.69.9)
- - React-RCTSettings (= 0.69.9)
- - React-RCTText (= 0.69.9)
- - React-RCTVibration (= 0.69.9)
- - React-bridging (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-jsi (= 0.69.9)
- - React-callinvoker (0.69.9)
- - React-Codegen (0.69.9):
- - FBReactNativeSpec (= 0.69.9)
- - RCT-Folly (= 2021.06.28.00-v2)
- - RCTRequired (= 0.69.9)
- - RCTTypeSafety (= 0.69.9)
- - React-Core (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-Core (0.69.9):
+ - RCTRequired (0.70.15)
+ - RCTTypeSafety (0.70.15):
+ - FBLazyVector (= 0.70.15)
+ - RCTRequired (= 0.70.15)
+ - React-Core (= 0.70.15)
+ - React (0.70.15):
+ - React-Core (= 0.70.15)
+ - React-Core/DevSupport (= 0.70.15)
+ - React-Core/RCTWebSocket (= 0.70.15)
+ - React-RCTActionSheet (= 0.70.15)
+ - React-RCTAnimation (= 0.70.15)
+ - React-RCTBlob (= 0.70.15)
+ - React-RCTImage (= 0.70.15)
+ - React-RCTLinking (= 0.70.15)
+ - React-RCTNetwork (= 0.70.15)
+ - React-RCTSettings (= 0.70.15)
+ - React-RCTText (= 0.70.15)
+ - React-RCTVibration (= 0.70.15)
+ - React-bridging (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-jsi (= 0.70.15)
+ - React-callinvoker (0.70.15)
+ - React-Codegen (0.70.15):
+ - FBReactNativeSpec (= 0.70.15)
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTRequired (= 0.70.15)
+ - RCTTypeSafety (= 0.70.15)
+ - React-Core (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-Core (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-Core/Default (= 0.69.9)
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.70.15)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/CoreModulesHeaders (0.69.9):
+ - React-Core/CoreModulesHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/Default (0.69.9):
+ - React-Core/Default (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - RCT-Folly (= 2021.07.22.00)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/DevSupport (0.69.9):
+ - React-Core/DevSupport (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-Core/Default (= 0.69.9)
- - React-Core/RCTWebSocket (= 0.69.9)
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-jsinspector (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.70.15)
+ - React-Core/RCTWebSocket (= 0.70.15)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-jsinspector (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTActionSheetHeaders (0.69.9):
+ - React-Core/RCTActionSheetHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTAnimationHeaders (0.69.9):
+ - React-Core/RCTAnimationHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTBlobHeaders (0.69.9):
+ - React-Core/RCTBlobHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTImageHeaders (0.69.9):
+ - React-Core/RCTImageHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTLinkingHeaders (0.69.9):
+ - React-Core/RCTLinkingHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTNetworkHeaders (0.69.9):
+ - React-Core/RCTNetworkHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTSettingsHeaders (0.69.9):
+ - React-Core/RCTSettingsHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTTextHeaders (0.69.9):
+ - React-Core/RCTTextHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTVibrationHeaders (0.69.9):
+ - React-Core/RCTVibrationHeaders (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
+ - RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-Core/RCTWebSocket (0.69.9):
+ - React-Core/RCTWebSocket (0.70.15):
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-Core/Default (= 0.69.9)
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.70.15)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- Yoga
- - React-CoreModules (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.69.9)
- - React-Codegen (= 0.69.9)
- - React-Core/CoreModulesHeaders (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-RCTImage (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-cxxreact (0.69.9):
+ - React-CoreModules (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.15)
+ - React-Codegen (= 0.70.15)
+ - React-Core/CoreModulesHeaders (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-RCTImage (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-cxxreact (0.70.15):
- boost (= 1.76.0)
- DoubleConversion
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-callinvoker (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsinspector (= 0.69.9)
- - React-logger (= 0.69.9)
- - React-perflogger (= 0.69.9)
- - React-runtimeexecutor (= 0.69.9)
- - React-hermes (0.69.9):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-callinvoker (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsinspector (= 0.70.15)
+ - React-logger (= 0.70.15)
+ - React-perflogger (= 0.70.15)
+ - React-runtimeexecutor (= 0.70.15)
+ - React-hermes (0.70.15):
- DoubleConversion
- glog
- hermes-engine
- - RCT-Folly (= 2021.06.28.00-v2)
- - RCT-Folly/Futures (= 2021.06.28.00-v2)
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-jsiexecutor (= 0.69.9)
- - React-jsinspector (= 0.69.9)
- - React-perflogger (= 0.69.9)
- - React-jsi (0.69.9):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCT-Folly/Futures (= 2021.07.22.00)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-jsiexecutor (= 0.70.15)
+ - React-jsinspector (= 0.70.15)
+ - React-perflogger (= 0.70.15)
+ - React-jsi (0.70.15):
- boost (= 1.76.0)
- DoubleConversion
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-jsi/Default (= 0.69.9)
- - React-jsi/Default (0.69.9):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-jsi/Default (= 0.70.15)
+ - React-jsi/Default (0.70.15):
- boost (= 1.76.0)
- DoubleConversion
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-jsiexecutor (0.69.9):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-jsiexecutor (0.70.15):
- DoubleConversion
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-perflogger (= 0.69.9)
- - React-jsinspector (0.69.9)
- - React-logger (0.69.9):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-perflogger (= 0.70.15)
+ - React-jsinspector (0.70.15)
+ - React-logger (0.70.15):
- glog
- react-native-background-timer (2.1.1):
- React
@@ -379,7 +391,7 @@ PODS:
- React-Core
- react-native-cookies (6.2.1):
- React-Core
- - react-native-document-picker (9.0.1):
+ - react-native-document-picker (9.1.1):
- React-Core
- react-native-fingerprint-scanner (6.0.0):
- React
@@ -389,9 +401,8 @@ PODS:
- React-Core
- react-native-image-picker (4.10.3):
- React-Core
- - react-native-mixpanel (1.2.0):
- - Mixpanel (~> 3.6.0)
- - React
+ - react-native-pager-view (6.2.3):
+ - React-Core
- react-native-pdf (6.4.0):
- React-Core
- react-native-pdf-thumbnail (1.2.1):
@@ -410,72 +421,72 @@ PODS:
- React
- react-native-webview (11.26.1):
- React-Core
- - React-perflogger (0.69.9)
- - React-RCTActionSheet (0.69.9):
- - React-Core/RCTActionSheetHeaders (= 0.69.9)
- - React-RCTAnimation (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.69.9)
- - React-Codegen (= 0.69.9)
- - React-Core/RCTAnimationHeaders (= 0.69.9)
- - React-jsi (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-RCTBlob (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-Codegen (= 0.69.9)
- - React-Core/RCTBlobHeaders (= 0.69.9)
- - React-Core/RCTWebSocket (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-RCTNetwork (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-RCTImage (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.69.9)
- - React-Codegen (= 0.69.9)
- - React-Core/RCTImageHeaders (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-RCTNetwork (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-RCTLinking (0.69.9):
- - React-Codegen (= 0.69.9)
- - React-Core/RCTLinkingHeaders (= 0.69.9)
- - React-jsi (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-RCTNetwork (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.69.9)
- - React-Codegen (= 0.69.9)
- - React-Core/RCTNetworkHeaders (= 0.69.9)
- - React-jsi (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-RCTSettings (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.69.9)
- - React-Codegen (= 0.69.9)
- - React-Core/RCTSettingsHeaders (= 0.69.9)
- - React-jsi (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-RCTText (0.69.9):
- - React-Core/RCTTextHeaders (= 0.69.9)
- - React-RCTVibration (0.69.9):
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-Codegen (= 0.69.9)
- - React-Core/RCTVibrationHeaders (= 0.69.9)
- - React-jsi (= 0.69.9)
- - ReactCommon/turbomodule/core (= 0.69.9)
- - React-runtimeexecutor (0.69.9):
- - React-jsi (= 0.69.9)
- - ReactCommon/turbomodule/core (0.69.9):
+ - React-perflogger (0.70.15)
+ - React-RCTActionSheet (0.70.15):
+ - React-Core/RCTActionSheetHeaders (= 0.70.15)
+ - React-RCTAnimation (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.15)
+ - React-Codegen (= 0.70.15)
+ - React-Core/RCTAnimationHeaders (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-RCTBlob (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Codegen (= 0.70.15)
+ - React-Core/RCTBlobHeaders (= 0.70.15)
+ - React-Core/RCTWebSocket (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-RCTNetwork (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-RCTImage (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.15)
+ - React-Codegen (= 0.70.15)
+ - React-Core/RCTImageHeaders (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-RCTNetwork (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-RCTLinking (0.70.15):
+ - React-Codegen (= 0.70.15)
+ - React-Core/RCTLinkingHeaders (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-RCTNetwork (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.15)
+ - React-Codegen (= 0.70.15)
+ - React-Core/RCTNetworkHeaders (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-RCTSettings (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.15)
+ - React-Codegen (= 0.70.15)
+ - React-Core/RCTSettingsHeaders (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-RCTText (0.70.15):
+ - React-Core/RCTTextHeaders (= 0.70.15)
+ - React-RCTVibration (0.70.15):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Codegen (= 0.70.15)
+ - React-Core/RCTVibrationHeaders (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - ReactCommon/turbomodule/core (= 0.70.15)
+ - React-runtimeexecutor (0.70.15):
+ - React-jsi (= 0.70.15)
+ - ReactCommon/turbomodule/core (0.70.15):
- DoubleConversion
- glog
- - RCT-Folly (= 2021.06.28.00-v2)
- - React-bridging (= 0.69.9)
- - React-callinvoker (= 0.69.9)
- - React-Core (= 0.69.9)
- - React-cxxreact (= 0.69.9)
- - React-jsi (= 0.69.9)
- - React-logger (= 0.69.9)
- - React-perflogger (= 0.69.9)
+ - RCT-Folly (= 2021.07.22.00)
+ - React-bridging (= 0.70.15)
+ - React-callinvoker (= 0.70.15)
+ - React-Core (= 0.70.15)
+ - React-cxxreact (= 0.70.15)
+ - React-jsi (= 0.70.15)
+ - React-logger (= 0.70.15)
+ - React-perflogger (= 0.70.15)
- ReactNativeART (1.2.0):
- React
- ReactNativeExceptionHandler (2.10.8):
@@ -486,17 +497,13 @@ PODS:
- React-Core
- RNCClipboard (1.10.0):
- React-Core
- - RNCPicker (2.4.1):
- - React-Core
- RNCPushNotificationIOS (1.8.0):
- React-Core
- - RNDateTimePicker (3.5.2):
- - React-Core
- RNDeviceInfo (10.8.0):
- React-Core
- RNFS (2.18.0):
- React
- - RNGestureHandler (2.12.0):
+ - RNGestureHandler (2.15.0):
- React-Core
- RNI18n (2.0.15):
- React
@@ -536,21 +543,16 @@ PODS:
- React-RCTText
- ReactCommon/turbomodule/core
- Yoga
- - RNScreens (2.18.1):
+ - RNScreens (3.30.1):
- React-Core
+ - React-RCTImage
- RNSha256 (1.2.3):
- React
- RNShare (7.3.9):
- React-Core
- - RNSVG (12.3.0):
+ - RNSVG (15.1.0):
- React-Core
- - RNZendeskChat (0.3.23):
- - React
- - ZendeskAnswerBotSDK (~> 3.0.0)
- - ZendeskChatSDK (~> 3.0.0)
- - ZendeskMessagingAPISDK (~> 4.0.0)
- - ZendeskSupportSDK (~> 6.0.0)
- - SocketRocket (0.6.0)
+ - SocketRocket (0.6.1)
- vision-camera-code-scanner (0.2.0):
- GoogleMLKit/BarcodeScanning
- React-Core
@@ -561,28 +563,28 @@ PODS:
- Yoga (1.14.0)
- YogaKit (1.18.1):
- Yoga (~> 1.14)
- - ZendeskAnswerBotProvidersSDK (3.0.0):
- - ZendeskSupportProvidersSDK (= 6.0.0)
- - ZendeskAnswerBotSDK (3.0.0):
- - ZendeskAnswerBotProvidersSDK (= 3.0.0)
- - ZendeskMessagingSDK (= 4.0.0)
- - ZendeskChatProvidersSDK (3.0.0)
- - ZendeskChatSDK (3.0.0):
- - ZendeskChatProvidersSDK (= 3.0.0)
- - ZendeskMessagingSDK (= 4.0.0)
- - ZendeskCommonUISDK (7.0.0)
- - ZendeskCoreSDK (3.0.0)
- - ZendeskMessagingAPISDK (4.0.0):
- - ZendeskSDKConfigurationsSDK (= 2.0.0)
- - ZendeskMessagingSDK (4.0.0):
- - ZendeskCommonUISDK (= 7.0.0)
- - ZendeskMessagingAPISDK (= 4.0.0)
- - ZendeskSDKConfigurationsSDK (2.0.0)
- - ZendeskSupportProvidersSDK (6.0.0):
- - ZendeskCoreSDK (= 3.0.0)
- - ZendeskSupportSDK (6.0.0):
- - ZendeskMessagingSDK (= 4.0.0)
- - ZendeskSupportProvidersSDK (= 6.0.0)
+ - ZendeskAnswerBotProvidersSDK (5.0.0):
+ - ZendeskSupportProvidersSDK (~> 8.0.0)
+ - ZendeskAnswerBotSDK (5.0.0):
+ - ZendeskAnswerBotProvidersSDK (~> 5.0.0)
+ - ZendeskMessagingSDK (~> 6.0.0)
+ - ZendeskChatProvidersSDK (5.0.0)
+ - ZendeskChatSDK (5.0.0):
+ - ZendeskChatProvidersSDK (~> 5.0.0)
+ - ZendeskMessagingSDK (~> 6.0.0)
+ - ZendeskCommonUISDK (9.0.0)
+ - ZendeskCoreSDK (5.0.0)
+ - ZendeskMessagingAPISDK (6.0.0):
+ - ZendeskSDKConfigurationsSDK (~> 4.0.0)
+ - ZendeskMessagingSDK (6.0.0):
+ - ZendeskCommonUISDK (~> 9.0.0)
+ - ZendeskMessagingAPISDK (~> 6.0.0)
+ - ZendeskSDKConfigurationsSDK (4.0.0)
+ - ZendeskSupportProvidersSDK (8.0.0):
+ - ZendeskCoreSDK (~> 5.0.0)
+ - ZendeskSupportSDK (8.0.0):
+ - ZendeskMessagingSDK (~> 6.0.0)
+ - ZendeskSupportProvidersSDK (~> 8.0.0)
- ZXingObjC (3.6.5):
- ZXingObjC/All (= 3.6.5)
- ZXingObjC/All (3.6.5)
@@ -618,9 +620,12 @@ DEPENDENCIES:
- hermes-engine (from `../node_modules/react-native/sdks/hermes/hermes-engine.podspec`)
- jail-monkey (from `../node_modules/jail-monkey`)
- libevent (~> 2.1.12)
+ - MixpanelReactNative (from `../node_modules/mixpanel-react-native`)
- OpenSSL-Universal (= 1.1.1100)
- "pagopa-io-react-native-crypto (from `../node_modules/@pagopa/io-react-native-crypto`)"
+ - "pagopa-io-react-native-http-client (from `../node_modules/@pagopa/io-react-native-http-client`)"
- "pagopa-io-react-native-login-utils (from `../node_modules/@pagopa/io-react-native-login-utils`)"
+ - "pagopa-react-native-zendesk (from `../node_modules/@pagopa/io-react-native-zendesk`)"
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
@@ -647,7 +652,7 @@ DEPENDENCIES:
- react-native-flipper (from `../node_modules/react-native-flipper`)
- react-native-get-random-values (from `../node_modules/react-native-get-random-values`)
- react-native-image-picker (from `../node_modules/react-native-image-picker`)
- - react-native-mixpanel (from `../node_modules/react-native-mixpanel`)
+ - react-native-pager-view (from `../node_modules/react-native-pager-view`)
- react-native-pdf (from `../node_modules/react-native-pdf`)
- react-native-pdf-thumbnail (from `../node_modules/react-native-pdf-thumbnail`)
- react-native-render-html (from `../node_modules/react-native-render-html`)
@@ -674,9 +679,7 @@ DEPENDENCIES:
- RNCalendarEvents (from `../node_modules/react-native-calendar-events`)
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
- "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)"
- - "RNCPicker (from `../node_modules/@react-native-picker/picker`)"
- "RNCPushNotificationIOS (from `../node_modules/@react-native-community/push-notification-ios`)"
- - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)"
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
- RNFS (from `../node_modules/react-native-fs`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
@@ -690,13 +693,13 @@ DEPENDENCIES:
- RNSha256 (from `../node_modules/react-native-sha256`)
- RNShare (from `../node_modules/react-native-share`)
- RNSVG (from `../node_modules/react-native-svg`)
- - RNZendeskChat (from `../node_modules/io-react-native-zendesk`)
- vision-camera-code-scanner (from `../node_modules/vision-camera-code-scanner`)
- VisionCamera (from `../node_modules/react-native-vision-camera`)
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
SPEC REPOS:
trunk:
+ - Alamofire
- CocoaAsyncSocket
- Flipper
- Flipper-Boost-iOSX
@@ -715,7 +718,7 @@ SPEC REPOS:
- GoogleUtilitiesComponents
- GTMSessionFetcher
- libevent
- - Mixpanel
+ - Mixpanel-swift
- MLImage
- MLKitBarcodeScanning
- MLKitCommon
@@ -723,7 +726,6 @@ SPEC REPOS:
- nanopb
- OpenSSL-Universal
- PromisesObjC
- - Protobuf
- SocketRocket
- YogaKit
- ZendeskAnswerBotProvidersSDK
@@ -756,10 +758,16 @@ EXTERNAL SOURCES:
:podspec: "../node_modules/react-native/sdks/hermes/hermes-engine.podspec"
jail-monkey:
:path: "../node_modules/jail-monkey"
+ MixpanelReactNative:
+ :path: "../node_modules/mixpanel-react-native"
pagopa-io-react-native-crypto:
:path: "../node_modules/@pagopa/io-react-native-crypto"
+ pagopa-io-react-native-http-client:
+ :path: "../node_modules/@pagopa/io-react-native-http-client"
pagopa-io-react-native-login-utils:
:path: "../node_modules/@pagopa/io-react-native-login-utils"
+ pagopa-react-native-zendesk:
+ :path: "../node_modules/@pagopa/io-react-native-zendesk"
RCT-Folly:
:podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
RCTRequired:
@@ -810,8 +818,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-get-random-values"
react-native-image-picker:
:path: "../node_modules/react-native-image-picker"
- react-native-mixpanel:
- :path: "../node_modules/react-native-mixpanel"
+ react-native-pager-view:
+ :path: "../node_modules/react-native-pager-view"
react-native-pdf:
:path: "../node_modules/react-native-pdf"
react-native-pdf-thumbnail:
@@ -864,12 +872,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-async-storage/async-storage"
RNCClipboard:
:path: "../node_modules/@react-native-clipboard/clipboard"
- RNCPicker:
- :path: "../node_modules/@react-native-picker/picker"
RNCPushNotificationIOS:
:path: "../node_modules/@react-native-community/push-notification-ios"
- RNDateTimePicker:
- :path: "../node_modules/@react-native-community/datetimepicker"
RNDeviceInfo:
:path: "../node_modules/react-native-device-info"
RNFS:
@@ -896,8 +900,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-share"
RNSVG:
:path: "../node_modules/react-native-svg"
- RNZendeskChat:
- :path: "../node_modules/io-react-native-zendesk"
vision-camera-code-scanner:
:path: "../node_modules/vision-camera-code-scanner"
VisionCamera:
@@ -906,12 +908,13 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
- boost: a7c83b31436843459a1961bfd74b96033dc77234
+ Alamofire: 3ca42e259043ee0dc5c0cdd76c4bc568b8e42af7
+ boost: 9fa78656d705f55b1220151d997e57e2a3f2cde0
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
- FBLazyVector: d3c1d2923b1009f4e709e8f1b793dedf5b323454
- FBReactNativeSpec: d460df7d796ed4979c6cd4e092145b63eb28b5bb
+ FBLazyVector: 9cf707e46f9bd90816b7c91b2c1c8b8a2f549527
+ FBReactNativeSpec: 5ce1ea97a4309ded19af6c21f13f63ee3cabfed2
Flipper: 53851f5b89559bb6e251572589dc166d1f8d6e2e
Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c
Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30
@@ -922,53 +925,55 @@ SPEC CHECKSUMS:
Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541
FlipperKit: 51cf8b6f5b0931e251c57d4d60a15a1c2ba546aa
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
- glog: 3d02b25ca00c2d456734d0bcff864cbc62f6ae1a
- GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940
- GoogleMLKit: 0d7f5aa2f8a2f2ea9d849a05abdbe80974b0ec83
+ glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
+ GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe
+ GoogleMLKit: 2bd0dc6253c4d4f227aad460f69215a504b2980e
GoogleToolboxForMac: 8bef7c7c5cf7291c687cf5354f39f9db6399ad34
- GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
+ GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34
GoogleUtilitiesComponents: 679b2c881db3b615a2777504623df6122dd20afe
- GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
- hermes-engine: f648f65e30dd2ef478c08024259c881f0a1522bf
+ GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
+ hermes-engine: 2592781da1571e4375dfd897f9462638c2d0ceb9
jail-monkey: d7c5048b2336f22ee9c9e0efa145f1f917338ea9
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
- Mixpanel: de8296d8568806ab17bfced0f823c908b808e1e0
- MLImage: a454f9f8ecfd537783a12f9488f5be1a68820829
- MLKitBarcodeScanning: 867463093fe27a31260898e239d5d8305be29b28
- MLKitCommon: 3bc17c6f7d25ce3660f030350b46ae7ec9ebca6e
- MLKitVision: e87dc3f2e456a6ab32361ebd985e078dd2746143
- nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
+ Mixpanel-swift: e5dd85295923e6a875acf17ccbab8d2ecb10ea65
+ MixpanelReactNative: 0101b8828c2f335c128850e71ab7d3b7adde089a
+ MLImage: 7bb7c4264164ade9bf64f679b40fb29c8f33ee9b
+ MLKitBarcodeScanning: 04e264482c5f3810cb89ebc134ef6b61e67db505
+ MLKitCommon: c1b791c3e667091918d91bda4bba69a91011e390
+ MLKitVision: 8baa5f46ee3352614169b85250574fde38c36f49
+ nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5
OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
- pagopa-io-react-native-crypto: 644fece16966f2e1ea1f872344ee5a3c6c8761a1
- pagopa-io-react-native-login-utils: 51a58dc0e5fe3cba461759b9e98e795fc22e17c8
- PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58
- Protobuf: 3724efa50cb2846d7ccebc8691c574e85fd74471
- RCT-Folly: b9d9fe1fc70114b751c076104e52f3b1b5e5a95a
- RCTRequired: fe80e9f71dd15939e5399dd94d0aa0e5e069d592
- RCTTypeSafety: 4c802f7c4b9e7c55470e7fc56d50385cbfcce89b
- React: efe0b6d0b7401a208d2d1bf8320c0b6a0dcd593b
- React-bridging: 11a324da43d8467cfe528ccff0e00ab43bdf1cf4
- React-callinvoker: d4d34002df449053784f1131a6382e526d172395
- React-Codegen: 63eb91553568558cbd6fb2f336c3ff2fea66b37a
- React-Core: 2875b1749729d07ef7cacef36e8b1381f27cc86e
- React-CoreModules: 8b6665f9b128b875660d75a7144122c742ad4af9
- React-cxxreact: 76d426551a4d1d6f623ef8f87a26690d5a6be93e
- React-hermes: 9adb1d978e6d6b39fb6f4a4b340e50bf1fcfdf08
- React-jsi: 47b65f4f789f198004c47e5b6ceaae95ea3f3659
- React-jsiexecutor: 3b506d7fc50275bf44f8fd5624f23eaedd78bf78
- React-jsinspector: 5b92a5a30e02e1a21802f293cc71e05d887c7378
- React-logger: 96d904c5bc87c2660d48e6a36fb2edf65f9cfb11
+ pagopa-io-react-native-crypto: 6aa9f33e4bf64ef420ad97c720c1ad0f876cd470
+ pagopa-io-react-native-http-client: 14b1ed3cd090108f9cb324f951811fe556b81e51
+ pagopa-io-react-native-login-utils: 442a5e2ab8db2c476fed2cff6d7ad16388ff1f21
+ pagopa-react-native-zendesk: e4a63ee0745a567b641110f7ff78e457086ab7a3
+ PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
+ RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda
+ RCTRequired: 2a96ea90ffddd10cc43115bd93803692e09b5d9a
+ RCTTypeSafety: 02c99baddcf0b3393bf58e6d9b792e83a37716b4
+ React: 45e3210df90d25ec6da7fc286943b377b63a92ec
+ React-bridging: e3a18265bbd59003562e29429985e0923a5b6286
+ React-callinvoker: 344ff205a470c3c99b4daf0a2dff9bc29045d6c5
+ React-Codegen: 2b1765b0e1a38b8b3601178ca27c1e9216e81632
+ React-Core: 93efb81ef85fafee7f83f7ef6ecf546b2e1ee2c0
+ React-CoreModules: 4eb535b1650b718cb3680767c1b9a1cacf649cbc
+ React-cxxreact: 283248db3101de28d6cf0fe438a2dc95537ee472
+ React-hermes: 5439b771de0b04930c97888cc4c28852aa37389c
+ React-jsi: 560bdf0bc36d5c137ac962c0eb4b60b50c304d77
+ React-jsiexecutor: d2eebcd5a432f90be3baa5d1309f47d05478ea61
+ React-jsinspector: bfedded1f4f562d29c2d4a8bb795c9a150a739e4
+ React-logger: 31f198387a04172be49fe38e41a082560a81aeeb
react-native-background-timer: 1b6e6b4e10f1b74c367a1fdc3c72b67c619b222b
react-native-blob-util: a5d3561045ed98cfb2fb80cbbff600fae0e8edee
react-native-cameraroll: 2f08db1ecc9b73dbc01f89335d6d5179fac2894c
react-native-config: 6502b1879f97ed5ac570a029961fc35ea606cd14
react-native-cookies: f54fcded06bb0cda05c11d86788020b43528a26c
- react-native-document-picker: 2b8f18667caee73a96708a82b284a4f40b30a156
+ react-native-document-picker: 3599b238843369026201d2ef466df53f77ae0452
react-native-fingerprint-scanner: ac6656f18c8e45a7459302b84da41a44ad96dbbe
react-native-flipper: 97d537d855e0e7f6ac26a065e01bf1aecc8ba41c
react-native-get-random-values: 237bffb1c7e05fb142092681531810a29ba53015
react-native-image-picker: 60f4246eb5bb7187fc15638a8c1f13abd3820695
- react-native-mixpanel: d644efe1ca33d2646d5cba29e24a13ebc9b37209
+ react-native-pager-view: c29d484f19c49ff19525a94105e4ab2c4d4ae273
react-native-pdf: a6a5a3f0bdf340eb2eed6c96034424d2cc3f84b0
react-native-pdf-thumbnail: a042fffdab7a49f0f9df0e11da0a90beebfd4241
react-native-render-html: 96c979fe7452a0a41559685d2f83b12b93edac8c
@@ -978,58 +983,55 @@ SPEC CHECKSUMS:
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-view-shot: 4475fde003fe8a210053d1f98fb9e06c1d834e1c
react-native-webview: 9f111dfbcfc826084d6c507f569e5e03342ee1c1
- React-perflogger: f6f4b3c63629ead2e8a5a22eaedd06368c31617a
- React-RCTActionSheet: 5e95058e99c53313d778d96b7f37697ce3a9418e
- React-RCTAnimation: c4f86d756d8398c674f61d00075993a368d83480
- React-RCTBlob: c74cb1350831866b3b23c2379ccc3a5909593bc5
- React-RCTImage: cc72e4092e08c7070d1dce7704fbdcdfc9e0a721
- React-RCTLinking: dca79b9df468980462a399a630156f5a5fc0b5bc
- React-RCTNetwork: 0dfb918fd237b6fa4e3820769c57a6a0ad61f934
- React-RCTSettings: a9fb6736139ddf8e7d11842c8a948c47c1ae603d
- React-RCTText: 87456d45e8bcc0c831b7c7fcfcfd860a54f54a79
- React-RCTVibration: ea899478e6f10ee526f476f769ab33211be2addd
- React-runtimeexecutor: df1518d092e8c74cafddc56690d1ac386ec24d7a
- ReactCommon: fac40473e2c4117522384027ab33ad0cb6717dc5
+ React-perflogger: 010e98d3335e5185a8f7496babca50d82a042e84
+ React-RCTActionSheet: 0f585d684b540a5bbfc62b0a1fbc5292cff2aefc
+ React-RCTAnimation: eb0e5b020333f9cc652d85f27a47086fbf56fffd
+ React-RCTBlob: 4af18ad2a64515c3ede9b829e8532f1508e00894
+ React-RCTImage: 08787efa5378ad0e7344943eed1b898619cf956a
+ React-RCTLinking: ea7ec6fbfdb04df7895c39f15f0e7479acc43bca
+ React-RCTNetwork: 926b436b6afada9905d969a8e3713cf204905a00
+ React-RCTSettings: cc083c9b6e126b7e6ea1128e64837d8b78ceb219
+ React-RCTText: c36ddf2bda5131b325e1c2763700f0a63a963e1d
+ React-RCTVibration: 12a2a859fa22368d2fc3ca7594504fd130b91a18
+ React-runtimeexecutor: 04332dda2f2335ea4ddaf9255de069d3269f4e8b
+ ReactCommon: 200471e0841cf2f7cde1fa2ef3d3c199ed970c07
ReactNativeART: 78edc68dd4a1e675338cd0cd113319cf3a65f2ab
ReactNativeExceptionHandler: 8025d98049c25f186835a3af732dd7c9974d6dce
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
RNCAsyncStorage: 0c357f3156fcb16c8589ede67cc036330b6698ca
RNCClipboard: f1736c75ab85b627a4d57587edb4b60999c4dd80
- RNCPicker: abc646b53a3d28ccfa3232c927a0ca52e0cf024d
RNCPushNotificationIOS: 61a7c72bd1ebad3568025957d001e0f0e7b32191
- RNDateTimePicker: 7658208086d86d09e1627b5c34ba0cf237c60140
RNDeviceInfo: 5795b418ed3451ebcaf39384e6cf51f60cb931c9
RNFS: 3ab21fa6c56d65566d1fb26c2228e2b6132e5e32
- RNGestureHandler: dec4645026e7401a0899f2846d864403478ff6a5
+ RNGestureHandler: 0cba6c7c51a90cd793cf2475cf7fdca613ede300
RNI18n: e2f7e76389fcc6e84f2c8733ea89b92502351fd8
RNKeychain: 840f8e6f13be0576202aefcdffd26a4f54bfe7b5
RNPermissions: b3d9d00889e37cc184d365ab04bb7a3f20811b1c
RNQrGenerator: 1676221c08bfabec978242989c733810dad20959
RNReactNativeHapticFeedback: 6d24decfa94e037c2ecc312407d2a057b7933f10
- RNReanimated: 7faa787e8d4493fbc95fab2ad331fa7625828cfa
- RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d
+ RNReanimated: 60e291d42c77752a0f6d6f358387bdf225a87c6e
+ RNScreens: 848541d154d2a184131b34e468b10aa33008f357
RNSha256: ab608b2185fb806185a2cc112e0474065842e085
RNShare: 807d6f8231b8ebcf6dd839294b877342eb93d4e5
- RNSVG: 302bfc9905bd8122f08966dc2ce2d07b7b52b9f8
- RNZendeskChat: 338c369def4e1552a533d9d34155b4b491aaf3d7
- SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608
+ RNSVG: 50cf2c7018e57cf5d3522d98d0a3a4dd6bf9d093
+ SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
vision-camera-code-scanner: dda884a7f3ec8243a2a6d6489b91860648371bca
- VisionCamera: 5fc30ecebdfd0335d11123ec9511dcbc27ee4046
- Yoga: 7a4d48cfb35dfa542151e615fa73c1a0d88caf21
+ VisionCamera: e9a95af10e00aaebe99d648ff4519fd336e16ffe
+ Yoga: d6134eb3d6e3675afc1d6d65ccb3169b60e21980
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
- ZendeskAnswerBotProvidersSDK: 7eca94f07f10a567c631321601a645b2ba35c2da
- ZendeskAnswerBotSDK: 31bd28c7c9732243d4bf3b850c441a3cdd6eba50
- ZendeskChatProvidersSDK: af93e02e2058875f92e6ad86e74ee51203b4079e
- ZendeskChatSDK: fe03650a5ebe3d35fd1f4da90792021f809bcf11
- ZendeskCommonUISDK: f06dbac6c9e74c3afff75ecdc6bec3832b23258c
- ZendeskCoreSDK: ce6dbb5eb4d61d2d061547a92bd0b0fe98602e9d
- ZendeskMessagingAPISDK: 95a99f1eab9482b4106ec88466b93a89f9f7c5fa
- ZendeskMessagingSDK: 4f5f3d43766bb3b2ea6411d1331cfe609ff33618
- ZendeskSDKConfigurationsSDK: a5c21010e17b71d02bc2cfe73dcc9da1efa0a7b2
- ZendeskSupportProvidersSDK: 685b5d185af47ced0ec40564ec46355c838bbd06
- ZendeskSupportSDK: 92e6f9d334e81e9186f8a17583862350460a5393
+ ZendeskAnswerBotProvidersSDK: a024260282886870a15e7a986bf5286c23fd9311
+ ZendeskAnswerBotSDK: b9f74105b26fda5f74d6639c0dc8fe37f522a867
+ ZendeskChatProvidersSDK: fa1c5acd7fd09157b5994fb05a3b1628409fdfd1
+ ZendeskChatSDK: 40fa26f80a589eb38c6cecf17af71206da7bcaf3
+ ZendeskCommonUISDK: b87f90874386ebcc01f4b2a0b20a28c62658987a
+ ZendeskCoreSDK: cdc814e7fd64764fb0b0acb04e596df437708faa
+ ZendeskMessagingAPISDK: 9ce539eebcaa014fe6acc44da31262a2c52891c1
+ ZendeskMessagingSDK: ccc8dd41b774b0d2f94733505b9f1882d72184da
+ ZendeskSDKConfigurationsSDK: 79c444da987390456ec05657ffa2f5ca0eb54aef
+ ZendeskSupportProvidersSDK: 4aafe8114a9bba1a98dc03ca14d8fa6510cf4e70
+ ZendeskSupportSDK: 8cf921c496269bb5f53aac9320f3d002a793991d
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
-PODFILE CHECKSUM: 4a1130da2ee9cd7365bb5a5290feaed31a6bd470
+PODFILE CHECKSUM: 7dfdfa4afe9355d54bec685917054fc54ab9040f
-COCOAPODS: 1.12.1
+COCOAPODS: 1.15.2
diff --git a/ios/link-assets-manifest.json b/ios/link-assets-manifest.json
index 2327e470f54..2b9428a8c65 100644
--- a/ios/link-assets-manifest.json
+++ b/ios/link-assets-manifest.json
@@ -45,6 +45,54 @@
"path": "assets/fonts/TitilliumWeb/TitilliumWeb-SemiBoldItalic.ttf",
"sha1": "f81d3a5f38c6bda1fb3547bf91fe0b68b54066c5"
},
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Black.otf",
+ "sha1": "becf8bd5053f5529785c9d1d975f2d6f54446d47"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-BlackItalic.otf",
+ "sha1": "079c243911ef9d6cbb25f5e25b0a0fcdc80e217a"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Bold.otf",
+ "sha1": "5348d5fdb96da25b0b444b6cf433100e17b2c944"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-BoldItalic.otf",
+ "sha1": "19b6af581aa9de369c5551b5c81af4567e96fd33"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Italic.otf",
+ "sha1": "149caa0987bb4765e34a34ccc315d89a9d5b259c"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Light.otf",
+ "sha1": "096f9b521b0fc0e7ebe6c60890fbfe312e7e4b01"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-LightItalic.otf",
+ "sha1": "9a74303f47edd127dc6f2c48301c9b0d4ffbbf17"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Regular.otf",
+ "sha1": "0a8be559a9a9d8ce47eb6ca3de9db16f42a00580"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Semibold.otf",
+ "sha1": "fa6cff8c0046996bc9fb124abf5799408eb3b369"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-SemiboldItalic.otf",
+ "sha1": "8502e9c211803bb2b0446348c69cf56763c987a3"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-Thin.otf",
+ "sha1": "dd3f889e6ca51de7e2006418b0125c02421fe574"
+ },
+ {
+ "path": "assets/fonts/TitilliumSansPro/TitilliumSansPro-ThinItalic.otf",
+ "sha1": "fb0f0fcc215d93fd4241f3af18408b7c42b33b3d"
+ },
{
"path": "assets/fonts/ReadexPro/ReadexPro-Regular.ttf",
"sha1": "93e4080794b725f216a94b57ed62a51bc77bce91"
diff --git a/jest-e2e.config.js b/jest-e2e.config.js
index 21194829495..a1a7a518bf1 100644
--- a/jest-e2e.config.js
+++ b/jest-e2e.config.js
@@ -1,10 +1,7 @@
module.exports = {
preset: "react-native",
- transform: {
- "^.+\\.js$": "/node_modules/react-native/jest/preprocessor.js"
- },
transformIgnorePatterns: [
- "node_modules/(?!(jest-)?@react-native|react-native|react-navigation|@react-navigation|react-navigation-redux-helpers|react-native-device-info|native-base|native-base-shoutem-theme|@shoutem/animation|@shoutem/ui|rn-placeholder|jsbarcode|@pagopa/react-native-cie|react-native-share|jail-monkey|@react-native-community/art|@react-native-community/push-notification-ios|@react-native-camera-roll/camera-roll|@codler|@react-native-community/datetimepicker)"
+ "node_modules/(?!(jest-)?@react-native|react-native|react-navigation|@react-navigation|react-navigation-redux-helpers|react-native-device-info|native-base|native-base-shoutem-theme|@shoutem/animation|@shoutem/ui|rn-placeholder|jsbarcode|@pagopa/react-native-cie|react-native-share|jail-monkey|@react-native-community/art|@react-native-community/push-notification-ios|@react-native-camera-roll/camera-roll|@codler|mixpanel-react-native)"
],
moduleNameMapper: {
"\\.svg": "/ts/__mocks__/svgMock.js"
diff --git a/jest.config.js b/jest.config.js
index 2b4929b5032..5d6fdc7c042 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -1,15 +1,15 @@
module.exports = {
preset: "react-native",
- transform: {
- "^.+\\.js$": "/node_modules/react-native/jest/preprocessor.js"
- },
transformIgnorePatterns: [
- "node_modules/(?!(jest-)?@react-native|react-native|react-navigation|@react-navigation|react-navigation-redux-helpers|react-native-device-info|native-base|native-base-shoutem-theme|@shoutem/animation|@shoutem/ui|rn-placeholder|jsbarcode|@pagopa/react-native-cie|react-native-share|jail-monkey|@react-native-community/art|@react-native-community/push-notification-ios|@react-native-camera-roll/camera-roll|@codler|@react-native-community/datetimepicker|remark|unified|bail|is-plain-obj|trough|vfile|unist-util-stringify-position|mdast-util-from-markdown|mdast-util-to-string|micromark|parse-entities|character-entities|mdast-util-to-markdown|zwitch|longest-streak|@pagopa/io-react-native-zendesk|rn-qr-generator)"
+ "node_modules/(?!(jest-)?@react-native|react-native|react-navigation|@react-navigation|react-navigation-redux-helpers|react-native-device-info|native-base|native-base-shoutem-theme|@shoutem/animation|@shoutem/ui|rn-placeholder|jsbarcode|@pagopa/react-native-cie|react-native-share|jail-monkey|@react-native-community/art|@react-native-community/push-notification-ios|@react-native-camera-roll/camera-roll|@codler|remark|unified|bail|is-plain-obj|trough|vfile|unist-util-stringify-position|mdast-util-from-markdown|mdast-util-to-string|micromark|parse-entities|character-entities|mdast-util-to-markdown|zwitch|longest-streak|@pagopa/io-react-native-zendesk|rn-qr-generator|mixpanel-react-native)"
],
moduleNameMapper: {
"\\.svg": "/ts/__mocks__/svgMock.js"
},
- setupFiles: ["./jestSetup.js"],
+ setupFiles: [
+ "./jestSetup.js",
+ "./node_modules/react-native-gesture-handler/jestSetup.js"
+ ],
globalSetup: "./jestGlobalSetup.js",
setupFilesAfterEnv: [
"@testing-library/jest-native/extend-expect",
diff --git a/jest.config.no.timezone.js b/jest.config.no.timezone.js
index c9197d78ffd..fd0e92bebe9 100644
--- a/jest.config.no.timezone.js
+++ b/jest.config.no.timezone.js
@@ -4,12 +4,15 @@ module.exports = {
"^.+\\.js$": "/node_modules/react-native/jest/preprocessor.js"
},
transformIgnorePatterns: [
- "node_modules/(?!(jest-)?@react-native|react-native|react-navigation|@react-navigation|react-navigation-redux-helpers|react-native-device-info|native-base|native-base-shoutem-theme|@shoutem/animation|@shoutem/ui|rn-placeholder|jsbarcode|@pagopa/react-native-cie|react-native-share|jail-monkey|@react-native-community/art|@react-native-community/push-notification-ios|@react-native-camera-roll/camera-roll|@codler|@react-native-community/datetimepicker|remark|unified|bail|is-plain-obj|trough|vfile|unist-util-stringify-position|mdast-util-from-markdown|mdast-util-to-string|micromark|parse-entities|character-entities|mdast-util-to-markdown|zwitch|longest-streak|@pagopa/io-react-native-zendesk)"
+ "node_modules/(?!(jest-)?@react-native|react-native|react-navigation|@react-navigation|react-navigation-redux-helpers|react-native-device-info|native-base|native-base-shoutem-theme|@shoutem/animation|@shoutem/ui|rn-placeholder|jsbarcode|@pagopa/react-native-cie|react-native-share|jail-monkey|@react-native-community/art|@react-native-community/push-notification-ios|@react-native-camera-roll/camera-roll|@codler|remark|unified|bail|is-plain-obj|trough|vfile|unist-util-stringify-position|mdast-util-from-markdown|mdast-util-to-string|micromark|parse-entities|character-entities|mdast-util-to-markdown|zwitch|longest-streak|@pagopa/io-react-native-zendesk|mixpanel-react-native)"
],
moduleNameMapper: {
"\\.svg": "/ts/__mocks__/svgMock.js"
},
- setupFiles: ["./jestSetup.js"],
+ setupFiles: [
+ "./jestSetup.js",
+ "./node_modules/react-native-gesture-handler/jestSetup.js"
+ ],
setupFilesAfterEnv: [
"@testing-library/jest-native/extend-expect",
"./jestSetupAfterEnv.js"
diff --git a/jestSetup.js b/jestSetup.js
index 60213bda3a4..97170930ce8 100644
--- a/jestSetup.js
+++ b/jestSetup.js
@@ -11,21 +11,10 @@ import mockRNDeviceInfo from "react-native-device-info/jest/react-native-device-
import mockRNCameraRoll from "@react-native-camera-roll/camera-roll/src/__mocks__/nativeInterface";
import mockZendesk from "./ts/__mocks__/io-react-native-zendesk.ts";
-// eslint-disable-next-line functional/immutable-data
-NativeModules.RNGestureHandlerModule = {
- attachGestureHandler: jest.fn(),
- createGestureHandler: jest.fn(),
- dropGestureHandler: jest.fn(),
- updateGestureHandler: jest.fn(),
- forceTouchAvailable: jest.fn(),
- State: {},
- Directions: {}
-};
-
jest.mock("@pagopa/io-react-native-zendesk", () => mockZendesk);
jest.mock("@react-native-async-storage/async-storage", () => mockAsyncStorage);
-jest.mock("@react-native-community/push-notification-ios", jest.fn());
-jest.mock("@react-native-cookies/cookies", jest.fn());
+jest.mock("@react-native-community/push-notification-ios", () => jest.fn());
+jest.mock("@react-native-cookies/cookies", () => jest.fn());
jest.mock("react-native-share", () => jest.fn());
jest.mock("@react-native-clipboard/clipboard", () => mockClipboard);
jest.mock("@react-native-camera-roll/camera-roll", () => mockRNCameraRoll);
@@ -47,8 +36,8 @@ jest.mock("react-native-reanimated", () => {
});
jest.mock("react-native-blob-util", () => ({
- DocumentDir: jest.fn(),
- polyfill: jest.fn()
+ DocumentDir: () => jest.fn(),
+ polyfill: () => jest.fn()
}));
// eslint-disable-next-line functional/immutable-data
@@ -68,16 +57,16 @@ global.fetch = nodeFetch;
// eslint-disable-next-line @typescript-eslint/no-explicit-any,functional/immutable-data
global.AbortController = AbortController;
-jest.mock("remark-directive", jest.fn());
-jest.mock("remark-rehype", jest.fn());
-jest.mock("rehype-stringify", jest.fn());
-jest.mock("rehype-format", jest.fn());
-jest.mock("unist-util-visit", jest.fn());
-jest.mock("hastscript", jest.fn());
+jest.mock("remark-directive", () => jest.fn());
+jest.mock("remark-rehype", () => jest.fn());
+jest.mock("rehype-stringify", () => jest.fn());
+jest.mock("rehype-format", () => jest.fn());
+jest.mock("unist-util-visit", () => jest.fn());
+jest.mock("hastscript", () => jest.fn());
jest.mock("react-native-device-info", () => mockRNDeviceInfo);
-global.__reanimatedWorkletInit = jest.fn();
+global.__reanimatedWorkletInit = () => jest.fn();
jest.mock("@gorhom/bottom-sheet", () => {
// eslint-disable-next-line @typescript-eslint/no-var-requires
@@ -105,3 +94,32 @@ jest.mock("react-native-pdf", () => jest.fn());
jest.mock("react-native-permissions", () =>
require("react-native-permissions/mock")
);
+
+/*
+ * Turbo modules mocks.
+ */
+
+jest.mock("react-native/Libraries/TurboModule/TurboModuleRegistry", () => {
+ const turboModuleRegistry = jest.requireActual(
+ "react-native/Libraries/TurboModule/TurboModuleRegistry"
+ );
+ return {
+ ...turboModuleRegistry,
+ getEnforcing: name => {
+ // List of TurboModules libraries to mock.
+ const modulesToMock = ["RNDocumentPicker"];
+ if (modulesToMock.includes(name)) {
+ return null;
+ }
+ return turboModuleRegistry.getEnforcing(name);
+ }
+ };
+});
+
+jest.mock("mixpanel-react-native", () => ({
+ __esModule: true,
+ default: () => jest.fn(),
+ Mixpanel: jest.fn(() => ({
+ init: jest.fn()
+ }))
+}));
diff --git a/locales/de/index.yml b/locales/de/index.yml
index 1a5c90fb118..a2d6438f7f9 100644
--- a/locales/de/index.yml
+++ b/locales/de/index.yml
@@ -248,7 +248,6 @@ permissionRationale:
title: "Zugriff auf die Kamera gewähren"
message: "Wir brauchen Zugang zur Kamera, um die Taschenlampenfunktion zu benutzen."
startup:
- title: "Initialisierung"
authentication: "Benutzer authentifiziert"
sessionInfo: "SPID-Attribute geladen"
profileInfo: "Benutzerprofil geladen"
@@ -534,11 +533,7 @@ authentication:
hint: "Karussell mit einer einführenden Anleitung zur IO-Funktionalität. Wähle, um den Inhalt kennenzulernen."
session_expired:
title: "Deine Sitzung ist abgelaufen"
- body: "Aus Sicherheitsgründen bitten wir dich {{days}} Tage nach deiner letzten Anmeldung mit SPID oder CIE, deine Anmeldedaten erneut einzugeben, um IO zu benutzen."
- cie_unsupported:
- title: "Anmeldung mit CIE nicht möglich"
- os_version_unsupported: "ein Betriebssystem mit Android 6.0 oder höher"
- nfc_incompatible: "ein kompatibler NFC-Sensor"
+ body: "Aus Sicherheitsgründen bitten wir dich, dich alle {{days}} Tage oder wenn du die App verlässt, mit SPID oder CIE anzumelden."
contentTitleCie: "Du hast keinen SPID oder CIE?"
spid_or_cie: "Um IO nutzen zu können, musst du über eine dieser digitalen Werkzeuge verfügen, die deine Identität in sicherer Weise bestätigen."
request_cie: "CIE anfordern"
@@ -549,6 +544,7 @@ authentication:
loginSpidCie: "Anmeldung mit SPID oder CIE"
infoSpidCie: "Einführung in SPID und CIE"
loginSpidCieContent: "Ab heute kannst du dich zusätzlich zu SPID mit deiner elektronischen Identitätskarte (CIE) anmelden"
+ privacyLink: "Datenschutzerklärung"
nospid: "Du hast keinen SPID? Erfahre mehr"
nospid-nocie: "Du hast keinen SPID und keine CIE? Erfahre mehr"
card1-title: "Alle Mitteilungen an einem Ort"
@@ -557,10 +553,8 @@ authentication:
card2-content: "Du kannst eine Steuer oder eine Strafe über dein Bankkonto oder mit deiner Bankkarte bezahlen"
card3-title: "Bezahle schnell eine Aufforderung in Papierform"
card3-content: "Durch das Scannen des QR-Codes kannst du schnell und einfach eine Zahlungsaufforderung in Papierform bezahlen"
- card4-title: "Du kannst dich nur mit SPID anmelden"
- card4-content: "Das von dir verwendete Gerät unterstützt den Zugang mit einer elektronischen Identitätskarte (CIE) nicht"
- card5-title: "Willkommen bei der ersten öffentlichen Version von IO!"
- card5-content: "In der rechten oberen Ecke findest du das Symbol '?', mit dem du einen Chat mit dem IO-Team beginnen kannst, wenn etwas nicht so funktioniert, wie es sollte."
+ card5-title: "Willkommen in IO!"
+ card5-content: "Lass uns gemeinsam herausfinden, was du machen kannst"
card5-content-accessibility: "Wähle das vorherige Element, um einen Chat mit dem IO-Team zu beginnen, wenn etwas nicht so funktioniert, wie es sollte."
expiredCardTitle: "Karte abgelaufen oder nicht mehr gültig"
expiredCardHeaderTitle: "Anmeldung mit CIE"
@@ -646,12 +640,12 @@ authentication:
contextualHelpContent: "Hier findest du Informationen darüber, wie du dich bei IO authentifizieren kannst, sowie einige Sicherheitstipps."
news: "Neu"
title: "Ab sofort kannst du leichter auf IO zugreifen"
- identity_check: "Du musst dich nicht mehr alle 30 Tage mit SPID oder CIE authentifizieren, sondern nur noch einmal im Jahr oder wenn du die App verlässt"
+ identity_check: "Du musst dich nicht mehr alle 30 Tage mit SPID oder CIE identifizieren, sondern nur noch einmal im Jahr oder wenn du die App verlässt"
security_suggests: "Einige Sicherheitstipps"
passcode: "In allen anderen Fällen reicht dein Gesicht, dein Fingerabdruck oder dein Entsperrcode aus."
notification: "Du erhältst bei jedem neuen Zugang eine E-Mail. Wenn du diese nicht erkennst, kannst dz den Zugang zu IO sperren."
button_accept_lv: "Ja, Schnellzugriff einrichten"
- button_decline_lv: "Nein, ich möchte mich alle 30 Tage neu anmelden"
+ button_decline_lv: "Melde dich alle 30 Tage mit SPID oder CIE an"
security_suggestions:
fingerprint: "Gib deinen biometrischen Erkennungs- oder Entsperrcode nicht an Dritte weiter."
io_logout: "Wenn du dieses Gerät verlierst, beende IO über die Website"
@@ -715,10 +709,6 @@ authentication:
email:
cduScreens:
validateMail:
- title: "Du hast deine E-Mail-Adresse nicht bestätigt"
- subtitle: "Um die App weiter nutzen zu können, musst du deine E-Mail-Adresse bestätigen"
- editButton: "E-Mail-Adresse ändern"
- validateButton: "E-Mail-Adresse bestätigen"
header:
title: "IO konfigurieren"
help:
@@ -726,7 +716,6 @@ email:
emailAlreadyTaken:
title: "Deine E-Mail-Adresse ändern"
subtitleStart: "Deine E-Mail-Adresse"
- subtitleEnd: "wird bereits auf IO verwendet; du musst eine andere eingeben, um die App weiter benutzen zu können."
editButton: "E-Mail-Adresse ändern"
header:
title: "IO konfigurieren"
@@ -756,7 +745,7 @@ email:
label: "Persönliche E-Mail Adresse"
alert:
title: "Die E-Mail {{email}}, die mit Ihrer SPID-Identität verknüpft ist, wird bereits auf IO verwendet, bitte geben Sie eine andere ein."
- description: "E-Mail bereits in Gebrauch"
+ description1: "E-Mail bereits in Gebrauch"
modaltitle: "Diese E-Mail ist bereits in Gebrauch"
modaldescription: "Dies kann der Fall sein, wenn Sie dieselbe Adresse wie ein Familienmitglied haben"
modalbutton: "Andere E-Mail verwenden"
@@ -785,6 +774,7 @@ email:
title: "Bestätige deine E-Mail-Adresse"
subtitle: "Folge den Anweisungen, die an folgende Adresse gesendet wurden:"
link: "Ist sie nicht korrekt?"
+ countdowntext: "Eine neue E-Mail anfordern in "
buttonlabelsent: "E-Mail gesendet"
buttonlabelsentagain: "E-Mail erneut senden"
toast: "Erledigt! Prüf deinen Posteingang."
@@ -970,6 +960,11 @@ wallet:
title: "Möchtest du in der App bezahlen?"
content: "Finde heraus, welche Zahlungsmethoden du in dein Konto aufnehmen kannst."
cta: "Mehr erfahren"
+ error:
+ title: "Es ist ein Fehler aufgetreten"
+ subtitle: "Versuche es erneut oder kontaktiere den Support"
+ primaryButton: "Schließen"
+ secondaryButton: "Erneut versuchen"
wallet: "Konto"
refreshWallet: "Konto aktualisieren"
favourite:
@@ -1001,7 +996,7 @@ wallet:
text3: "Wenn du möchtest, kannst du die Bank wählen, bei der du eine aktive PagoBANCOMAT-Karte hast. "
text4: "Liste der verfügbaren Banken"
bpay:
- title: "Zahle auf IO mit BANCOMAT Pay"
+ title: "Zahle auf IO mit BANCOMAT-Pay"
description:
text1: "Füge BANCOMAT Pay hinzu, um pagoPA-Zahlungsaufforderungen einfacher zu bezahlen sowie an den auf IO verfügbaren Initiativen teilzunehmen.\nWenn du fortfährst, akzeptierst du die "
text2: "Datenschutzbestimmungen."
@@ -1023,7 +1018,7 @@ wallet:
creditCard: "{{brand}}-Karte, die Kartennummer endet mit {{blurredNumber}}"
bancomat: "BANCOMAT {{bankName}}"
coBadge: "{{brand}}-Karte, {{bankName}}"
- bancomatPay: "BANCOMATPay {{bankName}}"
+ bancomatPay: "BANCOMAT Pay {{bankName}}"
cta: "Details zur Zahlungsmethode anzeigen"
bankNotAvailable: "Bankenname nicht verfügbar"
addElement: "Element zum Konto hinzufügen"
@@ -1037,7 +1032,7 @@ wallet:
bancomat:
headerTitle: "PagoBANCOMAT-Karte hinzufügen"
koTimeout:
- title: "Wir konnten deine PagoBANCOMAT Karten nicht finden"
+ title: "Wir konnten deine PagoBANCOMAT-Karten nicht finden"
body: "Versuche es erneut"
koNotFound:
title: "Wir konnten keine Karten finden"
@@ -1155,10 +1150,11 @@ wallet:
title: "Ich weiß es nicht"
description: "Wir durchsuchen alle auf deinem Namen lautenden Karten bei den am Dienst teilnehmenden Banken"
generalError: "Beim Hinzufügen der Zahlungsmethode trat ein allgemeiner Fehler auf"
- success:
- title: "Die Karte wurde hinzugefügt!"
- continueButton: "Weiter"
- failure:
+ outcome:
+ SUCCESS:
+ title: "Die Karte wurde hinzugefügt!"
+ subtitle: ""
+ primaryAction: "Weiter"
GENERIC_ERROR:
title: "Es ist ein unerwarteter Fehler aufgetreten"
subtitle: "Versuche es erneut oder kontaktiere den Support"
@@ -1184,6 +1180,10 @@ wallet:
title: "Du hast diese Zahlungsmethode bereits hinzugefügt"
subtitle: ""
primaryAction: "Schließen"
+ BPAY_NOT_FOUND:
+ title: "Wir haben kein aktives BANCOMAT Pay Konto gefunden."
+ subtitle: "Wende dich an deine Bank, um den Dienst zu aktivieren."
+ primaryAction: "Schließen"
alert:
supportedCardPageLinkError: "Beim Öffnen der Übersichtsseite der unterstützten Karten ist ein Fehler aufgetreten."
msgErrorUpdateApp: "Beim Öffnen des App-Stores ist ein Fehler aufgetreten"
@@ -1687,6 +1687,12 @@ wallet:
subtitle: "Es wurde kein Betrag abgebucht.\nDu hast wahrscheinlich die Obergrenze deiner Zahlungsmethode überschritten."
INVALID_METHOD:
title: "Die Zahlungsmethode wird nicht unterstützt"
+ WAITING_CONFIRMATION_EMAIL:
+ title: "Warte auf eine Bestätigung per E-Mail"
+ subtitle: "Es war nicht möglich, das Ergebnis der Zahlung zu überprüfen. Wenn sie erfolgreich war, wirst du in Kürze eine E-Mail erhalten. Sollte diese nicht ankommen, kontaktiere bitte den Support."
+ METHOD_NOT_ENABLED:
+ title: "Zahlungsmethode in der App aktivieren"
+ subtitle: "Bevor du die Zahlung erneut versuchst, wähle die Zahlungsmethode in deinem Konto aus und aktiviere die Funktion “Zahlungen in der App”."
support:
button: "Support kontaktieren"
supportTitle: "Support kontaktieren"
@@ -1819,6 +1825,7 @@ messages:
success: "Wiederherstellung durchgeführt."
failure: "Die Wiederherstellung ist fehlgeschlagen"
messageDetails:
+ accessibilityAttachmentIcon: "Enthält Anhänge"
contextualHelpTitle: "Mitteilungsdetails"
headerTitle: "Mitteilung"
emptyMessage: "Kein Inhalt"
@@ -1857,13 +1864,18 @@ messageDetails:
action: "Mehr erfahren"
bottomSheet:
title: "Was ist eine dynamische Mitteilung?"
- body: "Die versendende Körperschaft kann den Inhalt dieser Nachricht auch nach dem Versand aktualisieren, um sicherzustellen, dass die Informationen stets korrekt und relevant sind.\n\n Dies geschieht in bestimmten Fällen, wie z. B. bei der Aktualisierung veralteter Informationen oder nicht mehr gültiger Anlagen.\n\n Wenn die Körperschaft dich über neue Informationen oder wichtige Aktualisierungen informieren muss, wird sie dies mittels einer neuen Mitteilung tun."
+ body: "Die versendende Körperschaft kann den Inhalt dieser Nachricht auch nach dem Versand aktualisieren, um sicherzustellen, dass die Informationen stets korrekt und relevant sind.\n\n Dies geschieht in bestimmten Fällen, wie z. B. bei der Aktualisierung veralteter Informationen oder nicht mehr gültiger Anhänge.\n\n Wenn die Körperschaft dich über neue Informationen oder wichtige Aktualisierungen informieren muss, wird sie dies mittels einer neuen Mitteilung tun."
messagePDFPreview:
title: "PDF-Vorschau"
- singleBtn: "Speichern oder freigeben"
+ singleBtn: "Speichern oder teilen"
+ singleBtnAccessibility: "Dokument speichern oder teilen"
open: "Öffnen"
save: "Speichern"
+ saveAccessibility: "Dokument speichern"
savedAtLocation: "Das Dokument {{name}} wurde im Ordner Download gespeichert."
+ share: "Teilen"
+ shareAccessibility: "Dokument teilen"
+ pdfAccessibility: "Vorschau PDF-Dokument"
errors:
previewing:
title: "Keine Vorschau verfügbar"
@@ -1976,16 +1988,13 @@ serviceDetail:
disabled: "deaktiviert"
notValidated: "Um die E-Mail-Weiterleitung zu aktivieren, musst du deine E-Mail-Adresse bestätigen."
identification:
- title: "Hallo!"
+ title: "Hallo {{name}}!"
titleProfileName: "Hallo {{profileName}}!"
titleValidation: "Bestätige den Vorgang"
logout: "Abmelden"
logoutProfileName: "Du bist nicht {{profileName}}?"
logoutDescription: "Du kannst dich mit deinem SPID oder deiner CIE anmelden. Diese Sitzung wird abgemeldet."
- logoutDescriptionProfileName: "Du kannst dich mit deinem SPID oder deiner CIE anmelden. Die Sitzung von {{profileName}} wird abgemeldet."
- subtitleCode: "Gib deinen Entsperrcode ein"
- subtitleCodeFingerprint: "Verwende den Fingerabdruck oder gib den Entsperrcode ein"
- subtitleCodeFaceId: "Verwende FaceID oder gib den Entsperrcode ein"
+ logoutDescriptionProfileName: "Du kannst dich mit deinem SPID oder deiner CIE anmelden. Die Sitzung von {{profileName}} wird abgemeldet."
biometric:
fingerprintType: "Fingerabdruck"
title: "Biometrische Identifikation"
@@ -1993,10 +2002,7 @@ identification:
reason: "Identifikation durch TouchID fehlgeschlagen"
title: "Identifikation erforderlich"
sensorDescription: "Berührungssensor"
- fail:
- remainingAttempts: "Du hast noch {{attempts}} Versuche übrig."
- remainingAttemptSingle: "Du hast noch einen Versuch übrig."
- tooManyAttempts: "Zu viele falsche Versuche."
+ fail:
waitMessage: "Versuche es erneut in:"
unlockCode:
accessibility:
@@ -2220,12 +2226,20 @@ bonus:
other: "{{seconds}} Sekunden"
features:
messages:
+ attachmentDownloadFeedback: "Download läuft"
+ attachments: "Anhänge"
loading:
title: "Die Details der Mitteilung werden geladen"
subtitle: "Warte ein paar Sekunden"
updateBottomSheet:
title: "Aktualisiere die IO-App"
subtitle: "App IO Version {{value}} ist erforderlich, um diese Funktion zu nutzen. Bitte aktualisiere die App, um fortzufahren."
+ badge:
+ dueDate: "Abgelaufen am {{date}} um {{time}}"
+ alert:
+ addReminder: "Erinnerung hinzufügen"
+ removeReminder: "Erinnerung entfernen"
+ content: "Läuft am {{date}} um {{time}} ab"
euCovidCertificate:
save:
album: "IO"
@@ -2284,13 +2298,15 @@ features:
activated: "Vielen Dank, der Dienst ist aktiv!"
error: "Bei deiner Anfrage ist ein Fehler aufgetreten"
details:
+ badge:
+ legalValue: "Rechtsgültig"
title: "Details der Mitteilung"
noticeCode: "Zahlungskodex"
loadError:
title: "Etwas ist schief gelaufen"
body: "Die Details zu deiner Mitteilung konnten nicht abgerufen werden. Bitte versuche es erneut"
cancelledMessage:
- body: "Dieser Bescheid wurde vom Absender gelöscht. Du kannst dessen Inhalt ignorieren."
+ body: "Diese Zustellung wurde vom Absender gelöscht. Du kannst dessen Inhalt ignorieren."
unpaidPayments: "Für die Erstattung von Zahlungen im Zusammenhang mit diesem Bescheid wende dich bitte an den Absender."
payments: "Zahlungen"
paymentSection:
@@ -2306,10 +2322,10 @@ features:
bottomSheet:
title: "Beiliegende F24-Formulare"
infoSection:
- title: "Informationen zum Bescheid"
+ title: "Informationen zur Zustellung"
iun: "IUN-Code"
timeline:
- title: "STATUS DES BESCHEIDS"
+ title: "STATUS DER ZUSTELLUNG"
status:
DELIVERED: "Zugestellt"
DELIVERING: "In Zustellung"
@@ -2331,7 +2347,7 @@ support:
helpCenter:
header: "Hilfe"
cta:
- contactSupport: "Erstelle ein Ticket"
+ contactSupport: "Ticket erstellen"
seeReports: "Offene Tickets"
supportComponent:
title: "Benötigst du Hilfe?"
@@ -2420,13 +2436,10 @@ fastLogin:
userInteraction:
sessionExpired:
noPin:
- title: "Es ist zu lange her!"
- subtitle: "Aus Sicherheitsgründen musst du dich erneut mit SPID oder CIE authentifizieren. Anschließend kannst du die IO-Konfiguration dort fortsetzen, wo du aufgehört hast."
+ title: "Es ist zu lange her!"
submitButtonTitle: "Fortfahren"
continueNavigation:
- title: "Deine Sitzung ist abgelaufen"
- subtitle: "Um die App weiter zu verwenden, drück auf “Fortsetzen”."
- submitButtonTitle: "Fortsetzen"
+ title: "Deine Sitzung ist abgelaufen"
cancelButtonTitle: "Abbrechen"
transientError:
title: "Wir konnten dich nicht authentifizieren"
diff --git a/locales/de/jailbroken_body.md b/locales/de/jailbroken_body.md
index f7d5b7296cf..9762448e8c1 100644
--- a/locales/de/jailbroken_body.md
+++ b/locales/de/jailbroken_body.md
@@ -1,7 +1,7 @@
-Es scheint, dass ein **Jailbreak** auf Ihrem Gerät durchgeführt wurde.
+Sul tuo dispositivo è stato effettuato un **jailbrack**. Questo succede quando il sistema operativo viene modificato o installato in modo anomalo. Questo potrebbe compromettere l’integrità del sistema e l'app IO potrebbe non funzionare correttamente.
-Dies geschieht, wenn das Betriebssystem verändert oder nicht ordnungsgemäß installiert wurde. Die Integrität des Betriebssystems kann beeinträchtigt sein, und die IO-App funktioniert möglicherweise nicht richtig.
+**Cosa fare?**
-Wenn möglich, fahren Sie bitte nicht fort und installieren Sie die IO-App auf einem anderen Gerät mit einem intakten und aktuellen Betriebssystem.
+Ti invitiamo a usare l'app IO su un dispositivo diverso, con un sistema operativo integro e aggiornato.
-Wenn Sie fortfahren, erklären Sie sich damit einverstanden, die angebotenen Dienste auf eigenes Risiko zu nutzen, da mangelnde Integrität zu Datendiebstahl und/oder anderen betrügerischen Aktivitäten führen kann. Sie erklären sich ferner damit einverstanden, dass der App-Entwickler in keiner Weise für Schäden, Verluste oder Folgen verantwortlich ist, die Ihnen durch die Nutzung der IO-App in diesem Ausführungskontext entstehen.
+Se continui, accetti di proseguire a tuo rischio nell'interazione con i servizi offerti. La mancanza di integrità può portare al furto di dati o ad altre attività fraudolente. Accetti anche che lo sviluppatore dell’app non sia in alcun modo responsabile di eventuali danni, perdite o conseguenze causate dall'app IO in questo contesto di esecuzione.
\ No newline at end of file
diff --git a/locales/de/rooted_body.md b/locales/de/rooted_body.md
index cc9e5a0839e..f22ce4f6fbf 100644
--- a/locales/de/rooted_body.md
+++ b/locales/de/rooted_body.md
@@ -1,7 +1,7 @@
-Es scheint, dass **Root-Rechte** auf Ihrem Gerät aktiviert sind.
+Sul tuo dispositivo sono attivi i **permessi di root**. Questo succede quando il sistema operativo viene modificato o installato in modo anomalo. Questo potrebbe compromettere l’integrità del sistema e l'app IO potrebbe non funzionare correttamente.
-Dies geschieht, wenn das Betriebssystem verändert oder nicht ordnungsgemäß installiert wurde. Die Integrität des Betriebssystems kann beeinträchtigt sein, und die IO-App funktioniert möglicherweise nicht richtig.
+**Cosa fare?**
-Wenn möglich, fahren Sie bitte nicht fort und installieren Sie die IO-App auf einem anderen Gerät mit einem intakten und aktuellen Betriebssystem.
+Ti invitiamo a usare l'app IO su un dispositivo diverso, con un sistema operativo integro e aggiornato.
-Wenn Sie fortfahren, erklären Sie sich damit einverstanden, die angebotenen Dienste auf eigenes Risiko zu nutzen, da mangelnde Integrität zu Datendiebstahl und/oder anderen betrügerischen Aktivitäten führen kann. Sie erklären sich ferner damit einverstanden, dass der App-Entwickler in keiner Weise für Schäden, Verluste oder Folgen verantwortlich ist, die Ihnen durch die Nutzung der IO-App in diesem Ausführungskontext entstehen.
+Se continui, accetti di proseguire a tuo rischio nell'interazione con i servizi offerti. La mancanza di integrità può portare al furto di dati o ad altre attività fraudolente. Accetti anche che lo sviluppatore dell’app non sia in alcun modo responsabile di eventuali danni, perdite o conseguenze causate dall'app IO in questo contesto di esecuzione.
\ No newline at end of file
diff --git a/locales/en/cie/cieNotSupported.md b/locales/en/cie/cieNotSupported.md
deleted file mode 100644
index 3a9a4cd82e5..00000000000
--- a/locales/en/cie/cieNotSupported.md
+++ /dev/null
@@ -1,4 +0,0 @@
-The device you are using does not support login with Electronic Identity Card (CIE). Login with CIE is only supported by:
-
-- devices with NFC chip and Android 6.0 or higher operating system;
-- iPhone 7 and above with iOS 13 or higher operating system.
\ No newline at end of file
diff --git a/locales/en/index.yml b/locales/en/index.yml
index feca83dc088..10e9c888e5d 100644
--- a/locales/en/index.yml
+++ b/locales/en/index.yml
@@ -190,6 +190,7 @@ global:
messages: Messages
wallet: Wallet
scan: Scan
+ payments: Payments
documents: Documents
profile: Profile
services: Services
@@ -213,6 +214,11 @@ tablet:
message: The IO interface is optimized for smartphones, but all the functions compatible with your device are still available.
rooted:
title: Looks like the security of your device has been compromised!
+ body: If you press 'Continue', you agree to continue browsing at your own risk, otherwise close the app.
+ learnMoreButton:
+ title: What does it mean?
+ learnMoreBottomsheet:
+ title: Device security
bodyiOS: !include jailbroken_body.md
bodyAndroid: !include rooted_body.md
continueAlert:
@@ -229,6 +235,7 @@ locales:
en: English
de: German
clipboard:
+ copyIntoClipboard: copy to clipboard
copyFeedback: Copied to clipboard
copyText: copy
copyFeedbackButton: copied
@@ -249,7 +256,7 @@ permissionRationale:
title: "Allow camera access"
message: "We require camera permissions to use the torch on the back of your phone."
startup:
- title: Initialization
+ title: We are getting ready for your experience on IO
authentication: User authenticated
sessionInfo: SPID attributes loaded
profileInfo: User profile loaded
@@ -437,6 +444,7 @@ profile:
idpayTest: IDPay
idpayTestAlert: This change requires app reboot
designSystemEnvironment: Experimental Design System
+ newWalletSection: New wallet section
appVersion: Version
backendVersion: Backend Version
debugMode: Debug mode
@@ -447,8 +455,9 @@ profile:
title: Warning
message: To add a new test card, you must enable the pagoPA test environment from the settings.
closeButton: Close
- walletPlayground:
- titleSection: "New Wallet"
+ itWallet:
+ itWalletTest: IT Wallet
+ itWalletTestDescription: Enable the IT Wallet test environment
data:
title: Your data
subtitle: Here you will find your personal and contact data used by the IO app.
@@ -560,13 +569,15 @@ authentication:
hint: Carousel that contains an introduction guide to IO functionalities. Select to know the content.
session_expired:
title: Your session is expired
- body: For security reasons, after {{days}} days from the last login with SPID or CIE, we ask you to sign in again to use IO.
+ body: For security reasons, we ask you to log in with SPID or CIE every {{days}} days or if you log out
cie_unsupported:
- title: Login with CIE unavailable
- body: !include cie/cieNotSupported.md
- android_desc: !include cie/cieNotSupported_android.md
- os_version_unsupported: an Android 6.0 or higher operating system
- nfc_incompatible: a NFC chip
+ title: You cannot use CIE
+ body: The device you are using does not support access with Electronic ID Card (CIE).
+ button: I get it
+ nfc_problem: To read the CIE, a device with NFC chip is required.
+ os_problem: An Android 6.0 or iOS 13 or higher operating system is required.
+ nfc_alert: Your device does not have NFC.
+ os_alert: The device's operating system is not up-to-date.
contentTitleCie: Don't have SPID or CIE?
cie_information_request: !include cie.md
spid_or_cie: To use IO you must have one of these digital tools, which certify your identity.
@@ -579,6 +590,7 @@ authentication:
loginSpidCie: Login with SPID or CIE
infoSpidCie: Introduction to SPID and CIE
loginSpidCieContent: From today, in addition to SPID, you can use your Electronic ID Card to login
+ privacyLink: Privacy
nospid: Don't have SPID? Find out more
nospid-nocie: Don't have SPID or CIE? Find out more
card1-title: All messages in one place
@@ -587,11 +599,9 @@ authentication:
card2-content: You can pay a tax or a penalty by your bank account and your cards
card3-title: Quickly pay a physical notice
card3-content: You can pay a notice also by scanning the QR code on the physical notice
- card4-title: You can login only with SPID
- card4-content: The device you are using does not support access with Electronic Identity Card (CIE)
- card5-title: Welcome to the public version of IO!
- card5-content: In this version you can find in the upper-right corner the icons to report bugs or start a chat with the development team. We're waiting for your feedback!
- card5-content-accessibility: Seleziona elemento precedente per aprire una chat con il team di IO se qualcosa non funziona come dovrebbe.
+ card5-title: Welcome to IO!
+ card5-content: What can you do?
+ card5-content-accessibility: Select previous item to open a chat with the IO team if something is not working.
expiredCardTitle: Card expired or no longer valid
expiredCardHeaderTitle: Login with CIE
expiredCardContent: "The card used is no longer valid or has expired.\nIf you want to log in and access IO you must use SPID."
@@ -654,6 +664,7 @@ authentication:
cardLocked: CIE card locked
wrongPin1AttemptLeft: Wrong PIN, you still have 1 attempt
wrongPin2AttemptLeft: Wrong PIN, you still have 2 attempts
+ genericError: Something went wrong! Please try again.
error:
readerCardLostTitle: Hold the card again for a few seconds
readerCardLostTitleiOS: You removed the card too soon.
@@ -708,6 +719,8 @@ authentication:
recoverDescription: If you're missing your password, you can recover it by tapping on the following button.
dualRecoverDescription: If you're missing your credentials, you can recover them by tapping on the following buttons.
recoverPassword: Recover the password
+ idp_login_success:
+ contentTitle: Hi, {{name}}!
errors:
notoken: The session is not ready or is invalid
logout: Error on logout
@@ -752,10 +765,10 @@ authentication:
email:
cduScreens:
validateMail:
- title: Email address not validated
- subtitle: To continue using the app, you must validate your email address
- editButton: Edit email address
- validateButton: Validate email address
+ title: Is this your email?
+ subtitle: To continue using the app, you must confirm that your email is
+ editButton: No, change email
+ validateButton: Yes, confirm
header:
title: Configure IO
help:
@@ -790,17 +803,20 @@ email:
newinsert:
header: "Configure IO"
title: "What is your email address?"
- subtitle: "We use email for some communications, such as payment receipts or messages exchanged with support."
+ subtitle: We will use it to send you communications such as payment receipts or support messages
label: "Personal email address"
alert:
- title: "The email address {{email}} associated with your SPID identity is already in use on IO. Please enter a different one."
- description: "email address already in use"
- modaltitle: "This email address is already in use"
+ title: "{{email}} is already used, insert another one"
+ description1: email address already in use
+ description2: Enter an email address different from your current one
+ description3: Already using this email address
+ invalidemail: Enter a valid email address
+ modaltitle: This email address is already in use
modaldescription: "This can happen if you share the same address with a family member"
- modalbutton: "Use another email address"
+ modalbutton: Use another email address
edit:
title: Edit email
- subtitle: The email you inserted is
+ subtitle: Now you use
validated: The email you inserted and validated is
label: New personal email address
cta: Edit email
@@ -820,10 +836,11 @@ email:
validated: Email validated!
validated_ok: Thank you, now you can use all payment features, messages forwarding, etc.
newvalidate:
- title: Validate your email
- subtitle: Follow the instructions we sent to
- link: Is the email address wrong?
+ title: We have sent you an email
+ subtitle: To confirm your address, follow the instructions we have sent to
+ link: Isn't that right?
buttonlabelsent: Email sent!
+ countdowntext: Request new email in
buttonlabelsentagain: Send email again
toast: Done! Check your mailbox.
newvalidemail:
@@ -925,6 +942,18 @@ datetimes:
todayAt: today, at
notValid: Invalid date.
payment:
+ homeScreen:
+ title: Payments
+ methodsSection:
+ header: Payment methods
+ headerCTA: Add
+ historySection:
+ header: Transaction history
+ headerCTA: View all
+ transactionStatusBadges:
+ failure: "FALLITA"
+ success: ""
+ CTA: Paga un avviso
alertNoPaymentMethods:
title: Add a method to make in-app payments
message: The method will be saved in your Wallet, so you can pay easier next time.
@@ -1202,10 +1231,11 @@ wallet:
title: "I don't know"
description: "We will search for all cards registered to you at participating banks"
generalError: "There was a generic error while adding the payment method"
- success:
- title: "Payment method added successfully!"
- continueButton: "Vedi dettagli"
- failure:
+ outcome:
+ SUCCESS:
+ title: "Payment method added successfully!"
+ subtitle: ""
+ primaryAction: "Vedi dettagli"
GENERIC_ERROR:
title: Si è verificato un errore imprevisto
subtitle: Riprova o contatta l'assistenza
@@ -1231,6 +1261,10 @@ wallet:
title: Hai già aggiunto questo metodo
subtitle: ""
primaryAction: Chiudi
+ BPAY_NOT_FOUND:
+ title: Non abbiamo trovato alcun BANCOMAT Pay attivo
+ subtitle: "Contatta la tua Banca per attivare il servizio."
+ primaryAction: Chiudi
alert:
supportedCardPageLinkError: An error occurred while opening the supported cards page.
msgErrorUpdateApp: "An error occurred while opening the app store"
@@ -1740,12 +1774,19 @@ wallet:
subtitle: Per maggiori informazioni, contatta la tua banca.
CANCELED_BY_USER:
title: L’operazione è stata annullata
- subtitle: Non è stato addebitato alcun importo.
+ subtitle: Se vuoi pagare l’avviso, attendi qualche minuto prima di riprovare.
EXCESSIVE_AMOUNT:
title: Autorizzazione negata
subtitle: Non è stato addebitato alcun importo.\nProbabilmente hai sforato i limiti di spesa previsti dalla tua banca.
INVALID_METHOD:
title: Il metodo di pagamento non è supportato
+ WAITING_CONFIRMATION_EMAIL:
+ title: Attendi la conferma via email
+ subtitle: Riceverai l'esito del pagamento all'indirizzo {{email}}
+ defaultSubtitle: Riceverai l'esito del pagamento all'indirizzo email associato.
+ METHOD_NOT_ENABLED:
+ title: Abilita il metodo per effettuare pagamenti in app
+ subtitle: Prima di riprovare con il pagamento, seleziona il metodo nel tuo Portafoglio e abilita la funzionalità “Pagamenti in app”.
support:
button: "Contatta l'assistenza"
supportTitle: Contatta l'assistenza
@@ -1879,6 +1920,7 @@ messages:
success: "Successfully unarchived."
failure: "Failed to unarchive"
messageDetails:
+ accessibilityAttachmentIcon: "Includes attachments"
contextualHelpTitle: Message details
contextualHelpContent: !include messages/message_detail.md
headerTitle: Message
@@ -1920,12 +1962,30 @@ messageDetails:
bottomSheet:
title: "What's a dynamic message?"
body: "It's a message that the sender can edit after you've received it. This way, the information it includes will always be up-to-date.\n\nThe sender can edit the information in a dynamic message only in specific cases. For example, to change outdated information or replace an attachment that is no longer valid.\n\nIf the sender needs to share new information or important updates with you, you'll receive a new message."
+ footer:
+ contacts: "Contact the sender"
+ showMoreData: "Show more data"
+ showMoreDataBottomSheet:
+ title: "Identification data"
+ messageId: "Message ID"
+ messageIdAccessibility: "ID messaggio, copy"
+ contactsBottomSheet:
+ title: "Support"
+ body: "If you are unclear about the content of the message, contact the Institution that sent it to you."
+ actions:
+ call: Call
+ email: Send email
messagePDFPreview:
title: "PDF Preview"
singleBtn: "Save or share"
+ singleBtnAccessibility: "Save or share document"
open: "Open"
save: "Save"
+ saveAccessibility: "Save document"
savedAtLocation: "Document {{name}} was successfully saved in your Download folder."
+ share: "Share"
+ shareAccessibility: "Share document"
+ pdfAccessibility: "Preview of the PDF document"
errors:
previewing:
title: "Preview is not available"
@@ -1975,6 +2035,7 @@ services:
value: "Quick setup"
label: "all the services you didn't disable can contact you."
title: "Use quick setup"
+ successAlert: "You have enabled the quick setup"
body:
text1: "You'll receive messages only by the institutions which have something important to tell you."
text2: "You can always deactivate communications by services that do not interest you."
@@ -1982,6 +2043,7 @@ services:
value: "Manual setup"
label: "only the services you enabled can contact you."
title: "Configure manually"
+ successAlert: "You have enabled the manual configuration"
body:
text1: "No one will contact you. To receive messages, you will have to enable services one by one."
bottomSheet:
@@ -2023,6 +2085,17 @@ services:
disableAllMsg: "Remember, on IO you will receive messages only from services having some personalized information to communicate to you. You will not receive spam messages. If you disable all the services, they can no longer contact you through the app (until you enable it again). You can use the services through other channels (front office, website, etc.)"
close: Close
emptyListMessage: There are no services available at this time, pull down to refresh
+ details:
+ failure:
+ title: "There is a temporary problem. Please try again"
+ subtitle: "We are retrieving service details"
+ back: "Back"
+ retry: "Retry"
+ preferences:
+ title: "This service can"
+ inbox: "Contact you in app"
+ pushNotifications: "Send you push notifications"
+ messageReadStatus: "Receive read receipts"
serviceDetail:
fiscalCode: "Organization's fiscal code"
fiscalCodeAccessibility: "Organization's fiscal code"
@@ -2041,16 +2114,21 @@ serviceDetail:
disabled: disabled
notValidated: To enable the email forwarding you must validate your email address.
identification:
- title: Hi!
+ instructions:
+ unlockCode: unlock code
+ unlockCodepPrefix: use your
+ fingerprint: fingerprint
+ fingerprintPrefix: use your
+ faceId: face
+ faceIdPrefix: use your
+ congiunction: or
+ title: Hi {{name}}!
titleProfileName: Hi {{profileName}}!
titleValidation: Confirm the procedure
logout: Logout
logoutProfileName: Not {{profileName}}?
logoutDescription: You can login with your SPID or CIE credentials. This session will be disconnected.
logoutDescriptionProfileName: You can login with your SPID or CIE credentials. {{profileName}}'s session will be disconnected.
- subtitleCode: Enter the unlock code
- subtitleCodeFingerprint: use the fingerprint or the unlock code
- subtitleCodeFaceId: use the Face ID or enter the unlock code
biometric:
fingerprintType: Fingerprint
title: Biometric identification
@@ -2059,8 +2137,8 @@ identification:
title: Identification required
sensorDescription: Login quickly
fail:
- remainingAttempts: You have {{attempts}} attempts left.
- remainingAttemptSingle: You have {{attempts}} attempt left.
+ remainingAttempts: You have {{attempts}} attempts left
+ remainingAttemptSingle: You have {{attempts}} attempt left
tooManyAttempts: Too many attempts.
waitMessage: "Try again in:"
unlockCode:
@@ -2620,12 +2698,24 @@ bonus:
conjunction: " and "
features:
messages:
+ attachmentDownloadFeedback: "Download in progress"
+ attachments: "Attachments"
loading:
title: "Loading message details"
subtitle: "Please wait"
updateBottomSheet:
title: "Aggiorna l'app IO"
subtitle: "Per usare questa funzionalità è richiesta la versione {{value}} di app IO. Aggiorna l’app per continuare."
+ badge:
+ dueDate: Expired on {{date}} at {{time}}
+ alert:
+ addReminder: Add reminder
+ removeReminder: Remove reminder
+ content: Expires on {{date}} at {{time}}
+ payments:
+ title: "pagoPA notices"
+ noticeCode: "Notice code"
+ pay: "Pay"
euCovidCertificate:
save:
album: "IO"
@@ -2778,6 +2868,10 @@ features:
content: "Do you want to quit signing **{{dossierTitle}}**?"
cancel: "Quit signing"
confirm: "Keep signing"
+ alert:
+ title: "Do you want to stop the operation?"
+ confirm: "Yes, stop it"
+ cancel: "No, go back"
checkService:
title: "Turn on messages"
content: "To receive the signed documents, you must turn on the setting that allows the service to send you messages. If you don't turn it on, you can complete the signature but you won't receive the signed documents."
@@ -2836,6 +2930,28 @@ features:
signatureFieldInfo:
title: "What are restrictive clauses?"
subTitle: "These are clauses that highlight specific conditions to be aware of and that must be accepted. By law, they have to be easily identifiable to make sure the signer is aware of their contents before signing."
+ wallet:
+ home:
+ emptyMessage: Custodisci qui i tuoi metodi di pagamento, Carta Giovani Nazionale, bonus e sconti.
+ cta: Aggiungi al Portafoglio
+ toast:
+ newMethod: Elemento aggiunto!
+ paymentsBanner:
+ title: Vuoi pagare un avviso?
+ action: Vai alla sezione Pagamenti
+ close: Chiudi
+ cards:
+ categories:
+ bonus: Iniziative welfare
+ cgn: Carta Giovani Nazionale
+ itw: IT Wallet
+ payment: Payment methods
+ onboarding:
+ title: Cosa vuoi aggiungere al portafoglio?
+ options:
+ cgn: Carta Giovani Nazionale
+ welfare: Iniziative welfare
+ payments: Metodi di pagamento
webView:
error:
missingParams: Not all information necessary to access this page are available
@@ -3402,10 +3518,10 @@ fastLogin:
subtitle: For security reasons, you must authenticate again with SPID or CIE. You can then resume IO configuration from where you left off.
submitButtonTitle: Continue
continueNavigation:
- title: "La tua sessione è scaduta"
- subtitle: "Per continuare a utilizzare l’app premi su Continua la navigazione."
- submitButtonTitle: "Continua la navigazione"
- cancelButtonTitle: "Annulla"
+ title: "Your session has expired"
+ subtitle: "Please log in to continue using the app"
+ submitButtonTitle: "Log in"
+ cancelButtonTitle: "Cancel"
transientError:
title: "We couldn't authenticate you"
subtitle: "Close the app and try again in a few minutes."
diff --git a/locales/en/jailbroken_body.md b/locales/en/jailbroken_body.md
index 4a755794c22..fc03b935357 100644
--- a/locales/en/jailbroken_body.md
+++ b/locales/en/jailbroken_body.md
@@ -1,7 +1,7 @@
-It seems like your device has been **jailbroken**.
+A **jailbreak** has been performed on your device. This happens when the operating system is modified or incorrectly installed. This could compromise the integrity of the system and the IO application may not function properly.
-This happens when the operating system undergoes an unusual modification or installation. The integrity of the operating system may have been compromised and the IO app may not be working properly.
+**What should you do?**
-If possible, please do not continue and install the IO app on a different device running an operating system which has integrity and is up-to-date.
+Use the IO app on a device with an intact and up-to-date operating system.
-If you continue, you agree to proceed at your own risk in interacting with the services offered, as lack of integrity may lead to data theft and/or other fraudulent activities. You also agree that the app developer is in no way liable for any damage, loss, or consequence you might incur as a result of using the IO app in this execution context.
+By continuing, you agree to continue to interact with the services offered at your own risk. Lack of integrity can lead to data theft or other fraudulent activities. You also agree that the app developer shall not be liable in any way for any damage, loss or consequence caused by the IO app in connection with this performance.
diff --git a/locales/en/rooted_body.md b/locales/en/rooted_body.md
index 3baa573985c..05dce0aba89 100644
--- a/locales/en/rooted_body.md
+++ b/locales/en/rooted_body.md
@@ -1,7 +1,7 @@
-It seems like **root** permissions are enabled on your device.
+You have **root permissions** active on your device. This happens when the operating system is modified or incorrectly installed. This could compromise the integrity of the system and the IO application may not function properly.
-This happens when the operating system undergoes an unusual modification or installation. The integrity of the operating system may have been compromised and the IO app may not be working properly.
+**What should you do?**
-If possible, please do not continue and install the IO app on a different device running an operating system which has integrity and is up-to-date.
+Use the IO app on a device with an intact and up-to-date operating system.
-If you continue, you agree to proceed at your own risk in interacting with the services offered, as lack of integrity may lead to data theft and/or other fraudulent activities. You also agree that the app developer is in no way liable for any damage, loss, or consequence you might incur as a result of using the IO app in this execution context.
+By continuing, you agree to continue to interact with the services offered at your own risk. Lack of integrity can lead to data theft or other fraudulent activities. You also agree that the app developer shall not be liable in any way for any damage, loss or consequence caused by the IO app in connection with this performance.
diff --git a/locales/it/cie/cieNotSupported.md b/locales/it/cie/cieNotSupported.md
deleted file mode 100644
index 48b29e48d14..00000000000
--- a/locales/it/cie/cieNotSupported.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Il dispositivo che stai utilizzando non supporta l’accesso con Carta d’Identità Elettronica (CIE). L’accesso con CIE è supportato da:
-
-- dispositivi con chip NFC e sistema operativo Android 6.0 o superiore;
-- iPhone dal modello 7 in su con sistema operativo iOS 13 o superiore.
\ No newline at end of file
diff --git a/locales/it/index.yml b/locales/it/index.yml
index d55a2f36ae3..63abffdd875 100644
--- a/locales/it/index.yml
+++ b/locales/it/index.yml
@@ -190,6 +190,7 @@ global:
messages: Messaggi
wallet: Portafoglio
scan: Inquadra
+ payments: Pagamenti
documents: Documenti
profile: Profilo
services: Servizi
@@ -213,6 +214,11 @@ tablet:
message: L’interfaccia di IO è ottimizzata per smartphone, ma tutte le funzioni compatibili con il tuo dispositivo sono comunque disponibili.
rooted:
title: Sembra che la sicurezza del tuo dispositivo sia compromessa!
+ body: Se premi su ‘Continua’, accetti di proseguire a tuo rischio nella navigazione, altrimenti chiudi l’app.
+ learnMoreButton:
+ title: Cosa significa?
+ learnMoreBottomsheet:
+ title: Sicurezza del dispositivo
bodyiOS: !include jailbroken_body.md
bodyAndroid: !include rooted_body.md
continueAlert:
@@ -229,6 +235,7 @@ locales:
en: Inglese
de: Tedesco
clipboard:
+ copyIntoClipboard: copia negli appunti
copyFeedback: Copiato negli appunti
copyText: copia
copyFeedbackButton: copiato
@@ -249,7 +256,7 @@ permissionRationale:
title: "Consenti l’accesso alla fotocamera"
message: "Abbiamo bisogno dell'accesso alla fotocamera per utilizzare la torcia."
startup:
- title: Inizializzazione
+ title: Stiamo preparando la tua esperienza su IO
authentication: Utente autenticato
sessionInfo: Attributi SPID caricati
profileInfo: Profilo utente caricato
@@ -437,6 +444,7 @@ profile:
idpayTest: IDPay
idpayTestAlert: La modifica richiede il riavvio dell'app
designSystemEnvironment: Design System sperimentale
+ newWalletSection: Nuova sezione portafoglio
appVersion: Versione
backendVersion: Versione Backend
debugMode: Modalità debug
@@ -447,8 +455,9 @@ profile:
title: Attenzione
message: Per aggiungere una nuova carta di test, devi abilitare l'ambiente pagoPA di test dalle impostazioni.
closeButton: Chiudi
- walletPlayground:
- titleSection: "New Wallet"
+ itWallet:
+ itWalletTest: IT Wallet
+ itWalletTestDescription: Abilita ambiente di test per IT Wallet
data:
title: I tuoi dati
subtitle: Qui trovi i tuoi dati anagrafici e di contatto utilizzati da app IO
@@ -560,13 +569,15 @@ authentication:
hint: Carosello contenente una guida introduttiva alle funzionalità di IO. Seleziona per consultarne il contenuto
session_expired:
title: La tua sessione è scaduta
- body: Per ragioni di sicurezza, dopo {{days}} giorni dall'ultimo accesso con SPID o CIE, ti chiediamo di inserire nuovamente le credenziali per utilizzare IO.
+ body: Per ragioni di sicurezza, ti chiediamo di entrare con SPID o CIE ogni {{days}} giorni o se esci dall’app.
cie_unsupported:
- title: Accesso con CIE non disponibile
- body: !include cie/cieNotSupported.md
- android_desc: !include cie/cieNotSupported_android.md
- os_version_unsupported: un sistema operativo Android 6.0 o superiore
- nfc_incompatible: un chip NFC compatibile
+ title: Non puoi entrare con CIE
+ body: Il dispositivo che stai utilizzando non supporta l’accesso con Carta d’Identità Elettronica (CIE).
+ button: Ho capito
+ nfc_problem: Per leggere la CIE è necessario un dispositivo con chip NFC.
+ os_problem: È richiesto un sistema operativo Android 6.0 o iOS 13 o superiori.
+ nfc_alert: Il tuo dispositivo non ha l'NFC.
+ os_alert: Il sistema operativo del dispositivo non è aggiornato.
contentTitleCie: Non hai SPID o la CIE?
cie_information_request: !include cie.md
spid_or_cie: Per utilizzare IO devi dotarti di uno di questi strumenti digitali, che certificano in maniera certa la tua identità.
@@ -579,6 +590,7 @@ authentication:
loginSpidCie: Accedi con SPID o CIE
infoSpidCie: Introduzione a SPID e CIE
loginSpidCieContent: Da oggi, oltre a SPID, puoi usare la tua Carta d'Identità Elettronica per accedere
+ privacyLink: Informativa privacy
nospid: Non hai SPID? Scopri di più
nospid-nocie: Non hai SPID o CIE? Scopri di più
card1-title: Tutti i messaggi in un solo posto
@@ -587,10 +599,8 @@ authentication:
card2-content: Puoi pagare un tributo o una multa con il tuo conto corrente e le tue carte
card3-title: Paga velocemente un avviso cartaceo
card3-content: Tramite la scansione del QR code puoi velocemente pagare anche un avviso cartaceo
- card4-title: Puoi accedere solo con SPID
- card4-content: Il dispositivo che stai utilizzando non supporta l’accesso con Carta d’Identità Elettronica (CIE)
- card5-title: Benvenuto nella prima versione pubblica di IO!
- card5-content: In alto a destra trovi l'icona '?' per aprire una chat con il team di IO se qualcosa non funziona come dovrebbe.
+ card5-title: Ti diamo il benvenuto su IO!
+ card5-content: Vediamo insieme cosa puoi fare
card5-content-accessibility: Seleziona elemento precedente per aprire una chat con il team di IO se qualcosa non funziona come dovrebbe.
expiredCardTitle: Carta scaduta o non più valida
expiredCardHeaderTitle: Entra con CIE
@@ -654,6 +664,7 @@ authentication:
cardLocked: Carta CIE bloccata
wrongPin1AttemptLeft: PIN errato, hai ancora 1 tentativo
wrongPin2AttemptLeft: PIN errato, hai ancora 2 tentativi
+ genericError: Si è verificato un errore imprevisto. Riprova.
error:
readerCardLostTitle: Avvicina nuovamente la carta
readerCardLostTitleiOS: Hai rimosso la carta troppo presto
@@ -708,6 +719,8 @@ authentication:
dualRecoverDescription: Se hai dimenticato le tue credenziali, ti consigliamo di procedere cliccando sui bottoni qui di seguito.
recoverUsername: Recupera il nome utente
recoverPassword: Recupera la password
+ idp_login_success:
+ contentTitle: Ciao {{name}}!
errors:
notoken: La sessione non è pronta o non è valida
logout: Errore nel logout
@@ -752,10 +765,10 @@ authentication:
email:
cduScreens:
validateMail:
- title: Non hai confermato il tuo indirizzo email
- subtitle: Per continuare a utilizzare l’app è necessario validare il tuo indirizzo email
- editButton: Modifica email
- validateButton: Conferma email
+ title: È questa la tua email?
+ subtitle: Per continuare a usare l’app, devi confermare che la tua email è
+ editButton: No, modifica
+ validateButton: Sì, conferma
header:
title: Configura IO
help:
@@ -763,7 +776,7 @@ email:
emailAlreadyTaken:
title: Modifica la tua email
subtitleStart: Il tuo indirizzo email
- subtitleEnd: risulta già in uso su IO, è necessario inserirne uno diverso per continuare a utilizzare l’app.
+ subtitleEnd: è già in uso su IO, devi inserirne uno diverso per continuare a usare l’app.
editButton: Modifica email
header:
title: Configura IO
@@ -790,17 +803,20 @@ email:
newinsert:
header: Configura IO
title: Qual è la tua email?
- subtitle: Utilizziamo l’email per alcune comunicazioni, come le ricevute di pagamento o i messaggi scambiati con l’assistenza.
+ subtitle: Servirà a inviarti comunicazioni come ricevute di pagamento o messaggi di assistenza.
label: Indirizzo email personale
alert:
- title: L’email {{email}} associata alla tua identità SPID è già in uso su IO, inseriscine una diversa.
- description: "email già in uso"
- modaltitle: "Questa email è già in uso"
- modaldescription: "Può succedere se condividi lo stesso indirizzo con un familiare"
- modalbutton: "Usa un’altra email"
+ title: "{{email}} è già in uso, inseriscine un’altra."
+ description1: Email già in uso
+ description2: Inserisci un indirizzo diverso da quello attuale
+ description3: Stai già usando questa email
+ invalidemail: Inserisci un indirizzo email valido
+ modaltitle: Questa email è già in uso
+ modaldescription: Può succedere se condividi lo stesso indirizzo con un familiare
+ modalbutton: Usa un’altra email
edit:
title: Modifica la tua email
- subtitle: L'email che avevi inserito in precedenza è
+ subtitle: Ora stai usando
validated: L'email che avevi inserito e validato in precedenza è
label: Nuovo indirizzo email personale
cta: Modifica email
@@ -820,12 +836,13 @@ email:
validated: Email validata!
validated_ok: Grazie, ora puoi usare le funzionalità legate ai pagamenti, all’inoltro dei messaggi, etc.
newvalidate:
- title: Conferma la tua email
- subtitle: Segui le istruzioni che abbiamo inviato a
- link: Non è corretta?
+ title: Ti abbiamo inviato un’email
+ subtitle: Per confermare il tuo indirizzo, segui le istruzioni che abbiamo inviato a
+ link: Non è corretto?
+ countdowntext: Richiedi una nuova email tra
buttonlabelsent: Email inviata!
buttonlabelsentagain: Invia di nuovo l’email
- toast: Fatto! Controlla tua casella di posta.
+ toast: Fatto! Controlla la tua casella di posta.
newvalidemail:
title: Email confermata!
subtitle: Riceverai le comunicazioni di IO all’indirizzo
@@ -925,6 +942,18 @@ datetimes:
todayAt: oggi, alle
notValid: Data non valida.
payment:
+ homeScreen:
+ title: Pagamenti
+ methodsSection:
+ header: Metodi di pagamento
+ headerCTA: Aggiungi
+ historySection:
+ header: Storico operazioni
+ headerCTA: Vedi tutte
+ transactionStatusBadges:
+ failure: "FALLITA"
+ success: ""
+ CTA: Paga un avviso
alertNoPaymentMethods:
title: Aggiungi un metodo per effettuare pagamenti in app
message: Il metodo verrà salvato nel Portafoglio, così la prossima volta potrai pagare più facilmente.
@@ -1202,10 +1231,11 @@ wallet:
title: "Non lo so"
description: "Cercheremo tutte le carte intestate a te presso le banche aderenti al servizio"
generalError: "C'è stato un errore generico durante l'aggiunta del metodo di pagamento"
- success:
- title: "La carta è stata aggiunta!"
- continueButton: "Vedi dettagli"
- failure:
+ outcome:
+ SUCCESS:
+ title: "Il metodo è stato aggiunto"
+ subtitle: ""
+ primaryAction: "Vedi dettagli"
GENERIC_ERROR:
title: Si è verificato un errore imprevisto
subtitle: Riprova o contatta l'assistenza
@@ -1231,6 +1261,10 @@ wallet:
title: Hai già aggiunto questo metodo
subtitle: ""
primaryAction: Chiudi
+ BPAY_NOT_FOUND:
+ title: Non abbiamo trovato alcun BANCOMAT Pay attivo
+ subtitle: "Contatta la tua Banca per attivare il servizio."
+ primaryAction: Chiudi
alert:
supportedCardPageLinkError: Si è verificato un errore durante l'apertura della pagina di riferimento per le carte supportate.
msgErrorUpdateApp: "Si è verificato un errore durante l'apertura dello store delle app"
@@ -1740,12 +1774,19 @@ wallet:
subtitle: Per maggiori informazioni, contatta la tua banca.
CANCELED_BY_USER:
title: L’operazione è stata annullata
- subtitle: Non è stato addebitato alcun importo.
+ subtitle: Se vuoi pagare l’avviso, attendi qualche minuto prima di riprovare.
EXCESSIVE_AMOUNT:
title: Autorizzazione negata
subtitle: Non è stato addebitato alcun importo.\nProbabilmente hai sforato i limiti di spesa previsti dalla tua banca.
INVALID_METHOD:
title: Il metodo di pagamento non è supportato
+ WAITING_CONFIRMATION_EMAIL:
+ title: Attendi la conferma via email
+ subtitle: Riceverai l'esito del pagamento all'indirizzo {{email}}
+ defaultSubtitle: Riceverai l'esito del pagamento all'indirizzo email associato.
+ METHOD_NOT_ENABLED:
+ title: Abilita il metodo per effettuare pagamenti in app
+ subtitle: Prima di riprovare con il pagamento, seleziona il metodo nel tuo Portafoglio e abilita la funzionalità “Pagamenti in app”.
support:
button: "Contatta l'assistenza"
supportTitle: Contatta l'assistenza
@@ -1879,6 +1920,7 @@ messages:
success: "Ripristino effettuato."
failure: "Il ripristino non è andato a buon fine"
messageDetails:
+ accessibilityAttachmentIcon: "Contiene allegati"
contextualHelpTitle: Dettagli del messaggio
contextualHelpContent: !include messages/message_detail.md
headerTitle: Messaggio
@@ -1920,12 +1962,30 @@ messageDetails:
bottomSheet:
title: "Cos'è un messaggio dinamico?"
body: "È un messaggio che l'ente può modificare dopo averlo inviato. In questo modo, le informazioni che contiene saranno sempre corrette.\n\nUn ente può modificare le informazioni di un messaggio dinamico solo in casi specifici, per esempio per cambiare un'informazione vecchia o aggiornare un allegato non più valido.\n\nSe deve comunicarti nuove informazioni o aggiornamenti importanti, ti invierà un nuovo messaggio."
+ footer:
+ contacts: "Contatta il mittente"
+ showMoreData: "Mostra altri dati"
+ showMoreDataBottomSheet:
+ title: "Dati identificativi"
+ messageId: "ID messaggio"
+ messageIdAccessibility: "ID messaggio, copia"
+ contactsBottomSheet:
+ title: "Assistenza"
+ body: "Se non ti è chiaro il contenuto del messaggio, contatta l’ente che te lo ha inviato."
+ actions:
+ call: Fai una chiamata
+ email: Scrivi un'email
messagePDFPreview:
title: "Anteprima PDF"
singleBtn: "Salva o condividi"
+ singleBtnAccessibility: "Salva o condividi documento"
open: "Apri"
save: "Salva"
+ saveAccessibility: "Salva documento"
savedAtLocation: "Il documento {{name}} è stato salvato nella cartella Download."
+ share: "Condividi"
+ shareAccessibility: "Condividi documento"
+ pdfAccessibility: "Anteprima documento PDF"
errors:
previewing:
title: "L’anteprima non è disponibile"
@@ -1975,6 +2035,7 @@ services:
value: "Configurazione rapida"
label: "tutti i servizi che non hai disattivato possono contattarti."
title: "Usa configurazione rapida"
+ successAlert: "Hai abilitato la configurazione rapida"
body:
text1: "Ti contatteranno solo gli enti che hanno qualcosa di importante da dirti."
text2: "Potrai sempre disattivare le comunicazioni dei servizi che non ti interessano."
@@ -1982,6 +2043,7 @@ services:
value: "Configurazione manuale"
label: "ti possono contattare solo i servizi che hai attivato."
title: "Configura manualmente"
+ successAlert: "Hai abilitato la configurazione manuale"
body:
text1: "Nessuno potrà contattarti. Per ricevere messaggi dovrai attivare i servizi uno a uno."
bottomSheet:
@@ -2023,6 +2085,17 @@ services:
disableAllMsg: "Ricorda che su IO ti scriveranno solo i servizi che effettivamente hanno qualche informazione personalizzata da comunicarti. Non riceverai messaggi di spam. Se disattivi tutti i servizi, questi non potranno più contattarti tramite IO (finché non li riattiverai). Potrai continuare a fruire i servizi attraverso altri canali (sportello, sito, etc.)"
close: Chiudi
emptyListMessage: Non ci sono servizi disponibili al momento, trascina in basso per aggiornare
+ details:
+ failure:
+ title: "C'è un problema temporaneo, riprova"
+ subtitle: "Stiamo recuperando i dettagli del servizio"
+ back: "Indietro"
+ retry: "Riprova"
+ preferences:
+ title: "Questo servizio può"
+ inbox: "Contattarti in app"
+ pushNotifications: "Inviarti notifiche push"
+ messageReadStatus: "Ricevere conferme di lettura"
serviceDetail:
fiscalCode: "C.F. Ente"
fiscalCodeAccessibility: "Codice fiscale Ente"
@@ -2041,16 +2114,21 @@ serviceDetail:
disabled: disabilitato
notValidated: Per poter abilitare le notifiche via email devi validare il tuo indirizzo email."
identification:
- title: Ciao!
+ instructions:
+ unlockCode: codice di sblocco
+ unlockCodepPrefix: inserisci il
+ fingerprint: impronta
+ fingerprintPrefix: usa l'
+ faceId: volto
+ faceIdPrefix: usa il
+ congiunction: o
+ title: Ciao {{name}}!
titleProfileName: Ciao {{profileName}}!
titleValidation: Conferma l'operazione
logout: Esci
logoutProfileName: Non sei {{profileName}}?
logoutDescription: Puoi accedere con le tue credenziali SPID o CIE. Questa sessione verrà disconnessa.
logoutDescriptionProfileName: Puoi accedere con le tue credenziali SPID o CIE. La sessione di {{profileName}} verrà disconnessa.
- subtitleCode: Inserisci il codice di sblocco
- subtitleCodeFingerprint: "usa l'impronta o il codice di sblocco"
- subtitleCodeFaceId: "usa Face ID o il codice di sblocco"
biometric:
fingerprintType: Impronta digitale
title: Identificazione Biometrica
@@ -2059,9 +2137,9 @@ identification:
title: Identificazione richiesta
sensorDescription: Accedi velocemente
fail:
- remainingAttempts: Ti rimangono {{attempts}} tentativi.
- remainingAttemptSingle: Ti rimane {{attempts}} tentativo.
- tooManyAttempts: Troppi tentativi di inserimento errati.
+ remainingAttempts: Hai a disposizione ancora {{attempts}} tentativi
+ remainingAttemptSingle: Hai a disposizone ancora {{attempts}} tentativo
+ tooManyAttempts: Hai inserito troppe volte il codice sbagliato!
waitMessage: "Riprova tra:"
unlockCode:
accessibility:
@@ -2544,7 +2622,7 @@ bonus:
title: "Stiamo processando la tua richiesta."
body: "Ti invieremo un messaggio in app quando la tua Carta Giovani sarà attiva."
alreadyActive:
- title: "La tua Carta Giovani Nazionale è attiva!"
+ title: "La tua Carta Giovani Nazionale è già attiva!"
body: "Puoi visualizzarne i dettagli nella sezione Portafoglio."
pending:
title: "La tua Carta Giovani Nazionale è in fase di attivazione."
@@ -2620,12 +2698,24 @@ bonus:
conjunction: ", "
features:
messages:
+ attachmentDownloadFeedback: "Download in corso"
+ attachments: "Allegati"
loading:
title: "Sto caricando i dettagli del messaggio"
subtitle: "Attendi qualche secondo"
updateBottomSheet:
title: "Aggiorna l'app IO"
subtitle: "Per usare questa funzionalità è richiesta la versione {{value}} di app IO. Aggiorna l’app per continuare."
+ badge:
+ dueDate: Scaduto il {{date}} alle ore {{time}}
+ alert:
+ addReminder: Aggiungi promemoria
+ removeReminder: Rimuovi promemoria
+ content: Scade il {{date}} alle ore {{time}}
+ payments:
+ title: "Avvisi pagoPA"
+ noticeCode: "Codice avviso"
+ pay: "Paga"
euCovidCertificate:
save:
album: "IO"
@@ -2778,6 +2868,10 @@ features:
content: "Vuoi annullare la firma di **{{dossierTitle}}**?"
cancel: "Annulla la firma"
confirm: "Continua a firmare"
+ alert:
+ title: "Vuoi interrompere l'operazione?"
+ confirm: "Sì, interrompi"
+ cancel: "No, torna indietro"
checkService:
title: "Attiva i messaggi"
content: "Per ricevere i documenti firmati devi attivare l’opzione che consente al servizio di inviarti messaggi. Se non la attivi, puoi completare la firma ma non riceverai i documenti firmati."
@@ -2836,6 +2930,28 @@ features:
signatureFieldInfo:
title: "Cosa sono le clausole vessatorie?"
subTitle: "Sono delle clausole che segnalano condizioni particolari a cui prestare attenzione e che devono essere accettate. Devono inoltre essere, per legge, facilmente identificabili per far sì che chi firma sia informato del loro contenuto prima di apporre la firma."
+ wallet:
+ home:
+ emptyMessage: Custodisci qui i tuoi metodi di pagamento, Carta Giovani Nazionale, bonus e sconti.
+ cta: Aggiungi al Portafoglio
+ toast:
+ newMethod: Elemento aggiunto!
+ paymentsBanner:
+ title: Vuoi pagare un avviso?
+ action: Vai alla sezione Pagamenti
+ close: Chiudi
+ cards:
+ categories:
+ bonus: Iniziative welfare
+ cgn: Carta Giovani Nazionale
+ itw: IT Wallet
+ payment: Metodi di pagamento
+ onboarding:
+ title: Cosa vuoi aggiungere al portafoglio?
+ options:
+ cgn: Carta Giovani Nazionale
+ welfare: Iniziative welfare
+ payments: Metodi di pagamento
webView:
error:
missingParams: Non sono presenti le informazioni necessarie per accedere a questa pagina
@@ -3399,12 +3515,12 @@ fastLogin:
sessionExpired:
noPin:
title: È passato troppo tempo!
- subtitle: Per ragioni di sicurezza devi autenticarti di nuovo con SPID o CIE. Potrai poi continuare la configurazione di IO da dove l’avevi interrotta.
+ subtitle: Per motivi di sicurezza, devi identificarti di nuovo con SPID o CIE. Potrai poi riprendere la configurazione di IO da dove l’avevi interrotta.
submitButtonTitle: Continua
continueNavigation:
title: "La tua sessione è scaduta"
- subtitle: "Per continuare a utilizzare l’app premi su Continua la navigazione."
- submitButtonTitle: "Continua la navigazione"
+ subtitle: "Accedi per continuare a usare l’app."
+ submitButtonTitle: "Accedi"
cancelButtonTitle: "Annulla"
transientError:
title: "Non siamo riusciti ad autenticarti"
diff --git a/locales/it/jailbroken_body.md b/locales/it/jailbroken_body.md
index 6e155604224..9762448e8c1 100644
--- a/locales/it/jailbroken_body.md
+++ b/locales/it/jailbroken_body.md
@@ -1,7 +1,7 @@
-Sembra che sul tuo dispositivo sia stata effettuata la procedura di **jailbreak**.
+Sul tuo dispositivo è stato effettuato un **jailbrack**. Questo succede quando il sistema operativo viene modificato o installato in modo anomalo. Questo potrebbe compromettere l’integrità del sistema e l'app IO potrebbe non funzionare correttamente.
-Questo accade quando il sistema operativo viene modificato oppure quando viene installato in modo anomalo. L'integrità del sistema operativo potrebbe essere stata compromessa e l'app IO potrebbe non funzionare correttamente.
+**Cosa fare?**
-Se possibile, ti invitiamo a non continuare e ad installare l'app IO su un dispositivo diverso che abbia un sistema operativo integro e aggiornato.
+Ti invitiamo a usare l'app IO su un dispositivo diverso, con un sistema operativo integro e aggiornato.
-Se continui, accetti di proseguire a tuo rischio nell'interazione con i servizi offerti, poiché la mancanza di integrità può condurre al furto di dati e/o ad altre attività fraudolente. Accetti inoltre che lo sviluppatore dell’app non sia in alcun modo responsabile di eventuali danni, perdite o conseguenze da te subite in virtù dell'utilizzo dell'app IO in questo contesto di esecuzione.
+Se continui, accetti di proseguire a tuo rischio nell'interazione con i servizi offerti. La mancanza di integrità può portare al furto di dati o ad altre attività fraudolente. Accetti anche che lo sviluppatore dell’app non sia in alcun modo responsabile di eventuali danni, perdite o conseguenze causate dall'app IO in questo contesto di esecuzione.
\ No newline at end of file
diff --git a/locales/it/rooted_body.md b/locales/it/rooted_body.md
index 48b700b5e79..f22ce4f6fbf 100644
--- a/locales/it/rooted_body.md
+++ b/locales/it/rooted_body.md
@@ -1,7 +1,7 @@
-Sembra che sul tuo dispositivo siano abilitati i permessi di **root**.
+Sul tuo dispositivo sono attivi i **permessi di root**. Questo succede quando il sistema operativo viene modificato o installato in modo anomalo. Questo potrebbe compromettere l’integrità del sistema e l'app IO potrebbe non funzionare correttamente.
-Questo accade quando il sistema operativo viene modificato oppure quando viene installato in modo anomalo. L'integrità del sistema operativo potrebbe essere stata compromessa e l'app IO potrebbe non funzionare correttamente.
+**Cosa fare?**
-Se possibile, ti invitiamo a non continuare e ad installare l'app IO su un dispositivo diverso che abbia un sistema operativo integro e aggiornato.
+Ti invitiamo a usare l'app IO su un dispositivo diverso, con un sistema operativo integro e aggiornato.
-Se continui, accetti di proseguire a tuo rischio nell'interazione con i servizi offerti, poiché la mancanza di integrità può condurre al furto di dati e/o ad altre attività fraudolente. Accetti inoltre che lo sviluppatore dell’app non sia in alcun modo responsabile di eventuali danni, perdite o conseguenze da te subite in virtù dell'utilizzo dell'app IO in questo contesto di esecuzione.
+Se continui, accetti di proseguire a tuo rischio nell'interazione con i servizi offerti. La mancanza di integrità può portare al furto di dati o ad altre attività fraudolente. Accetti anche che lo sviluppatore dell’app non sia in alcun modo responsabile di eventuali danni, perdite o conseguenze causate dall'app IO in questo contesto di esecuzione.
\ No newline at end of file
diff --git a/package.json b/package.json
index ac533d5a0ed..e97c41709af 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "italia-app",
- "version": "2.53.0-rc.0",
+ "version": "2.58.0-rc.0",
"io_backend_api": "https://raw.githubusercontent.com/pagopa/io-backend/v13.32.1-RELEASE/api_backend.yaml",
"io_public_api": "https://raw.githubusercontent.com/pagopa/io-backend/v13.32.1-RELEASE/api_public.yaml",
"io_content_specs": "https://raw.githubusercontent.com/pagopa/io-services-metadata/1.0.30/definitions.yml",
@@ -19,8 +19,8 @@
"idpay_api": "https://raw.githubusercontent.com/pagopa/cstar-infrastructure/v6.9.1/src/domains/idpay-app/api/idpay_appio_full/openapi.appio.full.yml",
"lollipop_api": "https://raw.githubusercontent.com/pagopa/io-backend/v13.32.1-RELEASE/api_lollipop_first_consumer.yaml",
"fast_login_api": "https://raw.githubusercontent.com/pagopa/io-backend/v13.32.1-RELEASE/openapi/generated/api_fast_login.yaml",
- "pagopa_api_walletv3": "https://raw.githubusercontent.com/pagopa/pagopa-infra/740e7dcc5ea2ea19639316fea6797bbd504dd0ae/src/domains/wallet-app/api/payment-wallet/v1/_openapi.json.tpl",
- "pagopa_api_ecommerce": "https://raw.githubusercontent.com/pagopa/pagopa-infra/a5299db39de86a951d353fdc2bfed48188c0c125/src/domains/ecommerce-app/api/ecommerce-io/v1/_openapi.json.tpl",
+ "pagopa_api_walletv3": "https://raw.githubusercontent.com/pagopa/pagopa-infra/bec0f57606a2002706bd5f5286fad3e508d2f50e/src/domains/wallet-app/api/payment-wallet/v1/_openapi.json.tpl",
+ "pagopa_api_ecommerce": "https://raw.githubusercontent.com/pagopa/pagopa-infra/2adee4c0a8de8570e74710379f9cccb04c6925b6/src/domains/ecommerce-app/api/ecommerce-io/v1/_openapi.json.tpl",
"private": true,
"scripts": {
"start": "react-native start",
@@ -34,7 +34,7 @@
"start-breaking-cycle": "yarn pre-cycle && standard-version -t \"\" --prerelease rc --release-as major --no-verify && yarn push-hint",
"attach": "react-native attach",
"postinstall": "patch-package && rn-nodeify --install path,buffer && chmod +x ./bin/add-ios-source-maps.sh && ./bin/add-ios-source-maps.sh && chmod +x ./bin/add-ios-env-config.sh && ./bin/add-ios-env-config.sh",
- "test:ci": "jest --ci --maxWorkers=2 --silent",
+ "test:ci": "jest --ci --maxWorkers=4 --silent",
"test:dev": "jest --detectOpenHandles --coverage=false",
"test:tz": "yarn test:tz-eu-rome && yarn test:tz-us-ny && yarn test:tz-us-yt && yarn test:tz-au-syd && yarn test:tz-eu-rome-comp",
"test:tz-eu-rome": "TZ='Europe/Rome' jest --config='./jest.config.no.timezone.js' --detectOpenHandles --coverage=false -t 'Check fiscal code date IT' './ts/utils/__tests__/fiscal-code.test.ts'",
@@ -76,9 +76,9 @@
"generate:idpay": "npm-run-all generate:idpay-api",
"generate:lollipop-api": "rimraf definitions/lollipop && mkdir -p definitions/lollipop && gen-api-models --api-spec $npm_package_lollipop_api --out-dir ./definitions/lollipop --no-strict --response-decoders --request-types --client",
"generate:fast-login-api": "rimraf definitions/fast_login && mkdir -p definitions/fast_login && gen-api-models --api-spec $npm_package_fast_login_api --out-dir ./definitions/fast_login --no-strict --response-decoders --request-types --client",
- "generate:wallet-api": "rimraf definitions/pagopa/walletv3 && mkdir -p definitions/pagopa/walletv3 && gen-api-models --api-spec $npm_package_pagopa_api_walletv3 --out-dir ./definitions/pagopa/walletv3 --no-strict --response-decoders --request-types --client",
+ "generate:pagopa-walletv3-api": "rimraf definitions/pagopa/walletv3 && mkdir -p definitions/pagopa/walletv3 && gen-api-models --api-spec $npm_package_pagopa_api_walletv3 --out-dir ./definitions/pagopa/walletv3 --no-strict --response-decoders --request-types --client",
"generate:pagopa-ecommerce-api": "rimraf definitions/pagopa/ecommerce && mkdir -p definitions/pagopa/ecommerce && gen-api-models --api-spec $npm_package_pagopa_api_ecommerce --out-dir ./definitions/pagopa/ecommerce --no-strict --response-decoders --request-types --client",
- "generate:wallet": "npm-run-all generate:wallet-api",
+ "generate:payments": "npm-run-all generate:pagopa-walletv3-api generate:pagopa-ecommerce-api",
"generate": "npm-run-all generate:*",
"locales_unused": "ts-node --skip-project -O '{\"lib\":[\"es2015\"]}' scripts/unused-locales.ts",
"remove_unused_locales": "ts-node --skip-project -O '{\"lib\":[\"es2015\"]}' scripts/remove-unused-locales.ts",
@@ -95,25 +95,25 @@
"dependencies": {
"@babel/plugin-transform-regenerator": "^7.18.6",
"@gorhom/bottom-sheet": "^4.1.5",
- "@pagopa/io-app-design-system": "1.20.1",
+ "@pagopa/io-app-design-system": "1.33.0",
"@pagopa/io-pagopa-commons": "^3.1.0",
- "@pagopa/io-react-native-crypto": "^0.2.1",
- "@pagopa/io-react-native-login-utils": "^0.2.2",
- "@pagopa/io-react-native-zendesk": "^0.3.28",
- "@pagopa/react-native-cie": "1.2.0",
+ "@pagopa/io-react-native-crypto": "^0.3.0",
+ "@pagopa/io-react-native-http-client": "^0.1.3",
+ "@pagopa/io-react-native-login-utils": "^1.0.0",
+ "@pagopa/io-react-native-zendesk": "^0.3.29",
+ "@pagopa/react-native-cie": "^1.2.1",
"@pagopa/ts-commons": "^10.15.0",
"@react-native-async-storage/async-storage": "^1.17.10",
"@react-native-camera-roll/camera-roll": "5.6.1",
"@react-native-clipboard/clipboard": "^1.10.0",
- "@react-native-community/datetimepicker": "^3.5.2",
"@react-native-community/push-notification-ios": "^1.8.0",
"@react-native-community/slider": "^3.0.3",
"@react-native-cookies/cookies": "^6.2.1",
- "@react-native-picker/picker": "^2.4.1",
- "@react-navigation/bottom-tabs": "^5.11.15",
- "@react-navigation/material-top-tabs": "^5.x",
- "@react-navigation/native": "^5.9.8",
- "@react-navigation/stack": "^5.14.9",
+ "@react-navigation/bottom-tabs": "6.5.11",
+ "@react-navigation/material-top-tabs": "6.6.5",
+ "@react-navigation/native": "6.1.9",
+ "@react-navigation/native-stack": "^6.9.17",
+ "@react-navigation/stack": "6.3.20",
"@redux-saga/testing-utils": "^1.1.3",
"@xstate/react": "^3.0.1",
"async-mutex": "^0.1.3",
@@ -133,13 +133,14 @@
"jwk-thumbprint": "^0.1.4",
"lodash": "^4.17.21",
"metro-babel-register": "^0.72.1",
+ "mixpanel-react-native": "2.4.1",
"native-base": "^2.15.2",
"native-base-shoutem-theme": "0.3.1",
"pako": "^2.1.0",
"path-browserify": "0.0.0",
"pdf-lib": "^1.17.1",
- "react": "18.0.0",
- "react-native": "0.69.9",
+ "react": "18.1.0",
+ "react-native": "0.70.15",
"react-native-android-open-settings": "^1.3.0",
"react-native-background-timer": "2.1.1",
"react-native-barcode-builder": "^2.0.0",
@@ -148,13 +149,13 @@
"react-native-config": "^1.4.5",
"react-native-crypto": "^2.1.0",
"react-native-device-info": "^10.8.0",
- "react-native-document-picker": "^9.0.1",
+ "react-native-document-picker": "^9.1.1",
"react-native-exception-handler": "^2.10.8",
"react-native-fingerprint-scanner": "^6.0.0",
"react-native-flag-secure-android": "^1.0.3",
"react-native-flipper": "^0.154.0",
"react-native-fs": "^2.18.0",
- "react-native-gesture-handler": "^2.12.0",
+ "react-native-gesture-handler": "^2.12.1",
"react-native-haptic-feedback": "^2.0.2",
"react-native-i18n": "^2.0.15",
"react-native-image-pan-zoom": "^2.1.11",
@@ -163,8 +164,7 @@
"react-native-keychain": "^4.0.5",
"react-native-linear-gradient": "^2.5.6",
"react-native-masked-text": "^1.13.0",
- "react-native-mixpanel": "1.2.0",
- "react-native-modal-datetime-picker": "^10.2.0",
+ "react-native-pager-view": "^6.2.3",
"react-native-pdf": "^6.4.0",
"react-native-pdf-thumbnail": "^1.2.1",
"react-native-permissions": "^4.0.0",
@@ -176,12 +176,12 @@
"react-native-responsive-screen": "^1.4.1",
"react-native-safe-area-context": "^3.3.2",
"react-native-screen-brightness": "^2.0.0-alpha",
- "react-native-screens": "^2.18.1",
+ "react-native-screens": "^3.30.1",
"react-native-sha256": "1.2.3",
"react-native-share": "7.3.9",
"react-native-splash-screen": "^3.2.0",
- "react-native-svg": "^12.3.0",
- "react-native-tab-view": "^2.x",
+ "react-native-svg": "^15.1.0",
+ "react-native-tab-view": "3.5.2",
"react-native-view-shot": "3.1.2",
"react-native-vision-camera": "2.15.4",
"react-native-webview": "^11.26.1",
@@ -218,7 +218,7 @@
"xstate": "^4.33.6"
},
"devDependencies": {
- "@babel/core": "^7.15.0",
+ "@babel/core": "^7.18.8",
"@babel/preset-typescript": "^7.16.7",
"@babel/runtime": "^7.15.3",
"@jambit/eslint-plugin-typed-redux-saga": "^0.4.0",
@@ -238,7 +238,7 @@
"@types/pako": "^2.0.0",
"@types/prettier": "^2.7.3",
"@types/react": "16.9.43",
- "@types/react-native": "0.69.6",
+ "@types/react-native": "0.70.19",
"@types/react-native-background-timer": "^2.0.0",
"@types/react-native-i18n": "^2.0.0",
"@types/react-native-push-notification": "^8.1.1",
@@ -275,7 +275,7 @@
"js-yaml": "^3.13.1",
"jsdoc-to-markdown": "^6.0.1",
"lint-staged": "^13.2.0",
- "metro-react-native-babel-preset": "^0.70.3",
+ "metro-react-native-babel-preset": "^0.73.0",
"mockdate": "^3.0.2",
"mockttp": "2.4.0",
"node-fetch": "^2.6.7",
@@ -287,7 +287,7 @@
"react-native-bundle-visualizer": "^2.2.1",
"react-native-get-random-values": "^1.7.0",
"react-native-svg-transformer": "^0.14.3",
- "react-test-renderer": "18.0.0",
+ "react-test-renderer": "18.1.0",
"redux-mock-store": "^1.5.4",
"redux-saga-test-plan": "4.0.3",
"rn-nodeify": "^10.0.1",
diff --git a/patches/@react-navigation+material-top-tabs+5.3.19.patch b/patches/@react-navigation+material-top-tabs+5.3.19.patch
deleted file mode 100644
index e3ced5a3cc6..00000000000
--- a/patches/@react-navigation+material-top-tabs+5.3.19.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/node_modules/@react-navigation/material-top-tabs/.DS_Store b/node_modules/@react-navigation/material-top-tabs/.DS_Store
-new file mode 100644
-index 0000000..5172429
-Binary files /dev/null and b/node_modules/@react-navigation/material-top-tabs/.DS_Store differ
-diff --git a/node_modules/@react-navigation/material-top-tabs/lib/typescript/.DS_Store b/node_modules/@react-navigation/material-top-tabs/lib/typescript/.DS_Store
-new file mode 100644
-index 0000000..5127bf9
-Binary files /dev/null and b/node_modules/@react-navigation/material-top-tabs/lib/typescript/.DS_Store differ
-diff --git a/node_modules/@react-navigation/material-top-tabs/lib/typescript/src/types.d.ts b/node_modules/@react-navigation/material-top-tabs/lib/typescript/src/types.d.ts
-index 4a4b081..1cf21c0 100644
---- a/node_modules/@react-navigation/material-top-tabs/lib/typescript/src/types.d.ts
-+++ b/node_modules/@react-navigation/material-top-tabs/lib/typescript/src/types.d.ts
-@@ -76,6 +76,18 @@ export declare type MaterialTopTabNavigationConfig = Partial['renderPager'];
-+ /**
-+ * Whether this screen should be lazily rendered. When this is set to `true`,
-+ * the screen will be rendered as it comes into the viewport.
-+ * By default all screens are rendered to provide a smoother swipe experience.
-+ * But you might want to defer the rendering of screens out of the viewport until the user sees them.
-+ * To enable lazy rendering for this screen, set `lazy` to `true`.
-+ *
-+ * When you enable `lazy`, the lazy loaded screens will usually take some time to render
-+ * when they come into the viewport. You can use the `lazyPlaceholder` prop to customize
-+ * what the user sees during this short period.
-+ */
-+ lazy?: boolean;
- /**
- * Function that returns a React element to render for routes that haven't been rendered yet.
- * Receives an object containing the route as the prop.
-diff --git a/node_modules/@react-navigation/material-top-tabs/src/types.tsx b/node_modules/@react-navigation/material-top-tabs/src/types.tsx
-index 60270ff..d7ae0e8 100644
---- a/node_modules/@react-navigation/material-top-tabs/src/types.tsx
-+++ b/node_modules/@react-navigation/material-top-tabs/src/types.tsx
-@@ -121,6 +121,18 @@ export type MaterialTopTabNavigationConfig = Partial<
- * The pager handles swipe gestures and page switching.
- */
- pager?: React.ComponentProps['renderPager'];
-+ /**
-+ * Whether this screen should be lazily rendered. When this is set to `true`,
-+ * the screen will be rendered as it comes into the viewport.
-+ * By default all screens are rendered to provide a smoother swipe experience.
-+ * But you might want to defer the rendering of screens out of the viewport until the user sees them.
-+ * To enable lazy rendering for this screen, set `lazy` to `true`.
-+ *
-+ * When you enable `lazy`, the lazy loaded screens will usually take some time to render
-+ * when they come into the viewport. You can use the `lazyPlaceholder` prop to customize
-+ * what the user sees during this short period.
-+ */
-+ lazy?: boolean;
- /**
- * Function that returns a React element to render for routes that haven't been rendered yet.
- * Receives an object containing the route as the prop.
diff --git a/patches/@types+react-native+0.69.6.patch b/patches/@types+react-native+0.70.19.patch
similarity index 51%
rename from patches/@types+react-native+0.69.6.patch
rename to patches/@types+react-native+0.70.19.patch
index 6cb8cb885df..ea89767f364 100644
--- a/patches/@types+react-native+0.69.6.patch
+++ b/patches/@types+react-native+0.70.19.patch
@@ -1,21 +1,11 @@
diff --git a/node_modules/@types/react-native/index.d.ts b/node_modules/@types/react-native/index.d.ts
-index bf4b3d6..a54a72b 100755
+index 12831dd..aedaba3 100644
--- a/node_modules/@types/react-native/index.d.ts
+++ b/node_modules/@types/react-native/index.d.ts
-@@ -7723,7 +7723,8 @@ export type Permission =
- | 'android.permission.WRITE_EXTERNAL_STORAGE'
- | 'android.permission.BLUETOOTH_CONNECT'
- | 'android.permission.BLUETOOTH_SCAN'
-- | 'android.permission.BLUETOOTH_ADVERTISE';
-+ | 'android.permission.BLUETOOTH_ADVERTISE'
-+ | 'android.permission.POST_NOTIFICATIONS';
-
- export type PermissionStatus = 'granted' | 'denied' | 'never_ask_again';
-
-@@ -8370,6 +8371,10 @@ export interface UIManagerStatic {
+@@ -8548,6 +8548,10 @@ export interface UIManagerStatic {
* commandArgs - Args of the native method that we can pass from JS to native.
*/
- dispatchViewManagerCommand: (reactTag: number | null, commandID: number | string, commandArgs?: Array) => void;
+ dispatchViewManagerCommand: (reactTag: number | null, commandID: number | string, commandArgs?: any[]) => void;
+
+ //Added missing accesibility definition
+ sendAccessibilityEvent(reactTag?: number, eventType: number): void;
diff --git a/patches/native-base+2.15.2.patch b/patches/native-base+2.15.2.patch
new file mode 100644
index 00000000000..3fcf5f30b79
--- /dev/null
+++ b/patches/native-base+2.15.2.patch
@@ -0,0 +1,31 @@
+diff --git a/node_modules/native-base/dist/src/basic/ToastContainer.js b/node_modules/native-base/dist/src/basic/ToastContainer.js
+index 832b3e8..d964156 100644
+--- a/node_modules/native-base/dist/src/basic/ToastContainer.js
++++ b/node_modules/native-base/dist/src/basic/ToastContainer.js
+@@ -1,2 +1,2 @@
+-Object.defineProperty(exports,"__esModule",{value:true});exports.ToastContainer=undefined;var _extends=Object.assign||function(target){for(var i=1;i=0)continue;if(!Object.prototype.hasOwnProperty.call(obj,i))continue;target[i]=obj[i];}return target;}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return call&&(typeof call==="object"||typeof call==="function")?call:self;}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}var POSITION={ABSOLUTE:'absolute',BOTTOM:'bottom',TOP:'top'};var ToastContainer=function(_Component){_inherits(ToastContainer,_Component);_createClass(ToastContainer,null,[{key:'show',value:function show(_ref){var config=_objectWithoutProperties(_ref,[]);this.toastInstance._root.showToast({config:config});}},{key:'hide',value:function hide(){if(this.toastInstance._root.getModalState()){this.toastInstance._root.closeToast('functionCall');}}}]);function ToastContainer(props){_classCallCheck(this,ToastContainer);var _this=_possibleConstructorReturn(this,(ToastContainer.__proto__||Object.getPrototypeOf(ToastContainer)).call(this,props));_this.closeModal=function(reason){_this.setState({modalVisible:false});var onClose=_this.state.onClose;if(onClose&&typeof onClose==='function'){onClose(reason);}};_this.state={fadeAnim:new _reactNative.Animated.Value(0),pan:new _reactNative.Animated.ValueXY({x:0,y:0}),keyboardHeight:0,isKeyboardVisible:false,modalVisible:false};_this.keyboardDidHide=_this.keyboardDidHide.bind(_this);_this.keyboardDidShow=_this.keyboardDidShow.bind(_this);_this._panResponder=_reactNative.PanResponder.create({onMoveShouldSetPanResponderCapture:function onMoveShouldSetPanResponderCapture(){return true;},onPanResponderRelease:function onPanResponderRelease(evt,_ref2){var dx=_ref2.dx;if(dx!==0){_reactNative.Animated.timing(_this.state.pan,{toValue:{x:dx,y:0},duration:100,useNativeDriver:false}).start(function(){return _this.closeToast('swipe');});}}});return _this;}_createClass(ToastContainer,[{key:'componentDidMount',value:function componentDidMount(){_reactNative.Keyboard.addListener('keyboardDidShow',this.keyboardDidShow);_reactNative.Keyboard.addListener('keyboardDidHide',this.keyboardDidHide);}},{key:'componentWillUnmount',value:function componentWillUnmount(){_reactNative.Keyboard.removeListener('keyboardDidShow',this.keyboardDidShow);_reactNative.Keyboard.removeListener('keyboardDidHide',this.keyboardDidHide);}},{key:'getToastStyle',value:function getToastStyle(){return{position:POSITION.ABSOLUTE,opacity:this.state.fadeAnim,width:'100%',elevation:9,paddingHorizontal:_reactNative.Platform.OS===_commonColor.PLATFORM.IOS?20:0,top:this.state.position===POSITION.TOP?30:undefined,bottom:this.state.position===POSITION.BOTTOM?this.getTop():undefined};}},{key:'getTop',value:function getTop(){if(_reactNative.Platform.OS===_commonColor.PLATFORM.IOS){if(this.state.isKeyboardVisible){return this.state.keyboardHeight;}return 30;}return 0;}},{key:'getButtonText',value:function getButtonText(buttonText){if(buttonText){if(buttonText.trim().length===0){return undefined;}return buttonText;}return undefined;}},{key:'getModalState',value:function getModalState(){return this.state.modalVisible;}},{key:'keyboardDidHide',value:function keyboardDidHide(){this.setState({keyboardHeight:0,isKeyboardVisible:false});}},{key:'keyboardDidShow',value:function keyboardDidShow(e){this.setState({keyboardHeight:e.endCoordinates.height,isKeyboardVisible:true});}},{key:'showToast',value:function showToast(_ref3){var config=_ref3.config;this.setState({modalVisible:true,text:config.text,buttonText:this.getButtonText(config.buttonText),type:config.type,position:config.position?config.position:POSITION.BOTTOM,supportedOrientations:config.supportedOrientations,style:config.style,buttonTextStyle:config.buttonTextStyle,buttonStyle:config.buttonStyle,textStyle:config.textStyle,onClose:config.onClose,swipeDisabled:config.swipeDisabled||false});if(this.closeTimeout){clearTimeout(this.closeTimeout);}if(config.duration!==0){var duration=config.duration>0?config.duration:1500;this.closeTimeout=setTimeout(this.closeToast.bind(this,'timeout'),duration);}_reactNative.Animated.timing(this.state.fadeAnim,{toValue:1,duration:200,useNativeDriver:false}).start();}},{key:'closeToast',value:function closeToast(reason){var _this2=this;clearTimeout(this.closeTimeout);_reactNative.Animated.timing(this.state.fadeAnim,{toValue:0,duration:200,useNativeDriver:false}).start(function(){_this2.closeModal(reason);_this2.state.pan.setValue({x:0,y:0});});}},{key:'render',value:function render(){var _this3=this;if(this.state.modalVisible){var _state$pan=this.state.pan,x=_state$pan.x,y=_state$pan.y;return _react2.default.createElement(_reactNative.Animated.View,_extends({},this.state.swipeDisabled?{}:this._panResponder.panHandlers,{style:[this.getToastStyle(),{transform:[{translateX:x},{translateY:y}]}],__source:{fileName:_jsxFileName,lineNumber:182}}),_react2.default.createElement(_Toast.Toast,{style:[this.state.style],danger:this.state.type==='danger',success:this.state.type==='success',warning:this.state.type==='warning',__source:{fileName:_jsxFileName,lineNumber:189}},_react2.default.createElement(_Text.Text,{style:this.state.textStyle,__source:{fileName:_jsxFileName,lineNumber:195}},this.state.text),this.state.buttonText&&_react2.default.createElement(_Button.Button,{style:this.state.buttonStyle,onPress:function onPress(){return _this3.closeToast('user');},__source:{fileName:_jsxFileName,lineNumber:197}},_react2.default.createElement(_Text.Text,{style:this.state.buttonTextStyle,__source:{fileName:_jsxFileName,lineNumber:201}},this.state.buttonText))));}return null;}}]);return ToastContainer;}(_react.Component);ToastContainer.propTypes=_extends({},_reactNative.ViewPropTypes);var StyledToastContainer=(0,_nativeBaseShoutemTheme.connectStyle)('NativeBase.ToastContainer',{},_mapPropsToStyleNames2.default)(ToastContainer);exports.ToastContainer=StyledToastContainer;
++Object.defineProperty(exports,"__esModule",{value:true});exports.ToastContainer=undefined;var _extends=Object.assign||function(target){for(var i=1;i=0)continue;if(!Object.prototype.hasOwnProperty.call(obj,i))continue;target[i]=obj[i];}return target;}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return call&&(typeof call==="object"||typeof call==="function")?call:self;}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}var POSITION={ABSOLUTE:'absolute',BOTTOM:'bottom',TOP:'top'};var ToastContainer=function(_Component){_inherits(ToastContainer,_Component);_createClass(ToastContainer,null,[{key:'show',value:function show(_ref){var config=_objectWithoutProperties(_ref,[]);this.toastInstance._root.showToast({config:config});}},{key:'hide',value:function hide(){if(this.toastInstance._root.getModalState()){this.toastInstance._root.closeToast('functionCall');}}}]);function ToastContainer(props){_classCallCheck(this,ToastContainer);var _this=_possibleConstructorReturn(this,(ToastContainer.__proto__||Object.getPrototypeOf(ToastContainer)).call(this,props));_this.closeModal=function(reason){_this.setState({modalVisible:false});var onClose=_this.state.onClose;if(onClose&&typeof onClose==='function'){onClose(reason);}};_this.state={fadeAnim:new _reactNative.Animated.Value(0),pan:new _reactNative.Animated.ValueXY({x:0,y:0}),keyboardHeight:0,isKeyboardVisible:false,modalVisible:false};_this.keyboardDidHide=_this.keyboardDidHide.bind(_this);_this.keyboardDidShow=_this.keyboardDidShow.bind(_this);_this._panResponder=_reactNative.PanResponder.create({onMoveShouldSetPanResponderCapture:function onMoveShouldSetPanResponderCapture(){return true;},onPanResponderRelease:function onPanResponderRelease(evt,_ref2){var dx=_ref2.dx;if(dx!==0){_reactNative.Animated.timing(_this.state.pan,{toValue:{x:dx,y:0},duration:100,useNativeDriver:false}).start(function(){return _this.closeToast('swipe');});}}});return _this;}_createClass(ToastContainer,[{key:'componentDidMount',value:function componentDidMount(){}},{key:'componentWillUnmount',value:function componentWillUnmount(){}},{key:'getToastStyle',value:function getToastStyle(){return{position:POSITION.ABSOLUTE,opacity:this.state.fadeAnim,width:'100%',elevation:9,paddingHorizontal:_reactNative.Platform.OS===_commonColor.PLATFORM.IOS?20:0,top:this.state.position===POSITION.TOP?30:undefined,bottom:this.state.position===POSITION.BOTTOM?this.getTop():undefined};}},{key:'getTop',value:function getTop(){if(_reactNative.Platform.OS===_commonColor.PLATFORM.IOS){if(this.state.isKeyboardVisible){return this.state.keyboardHeight;}return 30;}return 0;}},{key:'getButtonText',value:function getButtonText(buttonText){if(buttonText){if(buttonText.trim().length===0){return undefined;}return buttonText;}return undefined;}},{key:'getModalState',value:function getModalState(){return this.state.modalVisible;}},{key:'keyboardDidHide',value:function keyboardDidHide(){this.setState({keyboardHeight:0,isKeyboardVisible:false});}},{key:'keyboardDidShow',value:function keyboardDidShow(e){this.setState({keyboardHeight:e.endCoordinates.height,isKeyboardVisible:true});}},{key:'showToast',value:function showToast(_ref3){var config=_ref3.config;this.setState({modalVisible:true,text:config.text,buttonText:this.getButtonText(config.buttonText),type:config.type,position:config.position?config.position:POSITION.BOTTOM,supportedOrientations:config.supportedOrientations,style:config.style,buttonTextStyle:config.buttonTextStyle,buttonStyle:config.buttonStyle,textStyle:config.textStyle,onClose:config.onClose,swipeDisabled:config.swipeDisabled||false});if(this.closeTimeout){clearTimeout(this.closeTimeout);}if(config.duration!==0){var duration=config.duration>0?config.duration:1500;this.closeTimeout=setTimeout(this.closeToast.bind(this,'timeout'),duration);}_reactNative.Animated.timing(this.state.fadeAnim,{toValue:1,duration:200,useNativeDriver:false}).start();}},{key:'closeToast',value:function closeToast(reason){var _this2=this;clearTimeout(this.closeTimeout);_reactNative.Animated.timing(this.state.fadeAnim,{toValue:0,duration:200,useNativeDriver:false}).start(function(){_this2.closeModal(reason);_this2.state.pan.setValue({x:0,y:0});});}},{key:'render',value:function render(){var _this3=this;if(this.state.modalVisible){var _state$pan=this.state.pan,x=_state$pan.x,y=_state$pan.y;return _react2.default.createElement(_reactNative.Animated.View,_extends({},this.state.swipeDisabled?{}:this._panResponder.panHandlers,{style:[this.getToastStyle(),{transform:[{translateX:x},{translateY:y}]}],__source:{fileName:_jsxFileName,lineNumber:182}}),_react2.default.createElement(_Toast.Toast,{style:[this.state.style],danger:this.state.type==='danger',success:this.state.type==='success',warning:this.state.type==='warning',__source:{fileName:_jsxFileName,lineNumber:189}},_react2.default.createElement(_Text.Text,{style:this.state.textStyle,__source:{fileName:_jsxFileName,lineNumber:195}},this.state.text),this.state.buttonText&&_react2.default.createElement(_Button.Button,{style:this.state.buttonStyle,onPress:function onPress(){return _this3.closeToast('user');},__source:{fileName:_jsxFileName,lineNumber:197}},_react2.default.createElement(_Text.Text,{style:this.state.buttonTextStyle,__source:{fileName:_jsxFileName,lineNumber:201}},this.state.buttonText))));}return null;}}]);return ToastContainer;}(_react.Component);ToastContainer.propTypes=_extends({},_reactNative.ViewPropTypes);var StyledToastContainer=(0,_nativeBaseShoutemTheme.connectStyle)('NativeBase.ToastContainer',{},_mapPropsToStyleNames2.default)(ToastContainer);exports.ToastContainer=StyledToastContainer;
+ //# sourceMappingURL=ToastContainer.js.map
+\ No newline at end of file
+diff --git a/node_modules/native-base/src/basic/ToastContainer.js b/node_modules/native-base/src/basic/ToastContainer.js
+index 4bd57ac..31c5586 100644
+--- a/node_modules/native-base/src/basic/ToastContainer.js
++++ b/node_modules/native-base/src/basic/ToastContainer.js
+@@ -59,13 +59,13 @@ class ToastContainer extends Component {
+ }
+
+ componentDidMount() {
+- Keyboard.addListener('keyboardDidShow', this.keyboardDidShow);
+- Keyboard.addListener('keyboardDidHide', this.keyboardDidHide);
++ // Keyboard.addListener('keyboardDidShow', this.keyboardDidShow);
++ // Keyboard.addListener('keyboardDidHide', this.keyboardDidHide);
+ }
+
+ componentWillUnmount() {
+- Keyboard.removeListener('keyboardDidShow', this.keyboardDidShow);
+- Keyboard.removeListener('keyboardDidHide', this.keyboardDidHide);
++ // Keyboard.removeListener('keyboardDidShow', this.keyboardDidShow);
++ // Keyboard.removeListener('keyboardDidHide', this.keyboardDidHide);
+ }
+
+ getToastStyle() {
diff --git a/patches/patches.md b/patches/patches.md
index a4f288edd4c..7eb5ebc50c1 100644
--- a/patches/patches.md
+++ b/patches/patches.md
@@ -1,5 +1,22 @@
This file describes the reason for the patches applied.
+### native-base+2.15.2
+Created on **25/03/2024**
+
+#### Reason:
+- Fixes a crash occurring when reopening the app while in background on Android (possibly even iOS but currently we don't have evidence) due to the usage of removed `keyboardDidShow` and `keyboardDidHide` events.
+Remove this patch after removing `native-base`.
+
+### react-native-reanimated
+Created on **18/03/2024**
+This patch resolves [react-native-reanimated/issues/3286](https://github.com/software-mansion/react-native-reanimated/issues/3286) by applying [react-native-reanimated/pull/3298](https://github.com/software-mansion/react-native-reanimated/pull/3298). Remove this patch once bumped `react-native-reanimated` from `v2` to `v3` and checked the issue is gone.
+
+### react-native-pdf+6.4.0
+Created on **16/03/2024**
+
+#### Reason:
+- Make PDF annotations on iOS read-only to align with Android behaviour.
+
### react-native-vision-camera+2.15.4
Created on **24/07/2023**
FIXME: remove this patch after this [PR](https://github.com/mrousavy/react-native-vision-camera/pull/1666) has been merged and a new vision camera version has been released.
@@ -20,19 +37,7 @@ Created on **15/12/2021**
- `getMacAddress`
- `getMacAddressSync`
-### react-native+0.69.9
-Created on **19/07/2023**
-
-#### Reason:
-- This patch is going to add a missing POST_NOTIFICATIONS permission (Android 13) (remove this patch after updating to version 71 of React Native).
-
-### @types/react-native+0.69.9
-Created on **19/07/2023**
-
-#### Reason:
-- Missing POST_NOTIFICATIONS permission type (remove this patch after updating to version 71 of React Native).
-
-### @types/react-native+0.69.6
+### @types/react-native+0.70.19
Created on **30/08/2022**
#### Reason:
@@ -96,7 +101,7 @@ Created on **16/08/2021**
#### Reason:
- implementation 'androidx.core:core:1.+' not compatible with the new gradle settings used by react-native 0.64.2
-### react-native+0.69.4
+### react-native+0.70.15
Created on **20/08/2021**
#### Reason:
@@ -120,7 +125,7 @@ Created on **16/09/2021**
component, with this patch, doesn't use anymore the props permissionDialogTitle, permissionDialogMessage and
buttonPositive.
-### react-native+0.64.2 (Localizable.strings)
+### react-native+0.70.15 (Localizable.strings)
Created on **28/02/2022**
@@ -150,14 +155,6 @@ Created on **29/08/2022**
- This patch is going to fix a gradle issue that breaks the compile on android platform, due to gradle imcompatibility
-### @react-navigation/material-top-tabs+5.3.1
-
-Created on **01/12/2022**
-
-#### Reason:
-
-- This patch is going to add a missing prop to component definition, it can be removed once updating the library.
-
### react-native-webview+11.26.1
Updated on **13/07/2023**
diff --git a/patches/react-native+0.69.9.patch b/patches/react-native+0.70.15.patch
similarity index 78%
rename from patches/react-native+0.69.9.patch
rename to patches/react-native+0.70.15.patch
index 514b2d7f762..57b28621556 100644
--- a/patches/react-native+0.69.9.patch
+++ b/patches/react-native+0.70.15.patch
@@ -1,29 +1,9 @@
diff --git a/node_modules/react-native/Libraries/.DS_Store b/node_modules/react-native/Libraries/.DS_Store
new file mode 100644
index 0000000..e69de29
-diff --git a/node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js b/node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js
-index 227af12..2c59500 100644
---- a/node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js
-+++ b/node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js
-@@ -68,6 +68,7 @@ const PERMISSIONS = Object.freeze({
- ANSWER_PHONE_CALLS: 'android.permission.ANSWER_PHONE_CALLS',
- READ_PHONE_NUMBERS: 'android.permission.READ_PHONE_NUMBERS',
- UWB_RANGING: 'android.permission.UWB_RANGING',
-+ POST_NOTIFICATIONS: 'android.permission.POST_NOTIFICATIONS'
- });
-
- /**
-@@ -93,6 +94,7 @@ class PermissionsAndroid {
- CALL_PHONE: string,
- CAMERA: string,
- GET_ACCOUNTS: string,
-+ POST_NOTIFICATIONS: string,
- PROCESS_OUTGOING_CALLS: string,
- READ_CALENDAR: string,
- READ_CALL_LOG: string,
diff --git a/node_modules/react-native/React/AccessibilityResources/it.lproj/Localizable.strings b/node_modules/react-native/React/AccessibilityResources/it.lproj/Localizable.strings
new file mode 100644
-index 0000000..00a9a38
+index 0000000..b0bc264
--- /dev/null
+++ b/node_modules/react-native/React/AccessibilityResources/it.lproj/Localizable.strings
@@ -0,0 +1,26 @@
@@ -53,8 +33,9 @@ index 0000000..00a9a38
+"expanded"="espanso";
+"collapsed"="compresso";
+"mixed"="misto";
+\ No newline at end of file
diff --git a/node_modules/react-native/index.js b/node_modules/react-native/index.js
-index d59ba34..8023167 100644
+index d59ba34..d0554fd 100644
--- a/node_modules/react-native/index.js
+++ b/node_modules/react-native/index.js
@@ -435,32 +435,16 @@ module.exports = {
@@ -66,7 +47,7 @@ index d59ba34..8023167 100644
- 'ColorPropType has been removed from React Native. Migrate to ' +
- "ColorPropType exported from 'deprecated-react-native-prop-types'.",
- );
-+ return require("deprecated-react-native-prop-types").ColorPropType
++ return require("deprecated-react-native-prop-types").ColorPropType;
},
get EdgeInsetsPropType(): $FlowFixMe {
- invariant(
@@ -74,7 +55,7 @@ index d59ba34..8023167 100644
- 'EdgeInsetsPropType has been removed from React Native. Migrate to ' +
- "EdgeInsetsPropType exported from 'deprecated-react-native-prop-types'.",
- );
-+ return require("deprecated-react-native-prop-types").EdgeInsetsPropType
++ return require("deprecated-react-native-prop-types").EdgeInsetsPropType;
},
get PointPropType(): $FlowFixMe {
- invariant(
@@ -82,7 +63,7 @@ index d59ba34..8023167 100644
- 'PointPropType has been removed from React Native. Migrate to ' +
- "PointPropType exported from 'deprecated-react-native-prop-types'.",
- );
-+ return require("deprecated-react-native-prop-types").PointPropType
++ return require("deprecated-react-native-prop-types").PointPropType;
},
get ViewPropTypes(): $FlowFixMe {
- invariant(
@@ -90,16 +71,16 @@ index d59ba34..8023167 100644
- 'ViewPropTypes has been removed from React Native. Migrate to ' +
- "ViewPropTypes exported from 'deprecated-react-native-prop-types'.",
- );
-+ return require("deprecated-react-native-prop-types").ViewPropTypes
++ return require("deprecated-react-native-prop-types").ViewPropTypes;
},
};
diff --git a/node_modules/react-native/scripts/react-native-xcode.back.sh b/node_modules/react-native/scripts/react-native-xcode.back.sh
new file mode 100755
-index 0000000..6f95a29
+index 0000000..927ec76
--- /dev/null
+++ b/node_modules/react-native/scripts/react-native-xcode.back.sh
-@@ -0,0 +1,187 @@
+@@ -0,0 +1,182 @@
+#!/bin/bash
+# Copyright (c) Meta Platforms, Inc. and affiliates.
+#
@@ -176,25 +157,19 @@ index 0000000..6f95a29
+ ENTRY_FILE=${1:-index.js}
+fi
+
-+if [[ $DEV != true && ! -f "$ENTRY_FILE" ]]; then
-+ echo "error: Entry file $ENTRY_FILE does not exist. If you use another file as your entry point, pass ENTRY_FILE=myindex.js" >&2
-+ exit 2
-+fi
-+
+# check and assign NODE_BINARY env
+# shellcheck source=/dev/null
+source "$REACT_NATIVE_DIR/scripts/node-binary.sh"
+
-+[ -z "$HERMES_CLI_PATH" ] && HERMES_CLI_PATH="$PODS_ROOT/hermes-engine/destroot/bin/hermesc"
-+
-+if [[ -z "$USE_HERMES" && -f "$HERMES_CLI_PATH" ]]; then
-+ echo "Enabling Hermes byte-code compilation. Disable with USE_HERMES=false if needed."
-+ USE_HERMES=true
-+fi
++HERMES_ENGINE_PATH="$PODS_ROOT/hermes-engine"
++[ -z "$HERMES_CLI_PATH" ] && HERMES_CLI_PATH="$HERMES_ENGINE_PATH/destroot/bin/hermesc"
+
-+if [[ $USE_HERMES == true && ! -f "$HERMES_CLI_PATH" ]]; then
-+ echo "error: USE_HERMES is set to true but the hermesc binary could not be " \
-+ "found at ${HERMES_CLI_PATH}. Perhaps you need to run 'bundle exec pod install' or otherwise " \
++# Hermes is enabled in new projects by default, so we cannot assume that USE_HERMES=1 is set as an envvar.
++# If hermes-engine is found in Pods, we can assume Hermes has not been disabled.
++# If hermesc is not available and USE_HERMES is either unset or true, show error.
++if [[ -f "$HERMES_ENGINE_PATH" && ! -f "$HERMES_CLI_PATH" ]]; then
++ echo "error: Hermes is enabled but the hermesc binary could not be found at ${HERMES_CLI_PATH}." \
++ "Perhaps you need to run 'bundle exec pod install' or otherwise " \
+ "point the HERMES_CLI_PATH variable to your custom location." >&2
+ exit 2
+fi
@@ -237,7 +212,7 @@ index 0000000..6f95a29
+
+PACKAGER_SOURCEMAP_FILE=
+if [[ $EMIT_SOURCEMAP == true ]]; then
-+ if [[ $USE_HERMES == true ]]; then
++ if [[ $USE_HERMES != false ]]; then
+ PACKAGER_SOURCEMAP_FILE="$CONFIGURATION_BUILD_DIR/$(basename $SOURCEMAP_FILE)"
+ else
+ PACKAGER_SOURCEMAP_FILE="$SOURCEMAP_FILE"
@@ -246,7 +221,7 @@ index 0000000..6f95a29
+fi
+
+# Hermes doesn't require JS minification.
-+if [[ $USE_HERMES == true && $DEV == false ]]; then
++if [[ $USE_HERMES != false && $DEV == false ]]; then
+ EXTRA_ARGS="$EXTRA_ARGS --minify false"
+fi
+
@@ -261,7 +236,7 @@ index 0000000..6f95a29
+ $EXTRA_ARGS \
+ $EXTRA_PACKAGER_ARGS
+
-+if [[ $USE_HERMES != true ]]; then
++if [[ $USE_HERMES == false ]]; then
+ cp "$BUNDLE_FILE" "$DEST/"
+ BUNDLE_FILE="$DEST/main.jsbundle"
+else
@@ -276,22 +251,23 @@ index 0000000..6f95a29
+ fi
+ "$HERMES_CLI_PATH" -emit-binary $EXTRA_COMPILER_ARGS -out "$DEST/main.jsbundle" "$BUNDLE_FILE"
+ if [[ $EMIT_SOURCEMAP == true ]]; then
-+ HBC_SOURCEMAP_FILE="$BUNDLE_FILE.map"
++ HBC_SOURCEMAP_FILE="$DEST/main.jsbundle.map"
+ "$NODE_BINARY" "$COMPOSE_SOURCEMAP_PATH" "$PACKAGER_SOURCEMAP_FILE" "$HBC_SOURCEMAP_FILE" -o "$SOURCEMAP_FILE"
++ rm "$HBC_SOURCEMAP_FILE"
++ rm "$PACKAGER_SOURCEMAP_FILE"
+ fi
+ BUNDLE_FILE="$DEST/main.jsbundle"
+fi
+
+if [[ $DEV != true && ! -f "$BUNDLE_FILE" ]]; then
-+ echo "error: File $BUNDLE_FILE does not exist. This must be a bug with" >&2
-+ echo "React Native, please report it here: https://github.com/facebook/react-native/issues"
++ echo "error: File $BUNDLE_FILE does not exist. This must be a bug with React Native, please report it here: https://github.com/facebook/react-native/issues" >&2
+ exit 2
+fi
diff --git a/node_modules/react-native/scripts/react-native-xcode.sh b/node_modules/react-native/scripts/react-native-xcode.sh
-index 6f95a29..166c9d4 100755
+index 927ec76..477fc27 100755
--- a/node_modules/react-native/scripts/react-native-xcode.sh
+++ b/node_modules/react-native/scripts/react-native-xcode.sh
-@@ -155,6 +155,7 @@ fi
+@@ -149,6 +149,7 @@ fi
--dev $DEV \
--reset-cache \
--bundle-output "$BUNDLE_FILE" \
diff --git a/patches/react-native-mixpanel+1.2.0.patch b/patches/react-native-mixpanel+1.2.0.patch
deleted file mode 100644
index 9ca04be8245..00000000000
--- a/patches/react-native-mixpanel+1.2.0.patch
+++ /dev/null
@@ -1,90 +0,0 @@
-diff --git a/node_modules/react-native-mixpanel/.DS_Store b/node_modules/react-native-mixpanel/.DS_Store
-new file mode 100644
-index 0000000..e69de29
-diff --git a/node_modules/react-native-mixpanel/RNMixpanel/RNMixpanel.m b/node_modules/react-native-mixpanel/RNMixpanel/RNMixpanel.m
-index 8564911..8a158db 100644
---- a/node_modules/react-native-mixpanel/RNMixpanel/RNMixpanel.m
-+++ b/node_modules/react-native-mixpanel/RNMixpanel/RNMixpanel.m
-@@ -46,7 +46,12 @@ -(Mixpanel*) getInstance: (NSString *)name {
- trackCrashes:trackCrashes
- automaticPushTracking:automaticPushTracking
- optOutTrackingByDefault:optOutTrackingByDefault];
--
-+ // disable A/B testing see https://pagopa.atlassian.net/browse/IA-42
-+ [instance setEnableVisualABTestAndCodeless: NO];
-+ instance.enableVisualABTestAndCodeless=NO;
-+ // need to change mixpanel endpoint due to saving data in EU zone
-+ // see https://www.pivotaltracker.com/story/show/171600487
-+ instance.serverURL = @"https://api-eu.mixpanel.com";
- // copy instances and add the new instance. then reassign instances
- NSMutableDictionary *newInstances = [NSMutableDictionary dictionaryWithDictionary:instances];
- [newInstances setObject:instance forKey:apiToken];
-diff --git a/node_modules/react-native-mixpanel/android/.project b/node_modules/react-native-mixpanel/android/.project
-new file mode 100644
-index 0000000..95512e0
---- /dev/null
-+++ b/node_modules/react-native-mixpanel/android/.project
-@@ -0,0 +1,23 @@
-+
-+
-+ react-native-mixpanel
-+ Project react-native-mixpanel created by Buildship.
-+
-+
-+
-+
-+ org.eclipse.jdt.core.javabuilder
-+
-+
-+
-+
-+ org.eclipse.buildship.core.gradleprojectbuilder
-+
-+
-+
-+
-+
-+ org.eclipse.jdt.core.javanature
-+ org.eclipse.buildship.core.gradleprojectnature
-+
-+
-diff --git a/node_modules/react-native-mixpanel/android/src/main/java/com/kevinejohn/RNMixpanel/RNMixpanelModule.java b/node_modules/react-native-mixpanel/android/src/main/java/com/kevinejohn/RNMixpanel/RNMixpanelModule.java
-index 6239e11..a7352d4 100644
---- a/node_modules/react-native-mixpanel/android/src/main/java/com/kevinejohn/RNMixpanel/RNMixpanelModule.java
-+++ b/node_modules/react-native-mixpanel/android/src/main/java/com/kevinejohn/RNMixpanel/RNMixpanelModule.java
-@@ -18,7 +18,7 @@ import org.json.JSONObject;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.Map;
--
-+import com.mixpanel.android.mpmetrics.MPConfig;
- /**
- * Mixpanel React Native module.
- * Note that synchronized(instance) is used in methods because that's what MixpanelAPI.java recommends you do if you are keeping instances.
-@@ -30,6 +30,13 @@ public class RNMixpanelModule extends ReactContextBaseJavaModule implements Life
- public RNMixpanelModule(ReactApplicationContext reactContext) {
- super(reactContext);
-
-+
-+
-+ // need to change mixpanel endpoint due to saving data in EU zone
-+ // see https://www.pivotaltracker.com/story/show/171600487
-+ MPConfig.getInstance(reactContext).setEventsEndpoint("https://api-eu.mixpanel.com/track");
-+ MPConfig.getInstance(reactContext).setPeopleEndpoint("https://api-eu.mixpanel.com/engage");
-+ MPConfig.getInstance(reactContext).setGroupsEndpoint("https://api-eu.mixpanel.com/groups");
- // Get lifecycle notifications to flush mixpanel on pause or destroy
- reactContext.addLifecycleEventListener(this);
- }
-diff --git a/node_modules/react-native-mixpanel/index.d.ts b/node_modules/react-native-mixpanel/index.d.ts
-index c00ae8c..df23b29 100644
---- a/node_modules/react-native-mixpanel/index.d.ts
-+++ b/node_modules/react-native-mixpanel/index.d.ts
-@@ -5,7 +5,7 @@ declare module 'react-native-mixpanel' {
- initialize(): Promise
- getDistinctId(): Promise
- getSuperProperty(propertyName: string): Promise
-- track(event: string, properties?: Object): Promise
-+ track(event: string, properties?: {[key: string]: unknown}): Promise
- flush(): Promise
- disableIpAddressGeolocalization(): Promise
- alias(alias: string, oldDistinctID?: string): Promise
diff --git a/patches/react-native-pdf+6.4.0.patch b/patches/react-native-pdf+6.4.0.patch
new file mode 100644
index 00000000000..c6c9fc0c29b
--- /dev/null
+++ b/patches/react-native-pdf+6.4.0.patch
@@ -0,0 +1,27 @@
+diff --git a/node_modules/react-native-pdf/ios/RCTPdf/RCTPdfView.m b/node_modules/react-native-pdf/ios/RCTPdf/RCTPdfView.m
+index 52aafd8..5efda0b 100644
+--- a/node_modules/react-native-pdf/ios/RCTPdf/RCTPdfView.m
++++ b/node_modules/react-native-pdf/ios/RCTPdf/RCTPdfView.m
+@@ -188,12 +188,16 @@ const float MIN_SCALE = 1.0f;
+ }
+
+ if (_pdfDocument && ([changedProps containsObject:@"path"] || [changedProps containsObject:@"enableAnnotationRendering"])) {
+- if (!_enableAnnotationRendering) {
+- for (unsigned long i=0; i<_pdfView.document.pageCount; i++) {
+- PDFPage *pdfPage = [_pdfView.document pageAtIndex:i];
+- for (unsigned long j=0; j _scheduler;
+ // Reanimated changes /start
+ if (isUIViewRegistry) {
+ NSMutableDictionary> *viewRegistry = [self valueForKey:@"_viewRegistry"];
++ NSMutableDictionary> *> *toBeRemovedRegisterCopy =
++ [NSMutableDictionary dictionaryWithDictionary:_toBeRemovedRegister];
++ for (NSNumber *key in _toBeRemovedRegister) {
++ toBeRemovedRegisterCopy[key] = [NSMutableSet setWithSet:_toBeRemovedRegister[key]];
++ }
+ for (id toRemoveChild in _toBeRemovedRegister[containerTag]) {
+ NSInteger lastIndex = [container reactSubviews].count - 1;
+ if (lastIndex < 0) {
+@@ -129,7 +134,7 @@ std::weak_ptr _scheduler;
+ ) {
+ // we don't want layout animations when removing modals or Screens of native-stack since it brings buggy
+ // behavior
+- [_toBeRemovedRegister[container.reactTag] removeObject:toRemoveChild];
++ [toBeRemovedRegisterCopy[container.reactTag] removeObject:toRemoveChild];
+ [permanentlyRemovedChildren removeObject:toRemoveChild];
+
+ } else {
+@@ -137,6 +142,7 @@ std::weak_ptr _scheduler;
+ viewRegistry[toRemoveChild.reactTag] = toRemoveChild;
+ }
+ }
++ _toBeRemovedRegister = toBeRemovedRegisterCopy;
+
+ for (UIView *removedChild in permanentlyRemovedChildren) {
+ [self callAnimationForTree:removedChild parentTag:containerTag];
diff --git a/publiccode.yml b/publiccode.yml
index 1ad58474092..0f5d665af71 100644
--- a/publiccode.yml
+++ b/publiccode.yml
@@ -5,11 +5,11 @@
publiccodeYmlVersion: '0.2'
name: IO
logo: "img/app-logo.svg"
-releaseDate: '2024-02-02'
+releaseDate: '2024-04-09'
url: 'https://github.com/pagopa/io-app'
applicationSuite: IO
landingURL: 'https://io.italia.it/'
-softwareVersion: 2.53.0-rc.0
+softwareVersion: 2.58.0-rc.0
developmentStatus: beta
softwareType: standalone/mobile
roadmap: 'https://io.italia.it/'
diff --git a/react-native.config.js b/react-native.config.js
index e93843b2f5d..6a69861eff1 100644
--- a/react-native.config.js
+++ b/react-native.config.js
@@ -12,6 +12,7 @@ module.exports = {
},
assets: [
"./assets/fonts/TitilliumWeb",
+ "./assets/fonts/TitilliumSansPro",
"./assets/fonts/ReadexPro",
"./assets/fonts/RobotoMono",
"./assets/fonts/DMMono"
diff --git a/scripts/e2e_message/e2e_notifier.py b/scripts/e2e_message/e2e_notifier.py
index 3a6d8ee776a..2b47bb77424 100644
--- a/scripts/e2e_message/e2e_notifier.py
+++ b/scripts/e2e_message/e2e_notifier.py
@@ -10,6 +10,7 @@
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
SLACK_TOKEN = os.environ.get("IO_APP_SLACK_HELPER_BOT_TOKEN", None)
+TEST_FILE = os.environ.get("TEST", None)
tagged_people = [""]
SLACK_CHANNEL = "#io_dev_app_feed"
BUILD_ID = os.environ.get("BUILD_ID", None)
@@ -27,8 +28,8 @@ def send_slack_message():
token=SLACK_TOKEN, ssl=ssl_context
)
tags = " ".join(tagged_people)
- message = "[E2E Tests] :warning: %s e2e tests have failed (<%s%s|here>)" % (
- tags, BASE_ACTION_URI, BUILD_ID)
+ message = "[E2E Tests] :warning: %s e2e test \`%s\` have failed (<%s%s|here>)" % (
+ tags, TEST_FILE, BASE_ACTION_URI, BUILD_ID)
message_blocks = []
message_blocks.append({
"type": "section",
diff --git a/scripts/ts/common/jiraTicket/index.ts b/scripts/ts/common/jiraTicket/index.ts
index ffc7e493e99..a464012539f 100644
--- a/scripts/ts/common/jiraTicket/index.ts
+++ b/scripts/ts/common/jiraTicket/index.ts
@@ -79,19 +79,16 @@ export const getJiraIdFromPrTitle = (
* Try to retrieve Jira tickets from pr title
* and transforms them into {@link GenericTicket}
* @param title
+ * @returns a promise of {@link JiraTicketRetrievalResults} containing the jira tickets or an error. If no tickets are found, an empty array is returned
*/
-export const getTicketsFromTitle = async (
+export const getTicketsFromTitle = (
title: string
-): Promise => {
- const maybeJiraId = await pipe(
- getJiraIdFromPrTitle(title),
- O.map(getJiraTickets),
- O.toUndefined
+): Promise =>
+ pipe(
+ title,
+ getJiraIdFromPrTitle,
+ O.fold(
+ () => Promise.resolve([]),
+ jiraIds => getJiraTickets(jiraIds)
+ )
);
-
- if (maybeJiraId) {
- return maybeJiraId;
- } else {
- return [E.left(new Error("No Jira ticket found"))];
- }
-};
diff --git a/scripts/ts/danger/updatePrTitle.tsx b/scripts/ts/danger/updatePrTitle.tsx
index 4dc968dada8..7316df26d0c 100644
--- a/scripts/ts/danger/updatePrTitle.tsx
+++ b/scripts/ts/danger/updatePrTitle.tsx
@@ -43,7 +43,8 @@ const storyOrder = new Map([
const projectToScope = new Map([
["IOAPPX", "Cross"],
["SFEQS", "Firma con IO"],
- ["IODPAY", "IDPay"]
+ ["IODPAY", "IDPay"],
+ ["SIW", "IT Wallet"]
]);
/**
diff --git a/ts/App.tsx b/ts/App.tsx
index 5adaf2441b0..ca90819e487 100644
--- a/ts/App.tsx
+++ b/ts/App.tsx
@@ -1,20 +1,20 @@
import { BottomSheetModalProvider } from "@gorhom/bottom-sheet";
+import {
+ IODSExperimentalContextProvider,
+ IOThemeContextProvider,
+ ToastProvider
+} from "@pagopa/io-app-design-system";
import { StyleProvider } from "native-base";
import * as React from "react";
+import { GestureHandlerRootView } from "react-native-gesture-handler";
import { MenuProvider } from "react-native-popup-menu";
+import { SafeAreaProvider } from "react-native-safe-area-context";
import { Provider } from "react-redux";
import { PersistGate } from "redux-persist/integration/react";
-import { GestureHandlerRootView } from "react-native-gesture-handler";
-import {
- IODSExperimentalContextProvider,
- IOThemeContext,
- IOThemes
-} from "@pagopa/io-app-design-system";
+import RootContainer from "./RootContainer";
import { persistor, store } from "./boot/configureStoreAndPersistor";
import { LightModalProvider } from "./components/ui/LightModal";
-import RootContainer from "./RootContainer";
import theme from "./theme";
-import { ToastProvider } from "./components/Toast";
// Infer the `RootState` and `AppDispatch` types from the store itself export
export type RootState = ReturnType;
@@ -27,23 +27,25 @@ export type AppDispatch = typeof store.dispatch;
export const App: React.FunctionComponent = () => (
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
);
diff --git a/ts/__e2e__/login.e2e.ts b/ts/__e2e__/login.e2e.ts
index 6a0b1371b26..b6f6e2b2ac0 100644
--- a/ts/__e2e__/login.e2e.ts
+++ b/ts/__e2e__/login.e2e.ts
@@ -1,9 +1,7 @@
import { loginWithSPID } from "./utils";
-describe("User Login using SPID", () => {
- describe("when the user never logged in before", () => {
- it("should let the user log in with SPID", async () => {
- await loginWithSPID();
- });
+describe("User Login using SPID, when the user never logged in before", () => {
+ it("should let the user log in with SPID", async () => {
+ await loginWithSPID();
});
});
diff --git a/ts/__e2e__/payment.e2e.ts b/ts/__e2e__/payment.e2e.ts
deleted file mode 100644
index 3e1c0ae9cf0..00000000000
--- a/ts/__e2e__/payment.e2e.ts
+++ /dev/null
@@ -1,166 +0,0 @@
-import I18n from "../i18n";
-import { formatNumberCentsToAmount } from "../utils/stringBuilder";
-import { e2eWaitRenderTimeout } from "./config";
-import { closeKeyboard, ensureLoggedIn } from "./utils";
-
-describe("Payment", () => {
- beforeEach(async () => {
- await device.launchApp({ newInstance: true });
- await ensureLoggedIn();
- });
-
- describe("When the user want to pay starting from a message", () => {
- describe("And press back in the payment transaction summary screen", () => {
- it("Should return to the message details screen", async () => {
- await openPaymentFromMessage();
- const backButton = element(by.id("back-button-transaction-summary"));
- await waitFor(backButton)
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await backButton.tap();
- await waitFor(element(by.text(I18n.t("messageDetails.headerTitle"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- });
-
- describe("when navigating to the wallet", () => {
- it("then the wallet root screen should be visible", async () => {
- await openPaymentFromMessage();
-
- const backButton1 = element(by.id("back-button-transaction-summary"));
- await waitFor(backButton1)
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await backButton1.tap();
-
- const backButton2 = element(by.id("back-button"));
- await waitFor(backButton2)
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await backButton2.tap();
-
- const walletButton = element(
- by.text(I18n.t("global.navigator.wallet"))
- );
- await waitFor(walletButton)
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await walletButton.tap();
-
- await waitFor(element(by.text(I18n.t("wallet.payNotice"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- });
- });
- });
-
- describe("And press cancel in the payment confirm screen", () => {
- it("Should return to the message details screen", async () => {
- await openPaymentFromMessage();
- await waitFor(element(by.text(I18n.t("wallet.continue"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await element(by.text(I18n.t("wallet.continue"))).tap();
-
- await waitFor(element(by.text(I18n.t("wallet.ConfirmPayment.header"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- const cancelButton = element(by.id("cancelPaymentButton"));
- // const cancelButton = element(by.id("cancelPaymentButton"));
- await waitFor(cancelButton).toExist().withTimeout(e2eWaitRenderTimeout);
- await cancelButton.tap();
- // I18n.t("wallet.ConfirmPayment.confirmCancelPayment")
- const confirmCancel = element(
- by.label(I18n.t("wallet.ConfirmPayment.confirmCancelPayment"))
- ).atIndex(0);
- await waitFor(confirmCancel)
- .toExist()
- .withTimeout(e2eWaitRenderTimeout);
- await confirmCancel.tap();
-
- await waitFor(element(by.text(I18n.t("messageDetails.headerTitle"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- });
- });
-
- // TODO: this could be executed just one time until we have a way to reset the dev server between tests
- it("Should allow the user to complete a payment", async () => {
- await openPaymentFromMessage();
- await completePaymentFlow();
- });
- });
-
- describe("When the user want to pay using the manual insertion", () => {
- it("Should allow the user to complete a payment", async () => {
- await element(by.text(I18n.t("global.navigator.wallet"))).tap();
- await element(by.text(I18n.t("wallet.payNotice"))).tap();
-
- await element(by.id("barcodeScanBaseScreenTabInput")).tap();
-
- const matchNoticeCodeInput = by.id("NoticeCodeInputMask");
- await waitFor(element(matchNoticeCodeInput))
- .toExist()
- .withTimeout(e2eWaitRenderTimeout);
-
- await element(matchNoticeCodeInput).typeText("123123123123123123");
- await element(by.id("EntityCodeInputMask")).typeText("12345678901");
-
- // Close the keyboard
- await closeKeyboard();
-
- await element(by.text(I18n.t("global.buttons.continue"))).tap();
-
- await completePaymentFlow();
- });
- });
-});
-
-const completePaymentFlow = async () => {
- await waitFor(element(by.text(I18n.t("wallet.continue"))))
- .toExist()
- .withTimeout(e2eWaitRenderTimeout);
- await element(by.text(I18n.t("wallet.continue"))).tap();
-
- const matchConfirmPayment = by.text(
- `${I18n.t("wallet.ConfirmPayment.pay")} ${formatNumberCentsToAmount(
- 2322,
- true
- )}`
- );
- await waitFor(element(matchConfirmPayment))
- .toExist()
- .withTimeout(e2eWaitRenderTimeout);
- await element(matchConfirmPayment).tap();
-
- await waitFor(
- element(
- by.text(
- I18n.t("payment.paidConfirm", {
- amount: formatNumberCentsToAmount(2322, true)
- })
- )
- )
- )
- .toExist()
- .withTimeout(e2eWaitRenderTimeout);
-
- await element(by.text(I18n.t("wallet.outcomeMessage.cta.close"))).tap();
-};
-
-const openPaymentFromMessage = async () => {
- const messageWithPayment = element(
- by.id(`MessageListItem_00000000000000000000000021`)
- );
- await waitFor(messageWithPayment)
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await messageWithPayment.tap();
-
- const seeNoticeButton = element(by.text(I18n.t("messages.cta.seeNotice")));
- await waitFor(seeNoticeButton)
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await seeNoticeButton.tap();
-};
diff --git a/ts/__e2e__/payment00.e2e.ts b/ts/__e2e__/payment00.e2e.ts
new file mode 100644
index 00000000000..79748e53d91
--- /dev/null
+++ b/ts/__e2e__/payment00.e2e.ts
@@ -0,0 +1,20 @@
+import I18n from "../i18n";
+import { e2eWaitRenderTimeout } from "./config";
+import { ensureLoggedIn, openPaymentFromMessage } from "./utils";
+
+describe("Payment", () => {
+ beforeEach(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("When the user want to pay starting from a message and press back in the payment transaction summary screen, it should return to the message details screen", async () => {
+ await openPaymentFromMessage();
+ const backButton = element(by.id("back-button-transaction-summary"));
+ await waitFor(backButton).toBeVisible().withTimeout(e2eWaitRenderTimeout);
+ await backButton.tap();
+ await waitFor(element(by.text(I18n.t("messageDetails.headerTitle"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ });
+});
diff --git a/ts/__e2e__/payment01.e2e.ts b/ts/__e2e__/payment01.e2e.ts
new file mode 100644
index 00000000000..0d73beff9a4
--- /dev/null
+++ b/ts/__e2e__/payment01.e2e.ts
@@ -0,0 +1,30 @@
+import I18n from "../i18n";
+import { e2eWaitRenderTimeout } from "./config";
+import { ensureLoggedIn, openPaymentFromMessage } from "./utils";
+
+describe("Payment", () => {
+ beforeEach(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("When the user want to pay starting from a message and press back in the payment transaction summary screen, when navigating to the wallet then the wallet root screen should be visible", async () => {
+ await openPaymentFromMessage();
+
+ const backButton1 = element(by.id("back-button-transaction-summary"));
+ await waitFor(backButton1).toBeVisible().withTimeout(e2eWaitRenderTimeout);
+ await backButton1.tap();
+
+ const backButton2 = element(by.id("back-button"));
+ await waitFor(backButton2).toBeVisible().withTimeout(e2eWaitRenderTimeout);
+ await backButton2.tap();
+
+ const walletButton = element(by.text(I18n.t("global.navigator.wallet")));
+ await waitFor(walletButton).toBeVisible().withTimeout(e2eWaitRenderTimeout);
+ await walletButton.tap();
+
+ await waitFor(element(by.text(I18n.t("wallet.payNotice"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ });
+});
diff --git a/ts/__e2e__/payment02.e2e.ts b/ts/__e2e__/payment02.e2e.ts
new file mode 100644
index 00000000000..c050a48077d
--- /dev/null
+++ b/ts/__e2e__/payment02.e2e.ts
@@ -0,0 +1,37 @@
+import I18n from "../i18n";
+import { e2eWaitRenderTimeout } from "./config";
+import { ensureLoggedIn, openPaymentFromMessage } from "./utils";
+
+describe("Payment", () => {
+ beforeEach(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("When the user want to pay starting from a message and press cancel in the payment confirm screen, it should return to the message details screen", async () => {
+ await openPaymentFromMessage();
+ await waitFor(element(by.text(I18n.t("wallet.continue"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ await element(by.text(I18n.t("wallet.continue"))).tap();
+
+ await waitFor(element(by.text(I18n.t("wallet.ConfirmPayment.header"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ const cancelButton = element(by.id("cancelPaymentButton"));
+ // const cancelButton = element(by.id("cancelPaymentButton"));
+ await waitFor(cancelButton).toExist().withTimeout(e2eWaitRenderTimeout);
+ await cancelButton.tap();
+ // I18n.t("wallet.ConfirmPayment.confirmCancelPayment")
+ const confirmCancel = element(
+ by.label(I18n.t("wallet.ConfirmPayment.confirmCancelPayment"))
+ ).atIndex(0);
+ await waitFor(confirmCancel).toExist().withTimeout(e2eWaitRenderTimeout);
+ await confirmCancel.tap();
+
+ await waitFor(element(by.text(I18n.t("messageDetails.headerTitle"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ });
+});
diff --git a/ts/__e2e__/payment03.e2e.ts b/ts/__e2e__/payment03.e2e.ts
new file mode 100644
index 00000000000..d68ccd949d2
--- /dev/null
+++ b/ts/__e2e__/payment03.e2e.ts
@@ -0,0 +1,18 @@
+import {
+ completePaymentFlow,
+ ensureLoggedIn,
+ openPaymentFromMessage
+} from "./utils";
+
+describe("Payment", () => {
+ beforeEach(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ // TODO: this could be executed just one time until we have a way to reset the dev server between tests
+ it("When the user want to pay starting from a message, it should allow the user to complete a payment", async () => {
+ await openPaymentFromMessage();
+ await completePaymentFlow();
+ });
+});
diff --git a/ts/__e2e__/payment04.e2e.ts b/ts/__e2e__/payment04.e2e.ts
new file mode 100644
index 00000000000..eb75d994afe
--- /dev/null
+++ b/ts/__e2e__/payment04.e2e.ts
@@ -0,0 +1,32 @@
+import I18n from "../i18n";
+import { e2eWaitRenderTimeout } from "./config";
+import { closeKeyboard, completePaymentFlow, ensureLoggedIn } from "./utils";
+
+describe("Payment", () => {
+ beforeEach(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("When the user want to pay using the manual insertion, it should allow the user to complete a payment", async () => {
+ await element(by.text(I18n.t("global.navigator.wallet"))).tap();
+ await element(by.text(I18n.t("wallet.payNotice"))).tap();
+
+ await element(by.id("barcodeScanBaseScreenTabInput")).tap();
+
+ const matchNoticeCodeInput = by.id("NoticeCodeInputMask");
+ await waitFor(element(matchNoticeCodeInput))
+ .toExist()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ await element(matchNoticeCodeInput).typeText("123123123123123123");
+ await element(by.id("EntityCodeInputMask")).typeText("12345678901");
+
+ // Close the keyboard
+ await closeKeyboard();
+
+ await element(by.text(I18n.t("global.buttons.continue"))).tap();
+
+ await completePaymentFlow();
+ });
+});
diff --git a/ts/__e2e__/utils.ts b/ts/__e2e__/utils.ts
index ef0e68658fb..fe1194feeb1 100644
--- a/ts/__e2e__/utils.ts
+++ b/ts/__e2e__/utils.ts
@@ -1,3 +1,5 @@
+import { formatNumberCentsToAmount } from "../utils/stringBuilder";
+import I18n from "../i18n";
import {
e2ePinChar1,
e2ePinChar2,
@@ -127,3 +129,51 @@ export const closeKeyboard = async () => {
await element(by.label("Done")).atIndex(0).tap();
}
};
+
+export const openPaymentFromMessage = async () => {
+ const messageWithPayment = element(
+ by.id(`MessageListItem_00000000000000000000000019`)
+ );
+ await waitFor(messageWithPayment)
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ await messageWithPayment.tap();
+
+ const seeNoticeButton = element(by.text(I18n.t("messages.cta.seeNotice")));
+ await waitFor(seeNoticeButton)
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ await seeNoticeButton.tap();
+};
+
+export const completePaymentFlow = async () => {
+ await waitFor(element(by.text(I18n.t("wallet.continue"))))
+ .toExist()
+ .withTimeout(e2eWaitRenderTimeout);
+ await element(by.text(I18n.t("wallet.continue"))).tap();
+
+ const matchConfirmPayment = by.text(
+ `${I18n.t("wallet.ConfirmPayment.pay")} ${formatNumberCentsToAmount(
+ 2322,
+ true
+ )}`
+ );
+ await waitFor(element(matchConfirmPayment))
+ .toExist()
+ .withTimeout(e2eWaitRenderTimeout);
+ await element(matchConfirmPayment).tap();
+
+ await waitFor(
+ element(
+ by.text(
+ I18n.t("payment.paidConfirm", {
+ amount: formatNumberCentsToAmount(2322, true)
+ })
+ )
+ )
+ )
+ .toExist()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ await element(by.text(I18n.t("wallet.outcomeMessage.cta.close"))).tap();
+};
diff --git a/ts/boot/__tests__/__snapshots__/persistedStore.test.ts.snap b/ts/boot/__tests__/__snapshots__/persistedStore.test.ts.snap
index 04a4f1af920..88e04fba41a 100644
--- a/ts/boot/__tests__/__snapshots__/persistedStore.test.ts.snap
+++ b/ts/boot/__tests__/__snapshots__/persistedStore.test.ts.snap
@@ -79,6 +79,9 @@ Object {
},
},
"paginatedById": Object {},
+ "payments": Object {
+ "userSelectedPayments": Set {},
+ },
"thirdPartyById": Object {},
},
"messagesStatus": Object {},
@@ -159,7 +162,9 @@ Object {
"isDesignSystemEnabled": false,
"isFingerprintEnabled": undefined,
"isIdPayTestEnabled": false,
+ "isItWalletTestEnabled": false,
"isMixpanelEnabled": null,
+ "isNewWalletSectionEnabled": false,
"isPagoPATestEnabled": false,
"isPnTestEnabled": false,
"preferredCalendar": undefined,
diff --git a/ts/boot/configurePushNotification.ts b/ts/boot/configurePushNotification.ts
index 4530e6f9111..a501f9a8264 100644
--- a/ts/boot/configurePushNotification.ts
+++ b/ts/boot/configurePushNotification.ts
@@ -17,7 +17,6 @@ import {
pageSize,
remindersOptInEnabled
} from "../config";
-import { setMixpanelPushNotificationToken } from "../mixpanel";
import {
loadPreviousPageMessages,
reloadAllMessages
@@ -92,8 +91,6 @@ function configurePushNotifications() {
PushNotification.configure({
// Called when token is generated
onRegister: token => {
- // send token to enable PN through Mixpanel
- setMixpanelPushNotificationToken(token.token).then(constNull, constNull);
// Dispatch an action to save the token in the store
store.dispatch(updateNotificationsInstallationToken(token.token));
},
diff --git a/ts/boot/configureStoreAndPersistor.ts b/ts/boot/configureStoreAndPersistor.ts
index 26b33faa001..ffa429cd003 100644
--- a/ts/boot/configureStoreAndPersistor.ts
+++ b/ts/boot/configureStoreAndPersistor.ts
@@ -1,6 +1,6 @@
import * as pot from "@pagopa/ts-commons/lib/pot";
-import * as O from "fp-ts/lib/Option";
import AsyncStorage from "@react-native-async-storage/async-storage";
+import * as O from "fp-ts/lib/Option";
import _, { merge } from "lodash";
import {
applyMiddleware,
@@ -38,8 +38,8 @@ import {
import { ContentState } from "../store/reducers/content";
import { entitiesPersistConfig } from "../store/reducers/entities";
import {
- InstallationState,
- INSTALLATION_INITIAL_STATE
+ INSTALLATION_INITIAL_STATE,
+ InstallationState
} from "../store/reducers/installation";
import { NotificationsState } from "../store/reducers/notifications";
import { getInitialState as getInstallationInitialState } from "../store/reducers/notifications/installation";
@@ -53,7 +53,7 @@ import { configureReactotron } from "./configureRectotron";
/**
* Redux persist will migrate the store to the current version
*/
-const CURRENT_REDUX_STORE_VERSION = 23;
+const CURRENT_REDUX_STORE_VERSION = 26;
// see redux-persist documentation:
// https://github.com/rt2zz/redux-persist/blob/master/docs/migrations.md
@@ -356,7 +356,47 @@ const migrations: MigrationManifest = {
..._.omit(persistedPreferences, "isExperimentalFeaturesEnabled")
}
};
- }
+ },
+ // Version 24
+ // Adds payments history archive persistence
+ "24": (state: PersistedState) =>
+ merge(state, {
+ features: {
+ payments: {
+ history: {
+ archive: []
+ }
+ }
+ }
+ }),
+ // Version 25
+ // Adds new wallet section FF
+ "25": (state: PersistedState) =>
+ merge(state, {
+ persistedPreferences: {
+ isNewWalletSectionEnabled: false
+ }
+ }),
+ // Version 26
+ // Adds shouldShowPaymentsRedirectBanner persistence in feature wallet reducer
+ "26": (state: PersistedState) =>
+ merge(state, {
+ features: {
+ wallet: {
+ preferences: {
+ shouldShowPaymentsRedirectBanner: true
+ }
+ }
+ }
+ }),
+ // Version 27
+ // Adds it wallet section FF
+ "27": (state: PersistedState) =>
+ merge(state, {
+ persistedPreferences: {
+ isItWalletTestEnabled: false
+ }
+ })
};
const isDebuggingInChrome = isDevEnv && !!window.navigator.userAgent;
@@ -413,7 +453,10 @@ const sagaMiddleware = createSagaMiddleware(
RTron ? { sagaMonitor: (RTron as any).createSagaMonitor() } : {}
);
-function configureStoreAndPersistor(): { store: Store; persistor: Persistor } {
+function configureStoreAndPersistor(): {
+ store: Store;
+ persistor: Persistor;
+} {
/**
* If available use redux-devtool version of the compose function that allow
* the inspection of the store from the devtool.
diff --git a/ts/common/versionInfo/store/reducers/versionInfo.ts b/ts/common/versionInfo/store/reducers/versionInfo.ts
index fec99d34b6a..99e280240f5 100644
--- a/ts/common/versionInfo/store/reducers/versionInfo.ts
+++ b/ts/common/versionInfo/store/reducers/versionInfo.ts
@@ -72,7 +72,10 @@ export const isAppSupportedSelector = createSelector(
* Since the getAppVersion cannot change during the app execution, we can avoid forwarding it from the outside
* @param state
*/
-export const isPagoPaSupportedSelector = createSelector(
- [versionInfoDataSelector],
- (versionInfo): boolean => isSupported(versionInfo?.min_app_version_pagopa)
-);
+export const isPagoPaSupportedSelector = (state: GlobalState) =>
+ pipe(
+ state,
+ versionInfoDataSelector,
+ versionInfoStatusOrNull => versionInfoStatusOrNull?.min_app_version_pagopa,
+ isSupported
+ );
diff --git a/ts/components/CalendarList.tsx b/ts/components/CalendarList.tsx
new file mode 100644
index 00000000000..b68a52748e6
--- /dev/null
+++ b/ts/components/CalendarList.tsx
@@ -0,0 +1,65 @@
+import React from "react";
+import { Calendar } from "react-native-calendar-events";
+import {
+ ContentWrapper,
+ RadioGroup,
+ RadioItem
+} from "@pagopa/io-app-design-system";
+import { pipe } from "fp-ts/lib/function";
+import * as A from "fp-ts/lib/Array";
+import * as O from "fp-ts/lib/Option";
+import { convertLocalCalendarName } from "../utils/calendar";
+import { useIOSelector } from "../store/hooks";
+import { preferredCalendarSelector } from "../store/reducers/persistedPreferences";
+
+type CalendarListProps = {
+ calendars: Array;
+ isLoading: boolean;
+ onCalendarSelected: (calendar: Calendar) => void;
+};
+
+const getCalendarsByAccount = (
+ calendars: Array
+): Array> =>
+ pipe(
+ calendars,
+ A.filter(calendar => calendar.allowsModifications),
+ A.map(calendar => ({
+ id: calendar.id,
+ value: convertLocalCalendarName(calendar.title),
+ description: calendar.source
+ }))
+ );
+
+export const CalendarList = ({
+ calendars = [],
+ isLoading = false,
+ onCalendarSelected
+}: CalendarListProps) => {
+ const preferredCalendar = useIOSelector(preferredCalendarSelector);
+
+ const handleSelectCalendar = (calendarId: string) =>
+ pipe(
+ calendars,
+ A.findFirst(calendar => calendar.id === calendarId),
+ O.map(onCalendarSelected)
+ );
+
+ return (
+
+
+ items={isLoading ? loadingCalendars : getCalendarsByAccount(calendars)}
+ onPress={handleSelectCalendar}
+ selectedItem={preferredCalendar?.id}
+ type="radioListItem"
+ />
+
+ );
+};
+
+const loadingCalendars: Array> = A.makeBy(5, index => ({
+ id: index.toString(),
+ disabled: true,
+ loadingProps: { skeletonDescription: true, state: true },
+ value: ""
+}));
diff --git a/ts/components/DebugInfoOverlay.tsx b/ts/components/DebugInfoOverlay.tsx
index aef80666ee3..6f558a9ac06 100644
--- a/ts/components/DebugInfoOverlay.tsx
+++ b/ts/components/DebugInfoOverlay.tsx
@@ -1,8 +1,3 @@
-import * as React from "react";
-import { StyleSheet, Pressable, SafeAreaView, View, Text } from "react-native";
-import { connect } from "react-redux";
-import { useState } from "react";
-import { widthPercentageToDP } from "react-native-responsive-screen";
import {
HSpacer,
IOColors,
@@ -10,13 +5,18 @@ import {
hexToRgba,
makeFontStyleObject
} from "@pagopa/io-app-design-system";
+import * as React from "react";
+import { useState } from "react";
+import { Pressable, SafeAreaView, StyleSheet, Text, View } from "react-native";
+import { widthPercentageToDP } from "react-native-responsive-screen";
+import { connect } from "react-redux";
import { ReduxProps } from "../store/actions/types";
+import { useIOSelector } from "../store/hooks";
import { currentRouteSelector } from "../store/reducers/navigation";
+import { isPagoPATestEnabledSelector } from "../store/reducers/persistedPreferences";
import { GlobalState } from "../store/reducers/types";
import { getAppVersion } from "../utils/appVersion";
import { clipboardSetStringWithFeedback } from "../utils/clipboard";
-import { useIOSelector } from "../store/hooks";
-import { isPagoPATestEnabledSelector } from "../store/reducers/persistedPreferences";
import PagoPATestIndicator from "./PagoPATestIndicator";
type Props = ReturnType & ReduxProps;
@@ -27,6 +27,7 @@ const debugItemBorderColor = hexToRgba(IOColors.black, 0.1);
const styles = StyleSheet.create({
versionContainer: {
...StyleSheet.absoluteFillObject,
+ top: -8,
justifyContent: "flex-start",
alignItems: "center",
zIndex: 1000
diff --git a/ts/components/DebugPrettyPrint.tsx b/ts/components/DebugPrettyPrint.tsx
index ad110fcff01..a9f11efec1b 100644
--- a/ts/components/DebugPrettyPrint.tsx
+++ b/ts/components/DebugPrettyPrint.tsx
@@ -1,3 +1,7 @@
+/*
+WARNING: This component is not referenced anywhere, but is used
+for development purposes. for development purposes. Don't REMOVE it!
+*/
import {
IOColors,
Icon,
diff --git a/ts/components/DevScreenButton.tsx b/ts/components/DevScreenButton.tsx
deleted file mode 100644
index 31ffc1cd68d..00000000000
--- a/ts/components/DevScreenButton.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import * as React from "react";
-import { StyleSheet } from "react-native";
-import { Text as NBButtonText } from "native-base";
-import ButtonDefaultOpacity from "./ButtonDefaultOpacity";
-
-type Props = Readonly<{
- onPress: () => void;
-}>;
-
-const styles = StyleSheet.create({
- devButton: {
- position: "absolute",
- top: 20,
- left: 3,
- zIndex: 1000
- }
-});
-
-export const DevScreenButton: React.SFC = props => (
-
- Dev
-
-);
diff --git a/ts/components/EmailReadComponent.tsx b/ts/components/EmailReadComponent.tsx
deleted file mode 100644
index fe59e2e44c8..00000000000
--- a/ts/components/EmailReadComponent.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import * as O from "fp-ts/lib/Option";
-import * as React from "react";
-import { Platform, SafeAreaView, StyleSheet, View } from "react-native";
-import { Icon, VSpacer } from "@pagopa/io-app-design-system";
-import I18n from "../i18n";
-import { useIOSelector } from "../store/hooks";
-import { profileEmailSelector } from "../store/reducers/profile";
-import customVariables from "../theme/variables";
-import { ContextualHelpPropsMarkdown } from "./screens/BaseScreenComponent";
-import ScreenContent from "./screens/ScreenContent";
-import TopScreenComponent from "./screens/TopScreenComponent";
-import SectionStatusComponent from "./SectionStatus";
-import { BlockButtonsProps } from "./ui/BlockButtons";
-import FooterWithButtons from "./ui/FooterWithButtons";
-import { Body } from "./core/typography/Body";
-import { H3 } from "./core/typography/H3";
-
-const styles = StyleSheet.create({
- flex: {
- flex: 1
- },
- emailWithIcon: {
- flexDirection: "row",
- justifyContent: "flex-start",
- alignItems: "center"
- },
- content: {
- paddingHorizontal: customVariables.contentPadding,
- backgroundColor: customVariables.contentBackground,
- flex: 1
- },
- icon: {
- marginTop: Platform.OS === "android" ? 3 : 0, // correct icon position to align it with baseline of email text
- marginRight: 8
- }
-});
-
-const contextualHelpMarkdown: ContextualHelpPropsMarkdown = {
- title: "profile.data.email.contextualHelpTitle",
- body: "profile.data.email.contextualHelpContent"
-};
-
-type Props = {
- handleGoBack: () => void;
- footerProps: BlockButtonsProps;
-};
-
-const EmailReadComponent = ({ handleGoBack, footerProps }: Props) => {
- const optionEmail = useIOSelector(profileEmailSelector);
-
- return (
-
-
-
-
- {I18n.t("email.insert.label")}
-
-
-
-
-
- {O.isSome(optionEmail) && {optionEmail.value} }
-
-
- {`${I18n.t("email.read.details")}`}
-
-
-
-
-
-
- );
-};
-
-export default EmailReadComponent;
diff --git a/ts/components/FAQComponent.tsx b/ts/components/FAQComponent.tsx
index 82ee4aab4c4..44056171933 100644
--- a/ts/components/FAQComponent.tsx
+++ b/ts/components/FAQComponent.tsx
@@ -2,12 +2,12 @@ import * as React from "react";
import { ComponentProps } from "react";
import { FAQType } from "../utils/faq";
import Accordion from "./ui/Accordion";
-import Markdown from "./ui/Markdown";
+import LegacyMarkdown from "./ui/Markdown/LegacyMarkdown";
type Props = Readonly<{
faqs: ReadonlyArray;
- onLinkClicked?: ComponentProps["onLinkClicked"];
- shouldHandleLink?: ComponentProps["shouldHandleLink"];
+ onLinkClicked?: ComponentProps["onLinkClicked"];
+ shouldHandleLink?: ComponentProps["shouldHandleLink"];
}>;
const FAQComponent: React.FunctionComponent = (props: Props) => (
diff --git a/ts/components/HorizontalScroll.tsx b/ts/components/HorizontalScroll.tsx
deleted file mode 100644
index 6f2a86141b6..00000000000
--- a/ts/components/HorizontalScroll.tsx
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- * This component allows to display a carousel with rounded indicators at the bottom
- */
-import { pipe } from "fp-ts/lib/function";
-import * as O from "fp-ts/lib/Option";
-import * as React from "react";
-import {
- View,
- Animated,
- Dimensions,
- Platform,
- ScrollView,
- StyleSheet,
- NativeSyntheticEvent,
- NativeScrollEvent
-} from "react-native";
-import { IOColors, VSpacer } from "@pagopa/io-app-design-system";
-import variables from "../theme/variables";
-import { roundToThirdDecimal } from "../utils/number";
-import { trackCarousel } from "../screens/authentication/analytics/carouselAnalytics";
-
-type Props = {
- cards: ReadonlyArray;
- onCurrentElement?: (index: number) => void;
- indexToScroll?: number;
-};
-
-const itemWidth = 10; // Radius of the indicators
-const noWidth = 0;
-const screenWidth = Dimensions.get("screen").width;
-
-const styles = StyleSheet.create({
- track: {
- backgroundColor: IOColors.greyLight,
- overflow: "hidden",
- width: itemWidth,
- height: itemWidth,
- borderRadius: itemWidth / 2
- },
-
- bar: {
- backgroundColor: variables.brandPrimary,
- borderRadius: itemWidth / 2,
- width: itemWidth,
- height: itemWidth
- },
-
- scrollView: {
- flex: 1,
- alignItems: "center",
- justifyContent: "center"
- },
-
- barContainer: {
- zIndex: itemWidth,
- flexDirection: "row"
- }
-});
-
-export const HorizontalScroll: React.FunctionComponent = (
- props: Props
-) => {
- const scrollOffset =
- (props.indexToScroll ?? 0) * Dimensions.get("window").width;
- const animVal = new Animated.Value(scrollOffset);
- const scrollRef = React.useRef(null);
- const { indexToScroll } = props;
-
- const [currentIndex, setCurrentIndex] = React.useState(0);
-
- React.useEffect(() => {
- trackCarousel(currentIndex, props.cards);
- }, [currentIndex, props.cards]);
-
- React.useEffect(() => {
- pipe(
- indexToScroll,
- O.fromNullable,
- O.map(_ =>
- setTimeout(() => {
- if (scrollRef.current) {
- scrollRef.current.scrollTo({
- x: scrollOffset,
- y: 0,
- animated: false
- });
- }
- }, 0)
- )
- );
- }, [scrollRef, scrollOffset, indexToScroll]);
-
- const barArray = props.cards.map((_, i) => {
- const scrollBarVal = animVal.interpolate({
- inputRange: [screenWidth * (i - 1), screenWidth * (i + 1)],
- outputRange: [-itemWidth, itemWidth],
- extrapolate: "clamp"
- });
-
- return (
-
-
-
- );
- });
-
- const handleScrollEvent = (
- event: NativeSyntheticEvent
- ) => {
- {
- const currentIndex = Platform.select({
- ios: Math.round(
- event.nativeEvent.contentOffset.x / Dimensions.get("window").width
- ),
- default: Math.round(
- roundToThirdDecimal(event.nativeEvent.contentOffset.x) /
- roundToThirdDecimal(Dimensions.get("window").width)
- )
- });
- setCurrentIndex(currentIndex);
- pipe(
- props.onCurrentElement,
- O.fromNullable,
- O.map(onCurrElement => onCurrElement(currentIndex))
- );
- Animated.event([{ nativeEvent: { contentOffset: { x: animVal } } }])(
- event
- );
- }
- };
-
- return (
-
- 1}
- scrollEventThrottle={props.cards.length}
- pagingEnabled={true}
- onScroll={handleScrollEvent}
- >
- {props.cards}
-
-
- {props.cards.length > 1 && (
- {barArray}
- )}
-
-
- );
-};
diff --git a/ts/components/IdpSuccessfulAuthentication.tsx b/ts/components/IdpSuccessfulAuthentication.tsx
index 70867e243ad..bbfe97ff684 100644
--- a/ts/components/IdpSuccessfulAuthentication.tsx
+++ b/ts/components/IdpSuccessfulAuthentication.tsx
@@ -1,29 +1,37 @@
-/**
- * A component to display a white tick on a blue background
- */
-import * as React from "react";
-import { View, StatusBar, StyleSheet } from "react-native";
+import { useEffect } from "react";
+import { AccessibilityInfo } from "react-native";
+import { profileNameSelector } from "../store/reducers/profile";
+import I18n from "../i18n";
+import { useOnFirstRender } from "../utils/hooks/useOnFirstRender";
+import { trackIdpAuthenticationSuccessScreen } from "../screens/profile/analytics";
+import { useIOSelector } from "../store/hooks";
+import { loggedInIdpSelector } from "../store/reducers/authentication";
+import { OperationResultScreenContent } from "./screens/OperationResultScreenContent";
-import { IOIconSizeScale, Icon } from "@pagopa/io-app-design-system";
-import variables from "../theme/variables";
-
-const styles = StyleSheet.create({
- container: {
- backgroundColor: variables.brandPrimary,
- flex: 1,
- alignItems: "center",
- justifyContent: "center"
- }
-});
-
-const ICON_SIZE: IOIconSizeScale = 96;
-
-export const IdpSuccessfulAuthentication = () => (
-
-
-
-
-);
+export const IdpSuccessfulAuthentication = () => {
+ const idp = useIOSelector(loggedInIdpSelector);
+ useOnFirstRender(() => {
+ trackIdpAuthenticationSuccessScreen(idp?.id);
+ });
+ const name = useIOSelector(profileNameSelector);
+ // If the name is undefined, we set it to an empty string to avoid
+ // the pictogram shift up when the name is available.
+ const contentTitle = name
+ ? I18n.t("authentication.idp_login_success.contentTitle", {
+ name
+ })
+ : " ";
+ // Announce the screen content when the name is available.
+ // Prefer an announce intead of setting the focus to the title
+ // because the screen is visible just for a short time.
+ useEffect(() => {
+ if (name) {
+ AccessibilityInfo.announceForAccessibility(contentTitle);
+ }
+ }, [contentTitle, name]);
+ return OperationResultScreenContent({
+ pictogram: "success",
+ title: contentTitle,
+ testID: "idp-successful-authentication"
+ });
+};
diff --git a/ts/components/IdpsGrid.tsx b/ts/components/IdpsGrid.tsx
index ee128423c19..2b8ce57c830 100644
--- a/ts/components/IdpsGrid.tsx
+++ b/ts/components/IdpsGrid.tsx
@@ -27,8 +27,12 @@ type OwnProps = {
columnWrapperStyle?: StyleProp;
contentContainerStyle?: StyleProp;
headerComponentStyle?: StyleProp;
- headerComponent?: React.ReactNode;
- footerComponent?: React.ReactNode;
+ headerComponent?: React.ComponentProps<
+ typeof FlatList
+ >["ListHeaderComponent"];
+ footerComponent?: React.ComponentProps<
+ typeof FlatList
+ >["ListFooterComponent"];
// Array of Identity Provider to show in the grid.
idps: ReadonlyArray;
// A callback function called when an Identity Provider is selected
diff --git a/ts/components/IdpsGridRevamp.tsx b/ts/components/IdpsGridRevamp.tsx
index 22ef9ce32ac..8107b88a3d2 100644
--- a/ts/components/IdpsGridRevamp.tsx
+++ b/ts/components/IdpsGridRevamp.tsx
@@ -25,9 +25,13 @@ import { LocalIdpsFallback } from "../utils/idps";
type OwnProps = {
contentContainerStyle?: StyleProp;
- footerComponent?: React.ReactNode;
+ footerComponent?: React.ComponentProps<
+ typeof FlatList
+ >["ListFooterComponent"];
headerComponentStyle?: StyleProp;
- headerComponent?: React.ReactNode;
+ headerComponent?: React.ComponentProps<
+ typeof FlatList
+ >["ListHeaderComponent"];
// Array of Identity Provider to show in the grid.
idps: ReadonlyArray;
// A callback function called when an Identity Provider is selected
diff --git a/ts/components/LandingCardComponent.tsx b/ts/components/LandingCardComponent.tsx
index e652067bfa3..19f22956374 100644
--- a/ts/components/LandingCardComponent.tsx
+++ b/ts/components/LandingCardComponent.tsx
@@ -3,58 +3,69 @@
*/
import * as React from "react";
-import { View, Dimensions, Image, ScrollView, StyleSheet } from "react-native";
-import { Col, Grid } from "react-native-easy-grid";
-import { VSpacer } from "@pagopa/io-app-design-system";
-import { Body } from "./core/typography/Body";
-import { H2 } from "./core/typography/H2";
+import { View, ScrollView, useWindowDimensions } from "react-native";
+import {
+ Body,
+ H3,
+ IOPictograms,
+ IOStyles,
+ Pictogram,
+ VSpacer
+} from "@pagopa/io-app-design-system";
type Props = {
id: number;
- image: NodeRequire;
+ pictogramName: IOPictograms;
title: string;
content: string;
accessibilityLabel?: string;
accessibilityHint?: string;
};
-const screenWidth = Dimensions.get("screen").width;
+const VERTICAL_SPACING = 16;
-const styles = StyleSheet.create({
- card: {
- width: screenWidth,
- alignItems: "center",
- alignContent: "flex-start"
- },
- image: {
- width: screenWidth / 2,
- height: screenWidth / 2,
- resizeMode: "contain"
- }
-});
+export const LandingCardComponent = React.forwardRef(
+ (props, ref) => {
+ const screenDimension = useWindowDimensions();
+ const screenWidth = screenDimension.width;
+ const {
+ accessibilityLabel,
+ accessibilityHint,
+ pictogramName,
+ title,
+ content
+ } = props;
-export const LandingCardComponent: React.SFC = card => (
-
-
-
-
-
-
-
-
- {card.title}
-
-
- {card.content}
-
-
-
-
-
-
+ return (
+
+
+
+
+
+ {title}
+
+
+
+ {content}
+
+
+
+
+ );
+ }
);
diff --git a/ts/components/LoadingSpinnerOverlay.tsx b/ts/components/LoadingSpinnerOverlay.tsx
index 22271727f72..962fc81f4e0 100644
--- a/ts/components/LoadingSpinnerOverlay.tsx
+++ b/ts/components/LoadingSpinnerOverlay.tsx
@@ -6,9 +6,6 @@ import {
hexToRgba
} from "@pagopa/io-app-design-system";
import I18n from "../i18n";
-import { useIOSelector } from "../store/hooks";
-import { isDesignSystemEnabledSelector } from "../store/reducers/persistedPreferences";
-import ButtonDefaultOpacity from "./ButtonDefaultOpacity";
import { Overlay } from "./ui/Overlay";
import { IOStyles } from "./core/variables/IOStyles";
import { Body } from "./core/typography/Body";
@@ -37,50 +34,37 @@ const LoadingSpinnerOverlay = ({
loadingCaption,
loadingOpacity = 0.7,
onCancel
-}: Props) => {
- const isDesignSystemEnabled = useIOSelector(isDesignSystemEnabledSelector);
- return (
-
-
- {loadingCaption || I18n.t("global.remoteStates.wait")}
-
+}: Props) => (
+
+
+ {loadingCaption || I18n.t("global.remoteStates.wait")}
+
+
+ }
+ action={
+ onCancel && (
+
+
- }
- action={
- onCancel && (
-
- {isDesignSystemEnabled ? (
-
- ) : (
-
- {I18n.t("global.buttons.cancel")}
-
- )}
-
- )
- }
- />
- )
- }
- >
- {children}
-
- );
-};
+ )
+ }
+ />
+ )
+ }
+ >
+ {children}
+
+);
export default LoadingSpinnerOverlay;
diff --git a/ts/components/NavBarLabel.tsx b/ts/components/NavBarLabel.tsx
deleted file mode 100644
index dc2f5c3be78..00000000000
--- a/ts/components/NavBarLabel.tsx
+++ /dev/null
@@ -1,129 +0,0 @@
-import { pipe } from "fp-ts/lib/function";
-import * as O from "fp-ts/lib/Option";
-import * as React from "react";
-import { Platform, StyleSheet, Text } from "react-native";
-import { connect } from "react-redux";
-import { Locales, TranslationKeys } from "../../locales/locales";
-import I18n from "../i18n";
-import ROUTES from "../navigation/routes";
-import { messagesUnreadAndUnarchivedSelector } from "../features/messages/store/reducers/messagesStatus";
-import { preferredLanguageSelector } from "../store/reducers/persistedPreferences";
-import { GlobalState } from "../store/reducers/types";
-import { makeFontStyleObject } from "../theme/fonts";
-import { MESSAGES_ROUTES } from "../features/messages/navigation/routes";
-
-type Routes = keyof typeof ROUTES | keyof typeof MESSAGES_ROUTES;
-
-type OwnProps = {
- options: {
- tintColor: string | null;
- focused: boolean;
- };
- routeName: string;
-};
-
-type Props = OwnProps & ReturnType;
-
-type RouteLabelMap = { [key in Routes]?: TranslationKeys };
-const ROUTE_LABEL: RouteLabelMap = {
- MESSAGES_NAVIGATOR: "global.navigator.messages",
- WALLET_HOME: "global.navigator.wallet",
- SERVICES_NAVIGATOR: "global.navigator.services",
- PROFILE_NAVIGATOR: "global.navigator.profile"
-};
-const fallbackLabel = "unknown"; // fallback label
-
-const routeOrder = new Map([
- ["MESSAGES_NAVIGATOR", 1],
- ["WALLET_HOME", 2],
- ["SERVICES_NAVIGATOR", 3],
- ["PROFILE_NAVIGATOR", 4]
-]);
-
-const getLabel = (routeName: string, locale: Locales): string =>
- // "routeName as Routes" is assumed to be safe as explained @https://github.com/pagopa/io-app/pull/193#discussion_r192347234
- // adding fallback anyway -- better safe than sorry
- pipe(
- ROUTE_LABEL[routeName as Routes],
- O.fromNullable,
- O.fold(
- () => fallbackLabel,
- l => I18n.t(l, { locale })
- )
- );
-const styles = StyleSheet.create({
- labelStyle: {
- ...makeFontStyleObject(Platform.select),
- textAlign: "center"
- }
-});
-
-const computeAccessibilityLabel = (
- section: string,
- order: number,
- unread?: number
-) =>
- typeof unread === "undefined"
- ? I18n.t("navigation.accessibility", {
- section,
- order
- })
- : I18n.t("navigation.accessibilityWithBadge", {
- section,
- order,
- unread
- });
-
-/**
- * This Component is used to Render the Labels of the bottom navbar of the app
- * translated in the preferred locale if it was selected
- * @param props
- */
-const NavBarLabel: React.FunctionComponent = (props: Props) => {
- const { options, routeName, preferredLanguage, messagesUnread } = props;
- const locale: Locales = pipe(
- preferredLanguage,
- O.fold(
- () => I18n.locale,
- l => l
- )
- );
- const label = getLabel(routeName, locale);
- const maybeOrder = O.fromNullable(routeOrder.get(routeName as Routes));
- const isSelected = options.focused
- ? `${I18n.t("navigation.selected")}, `
- : "";
-
- const unreadMessagesMap: Record = {
- [MESSAGES_ROUTES.MESSAGES_NAVIGATOR]: messagesUnread.length
- };
-
- const computedUnreadMessages = unreadMessagesMap[routeName] || undefined;
-
- const panelAccessibilityLabel = computeAccessibilityLabel(
- label,
- O.getOrElse(() => 0)(maybeOrder),
- computedUnreadMessages
- );
-
- return (
-
- {label}
-
- );
-};
-
-const mapStateToProps = (state: GlobalState) => ({
- preferredLanguage: preferredLanguageSelector(state),
- messagesUnread: messagesUnreadAndUnarchivedSelector(state)
-});
-
-export default connect(mapStateToProps)(NavBarLabel);
diff --git a/ts/components/NewRemindEmailValidationOverlay.tsx b/ts/components/NewRemindEmailValidationOverlay.tsx
deleted file mode 100644
index 504a705386b..00000000000
--- a/ts/components/NewRemindEmailValidationOverlay.tsx
+++ /dev/null
@@ -1,279 +0,0 @@
-/**
- * A component to remind the user to validate his email
- */
-import { Millisecond } from "@pagopa/ts-commons/lib/units";
-import { pipe } from "fp-ts/lib/function";
-import * as pot from "@pagopa/ts-commons/lib/pot";
-import * as O from "fp-ts/lib/Option";
-import { Content } from "native-base";
-import * as React from "react";
-import { useCallback, useEffect, useRef, useState } from "react";
-import { View, SafeAreaView } from "react-native";
-import {
- LabelLink,
- IOPictogramSizeScale,
- Label,
- Pictogram,
- VSpacer
-} from "@pagopa/io-app-design-system";
-import I18n from "../i18n";
-
-import {
- acknowledgeOnEmailValidation,
- profileLoadRequest,
- setEmailCheckAtStartupFailure,
- startEmailValidation
-} from "../store/actions/profile";
-import {
- isProfileEmailValidatedSelector,
- isProfileFirstOnBoardingSelector,
- profileEmailSelector
-} from "../store/reducers/profile";
-import { useIODispatch, useIOSelector } from "../store/hooks";
-import { emailValidationSelector } from "../store/reducers/emailValidation";
-import { emailAcknowledged } from "../store/actions/onboarding";
-import NavigationService from "../navigation/NavigationService";
-import ROUTES from "../navigation/routes";
-import { getFlowType } from "../utils/analytics";
-import {
- trackEmailValidation,
- trackEmailValidationSuccess,
- trackEmailValidationSuccessConfirmed
-} from "../screens/analytics/emailAnalytics";
-import { IOStyles } from "./core/variables/IOStyles";
-import FooterWithButtons from "./ui/FooterWithButtons";
-import { IOToast } from "./Toast";
-import { LightModalContextInterface } from "./ui/LightModal";
-import { withLightModalContext } from "./helpers/withLightModalContext";
-import BaseScreenComponent from "./screens/BaseScreenComponent";
-
-const emailSentTimeout = 10000 as Millisecond; // 10 seconds
-const profilePolling = 5000 as Millisecond; // 5 seconds
-
-const EMPTY_EMAIL = "";
-const VALIDATION_ILLUSTRATION_WIDTH: IOPictogramSizeScale = 80;
-
-type OwnProp = {
- isOnboarding?: boolean;
-};
-
-type Props = LightModalContextInterface & OwnProp;
-
-const NewRemindEmailValidationOverlay = (props: Props) => {
- const { isOnboarding, hideModal } = props;
- const dispatch = useIODispatch();
- const optionEmail = useIOSelector(profileEmailSelector);
- const isEmailValidated = useIOSelector(isProfileEmailValidatedSelector);
- const emailValidation = useIOSelector(emailValidationSelector);
-
- const isFirstOnBoarding = useIOSelector(isProfileFirstOnBoardingSelector);
- const flow = getFlowType(!!isOnboarding, isFirstOnBoarding);
-
- const [isValidateEmailButtonDisabled, setIsValidateEmailButtonDisabled] =
- useState(false);
- const timeout = useRef();
- const polling = useRef();
-
- const email = pipe(
- optionEmail,
- O.getOrElse(() => EMPTY_EMAIL)
- );
-
- const sendEmailValidation = useCallback(
- () => dispatch(startEmailValidation.request()),
- [dispatch]
- );
-
- const acknowledgeEmail = useCallback(
- () => dispatch(emailAcknowledged()),
- [dispatch]
- );
-
- const reloadProfile = useCallback(
- () => dispatch(profileLoadRequest()),
- [dispatch]
- );
-
- const dispatchAcknowledgeOnEmailValidation = useCallback(
- (maybeAcknowledged: O.Option) =>
- dispatch(acknowledgeOnEmailValidation(maybeAcknowledged)),
- [dispatch]
- );
-
- // function to localize the title of the button. If the email is validated and if it is not, whether the confirmation email was sent or not
- const buttonTitle = () => {
- if (isEmailValidated) {
- return I18n.t("global.buttons.continue");
- } else {
- if (isValidateEmailButtonDisabled) {
- return I18n.t("email.newvalidate.buttonlabelsent");
- } else {
- return I18n.t("email.newvalidate.buttonlabelsentagain");
- }
- }
- };
-
- // this function contol if the button is disabled. It is disabled if the email is sent and the timeout is active
- const isButtonDisabled = () => {
- if (isEmailValidated) {
- return false;
- } else {
- return isValidateEmailButtonDisabled;
- }
- };
-
- const handleSendEmailValidationButton = () => {
- if (isEmailValidated) {
- trackEmailValidationSuccessConfirmed(flow);
- hideModal();
- if (isOnboarding) {
- // if the user is in the onboarding flow and the email il correctly validated,
- // the email validation flow is finished
- acknowledgeEmail();
- } else {
- if (
- O.isSome(emailValidation.emailCheckAtStartupFailed) &&
- emailValidation.emailCheckAtStartupFailed.value
- ) {
- acknowledgeEmail();
- dispatchAcknowledgeOnEmailValidation(O.none);
- dispatch(setEmailCheckAtStartupFailure(O.none));
- } else {
- NavigationService.navigate(ROUTES.PROFILE_NAVIGATOR, {
- screen: ROUTES.PROFILE_DATA
- });
- }
- }
- } else {
- // send email validation only if it exists
- pipe(
- optionEmail,
- O.map(_ => {
- sendEmailValidation();
- })
- );
- }
- };
-
- const navigateToInsertEmail = () => {
- dispatchAcknowledgeOnEmailValidation(O.none);
- hideModal();
- };
-
- const renderFooter = () => (
-
- );
-
- useEffect(() => {
- // use polling to get the profile info, to check if the email is valid or not
- // eslint-disable-next-line functional/immutable-data
- polling.current = setInterval(() => reloadProfile(), profilePolling);
- return () => {
- hideModal();
- clearTimeout(timeout.current);
- clearInterval(polling.current);
- };
- }, [hideModal, reloadProfile]);
-
- useEffect(() => {
- // send validation email KO
- if (pot.isError(emailValidation.sendEmailValidationRequest)) {
- IOToast.error(I18n.t("global.actions.retry"));
- // send validation email OK
- } else if (pot.isSome(emailValidation.sendEmailValidationRequest)) {
- IOToast.show(I18n.t("email.newvalidate.toast"));
- setIsValidateEmailButtonDisabled(true);
- // eslint-disable-next-line functional/immutable-data
- timeout.current = setTimeout(() => {
- setIsValidateEmailButtonDisabled(false);
- }, emailSentTimeout);
- }
- }, [emailValidation.sendEmailValidationRequest]);
-
- useEffect(() => {
- if (isEmailValidated) {
- clearInterval(polling.current);
- trackEmailValidationSuccess(flow);
- } else {
- trackEmailValidation(flow);
- }
- }, [flow, isEmailValidated]);
-
- return (
-
-
-
-
-
-
-
-
-
-
-
- {I18n.t(
- isEmailValidated
- ? "email.newvalidemail.title"
- : "email.newvalidate.title"
- )}
-
-
-
-
-
- {I18n.t(
- isEmailValidated
- ? "email.newvalidemail.subtitle"
- : "email.newvalidate.subtitle"
- )}
-
-
- {email}.
-
-
- {!isEmailValidated && (
-
-
-
- {I18n.t("email.newvalidate.link")}
-
-
-
- )}
-
- {renderFooter()}
-
-
- );
-};
-export default withLightModalContext(NewRemindEmailValidationOverlay);
diff --git a/ts/components/Pinpad/KeyPad.tsx b/ts/components/Pinpad/KeyPad.tsx
deleted file mode 100644
index db786793eab..00000000000
--- a/ts/components/Pinpad/KeyPad.tsx
+++ /dev/null
@@ -1,175 +0,0 @@
-import { ITuple2 } from "@pagopa/ts-commons/lib/tuples";
-import * as E from "fp-ts/lib/Either";
-import { pipe } from "fp-ts/lib/function";
-import { Col, Grid, Row, Text as NBButtonText } from "native-base";
-import * as React from "react";
-import { Platform, StyleSheet, View } from "react-native";
-import {
- IOColors,
- IOIconSizeScale,
- IOIcons,
- Icon,
- hexToRgba
-} from "@pagopa/io-app-design-system";
-import { makeFontStyleObject } from "../../theme/fonts";
-import ButtonDefaultOpacity from "../ButtonDefaultOpacity";
-
-// left -> the string to represent as text
-// right -> the icon to represent with name and size
-export type DigitRpr = E.Either<
- string,
- { name: IOIcons; size: IOIconSizeScale; accessibilityLabel: string }
->;
-type Digit = ITuple2 void> | undefined;
-
-type Props = Readonly<{
- digits: ReadonlyArray>;
- buttonType: "primary" | "light";
- isDisabled: boolean;
-}>;
-
-// it generate buttons width of 56
-const radius = 18;
-const BUTTON_DIAMETER = 56;
-const opaqueButtonBackground = hexToRgba(IOColors.black, 0.1);
-
-const styles = StyleSheet.create({
- roundButton: {
- paddingTop: 0,
- paddingBottom: 0,
- paddingRight: 0,
- paddingLeft: 0,
- marginBottom: 16,
- alignSelf: "center",
- justifyContent: "center",
- width: BUTTON_DIAMETER,
- height: BUTTON_DIAMETER,
- borderRadius: BUTTON_DIAMETER / 2,
- backgroundColor: opaqueButtonBackground
- },
- transparent: {
- backgroundColor: `transparent`
- },
- buttonTextBase: {
- ...makeFontStyleObject(Platform.select, "300"),
- fontSize: 30,
- lineHeight: 32,
- marginBottom: -10
- },
- buttonTextLabel: {
- fontSize: radius - 5
- },
- noPadded: {
- paddingRight: 0
- }
-});
-
-const renderPinCol = (
- label: DigitRpr,
- handler: () => void,
- style: "digit" | "label",
- key: string,
- buttonType: "primary" | "light",
- isDisabled: boolean
-) => {
- const buttonStyle =
- style === "digit"
- ? styles.roundButton
- : style === "label"
- ? [styles.roundButton, styles.transparent]
- : undefined;
-
- const accessibilityLabel = pipe(
- label,
- E.fold(
- () => undefined,
- ic => ic.accessibilityLabel
- )
- );
-
- return (
-
-
- {pipe(
- label,
- E.fold(
- l => (
-
- {l}
-
- ),
- ic => (
-
-
-
- )
- )
- )}
-
-
- );
-};
-
-const renderPinRow = (
- digits: ReadonlyArray,
- key: string,
- buttonType: "primary" | "light",
- isDisabled: boolean
-) => (
-
- {digits.map((el, i) =>
- el ? (
- renderPinCol(
- el.e1,
- el.e2,
- E.isLeft(el.e1) ? "digit" : "label",
- `pinpad-digit-${i}`,
- buttonType,
- isDisabled
- )
- ) : (
-
- )
- )}
-
-);
-
-/**
- * Renders a virtual key pad.
- *
- * This component is used for typing PINs
- */
-export class KeyPad extends React.PureComponent {
- public render() {
- return (
-
- {this.props.digits.map((r, i) =>
- renderPinRow(
- r,
- `pinpad-row-${i}`,
- this.props.buttonType,
- this.props.isDisabled
- )
- )}
-
- );
- }
-}
diff --git a/ts/components/Pinpad/index.tsx b/ts/components/Pinpad/index.tsx
deleted file mode 100644
index 0051496c9cc..00000000000
--- a/ts/components/Pinpad/index.tsx
+++ /dev/null
@@ -1,385 +0,0 @@
-import { Tuple2 } from "@pagopa/ts-commons/lib/tuples";
-import { Millisecond } from "@pagopa/ts-commons/lib/units";
-import * as E from "fp-ts/lib/Either";
-import * as NAR from "fp-ts/lib/NonEmptyArray";
-import { debounce, shuffle } from "lodash";
-import * as React from "react";
-import { Alert, StyleSheet, View } from "react-native";
-import { VSpacer } from "@pagopa/io-app-design-system";
-import I18n from "../../i18n";
-import { PinString } from "../../types/PinString";
-import { ComponentProps } from "../../types/react";
-import { BiometricsValidType } from "../../utils/biometrics";
-import { PIN_LENGTH, PIN_LENGTH_SIX } from "../../utils/constants";
-import { ShakeAnimation } from "../animations/ShakeAnimation";
-import { Body } from "../core/typography/Body";
-import { Link } from "../core/typography/Link";
-import { IOStyles } from "../core/variables/IOStyles";
-import { isDevEnv } from "../../utils/environment";
-import { defaultPin } from "../../config";
-import InputPlaceHolder from "./InputPlaceholder";
-import { DigitRpr, KeyPad } from "./KeyPad";
-
-interface Props {
- activeColor: string;
- delayOnFailureMillis?: number;
- clearOnInvalid?: boolean;
- shufflePad?: boolean;
- isFingerprintEnabled?: any;
- isValidatingTask?: boolean;
- biometryType?: any;
- compareWithCode?: string;
- inactiveColor: string;
- disabled?: boolean;
- buttonType: ComponentProps["buttonType"];
- onFulfill: (code: PinString, isValid: boolean) => void;
- onCancel?: () => void;
- onPinResetHandler?: () => void;
- onFingerPrintReq?: () => void;
- onDeleteLastDigit?: () => void;
- remainingAttempts?: number;
-}
-
-interface State {
- value: string;
- isDisabled: boolean;
- pinLength: number;
- pinPadValues: ReadonlyArray;
-}
-
-const styles = StyleSheet.create({
- mediumText: {
- fontSize: 18,
- lineHeight: 21,
- textAlign: "center"
- }
-});
-
-const CANCEL_ICON_WIDTH = 24;
-const ICON_WIDTH = 48;
-const SHAKE_ANIMATION_DURATION = 600 as Millisecond;
-const INPUT_MARGIN = 36;
-
-/**
- * A customized CodeInput component.
- */
-class Pinpad extends React.PureComponent {
- private onFulfillTimeoutId?: number;
- private onDelayOnFailureTimeoutId?: number;
- private shakeAnimationRef = React.createRef();
-
- /**
- * Get the name of the icon (from icon font) to represent depending on
- * the available biometry functionality available on the device
- */
- private getBiometryIconName(
- biometryPrintableSimpleType: BiometricsValidType
- ): DigitRpr {
- switch (biometryPrintableSimpleType) {
- case "BIOMETRICS":
- case "TOUCH_ID":
- return E.right({
- name: "biomFingerprint",
- size: ICON_WIDTH,
- accessibilityLabel: I18n.t(
- "identification.unlockCode.accessibility.fingerprint"
- )
- });
- case "FACE_ID":
- return E.right({
- name: "biomFaceID",
- size: ICON_WIDTH,
- accessibilityLabel: I18n.t(
- "identification.unlockCode.accessibility.faceId"
- )
- });
- }
- }
-
- private deleteLastDigit = () => {
- this.setState(prev => ({
- value:
- prev.value.length > 0
- ? prev.value.slice(0, prev.value.length - 1)
- : prev.value
- }));
- if (this.props.onDeleteLastDigit) {
- this.props.onDeleteLastDigit();
- }
- };
-
- /**
- * The pad can be composed by
- * - strings
- * - chars
- * - icons (from icon font): they has to be declared as 'icon:' (width 48) or 'sicon:' (width 17)
- */
- private pinPadDigits = (): ComponentProps["digits"] => {
- const { pinPadValues } = this.state;
-
- return [
- [
- Tuple2(E.left(pinPadValues[1]), () =>
- this.handlePinDigit(pinPadValues[1])
- ),
- Tuple2(E.left(pinPadValues[2]), () =>
- this.handlePinDigit(pinPadValues[2])
- ),
- Tuple2(E.left(pinPadValues[3]), () =>
- this.handlePinDigit(pinPadValues[3])
- )
- ],
- [
- Tuple2(E.left(pinPadValues[4]), () =>
- this.handlePinDigit(pinPadValues[4])
- ),
- Tuple2(E.left(pinPadValues[5]), () =>
- this.handlePinDigit(pinPadValues[5])
- ),
- Tuple2(E.left(pinPadValues[6]), () =>
- this.handlePinDigit(pinPadValues[6])
- )
- ],
- [
- Tuple2(E.left(pinPadValues[7]), () =>
- this.handlePinDigit(pinPadValues[7])
- ),
- Tuple2(E.left(pinPadValues[8]), () =>
- this.handlePinDigit(pinPadValues[8])
- ),
- Tuple2(E.left(pinPadValues[9]), () =>
- this.handlePinDigit(pinPadValues[9])
- )
- ],
- [
- this.props.isFingerprintEnabled &&
- this.props.biometryType &&
- this.props.onFingerPrintReq
- ? Tuple2(
- this.getBiometryIconName(this.props.biometryType),
- this.props.onFingerPrintReq
- )
- : undefined,
- Tuple2(E.left(pinPadValues[0]), () =>
- this.handlePinDigit(pinPadValues[0])
- ),
- Tuple2(
- E.right({
- name: "cancel",
- size: CANCEL_ICON_WIDTH,
- accessibilityLabel: I18n.t(
- "identification.unlockCode.accessibility.delete"
- )
- }),
- this.deleteLastDigit
- )
- ]
- ];
- };
-
- private confirmResetAlert = () =>
- Alert.alert(
- I18n.t("identification.forgetCode.confirmTitle"),
- I18n.t(
- this.props.isValidatingTask
- ? "identification.forgetCode.confirmMsgWithTask"
- : "identification.forgetCode.confirmMsg"
- ),
- [
- {
- text: I18n.t("global.buttons.confirm"),
- style: "default",
- onPress: this.props.onPinResetHandler
- },
- {
- text: I18n.t("global.buttons.cancel"),
- style: "cancel"
- }
- ],
- { cancelable: false }
- );
-
- constructor(props: Props) {
- super(props);
- this.state = {
- value: "",
- isDisabled: false,
- pinLength: PIN_LENGTH,
- pinPadValues: NAR.range(0, 9).map(s => s.toString())
- };
- }
-
- public componentDidMount() {
- const { pinPadValues } = this.state;
-
- const pinLength =
- this.props.compareWithCode !== undefined
- ? this.props.compareWithCode.length
- : PIN_LENGTH_SIX;
-
- // we avoid to shuffle pin/code pad in dev env
- const newPinPadValue =
- this.props.shufflePad !== true ? pinPadValues : shuffle(pinPadValues);
-
- this.setState({
- pinLength,
- pinPadValues: newPinPadValue
- });
- }
-
- public componentWillUnmount() {
- if (this.onFulfillTimeoutId) {
- clearTimeout(this.onFulfillTimeoutId);
- } else if (this.onDelayOnFailureTimeoutId) {
- clearTimeout(this.onDelayOnFailureTimeoutId);
- }
- }
-
- private handleChangeText = (inputValue: string) => {
- // if the component is disabled don't handle any input
- if (this.props.disabled) {
- return;
- }
- this.setState({ value: inputValue });
-
- // Pin/code is fulfilled
- if (inputValue.length === this.state.pinLength) {
- const isValid = inputValue === this.props.compareWithCode;
-
- if (!isValid && this.props.clearOnInvalid) {
- this.debounceClear();
- if (this.props.delayOnFailureMillis) {
- // disable click keypad
- this.setState({
- isDisabled: true
- });
-
- // re-enable after delayOnFailureMillis milliseconds
- // eslint-disable-next-line
- this.onDelayOnFailureTimeoutId = setTimeout(() => {
- this.setState({
- isDisabled: false
- });
- }, this.props.delayOnFailureMillis);
- // start animation 'shake'
- if (this.shakeAnimationRef.current) {
- this.shakeAnimationRef.current.shake();
- }
- }
- }
-
- // Fire the callback asynchronously, otherwise this component
- // will be unmounted before the render of the last bullet placeholder.
- // eslint-disable-next-line
- this.onFulfillTimeoutId = setTimeout(() =>
- this.props.onFulfill(inputValue as PinString, isValid)
- );
- }
- };
-
- enterDefaultPin = () => {
- if (!isDevEnv) {
- return;
- }
- this.handleChangeText(defaultPin);
- };
-
- private handlePinDigit = (digit: string) =>
- this.handleChangeText(
- `${this.state.value}${digit}`.substr(0, this.state.pinLength)
- );
-
- public debounceClear = debounce(() => {
- this.setState({ value: "" });
- }, 100);
-
- public render() {
- return (
-
-
-
- {this.props.onPinResetHandler !== undefined && (
-
-
- {this.props.buttonType === "primary" ? (
-
- {`${I18n.t("identification.unlockCode.reset.button")} `}
-
- {I18n.t("identification.unlockCode.reset.code")}
-
-
- {I18n.t("global.symbols.question")}
-
-
- ) : (
-
- {`${I18n.t("identification.unlockCode.reset.button")} `}
-
- {I18n.t("identification.unlockCode.reset.code")}
-
-
- {I18n.t("global.symbols.question")}
-
-
- )}
-
-
-
- )}
-
-
-
-
-
- {isDevEnv && (
-
-
- this.enterDefaultPin()}
- weight="Bold"
- color="white"
- >
- {"Enter default pin (DevEnv Only)"}
-
-
- )}
- {this.props.onCancel && (
-
-
-
- {I18n.t("global.buttons.cancel")}
-
-
- )}
-
- );
- }
-}
-
-export default Pinpad;
diff --git a/ts/components/RemindEmailValidationOverlay.tsx b/ts/components/RemindEmailValidationOverlay.tsx
index 1adf590058d..7ae72d791e7 100644
--- a/ts/components/RemindEmailValidationOverlay.tsx
+++ b/ts/components/RemindEmailValidationOverlay.tsx
@@ -58,7 +58,7 @@ import TouchableDefaultOpacity from "./TouchableDefaultOpacity";
import BlockButtons from "./ui/BlockButtons";
import FooterWithButtons from "./ui/FooterWithButtons";
import { LightModalContextInterface } from "./ui/LightModal";
-import Markdown from "./ui/Markdown";
+import LegacyMarkdown from "./ui/Markdown/LegacyMarkdown";
type OwnProp = {
isOnboarding?: boolean;
@@ -330,11 +330,13 @@ class RemindEmailValidationOverlay extends React.PureComponent {
onPress: () => {
if (this.props.isOnboarding) {
NavigationService.navigate(ROUTES.ONBOARDING, {
- screen: ROUTES.ONBOARDING_INSERT_EMAIL_SCREEN
+ screen: ROUTES.ONBOARDING_INSERT_EMAIL_SCREEN,
+ params: { isOnboarding: true }
});
} else {
NavigationService.navigate(ROUTES.PROFILE_NAVIGATOR, {
- screen: ROUTES.INSERT_EMAIL_SCREEN
+ screen: ROUTES.INSERT_EMAIL_SCREEN,
+ params: { isOnboarding: false }
});
}
},
@@ -391,14 +393,14 @@ class RemindEmailValidationOverlay extends React.PureComponent {
{title}
{!this.state.emailHasBeenValidate ? (
-
{!this.props.isOnboarding
? I18n.t("email.validate.content2", { email })
: I18n.t("email.validate.content1", { email })}
-
+
) : (
-
+
= {
- neutral: {
- background: "turquoise-150",
- stroke: "turquoise-850"
- },
- error: {
- background: "error-100",
- stroke: "error-850"
- },
- info: {
- background: "info-100",
- stroke: "info-850"
- },
- success: {
- background: "success-100",
- stroke: "success-850"
- },
- warning: {
- background: "warning-100",
- stroke: "warning-850"
- }
-};
-
-type Props = Pick;
-
-const ToastNotification = ({ message, variant = "neutral", icon }: Props) => {
- const colors = toastColorVariants[variant];
-
- return (
-
-
- {message}
-
- {icon && }
-
- );
-};
-
-const styles = StyleSheet.create({
- toast: {
- borderRadius: IOAlertRadius,
- borderWidth: 1,
- padding: 16,
- flexDirection: "row",
- alignItems: "center",
- justifyContent: "space-between"
- },
- content: {
- paddingVertical: 2
- }
-});
-
-export { ToastNotification };
diff --git a/ts/components/Toast/ToastProvider.tsx b/ts/components/Toast/ToastProvider.tsx
deleted file mode 100644
index 2c96f6bad63..00000000000
--- a/ts/components/Toast/ToastProvider.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-import { throttle } from "lodash";
-import React from "react";
-import { SafeAreaView, StyleSheet, View } from "react-native";
-import ReactNativeHapticFeedback from "react-native-haptic-feedback";
-import Animated, {
- Easing,
- SequencedTransition,
- SlideInUp,
- SlideOutUp
-} from "react-native-reanimated";
-import { Dismissable } from "../ui/Dismissable";
-import { ToastNotification } from "./ToastNotification";
-import { Toast } from "./types";
-import { IOToastRef, useIOToast } from "./useIOToast";
-import { ToastContext } from "./context";
-
-/**
- * The maximum number of toasts that can be displayed at the same time
- * If the number of the toasts exceeds this number, the oldest one will be removed
- */
-export const MAX_TOAST_STACK_SIZE = 3;
-
-/**
- * The time in milliseconds that a toast notification will be displayed
- */
-export const TOAST_DURATION_TIME = 5000;
-
-/**
- * This is the time in milliseconds between two toast notifications.
- * This will throttle the toast notifications to avoid displaying too many of them at the same time
- * and causing visual glitches.
- */
-export const TOAST_THROTTLE_TIME = 500;
-
-type ToastNotificationStackItem = Toast & { id: number };
-type ToastNotificationStackItemProps = ToastNotificationStackItem &
- Pick;
-
-/**
- * A toast notification item that can be swiped to the right to dismiss it, with enter and exit animations
- */
-const ToastNotificationStackItem = ({
- onDismiss,
- ...toast
-}: ToastNotificationStackItemProps) => (
-
-
-
-
-
-);
-
-type ToastProviderProps = {
- children: React.ReactNode;
-};
-
-export const ToastProvider = ({ children }: ToastProviderProps) => {
- const toastId = React.useRef(1);
- const [toasts, setToasts] = React.useState<
- ReadonlyArray
- >([]);
-
- const addToast = React.useCallback((toast: Toast): number => {
- // eslint-disable-next-line functional/immutable-data
- const id = toastId.current++;
- setToasts(prevToasts => [{ id, ...toast }, ...prevToasts]);
-
- setTimeout(() => {
- setToasts(prevToasts => prevToasts.filter(t => t.id !== id));
- }, TOAST_DURATION_TIME);
-
- if (toast.hapticFeedback) {
- ReactNativeHapticFeedback.trigger(toast.hapticFeedback);
- }
-
- return id;
- }, []);
-
- const removeToast = React.useCallback((id: number) => {
- setToasts(prevToasts => prevToasts.filter(t => t.id !== id));
- }, []);
-
- const removeToastAtIndex = (index: number) => {
- setToasts(prevToasts => [
- ...prevToasts.slice(0, index),
- ...prevToasts.slice(index + 1)
- ]);
- };
-
- // If stack size exceed the maximum, remove the oldest toast
- React.useEffect(() => {
- if (toasts.length > MAX_TOAST_STACK_SIZE) {
- removeToastAtIndex(MAX_TOAST_STACK_SIZE);
- }
- }, [toasts]);
-
- const removeAllToasts = React.useCallback(() => {
- setToasts([]);
- }, []);
-
- const contextValue = React.useMemo(
- () => ({
- addToast: throttle(addToast, TOAST_THROTTLE_TIME),
- removeToast: throttle(removeToast, TOAST_THROTTLE_TIME),
- removeAllToasts
- }),
- [addToast, removeToast, removeAllToasts]
- );
-
- return (
-
-
-
-
- {toasts.map(toast => (
- removeToast(toast.id)}
- />
- ))}
-
-
- {children}
-
- );
-};
-
-const InitializeToastRef = () => {
- const toast = useIOToast();
- // eslint-disable-next-line functional/immutable-data
- IOToastRef.current = toast;
- return null;
-};
-
-const styles = StyleSheet.create({
- container: {
- zIndex: 1000,
- position: "absolute",
- bottom: 0,
- left: 0,
- right: 0,
- top: 0,
- overflow: "visible"
- },
- list: {
- padding: 24
- }
-});
diff --git a/ts/components/Toast/__tests__/ToastNotification.test.tsx b/ts/components/Toast/__tests__/ToastNotification.test.tsx
deleted file mode 100644
index 1a081a6d50b..00000000000
--- a/ts/components/Toast/__tests__/ToastNotification.test.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { render } from "@testing-library/react-native";
-import React from "react";
-import { ToastNotification } from "../ToastNotification";
-import { Toast } from "../types";
-
-describe("Test ToastNotification component", () => {
- it.each([
- { message: "Hello", icon: "checkTick" },
- { message: "Hello", variant: "error" },
- { message: "Hello", variant: "info" },
- { message: "Hello", variant: "neutral" },
- { message: "Hello", variant: "success" },
- { message: "Hello", variant: "warning" }
- ])("should match snapshot for props (%s)", toast => {
- const component = render( );
- expect(component).toMatchSnapshot();
- });
-});
diff --git a/ts/components/Toast/__tests__/__snapshots__/ToastNotification.test.tsx.snap b/ts/components/Toast/__tests__/__snapshots__/ToastNotification.test.tsx.snap
deleted file mode 100644
index bcd5152bf21..00000000000
--- a/ts/components/Toast/__tests__/__snapshots__/ToastNotification.test.tsx.snap
+++ /dev/null
@@ -1,397 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Test ToastNotification component should match snapshot for props ({ message: 'Hello', icon: 'checkTick' }) 1`] = `
-
-
- Hello
-
-
-
-
-
-
-
-`;
-
-exports[`Test ToastNotification component should match snapshot for props ({ message: 'Hello', variant: 'error' }) 1`] = `
-
-
- Hello
-
-
-`;
-
-exports[`Test ToastNotification component should match snapshot for props ({ message: 'Hello', variant: 'info' }) 1`] = `
-
-
- Hello
-
-
-`;
-
-exports[`Test ToastNotification component should match snapshot for props ({ message: 'Hello', variant: 'neutral' }) 1`] = `
-
-
- Hello
-
-
-`;
-
-exports[`Test ToastNotification component should match snapshot for props ({ message: 'Hello', variant: 'success' }) 1`] = `
-
-
- Hello
-
-
-`;
-
-exports[`Test ToastNotification component should match snapshot for props ({ message: 'Hello', variant: 'warning' }) 1`] = `
-
-
- Hello
-
-
-`;
diff --git a/ts/components/Toast/context.ts b/ts/components/Toast/context.ts
deleted file mode 100644
index 66c24e437f8..00000000000
--- a/ts/components/Toast/context.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { createContext } from "react";
-import { Toast } from "./types";
-
-export type ToastContext = {
- addToast: (props: Toast) => number;
- removeToast: (id: number) => void;
- removeAllToasts: () => void;
-};
-
-export const ToastContext = createContext({
- addToast: () => 0,
- removeToast: () => undefined,
- removeAllToasts: () => undefined
-});
diff --git a/ts/components/Toast/index.ts b/ts/components/Toast/index.ts
deleted file mode 100644
index d1ce3b6d83a..00000000000
--- a/ts/components/Toast/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from "./ToastNotification";
-export * from "./ToastProvider";
-export * from "./useIOToast";
diff --git a/ts/components/Toast/types.ts b/ts/components/Toast/types.ts
deleted file mode 100644
index a66e0dd7be4..00000000000
--- a/ts/components/Toast/types.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { HapticFeedbackTypes } from "react-native-haptic-feedback";
-import { IOIcons } from "@pagopa/io-app-design-system";
-
-export type ToastVariant = "neutral" | "error" | "info" | "success" | "warning";
-
-export type Toast = {
- message: string;
- variant?: ToastVariant;
- icon?: IOIcons;
- hapticFeedback?: keyof typeof HapticFeedbackTypes;
-};
-
-export type ToastOptions = Omit;
diff --git a/ts/components/Toast/useIOToast.ts b/ts/components/Toast/useIOToast.ts
deleted file mode 100644
index 47828d927ef..00000000000
--- a/ts/components/Toast/useIOToast.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import React, { MutableRefObject } from "react";
-import { ToastOptions } from "./types";
-import { ToastContext } from "./context";
-
-export const useIOToast = () => {
- const { addToast, removeToast, removeAllToasts } =
- React.useContext(ToastContext);
-
- const show = React.useCallback(
- (message: string, options?: ToastOptions) => {
- addToast({ message, ...options });
- },
- [addToast]
- );
-
- const error = React.useCallback(
- (message: string) => {
- show(message, {
- variant: "error",
- icon: "errorFilled",
- hapticFeedback: "notificationError"
- });
- },
- [show]
- );
-
- const info = React.useCallback(
- (message: string) => {
- show(message, {
- variant: "info",
- icon: "infoFilled",
- hapticFeedback: "impactMedium"
- });
- },
- [show]
- );
-
- const success = React.useCallback(
- (message: string) => {
- show(message, {
- variant: "success",
- icon: "success",
- hapticFeedback: "notificationSuccess"
- });
- },
- [show]
- );
-
- const warning = React.useCallback(
- (message: string) => {
- show(message, {
- variant: "warning",
- icon: "warningFilled",
- hapticFeedback: "notificationWarning"
- });
- },
- [show]
- );
-
- return React.useMemo(
- () => ({
- show,
- error,
- info,
- success,
- warning,
- hide: removeToast,
- hideAll: removeAllToasts
- }),
- [show, error, info, success, warning, removeToast, removeAllToasts]
- );
-};
-
-export type IOToast = ReturnType;
-
-export const IOToastRef =
- React.createRef() as MutableRefObject;
-
-export const IOToast: IOToast = {
- show: (message: string, options?: ToastOptions) =>
- IOToastRef.current?.show(message, options),
- error: (message: string) => IOToastRef.current?.error(message),
- warning: (message: string) => IOToastRef.current?.warning(message),
- success: (message: string) => IOToastRef.current?.success(message),
- info: (message: string) => IOToastRef.current?.info(message),
- hideAll: () => IOToastRef.current?.hideAll(),
- hide: (id: number) => IOToastRef.current?.hide(id)
-};
diff --git a/ts/components/__tests__/NewRemindEmailValidationOverlay.test.tsx b/ts/components/__tests__/NewRemindEmailValidationOverlay.test.tsx
deleted file mode 100644
index ae771f78bd3..00000000000
--- a/ts/components/__tests__/NewRemindEmailValidationOverlay.test.tsx
+++ /dev/null
@@ -1,106 +0,0 @@
-import * as pot from "@pagopa/ts-commons/lib/pot";
-import configureMockStore from "redux-mock-store";
-import { fireEvent } from "@testing-library/react-native";
-import I18n from "../../i18n";
-
-import NewRemindEmailValidationOverlay from "../NewRemindEmailValidationOverlay";
-import { appReducer } from "../../store/reducers";
-import { applicationChangeState } from "../../store/actions/application";
-import { renderScreenWithNavigationStoreContext } from "../../utils/testWrapper";
-import { ServicesPreferencesModeEnum } from "../../../definitions/backend/ServicesPreferencesMode";
-
-describe("NewRemindEmailValidationOverlay with isEmailValidated as true", () => {
- const globalState = appReducer(undefined, applicationChangeState("active"));
- const mockStore = configureMockStore();
-
- // eslint-disable-next-line functional/no-let
- let finalState: ReturnType;
- beforeAll(() => {
- finalState = mockStore({
- ...globalState,
- profile: pot.some({
- service_preferences_settings: {
- mode: ServicesPreferencesModeEnum.AUTO
- },
- is_email_validated: true,
- email: "prova.prova@prova.com"
- })
- });
- });
-
- it("the components into the page should be render correctly", async () => {
- const component = renderComponent(finalState);
- expect(component).toBeDefined();
- expect(component.getByTestId("container-test")).not.toBeNull();
- expect(component.getByTestId("title-test")).toBeDefined();
- expect(
- component.getByText(I18n.t("email.newvalidemail.title"))
- ).toBeTruthy();
- expect(
- component.getByText(I18n.t("email.newvalidemail.subtitle"))
- ).toBeTruthy();
- const button = component.getByTestId("button-test");
- expect(button).toBeDefined();
- expect(component.getByText(I18n.t("global.buttons.continue"))).toBeTruthy();
- expect(button).not.toBeDisabled();
- if (button) {
- fireEvent.press(button);
- }
- });
-});
-
-describe("NewRemindEmailValidationOverlay with isEmailValidated as false", () => {
- const globalState = appReducer(undefined, applicationChangeState("active"));
- const mockStore = configureMockStore();
-
- // eslint-disable-next-line functional/no-let
- let finalState: ReturnType;
-
- beforeAll(() => {
- finalState = mockStore({
- ...globalState,
- profile: pot.some({
- service_preferences_settings: {
- mode: ServicesPreferencesModeEnum.AUTO
- },
- is_email_validated: false,
- email: "prova.prova@prova.com"
- })
- });
- });
-
- it("the components into the page should be render correctly", async () => {
- const component = renderComponent(finalState);
- expect(component).toBeDefined();
- expect(component.getByTestId("container-test")).not.toBeNull();
- expect(component.getByTestId("title-test")).toBeDefined();
- expect(component.getByText(I18n.t("email.newvalidate.title"))).toBeTruthy();
- expect(
- component.getByText(I18n.t("email.newvalidate.subtitle"))
- ).toBeTruthy();
- expect(component.getByTestId("link-test")).toBeDefined();
- const button = component.getByTestId("button-test");
- expect(button).toBeDefined();
- expect(
- component.getByText(I18n.t("email.newvalidate.buttonlabelsentagain"))
- ).toBeTruthy();
- expect(button).not.toBeDisabled();
- if (button) {
- fireEvent.press(button);
- }
-
- setTimeout(() => {
- expect(
- component.getByText(I18n.t("email.newvalidate.buttonlabelsentagain"))
- ).not.toBeDisabled();
- }, 10000);
- });
-});
-
-const renderComponent = (globalStateProp?: any) =>
- renderScreenWithNavigationStoreContext(
- NewRemindEmailValidationOverlay,
- "DUMMY",
- {},
- globalStateProp
- );
diff --git a/ts/components/__tests__/__snapshots__/LoadingSpinnerOverlay.test.tsx.snap b/ts/components/__tests__/__snapshots__/LoadingSpinnerOverlay.test.tsx.snap
index 5f42ae771f3..3c8c2f69eb6 100644
--- a/ts/components/__tests__/__snapshots__/LoadingSpinnerOverlay.test.tsx.snap
+++ b/ts/components/__tests__/__snapshots__/LoadingSpinnerOverlay.test.tsx.snap
@@ -140,6 +140,12 @@ exports[`LoadingSpinnerOverlay Should match all-properties and loading snapshot
/>
@@ -303,8 +332,11 @@ exports[`LoadingSpinnerOverlay Should match all-properties and loading snapshot
}
>
diff --git a/ts/components/animations/ShakeAnimation.tsx b/ts/components/animations/ShakeAnimation.tsx
deleted file mode 100644
index 0c7383b50b8..00000000000
--- a/ts/components/animations/ShakeAnimation.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import * as React from "react";
-import { Animated, Easing } from "react-native";
-
-type Props = Readonly<{
- duration: number;
-}>;
-/**
- *
- * This component create a custom animation called 'shake'
- */
-export class ShakeAnimation extends React.PureComponent {
- private animatedValue: Animated.Value;
-
- constructor(props: Props) {
- super(props);
- this.animatedValue = new Animated.Value(0);
- }
-
- public shake = () => {
- this.animatedValue.setValue(0);
- // start animation
- Animated.timing(this.animatedValue, {
- toValue: 1,
- duration: this.props.duration,
- useNativeDriver: true,
- easing: Easing.ease
- }).start();
- };
-
- public render() {
- // animation interpolate from left to right and the other way around
- const shaker = this.animatedValue.interpolate({
- inputRange: [0, 0.2, 0.4, 0.6, 0.8, 0.9, 1],
- outputRange: [0, -10, 10, -10, 10, -10, 0]
- });
- return (
-
- {this.props.children}
-
- );
- }
-}
diff --git a/ts/components/bottomSheet/AccessibilityContent.tsx b/ts/components/bottomSheet/AccessibilityContent.tsx
deleted file mode 100644
index 32dc84020e6..00000000000
--- a/ts/components/bottomSheet/AccessibilityContent.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import * as React from "react";
-import { View, Modal } from "react-native";
-import { VSpacer } from "@pagopa/io-app-design-system";
-import { IOStyles } from "../core/variables/IOStyles";
-
-type Props = {
- header: React.ReactNode;
- content: React.ReactNode;
-};
-/**
- * Accessibility version of a BottomSheet including a header and it's content
- * @param header
- * @param content
- */
-export const AccessibilityContent = ({ header, content }: Props) => (
-
-
- {header}
- {content}
-
-);
diff --git a/ts/components/bottomSheet/BlurredBackgroundComponent.tsx b/ts/components/bottomSheet/BlurredBackgroundComponent.tsx
deleted file mode 100644
index 67118c7fffe..00000000000
--- a/ts/components/bottomSheet/BlurredBackgroundComponent.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import * as React from "react";
-import { StyleSheet } from "react-native";
-import { IOColors, hexToRgba } from "@pagopa/io-app-design-system";
-import TouchableDefaultOpacity from "../TouchableDefaultOpacity";
-
-const opaqueBgColor = hexToRgba(IOColors.black, 0.2);
-
-/**
- * Simple component used as background when the bottom sheet pops up to blur the background and demands its closing when tapping on it
- * @param onPress
- */
-export const BlurredBackgroundComponent = (onPress: () => void) => (
-
-);
diff --git a/ts/components/cie/CieNotSupported.tsx b/ts/components/cie/CieNotSupported.tsx
index f354fc433b1..1073298d317 100644
--- a/ts/components/cie/CieNotSupported.tsx
+++ b/ts/components/cie/CieNotSupported.tsx
@@ -1,80 +1,96 @@
-import { List, ListItem } from "native-base";
-import * as React from "react";
-import { useState } from "react";
+/* eslint-disable no-console */
+import React, { useRef } from "react";
import { Platform, View } from "react-native";
import {
- IOColors,
- IOIcons,
- Icon,
- HSpacer,
+ Alert,
+ Body,
+ ContentWrapper,
+ FeatureInfo,
+ GradientScrollView,
+ H3,
+ IOStyles,
+ Pictogram,
VSpacer
} from "@pagopa/io-app-design-system";
+import * as pot from "@pagopa/ts-commons/lib/pot";
+import { useFocusEffect, useNavigation } from "@react-navigation/native";
import I18n from "../../i18n";
-import Markdown from "../ui/Markdown";
-import { Body } from "../core/typography/Body";
+import { useIOSelector } from "../../store/hooks";
+import {
+ hasApiLevelSupportSelector,
+ hasNFCFeatureSelector
+} from "../../store/reducers/cie";
+import { setAccessibilityFocus } from "../../utils/accessibility";
-type Props = {
- hasCieApiLevelSupport: boolean;
- hasCieNFCFeature: boolean;
-};
+const CieNotSupported = () => {
+ const hasApiLevelSupport = useIOSelector(hasApiLevelSupportSelector);
+ const hasCieApiLevelSupport = pot.getOrElse(hasApiLevelSupport, false);
+ const hasNFCFeature = useIOSelector(hasNFCFeatureSelector);
+ const hasCieNFCFeature = pot.getOrElse(hasNFCFeature, false);
+ const accessibilityFirstFocuseViewRef = useRef(null);
+ const navigation = useNavigation();
-const ICON_SIZE = 24;
-const okColor: IOColors = "green";
-const koColor: IOColors = "red";
-const okIcon: IOIcons = "ok";
-const koIcon: IOIcons = "errorFilled";
-const markDownElements = 2;
-const CieNotSupported: React.FunctionComponent = props => {
- const [markdownLoaded, setMarkdownLoaded] = useState(0);
- const handleMarkdownLoaded = () => setMarkdownLoaded(s => s + 1);
- return (
-
-
- {I18n.t("authentication.landing.cie_unsupported.body")}
-
+ useFocusEffect(() => setAccessibilityFocus(accessibilityFirstFocuseViewRef));
- {Platform.OS === "android" && (
-
-
-
- {I18n.t("authentication.landing.cie_unsupported.android_desc")}
-
-
- {markdownLoaded === markDownElements && (
-
-
-
-
-
- {I18n.t(
- "authentication.landing.cie_unsupported.os_version_unsupported"
- )}
-
-
-
-
-
-
-
-
- {I18n.t(
- "authentication.landing.cie_unsupported.nfc_incompatible"
- )}
-
-
-
- )}
-
- )}
-
+ return (
+ navigation.goBack(),
+ testID: "close-button"
+ }}
+ >
+
+
+
+
+
+
+
+ {I18n.t("authentication.landing.cie_unsupported.title")}
+
+
+
+
+ {I18n.t("authentication.landing.cie_unsupported.body")}
+
+
+
+
+
+
+ {Platform.OS === "android" && !hasCieNFCFeature ? (
+
+ ) : (
+ Platform.OS === "android" &&
+ hasCieApiLevelSupport && (
+
+ )
+ )}
+
+
);
};
diff --git a/ts/components/cie/CieRequestAuthenticationOverlay.tsx b/ts/components/cie/CieRequestAuthenticationOverlay.tsx
index c451b430cfb..fdf8022daee 100644
--- a/ts/components/cie/CieRequestAuthenticationOverlay.tsx
+++ b/ts/components/cie/CieRequestAuthenticationOverlay.tsx
@@ -1,6 +1,6 @@
import * as React from "react";
import { createRef, useEffect } from "react";
-import { View, Platform, SafeAreaView, StyleSheet } from "react-native";
+import { View, Platform, StyleSheet } from "react-native";
import WebView from "react-native-webview";
import {
WebViewErrorEvent,
@@ -22,7 +22,6 @@ import { getIdpLoginUri } from "../../utils/login";
import { closeInjectedScript } from "../../utils/webview";
import { IOStyles } from "../core/variables/IOStyles";
import { withLoadingSpinner } from "../helpers/withLoadingSpinner";
-import GenericErrorComponent from "../screens/GenericErrorComponent";
import { lollipopKeyTagSelector } from "../../features/lollipop/store/reducers/lollipop";
import { useIODispatch, useIOSelector } from "../../store/hooks";
import { isMixpanelEnabled } from "../../store/reducers/persistedPreferences";
@@ -32,6 +31,7 @@ import { isFastLoginEnabledSelector } from "../../features/fastLogin/store/selec
import { isCieLoginUatEnabledSelector } from "../../features/cieLogin/store/selectors";
import { cieFlowForDevServerEnabled } from "../../features/cieLogin/utils";
import { selectedIdentityProviderSelector } from "../../store/reducers/authentication";
+import { OperationResultScreenContent } from "../screens/OperationResultScreenContent";
const styles = StyleSheet.create({
errorContainer: {
@@ -307,15 +307,22 @@ const CieWebView = (props: Props) => {
const ErrorComponent = (
props: { onRetry: () => void } & Pick
) => (
-
-
+
-
+
);
/**
diff --git a/ts/components/core/accordion/IOAccordion.tsx b/ts/components/core/accordion/IOAccordion.tsx
deleted file mode 100644
index 36332200936..00000000000
--- a/ts/components/core/accordion/IOAccordion.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import * as React from "react";
-import { StyleSheet } from "react-native";
-import themeVariables from "../../../theme/variables";
-import { H3 } from "../typography/H3";
-import { IOStyles } from "../variables/IOStyles";
-import { RawAccordion } from "./RawAccordion";
-
-type Props = Omit, "header"> & {
- title: string;
-};
-
-const styles = StyleSheet.create({
- header: {
- marginVertical: themeVariables.contentPadding
- }
-});
-
-/**
- * A simplified accordion that accepts a title and one child and uses {@link RawAccordion}
- * @param props
- * @constructor
- */
-export const IOAccordion = (props: Props): React.ReactElement => (
-
- {props.title}
-
- }
- >
- {props.children}
-
-);
diff --git a/ts/components/core/accordion/__test__/RawAccordion.test.tsx b/ts/components/core/accordion/__test__/RawAccordion.test.tsx
index c8d1626b732..38b37c94750 100644
--- a/ts/components/core/accordion/__test__/RawAccordion.test.tsx
+++ b/ts/components/core/accordion/__test__/RawAccordion.test.tsx
@@ -1,8 +1,7 @@
+import { IOColors } from "@pagopa/io-app-design-system";
import { fireEvent, render } from "@testing-library/react-native";
-import { View } from "react-native";
import * as React from "react";
-import { IOColors } from "@pagopa/io-app-design-system";
-import Fingerprint from "../../../../../img/test/fingerprint.svg";
+import { View } from "react-native";
import I18n from "../../../../i18n";
import { Body } from "../../typography/Body";
import { H3 } from "../../typography/H3";
@@ -121,7 +120,6 @@ const renderRawAccordion = (
}}
header={
-
{headerText}
}
diff --git a/ts/components/core/fonts.ts b/ts/components/core/fonts.ts
index bf0fb1be368..56f141b2555 100644
--- a/ts/components/core/fonts.ts
+++ b/ts/components/core/fonts.ts
@@ -24,6 +24,10 @@ const fonts = {
android: "TitilliumWeb",
ios: "Titillium Web"
}),
+ TitilliumSansPro: Platform.select({
+ android: "TitilliumSansPro",
+ ios: "Titillium Sans Pro"
+ }),
ReadexPro: Platform.select({
android: "ReadexPro",
ios: "Readex Pro"
diff --git a/ts/components/core/selection/__test__/__snapshots__/RemoteSwitch.test.tsx.snap b/ts/components/core/selection/__test__/__snapshots__/RemoteSwitch.test.tsx.snap
index 56d389d3df0..673a56fba5e 100644
--- a/ts/components/core/selection/__test__/__snapshots__/RemoteSwitch.test.tsx.snap
+++ b/ts/components/core/selection/__test__/__snapshots__/RemoteSwitch.test.tsx.snap
@@ -52,7 +52,6 @@ exports[`RemoteSwitch tests Snapshot for pot.noneError 1`] = `
align="xMidYMid"
bbHeight={24}
bbWidth={24}
- color={4278219750}
focusable={false}
height={24}
importantForAccessibility="no-hide-descendants"
@@ -75,19 +74,26 @@ exports[`RemoteSwitch tests Snapshot for pot.noneError 1`] = `
},
]
}
- tintColor={4278219750}
+ tintColor="#0073E6"
vbHeight={24}
vbWidth={24}
width={24}
>
-
+
;
-
-type OwnProps = ExternalTypographyProps<
- TypographyProps
->;
-
-/* Common typographic styles */
-export const ctaFontSize = 16;
-export const ctaLineHeight = 20;
-export const ctaDefaultColor: AllowedColors = IOThemeLight["textBody-default"];
-/* New typographic styles */
-const ctaFontName: IOFontFamily = "ReadexPro";
-const ctaDefaultWeight: AllowedWeight = "Regular";
-
-/**
- * Typography component to render `H4` text with font size {@link fontSize} and fontFamily {@link fontName}.
- * default values(if not defined) are weight: `Bold`, color: `bluegreyDark`
- * @param props
- * @constructor
- */
-export const CTA: React.FunctionComponent = props =>
- useTypographyFactory({
- ...props,
- defaultWeight: ctaDefaultWeight,
- defaultColor: ctaDefaultColor,
- font: ctaFontName,
- fontStyle: { fontSize: ctaFontSize, lineHeight: ctaLineHeight }
- });
diff --git a/ts/components/core/typography/Label.tsx b/ts/components/core/typography/Label.tsx
index bed1db91c37..92ac7e207c7 100644
--- a/ts/components/core/typography/Label.tsx
+++ b/ts/components/core/typography/Label.tsx
@@ -1,8 +1,8 @@
import {
FontSize,
fontSizeMapping,
- type IOColors,
- type IOColorsStatusForeground
+ IOColors,
+ IOColorsStatusForeground
} from "@pagopa/io-app-design-system";
import { IOFontFamily, IOFontWeight } from "../fonts";
import { ExternalTypographyProps, TypographyProps } from "./common";
diff --git a/ts/components/core/variables/IOStyleVariables.ts b/ts/components/core/variables/IOStyleVariables.ts
index 88a20791963..a32f81e033a 100644
--- a/ts/components/core/variables/IOStyleVariables.ts
+++ b/ts/components/core/variables/IOStyleVariables.ts
@@ -1,6 +1,9 @@
+import { IOSpacer } from "@pagopa/io-app-design-system";
+
/**
* A collection of default style variables used within IO App.
*/
export const IOStyleVariables = {
+ defaultSpaceBetweenPictogramAndText: 24 as IOSpacer,
switchWidth: 51
};
diff --git a/ts/components/countdown/CountdownProvider.tsx b/ts/components/countdown/CountdownProvider.tsx
new file mode 100644
index 00000000000..0083d52d2f6
--- /dev/null
+++ b/ts/components/countdown/CountdownProvider.tsx
@@ -0,0 +1,58 @@
+import React, {
+ createContext,
+ useContext,
+ useState,
+ ReactNode,
+ useRef
+} from "react";
+import BackgroundTimer from "react-native-background-timer";
+
+type CountdownContextType = {
+ timerCount: number;
+ resetTimer?: () => void;
+ startTimer?: () => void;
+ isRunning?: () => boolean;
+};
+
+const CountdownContext = createContext({ timerCount: 0 });
+
+// Props type for the provider component
+interface CountdownProviderProps {
+ children: ReactNode;
+ timerTiming: number;
+ intervalDuration: number;
+}
+
+export const CountdownProvider = (props: CountdownProviderProps) => {
+ const { children, timerTiming, intervalDuration } = props;
+ const [timerCount, setTimerCount] = useState(timerTiming);
+ const isRunningTimer = useRef(false);
+
+ const startTimer = () => {
+ // eslint-disable-next-line functional/immutable-data
+ isRunningTimer.current = true;
+ BackgroundTimer.runBackgroundTimer(() => {
+ setTimerCount(prevCount => (prevCount > 0 ? prevCount - 1 : 0));
+ }, intervalDuration);
+ };
+
+ const resetTimer = () => {
+ setTimerCount(timerTiming);
+ BackgroundTimer.stopBackgroundTimer();
+ // eslint-disable-next-line functional/immutable-data
+ isRunningTimer.current = false;
+ };
+
+ const isRunning = () => isRunningTimer.current;
+
+ return (
+
+ {children}
+
+ );
+};
+
+// Hook to use the countdown context
+export const useCountdown = () => useContext(CountdownContext);
diff --git a/ts/components/cta/ExtractedCTABar.tsx b/ts/components/cta/ExtractedCTABar.tsx
index 61b4e5d666b..1e9bb07f129 100644
--- a/ts/components/cta/ExtractedCTABar.tsx
+++ b/ts/components/cta/ExtractedCTABar.tsx
@@ -35,7 +35,7 @@ const renderCtaButton = (
if (isPNOptInMessage) {
trackPNOptInMessageAccepted();
}
- handleCtaAction(cta, linkTo, service);
+ handleCtaAction(cta, linkTo, service?.service_id);
};
if (cta !== undefined && isCtaActionValid(cta, serviceMetadata)) {
@@ -68,7 +68,7 @@ const ExtractedCTABar: React.FunctionComponent = (
props,
linkTo,
false,
- props.isPNOptInMessage?.cta2HasServiceNavigationLink ?? false,
+ props.isPNOptInMessage?.cta2LinksToPNService ?? false,
ctas.cta_2
),
[ctas.cta_2, linkTo, props]
@@ -79,7 +79,7 @@ const ExtractedCTABar: React.FunctionComponent = (
props,
linkTo,
true,
- props.isPNOptInMessage?.cta1HasServiceNavigationLink ?? false,
+ props.isPNOptInMessage?.cta1LinksToPNService ?? false,
ctas.cta_1
),
[ctas.cta_1, linkTo, props]
diff --git a/ts/components/helpers/withErrorModal.tsx b/ts/components/helpers/withErrorModal.tsx
deleted file mode 100644
index 18da5d90bac..00000000000
--- a/ts/components/helpers/withErrorModal.tsx
+++ /dev/null
@@ -1,129 +0,0 @@
-import { pipe } from "fp-ts/lib/function";
-import * as O from "fp-ts/lib/Option";
-import { Text as NBButtonText } from "native-base";
-import * as React from "react";
-import { Image, StyleSheet, View } from "react-native";
-
-import { IOColors } from "@pagopa/io-app-design-system";
-import I18n from "../../i18n";
-import variables from "../../theme/variables";
-import ButtonDefaultOpacity from "../ButtonDefaultOpacity";
-import { H1 } from "../core/typography/H1";
-import { Overlay } from "../ui/Overlay";
-
-const styles = StyleSheet.create({
- contentWrapper: {
- flex: 1,
- padding: variables.contentPadding
- },
-
- imageAndMessageContainer: {
- flex: 1,
- justifyContent: "center",
- alignItems: "center"
- },
-
- image: {
- marginBottom: 20
- },
-
- buttonsContainer: {
- flexDirection: "row",
- marginTop: "auto"
- },
-
- buttonCancel: {
- flex: 4,
- backgroundColor: IOColors.bluegrey
- },
-
- separator: {
- width: 10
- },
-
- buttonRetry: {
- flex: 8
- }
-});
-
-/**
- * A HOC to display a modal to notify the user an error occurred.
- * Inside the modal cancel and retry buttons are rendered conditionally.
- *
- * @param WrappedComponent The react component you want to wrap
- * @param errorSelector A redux selector that returns the error (as string) or undefined
- * @param errorMapping A mapping function that converts the extracted error (if any) into a user-readable string
- */
-export function withErrorModal<
- E,
- P extends Readonly<{
- error: O.Option;
- onCancel: () => void;
- onRetry?: () => void;
- }>
->(WrappedComponent: React.ComponentType, errorMapping: (t: E) => string) {
- class WithErrorModal extends React.Component
{
- public render() {
- const { error } = this.props;
-
- const errorMessage = pipe(
- error,
- O.fold(
- () => "",
- e => errorMapping(e)
- )
- );
-
- return (
-
-
-
- );
- }
-
- private renderContent = (errorMessage: string) => (
-
-
-
- {errorMessage}
-
- {this.renderButtons()}
-
- );
-
- private renderButtons = () => (
-
-
-
- {I18n.t("global.buttons.cancel")}
-
-
- {this.props.onRetry && }
- {this.props.onRetry && (
-
- {I18n.t("global.buttons.retry")}
-
- )}
-
- );
- }
-
- return WithErrorModal;
-}
diff --git a/ts/components/helpers/withItemsSelection.tsx b/ts/components/helpers/withItemsSelection.tsx
deleted file mode 100644
index 1479abd7de0..00000000000
--- a/ts/components/helpers/withItemsSelection.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import { Omit } from "@pagopa/ts-commons/lib/types";
-import { pipe } from "fp-ts/lib/function";
-import * as O from "fp-ts/lib/Option";
-import hoistNonReactStatics from "hoist-non-react-statics";
-import React from "react";
-
-type State = {
- selectedItemIds: O.Option>;
-};
-
-export type InjectedWithItemsSelectionProps = {
- selectedItemIds: O.Option>;
- toggleItemSelection: (id: string) => void;
- resetSelection: () => void;
- setSelectedItemIds: (newSelectedItemIds: O.Option>) => void;
-};
-
-/**
- * An HOC to maintain and manipulate a list of selected items.
- *
- * @deprecated please use the hook useItemsSelection instead
- */
-export function withItemsSelection(
- WrappedComponent: React.ComponentType
-) {
- class WithItemsSelection extends React.PureComponent<
- Omit
,
- State
- > {
- constructor(props: Omit
) {
- super(props);
- this.state = {
- selectedItemIds: O.none
- };
- }
-
- public render() {
- const { selectedItemIds } = this.state;
- return (
-
- );
- }
-
- // A function to add/remove an id from the selectedItemIds Set.
- private toggleItemSelection = (id: string) => {
- this.setState(({ selectedItemIds }) =>
- pipe(
- selectedItemIds,
- O.map(_ => {
- const newSelectedItemIds = new Set(_);
- if (newSelectedItemIds.has(id)) {
- newSelectedItemIds.delete(id);
- } else {
- newSelectedItemIds.add(id);
- }
-
- return {
- selectedItemIds: O.some(newSelectedItemIds)
- };
- }),
- O.getOrElse(() => ({
- selectedItemIds: O.some(new Set([id]))
- }))
- )
- );
- };
-
- private setSelectedItemIds = (
- newSelectedItemIds: O.Option>
- ) => {
- this.setState({
- selectedItemIds: newSelectedItemIds
- });
- };
-
- private resetSelection = () => {
- this.setState({
- selectedItemIds: O.none
- });
- };
- }
-
- hoistNonReactStatics(WithItemsSelection, WrappedComponent);
-
- return WithItemsSelection;
-}
diff --git a/ts/components/markdown/MarkdownBaseScreen.tsx b/ts/components/markdown/MarkdownBaseScreen.tsx
deleted file mode 100644
index 1ab6024f4a1..00000000000
--- a/ts/components/markdown/MarkdownBaseScreen.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { useEffect, useState } from "react";
-import * as React from "react";
-import { View, StyleSheet } from "react-native";
-import BaseScreenComponent from "../screens/BaseScreenComponent";
-import { EdgeBorderComponent } from "../screens/EdgeBorderComponent";
-import ScreenContent from "../screens/ScreenContent";
-import Markdown from "../ui/Markdown";
-import themeVariables from "../../theme/variables";
-
-/**
- * TODO Rename the title prop in the BaseScreenComponent to navigationTitle
- * https://www.pivotaltracker.com/story/show/173056117
- */
-type Props = {
- markDown: string;
- navigationTitle?: string;
- title?: string;
- subtitle?: string;
- hideHeader?: boolean;
-};
-
-const styles = StyleSheet.create({
- markdownContainer: {
- paddingLeft: themeVariables.contentPadding,
- paddingRight: themeVariables.contentPadding
- }
-});
-
-/**
- * A base screen that allow the rendering of a markdown, in addition with a title and subtitle
- * @param props
- * @constructor
- */
-export const MarkdownBaseScreen: React.FunctionComponent = props => {
- const [isMarkdownLoaded, setMarkdownLoaded] = useState(false);
-
- useEffect(() => setMarkdownLoaded(false), [props.markDown]);
-
- return (
-
-
-
- setMarkdownLoaded(true)}>
- {props.markDown}
-
- {isMarkdownLoaded && }
-
-
- {isMarkdownLoaded && props.children}
-
- );
-};
diff --git a/ts/components/screens/BaseScreenComponent/utils.tsx b/ts/components/screens/BaseScreenComponent/utils.tsx
index 04ddd89cebb..27bd6d1d037 100644
--- a/ts/components/screens/BaseScreenComponent/utils.tsx
+++ b/ts/components/screens/BaseScreenComponent/utils.tsx
@@ -7,7 +7,7 @@ import { ScreenCHData } from "../../../../definitions/content/ScreenCHData";
import { ContextualHelpData } from "../../../features/zendesk/screens/ZendeskSupportHelpCenter";
import I18n from "../../../i18n";
import { handleItemOnPress } from "../../../utils/url";
-import Markdown from "../../ui/Markdown";
+import LegacyMarkdown from "../../ui/Markdown/LegacyMarkdown";
import {
deriveCustomHandledLink,
isIoInternalLink
@@ -50,13 +50,13 @@ export const getContextualHelpConfig = (
: contextualHelpMarkdown
? {
body: () => (
-
{I18n.t(contextualHelpMarkdown.body)}
-
+
),
title: I18n.t(contextualHelpMarkdown.title)
}
@@ -77,7 +77,9 @@ export const getContextualHelpData = (
() => defaultData,
data => ({
title: data.title,
- content: {data.content} ,
+ content: (
+ {data.content}
+ ),
faqs: pipe(
data.faqs,
O.fromNullable,
diff --git a/ts/components/screens/IdpCustomContextualHelpContent.tsx b/ts/components/screens/IdpCustomContextualHelpContent.tsx
index 172313f4c71..321045b12f8 100644
--- a/ts/components/screens/IdpCustomContextualHelpContent.tsx
+++ b/ts/components/screens/IdpCustomContextualHelpContent.tsx
@@ -4,7 +4,7 @@ import { VSpacer } from "@pagopa/io-app-design-system";
import { Idp } from "../../../definitions/content/Idp";
import { handleItemOnPress } from "../../utils/url";
import BlockButtons from "../ui/BlockButtons";
-import Markdown from "../ui/Markdown";
+import LegacyMarkdown from "../ui/Markdown/LegacyMarkdown";
import EmailCallCTA from "./EmailCallCTA";
type Props = Readonly<{
@@ -25,11 +25,11 @@ const IdpCustomContextualHelpBody: React.FunctionComponent = props => {
return (
{/** Recover credentials */}
- setIsMarkdown1Loaded(true)}>
+ setIsMarkdown1Loaded(true)}>
{idpTextData.recover_username
? I18n.t("authentication.idp_login.dualRecoverDescription")
: I18n.t("authentication.idp_login.recoverDescription")}
-
+
{isMarkdown1Loaded && (
@@ -60,9 +60,9 @@ const IdpCustomContextualHelpBody: React.FunctionComponent = props => {
{/** Idp contacts */}
- setIsMarkdown2Loaded(true)}>
+ setIsMarkdown2Loaded(true)}>
{idpTextData.description}
-
+
{isMarkdown2Loaded && (
diff --git a/ts/components/screens/OperationResultScreenContent.tsx b/ts/components/screens/OperationResultScreenContent.tsx
index 3d28636e18e..92d50d74702 100644
--- a/ts/components/screens/OperationResultScreenContent.tsx
+++ b/ts/components/screens/OperationResultScreenContent.tsx
@@ -1,25 +1,44 @@
import {
+ Body,
ButtonLink,
ButtonLinkProps,
ButtonSolid,
ButtonSolidProps,
+ ExternalTypographyProps,
H3,
+ IOColors,
+ IOFontWeight,
IOPictograms,
IOStyles,
+ IOTheme,
IOVisualCostants,
Pictogram,
+ TypographyProps,
VSpacer,
WithTestID
} from "@pagopa/io-app-design-system";
import * as React from "react";
-import { Platform, SafeAreaView, StyleSheet, View } from "react-native";
+import { Platform, StyleSheet, View } from "react-native";
import { ScrollView } from "react-native-gesture-handler";
-import { LabelSmall } from "../core/typography/LabelSmall";
+import { SafeAreaView } from "react-native-safe-area-context";
+
+type PartialAllowedColors = Extract<
+ IOColors,
+ "bluegreyDark" | "white" | "blue" | "bluegrey" | "bluegreyLight"
+>;
+type AllowedColors = PartialAllowedColors | IOTheme["textBody-default"];
+type AllowedWeight = IOFontWeight | "Regular" | "SemiBold";
+
+export type BodyProps = ExternalTypographyProps<
+ TypographyProps & {
+ text: string | React.ReactElement;
+ }
+>;
type OperationResultScreenContentProps = WithTestID<{
pictogram?: IOPictograms;
title: string;
- subtitle?: string;
+ subtitle?: string | Array;
action?: Pick<
ButtonSolidProps,
"label" | "accessibilityLabel" | "onPress" | "testID"
@@ -28,8 +47,27 @@ type OperationResultScreenContentProps = WithTestID<{
ButtonLinkProps,
"label" | "accessibilityLabel" | "onPress" | "testID"
>;
+ isHeaderVisible?: boolean;
}>;
+type PropsComposedBody = {
+ subtitle: Array;
+ textAlign?: "auto" | "left" | "right" | "center" | "justify" | undefined;
+};
+
+export const ComposedBodyFromArray = ({
+ subtitle,
+ textAlign = "center"
+}: PropsComposedBody) => (
+
+ {subtitle.map(({ text, key, ...props }) => (
+
+ {text}
+
+ ))}
+
+);
+
const OperationResultScreenContent = ({
pictogram,
title,
@@ -37,9 +75,14 @@ const OperationResultScreenContent = ({
action,
secondaryAction,
children,
- testID
+ testID,
+ isHeaderVisible
}: React.PropsWithChildren) => (
-
+
-
- {subtitle}
-
+ {typeof subtitle === "string" ? (
+ {subtitle}
+ ) : (
+
+ )}
>
)}
{action && (
@@ -79,6 +124,7 @@ const OperationResultScreenContent = ({
)}
+
{React.isValidElement(children) && React.cloneElement(children)}
diff --git a/ts/components/screens/ScreenContentHeader.tsx b/ts/components/screens/ScreenContentHeader.tsx
index 949182243e4..96e08f06cba 100644
--- a/ts/components/screens/ScreenContentHeader.tsx
+++ b/ts/components/screens/ScreenContentHeader.tsx
@@ -29,7 +29,7 @@ type Props = Readonly<{
subtitle?: string;
subtitleLink?: JSX.Element;
dark?: boolean;
- dynamicHeight?: Animated.AnimatedInterpolation;
+ dynamicHeight?: Animated.AnimatedInterpolation;
// Specified if a custom component is needed, if both icon and rightComponent are defined rightComponent
// will be rendered in place of icon
rightComponent?: React.ReactElement;
@@ -45,8 +45,8 @@ const styles = StyleSheet.create({
}
});
-const shouldCollapse = 1 as unknown as Animated.AnimatedInterpolation;
-const shouldExpand = 0 as unknown as Animated.AnimatedInterpolation;
+const shouldCollapse = 1 as unknown as Animated.AnimatedInterpolation;
+const shouldExpand = 0 as unknown as Animated.AnimatedInterpolation;
export class ScreenContentHeader extends React.PureComponent {
private heightAnimation: Animated.Value;
diff --git a/ts/components/screens/__tests__/__snapshots__/OperationResultScreenContent.test.tsx.snap b/ts/components/screens/__tests__/__snapshots__/OperationResultScreenContent.test.tsx.snap
index 456cc47fe98..6f403769568 100644
--- a/ts/components/screens/__tests__/__snapshots__/OperationResultScreenContent.test.tsx.snap
+++ b/ts/components/screens/__tests__/__snapshots__/OperationResultScreenContent.test.tsx.snap
@@ -20,627 +20,670 @@ exports[`OperationResultScreenContent should match the snapshot with default pro
}
>
-
-
-
+
+ />
+
+
-
+
- WALLET_HOME
-
+
+ WALLET_HOME
+
+
+
-
-
-
-
-
+
-
-
-
-
-
+
+
- title
-
-
-
+ title
+
+
+
- subtitle
-
-
+ weight="Regular"
+ >
+ subtitle
+
-
+ >
+ />
+
-
- Action
-
+
+ Action
+
+
-
-
-
+ >
+ />
+
-
- Secondary Action
-
+
+ Secondary Action
+
+
-
-
-
+
+
+
-
-
+
+
diff --git a/ts/components/services/ContactPreferencesToggles/__test__/ContactPreferencesToggles.test.tsx b/ts/components/services/ContactPreferencesToggles/__test__/ContactPreferencesToggles.test.tsx
index 0c49c894276..efac15ced66 100644
--- a/ts/components/services/ContactPreferencesToggles/__test__/ContactPreferencesToggles.test.tsx
+++ b/ts/components/services/ContactPreferencesToggles/__test__/ContactPreferencesToggles.test.tsx
@@ -5,10 +5,10 @@ import { NotificationChannelEnum } from "../../../../../definitions/backend/Noti
import { ServiceId } from "../../../../../definitions/backend/ServiceId";
import I18n from "../../../../i18n";
import { applicationChangeState } from "../../../../store/actions/application";
-import { loadServicePreference } from "../../../../store/actions/services/servicePreference";
+import { loadServicePreference } from "../../../../features/services/store/actions";
import { appReducer } from "../../../../store/reducers";
import { GlobalState } from "../../../../store/reducers/types";
-import { ServicePreferenceResponse } from "../../../../types/services/ServicePreferenceResponse";
+import { ServicePreferenceResponse } from "../../../../features/services/types/ServicePreferenceResponse";
import { renderScreenWithNavigationStoreContext } from "../../../../utils/testWrapper";
import ContactPreferencesToggles from "../index";
diff --git a/ts/components/services/ContactPreferencesToggles/index.tsx b/ts/components/services/ContactPreferencesToggles/index.tsx
index 2d8072737d0..07e08a7f6f1 100644
--- a/ts/components/services/ContactPreferencesToggles/index.tsx
+++ b/ts/components/services/ContactPreferencesToggles/index.tsx
@@ -10,19 +10,19 @@ import I18n from "../../../i18n";
import {
loadServicePreference,
upsertServicePreference
-} from "../../../store/actions/services/servicePreference";
+} from "../../../features/services/store/actions";
import { Dispatch } from "../../../store/actions/types";
import { useIOSelector } from "../../../store/hooks";
import { isPremiumMessagesOptInOutEnabledSelector } from "../../../store/reducers/backendStatus";
import {
servicePreferenceSelector,
ServicePreferenceState
-} from "../../../store/reducers/entities/services/servicePreference";
+} from "../../../features/services/store/reducers/servicePreference";
import { GlobalState } from "../../../store/reducers/types";
import {
isServicePreferenceResponseSuccess,
ServicePreference
-} from "../../../types/services/ServicePreferenceResponse";
+} from "../../../features/services/types/ServicePreferenceResponse";
import { isStrictSome } from "../../../utils/pot";
import { showToast } from "../../../utils/showToast";
import ItemSeparatorComponent from "../../ItemSeparatorComponent";
diff --git a/ts/components/services/LocalServicesWebView.tsx b/ts/components/services/LocalServicesWebView.tsx
index 9f56276605d..3fa9fdebb97 100644
--- a/ts/components/services/LocalServicesWebView.tsx
+++ b/ts/components/services/LocalServicesWebView.tsx
@@ -14,7 +14,7 @@ import { localServicesWebUrl } from "../../config";
import { useTabItemPressWhenScreenActive } from "../../hooks/useTabItemPressWhenScreenActive";
import I18n from "../../i18n";
import { loadServiceDetail } from "../../store/actions/services";
-import { servicesByIdSelector } from "../../store/reducers/entities/services/servicesById";
+import { servicesByIdSelector } from "../../features/services/store/reducers/servicesById";
import { GlobalState } from "../../store/reducers/types";
import { isStrictSome } from "../../utils/pot";
import { showToast } from "../../utils/showToast";
diff --git a/ts/components/services/__tests__/__snapshots__/SectionHeader.test.tsx.snap b/ts/components/services/__tests__/__snapshots__/SectionHeader.test.tsx.snap
index 8213c9a3f98..b9c16fdd5f8 100644
--- a/ts/components/services/__tests__/__snapshots__/SectionHeader.test.tsx.snap
+++ b/ts/components/services/__tests__/__snapshots__/SectionHeader.test.tsx.snap
@@ -17,7 +17,6 @@ exports[`SectionHeader component should match the snapshot 1`] = `
align="xMidYMid"
bbHeight={20}
bbWidth={20}
- color={4282866285}
focusable={false}
height={20}
importantForAccessibility="no-hide-descendants"
@@ -40,19 +39,26 @@ exports[`SectionHeader component should match the snapshot 1`] = `
},
]
}
- tintColor={4282866285}
+ tintColor="#475A6D"
vbHeight={24}
vbWidth={24}
width={20}
>
-
+
["onLinkClicked"];
- shouldHandleLink?: ComponentProps["shouldHandleLink"];
+ onLinkClicked?: ComponentProps["onLinkClicked"];
+ shouldHandleLink?: ComponentProps["shouldHandleLink"];
};
const styles = StyleSheet.create({
@@ -34,7 +34,7 @@ const styles = StyleSheet.create({
*
* @param props
* @constructor
- * @deprecated Please use {@link RawAccordion} or {@link IOAccordion}
+ * @deprecated Please use {@link RawAccordion}
*/
const Accordion: React.FunctionComponent = (props: Props) => {
const [expanded, setExpanded] = React.useState(false);
@@ -69,7 +69,7 @@ const Accordion: React.FunctionComponent = (props: Props) => {
const renderContent = (content: string) => (
- {
pipe(
@@ -80,7 +80,7 @@ const Accordion: React.FunctionComponent = (props: Props) => {
}}
>
{content}
-
+
);
diff --git a/ts/components/ui/DateTimePicker.tsx b/ts/components/ui/DateTimePicker.tsx
deleted file mode 100644
index fe05df77a2b..00000000000
--- a/ts/components/ui/DateTimePicker.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import * as React from "react";
-import DateTimePickerModal from "react-native-modal-datetime-picker";
-import { useState } from "react";
-import { StyleSheet, View } from "react-native";
-import { IOColors, Icon, VSpacer } from "@pagopa/io-app-design-system";
-import { H5 } from "../core/typography/H5";
-import { H4 } from "../core/typography/H4";
-import { formatDateAsLocal } from "../../utils/dates";
-import TouchableDefaultOpacity from "../TouchableDefaultOpacity";
-import I18n from "../../i18n";
-
-type Props = {
- date: Date | undefined;
- onConfirm: (date: Date) => void;
- label?: string;
- minimumDate?: Date;
- blocked?: boolean;
-};
-
-const styles = StyleSheet.create({
- container: { borderBottomWidth: 1, borderColor: IOColors.bluegreyLight },
- inputContainer: {
- flex: 1,
- flexDirection: "row",
- justifyContent: "space-between"
- }
-});
-
-const DateTimePicker: React.FunctionComponent = (props: Props) => {
- const [showModal, setShowModal] = useState(false);
-
- const onConfirm = (date: Date) => {
- props.onConfirm(date);
- setShowModal(false);
- };
-
- const onDismiss = () => setShowModal(false);
-
- const onPress = () => {
- if (props.blocked !== true) {
- setShowModal(true);
- }
- };
-
- return (
-
- {props.label && {props.label} }
-
-
-
- {props.date
- ? formatDateAsLocal(props.date, true, true)
- : I18n.t("global.dateFormats.dateTimePicker")}
-
-
-
-
-
-
- );
-};
-
-export default DateTimePicker;
diff --git a/ts/components/ui/LoadingIndicator.tsx b/ts/components/ui/LoadingIndicator.tsx
index e41d9debb9a..857bb04ac61 100644
--- a/ts/components/ui/LoadingIndicator.tsx
+++ b/ts/components/ui/LoadingIndicator.tsx
@@ -1,10 +1,8 @@
import * as React from "react";
-import {
- LoadingSpinner,
- useIOExperimentalDesign
-} from "@pagopa/io-app-design-system";
+import { LoadingSpinner } from "@pagopa/io-app-design-system";
import I18n from "i18n-js";
import { WithTestID } from "../../types/WithTestID";
+import { useInteractiveElementDefaultColor } from "../../utils/hooks/theme";
export type LoadingIndicator = WithTestID<
Exclude<
@@ -18,14 +16,14 @@ export const LoadingIndicator = ({
accessibilityLabel = I18n.t("global.accessibility.activityIndicator.label"),
testID = "LoadingIndicator"
}: LoadingIndicator) => {
- const { isExperimental } = useIOExperimentalDesign();
+ const blueColor = useInteractiveElementDefaultColor();
return (
);
diff --git a/ts/components/ui/LogoPaymentExtended.tsx b/ts/components/ui/LogoPaymentExtended.tsx
index b53119ddd0c..241891ae9a7 100644
--- a/ts/components/ui/LogoPaymentExtended.tsx
+++ b/ts/components/ui/LogoPaymentExtended.tsx
@@ -3,7 +3,7 @@ import { Image } from "react-native";
import paypalLogoImage from "../../../img/wallet/payment-methods/paypal-logo.png";
// sadly no svg is available for paypal, since on Figma an image is used
import BpayLogo from "../../../img/wallet/payment-methods/bpay_logo_full.svg";
-import { BankLogoOrSkeleton } from "./utils/components/BankLogoOrLoadingSkeleton";
+import { BankLogoOrSkeleton } from "../../features/payments/common/components/utils/BankLogoOrLoadingSkeleton";
export type LogoPaymentExtendedProps = {
dimensions: { height: number; width: number };
} & (
diff --git a/ts/components/ui/Markdown/index.tsx b/ts/components/ui/Markdown/LegacyMarkdown.tsx
similarity index 97%
rename from ts/components/ui/Markdown/index.tsx
rename to ts/components/ui/Markdown/LegacyMarkdown.tsx
index 4e461a6a7f7..ae08a6edc4d 100644
--- a/ts/components/ui/Markdown/index.tsx
+++ b/ts/components/ui/Markdown/LegacyMarkdown.tsx
@@ -25,7 +25,7 @@ import customVariables from "../../../theme/variables";
import { WithTestID } from "../../../types/WithTestID";
import { remarkProcessor } from "../../../utils/markdown";
import { closeInjectedScript } from "../../../utils/webview";
-import MarkdownWebviewComponent from "./MarkdownWebviewComponent";
+import { MarkdownWebviewComponent } from "./MarkdownWebviewComponent";
import { NOTIFY_BODY_HEIGHT_SCRIPT, NOTIFY_LINK_CLICK_SCRIPT } from "./script";
const INJECTED_JAVASCRIPT = `
@@ -208,7 +208,7 @@ type State = {
/**
* A component to render the message markdown as HTML inside a WebView
*/
-class Markdown extends React.PureComponent {
+class LegacyMarkdown extends React.PureComponent {
private webViewRef = React.createRef();
private subscription: NativeEventSubscription | undefined;
@@ -398,6 +398,6 @@ class Markdown extends React.PureComponent {
};
}
-export type MarkdownProps = OwnProps;
+export type LegacyMarkdownProps = OwnProps;
-export default connect()(Markdown);
+export default connect()(LegacyMarkdown);
diff --git a/ts/components/ui/Markdown/LoadingSkeleton.tsx b/ts/components/ui/Markdown/LoadingSkeleton.tsx
new file mode 100644
index 00000000000..88912d8b6e1
--- /dev/null
+++ b/ts/components/ui/Markdown/LoadingSkeleton.tsx
@@ -0,0 +1,41 @@
+import React from "react";
+import { View } from "react-native";
+import Placeholder from "rn-placeholder";
+import { VSpacer } from "@pagopa/io-app-design-system";
+import I18n from "../../../i18n";
+
+type LoadingSkeletonProps = {
+ testID?: string;
+};
+
+export const LoadingSkeleton = ({ testID }: LoadingSkeletonProps) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
diff --git a/ts/components/ui/Markdown/Markdown.tsx b/ts/components/ui/Markdown/Markdown.tsx
new file mode 100644
index 00000000000..6aca1b25ef5
--- /dev/null
+++ b/ts/components/ui/Markdown/Markdown.tsx
@@ -0,0 +1,196 @@
+import React, { useCallback, useEffect, useRef, useState } from "react";
+import {
+ AppState,
+ AppStateStatus,
+ InteractionManager,
+ LayoutAnimation,
+ Platform,
+ ScrollView,
+ StyleProp,
+ UIManager,
+ View,
+ ViewStyle
+} from "react-native";
+import WebView from "react-native-webview";
+import { closeInjectedScript } from "../../../utils/webview";
+import { remarkProcessor } from "../../../utils/markdown";
+import { MarkdownWebviewComponent } from "./MarkdownWebviewComponent";
+import { NOTIFY_BODY_HEIGHT_SCRIPT, NOTIFY_LINK_CLICK_SCRIPT } from "./script";
+import { LoadingSkeleton } from "./LoadingSkeleton";
+import { convertOldDemoMarkdownTag, generateHtml } from "./utils";
+
+export type MarkdownProps = {
+ animated?: boolean;
+ /**
+ * The code will be inserted in the html body between
+ * tags.
+ */
+ avoidTextSelection?: true;
+ children: string;
+ cssStyle?: string;
+ extraBodyHeight?: number;
+ letUserZoom?: boolean;
+ onError?: (error: any) => void;
+ onLinkClicked?: (url: string) => void;
+ onLoadEnd?: () => void;
+ /**
+ * if shouldHandleLink returns true the clicked link will be handled by the Markdown component
+ * otherwise Markdown will ignore it. If shouldHandleLink is not defined assume () => true
+ * @param url
+ */
+ shouldHandleLink?: (url: string) => boolean;
+ testID?: string;
+ webViewStyle?: StyleProp;
+ useCustomSortedList?: boolean;
+};
+
+type InternalState = {
+ html?: string;
+ htmlBodyHeight: number;
+ isLoading: boolean;
+ webviewKey: number;
+};
+
+export const Markdown = (props: MarkdownProps) => {
+ const [internalState, setInternalState] = useState({
+ html: undefined,
+ htmlBodyHeight: 0,
+ isLoading: true,
+ webviewKey: 0
+ });
+ const webViewRef = useRef(null);
+ const { html, htmlBodyHeight, isLoading, webviewKey } = internalState;
+ const containerStyle: ViewStyle = {
+ height: htmlBodyHeight + (props.extraBodyHeight || 0)
+ };
+ const handleLoadEnd = useCallback(() => {
+ props.onLoadEnd?.();
+ setTimeout(() => {
+ // to avoid yellow box warning
+ // it's ugly but it works https://github.com/react-native-community/react-native-webview/issues/341#issuecomment-466639820
+ webViewRef.current?.injectJavaScript(
+ closeInjectedScript(NOTIFY_BODY_HEIGHT_SCRIPT)
+ );
+ }, 100);
+ }, [props]);
+
+ const compileMarkdownAsync = useCallback(
+ (
+ markdown: string,
+ animated: boolean = false,
+ onError?: (error: any) => void,
+ cssStyle?: string,
+ useCustomSortedList: boolean = false,
+ avoidTextSelection: boolean = false
+ ) => {
+ void InteractionManager.runAfterInteractions(() => {
+ if (animated) {
+ // Animate the layout change
+ // See https://facebook.github.io/react-native/docs/layoutanimation.html
+ if (UIManager.setLayoutAnimationEnabledExperimental) {
+ UIManager.setLayoutAnimationEnabledExperimental(true);
+ }
+ LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
+ }
+ remarkProcessor.process(
+ convertOldDemoMarkdownTag(
+ // sanitize html to prevent xss attacks
+ filterXSS(markdown, { stripIgnoreTagBody: ["script"] })
+ ),
+ (error: any, file: any) => {
+ if (error) {
+ onError?.(error);
+ return;
+ }
+ // The check below on `isLoading` is to set the property back to 'false'
+ // value when refreshing with metro, since it is set back to the initial
+ // 'true' value but the underlying MarkdownWebviewComponent does not
+ // reload its content (the html is recompiled but it does not change),
+ // thus, not calling the `handleLoadEnd` callback
+ const html = generateHtml(
+ String(file),
+ cssStyle,
+ useCustomSortedList,
+ avoidTextSelection
+ );
+ setInternalState(currentInternalState => ({
+ ...currentInternalState,
+ isLoading:
+ currentInternalState.isLoading &&
+ currentInternalState.html !== html,
+ html
+ }));
+ }
+ );
+ });
+ },
+ []
+ );
+
+ useEffect(() => {
+ setInternalState(currentInternalState => ({
+ ...currentInternalState,
+ isLoading: true
+ }));
+ compileMarkdownAsync(
+ props.children,
+ props.animated,
+ props.onError,
+ props.cssStyle,
+ props.useCustomSortedList,
+ props.avoidTextSelection
+ );
+
+ const subscription = AppState.addEventListener(
+ "change",
+ (nextAppState: AppStateStatus) => {
+ if (Platform.OS === "ios" && nextAppState === "active") {
+ // Reloads the WebView on iOS. Using reload() on the webview
+ // reference causes the injected javascript to fail
+ setInternalState(currentInternalState => ({
+ ...currentInternalState,
+ webviewKey: currentInternalState.webviewKey + 1
+ }));
+ }
+ }
+ );
+ return () => subscription.remove();
+ }, [compileMarkdownAsync, props]);
+
+ return (
+ <>
+ {isLoading && }
+ {/* Hide the WebView until we have the htmlBodyHeight */}
+ {html && (
+
+
+
+ setInternalState(currentInternalState => ({
+ ...currentInternalState,
+ isLoading: false
+ }))
+ }
+ setHtmlBodyHeight={(inputHtmlBodyHeight: number) =>
+ setInternalState(currentInternalState => ({
+ ...currentInternalState,
+ htmlBodyHeight: inputHtmlBodyHeight
+ }))
+ }
+ webViewStyle={props.webViewStyle}
+ onLinkClicked={props.onLinkClicked}
+ letUserZoom={props.letUserZoom}
+ testID={props.testID}
+ />
+
+
+ )}
+ >
+ );
+};
diff --git a/ts/components/ui/Markdown/MarkdownWebviewComponent.tsx b/ts/components/ui/Markdown/MarkdownWebviewComponent.tsx
index 6dc1611c090..75be6f68349 100644
--- a/ts/components/ui/Markdown/MarkdownWebviewComponent.tsx
+++ b/ts/components/ui/Markdown/MarkdownWebviewComponent.tsx
@@ -2,7 +2,7 @@ import { useLinkTo } from "@react-navigation/native";
import * as E from "fp-ts/lib/Either";
import { pipe } from "fp-ts/lib/function";
import * as O from "fp-ts/lib/Option";
-import React from "react";
+import React, { LegacyRef } from "react";
import { StyleProp, ViewStyle } from "react-native";
import { WebView } from "react-native-webview";
import { WebViewMessageEvent } from "react-native-webview/lib/WebViewTypes";
@@ -16,7 +16,7 @@ type Props = {
handleLoadEnd: () => void;
html: string;
webviewKey: number;
- webViewRef: React.RefObject;
+ webViewRef: LegacyRef;
setLoadingFalse: () => void;
setHtmlBodyHeight: (h: number) => void;
shouldHandleLink?: (link: string) => boolean;
@@ -26,7 +26,7 @@ type Props = {
testID?: string;
};
-const MarkdownWebviewComponent = (props: Props) => {
+export const MarkdownWebviewComponent = (props: Props) => {
const linkTo = useLinkTo();
const handleWebViewMessage = (event: WebViewMessageEvent) => {
@@ -65,7 +65,6 @@ const MarkdownWebviewComponent = (props: Props) => {
})
);
};
-
return (
{
/>
);
};
-export default MarkdownWebviewComponent;
diff --git a/ts/components/ui/Markdown/utils.ts b/ts/components/ui/Markdown/utils.ts
new file mode 100644
index 00000000000..75ca07c1db9
--- /dev/null
+++ b/ts/components/ui/Markdown/utils.ts
@@ -0,0 +1,146 @@
+import { FontWeight, IOColors } from "@pagopa/io-app-design-system";
+import { Platform } from "react-native";
+import * as RNFS from "react-native-fs";
+
+const textColor = IOColors.bluegrey;
+const fontSizeBase = 16;
+const textLinkWeight = "600" as FontWeight;
+const textMessageDetailLinkColor = IOColors.blue;
+const toastColor = IOColors.aquaUltraLight;
+const brandPrimary = IOColors.blue;
+
+const OLD_DEMO_TAG_MARKDOWN_REGEX = /^\[demo\]([\s\S]+?)\[\/demo\]\s*\n{2,}/;
+export const convertOldDemoMarkdownTag = (markdown: string) =>
+ markdown.replace(
+ OLD_DEMO_TAG_MARKDOWN_REGEX,
+ (_, g1: string) => `::div[${g1}]{.io-demo-block}\n`
+ );
+
+export const generateHtml = (
+ content: string,
+ cssStyle?: string,
+ useCustomSortedList: boolean = false,
+ avoidTextSelection: boolean = false
+) => `
+
+
+
+
+
+
+ ${GLOBAL_CSS}
+ ${cssStyle ? generateInlineCss(cssStyle) : ""}
+ ${avoidTextSelection ? avoidTextSelectionCSS : ""}
+ ${useCustomSortedList ? generateCustomFontList : ""}
+ ${content}
+
+
+ `;
+
+const generateInlineCss = (cssStyle: string) => ``;
+
+const TITILLIUM_SANSPRO_FONT_PATH =
+ Platform.OS === "android"
+ ? "file:///android_asset/fonts/TitilliumSansPro-Regular.otf"
+ : `${RNFS.MainBundlePath}/TitilliumSansPro-Regular.otf`;
+
+const TITILLIUM_SANSPRO_BOLD_FONT_PATH =
+ Platform.OS === "android"
+ ? "file:///android_asset/fonts/TitilliumSansPro-Bold.otf"
+ : `${RNFS.MainBundlePath}/TitilliumSansPro-Bold.otf`;
+
+const GLOBAL_CSS = `
+
+`;
+
+const avoidTextSelectionCSS = ``;
+
+const generateCustomFontList = ``;
diff --git a/ts/components/ui/ProgressIndicator.tsx b/ts/components/ui/ProgressIndicator.tsx
new file mode 100644
index 00000000000..646aedffce9
--- /dev/null
+++ b/ts/components/ui/ProgressIndicator.tsx
@@ -0,0 +1,14 @@
+import * as React from "react";
+import { ProgressLoader } from "@pagopa/io-app-design-system";
+import { useInteractiveElementDefaultColor } from "../../utils/hooks/theme";
+
+export type ProgressIndicator = Exclude<
+ React.ComponentProps,
+ "color"
+>;
+
+export const ProgressIndicator = (props: ProgressIndicator) => {
+ const blueColor = useInteractiveElementDefaultColor();
+
+ return ;
+};
diff --git a/ts/components/ui/RNavScreenWithLargeHeader.tsx b/ts/components/ui/RNavScreenWithLargeHeader.tsx
index 11e012f0174..59320a8de5d 100644
--- a/ts/components/ui/RNavScreenWithLargeHeader.tsx
+++ b/ts/components/ui/RNavScreenWithLargeHeader.tsx
@@ -22,14 +22,20 @@ import {
import { SupportRequestParams } from "../../hooks/useStartSupportRequest";
import I18n from "../../i18n";
+export type LargeHeaderTitleProps = {
+ label: string;
+ accessibilityLabel?: string;
+ testID?: string;
+};
+
type Props = {
children: React.ReactNode;
fixedBottomSlot?: React.ReactNode;
- title: string;
- titleTestID?: string;
+ title: LargeHeaderTitleProps;
description?: string;
goBack?: BackProps["goBack"];
headerActionsProp?: HeaderActionProps;
+ canGoback?: boolean;
} & SupportRequestParams;
/**
@@ -44,13 +50,14 @@ type Props = {
* @param contextualHelpMarkdown
* @param faqCategories
* @param headerProps
+ * @param canGoback allows to show/not show the back button and consequently does not pass to the HeaderSecondLevel the props that would display the back button
*/
export const RNavScreenWithLargeHeader = ({
children,
fixedBottomSlot,
title,
- titleTestID,
goBack,
+ canGoback = true,
description,
contextualHelp,
contextualHelpMarkdown,
@@ -72,10 +79,8 @@ export const RNavScreenWithLargeHeader = ({
translationY.value = event.contentOffset.y;
});
- const headerProps: ComponentProps = useHeaderProps({
- backAccessibilityLabel: I18n.t("global.buttons.back"),
- goBack: goBack ?? navigation.goBack,
- title,
+ const headerPropsWithoutGoBack = {
+ title: title.label,
scrollValues: {
contentOffsetY: translationY,
triggerOffset: titleHeight
@@ -84,7 +89,17 @@ export const RNavScreenWithLargeHeader = ({
contextualHelpMarkdown,
faqCategories,
...headerActionsProp
- });
+ };
+
+ const headerProps: ComponentProps = useHeaderProps(
+ canGoback
+ ? {
+ ...headerPropsWithoutGoBack,
+ backAccessibilityLabel: I18n.t("global.buttons.back"),
+ goBack: goBack ?? navigation.goBack
+ }
+ : headerPropsWithoutGoBack
+ );
useLayoutEffect(() => {
navigation.setOptions({
@@ -109,7 +124,13 @@ export const RNavScreenWithLargeHeader = ({
style={IOStyles.horizontalContentPadding}
onLayout={getTitleHeight}
>
- {title}
+
+ {title.label}
+
{description && (
diff --git a/ts/components/ui/TextboxWithSuggestion.tsx b/ts/components/ui/TextboxWithSuggestion.tsx
deleted file mode 100644
index 8c72e2d690d..00000000000
--- a/ts/components/ui/TextboxWithSuggestion.tsx
+++ /dev/null
@@ -1,161 +0,0 @@
-import * as React from "react";
-import { ReactNode, useContext, useState } from "react";
-import { Body, Container, Content, Left, Right } from "native-base";
-import { View, StyleSheet, SafeAreaView } from "react-native";
-import { IOColors, Icon, HSpacer, VSpacer } from "@pagopa/io-app-design-system";
-import { H4 } from "../core/typography/H4";
-import { H5 } from "../core/typography/H5";
-import TouchableDefaultOpacity from "../TouchableDefaultOpacity";
-import { IOStyles } from "../core/variables/IOStyles";
-import { LabelledItem } from "../LabelledItem";
-import ButtonDefaultOpacity from "../ButtonDefaultOpacity";
-import AppHeader from "./AppHeader";
-import { LightModalContext } from "./LightModal";
-
-const styles = StyleSheet.create({
- container: {
- borderBottomWidth: 1,
- paddingBottom: 10
- },
- inputContainer: {
- flexDirection: "row",
- justifyContent: "space-between"
- }
-});
-
-/**
- * Props explanation:
- * - onChangeText -> method that notify when the user changes the searching text in the modal.
- * - title -> the title of the modal screen.
- * - label -> displayed on top the search text-box both.
- * - placeholder -> placeholder of the search text-box.
- * - showModalInputTextbox -> boolean that control the input textbox in the modal
- * - wrappedFlatlist -> the Flatlist component that show the suggestions that the user can choose from. Note that if the list needs to react
- * and change the showed data when the text change a connected component that wrap the Flatlist is needed.
- */
-type CommonProps = {
- onChangeText?: (value: string) => void;
- title: string;
- label: string;
- placeholder: string;
- showModalInputTextbox: boolean;
- wrappedFlatlist: ReactNode;
-};
-
-/**
- * Props explanation:
- * - selectedValue -> value to show in the initial textbox.
- * - disabled -> if true disable the onPress on the initial textBox and show the border light gray
- */
-type Props = {
- selectedValue?: string;
- disabled?: boolean;
- onClose?: () => void;
-} & CommonProps;
-
-type ModalProps = {
- onClose: () => void;
-} & CommonProps;
-
-const TextboxWithSuggestionModal = (props: ModalProps) => {
- const [inputValue, setInputValue] = useState("");
- return (
-
-
-
-
-
-
-
-
-
- {props.title}
-
-
-
-
-
-
- {props.showModalInputTextbox && (
- <>
- {
- setInputValue(v);
- props.onChangeText?.(v);
- },
- placeholder: props.placeholder
- }}
- />
-
- >
- )}
- {props.wrappedFlatlist}
-
-
-
- );
-};
-
-/**
- * This component is a wrapper around a modal that contains:
- * - a LabelledItem component
- * - a Flatlist that shows a list of results from which the user has to choose
- * A callback is available:
- * - onChangeText -> executed when the user inserts or cancels some character from the LabelledItem
- * @param props
- * @constructor
- */
-const TextboxWithSuggestion = (props: Props) => {
- const { showModal, hideModal } = useContext(LightModalContext);
-
- const borderBottomColor = props.disabled
- ? IOColors.bluegreyLight
- : IOColors.bluegreyDark;
- return (
- <>
-
-
- {props.label}
-
-
-
-
- showModal(
- {
- hideModal();
- props.onClose?.();
- }}
- onChangeText={props.onChangeText}
- showModalInputTextbox={props.showModalInputTextbox}
- wrappedFlatlist={props.wrappedFlatlist}
- />
- )
- }
- >
- {props.selectedValue ? (
-
- {props.selectedValue}
-
- ) : (
-
- {props.placeholder}
-
- )}
-
-
- >
- );
-};
-
-export default TextboxWithSuggestion;
diff --git a/ts/components/ui/__test__/__snapshots__/BoxedRefreshIndicator.test.tsx.snap b/ts/components/ui/__test__/__snapshots__/BoxedRefreshIndicator.test.tsx.snap
index a0c0c9aebab..bce0f1fd1fe 100644
--- a/ts/components/ui/__test__/__snapshots__/BoxedRefreshIndicator.test.tsx.snap
+++ b/ts/components/ui/__test__/__snapshots__/BoxedRefreshIndicator.test.tsx.snap
@@ -113,6 +113,12 @@ exports[`BoxedRefreshIndicator Should match all-properties snapshot 1`] = `
/>
@@ -284,6 +313,12 @@ exports[`BoxedRefreshIndicator Should match base snapshot 1`] = `
/>
diff --git a/ts/components/ui/__test__/__snapshots__/TabItem.test.tsx.snap b/ts/components/ui/__test__/__snapshots__/TabItem.test.tsx.snap
index 48f7f0caaae..e805818fb1a 100644
--- a/ts/components/ui/__test__/__snapshots__/TabItem.test.tsx.snap
+++ b/ts/components/ui/__test__/__snapshots__/TabItem.test.tsx.snap
@@ -49,7 +49,6 @@ exports[`TabItem should match the snapshot with dark color 1`] = `
align="xMidYMid"
bbHeight={16}
bbWidth={16}
- color={4294967295}
focusable={false}
height={16}
importantForAccessibility="no-hide-descendants"
@@ -72,19 +71,26 @@ exports[`TabItem should match the snapshot with dark color 1`] = `
},
]
}
- tintColor={4294967295}
+ tintColor="#FFFFFF"
vbHeight={24}
vbWidth={24}
width={16}
>
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
- WALLET_HOME
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
-
-exports[`PaymentCardBig component matches snapshot for paypal 1`] = `
-
-
-
-
-
-
-
-
-
-
-
-
- WALLET_HOME
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- someEmail@test.com
-
-
-
-
-
-
-
-
-
-
-
-
-`;
-
-exports[`PaymentCardSmall component matches snapshot for loading 1`] = `
-
-
-
-
-
-
-
-
-
-
-
-
- WALLET_HOME
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
-
-exports[`PaymentCardSmall component matches snapshot for paypal 1`] = `
-
-
-
-
-
-
-
-
-
-
-
-
- WALLET_HOME
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PayPal
-
-
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/ts/components/ui/utils/components/PressableListItemBase.tsx b/ts/components/ui/utils/components/PressableListItemBase.tsx
deleted file mode 100644
index 08d32210ca6..00000000000
--- a/ts/components/ui/utils/components/PressableListItemBase.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import * as React from "react";
-import { Pressable } from "react-native";
-import Animated from "react-native-reanimated";
-import { IOListItemStyles } from "@pagopa/io-app-design-system";
-import { WithTestID } from "../../../../types/WithTestID";
-import { useListItemBaseSpringAnimation } from "../hooks/useListItemBaseSpringAnimation";
-
-export type PressableBaseProps = WithTestID<{
- accessibilityLabel?: string;
- onPress?: () => void;
-}>;
-
-/**
- * A base component for creating pressable list items with animation support.
- *
- * @param {string} accessibilityLabel - An optional label for accessibility.
- * @param {function} onPress - The function to be executed when the item is pressed.
- * @param {string} testID - An optional test identifier for testing purposes.
- * @param {React.ReactNode} children - The content to be rendered within the list item.
- *
- * @deprecated The usage of this component is discouraged as it is being replaced by the PressableListItemBase of the @pagopa/io-app-design-system library.
- *
- */
-export const PressableListItemBase = ({
- onPress,
- testID,
- accessibilityLabel,
- children
-}: React.PropsWithChildren) => {
- const { onPressIn, onPressOut, animatedScaleStyle, animatedBackgroundStyle } =
- useListItemBaseSpringAnimation();
- return (
-
-
-
- {children}
-
-
-
- );
-};
diff --git a/ts/components/wallet/PagoPALogo.tsx b/ts/components/wallet/PagoPALogo.tsx
deleted file mode 100644
index 28b31684287..00000000000
--- a/ts/components/wallet/PagoPALogo.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Render the pagoPA Logo according to the environment (Test or Production)
- */
-import * as React from "react";
-import { Image } from "react-native";
-import { connect } from "react-redux";
-import { isPagoPATestEnabledSelector } from "../../store/reducers/persistedPreferences";
-import { GlobalState } from "../../store/reducers/types";
-
-type Props = ReturnType;
-
-class PagoPALogo extends React.Component {
- public render(): React.ReactNode {
- const { isPagoPATestEnabled } = this.props;
- return isPagoPATestEnabled ? (
-
- ) : (
-
- );
- }
-}
-
-const mapStateToProps = (state: GlobalState) => ({
- isPagoPATestEnabled: isPagoPATestEnabledSelector(state)
-});
-
-export default connect(mapStateToProps)(PagoPALogo);
diff --git a/ts/components/wallet/PaymentsHistoryList.tsx b/ts/components/wallet/PaymentsHistoryList.tsx
index 68e61ce82f6..8e49001fc91 100644
--- a/ts/components/wallet/PaymentsHistoryList.tsx
+++ b/ts/components/wallet/PaymentsHistoryList.tsx
@@ -136,7 +136,9 @@ export default class PaymentHistoryList extends React.Component {
ItemSeparatorComponent={() => (
)}
- ListFooterComponent={payments.length > 0 && }
+ ListFooterComponent={
+ payments.length > 0 ? : null
+ }
keyExtractor={(_, index) => index.toString()}
/>
diff --git a/ts/components/wallet/TransactionsList.tsx b/ts/components/wallet/TransactionsList.tsx
index 991f3c5d623..b2388d525cf 100644
--- a/ts/components/wallet/TransactionsList.tsx
+++ b/ts/components/wallet/TransactionsList.tsx
@@ -80,13 +80,15 @@ export const TransactionsList = (props: Props) => {
!areMoreTransactionsAvailable &&
ListEmptyComponent !== undefined;
- const footerListComponent = (transactions: ReadonlyArray) => {
+ const footerListComponent = (
+ transactions: ReadonlyArray
+ ): React.ComponentProps["ListFooterComponent"] => {
if (!areMoreTransactionsAvailable) {
- return transactions.length > 0 && ;
+ return transactions.length > 0 ? : null;
}
return (
-
+ <>
{
-
+ >
);
};
diff --git a/ts/components/wallet/creditCardOnboardingAttempts/CreditCardAttemptsList.tsx b/ts/components/wallet/creditCardOnboardingAttempts/CreditCardAttemptsList.tsx
index ae0162abf91..c5880589a2b 100644
--- a/ts/components/wallet/creditCardOnboardingAttempts/CreditCardAttemptsList.tsx
+++ b/ts/components/wallet/creditCardOnboardingAttempts/CreditCardAttemptsList.tsx
@@ -22,7 +22,9 @@ type Props = Readonly<{
title: string;
creditCardAttempts: CreditCardInsertionState;
onAttemptPress: (attempt: CreditCardInsertion) => void;
- ListEmptyComponent: React.ReactNode;
+ ListEmptyComponent: React.ComponentProps<
+ typeof FlatList
+ >["ListEmptyComponent"];
}>;
const styles = StyleSheet.create({
@@ -149,7 +151,7 @@ export const CreditCardAttemptsList: React.FC = (props: Props) => {
)}
ListFooterComponent={
- creditCardAttempts.length > 0 &&
+ creditCardAttempts.length > 0 ? : null
}
keyExtractor={c => c.hashedPan}
/>
diff --git a/ts/config.ts b/ts/config.ts
index a7708fd2bc0..324af61d757 100644
--- a/ts/config.ts
+++ b/ts/config.ts
@@ -106,7 +106,7 @@ export const nativeLoginEnabled = Config.NATIVE_LOGIN_ENABLED === "YES";
// Opt-in for reminder push notifications
export const remindersOptInEnabled = Config.REMINDERS_OPT_IN_ENABLED === "YES";
-export const isNewCduFlow = Config.CDU_NEW_FLOW === "YES";
+export const isNewServicesEnabled = Config.NEW_SERVICES_ENABLED === "YES";
export const fetchTimeout = pipe(
parseInt(Config.FETCH_TIMEOUT_MS, 10),
diff --git a/ts/features/barcode/screens/BarcodeScanScreen.tsx b/ts/features/barcode/screens/BarcodeScanScreen.tsx
index b5d54f90311..4094bc40b59 100644
--- a/ts/features/barcode/screens/BarcodeScanScreen.tsx
+++ b/ts/features/barcode/screens/BarcodeScanScreen.tsx
@@ -1,11 +1,15 @@
-import { Divider, ListItemNav, VSpacer } from "@pagopa/io-app-design-system";
+import {
+ Divider,
+ ListItemNav,
+ VSpacer,
+ IOToast
+} from "@pagopa/io-app-design-system";
import { useNavigation } from "@react-navigation/native";
import React from "react";
import { Alert, View } from "react-native";
import ReactNativeHapticFeedback, {
HapticFeedbackTypes
} from "react-native-haptic-feedback";
-import { IOToast } from "../../../components/Toast";
import { useOpenDeepLink } from "../../../hooks/useOpenDeepLink";
import I18n from "../../../i18n";
import { mixpanelTrack } from "../../../mixpanel";
@@ -23,7 +27,7 @@ import {
import { emptyContextualHelp } from "../../../utils/emptyContextualHelp";
import { useIOBottomSheetAutoresizableModal } from "../../../utils/hooks/bottomSheet";
import { IDPayPaymentRoutes } from "../../idpay/payment/navigation/navigator";
-import { WalletPaymentRoutes } from "../../walletV3/payment/navigation/routes";
+import { PaymentsCheckoutRoutes } from "../../payments/checkout/navigation/routes";
import * as analytics from "../analytics";
import { BarcodeScanBaseScreenComponent } from "../components/BarcodeScanBaseScreenComponent";
import { useIOBarcodeFileReader } from "../hooks/useIOBarcodeFileReader";
@@ -38,7 +42,7 @@ import {
} from "../types/IOBarcode";
import { BarcodeFailure } from "../types/failure";
import { getIOBarcodesByType } from "../utils/getBarcodesByType";
-import { WalletBarcodeRoutes } from "../../walletV3/barcode/navigation/routes";
+import { PaymentsBarcodeRoutes } from "../../payments/barcode/navigation/routes";
import { useHardwareBackButton } from "../../../hooks/useHardwareBackButton";
const BarcodeScanScreen = () => {
@@ -92,8 +96,8 @@ const BarcodeScanScreen = () => {
void mixpanelTrack("WALLET_SCAN_POSTE_DATAMATRIX_SUCCESS");
}
- navigation.navigate(WalletBarcodeRoutes.WALLET_BARCODE_MAIN, {
- screen: WalletBarcodeRoutes.WALLET_BARCODE_CHOICE,
+ navigation.navigate(PaymentsBarcodeRoutes.PAYMENT_BARCODE_NAVIGATOR, {
+ screen: PaymentsBarcodeRoutes.PAYMENT_BARCODE_CHOICE,
params: {
barcodes: pagoPABarcodes
}
@@ -172,8 +176,8 @@ const BarcodeScanScreen = () => {
const handlePagoPACodeInput = () => {
manualInputModal.dismiss();
- navigation.navigate(WalletPaymentRoutes.WALLET_PAYMENT_MAIN, {
- screen: WalletPaymentRoutes.WALLET_PAYMENT_INPUT_NOTICE_NUMBER
+ navigation.navigate(PaymentsCheckoutRoutes.PAYMENT_CHECKOUT_NAVIGATOR, {
+ screen: PaymentsCheckoutRoutes.PAYMENT_CHECKOUT_INPUT_NOTICE_NUMBER
});
};
diff --git a/ts/features/bonus/cdc/analytics/index.ts b/ts/features/bonus/cdc/analytics/index.ts
index e208a0f2f58..08a032da3e9 100644
--- a/ts/features/bonus/cdc/analytics/index.ts
+++ b/ts/features/bonus/cdc/analytics/index.ts
@@ -1,6 +1,6 @@
import { getType } from "typesafe-actions";
import * as O from "fp-ts/lib/Option";
-import { pipe } from "fp-ts/lib/function";
+import { constVoid, pipe } from "fp-ts/lib/function";
import { cdcEnabled } from "../../../../config";
import { mixpanel } from "../../../../mixpanel";
import { Action } from "../../../../store/actions/types";
@@ -11,7 +11,7 @@ import {
const trackCdc =
(mp: NonNullable) =>
- (action: Action): Promise => {
+ (action: Action): void => {
switch (action.type) {
case getType(cdcRequestBonusList.request):
case getType(cdcRequestBonusList.success):
@@ -44,10 +44,9 @@ const trackCdc =
return mp.track(action.type, { status: action.payload.kind, value });
}
- return Promise.resolve();
};
const emptyTracking = (_: NonNullable) => (__: Action) =>
- Promise.resolve();
+ constVoid();
export default cdcEnabled ? trackCdc : emptyTracking;
diff --git a/ts/features/bonus/cdc/components/CdcServiceCTA.tsx b/ts/features/bonus/cdc/components/CdcServiceCTA.tsx
index 6734081f3a6..8f97a1107ad 100644
--- a/ts/features/bonus/cdc/components/CdcServiceCTA.tsx
+++ b/ts/features/bonus/cdc/components/CdcServiceCTA.tsx
@@ -1,6 +1,6 @@
import { VSpacer } from "@pagopa/io-app-design-system";
import * as pot from "@pagopa/ts-commons/lib/pot";
-import { useFocusEffect, useNavigation } from "@react-navigation/native";
+import { useFocusEffect } from "@react-navigation/native";
import * as React from "react";
import { useCallback } from "react";
import { View } from "react-native";
@@ -24,12 +24,13 @@ import { CDC_ROUTES } from "../navigation/routes";
import { cdcRequestBonusList } from "../store/actions/cdcBonusRequest";
import { cdcBonusRequestListSelector } from "../store/reducers/cdcBonusRequest";
import { CdcBonusRequestList } from "../types/CdcBonusRequest";
+import { useIONavigation } from "../../../../navigation/params/AppParamsList";
type ReadyButtonProp = {
bonusRequestList: CdcBonusRequestList;
};
const ReadyButton = (props: ReadyButtonProp) => {
- const navigation = useNavigation();
+ const navigation = useIONavigation();
// Check if at least one year can be activable
const activableBonuses = props.bonusRequestList.filter(
diff --git a/ts/features/bonus/cdc/navigation/CdcStackNavigator.tsx b/ts/features/bonus/cdc/navigation/CdcStackNavigator.tsx
index 779732812ff..265aef68509 100644
--- a/ts/features/bonus/cdc/navigation/CdcStackNavigator.tsx
+++ b/ts/features/bonus/cdc/navigation/CdcStackNavigator.tsx
@@ -13,8 +13,7 @@ const Stack = createStackNavigator();
export const CdcStackNavigator = () => (
> => [
@@ -80,7 +79,7 @@ const CdcBonusRequestSelectResidence = () => {
alignItems: "center"
}}
>
-
+
{b.year}
diff --git a/ts/features/bonus/cgn/__e2e__/cgn00.e2e.ts b/ts/features/bonus/cgn/__e2e__/cgn00.e2e.ts
new file mode 100644
index 00000000000..96b609d2db7
--- /dev/null
+++ b/ts/features/bonus/cgn/__e2e__/cgn00.e2e.ts
@@ -0,0 +1,23 @@
+import { e2eWaitRenderTimeout } from "../../../../__e2e__/config";
+import { ensureLoggedIn } from "../../../../__e2e__/utils";
+import I18n from "../../../../i18n";
+import { ID_CGN_TYPE } from "../../common/utils";
+import { activateCGNBonusSuccess, deactivateCGNCardIfNeeded } from "./utils";
+
+describe("CGN", () => {
+ beforeEach(async () => {
+ await deactivateCGNCardIfNeeded();
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("When the user want to start activation from bonus list, it should complete activation", async () => {
+ await element(by.text(I18n.t("global.navigator.wallet"))).tap();
+ await element(by.id("walletAddNewPaymentMethodTestId")).tap();
+ await element(by.id("bonusNameTestId")).tap();
+ const cgnBonusItem = element(by.id(`AvailableBonusItem-${ID_CGN_TYPE}`));
+ await waitFor(cgnBonusItem).toBeVisible().withTimeout(e2eWaitRenderTimeout);
+ await cgnBonusItem.tap();
+ await activateCGNBonusSuccess();
+ });
+});
diff --git a/ts/features/bonus/cgn/__e2e__/cgn01.e2e.ts b/ts/features/bonus/cgn/__e2e__/cgn01.e2e.ts
new file mode 100644
index 00000000000..0a1d0e19508
--- /dev/null
+++ b/ts/features/bonus/cgn/__e2e__/cgn01.e2e.ts
@@ -0,0 +1,23 @@
+import { e2eWaitRenderTimeout } from "../../../../__e2e__/config";
+import { ensureLoggedIn } from "../../../../__e2e__/utils";
+import I18n from "../../../../i18n";
+import { activateCGNBonusSuccess, deactivateCGNCardIfNeeded } from "./utils";
+
+describe("CGN", () => {
+ beforeEach(async () => {
+ await deactivateCGNCardIfNeeded();
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("When the user want to start activation from card carousel, it should complete activation", async () => {
+ await element(by.text(I18n.t("global.navigator.wallet"))).tap();
+ // TODO: This could be fail if we will add more e2e tests on the addition of a new payment method (just do a single swipe, not a scroll)
+ await waitFor(element(by.id("walletPaymentMethodsTestId")))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ await element(by.id("walletPaymentMethodsTestId")).swipe("up");
+ await element(by.id("FeaturedCardCGNTestID")).tap();
+ await activateCGNBonusSuccess();
+ });
+});
diff --git a/ts/features/bonus/cgn/__e2e__/cgn02.e2e.ts b/ts/features/bonus/cgn/__e2e__/cgn02.e2e.ts
new file mode 100644
index 00000000000..ed1a4374236
--- /dev/null
+++ b/ts/features/bonus/cgn/__e2e__/cgn02.e2e.ts
@@ -0,0 +1,35 @@
+import { e2eWaitRenderTimeout } from "../../../../__e2e__/config";
+import { ensureLoggedIn } from "../../../../__e2e__/utils";
+import I18n from "../../../../i18n";
+import { activateCGNBonusSuccess, deactivateCGNCardIfNeeded } from "./utils";
+const CGN_TITLE = "Carta Giovani Nazionale";
+const SERVICES_LIST = "services-list";
+
+describe("CGN", () => {
+ beforeEach(async () => {
+ await deactivateCGNCardIfNeeded();
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("When the user want to start activation from service detail, it should complete activation", async () => {
+ await element(by.text(I18n.t("global.navigator.services"))).tap();
+
+ await waitFor(element(by.id(SERVICES_LIST)))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ await waitFor(element(by.id(CGN_TITLE)))
+ .toBeVisible()
+ .whileElement(by.id(SERVICES_LIST))
+ .scroll(300, "down");
+
+ await element(by.id(CGN_TITLE)).tap();
+ const startActivationCta = element(by.id("service-activate-bonus-button"));
+ await waitFor(startActivationCta)
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ await startActivationCta.tap();
+ await activateCGNBonusSuccess();
+ });
+});
diff --git a/ts/features/bonus/cgn/__e2e__/cgn.e2e.ts b/ts/features/bonus/cgn/__e2e__/utils.ts
similarity index 51%
rename from ts/features/bonus/cgn/__e2e__/cgn.e2e.ts
rename to ts/features/bonus/cgn/__e2e__/utils.ts
index a4f879c725f..dced57ab20b 100644
--- a/ts/features/bonus/cgn/__e2e__/cgn.e2e.ts
+++ b/ts/features/bonus/cgn/__e2e__/utils.ts
@@ -1,13 +1,8 @@
import fetch from "node-fetch";
import { e2eWaitRenderTimeout } from "../../../../__e2e__/config";
-import { ensureLoggedIn } from "../../../../__e2e__/utils";
import I18n from "../../../../i18n";
-import { ID_CGN_TYPE } from "../../common/utils";
-const CGN_TITLE = "Carta Giovani Nazionale";
-const SERVICES_LIST = "services-list";
-
-const activateBonusSuccess = async () => {
+export const activateCGNBonusSuccess = async () => {
const startActivationCta = element(by.id("activate-bonus-button"));
await waitFor(startActivationCta)
.toBeVisible()
@@ -28,7 +23,9 @@ const activateBonusSuccess = async () => {
// The section has a loading spinner on top of
// everything so we must wait for it to disappear
- await waitFor(scrollView).toBeVisible().withTimeout(e2eWaitRenderTimeout);
+ await waitFor(scrollView)
+ .toBeVisible()
+ .withTimeout(2 * e2eWaitRenderTimeout);
// make sure to scroll to bottom, otherwise in small devices the element will not be visible nor tappable
await scrollView.scrollTo("bottom");
@@ -46,67 +43,7 @@ const activateBonusSuccess = async () => {
await alertCTA.tap();
};
-describe("CGN", () => {
- beforeEach(async () => {
- await deactivateCGNCardIfNeeded();
- await device.launchApp({ newInstance: true });
- await ensureLoggedIn();
- });
-
- describe("When the user want to start activation from bonus list", () => {
- it("Should complete activation", async () => {
- await element(by.text(I18n.t("global.navigator.wallet"))).tap();
- await element(by.id("walletAddNewPaymentMethodTestId")).tap();
- await element(by.id("bonusNameTestId")).tap();
- const cgnBonusItem = element(by.id(`AvailableBonusItem-${ID_CGN_TYPE}`));
- await waitFor(cgnBonusItem)
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await cgnBonusItem.tap();
- await activateBonusSuccess();
- });
- });
-
- describe("When the user want to start activation from card carousel", () => {
- it("Should complete activation", async () => {
- await element(by.text(I18n.t("global.navigator.wallet"))).tap();
- // TODO: This could be fail if we will add more e2e tests on the addition of a new payment method (just do a single swipe, not a scroll)
- await waitFor(element(by.id("walletPaymentMethodsTestId")))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await element(by.id("walletPaymentMethodsTestId")).swipe("up");
- await element(by.id("FeaturedCardCGNTestID")).tap();
- await activateBonusSuccess();
- });
- });
-
- describe("When the user want to start activation from service detail", () => {
- it("Should complete activation", async () => {
- await element(by.text(I18n.t("global.navigator.services"))).tap();
-
- await waitFor(element(by.id(SERVICES_LIST)))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- await waitFor(element(by.id(CGN_TITLE)))
- .toBeVisible()
- .whileElement(by.id(SERVICES_LIST))
- .scroll(300, "down");
-
- await element(by.id(CGN_TITLE)).tap();
- const startActivationCta = element(
- by.id("service-activate-bonus-button")
- );
- await waitFor(startActivationCta)
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- await startActivationCta.tap();
- await activateBonusSuccess();
- });
- });
-});
-
-const deactivateCGNCardIfNeeded = async () => {
+export const deactivateCGNCardIfNeeded = async () => {
// This is needed since an E2E can fail at any moment. If it does so
// after the card has been activated, all subsequent retries and tests
// will fail, since the card is already activated. Be aware that this
diff --git a/ts/features/bonus/cgn/analytics/index.ts b/ts/features/bonus/cgn/analytics/index.ts
index 5a33f25f4f8..9de5bf76e5a 100644
--- a/ts/features/bonus/cgn/analytics/index.ts
+++ b/ts/features/bonus/cgn/analytics/index.ts
@@ -31,7 +31,7 @@ import { cgnCategories } from "../store/actions/categories";
const trackCgnAction =
(mp: NonNullable) =>
// eslint-disable-next-line complexity
- (action: Action): Promise => {
+ (action: Action): void => {
switch (action.type) {
case getType(cgnActivationStart):
case getType(cgnRequestActivation):
@@ -86,7 +86,6 @@ const trackCgnAction =
reason: action.payload
});
}
- return Promise.resolve();
};
export default trackCgnAction;
diff --git a/ts/features/bonus/cgn/components/CgnCard.tsx b/ts/features/bonus/cgn/components/CgnCard.tsx
new file mode 100644
index 00000000000..f877d99fa1d
--- /dev/null
+++ b/ts/features/bonus/cgn/components/CgnCard.tsx
@@ -0,0 +1,107 @@
+import { H6, IOColors, LabelSmallAlt, Tag } from "@pagopa/io-app-design-system";
+import { format } from "date-fns";
+import * as React from "react";
+import { Image, StyleSheet, View } from "react-native";
+import cgnLogo from "../../../../../img/bonus/cgn/cgn_logo.png";
+import eycaLogo from "../../../../../img/bonus/cgn/eyca_logo.png";
+import CgnCardShape from "../../../../../img/features/cgn/cgn_card.svg";
+import I18n from "../../../../i18n";
+
+export type CgnCardProps = {
+ expireDate?: Date;
+ withEycaLogo?: boolean;
+};
+
+export const CgnCard = ({ expireDate, withEycaLogo }: CgnCardProps) => {
+ const isExpired = expireDate === undefined;
+
+ const eycaLogoComponent = (
+
+
+
+ );
+
+ const cngLogoComponent = (
+
+
+
+ );
+
+ const expiredTag = (
+
+
+
+ );
+
+ return (
+
+
+
+
+
+
+ {I18n.t("bonus.cgn.name")}
+ {isExpired && expiredTag}
+
+
+ {I18n.t("bonus.cgn.departmentName")}
+
+
+ {expireDate &&
+ I18n.t("bonusCard.validUntil", {
+ endDate: format(expireDate, "MM/YY")
+ })}
+
+
+ {!isExpired && cngLogoComponent}
+ {withEycaLogo && eycaLogoComponent}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ aspectRatio: 16 / 10
+ },
+ card: {
+ position: "absolute",
+ transform: [{ rotateX: "180deg" }],
+ top: 0,
+ bottom: 0,
+ left: 0,
+ right: 0
+ },
+ content: {
+ flex: 1,
+ padding: 16,
+ paddingTop: 12,
+ justifyContent: "space-between"
+ },
+ header: {
+ flexDirection: "row",
+ justifyContent: "space-between",
+ alignItems: "center",
+ height: 48
+ },
+ logoContainer: {
+ position: "absolute",
+ padding: 5,
+ backgroundColor: IOColors.white,
+ borderRadius: 8
+ },
+ logo: {
+ width: 30,
+ height: 30,
+ resizeMode: "contain"
+ }
+});
diff --git a/ts/features/bonus/cgn/components/CgnServiceCTA.tsx b/ts/features/bonus/cgn/components/CgnServiceCTA.tsx
index d4020fdc427..7ceaffee6c6 100644
--- a/ts/features/bonus/cgn/components/CgnServiceCTA.tsx
+++ b/ts/features/bonus/cgn/components/CgnServiceCTA.tsx
@@ -7,15 +7,15 @@ import { Label } from "../../../../components/core/typography/Label";
import ButtonDefaultOpacity from "../../../../components/ButtonDefaultOpacity";
import I18n from "../../../../i18n";
import { useIODispatch, useIOSelector } from "../../../../store/hooks";
-import { servicePreferenceSelector } from "../../../../store/reducers/entities/services/servicePreference";
-import { isServicePreferenceResponseSuccess } from "../../../../types/services/ServicePreferenceResponse";
+import { servicePreferenceSelector } from "../../../services/store/reducers/servicePreference";
+import { isServicePreferenceResponseSuccess } from "../../../services/types/ServicePreferenceResponse";
import { ServiceId } from "../../../../../definitions/backend/ServiceId";
import { cgnActivationStart } from "../store/actions/activation";
import { cgnUnsubscribe } from "../store/actions/unsubscribe";
import { fold, isLoading } from "../../../../common/model/RemoteValue";
import { showToast } from "../../../../utils/showToast";
import { cgnUnsubscribeSelector } from "../store/reducers/unsubscribe";
-import { loadServicePreference } from "../../../../store/actions/services/servicePreference";
+import { loadServicePreference } from "../../../services/store/actions";
import ActivityIndicator from "../../../../components/ui/ActivityIndicator";
import { loadAvailableBonuses } from "../../common/store/actions/availableBonusesTypes";
diff --git a/ts/features/bonus/cgn/components/CgnWalletCard.tsx b/ts/features/bonus/cgn/components/CgnWalletCard.tsx
new file mode 100644
index 00000000000..2af7ddb8784
--- /dev/null
+++ b/ts/features/bonus/cgn/components/CgnWalletCard.tsx
@@ -0,0 +1,40 @@
+import * as pot from "@pagopa/ts-commons/lib/pot";
+import * as O from "fp-ts/lib/Option";
+import { pipe } from "fp-ts/lib/function";
+import * as React from "react";
+import { Pressable } from "react-native";
+import { useIONavigation } from "../../../../navigation/params/AppParamsList";
+import { useIOSelector } from "../../../../store/hooks";
+import { profileSelector } from "../../../../store/reducers/profile";
+import { withWalletCardBaseComponent } from "../../../newWallet/components/WalletCardBaseComponent";
+import CGN_ROUTES from "../navigation/routes";
+import { CgnCard, CgnCardProps } from "./CgnCard";
+
+export type CgnWalletCardProps = CgnCardProps;
+
+const WrappedCgnCard = (props: CgnWalletCardProps) => {
+ const navigation = useIONavigation();
+ const profilePot = useIOSelector(profileSelector);
+
+ const isUnder31 = pipe(
+ pot.toOption(profilePot),
+ O.chainNullableK(({ date_of_birth }) => date_of_birth),
+ O.map(birthDate => new Date().getFullYear() - birthDate.getFullYear()),
+ O.map(years => years < 31),
+ O.getOrElse(() => false)
+ );
+
+ const handleCardPress = () => {
+ navigation.navigate(CGN_ROUTES.DETAILS.MAIN, {
+ screen: CGN_ROUTES.DETAILS.DETAILS
+ });
+ };
+
+ return (
+
+
+
+ );
+};
+
+export const CgnWalletCard = withWalletCardBaseComponent(WrappedCgnCard);
diff --git a/ts/features/bonus/cgn/components/__test__/CgnCard.test.tsx b/ts/features/bonus/cgn/components/__test__/CgnCard.test.tsx
new file mode 100644
index 00000000000..8c2e8e4826c
--- /dev/null
+++ b/ts/features/bonus/cgn/components/__test__/CgnCard.test.tsx
@@ -0,0 +1,68 @@
+import { render } from "@testing-library/react-native";
+import { format } from "date-fns";
+import * as React from "react";
+import I18n from "../../../../../i18n";
+import { CgnCard } from "../CgnCard";
+
+describe("CgnCard", () => {
+ it("should match the snapshot", () => {
+ const component = render(
+
+ );
+ expect(component).toMatchSnapshot();
+ });
+ it("should correctly render a valid card with EYCA logo", () => {
+ const expireDate = new Date(2023, 11, 2);
+ const { queryByTestId, queryByText } = render(
+
+ );
+ expect(queryByTestId("cgnLogoTestID")).not.toBeNull();
+ expect(queryByTestId("cgnExpiredTagTestID")).toBeNull();
+ expect(queryByTestId("cgnEycaLogoTestID")).not.toBeNull();
+ expect(queryByText(I18n.t("bonus.cgn.name"))).not.toBeNull();
+ expect(queryByText(I18n.t("bonus.cgn.departmentName"))).not.toBeNull();
+ expect(
+ queryByText(
+ I18n.t("bonusCard.validUntil", {
+ endDate: format(expireDate, "MM/YY")
+ })
+ )
+ ).not.toBeNull();
+ });
+ it("should correctly render a valid card without EYCA logo", () => {
+ const expireDate = new Date(2023, 11, 2);
+ const { queryByTestId, queryByText } = render(
+
+ );
+ expect(queryByTestId("cgnLogoTestID")).not.toBeNull();
+ expect(queryByTestId("cgnExpiredTagTestID")).toBeNull();
+ expect(queryByTestId("cgnEycaLogoTestID")).toBeNull();
+ expect(queryByText(I18n.t("bonus.cgn.name"))).not.toBeNull();
+ expect(queryByText(I18n.t("bonus.cgn.departmentName"))).not.toBeNull();
+ expect(
+ queryByText(
+ I18n.t("bonusCard.validUntil", {
+ endDate: format(expireDate, "MM/YY")
+ })
+ )
+ ).not.toBeNull();
+ });
+ it("should correctly render an expired card with EYCA logo", () => {
+ const { queryByTestId, queryByText } = render(
+
+ );
+ expect(queryByTestId("cgnLogoTestID")).toBeNull();
+ expect(queryByTestId("cgnExpiredTagTestID")).not.toBeNull();
+ expect(queryByTestId("cgnEycaLogoTestID")).not.toBeNull();
+ expect(queryByText(I18n.t("bonus.cgn.name"))).not.toBeNull();
+ expect(queryByText(I18n.t("bonus.cgn.departmentName"))).not.toBeNull();
+ });
+ it("should correctly render an expired card without EYCA logo", () => {
+ const { queryByTestId, queryByText } = render( );
+ expect(queryByTestId("cgnLogoTestID")).toBeNull();
+ expect(queryByTestId("cgnExpiredTagTestID")).not.toBeNull();
+ expect(queryByTestId("cgnEycaLogoTestID")).toBeNull();
+ expect(queryByText(I18n.t("bonus.cgn.name"))).not.toBeNull();
+ expect(queryByText(I18n.t("bonus.cgn.departmentName"))).not.toBeNull();
+ });
+});
diff --git a/ts/features/bonus/cgn/components/__test__/__snapshots__/CgnCard.test.tsx.snap b/ts/features/bonus/cgn/components/__test__/__snapshots__/CgnCard.test.tsx.snap
new file mode 100644
index 00000000000..a0e44d51a06
--- /dev/null
+++ b/ts/features/bonus/cgn/components/__test__/__snapshots__/CgnCard.test.tsx.snap
@@ -0,0 +1,209 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CgnCard should match the snapshot 1`] = `
+
+
+
+
+
+
+
+ Carta Giovani Nazionale
+
+
+
+ Dipartimento per le politiche giovanili e il servizio civile universale
+
+
+ Valida fino al 12/23
+
+
+
+
+
+
+
+
+
+`;
diff --git a/ts/features/bonus/cgn/components/detail/CgnUnsubscribe.tsx b/ts/features/bonus/cgn/components/detail/CgnUnsubscribe.tsx
index ec0eebcd348..96a3d46f548 100644
--- a/ts/features/bonus/cgn/components/detail/CgnUnsubscribe.tsx
+++ b/ts/features/bonus/cgn/components/detail/CgnUnsubscribe.tsx
@@ -1,7 +1,7 @@
import * as React from "react";
import { useEffect, useRef } from "react";
import { View, Alert } from "react-native";
-import { LabelLink } from "@pagopa/io-app-design-system";
+import { LabelLink, IOToast } from "@pagopa/io-app-design-system";
import { useIODispatch, useIOSelector } from "../../../../../store/hooks";
import { cgnUnsubscribeSelector } from "../../store/reducers/unsubscribe";
@@ -10,7 +10,6 @@ import { cgnUnsubscribe } from "../../store/actions/unsubscribe";
import { isError, isReady } from "../../../../../common/model/RemoteValue";
import { navigateBack } from "../../../../../store/actions/navigation";
import { cgnDetails } from "../../store/actions/details";
-import { IOToast } from "../../../../../components/Toast";
const CgnUnsubscribe = () => {
const dispatch = useIODispatch();
diff --git a/ts/features/bonus/cgn/components/detail/eyca/EycaInformationComponent.tsx b/ts/features/bonus/cgn/components/detail/eyca/EycaInformationComponent.tsx
index 46bd06d3d2e..c27021a1d94 100644
--- a/ts/features/bonus/cgn/components/detail/eyca/EycaInformationComponent.tsx
+++ b/ts/features/bonus/cgn/components/detail/eyca/EycaInformationComponent.tsx
@@ -1,12 +1,11 @@
import * as React from "react";
import { View } from "react-native";
-import { ButtonOutline, VSpacer } from "@pagopa/io-app-design-system";
-import Markdown from "../../../../../../components/ui/Markdown";
+import { ButtonOutline, VSpacer, IOToast } from "@pagopa/io-app-design-system";
+import LegacyMarkdown from "../../../../../../components/ui/Markdown/LegacyMarkdown";
import I18n from "../../../../../../i18n";
import { useIOBottomSheetAutoresizableModal } from "../../../../../../utils/hooks/bottomSheet";
import { openWebUrl } from "../../../../../../utils/url";
import { EYCA_WEBSITE_BASE_URL } from "../../../utils/constants";
-import { IOToast } from "../../../../../../components/Toast";
/**
* this component shows information about EYCA card. It is included within a bottom sheet
@@ -18,9 +17,12 @@ const EycaInformationComponent: React.FunctionComponent = () => {
- setMarkdownloaded(true)}>
+ setMarkdownloaded(true)}
+ >
{I18n.t("bonus.cgn.detail.status.eycaDescription")}
-
+
{isMarkdownloaded && (
void;
diff --git a/ts/features/bonus/cgn/components/detail/eyca/EycaStatusDetailsComponent.tsx b/ts/features/bonus/cgn/components/detail/eyca/EycaStatusDetailsComponent.tsx
index 7eb20a9b9e1..813ee5689f4 100644
--- a/ts/features/bonus/cgn/components/detail/eyca/EycaStatusDetailsComponent.tsx
+++ b/ts/features/bonus/cgn/components/detail/eyca/EycaStatusDetailsComponent.tsx
@@ -6,6 +6,7 @@ import {
HSpacer,
VSpacer,
IOSpacingScale,
+ IOToast,
Badge,
ButtonOutline
} from "@pagopa/io-app-design-system";
@@ -23,7 +24,6 @@ import { clipboardSetStringWithFeedback } from "../../../../../../utils/clipboar
import TouchableDefaultOpacity from "../../../../../../components/TouchableDefaultOpacity";
import { openWebUrl } from "../../../../../../utils/url";
import { EYCA_WEBSITE_DISCOUNTS_PAGE_URL } from "../../../utils/constants";
-import { IOToast } from "../../../../../../components/Toast";
type Props = {
eycaCard: EycaCardActivated | EycaCardExpired | EycaCardRevoked;
diff --git a/ts/features/bonus/cgn/components/merchants/CgnDiscountDetail.tsx b/ts/features/bonus/cgn/components/merchants/CgnDiscountDetail.tsx
index 84ce1f6c391..3d3f8e40800 100644
--- a/ts/features/bonus/cgn/components/merchants/CgnDiscountDetail.tsx
+++ b/ts/features/bonus/cgn/components/merchants/CgnDiscountDetail.tsx
@@ -8,6 +8,7 @@ import {
HSpacer,
VSpacer,
Icon,
+ IOToast,
IOIconSizeScale,
ButtonOutline
} from "@pagopa/io-app-design-system";
@@ -25,7 +26,6 @@ import { mixpanelTrack } from "../../../../../mixpanel";
import { useIOSelector } from "../../../../../store/hooks";
import { profileSelector } from "../../../../../store/reducers/profile";
import { localeDateFormat } from "../../../../../utils/locale";
-import { IOToast } from "../../../../../components/Toast";
import { openWebUrl } from "../../../../../utils/url";
import { getCgnUserAgeRange } from "../../utils/dates";
import { getCategorySpecs } from "../../utils/filters";
diff --git a/ts/features/bonus/cgn/components/merchants/CgnMerchantsListView.tsx b/ts/features/bonus/cgn/components/merchants/CgnMerchantsListView.tsx
index 3308dbca6db..be91b904616 100644
--- a/ts/features/bonus/cgn/components/merchants/CgnMerchantsListView.tsx
+++ b/ts/features/bonus/cgn/components/merchants/CgnMerchantsListView.tsx
@@ -43,7 +43,7 @@ const CgnMerchantsListView: React.FunctionComponent = (props: Props) => {
keyExtractor={c => c.id}
keyboardShouldPersistTaps={"handled"}
ListFooterComponent={
- props.merchantList.length > 0 &&
+ props.merchantList.length > 0 ? : null
}
/>
diff --git a/ts/features/bonus/cgn/components/merchants/__test__/__snapshots__/CgnDiscountDetail.test.tsx.snap b/ts/features/bonus/cgn/components/merchants/__test__/__snapshots__/CgnDiscountDetail.test.tsx.snap
index 900c53e914d..33405951ef8 100644
--- a/ts/features/bonus/cgn/components/merchants/__test__/__snapshots__/CgnDiscountDetail.test.tsx.snap
+++ b/ts/features/bonus/cgn/components/merchants/__test__/__snapshots__/CgnDiscountDetail.test.tsx.snap
@@ -128,7 +128,6 @@ exports[`when rendering on match snapshot for OTP discount 1`] = `
align="xMidYMid"
bbHeight={24}
bbWidth={24}
- color={4278219750}
focusable={false}
height={24}
importantForAccessibility="no-hide-descendants"
@@ -151,19 +150,26 @@ exports[`when rendering on match snapshot for OTP discount 1`] = `
},
]
}
- tintColor={4278219750}
+ tintColor="#0073E6"
vbHeight={24}
vbWidth={24}
width={24}
>
-
+
-
+
-
+
= {
[CGN_ROUTES.DETAILS.MAIN]: {
path: "cgn-details",
screens: {
@@ -48,8 +51,7 @@ const ActivationStack = createStackNavigator();
export const CgnActivationNavigator = () => (
();
export const CgnDetailsNavigator = () => (
();
export const CgnEYCAActivationNavigator = () => (
["getCgnStatus"],
@@ -30,7 +32,23 @@ export function* cgnGetInformationSaga(
E.isRight(cgnInformationResult) &&
cgnInformationResult.right.status === 200
) {
- yield* put(cgnDetails.success(cgnInformationResult.right.value));
+ const cgnInfo = cgnInformationResult.right.value;
+ const expireDate =
+ cgnInfo.status === StatusEnum.ACTIVATED
+ ? cgnInfo.expiration_date
+ : undefined;
+
+ yield* put(
+ walletAddCards([
+ {
+ type: "cgn",
+ category: "cgn",
+ key: "cgn_card",
+ expireDate
+ }
+ ])
+ );
+ yield* put(cgnDetails.success(cgnInfo));
} else {
yield* put(
cgnDetails.failure({
diff --git a/ts/features/bonus/cgn/saga/orchestration/activation/activationSaga.ts b/ts/features/bonus/cgn/saga/orchestration/activation/activationSaga.ts
index 001e9abb69b..4c76242618e 100644
--- a/ts/features/bonus/cgn/saga/orchestration/activation/activationSaga.ts
+++ b/ts/features/bonus/cgn/saga/orchestration/activation/activationSaga.ts
@@ -1,6 +1,8 @@
+import { CommonActions } from "@react-navigation/native";
import { SagaIterator } from "redux-saga";
import { call } from "typed-redux-saga/macro";
import NavigationService from "../../../../../../navigation/NavigationService";
+import ROUTES from "../../../../../../navigation/routes";
import {
executeWorkUnit,
withResetNavigationStack
@@ -8,6 +10,7 @@ import {
import { navigateBack } from "../../../../../../store/actions/navigation";
import { SagaCallReturnType } from "../../../../../../types/utils";
import { MESSAGES_ROUTES } from "../../../../../messages/navigation/routes";
+import { WalletRoutes } from "../../../../../newWallet/navigation/routes";
import { BONUS_ROUTES } from "../../../../common/navigation/navigator";
import {
navigateToCgnActivationInformationTos,
@@ -45,12 +48,38 @@ export function* handleCgnStartActivationSaga(): SagaIterator {
);
if (initialScreen?.name === CGN_ROUTES.ACTIVATION.CTA_START_CGN) {
- yield* call(NavigationService.navigate, MESSAGES_ROUTES.MESSAGES_HOME);
+ yield* call(NavigationService.navigate, ROUTES.MAIN, {
+ screen: MESSAGES_ROUTES.MESSAGES_HOME
+ });
}
if (result === "completed") {
if (initialScreen?.name === BONUS_ROUTES.BONUS_AVAILABLE_LIST) {
yield* call(navigateBack);
+ yield* call(navigateToCgnDetails);
+ } else if (initialScreen?.name === WalletRoutes.WALLET_CARD_ONBOARDING) {
+ yield* call(
+ NavigationService.dispatchNavigationAction,
+ CommonActions.reset({
+ index: 0,
+ routes: [
+ {
+ name: ROUTES.MAIN,
+ params: {
+ screen: ROUTES.WALLET_HOME,
+ params: { newMethodAdded: true }
+ }
+ },
+ {
+ name: CGN_ROUTES.DETAILS.MAIN,
+ params: {
+ screen: CGN_ROUTES.DETAILS.DETAILS
+ }
+ }
+ ]
+ })
+ );
+ } else {
+ yield* call(navigateToCgnDetails);
}
- yield* call(navigateToCgnDetails);
}
}
diff --git a/ts/features/bonus/cgn/screens/activation/CgnActivationCompletedScreen.tsx b/ts/features/bonus/cgn/screens/activation/CgnActivationCompletedScreen.tsx
index 33b2b6d96c8..c2f24ea5eac 100644
--- a/ts/features/bonus/cgn/screens/activation/CgnActivationCompletedScreen.tsx
+++ b/ts/features/bonus/cgn/screens/activation/CgnActivationCompletedScreen.tsx
@@ -1,57 +1,32 @@
import * as React from "react";
-import { connect } from "react-redux";
-import { SafeAreaView, View } from "react-native";
-import { FooterWithButtons } from "@pagopa/io-app-design-system";
-
-import { GlobalState } from "../../../../../store/reducers/types";
-import { Dispatch } from "../../../../../store/actions/types";
-import { InfoScreenComponent } from "../../../../../components/infoScreen/InfoScreenComponent";
-import { IOStyles } from "../../../../../components/core/variables/IOStyles";
import { cgnActivationComplete } from "../../store/actions/activation";
import I18n from "../../../../../i18n";
-import paymentCompleted from "../../../../../../img/pictograms/payment-completed.png";
-import { renderInfoRasterImage } from "../../../../../components/infoScreen/imageRendering";
-
-type Props = ReturnType &
- ReturnType;
+import { useIODispatch } from "../../../../../store/hooks";
+import { OperationResultScreenContent } from "../../../../../components/screens/OperationResultScreenContent";
/**
* Screen which is displayed when a user requested a CGN activation
* and it has been correctly activated
*/
-const CgnActivationCompletedScreen = (props: Props): React.ReactElement => (
-
- {
+ const dispatch = useIODispatch();
+ const onConfirm = React.useCallback(() => {
+ dispatch(cgnActivationComplete());
+ }, [dispatch]);
+
+ return (
+
-
-
-
-
-);
-
-const mapStateToProps = (_: GlobalState) => ({});
-
-const mapDispatchToProps = (dispatch: Dispatch) => ({
- onConfirm: () => {
- dispatch(cgnActivationComplete());
- }
-});
+ );
+};
-export default connect(
- mapStateToProps,
- mapDispatchToProps
-)(CgnActivationCompletedScreen);
+export default CgnActivationCompletedScreen;
diff --git a/ts/features/bonus/cgn/screens/activation/CgnActivationIneligibleScreen.tsx b/ts/features/bonus/cgn/screens/activation/CgnActivationIneligibleScreen.tsx
index e8a90eedf46..baf5ee88bba 100644
--- a/ts/features/bonus/cgn/screens/activation/CgnActivationIneligibleScreen.tsx
+++ b/ts/features/bonus/cgn/screens/activation/CgnActivationIneligibleScreen.tsx
@@ -1,53 +1,31 @@
import * as React from "react";
-import { connect } from "react-redux";
-import { SafeAreaView, View } from "react-native";
-import { FooterWithButtons } from "@pagopa/io-app-design-system";
-import { GlobalState } from "../../../../../store/reducers/types";
-import { Dispatch } from "../../../../../store/actions/types";
-import { InfoScreenComponent } from "../../../../../components/infoScreen/InfoScreenComponent";
-import { renderInfoRasterImage } from "../../../../../components/infoScreen/imageRendering";
-import { IOStyles } from "../../../../../components/core/variables/IOStyles";
import { cgnActivationCancel } from "../../store/actions/activation";
-import image from "../../../../../../img/servicesStatus/error-detail-icon.png";
import I18n from "../../../../../i18n";
-
-type Props = ReturnType &
- ReturnType;
+import { useIODispatch } from "../../../../../store/hooks";
+import { OperationResultScreenContent } from "../../../../../components/screens/OperationResultScreenContent";
/**
* Screen which is displayed when a user requested a CGN activation
* but is not eligible for its activation
*/
-const CgnActivationIneligibleScreen = (props: Props): React.ReactElement => (
-
- {
+ const dispatch = useIODispatch();
+ const onExit = React.useCallback(
+ () => dispatch(cgnActivationCancel()),
+ [dispatch]
+ );
+ return (
+
-
-
-
-
-);
-
-const mapStateToProps = (_: GlobalState) => ({});
-
-const mapDispatchToProps = (dispatch: Dispatch) => ({
- onCancel: () => dispatch(cgnActivationCancel())
-});
+ );
+};
-export default connect(
- mapStateToProps,
- mapDispatchToProps
-)(CgnActivationIneligibleScreen);
+export default CgnActivationIneligibleScreen;
diff --git a/ts/features/bonus/cgn/screens/activation/CgnActivationPendingScreen.tsx b/ts/features/bonus/cgn/screens/activation/CgnActivationPendingScreen.tsx
index e0a7f2278e0..bbae18593f9 100644
--- a/ts/features/bonus/cgn/screens/activation/CgnActivationPendingScreen.tsx
+++ b/ts/features/bonus/cgn/screens/activation/CgnActivationPendingScreen.tsx
@@ -1,54 +1,32 @@
import * as React from "react";
-import { connect } from "react-redux";
-import { SafeAreaView, View } from "react-native";
-import { FooterWithButtons } from "@pagopa/io-app-design-system";
-
-import { GlobalState } from "../../../../../store/reducers/types";
-import { Dispatch } from "../../../../../store/actions/types";
-import { IOStyles } from "../../../../../components/core/variables/IOStyles";
-import { InfoScreenComponent } from "../../../../../components/infoScreen/InfoScreenComponent";
-import { renderInfoRasterImage } from "../../../../../components/infoScreen/imageRendering";
-import image from "../../../../../../img/messages/empty-message-list-icon.png";
import I18n from "../../../../../i18n";
import { cgnActivationCancel } from "../../store/actions/activation";
-
-type Props = ReturnType &
- ReturnType;
+import { useIODispatch } from "../../../../../store/hooks";
+import { OperationResultScreenContent } from "../../../../../components/screens/OperationResultScreenContent";
/**
* Screen which is displayed when a user requested a CGN activation
* and the server has already another request pending for the user
*/
-const CgnActivationPendingScreen = (props: Props): React.ReactElement => (
-
- {
+ const dispatch = useIODispatch();
+ const onExit = React.useCallback(
+ () => dispatch(cgnActivationCancel()),
+ [dispatch]
+ );
+
+ return (
+
-
-
-
-
-);
-
-const mapStateToProps = (_: GlobalState) => ({});
-
-const mapDispatchToProps = (dispatch: Dispatch) => ({
- onExit: () => dispatch(cgnActivationCancel())
-});
+ );
+};
-export default connect(
- mapStateToProps,
- mapDispatchToProps
-)(CgnActivationPendingScreen);
+export default CgnActivationPendingScreen;
diff --git a/ts/features/bonus/cgn/screens/activation/CgnActivationTimeoutScreen.tsx b/ts/features/bonus/cgn/screens/activation/CgnActivationTimeoutScreen.tsx
index 8dafd6abd3d..d472c6135ef 100644
--- a/ts/features/bonus/cgn/screens/activation/CgnActivationTimeoutScreen.tsx
+++ b/ts/features/bonus/cgn/screens/activation/CgnActivationTimeoutScreen.tsx
@@ -1,34 +1,33 @@
import * as React from "react";
-import { connect } from "react-redux";
-import { GlobalState } from "../../../../../store/reducers/types";
-import { Dispatch } from "../../../../../store/actions/types";
-import { BaseTimeoutScreen } from "../../../common/BaseTimeoutScreen";
import { cgnActivationCancel } from "../../store/actions/activation";
import I18n from "../../../../../i18n";
-
-type Props = ReturnType &
- ReturnType;
+import { useIODispatch } from "../../../../../store/hooks";
+import { OperationResultScreenContent } from "../../../../../components/screens/OperationResultScreenContent";
/**
* Screen which is displayed when a user requested a CGN activation
* and it took too long to get an answer from the server
* (the user will be notified when the activation is completed by a message)
*/
-const CgnActivationTimeoutScreen = (props: Props): React.ReactElement => (
-
-);
-
-const mapStateToProps = (_: GlobalState) => ({});
+const CgnActivationTimeoutScreen = () => {
+ const dispatch = useIODispatch();
+ const onExit = React.useCallback(
+ () => dispatch(cgnActivationCancel()),
+ [dispatch]
+ );
-const mapDispatchToProps = (dispatch: Dispatch) => ({
- onExit: () => dispatch(cgnActivationCancel())
-});
+ return (
+
+ );
+};
-export default connect(
- mapStateToProps,
- mapDispatchToProps
-)(CgnActivationTimeoutScreen);
+export default CgnActivationTimeoutScreen;
diff --git a/ts/features/bonus/cgn/screens/activation/CgnAlreadyActiveScreen.tsx b/ts/features/bonus/cgn/screens/activation/CgnAlreadyActiveScreen.tsx
index dd86514c0e3..e21b833213f 100644
--- a/ts/features/bonus/cgn/screens/activation/CgnAlreadyActiveScreen.tsx
+++ b/ts/features/bonus/cgn/screens/activation/CgnAlreadyActiveScreen.tsx
@@ -1,58 +1,39 @@
import * as React from "react";
-import { connect } from "react-redux";
-import { SafeAreaView, View } from "react-native";
-import { FooterWithButtons } from "@pagopa/io-app-design-system";
-import { GlobalState } from "../../../../../store/reducers/types";
-import { Dispatch } from "../../../../../store/actions/types";
-import { InfoScreenComponent } from "../../../../../components/infoScreen/InfoScreenComponent";
-import { renderInfoRasterImage } from "../../../../../components/infoScreen/imageRendering";
-import { IOStyles } from "../../../../../components/core/variables/IOStyles";
import { cgnActivationCancel } from "../../store/actions/activation";
-import image from "../../../../../../img/messages/empty-due-date-list-icon.png";
import I18n from "../../../../../i18n";
-import { navigateToCgnDetails } from "../../navigation/actions";
-
-type Props = ReturnType &
- ReturnType;
+import { useIODispatch } from "../../../../../store/hooks";
+import { useIONavigation } from "../../../../../navigation/params/AppParamsList";
+import CGN_ROUTES from "../../navigation/routes";
+import { OperationResultScreenContent } from "../../../../../components/screens/OperationResultScreenContent";
/**
* Screen which is displayed when a user requested a CGN activation
* but it is yet active
*/
-const CgnAlreadyActiveScreen = (props: Props): React.ReactElement => (
-
-
-
-
-
-
-);
-
-const mapStateToProps = (_: GlobalState) => ({});
+const CgnAlreadyActiveScreen = () => {
+ const dispatch = useIODispatch();
+ const navigation = useIONavigation();
-const mapDispatchToProps = (dispatch: Dispatch) => ({
- navigateToDetail: () => {
+ const navigateToDetail = React.useCallback(() => {
dispatch(cgnActivationCancel());
- navigateToCgnDetails();
- }
-});
+ navigation.navigate(CGN_ROUTES.DETAILS.MAIN, {
+ screen: CGN_ROUTES.DETAILS.DETAILS
+ });
+ }, [dispatch, navigation]);
+
+ return (
+
+ );
+};
-export default connect(
- mapStateToProps,
- mapDispatchToProps
-)(CgnAlreadyActiveScreen);
+export default CgnAlreadyActiveScreen;
diff --git a/ts/features/bonus/cgn/screens/merchants/CgnMerchantsCategoriesSelectionScreen.tsx b/ts/features/bonus/cgn/screens/merchants/CgnMerchantsCategoriesSelectionScreen.tsx
index 0e2170aa72e..f3add25c6cd 100644
--- a/ts/features/bonus/cgn/screens/merchants/CgnMerchantsCategoriesSelectionScreen.tsx
+++ b/ts/features/bonus/cgn/screens/merchants/CgnMerchantsCategoriesSelectionScreen.tsx
@@ -9,6 +9,7 @@ import {
getGradientColorValues,
VSpacer,
Badge,
+ IOToast,
Icon
} from "@pagopa/io-app-design-system";
import { ProductCategoryWithNewDiscountsCount } from "../../../../../../definitions/cgn/merchants/ProductCategoryWithNewDiscountsCount";
@@ -26,7 +27,6 @@ import CGN_ROUTES from "../../navigation/routes";
import { cgnCategories } from "../../store/actions/categories";
import { cgnCategoriesListSelector } from "../../store/reducers/categories";
import { getCategorySpecs } from "../../utils/filters";
-import { IOToast } from "../../../../../components/Toast";
const CgnMerchantsCategoriesSelectionScreen = () => {
const isFirstRender = useRef(true);
diff --git a/ts/features/bonus/common/BaseTimeoutScreen.tsx b/ts/features/bonus/common/BaseTimeoutScreen.tsx
deleted file mode 100644
index c6cdc7c0fcc..00000000000
--- a/ts/features/bonus/common/BaseTimeoutScreen.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import * as React from "react";
-import { SafeAreaView } from "react-native";
-import image from "../../../../img/wallet/errors/payment-expired-icon.png";
-import { IOStyles } from "../../../components/core/variables/IOStyles";
-import { renderInfoRasterImage } from "../../../components/infoScreen/imageRendering";
-import { InfoScreenComponent } from "../../../components/infoScreen/InfoScreenComponent";
-import I18n from "../../../i18n";
-import { cancelButtonProps } from "../../../components/buttons/ButtonConfigurations";
-import { FooterStackButton } from "../../../components/buttons/FooterStackButtons";
-
-type Props = {
- title: string;
- body: string | React.ReactNode;
- onExit: () => void;
-};
-
-/**
- * This screen informs the user that the request takes longer than necessary to be completed
- * and will receive a notification with the outcome of the operation.
- * @param props
- * @constructor
- */
-
-export const BaseTimeoutScreen: React.FunctionComponent = props => {
- const confirmText = I18n.t("global.buttons.exit");
- return (
-
-
-
-
- );
-};
diff --git a/ts/features/bonus/common/components/BonusInformationComponent.tsx b/ts/features/bonus/common/components/BonusInformationComponent.tsx
index f5f9f6a0788..9e8034b9fbc 100644
--- a/ts/features/bonus/common/components/BonusInformationComponent.tsx
+++ b/ts/features/bonus/common/components/BonusInformationComponent.tsx
@@ -30,7 +30,7 @@ import ItemSeparatorComponent from "../../../../components/ItemSeparatorComponen
import BaseScreenComponent from "../../../../components/screens/BaseScreenComponent";
import { EdgeBorderComponent } from "../../../../components/screens/EdgeBorderComponent";
import { LightModalContextInterface } from "../../../../components/ui/LightModal";
-import Markdown from "../../../../components/ui/Markdown";
+import LegacyMarkdown from "../../../../components/ui/Markdown/LegacyMarkdown";
import I18n from "../../../../i18n";
import customVariables from "../../../../theme/variables";
import { useScreenReaderEnabled } from "../../../../utils/accessibility";
@@ -129,7 +129,7 @@ const getTosFooter = (
-
@@ -138,7 +138,7 @@ const getTosFooter = (
regulationLink: rU.url,
tosUrl: bT
})}
-
+
>
)
)
@@ -259,13 +259,13 @@ const BonusInformationComponent: React.FunctionComponent = props => {
-
{bonusTypeLocalizedContent.content}
-
+
{isMarkdownLoaded && renderUrls()}
{getTosFooter(
diff --git a/ts/features/bonus/common/components/DeclarationEntry.tsx b/ts/features/bonus/common/components/DeclarationEntry.tsx
deleted file mode 100644
index fea7b09b00d..00000000000
--- a/ts/features/bonus/common/components/DeclarationEntry.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import * as React from "react";
-import { View, StyleSheet, TouchableWithoutFeedback } from "react-native";
-import { HSpacer, VSpacer } from "@pagopa/io-app-design-system";
-import { Body } from "../../../../components/core/typography/Body";
-import { XOR } from "../../../../types/utils";
-import { RawCheckBox } from "../../../../components/core/selection/checkbox/RawCheckBox";
-
-const styles = StyleSheet.create({
- main: { flex: 1, flexDirection: "row", flexWrap: "nowrap" },
- shrink: { flexShrink: 1 }
-});
-
-type Props = {
- // in order to accepts composite text with bold
- text: XOR;
- onValueChange: (value: boolean) => void;
-};
-
-/**
- * Choose between a string or a node
- * @param text
- */
-const pickText = (text: XOR) =>
- typeof text === "string" ? {text} : text;
-
-/**
- * A declaration entry (checkbox + text) that the user have to accept in order to continue
- * @constructor
- */
-export const DeclarationEntry: React.FunctionComponent = props => {
- const [isChecked, setIsChecked] = React.useState(false);
- const handleOnPress = () => {
- const newValue = !isChecked;
- setIsChecked(newValue);
- props.onValueChange(newValue);
- };
-
- return (
-
-
-
-
-
-
- {pickText(props.text)}
-
-
-
-
-
- );
-};
diff --git a/ts/features/bonus/common/navigation/navigator.tsx b/ts/features/bonus/common/navigation/navigator.tsx
index 619409eae9f..8fbfa158274 100644
--- a/ts/features/bonus/common/navigation/navigator.tsx
+++ b/ts/features/bonus/common/navigation/navigator.tsx
@@ -19,8 +19,7 @@ const BonusStack = createStackNavigator();
export const BonusNavigator = () => (
&
ReturnType;
@@ -271,7 +271,15 @@ const mapDispatchToProps = (dispatch: Dispatch) => ({
dispatch(showServiceDetails(service))
});
+const AvailableBonusScreenFC: React.FunctionComponent = (
+ props: Props
+) => (
+
+
+
+);
+
export default connect(
mapStateToProps,
mapDispatchToProps
-)(withLoadingSpinner(AvailableBonusScreen));
+)(AvailableBonusScreenFC);
diff --git a/ts/features/bonus/common/store/selectors/index.ts b/ts/features/bonus/common/store/selectors/index.ts
index 9967af718e6..a469485e2ed 100644
--- a/ts/features/bonus/common/store/selectors/index.ts
+++ b/ts/features/bonus/common/store/selectors/index.ts
@@ -8,7 +8,7 @@ import { GlobalState } from "../../../../../store/reducers/types";
import { ServicePublic } from "../../../../../../definitions/backend/ServicePublic";
import { BonusVisibilityEnum } from "../../../../../../definitions/content/BonusVisibility";
-import { servicesByIdSelector } from "../../../../../store/reducers/entities/services/servicesById";
+import { servicesByIdSelector } from "../../../../services/store/reducers/servicesById";
import { mapBonusIdFeatureFlag } from "../../utils";
import { AvailableBonusTypesState } from "../reducers/availableBonusesTypes";
diff --git a/ts/features/common/store/reducers/index.ts b/ts/features/common/store/reducers/index.ts
index 06d34f28b66..b0ed82336b6 100644
--- a/ts/features/common/store/reducers/index.ts
+++ b/ts/features/common/store/reducers/index.ts
@@ -28,13 +28,14 @@ import {
CieLoginState
} from "../../../cieLogin/store/reducers";
-import walletV3Reducer, {
- WalletState as WalletV3State
-} from "../../../walletV3/common/store/reducers";
+import paymentsReducer, {
+ PaymentsState
+} from "../../../payments/common/store/reducers";
import {
fastLoginReducer,
FastLoginState
} from "../../../fastLogin/store/reducers";
+import walletReducer, { WalletState } from "../../../newWallet/store/reducers";
type LoginFeaturesState = {
testLogin: TestLoginState;
@@ -50,7 +51,8 @@ export type FeaturesState = {
idPay: IDPayState;
whatsNew: WhatsNewState & PersistPartial;
loginFeatures: LoginFeaturesState;
- wallet: WalletV3State;
+ payments: PaymentsState;
+ wallet: WalletState;
};
export type PersistedFeaturesState = FeaturesState & PersistPartial;
@@ -60,14 +62,15 @@ const rootReducer = combineReducers({
pn: pnReducer,
fci: fciReducer,
idPay: idPayReducer,
- wallet: walletV3Reducer,
+ payments: paymentsReducer,
whatsNew: whatsNewPersistor,
loginFeatures: combineReducers({
testLogin: testLoginReducer,
nativeLogin: nativeLoginReducer,
fastLogin: fastLoginReducer,
cieLogin: cieLoginReducer
- })
+ }),
+ wallet: walletReducer
});
const CURRENT_REDUX_FEATURES_STORE_VERSION = 1;
diff --git a/ts/features/design-system/DesignSystem.tsx b/ts/features/design-system/DesignSystem.tsx
index e70966a061c..1fbbba666f7 100644
--- a/ts/features/design-system/DesignSystem.tsx
+++ b/ts/features/design-system/DesignSystem.tsx
@@ -1,26 +1,17 @@
-import { SectionList, StatusBar, View, useColorScheme } from "react-native";
-import * as React from "react";
import {
- useIOTheme,
Divider,
- VSpacer,
+ IOStyles,
+ IOVisualCostants,
ListItemNav,
- IOVisualCostants
+ VSpacer,
+ useIOTheme
} from "@pagopa/io-app-design-system";
-import { IOStyles } from "../../components/core/variables/IOStyles";
-import {
- AppParamsList,
- IOStackNavigationRouteProps
-} from "../../navigation/params/AppParamsList";
+import * as React from "react";
+import { SectionList, StatusBar, View, useColorScheme } from "react-native";
import { H1 } from "../../components/core/typography/H1";
import { LabelSmall } from "../../components/core/typography/LabelSmall";
+import { useIONavigation } from "../../navigation/params/AppParamsList";
import DESIGN_SYSTEM_ROUTES from "./navigation/routes";
-import { DesignSystemParamsList } from "./navigation/params";
-
-type Props = IOStackNavigationRouteProps<
- DesignSystemParamsList,
- "DESIGN_SYSTEM_MAIN"
->;
type SingleSectionProps = {
title: string;
@@ -78,9 +69,10 @@ const DESIGN_SYSTEM_SECTION_DATA = [
}
];
-export const DesignSystem = (props: Props) => {
+export const DesignSystem = () => {
const theme = useIOTheme();
const colorScheme = useColorScheme();
+ const navigation = useIONavigation();
const renderDSNavItem = ({
item: { title, route }
@@ -90,7 +82,7 @@ export const DesignSystem = (props: Props) => {
props.navigation.navigate(route as keyof AppParamsList)}
+ onPress={() => navigation.navigate(route as any)}
/>
);
@@ -115,6 +107,7 @@ export const DesignSystem = (props: Props) => {
<>
`${item.route}-${index}`}
diff --git a/ts/features/design-system/components/DSIconViewerBox.tsx b/ts/features/design-system/components/DSIconViewerBox.tsx
index b666dbf6a03..dc103082821 100644
--- a/ts/features/design-system/components/DSIconViewerBox.tsx
+++ b/ts/features/design-system/components/DSIconViewerBox.tsx
@@ -1,6 +1,6 @@
import * as React from "react";
import { View, StyleSheet, Text } from "react-native";
-import { IOColors, IOThemeContext } from "@pagopa/io-app-design-system";
+import { IOColors, useIOTheme } from "@pagopa/io-app-design-system";
export const iconItemGutter = 8;
@@ -91,40 +91,39 @@ export const DSIconViewerBox = ({
image,
size,
withDot = false
-}: DSIconViewerBoxProps) => (
-
- {theme => (
+}: DSIconViewerBoxProps) => {
+ const theme = useIOTheme();
+ return (
+
-
- {withDot && }
- {image}
-
-
- {name && (
-
- {name}
-
- )}
-
+ {withDot && }
+ {image}
- )}
-
-);
+
+ {name && (
+
+ {name}
+
+ )}
+
+
+ );
+};
diff --git a/ts/features/design-system/components/DSSpacerViewerBox.tsx b/ts/features/design-system/components/DSSpacerViewerBox.tsx
index 5aa059b52fc..33127fab7cc 100644
--- a/ts/features/design-system/components/DSSpacerViewerBox.tsx
+++ b/ts/features/design-system/components/DSSpacerViewerBox.tsx
@@ -2,11 +2,11 @@ import * as React from "react";
import { View, Text } from "react-native";
import {
IOColors,
- IOThemeContext,
VSpacer,
HSpacer,
IOSpacer,
- SpacerOrientation
+ SpacerOrientation,
+ useIOTheme
} from "@pagopa/io-app-design-system";
type DSSpacerViewerBoxProps = {
@@ -18,60 +18,58 @@ type DSSpacerLabelProps = {
value: IOSpacer;
};
-const DSSpacerLabel = ({ value }: DSSpacerLabelProps) => (
-
- {theme => (
-
- {value}
-
- )}
-
-);
+const DSSpacerLabel = ({ value }: DSSpacerLabelProps) => {
+ const theme = useIOTheme();
+ return (
+
+ {value}
+
+ );
+};
export const DSSpacerViewerBox = ({
size,
orientation = "vertical"
-}: DSSpacerViewerBoxProps) => (
-
- {theme => (
- <>
- {orientation === "vertical" ? (
-
-
-
-
- {size && (
-
-
-
- )}
+}: DSSpacerViewerBoxProps) => {
+ const theme = useIOTheme();
+ return (
+ <>
+ {orientation === "vertical" ? (
+
+
+
- ) : (
-
-
-
+ {size && (
+
+
- {size && (
-
-
-
- )}
+ )}
+
+ ) : (
+
+
+
- )}
- >
- )}
-
-);
+ {size && (
+
+
+
+ )}
+
+ )}
+ >
+ );
+};
diff --git a/ts/features/design-system/components/DesignSystemScreen.tsx b/ts/features/design-system/components/DesignSystemScreen.tsx
index edf7b21d0e3..154c1d26f4c 100644
--- a/ts/features/design-system/components/DesignSystemScreen.tsx
+++ b/ts/features/design-system/components/DesignSystemScreen.tsx
@@ -23,6 +23,7 @@ export const DesignSystemScreen = ({ children, noMargin = false }: Props) => {
<>
{
+ const theme = useIOTheme();
const handlePressDismiss = () => {
dismissStaticBottomSheet();
dismissStaticBottomSheetWithFooter();
@@ -186,85 +187,79 @@ export const DSBottomSheet = () => {
);
return (
-
- {theme => (
-
-
- Available bottom sheets
-
-
-
-
-
-
-
-
- Legacy
-
+
+
+ Available bottom sheets
+
+
+
+
+
+
+
+
+ Legacy
+
-
-
-
- {staticBottomSheet}
- {staticBottomSheetWithFooter}
- {autoResizableBottomSheet}
- {autoResizableBottomSheetWithFooter}
- {veryLongAutoResizableBottomSheetWithFooter}
- {veryLongAutoResizableBottomSheetWithFooterFullScreen}
- {legacyBottomSheet}
- {legacyBottomSheetWithFooter}
-
- )}
-
+
+
+
+ {staticBottomSheet}
+ {staticBottomSheetWithFooter}
+ {autoResizableBottomSheet}
+ {autoResizableBottomSheetWithFooter}
+ {veryLongAutoResizableBottomSheetWithFooter}
+ {veryLongAutoResizableBottomSheetWithFooterFullScreen}
+ {legacyBottomSheet}
+ {legacyBottomSheetWithFooter}
+
);
};
diff --git a/ts/features/design-system/core/DSButtons.tsx b/ts/features/design-system/core/DSButtons.tsx
index c5ed0e27ad6..70a2d2b83f5 100644
--- a/ts/features/design-system/core/DSButtons.tsx
+++ b/ts/features/design-system/core/DSButtons.tsx
@@ -1,29 +1,29 @@
-import { View, StyleSheet, Alert } from "react-native";
-import * as React from "react";
-import { OrganizationFiscalCode } from "@pagopa/ts-commons/lib/strings";
import {
+ BlockButtons,
ButtonLink,
ButtonOutline,
ButtonSolid,
+ HSpacer,
+ IOColors,
IconButton,
- IconButtonSolid,
IconButtonContained,
- IOColors,
- HSpacer,
+ IconButtonSolid,
+ ListItemSwitch,
VSpacer,
useIOExperimentalDesign,
- useIOTheme,
- BlockButtons,
- ListItemSwitch
+ useIOTheme
} from "@pagopa/io-app-design-system";
+import { OrganizationFiscalCode } from "@pagopa/ts-commons/lib/strings";
+import * as React from "react";
import { useState } from "react";
-import { H2 } from "../../../components/core/typography/H2";
+import { Alert, StyleSheet, View } from "react-native";
+import { PaymentNoticeNumber } from "../../../../definitions/backend/PaymentNoticeNumber";
import CopyButtonComponent from "../../../components/CopyButtonComponent";
+import { H2 } from "../../../components/core/typography/H2";
+import { IOStyles } from "../../../components/core/variables/IOStyles";
import PaymentButton from "../../messages/components/MessageDetail/PaymentButton";
-import { PaymentNoticeNumber } from "../../../../definitions/backend/PaymentNoticeNumber";
import { DSComponentViewerBox } from "../components/DSComponentViewerBox";
import { DesignSystemScreen } from "../components/DesignSystemScreen";
-import { IOStyles } from "../../../components/core/variables/IOStyles";
const styles = StyleSheet.create({
primaryBlockLegacy: {
@@ -78,7 +78,7 @@ export const DSButtons = () => {
>
ButtonLink
- {renderButtonLink()}
+ {renderButtonLink(isExperimental)}
@@ -628,7 +628,7 @@ const renderButtonOutline = (isExperimental: boolean) => (
>
);
-const renderButtonLink = () => (
+const renderButtonLink = (isExperimental: boolean) => (
<>
(
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
>
);
diff --git a/ts/features/design-system/core/DSCards.tsx b/ts/features/design-system/core/DSCards.tsx
index 0b2cfd7a0b1..1c94441f2d3 100644
--- a/ts/features/design-system/core/DSCards.tsx
+++ b/ts/features/design-system/core/DSCards.tsx
@@ -1,14 +1,18 @@
-import * as React from "react";
-import { Alert, StyleSheet, View } from "react-native";
import { HSpacer, VSpacer } from "@pagopa/io-app-design-system";
-import { PaymentCardBig } from "../../../components/ui/cards/payment/PaymentCardBig";
-import { PaymentCardSmall } from "../../../components/ui/cards/payment/PaymentCardSmall";
+import * as React from "react";
+import { Alert, ScrollView, StyleSheet, View } from "react-native";
+import { CgnCard } from "../../bonus/cgn/components/CgnCard";
+import { IdPayCard } from "../../idpay/wallet/components/IdPayCard";
+import { PaymentCard } from "../../payments/common/components/PaymentCard";
+import { PaymentCardBig } from "../../payments/common/components/PaymentCardBig";
+import { PaymentCardSmall } from "../../payments/common/components/PaymentCardSmall";
import {
PaymentCardsCarousel,
PaymentCardsCarouselProps
-} from "../../../components/ui/cards/payment/PaymentCardsCarousel";
+} from "../../payments/common/components/PaymentCardsCarousel";
import { DSComponentViewerBox } from "../components/DSComponentViewerBox";
import { DesignSystemScreen } from "../components/DesignSystemScreen";
+import { DesignSystemSection } from "../components/DesignSystemSection";
const styles = StyleSheet.create({
content: {
@@ -68,87 +72,132 @@ const cardsDataForCarousel: PaymentCardsCarouselProps = {
// https://www.comuniecitta.it/elenco-banche-per-codice-abi
export const DSCards = () => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
);
diff --git a/ts/features/design-system/core/DSHapticFeedback.tsx b/ts/features/design-system/core/DSHapticFeedback.tsx
index 7e45720299f..b7fe2194404 100644
--- a/ts/features/design-system/core/DSHapticFeedback.tsx
+++ b/ts/features/design-system/core/DSHapticFeedback.tsx
@@ -1,88 +1,79 @@
import * as React from "react";
import ReactNativeHapticFeedback from "react-native-haptic-feedback";
-import {
- ButtonSolid,
- IOThemeContext,
- VSpacer
-} from "@pagopa/io-app-design-system";
+import { ButtonSolid, VSpacer, useIOTheme } from "@pagopa/io-app-design-system";
import { H2 } from "../../../components/core/typography/H2";
import { DesignSystemScreen } from "../components/DesignSystemScreen";
-export const DSHapticFeedback = () => (
-
- {theme => (
-
- Feedback
-
- ReactNativeHapticFeedback.trigger("impactLight")}
- accessibilityLabel="impactLight"
- accessibilityHint="impactLight"
- />
-
- ReactNativeHapticFeedback.trigger("impactMedium")}
- accessibilityLabel="impactMedium"
- accessibilityHint="impactMedium"
- />
-
- ReactNativeHapticFeedback.trigger("impactHeavy")}
- accessibilityLabel="impactHeavy"
- accessibilityHint="impactHeavy"
- />
-
- ReactNativeHapticFeedback.trigger("rigid")}
- accessibilityLabel="rigid"
- accessibilityHint="rigid"
- />
-
- ReactNativeHapticFeedback.trigger("soft")}
- accessibilityLabel="soft"
- accessibilityHint="soft"
- />
-
-
- ReactNativeHapticFeedback.trigger("notificationSuccess")
- }
- accessibilityLabel="notificationSuccess"
- accessibilityHint="notificationSuccess"
- />
-
-
- ReactNativeHapticFeedback.trigger("notificationWarning")
- }
- accessibilityLabel="notificationWarning"
- accessibilityHint="notificationWarning"
- />
-
- ReactNativeHapticFeedback.trigger("notificationError")}
- accessibilityLabel="notificationError"
- accessibilityHint="notificationError"
- />
-
- )}
-
-);
+export const DSHapticFeedback = () => {
+ const theme = useIOTheme();
+ return (
+
+ Feedback
+
+ ReactNativeHapticFeedback.trigger("impactLight")}
+ accessibilityLabel="impactLight"
+ accessibilityHint="impactLight"
+ />
+
+ ReactNativeHapticFeedback.trigger("impactMedium")}
+ accessibilityLabel="impactMedium"
+ accessibilityHint="impactMedium"
+ />
+
+ ReactNativeHapticFeedback.trigger("impactHeavy")}
+ accessibilityLabel="impactHeavy"
+ accessibilityHint="impactHeavy"
+ />
+
+ ReactNativeHapticFeedback.trigger("rigid")}
+ accessibilityLabel="rigid"
+ accessibilityHint="rigid"
+ />
+
+ ReactNativeHapticFeedback.trigger("soft")}
+ accessibilityLabel="soft"
+ accessibilityHint="soft"
+ />
+
+ ReactNativeHapticFeedback.trigger("notificationSuccess")}
+ accessibilityLabel="notificationSuccess"
+ accessibilityHint="notificationSuccess"
+ />
+
+ ReactNativeHapticFeedback.trigger("notificationWarning")}
+ accessibilityLabel="notificationWarning"
+ accessibilityHint="notificationWarning"
+ />
+
+ ReactNativeHapticFeedback.trigger("notificationError")}
+ accessibilityLabel="notificationError"
+ accessibilityHint="notificationError"
+ />
+
+ );
+};
diff --git a/ts/features/design-system/core/DSHeaderSecondLevel.tsx b/ts/features/design-system/core/DSHeaderSecondLevel.tsx
index 1838a0a2276..89d44f1a5c2 100644
--- a/ts/features/design-system/core/DSHeaderSecondLevel.tsx
+++ b/ts/features/design-system/core/DSHeaderSecondLevel.tsx
@@ -3,7 +3,11 @@ import { Body, VSpacer } from "@pagopa/io-app-design-system";
import { RNavScreenWithLargeHeader } from "../../../components/ui/RNavScreenWithLargeHeader";
export const DSHeaderSecondLevel = () => (
-
+
{[...Array(50)].map((_el, i) => (
Repeated text
diff --git a/ts/features/design-system/core/DSIcons.tsx b/ts/features/design-system/core/DSIcons.tsx
index ffb2766e00a..05f08908c56 100644
--- a/ts/features/design-system/core/DSIcons.tsx
+++ b/ts/features/design-system/core/DSIcons.tsx
@@ -11,11 +11,11 @@ import {
SVGIconProps,
IOIconSizeScale,
IOSystemIcons,
- IOThemeContext,
IOColors,
IconContained,
HSpacer,
- IOStyles
+ IOStyles,
+ useIOTheme
} from "@pagopa/io-app-design-system";
import { DSIconViewerBox, iconItemGutter } from "../components/DSIconViewerBox";
import { H2 } from "../../../components/core/typography/H2";
@@ -75,202 +75,201 @@ const styles = StyleSheet.create({
}
});
-export const DSIcons = () => (
-
- {theme => (
-
-
- {Object.entries(filteredIOIcons).map(([iconItemName]) => (
-
- }
- withDot={Object.keys(IOIconsNew).includes(iconItemName)}
- />
- ))}
-
-
- Navigation
-
-
- {Object.entries(IONavIcons).map(([iconItemName]) => (
-
- }
- />
- ))}
-
-
- Biometric
-
-
- {Object.entries(IOBiometricIcons).map(([iconItemName]) => (
-
- }
- />
- ))}
-
-
- Categories
-
-
- {Object.entries(IOCategoryIcons).map(([iconItemName]) => (
-
- }
- />
- ))}
-
-
- Product
-
-
- {Object.entries(IOProductIcons).map(([iconItemName]) => (
-
- }
- />
- ))}
-
-
- System
-
-
- {Object.entries(IOSystemIcons).map(([iconItemName]) => (
-
- }
- />
- ))}
-
+export const DSIcons = () => {
+ const theme = useIOTheme();
+ return (
+
+
+ {Object.entries(filteredIOIcons).map(([iconItemName]) => (
+
+ }
+ withDot={Object.keys(IOIconsNew).includes(iconItemName)}
+ />
+ ))}
+
+
+ Navigation
+
+
+ {Object.entries(IONavIcons).map(([iconItemName]) => (
+
+ }
+ />
+ ))}
+
+
+ Biometric
+
+
+ {Object.entries(IOBiometricIcons).map(([iconItemName]) => (
+
+ }
+ />
+ ))}
+
+
+ Categories
+
+
+ {Object.entries(IOCategoryIcons).map(([iconItemName]) => (
+
+ }
+ />
+ ))}
+
+
+ Product
+
+
+ {Object.entries(IOProductIcons).map(([iconItemName]) => (
+
+ }
+ />
+ ))}
+
+
+ System
+
+
+ {Object.entries(IOSystemIcons).map(([iconItemName]) => (
+
+ }
+ />
+ ))}
+
-
- IconContained
-
-
-
-
-
-
-
-
+
+ IconContained
+
+
+
+
+
+
+
+
-
- Sizes
-
-
- {/* If you want to render another icon in different sizes,
+
+ Sizes
+
+
+ {/* If you want to render another icon in different sizes,
just change the name below */}
- {IOIconSizes.map(size => (
-
- }
- />
- ))}
-
-
- Colors
-
-
- {IOIconColors.map(color => (
-
- }
- />
- ))}
-
-
- )}
-
-);
+ {IOIconSizes.map(size => (
+
+ }
+ />
+ ))}
+
+
+ Colors
+
+
+ {IOIconColors.map(color => (
+
+ }
+ />
+ ))}
+
+
+ );
+};
diff --git a/ts/features/design-system/core/DSLayout.tsx b/ts/features/design-system/core/DSLayout.tsx
index 8b5ea692ec8..3a9257d545a 100644
--- a/ts/features/design-system/core/DSLayout.tsx
+++ b/ts/features/design-system/core/DSLayout.tsx
@@ -2,14 +2,14 @@ import * as React from "react";
import { View } from "react-native";
import {
IOColors,
- IOThemeContext,
Divider,
VDivider,
HSpacer,
VSpacer,
IOAppMargin,
IOSpacer,
- ContentWrapper
+ ContentWrapper,
+ useIOTheme
} from "@pagopa/io-app-design-system";
import { DesignSystemScreen } from "../components/DesignSystemScreen";
import { DSSpacerViewerBox } from "../components/DSSpacerViewerBox";
@@ -18,152 +18,147 @@ import { LabelSmall } from "../../../components/core/typography/LabelSmall";
import { H3 } from "../../../components/core/typography/H3";
import { H1 } from "../../../components/core/typography/H1";
-export const DSLayout = () => (
-
- {theme => (
-
-
-
- Grid
-
- {
+ const theme = useIOTheme();
+
+ return (
+
+
+
+ Grid
+
+
+ ContentWrapper
+
+
+ {IOAppMargin.map((value, i, arr) => (
+
+
- ContentWrapper
-
-
- {IOAppMargin.map((value, i, arr) => (
-
-
-
-
+
+ Content example
+
-
- Content example
-
-
- {value}
-
-
-
-
- {i !== arr.length - 1 && }
-
- ))}
+ {value}
+
+
+
+
+ {i !== arr.length - 1 && }
+
+ ))}
-
+
-
-
- Spacing
-
+
+
+ Spacing
+
-
- VSpacer
-
+
+ VSpacer
+
- {/* Vertical */}
- {IOSpacer.map((spacerEntry, i, arr) => (
-
-
- {/* Don't add spacer to the last item. Quick and dirty
+ {/* Vertical */}
+ {IOSpacer.map((spacerEntry, i, arr) => (
+
+
+ {/* Don't add spacer to the last item. Quick and dirty
alternative to the Stack component.
https://stackoverflow.com/a/60975451 */}
- {i !== arr.length - 1 && }
-
- ))}
+ {i !== arr.length - 1 && }
+
+ ))}
-
+
-
- HSpacer
-
+
+ HSpacer
+
- {/* Horizontal */}
-
- {IOSpacer.map((spacerEntry, i, arr) => (
-
-
- {i !== arr.length - 1 && }
-
- ))}
-
+ {/* Horizontal */}
+
+ {IOSpacer.map((spacerEntry, i, arr) => (
+
+
+ {i !== arr.length - 1 && }
+
+ ))}
+
-
-
+
+
-
-
- Divider
-
+
+
+ Divider
+
-
- Default (Horizontal)
-
+
+ Default (Horizontal)
+
-
-
-
+
+
+
-
-
- Vertical
-
+
+
+ Vertical
+
-
-
-
-
-
-
- )}
-
-);
+
+
+
+
+
+
+ );
+};
diff --git a/ts/features/design-system/core/DSLegacyButtons.tsx b/ts/features/design-system/core/DSLegacyButtons.tsx
deleted file mode 100644
index 6658178d02e..00000000000
--- a/ts/features/design-system/core/DSLegacyButtons.tsx
+++ /dev/null
@@ -1,275 +0,0 @@
-import * as React from "react";
-import { View } from "react-native";
-import { Text as NBText } from "native-base";
-import { IOColors, VSpacer } from "@pagopa/io-app-design-system";
-import { H2 } from "../../../components/core/typography/H2";
-
-import { DesignSystemScreen } from "../components/DesignSystemScreen";
-import { DSComponentViewerBox } from "../components/DSComponentViewerBox";
-import ButtonDefaultOpacity from "../../../components/ButtonDefaultOpacity";
-import { Label } from "../../../components/core/typography/Label";
-import GoBackButton from "../../../components/GoBackButton";
-import { LabelSmall } from "../../../components/core/typography/LabelSmall";
-
-export const DSLegacyButtons = () => (
-
-
- NativeBase
-
-
- {/* The following props render the button with the same
- graphical attributes:
- - Active
- - Input Button
- */}
- {
- alert("Action triggered");
- }}
- >
- Primary button
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Primary button (Block)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Primary button (Small)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- XSmall button
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Primary button (Disabled)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (Light)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (Block Light)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (Small Light)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (disabled)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (light)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (block light)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (small light)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (light disabled)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Primary button (dark)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Outline button (dark)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Cancel outline button
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Cancel outline button (block)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Cancel button
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Cancel button (block)
-
-
-
- {
- alert("Action triggered");
- }}
- >
- Button (light text)
-
-
-
-
- {
- alert("Action triggered");
- }}
- >
-
- White button
-
-
-
-
-
- {
- alert("Going back");
- }}
- white={true}
- />
-
-
-
-
-);
diff --git a/ts/features/design-system/core/DSLegacyIllustrations.tsx b/ts/features/design-system/core/DSLegacyIllustrations.tsx
index 5ceef2b68b4..a0f001b9ecb 100644
--- a/ts/features/design-system/core/DSLegacyIllustrations.tsx
+++ b/ts/features/design-system/core/DSLegacyIllustrations.tsx
@@ -8,14 +8,7 @@ import {
} from "../components/DSAssetViewerBox";
/* ILLUSTRATIONS */
-/* Onboarding */
-import Landing05 from "../../../../img/landing/05.png";
-import Landing01 from "../../../../img/landing/01.png";
-import Landing02 from "../../../../img/landing/02.png";
-import Landing03 from "../../../../img/landing/03.png";
-import Landing04 from "../../../../img/landing/04.png";
/* CIE */
-import LandingCIE from "../../../../img/cie/CIE-onboarding-illustration.png";
import PlacingCard from "../../../../img/cie/place-card-illustration.png";
import { DesignSystemScreen } from "../components/DesignSystemScreen";
@@ -32,45 +25,10 @@ const styles = StyleSheet.create({
export const DSLegacyIllustrations = () => (
-
- Onboarding
-
-
-
-
-
-
-
-
CIE
-
{
return (
-
-
-
{
name={"ABILogo"}
image={renderRasterImage(ABILogo)}
/>
-
-
-
-
{
name={"Completed"}
image={renderRasterImage(CompletedRaster)}
/>
- } />
{
Alert.alert("Copied!", "Value copied");
};
-export const DSListItems = () => (
-
- {theme => (
-
-
- ListItemNav
-
- {renderListItemNav()}
-
-
- ListItemInfoCopy
-
- {renderListItemInfoCopy()}
-
-
- ListItemInfo
-
- {renderListItemInfo()}
-
-
- ListItemHeader
-
- {renderListItemHeader()}
-
-
- ListItemAction
-
- {renderListItemAction()}
-
-
- ListItemTransaction
-
- {renderListItemTransaction()}
-
-
-
-
- NativeBase lookalikes (not NativeBase)
-
-
- alert("Action triggered")}
- />
-
-
-
-
-
- ListItemComponent (NativeBase)
-
-
- alert("Action triggered")}
- />
-
-
- alert("Action triggered")}
- />
-
-
- alert("Action triggered")}
- />
-
-
- alert("Action triggered")}
- hideSeparator={true}
- />
-
-
- alert("Action triggered")}
- />
-
-
- alert("Action triggered")}
- />
-
-
-
- alert("Action triggered")}
- />
-
-
- alert("Action triggered")}
- />
-
-
- alert("Action triggered")}
- />
-
-
- alert("Action triggered")}
- />
-
-
- alert("Action triggered")}
- />
-
-
-
- Derivated from ListItem (NativeBase)
-
-
- alert("Action triggered")}
- />
- alert("Action triggered")}
- />
-
-
-
- }
- title="Storico versioni dell'app"
- value="Per capire se il problema dipende dall'ultimo aggiornamento"
- testId="TestID"
- />
-
-
- Misc
-
-
- alert("Action triggered")}
- accessible={true}
- accessibilityRole={"button"}
- accessibilityLabel={"Accessibility Label"}
- />
-
-
-
- Native (Not NativeBase)
-
-
-
-
-
- alert("Action triggered")}
- isNew={true}
- />
-
-
- )}
-
-);
+export const DSListItems = () => {
+ const theme = useIOTheme();
+ return (
+
+
+ ListItemNav
+
+ {renderListItemNav()}
+
+
+ ListItemInfoCopy
+
+ {renderListItemInfoCopy()}
+
+
+ ListItemInfo
+
+ {renderListItemInfo()}
+
+
+ ListItemHeader
+
+ {renderListItemHeader()}
+
+
+ ListItemAction
+
+ {renderListItemAction()}
+
+
+ ListItemTransaction
+
+ {renderListItemTransaction()}
+
+
+
+
+ NativeBase lookalikes (not NativeBase)
+
+
+ alert("Action triggered")}
+ />
+
+
+
+
+
+ ListItemComponent (NativeBase)
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ hideSeparator={true}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+ alert("Action triggered")}
+ />
+
+
+
+ Derivated from ListItem (NativeBase)
+
+
+ alert("Action triggered")}
+ />
+ alert("Action triggered")}
+ />
+
+
+
+ }
+ title="Storico versioni dell'app"
+ value="Per capire se il problema dipende dall'ultimo aggiornamento"
+ testId="TestID"
+ />
+
+
+ Misc
+
+
+ alert("Action triggered")}
+ accessible={true}
+ accessibilityRole={"button"}
+ accessibilityLabel={"Accessibility Label"}
+ />
+
+
+
+ Native (Not NativeBase)
+
+
+
+
+
+ alert("Action triggered")}
+ isNew={true}
+ />
+
+
+ );
+};
const renderListItemNav = () => (
<>
diff --git a/ts/features/design-system/core/DSLogos.tsx b/ts/features/design-system/core/DSLogos.tsx
index b9baf5982a1..05f3373743f 100644
--- a/ts/features/design-system/core/DSLogos.tsx
+++ b/ts/features/design-system/core/DSLogos.tsx
@@ -146,31 +146,7 @@ const organizationsURIs = [
const renderAvatar = () => (
<>
-
-
- {organizationsURIs.map(({ imageSource }, i) => (
-
-
- {i < organizationsURIs.length - 1 && }
-
- ))}
-
-
-
+
(
))}
-
+
{
Alert.alert("Alert", "Action triggered");
@@ -32,113 +35,158 @@ const noticeStatusArray: Array = [
"canceled"
];
-export const DSModules = () => (
-
- {theme => (
-
-
- ModuleAttachment
-
- {renderModuleAttachment()}
+export const DSModules = () => {
+ const isDesignSystemEnabled = useIOSelector(isDesignSystemEnabledSelector);
+ const theme = useIOTheme();
+ return (
+
+
+ ModuleAttachment
+
+ {renderModuleAttachment(isDesignSystemEnabled)}
-
+
-
- ModulePaymentNotice
-
- {renderModulePaymentNotice()}
+
+ ModulePaymentNotice
+
+ {renderModulePaymentNotice()}
-
+
-
- ModuleCheckout
-
- {renderModuleCheckout()}
+
+ ModuleCheckout
+
+ {renderModuleCheckout()}
-
+
-
- ButtonExtendedOutline
-
- {renderButtonExtendedOutline()}
+
+ ButtonExtendedOutline
+
+ {renderButtonExtendedOutline()}
-
+
-
- ModuleIDP
-
- {renderModuleIDP()}
-
- )}
-
-);
+
+ ModuleIDP
+
+ {renderModuleIDP()}
+
+ );
+};
-const renderModuleAttachment = () => (
+const renderModuleAttachment = (isDesignSystemEnabled: boolean) => (
-
+ {isDesignSystemEnabled ? (
+
+ ) : (
+
+ )}
-
+ {isDesignSystemEnabled ? (
+
+ ) : (
+
+ )}
-
+ {isDesignSystemEnabled ? null : (
+
+ )}
-
+ {isDesignSystemEnabled ? (
+
+ ) : (
+
+ )}
-
+ {isDesignSystemEnabled ? (
+
+ ) : (
+
+ )}
-
+ {isDesignSystemEnabled ? (
+
+ ) : (
+
+ )}
);
diff --git a/ts/features/design-system/core/DSNumberPad.tsx b/ts/features/design-system/core/DSNumberPad.tsx
index 26a9fe60bd6..50ab287d3a2 100644
--- a/ts/features/design-system/core/DSNumberPad.tsx
+++ b/ts/features/design-system/core/DSNumberPad.tsx
@@ -1,20 +1,20 @@
-import * as React from "react";
import {
+ Body,
CodeInput,
H2,
IOColors,
- ListItemSwitch,
- NumberPad,
- VSpacer,
- hexToRgba,
- LabelSmallAlt,
IOVisualCostants,
LabelLink,
+ LabelSmallAlt,
+ ListItemSwitch,
+ NumberPad,
Pictogram,
- Body
+ VSpacer,
+ hexToRgba
} from "@pagopa/io-app-design-system";
import { useNavigation } from "@react-navigation/native";
-import { Alert, View } from "react-native";
+import * as React from "react";
+import { Alert, StatusBar, View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
const PIN_LENGTH = 6;
@@ -59,6 +59,7 @@ export const DSNumberPad = () => {
}
]}
>
+
{
- const theme = useContext(IOThemeContext);
+ const theme = useIOTheme();
return (
diff --git a/ts/features/design-system/core/DSScreenOperationResult.tsx b/ts/features/design-system/core/DSScreenOperationResult.tsx
index 655253035f0..ba57b15d5a6 100644
--- a/ts/features/design-system/core/DSScreenOperationResult.tsx
+++ b/ts/features/design-system/core/DSScreenOperationResult.tsx
@@ -1,16 +1,41 @@
import { useNavigation } from "@react-navigation/native";
import React from "react";
-import { OperationResultScreenContent } from "../../../components/screens/OperationResultScreenContent";
+import {
+ BodyProps,
+ OperationResultScreenContent
+} from "../../../components/screens/OperationResultScreenContent";
import I18n from "../../../i18n";
const DSScreenOperationResult = () => {
const navigation = useNavigation();
+ const bodyPropsArray: Array = [
+ {
+ text: I18n.t("email.cduScreens.emailAlreadyTaken.subtitleStart"),
+ style: {
+ textAlign: "center"
+ }
+ },
+ {
+ text: <> example@try.com >,
+ style: {
+ textAlign: "center"
+ },
+ weight: "SemiBold"
+ },
+ {
+ text: I18n.t("email.cduScreens.emailAlreadyTaken.subtitleEnd"),
+ style: {
+ textAlign: "center"
+ }
+ }
+ ];
+
return (
> => [
"Ti contatteranno solo i servizi che hanno qualcosa di importante da dirti. Potrai sempre disattivare le comunicazioni che non ti interessano.",
id: "example-1"
},
+ {
+ value: "Let's try with JSX description",
+ description: (
+
+ Ti contatteranno solo i servizi che hanno qualcosa di importante da
+ dirti.{" "}
+
+ Potrai sempre disattivare le comunicazioni che non ti interessano.
+
+
+ ),
+ id: "example-jsx-element"
+ },
{
startImage: { paymentLogo: "myBank" },
value: "Payment method item",
diff --git a/ts/features/design-system/core/DSToastNotifications.tsx b/ts/features/design-system/core/DSToastNotifications.tsx
index 90b92ded4b0..ff7c3887259 100644
--- a/ts/features/design-system/core/DSToastNotifications.tsx
+++ b/ts/features/design-system/core/DSToastNotifications.tsx
@@ -1,11 +1,12 @@
-import { Toast as NBToast } from "native-base";
+import {
+ ButtonOutline,
+ VSpacer,
+ IOToast,
+ ToastNotification
+} from "@pagopa/io-app-design-system";
import * as React from "react";
-import { ButtonOutline, VSpacer } from "@pagopa/io-app-design-system";
-import { H2 } from "../../../components/core/typography/H2";
import { H3 } from "../../../components/core/typography/H3";
-import { showToast } from "../../../utils/showToast";
import { DesignSystemScreen } from "../components/DesignSystemScreen";
-import { IOToast, ToastNotification } from "../../../components/Toast";
export const DSToastNotifications = () => (
@@ -88,111 +89,5 @@ export const DSToastNotifications = () => (
/>
-
-
- Legacy toasts
-
-
-
- Type
-
-
-
- NBToast.show({
- text: "Here's the default behavior"
- })
- }
- />
-
-
-
- showToast("Example of a danger message")}
- />
-
-
-
- showToast("Example of a success message", "success")}
- />
-
-
-
- showToast("Example of a warning message", "warning")}
- />
-
-
- Position
-
-
-
- showToast("Here's the notification at the top", "danger", "top")
- }
- />
-
-
-
-
- showToast("Here's the notification at the top", "danger", "top")
- }
- />
-
-
-
-
- showToast("Here's the notification at the bottom", "danger", "bottom")
- }
- />
-
-
- Misc
-
-
-
- NBToast.show({
- text: "Here's the default behavior with multi-line loooong loooooong text"
- })
- }
- />
-
-
);
diff --git a/ts/features/design-system/core/DSWallet.tsx b/ts/features/design-system/core/DSWallet.tsx
new file mode 100644
index 00000000000..d26fc64fba9
--- /dev/null
+++ b/ts/features/design-system/core/DSWallet.tsx
@@ -0,0 +1,77 @@
+import * as React from "react";
+import { WalletCardsCategoryContainer } from "../../newWallet/components/WalletCardsCategoryContainer";
+import { WalletCard, WalletCardCategory } from "../../newWallet/types";
+import { DesignSystemScreen } from "../components/DesignSystemScreen";
+import { DesignSystemSection } from "../components/DesignSystemSection";
+
+export const DSWallet = () => {
+ const cards: ReadonlyArray = [
+ {
+ key: "1",
+ type: "idPay",
+ category: "bonus",
+ initiativeId: "1",
+ amount: 412.69,
+ avatarSource: {
+ uri: "https://vtlogo.com/wp-content/uploads/2021/08/18app-vector-logo.png"
+ },
+ expireDate: new Date(),
+ name: "18 App"
+ },
+ {
+ key: "2",
+ type: "payment",
+ category: "payment",
+ walletId: "1",
+ hpan: "9900",
+ brand: "maestro",
+ holderName: "Anna Verdi",
+ expireDate: new Date()
+ },
+ {
+ key: "3",
+ type: "payment",
+ category: "payment",
+ walletId: "1",
+ abiCode: "03069",
+ brand: "pagoBancomat",
+ holderName: "Anna Verdi",
+ expireDate: new Date()
+ },
+ {
+ key: "4",
+ type: "payment",
+ category: "payment",
+ walletId: "1",
+ holderEmail: "anna_v********@**hoo.it"
+ }
+ ];
+
+ const cardsByCategory = cards.reduce(
+ (acc, card) => ({
+ ...acc,
+ [card.category]: [...(acc[card.category] || []), card]
+ }),
+ {} as { [category in WalletCardCategory]: ReadonlyArray }
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/ts/features/design-system/navigation/navigator.tsx b/ts/features/design-system/navigation/navigator.tsx
index ca02ca4ee8f..3f3f21746a3 100644
--- a/ts/features/design-system/navigation/navigator.tsx
+++ b/ts/features/design-system/navigation/navigator.tsx
@@ -1,26 +1,16 @@
import {
- IOThemeContext,
- IOThemes,
- IOVisualCostants,
- IconButton
+ HeaderSecondLevel,
+ IconButton,
+ makeFontStyleObject,
+ useIOExperimentalDesign,
+ useIOThemeContext
} from "@pagopa/io-app-design-system";
-import { ThemeProvider, useNavigation } from "@react-navigation/native";
-import {
- StackNavigationOptions,
- TransitionPresets,
- createStackNavigator
-} from "@react-navigation/stack";
+import { useNavigation } from "@react-navigation/native";
+import { createNativeStackNavigator } from "@react-navigation/native-stack";
+import I18n from "i18n-js";
import * as React from "react";
-import { useMemo } from "react";
-import { Alert, Platform, View, useColorScheme } from "react-native";
-import { useSafeAreaInsets } from "react-native-safe-area-context";
-import { makeFontStyleObject } from "../../../components/core/fonts";
+import { Alert, Platform } from "react-native";
import HeaderFirstLevel from "../../../components/ui/HeaderFirstLevel";
-import {
- IONavigationDarkTheme,
- IONavigationLightTheme
-} from "../../../theme/navigations";
-import { isGestureEnabled } from "../../../utils/navigation";
import { DesignSystem } from "../DesignSystem";
import { DSAccordion } from "../core/DSAccordion";
import { DSAdvice } from "../core/DSAdvice";
@@ -38,16 +28,15 @@ import { DSHapticFeedback } from "../core/DSHapticFeedback";
import { DSHeaderFirstLevel } from "../core/DSHeaderFirstLevel";
import { DSHeaderSecondLevel } from "../core/DSHeaderSecondLevel";
import { DSHeaderSecondLevelWithSectionTitle } from "../core/DSHeaderSecondLevelWithSectionTitle";
-import { DSNumberPad } from "../core/DSNumberPad";
import { DSIcons } from "../core/DSIcons";
import { DSLayout } from "../core/DSLayout";
-import { DSLegacyButtons } from "../core/DSLegacyButtons";
import { DSLegacyIllustrations } from "../core/DSLegacyIllustrations";
import { DSLegacyPictograms } from "../core/DSLegacyPictograms";
import { DSListItems } from "../core/DSListItems";
import { DSLoaders } from "../core/DSLoaders";
import { DSLogos } from "../core/DSLogos";
import { DSModules } from "../core/DSModules";
+import { DSNumberPad } from "../core/DSNumberPad";
import { DSPictograms } from "../core/DSPictograms";
import { DSSafeArea } from "../core/DSSafeArea";
import { DSSafeAreaCentered } from "../core/DSSafeAreaCentered";
@@ -57,46 +46,26 @@ import { DSTabNavigation } from "../core/DSTabNavigation";
import { DSTextFields } from "../core/DSTextFields";
import { DSToastNotifications } from "../core/DSToastNotifications";
import { DSTypography } from "../core/DSTypography";
+import { DSWallet } from "../core/DSWallet";
import { DSWizardScreen } from "../core/DSWizardScreen";
-import { DesignSystemModalParamsList, DesignSystemParamsList } from "./params";
+import { DesignSystemParamsList } from "./params";
import DESIGN_SYSTEM_ROUTES from "./routes";
-const Stack = createStackNavigator();
-const ModalStack = createStackNavigator();
+const Stack = createNativeStackNavigator();
// BackButton managed through React Navigation
const RNNBackButton = () => {
const navigation = useNavigation();
- const colorScheme = useColorScheme();
-
+ const { themeType } = useIOThemeContext();
return (
-
- {
- navigation.goBack();
- }}
- accessibilityLabel={""}
- />
-
- );
-};
-
-const RNNCloseButton = () => {
- const navigation = useNavigation();
-
- return (
-
- {
- navigation.goBack();
- }}
- accessibilityLabel={""}
- />
-
+ {
+ navigation.goBack();
+ }}
+ accessibilityLabel={""}
+ />
);
};
@@ -124,89 +93,33 @@ const HeaderFirstLevelComponent = () => (
/>
);
-const customModalHeaderConf: StackNavigationOptions = {
- headerLeft: () => null,
- headerTitle: () => null,
- headerRight: RNNCloseButton,
- headerStyle: { height: IOVisualCostants.headerHeight },
- headerStatusBarHeight: 0
-};
-
export const DesignSystemNavigator = () => {
- const colorScheme = useColorScheme();
-
- return (
-
-
- {/* You need two nested navigators to apply the modal
- behavior only to the single screen and not to any other.
- Read documentation for reference:
- https://reactnavigation.org/docs/5.x/modal/#creating-a-modal-stack
-
- With RN Navigation 6.x it's much easier because you can
- use the Group function */}
-
-
-
-
-
-
- );
-};
-
-const DesignSystemMainStack = () => {
- const insets = useSafeAreaInsets();
-
- const customHeaderConf: StackNavigationOptions = useMemo(
- () => ({
- headerTitleStyle: {
- ...makeFontStyleObject("Regular", false, "ReadexPro"),
- fontSize: 14
- },
- headerTitleAlign: "center",
- headerStyle: { height: insets.top + IOVisualCostants.headerHeight },
- headerLeft: RNNBackButton
- }),
- [insets]
- );
+ const { isExperimental } = useIOExperimentalDesign();
return (
-
@@ -214,7 +127,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.FOUNDATION.COLOR.route}
component={DSColors}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.FOUNDATION.COLOR.title
+ title: DESIGN_SYSTEM_ROUTES.FOUNDATION.COLOR.title
}}
/>
@@ -222,7 +135,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.FOUNDATION.TYPOGRAPHY.route}
component={DSTypography}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.FOUNDATION.TYPOGRAPHY.title
+ title: DESIGN_SYSTEM_ROUTES.FOUNDATION.TYPOGRAPHY.title
}}
/>
@@ -230,7 +143,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.FOUNDATION.LAYOUT.route}
component={DSLayout}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.FOUNDATION.LAYOUT.title
+ title: DESIGN_SYSTEM_ROUTES.FOUNDATION.LAYOUT.title
}}
/>
@@ -238,7 +151,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.FOUNDATION.ICONS.route}
component={DSIcons}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.FOUNDATION.ICONS.title
+ title: DESIGN_SYSTEM_ROUTES.FOUNDATION.ICONS.title
}}
/>
@@ -246,7 +159,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.FOUNDATION.PICTOGRAMS.route}
component={DSPictograms}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.FOUNDATION.PICTOGRAMS.title
+ title: DESIGN_SYSTEM_ROUTES.FOUNDATION.PICTOGRAMS.title
}}
/>
@@ -254,7 +167,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.FOUNDATION.LOGOS.route}
component={DSLogos}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.FOUNDATION.LOGOS.title
+ title: DESIGN_SYSTEM_ROUTES.FOUNDATION.LOGOS.title
}}
/>
@@ -262,7 +175,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.FOUNDATION.LOADERS.route}
component={DSLoaders}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.FOUNDATION.LOADERS.title
+ title: DESIGN_SYSTEM_ROUTES.FOUNDATION.LOADERS.title
}}
/>
@@ -270,7 +183,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.FOUNDATION.HAPTIC_FEEDBACK.route}
component={DSHapticFeedback}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.FOUNDATION.HAPTIC_FEEDBACK.title
+ title: DESIGN_SYSTEM_ROUTES.FOUNDATION.HAPTIC_FEEDBACK.title
}}
/>
@@ -279,7 +192,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.BUTTONS.route}
component={DSButtons}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.BUTTONS.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.BUTTONS.title
}}
/>
@@ -287,7 +200,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.SELECTION.route}
component={DSSelection}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.SELECTION.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.SELECTION.title
}}
/>
@@ -295,7 +208,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.TEXT_FIELDS.route}
component={DSTextFields}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.TEXT_FIELDS.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.TEXT_FIELDS.title
}}
/>
@@ -303,7 +216,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.BADGE.route}
component={DSBadges}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.BADGE.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.BADGE.title
}}
/>
@@ -311,7 +224,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.LIST_ITEMS.route}
component={DSListItems}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.LIST_ITEMS.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.LIST_ITEMS.title
}}
/>
@@ -319,7 +232,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.MODULES.route}
component={DSModules}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.MODULES.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.MODULES.title
}}
/>
@@ -327,14 +240,15 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.CARDS.route}
component={DSCards}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.CARDS.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.CARDS.title
}}
/>
+
@@ -342,7 +256,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.ACCORDION.route}
component={DSAccordion}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.ACCORDION.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.ACCORDION.title
}}
/>
@@ -350,7 +264,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.ALERT.route}
component={DSAlert}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.ALERT.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.ALERT.title
}}
/>
@@ -358,7 +272,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.ADVICE.route}
component={DSAdvice}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.ADVICE.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.ADVICE.title
}}
/>
@@ -366,7 +280,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.BOTTOM_SHEET.route}
component={DSBottomSheet}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.BOTTOM_SHEET.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.BOTTOM_SHEET.title
}}
/>
@@ -374,7 +288,15 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.COMPONENTS.TAB_NAVIGATION.route}
component={DSTabNavigation}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.COMPONENTS.TAB_NAVIGATION.title
+ title: DESIGN_SYSTEM_ROUTES.COMPONENTS.TAB_NAVIGATION.title
+ }}
+ />
+
+
@@ -405,7 +327,7 @@ const DesignSystemMainStack = () => {
name={DESIGN_SYSTEM_ROUTES.SCREENS.GRADIENT_SCROLL.route}
component={DSGradientScroll}
options={{
- headerTitle: DESIGN_SYSTEM_ROUTES.SCREENS.GRADIENT_SCROLL.title
+ title: DESIGN_SYSTEM_ROUTES.SCREENS.GRADIENT_SCROLL.title
}}
/>
@@ -439,37 +361,60 @@ const DesignSystemMainStack = () => {
component={DSSafeArea}
options={{ headerShown: false }}
/>
+
+
+
+ (
+ {
+ navigation.goBack();
+ },
+ accessibilityLabel: I18n.t("global.buttons.back")
+ }}
+ />
+ )
+ }}
+ />
+
+
{/* LEGACY */}
-
diff --git a/ts/features/design-system/navigation/params.ts b/ts/features/design-system/navigation/params.ts
index bae589ccdbe..811d196304b 100644
--- a/ts/features/design-system/navigation/params.ts
+++ b/ts/features/design-system/navigation/params.ts
@@ -22,6 +22,7 @@ export type DesignSystemParamsList = {
[DESIGN_SYSTEM_ROUTES.COMPONENTS.TOASTS.route]: undefined;
[DESIGN_SYSTEM_ROUTES.COMPONENTS.BOTTOM_SHEET.route]: undefined;
[DESIGN_SYSTEM_ROUTES.COMPONENTS.TAB_NAVIGATION.route]: undefined;
+ [DESIGN_SYSTEM_ROUTES.COMPONENTS.WALLET.route]: undefined;
[DESIGN_SYSTEM_ROUTES.HEADERS.FIRST_LEVEL.route]: undefined;
[DESIGN_SYSTEM_ROUTES.HEADERS.SECOND_LEVEL.route]: undefined;
[DESIGN_SYSTEM_ROUTES.HEADERS.SECOND_LEVEL_SECTION_TITLE.route]: undefined;
@@ -34,12 +35,7 @@ export type DesignSystemParamsList = {
[DESIGN_SYSTEM_ROUTES.DEBUG.SAFE_AREA.route]: undefined;
[DESIGN_SYSTEM_ROUTES.DEBUG.SAFE_AREA_CENTERED.route]: undefined;
[DESIGN_SYSTEM_ROUTES.DEBUG.EDGE_TO_EDGE_AREA.route]: undefined;
+ [DESIGN_SYSTEM_ROUTES.DEBUG.FULL_SCREEN_MODAL.route]: undefined;
[DESIGN_SYSTEM_ROUTES.LEGACY.PICTOGRAMS.route]: undefined;
- [DESIGN_SYSTEM_ROUTES.LEGACY.BUTTONS.route]: undefined;
[DESIGN_SYSTEM_ROUTES.LEGACY.ILLUSTRATIONS.route]: undefined;
};
-
-export type DesignSystemModalParamsList = {
- [DESIGN_SYSTEM_ROUTES.MAIN.route]: undefined;
- [DESIGN_SYSTEM_ROUTES.DEBUG.FULL_SCREEN_MODAL.route]: undefined;
-};
diff --git a/ts/features/design-system/navigation/routes.ts b/ts/features/design-system/navigation/routes.ts
index 48ceca64e34..4baccfa8b81 100644
--- a/ts/features/design-system/navigation/routes.ts
+++ b/ts/features/design-system/navigation/routes.ts
@@ -29,6 +29,10 @@ const DESIGN_SYSTEM_ROUTES = {
TAB_NAVIGATION: {
route: "DESIGN_SYSTEM_TAB_NAVIGATION",
title: "Tab Navigation"
+ },
+ WALLET: {
+ route: "DESIGN_SYSTEM_WALLET",
+ title: "Wallet"
}
},
HEADERS: {
@@ -84,10 +88,6 @@ const DESIGN_SYSTEM_ROUTES = {
ILLUSTRATIONS: {
route: "DESIGN_SYSTEM_LEGACY_ILLUSTRATIONS",
title: "Illustrations"
- },
- BUTTONS: {
- route: "DESIGN_SYSTEM_LEGACY_BUTTONS",
- title: "Buttons"
}
} as const
} as const;
diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertExpired.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertExpired00.e2e.ts
similarity index 63%
rename from ts/features/euCovidCert/__e2e__/euCovidCertExpired.e2e.ts
rename to ts/features/euCovidCert/__e2e__/euCovidCertExpired00.e2e.ts
index 84b19fee096..7275f114f4d 100644
--- a/ts/features/euCovidCert/__e2e__/euCovidCertExpired.e2e.ts
+++ b/ts/features/euCovidCert/__e2e__/euCovidCertExpired00.e2e.ts
@@ -1,31 +1,21 @@
import { device } from "detox";
-import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
import { ensureLoggedIn } from "../../../__e2e__/utils";
+import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
+import { learnMoreLinkTestId, scrollToEUCovidMessage } from "./utils";
const euCovidCertExpiredSubject = "🏥 EUCovidCert - expired";
const euCovidCertExpiredTitle = "Expired Certificate title";
const euCovidCertExpiredSubTitle = "Expired Certificate sub title";
-const messageListTestId = "MessageList_inbox";
-const learnMoreLinkTestId = "euCovidCertLearnMoreLink";
-
describe("EuCovidCert Expired", () => {
beforeAll(async () => {
await device.launchApp({ newInstance: true });
await ensureLoggedIn();
});
- it("should find the expired EuCovidCert message and open it", async () => {
- await waitFor(element(by.text(euCovidCertExpiredSubject)))
- .toBeVisible()
- .whileElement(by.id(messageListTestId))
- .scroll(350, "down");
-
- const subject = element(by.text(euCovidCertExpiredSubject));
- await subject.tap();
- });
+ it("should find the expired EuCovidCert message, open it and check all the correct elements in the details page", async () => {
+ await openExpiredEUCovidMessage();
- it("should check all the correct elements in the details page", async () => {
await waitFor(element(by.text(euCovidCertExpiredTitle)))
.toBeVisible()
.withTimeout(e2eWaitRenderTimeout);
@@ -39,3 +29,10 @@ describe("EuCovidCert Expired", () => {
.withTimeout(e2eWaitRenderTimeout);
});
});
+
+const openExpiredEUCovidMessage = async () => {
+ await scrollToEUCovidMessage(euCovidCertExpiredSubject);
+
+ const subject = element(by.text(euCovidCertExpiredSubject));
+ await subject.tap();
+};
diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertRevoked.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertRevoked00.e2e.ts
similarity index 63%
rename from ts/features/euCovidCert/__e2e__/euCovidCertRevoked.e2e.ts
rename to ts/features/euCovidCert/__e2e__/euCovidCertRevoked00.e2e.ts
index c2de8638b12..d0a0e9cc314 100644
--- a/ts/features/euCovidCert/__e2e__/euCovidCertRevoked.e2e.ts
+++ b/ts/features/euCovidCert/__e2e__/euCovidCertRevoked00.e2e.ts
@@ -1,31 +1,21 @@
import { device } from "detox";
-import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
import { ensureLoggedIn } from "../../../__e2e__/utils";
+import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
+import { learnMoreLinkTestId, scrollToEUCovidMessage } from "./utils";
const euCovidCertRevokedSubject = "🏥 EUCovidCert - revoked";
const euCovidCertRevokedTitle = "Revoked Certificate title";
const euCovidCertRevokedSubTitle = "Revoked Certificate sub title";
-const messageListTestId = "MessageList_inbox";
-const learnMoreLinkTestId = "euCovidCertLearnMoreLink";
-
describe("EuCovidCert Revoked", () => {
beforeAll(async () => {
await device.launchApp({ newInstance: true });
await ensureLoggedIn();
});
- it("should find the revoked EuCovidCert message and open it", async () => {
- await waitFor(element(by.text(euCovidCertRevokedSubject)))
- .toBeVisible()
- .whileElement(by.id(messageListTestId))
- .scroll(350, "down");
-
- const subject = element(by.text(euCovidCertRevokedSubject));
- await subject.tap();
- });
+ it("should find the revoked EuCovidCert message, open it and check all the correct elements in the details page", async () => {
+ await openRevokedEUCovidMessage();
- it("should check all the correct elements in the details page", async () => {
await waitFor(element(by.text(euCovidCertRevokedTitle)))
.toBeVisible()
.withTimeout(e2eWaitRenderTimeout);
@@ -39,3 +29,10 @@ describe("EuCovidCert Revoked", () => {
.withTimeout(e2eWaitRenderTimeout);
});
});
+
+const openRevokedEUCovidMessage = async () => {
+ await scrollToEUCovidMessage(euCovidCertRevokedSubject);
+
+ const subject = element(by.text(euCovidCertRevokedSubject));
+ await subject.tap();
+};
diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertValid.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertValid.e2e.ts
deleted file mode 100644
index 8f2fe2ac19b..00000000000
--- a/ts/features/euCovidCert/__e2e__/euCovidCertValid.e2e.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-import { device } from "detox";
-import I18n from "../../../i18n";
-import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
-import { ensureLoggedIn } from "../../../__e2e__/utils";
-
-const euCovidCertValidSubject = "🏥 EUCovidCert - valid";
-const euCovidCertValidTitle = "Valid Certificate title";
-const euCovidCertValidSubTitle = "Valid Certificate sub title";
-
-const messageListTestId = "MessageList_inbox";
-const qrCodeTestId = "QRCode";
-const fullScreenQrCodeTestId = "fullScreenQRCode";
-
-describe("EuCovidCert Valid", () => {
- beforeAll(async () => {
- await device.launchApp({ newInstance: true });
- await ensureLoggedIn();
- });
-
- it("should find the valid EuCovidCert message and open it", async () => {
- await waitFor(element(by.text(euCovidCertValidSubject)))
- .toBeVisible()
- .whileElement(by.id(messageListTestId))
- .scroll(350, "down");
-
- const subject = element(by.text(euCovidCertValidSubject));
- await subject.tap();
- });
-
- it("should check all the correct elements in the details page", async () => {
- await waitFor(element(by.text(euCovidCertValidTitle)))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- await waitFor(element(by.text(euCovidCertValidSubTitle)))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- await waitFor(element(by.text(I18n.t("global.genericSave"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- await waitFor(element(by.id(qrCodeTestId)))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- });
-
- it("should open the QRCode in fullscreen and return back", async () => {
- const qrCode = element(by.id(qrCodeTestId));
- await qrCode.tap();
-
- await waitFor(element(by.id(fullScreenQrCodeTestId)))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- await waitFor(element(by.text(I18n.t("global.buttons.close"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- const closeButton = element(by.text(I18n.t("global.buttons.close")));
- await closeButton.tap();
- });
-
- it("should open the certificate details page and return back", async () => {
- await waitFor(element(by.text(I18n.t("global.buttons.details"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- const detailsButton = element(by.text(I18n.t("global.buttons.details")));
- await detailsButton.tap();
-
- await waitFor(element(by.text(I18n.t("global.buttons.close"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- const closeButton = element(by.text(I18n.t("global.buttons.close")));
- await closeButton.tap();
- });
-
- it("should save the certificate in the gallery", async () => {
- await waitFor(element(by.text(I18n.t("global.genericSave"))))
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- const saveButton = element(by.text(I18n.t("global.genericSave")));
- await saveButton.tap();
-
- await waitFor(
- element(
- by.text(
- I18n.t(
- "features.euCovidCertificate.save.bottomSheet.saveAsImage.title"
- )
- )
- )
- )
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
-
- const saveIntoGalleryButton = element(
- by.text(
- I18n.t("features.euCovidCertificate.save.bottomSheet.saveAsImage.title")
- )
- );
- await saveIntoGalleryButton.tap();
-
- await waitFor(
- element(by.text(I18n.t("features.euCovidCertificate.save.ok")))
- )
- .toBeVisible()
- .withTimeout(e2eWaitRenderTimeout);
- });
-});
diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertValid00.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertValid00.e2e.ts
new file mode 100644
index 00000000000..c76e0ebc284
--- /dev/null
+++ b/ts/features/euCovidCert/__e2e__/euCovidCertValid00.e2e.ts
@@ -0,0 +1,35 @@
+import { device } from "detox";
+import I18n from "../../../i18n";
+import { ensureLoggedIn } from "../../../__e2e__/utils";
+import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
+import { openValidEUCovidMessage, qrCodeTestId } from "./utils";
+
+const euCovidCertValidTitle = "Valid Certificate title";
+const euCovidCertValidSubTitle = "Valid Certificate sub title";
+
+describe("EuCovidCert Valid", () => {
+ beforeAll(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("should find the valid EuCovidCert message, open it and check all the correct elements in the details page", async () => {
+ await openValidEUCovidMessage();
+
+ await waitFor(element(by.text(euCovidCertValidTitle)))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ await waitFor(element(by.text(euCovidCertValidSubTitle)))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ await waitFor(element(by.text(I18n.t("global.genericSave"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ await waitFor(element(by.id(qrCodeTestId)))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ });
+});
diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertValid01.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertValid01.e2e.ts
new file mode 100644
index 00000000000..b2d36406d8b
--- /dev/null
+++ b/ts/features/euCovidCert/__e2e__/euCovidCertValid01.e2e.ts
@@ -0,0 +1,34 @@
+import { device } from "detox";
+import I18n from "../../../i18n";
+import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
+import { ensureLoggedIn } from "../../../__e2e__/utils";
+import {
+ fullScreenQrCodeTestId,
+ openValidEUCovidMessage,
+ qrCodeTestId
+} from "./utils";
+
+describe("EuCovidCert Valid", () => {
+ beforeAll(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("should open the QRCode in fullscreen and return back", async () => {
+ await openValidEUCovidMessage();
+
+ const qrCode = element(by.id(qrCodeTestId));
+ await qrCode.tap();
+
+ await waitFor(element(by.id(fullScreenQrCodeTestId)))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ await waitFor(element(by.text(I18n.t("global.buttons.close"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ const closeButton = element(by.text(I18n.t("global.buttons.close")));
+ await closeButton.tap();
+ });
+});
diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertValid02.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertValid02.e2e.ts
new file mode 100644
index 00000000000..964a37c6645
--- /dev/null
+++ b/ts/features/euCovidCert/__e2e__/euCovidCertValid02.e2e.ts
@@ -0,0 +1,30 @@
+import { device } from "detox";
+import I18n from "../../../i18n";
+import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
+import { ensureLoggedIn } from "../../../__e2e__/utils";
+import { openValidEUCovidMessage } from "./utils";
+
+describe("EuCovidCert Valid", () => {
+ beforeAll(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("should open the certificate details page and return back", async () => {
+ await openValidEUCovidMessage();
+
+ await waitFor(element(by.text(I18n.t("global.buttons.details"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ const detailsButton = element(by.text(I18n.t("global.buttons.details")));
+ await detailsButton.tap();
+
+ await waitFor(element(by.text(I18n.t("global.buttons.close"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ const closeButton = element(by.text(I18n.t("global.buttons.close")));
+ await closeButton.tap();
+ });
+});
diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertValid03.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertValid03.e2e.ts
new file mode 100644
index 00000000000..493ec46b041
--- /dev/null
+++ b/ts/features/euCovidCert/__e2e__/euCovidCertValid03.e2e.ts
@@ -0,0 +1,48 @@
+import { device } from "detox";
+import I18n from "../../../i18n";
+import { e2eWaitRenderTimeout } from "../../../__e2e__/config";
+import { ensureLoggedIn } from "../../../__e2e__/utils";
+import { openValidEUCovidMessage } from "./utils";
+
+describe("EuCovidCert Valid", () => {
+ beforeAll(async () => {
+ await device.launchApp({ newInstance: true });
+ await ensureLoggedIn();
+ });
+
+ it("should save the certificate in the gallery", async () => {
+ await openValidEUCovidMessage();
+
+ await waitFor(element(by.text(I18n.t("global.genericSave"))))
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ const saveButton = element(by.text(I18n.t("global.genericSave")));
+ await saveButton.tap();
+
+ await waitFor(
+ element(
+ by.text(
+ I18n.t(
+ "features.euCovidCertificate.save.bottomSheet.saveAsImage.title"
+ )
+ )
+ )
+ )
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+
+ const saveIntoGalleryButton = element(
+ by.text(
+ I18n.t("features.euCovidCertificate.save.bottomSheet.saveAsImage.title")
+ )
+ );
+ await saveIntoGalleryButton.tap();
+
+ await waitFor(
+ element(by.text(I18n.t("features.euCovidCertificate.save.ok")))
+ )
+ .toBeVisible()
+ .withTimeout(e2eWaitRenderTimeout);
+ });
+});
diff --git a/ts/features/euCovidCert/__e2e__/utils.ts b/ts/features/euCovidCert/__e2e__/utils.ts
new file mode 100644
index 00000000000..759fde03a09
--- /dev/null
+++ b/ts/features/euCovidCert/__e2e__/utils.ts
@@ -0,0 +1,20 @@
+const euCovidCertValidSubject = "🏥 EUCovidCert - valid";
+
+export const learnMoreLinkTestId = "euCovidCertLearnMoreLink";
+export const messageListTestId = "MessageList_inbox";
+export const qrCodeTestId = "QRCode";
+export const fullScreenQrCodeTestId = "fullScreenQRCode";
+
+export const scrollToEUCovidMessage = async (messageSubject: string) => {
+ await waitFor(element(by.text(messageSubject)))
+ .toBeVisible()
+ .whileElement(by.id(messageListTestId))
+ .scroll(350, "down");
+};
+
+export const openValidEUCovidMessage = async () => {
+ await scrollToEUCovidMessage(euCovidCertValidSubject);
+
+ const subject = element(by.text(euCovidCertValidSubject));
+ await subject.tap();
+};
diff --git a/ts/features/euCovidCert/analytics/index.ts b/ts/features/euCovidCert/analytics/index.ts
index 4fcf7efbc51..748c6a73eb6 100644
--- a/ts/features/euCovidCert/analytics/index.ts
+++ b/ts/features/euCovidCert/analytics/index.ts
@@ -1,4 +1,5 @@
import { getType } from "typesafe-actions";
+import { constVoid } from "fp-ts/lib/function";
import { euCovidCertificateEnabled } from "../../../config";
import { mixpanel } from "../../../mixpanel";
import { Action } from "../../../store/actions/types";
@@ -11,7 +12,7 @@ import {
const trackEuCovidCertificateActions =
(mp: NonNullable) =>
- (action: Action): Promise => {
+ (action: Action): void => {
switch (action.type) {
case getType(euCovidCertificateGet.request):
return mp.track(action.type);
@@ -25,7 +26,6 @@ const trackEuCovidCertificateActions =
reason: getNetworkErrorMessage(action.payload)
});
}
- return Promise.resolve();
};
const trackEuCovidCertificateGetSuccessResponse = (
@@ -55,7 +55,7 @@ const trackEuCovidCertificateGetSuccessResponse = (
};
const emptyTracking = (_: NonNullable) => (__: Action) =>
- Promise.resolve();
+ constVoid();
export default euCovidCertificateEnabled
? trackEuCovidCertificateActions
diff --git a/ts/features/euCovidCert/components/MarkdownHandleCustomLink.tsx b/ts/features/euCovidCert/components/MarkdownHandleCustomLink.tsx
index 789ee805216..5523fc8d95b 100644
--- a/ts/features/euCovidCert/components/MarkdownHandleCustomLink.tsx
+++ b/ts/features/euCovidCert/components/MarkdownHandleCustomLink.tsx
@@ -2,16 +2,16 @@ import * as E from "fp-ts/lib/Either";
import { pipe } from "fp-ts/lib/function";
import { Toast } from "native-base";
import * as React from "react";
-import Markdown from "../../../components/ui/Markdown";
+import LegacyMarkdown from "../../../components/ui/Markdown/LegacyMarkdown";
import { deriveCustomHandledLink } from "../../../components/ui/Markdown/handlers/link";
import I18n from "../../../i18n";
import { clipboardSetStringWithFeedback } from "../../../utils/clipboard";
import { taskLinking } from "../../../utils/url";
export const MarkdownHandleCustomLink = (
- props: React.ComponentProps
+ props: React.ComponentProps
): React.ReactElement => (
- {
pipe(
@@ -32,5 +32,5 @@ export const MarkdownHandleCustomLink = (
}}
>
{props.children}
-
+
);
diff --git a/ts/features/euCovidCert/navigation/navigator.tsx b/ts/features/euCovidCert/navigation/navigator.tsx
index 5c95a024313..4133fbbb5c3 100644
--- a/ts/features/euCovidCert/navigation/navigator.tsx
+++ b/ts/features/euCovidCert/navigation/navigator.tsx
@@ -12,8 +12,7 @@ const Stack = createStackNavigator();
export const EUCovidCertStackNavigator = () => (
void;
-}>;
-
-const formattedTime = (time: number) => {
- const date = new Date(time * 1000);
- const minutes = date.getUTCMinutes();
- const seconds = date.getSeconds();
- return `${minutes.toString().padStart(2, "0")}:${seconds
- .toString()
- .padStart(2, "0")}`;
-};
-
-const ConuntDown = (props: Props) => {
- const { totalSeconds: totalTime, onExpiration } = props;
- const [remainingTime, setRemainingTime] = React.useState(totalTime);
-
- React.useEffect(() => {
- const intervalId = setInterval(() => {
- setRemainingTime(prevRemainingTime =>
- prevRemainingTime > 0 ? prevRemainingTime - 1 : 0
- );
- }, 1000);
-
- return () => {
- clearInterval(intervalId);
- };
- }, []);
-
- React.useEffect(() => {
- if (remainingTime === 0) {
- onExpiration();
- }
- }, [onExpiration, remainingTime]);
-
- return (
- <>
- {`${formattedTime(remainingTime)}`}
- >
- );
-};
-
-export default ConuntDown;
diff --git a/ts/features/fastLogin/components/ModalHeader.tsx b/ts/features/fastLogin/components/ModalHeader.tsx
deleted file mode 100644
index d4be6f18e04..00000000000
--- a/ts/features/fastLogin/components/ModalHeader.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import * as React from "react";
-import { View, StyleSheet } from "react-native";
-import { IOColors, Icon } from "@pagopa/io-app-design-system";
-import ButtonDefaultOpacity from "../../../components/ButtonDefaultOpacity";
-import I18n from "../../../i18n";
-import { IOStyles } from "../../../components/core/variables/IOStyles";
-import { WithTestID } from "../../../types/WithTestID";
-
-const styles = StyleSheet.create({
- mainContainer: {
- flexDirection: "row",
- alignItems: "center",
- justifyContent: "space-between",
- ...IOStyles.horizontalContentPadding,
- paddingTop: 24,
- backgroundColor: IOColors.white,
- borderTopRightRadius: 16,
- borderTopLeftRadius: 16
- },
- closeButton: {
- paddingRight: 0,
- justifyContent: "flex-end"
- }
-});
-
-type ModalHeaderProps = WithTestID<{
- onClose: () => void;
-}>;
-
-const ModalHeader = ({ onClose, testID }: ModalHeaderProps) => (
-
-
-
-
-
-
-);
-
-export default ModalHeader;
diff --git a/ts/features/fastLogin/saga/pendingActionsSaga.ts b/ts/features/fastLogin/saga/pendingActionsSaga.ts
index 290880e646b..903968ee1a3 100644
--- a/ts/features/fastLogin/saga/pendingActionsSaga.ts
+++ b/ts/features/fastLogin/saga/pendingActionsSaga.ts
@@ -1,9 +1,19 @@
import { SagaIterator } from "redux-saga";
-import { put, select, take, takeLatest } from "typed-redux-saga/macro";
+import {
+ put,
+ race,
+ select,
+ take,
+ takeLatest,
+ delay
+} from "typed-redux-saga/macro";
+import { Millisecond } from "@pagopa/ts-commons/lib/units";
import { applicationInitialized } from "../../../store/actions/application";
import { clearPendingAction } from "../store/actions/tokenRefreshActions";
import { fastLoginPendingActionsSelector } from "../store/selectors";
+const ACTION_TO_WAIT_FOR_TIMEOUT = 3000 as Millisecond;
+
export function* watchPendingActionsSaga(): SagaIterator {
yield* takeLatest(applicationInitialized, handleApplicationInitialized);
}
@@ -13,11 +23,24 @@ function* handleApplicationInitialized(
) {
const { actionsToWaitFor } = _.payload;
const pendingActions = yield* select(fastLoginPendingActionsSelector);
+ // if there are no pending actions,
+ // we don't need to wait for anything,
+ // because there is no saga to restart
+ // with the pending actions
if (pendingActions.length === 0) {
return;
}
+ // If there are pending actions,
+ // we wait for the actionsToWaitFor, if any,
+ // and then we dispatch the pending actions.
for (const action of actionsToWaitFor) {
- yield* take(action);
+ // If for some reason the action is dispatched before
+ // we start waiting for it, we are stuck here.
+ // So we need to handle this race contion.
+ yield* race({
+ take: take(action),
+ timeout: delay(ACTION_TO_WAIT_FOR_TIMEOUT)
+ });
}
for (const action of pendingActions) {
yield* put(action);
diff --git a/ts/features/fastLogin/saga/tokenRefreshSaga.ts b/ts/features/fastLogin/saga/tokenRefreshSaga.ts
index 9f960259544..4065f8ba3d0 100644
--- a/ts/features/fastLogin/saga/tokenRefreshSaga.ts
+++ b/ts/features/fastLogin/saga/tokenRefreshSaga.ts
@@ -44,6 +44,7 @@ import {
import { getPin } from "../../../utils/keychain";
import { dismissSupport } from "../../../utils/supportAssistance";
import { MESSAGES_ROUTES } from "../../messages/navigation/routes";
+import ROUTES from "../../../navigation/routes";
export function* watchTokenRefreshSaga(): SagaIterator {
yield* takeLatest(refreshSessionToken.request, handleRefreshSessionToken);
@@ -90,7 +91,9 @@ function* handleRefreshSessionToken(
}
} else {
// Lock the app
- NavigationService.navigate(MESSAGES_ROUTES.MESSAGES_HOME);
+ NavigationService.navigate(ROUTES.MAIN, {
+ screen: MESSAGES_ROUTES.MESSAGES_HOME
+ });
yield* put(identificationRequest());
}
}
diff --git a/ts/features/fastLogin/saga/utils/index.ts b/ts/features/fastLogin/saga/utils/index.ts
index cbbdb3df550..7562a148acb 100644
--- a/ts/features/fastLogin/saga/utils/index.ts
+++ b/ts/features/fastLogin/saga/utils/index.ts
@@ -11,13 +11,48 @@ import {
savePendingAction
} from "../../store/actions/tokenRefreshActions";
+type RefreshApiCallErrorHandlingTypeWithTypeField = {
+ errorMessage?: string;
+ skipThrowingError?: boolean;
+ // Because we check the "type" field in a type guard
+ // looking for a Redux Action,
+ // we must be sure to never put a property named "type"
+ // inside this object.
+ type?: never;
+};
+
+export type RefreshApiCallErrorHandlingType = Omit<
+ RefreshApiCallErrorHandlingTypeWithTypeField,
+ "type"
+>;
+
+function isReduxAction(
+ obj?: A | RefreshApiCallErrorHandlingType
+): obj is A {
+ return !!(obj && "type" in obj);
+}
+
+// The function implementation with flexible parameter handling
+// This has been done as a refactor to avoid the use of optional parameters
export function* withRefreshApiCall(
apiCall: Promise | R>>,
- action?: A | undefined,
- errorMessage?: string,
- skipThrowingError: boolean = false
+ actionOrErrorHandling?: A | RefreshApiCallErrorHandlingType
): SagaIterator | R>> {
const response = yield* call(() => apiCall);
+
+ // eslint-disable-next-line functional/no-let
+ let action: A | undefined;
+ // eslint-disable-next-line functional/no-let
+ let errorHandling: typeof actionOrErrorHandling = {};
+
+ if (isReduxAction(actionOrErrorHandling)) {
+ action = actionOrErrorHandling;
+ } else {
+ errorHandling =
+ (actionOrErrorHandling as RefreshApiCallErrorHandlingType) ?? {};
+ }
+
+ const { errorMessage, skipThrowingError } = errorHandling;
// BEWARE: we can cast to any only because we know for sure that f will
// always return a Promise>
if (E.isRight(response) && (response.right as any).status === 401) {
diff --git a/ts/features/fastLogin/screens/AskUserInteractionScreen.tsx b/ts/features/fastLogin/screens/AskUserInteractionScreen.tsx
new file mode 100644
index 00000000000..8656448388a
--- /dev/null
+++ b/ts/features/fastLogin/screens/AskUserInteractionScreen.tsx
@@ -0,0 +1,38 @@
+import * as React from "react";
+import { Modal } from "react-native";
+import { IOPictograms } from "@pagopa/io-app-design-system";
+import { useAvoidHardwareBackButton } from "../../../utils/useAvoidHardwareBackButton";
+import { OperationResultScreenContent } from "../../../components/screens/OperationResultScreenContent";
+
+type PrimaryActionType = Parameters<
+ typeof OperationResultScreenContent
+>[0]["action"];
+
+type SecondaryActionType = Parameters<
+ typeof OperationResultScreenContent
+>[0]["secondaryAction"];
+
+export type Props = {
+ title: string;
+ subtitle: string;
+ pictogramName: IOPictograms;
+ primaryAction?: PrimaryActionType;
+ secondaryAction?: SecondaryActionType;
+};
+
+const AskUserInteractionScreen = (props: Props) => {
+ useAvoidHardwareBackButton();
+
+ return (
+
+
+
+ );
+};
+export default AskUserInteractionScreen;
diff --git a/ts/features/fastLogin/screens/AskUserInterarctionScreen.tsx b/ts/features/fastLogin/screens/AskUserInterarctionScreen.tsx
deleted file mode 100644
index eff8a7e7e00..00000000000
--- a/ts/features/fastLogin/screens/AskUserInterarctionScreen.tsx
+++ /dev/null
@@ -1,143 +0,0 @@
-import * as React from "react";
-import {
- View,
- SafeAreaView,
- StyleSheet,
- Modal,
- GestureResponderEvent
-} from "react-native";
-import {
- ButtonOutline,
- ButtonSolid,
- HSpacer,
- VSpacer,
- IOPictograms,
- Pictogram
-} from "@pagopa/io-app-design-system";
-import I18n from "../../../i18n";
-import { Body } from "../../../components/core/typography/Body";
-import { H3 } from "../../../components/core/typography/H3";
-import { IOStyles } from "../../../components/core/variables/IOStyles";
-import themeVariables from "../../../theme/variables";
-import { useAvoidHardwareBackButton } from "../../../utils/useAvoidHardwareBackButton";
-import CountDown from "../components/CountDown";
-import ModalHeader from "../components/ModalHeader";
-
-const styles = StyleSheet.create({
- mainContainer: {
- flex: 1,
- justifyContent: "center",
- alignItems: "center",
- padding: themeVariables.contentPaddingLarge
- },
- buttonContainer: {
- flexDirection: "row",
- padding: themeVariables.contentPadding
- },
- title: {
- textAlign: "center"
- }
-});
-
-type ButtonStyle = {
- type: "solid" | "outline";
- title: string;
-};
-type ButtonStylesProps = {
- submitButtonStyle: ButtonStyle;
- cancelButtonStyle?: ButtonStyle;
-};
-const DefaultButtonStylesProps: ButtonStylesProps = {
- submitButtonStyle: {
- type: "solid",
- title: I18n.t("global.buttons.continue")
- },
- cancelButtonStyle: { type: "outline", title: I18n.t("global.buttons.cancel") }
-};
-
-const DEFAULT_TIMER_DURATION = 60;
-
-export type Props = {
- title: string;
- subtitle: string;
- pictogramName: IOPictograms;
- onSubmit: () => void;
- onCancel?: () => void;
- onClose?: () => void;
- onTimerExpired?: () => void;
- timerDurationInSeconds?: number;
- buttonStylesProps?: ButtonStylesProps;
-};
-
-const AskUserInteractionScreen = (props: Props) => {
- useAvoidHardwareBackButton();
-
- const { submitButtonStyle, cancelButtonStyle } =
- props.buttonStylesProps || DefaultButtonStylesProps;
-
- const cancelButtonTitle =
- cancelButtonStyle?.title || I18n.t("global.buttons.exit");
- const cancelButtonProps = {
- fullWidth: true,
- onPress: (_: GestureResponderEvent) => props.onCancel && props.onCancel(),
- label: cancelButtonTitle,
- accessibilityLabel: cancelButtonTitle
- };
-
- const submitButtonTitle = submitButtonStyle.title;
- const submitButtonProps = {
- fullWidth: true,
- onPress: (_: GestureResponderEvent) => props.onSubmit(),
- label: submitButtonTitle,
- accessibilityLabel: submitButtonTitle
- };
-
- return (
-
-
- {props.onClose && (
-
- )}
-
-
-
- {props.title}
-
- {props.subtitle}
-
- {props.onTimerExpired && (
-
- )}
-
-
- {props.onCancel && (
- <>
-
- {cancelButtonStyle?.type === "outline" ? (
-
- ) : (
-
- )}
-
-
- >
- )}
-
- {submitButtonStyle.type === "solid" ? (
-
- ) : (
-
- )}
-
-
-
-
- );
-};
-export default AskUserInteractionScreen;
diff --git a/ts/features/fastLogin/screens/FastLoginModals.tsx b/ts/features/fastLogin/screens/FastLoginModals.tsx
index debd9d31b92..d2e077fbdac 100644
--- a/ts/features/fastLogin/screens/FastLoginModals.tsx
+++ b/ts/features/fastLogin/screens/FastLoginModals.tsx
@@ -3,12 +3,11 @@ import React from "react";
import { useDispatch } from "react-redux";
import { TokenRefreshState } from "../store/reducers/tokenRefreshReducer";
import { logoutRequest } from "../../../store/actions/authentication";
-import { openWebUrl } from "../../../utils/url";
import {
askUserToRefreshSessionToken,
clearTokenRefreshError
} from "../store/actions/tokenRefreshActions";
-import AskUserInteractionScreen from "./AskUserInterarctionScreen";
+import AskUserInteractionScreen from "./AskUserInteractionScreen";
import RefreshTokenLoadingScreen from "./RefreshTokenLoadingScreen";
const FastLoginModals = (
@@ -20,21 +19,21 @@ const FastLoginModals = (
if (tokenRefreshing.kind === "no-pin-error") {
return (
{
- dispatch(clearTokenRefreshError());
- dispatch(logoutRequest());
- }}
- buttonStylesProps={{
- submitButtonStyle: {
- type: "solid",
- title: I18n.t(
- "fastLogin.userInteraction.sessionExpired.noPin.submitButtonTitle"
- )
+ primaryAction={{
+ label: I18n.t(
+ "fastLogin.userInteraction.sessionExpired.noPin.submitButtonTitle"
+ ),
+ accessibilityLabel: I18n.t(
+ "fastLogin.userInteraction.sessionExpired.noPin.submitButtonTitle"
+ ),
+ onPress: () => {
+ dispatch(clearTokenRefreshError());
+ dispatch(logoutRequest());
}
}}
/>
@@ -44,26 +43,13 @@ const FastLoginModals = (
if (tokenRefreshing.kind === "transient-error") {
return (
{
- // FIXME: update this URL once available
- // https://pagopa.atlassian.net/browse/IOPID-393
- openWebUrl("https://io.italia.it/faq");
- }}
- buttonStylesProps={{
- submitButtonStyle: {
- type: "solid",
- title: I18n.t(
- "fastLogin.userInteraction.sessionExpired.transientError.submitButtonTitle"
- )
- }
- }}
/>
);
}
@@ -75,22 +61,22 @@ const FastLoginModals = (
if (isFastLoginUserInteractionNeeded) {
return (
{
- dispatch(askUserToRefreshSessionToken.success("yes"));
- }}
- buttonStylesProps={{
- submitButtonStyle: {
- type: "solid",
- title: I18n.t(
- "fastLogin.userInteraction.sessionExpired.continueNavigation.submitButtonTitle"
- )
+ primaryAction={{
+ label: I18n.t(
+ "fastLogin.userInteraction.sessionExpired.continueNavigation.submitButtonTitle"
+ ),
+ accessibilityLabel: I18n.t(
+ "fastLogin.userInteraction.sessionExpired.continueNavigation.submitButtonTitle"
+ ),
+ onPress: () => {
+ dispatch(askUserToRefreshSessionToken.success("yes"));
}
}}
/>
diff --git a/ts/features/fastLogin/screens/__tests__/AskUserToContinueScreen.test.tsx b/ts/features/fastLogin/screens/__tests__/AskUserToContinueScreen.test.tsx
index 9a761083dd1..b90f48c68b6 100644
--- a/ts/features/fastLogin/screens/__tests__/AskUserToContinueScreen.test.tsx
+++ b/ts/features/fastLogin/screens/__tests__/AskUserToContinueScreen.test.tsx
@@ -1,10 +1,10 @@
import React from "react";
-import { render, fireEvent, act } from "@testing-library/react-native";
+import { render, fireEvent } from "@testing-library/react-native";
import { Provider } from "react-redux";
import { Store, createStore } from "redux";
import * as _ from "lodash";
import type { IOPictograms } from "@pagopa/io-app-design-system";
-import AskUserInteractionScreen, { Props } from "../AskUserInterarctionScreen";
+import AskUserInteractionScreen, { Props } from "../AskUserInteractionScreen";
import { GlobalState } from "../../../../store/reducers/types";
import { appReducer } from "../../../../store/reducers";
import { applicationChangeState } from "../../../../store/actions/application";
@@ -14,87 +14,65 @@ jest.useFakeTimers();
const globalState = appReducer(undefined, applicationChangeState("active"));
const store = createStore(appReducer, globalState as any);
+const primaryActionButtonTitle = "Continue";
+const secondaryActionButtonTitle = "Cancel";
+
const defaultProps = {
title: "Test title",
subtitle: "Test subtitle",
pictogramName: "timeout" as IOPictograms,
- onSubmit: jest.fn(),
- onClose: jest.fn(),
- onCancel: jest.fn(),
- onTimerExpired: jest.fn(),
- timerDurationInSeconds: 10
+ primaryAction: {
+ label: primaryActionButtonTitle,
+ accessibilityLabel: primaryActionButtonTitle,
+ onPress: jest.fn()
+ },
+ secondaryAction: {
+ label: secondaryActionButtonTitle,
+ accessibilityLabel: secondaryActionButtonTitle,
+ onPress: jest.fn()
+ }
};
describe("AskUserInteractionScreen component", () => {
it("should render properly", () => {
- const { getByText, getByTestId } = renderComponent(defaultProps, store);
+ const { getByText } = renderComponent(defaultProps, store);
expect(getByText(defaultProps.title)).toBeTruthy();
expect(getByText(defaultProps.subtitle)).toBeTruthy();
- const continueButton = getByText("Continue");
- const cancelButton = getByText("Cancel");
- const headerCloseButton = getByTestId("header-close-button");
- const countdownTimer = getByText("00:10");
+ const continueButton = getByText(primaryActionButtonTitle);
+ const cancelButton = getByText(secondaryActionButtonTitle);
expect(continueButton).toBeTruthy();
expect(cancelButton).toBeTruthy();
- expect(headerCloseButton).toBeTruthy();
- expect(countdownTimer).toBeTruthy();
- expect(getByTestId("countdown-timer")).toBeTruthy();
});
- it("should call onSubmit when the continue button is pressed", () => {
+ it("should call primaryAction onPress when the primary button is pressed", () => {
const { getByText } = renderComponent(defaultProps, store);
- const button = getByText("Continue");
+ const button = getByText(primaryActionButtonTitle);
fireEvent.press(button);
- expect(defaultProps.onSubmit).toHaveBeenCalled();
+ expect(defaultProps.primaryAction.onPress).toHaveBeenCalled();
});
- it("should call onCancel when the exit button is pressed", () => {
+ it("should call secondaryAction onPress when the secondary button is pressed", () => {
const { getByText } = renderComponent(defaultProps, store);
- const button = getByText("Cancel");
+ const button = getByText(secondaryActionButtonTitle);
fireEvent.press(button);
- expect(defaultProps.onCancel).toHaveBeenCalled();
+ expect(defaultProps.secondaryAction.onPress).toHaveBeenCalled();
});
- it("should call onClose when the close button is pressed", () => {
- const { getByTestId } = renderComponent(defaultProps, store);
- const button = getByTestId("header-close-button");
- fireEvent.press(button);
- expect(defaultProps.onClose).toHaveBeenCalled();
- });
-
- it("does not render exit button if onExit prop is not provided", () => {
+ it("does not render primary button if primaryAction is not provided", () => {
const { queryByText } = renderComponent(
- _.omit(defaultProps, "onCancel"),
- store
- );
- expect(queryByText("Cancel")).toBeNull();
- });
-
- it("does not render close button if onExit prop is not provided", () => {
- const { queryByTestId } = renderComponent(
- _.omit(defaultProps, "onClose"),
+ _.omit(defaultProps, "primaryAction"),
store
);
- expect(queryByTestId("header-close-button")).toBeNull();
+ expect(queryByText(primaryActionButtonTitle)).toBeNull();
});
- it("does not render timer if onTimerExpired prop is not provided", () => {
- const { queryByTestId } = renderComponent(
- _.omit(defaultProps, "onTimerExpired"),
+ it("does not render secondary button if secondaryAction is not provided", () => {
+ const { queryByText } = renderComponent(
+ _.omit(defaultProps, "secondaryAction"),
store
);
- expect(queryByTestId("countdown-timer")).toBeNull();
- });
-
- it("should call onTimerExpired when the timer expires", async () => {
- renderComponent(defaultProps, store);
-
- await act(() => {
- jest.advanceTimersByTime(10 * 1000);
- });
-
- expect(defaultProps.onTimerExpired).toHaveBeenCalled();
+ expect(queryByText(secondaryActionButtonTitle)).toBeNull();
});
});
diff --git a/ts/features/fastLogin/store/selectors/__tests__/emailUniquenessValidation.test.ts b/ts/features/fastLogin/store/selectors/__tests__/emailUniquenessValidation.test.ts
deleted file mode 100644
index f47468e239e..00000000000
--- a/ts/features/fastLogin/store/selectors/__tests__/emailUniquenessValidation.test.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import * as O from "fp-ts/lib/Option";
-import { Tuple2, ITuple2 } from "@pagopa/ts-commons/lib/tuples";
-import { BackendStatus } from "../../../../../../definitions/content/BackendStatus";
-import { baseRawBackendStatus } from "../../../../../store/reducers/__mock__/backendStatus";
-import { GlobalState } from "../../../../../store/reducers/types";
-import { isEmailUniquenessValidationEnabledSelector } from "..";
-import { EmailUniquenessConfig } from "../../../../../../definitions/content/EmailUniquenessConfig";
-
-jest.mock("react-native-device-info", () => ({
- getReadableVersion: jest.fn().mockReturnValue("1.2.3.4"),
- getVersion: jest.fn().mockReturnValue("1.2.3.4")
-}));
-
-jest.mock("../../../../../config", () => ({
- isNewCduFlow: true
-}));
-
-describe('backend service Feature Flag "emailUniquenessValidation"', () => {
- const status: BackendStatus = {
- ...baseRawBackendStatus
- };
-
- const customStore = (emailUniquenessValidation: EmailUniquenessConfig) =>
- ({
- features: {
- loginFeatures: {
- fastLogin: {
- optIn: {
- enabled: true
- }
- }
- }
- },
- backendStatus: {
- status: O.some({
- ...status,
- config: {
- ...status.config,
- emailUniquenessValidation
- }
- })
- }
- } as unknown as GlobalState);
-
- [
- Tuple2("0", false),
- Tuple2("0.0", false),
- Tuple2("0.0.0", false),
- Tuple2("0.0.0.0", false),
- Tuple2("1", true),
- Tuple2("1.2", true),
- Tuple2("1.2.3", true),
- Tuple2("1.2.3.0", true),
- Tuple2("1.2.3.1", true),
- Tuple2("1.2.3.2", true),
- Tuple2("1.2.3.3", true),
- Tuple2("1.2.3.4", true),
- Tuple2("1.2.3.5", false),
- Tuple2("-1", false),
- Tuple2("", false),
- Tuple2(undefined, false),
- Tuple2("?$&&/!@", false),
- Tuple2("2", false),
- Tuple2("1.3", false),
- Tuple2("1.2.4", false)
- ].forEach((t: ITuple2) => {
- const [minAppVersion, expectedValue] = [t.e1, t.e2];
- it(`should return ${expectedValue} for ${JSON.stringify(
- minAppVersion
- )}`, () => {
- const store = customStore({
- min_app_version: {
- ios: minAppVersion,
- android: minAppVersion
- }
- });
-
- expect(isEmailUniquenessValidationEnabledSelector(store)).toBe(
- expectedValue
- );
- });
- });
-});
diff --git a/ts/features/fastLogin/store/selectors/index.ts b/ts/features/fastLogin/store/selectors/index.ts
index e9f7b1215e2..7becc55e6b3 100644
--- a/ts/features/fastLogin/store/selectors/index.ts
+++ b/ts/features/fastLogin/store/selectors/index.ts
@@ -1,24 +1,10 @@
import { createSelector } from "reselect";
import { uniqWith, isEqual } from "lodash";
import { backendStatusSelector } from "../../../../store/reducers/backendStatus";
-import {
- fastLoginOptIn,
- fastLoginEnabled,
- isNewCduFlow
-} from "../../../../config";
+import { fastLoginOptIn, fastLoginEnabled } from "../../../../config";
import { GlobalState } from "../../../../store/reducers/types";
import { isPropertyWithMinAppVersionEnabled } from "../../../../store/reducers/featureFlagWithMinAppVersionStatus";
-export const isEmailUniquenessValidationEnabledSelector = createSelector(
- backendStatusSelector,
- backendStatus =>
- isPropertyWithMinAppVersionEnabled({
- backendStatus,
- mainLocalFlag: isNewCduFlow,
- configPropertyName: "emailUniquenessValidation"
- })
-);
-
export const fastLoginOptInSelector = (state: GlobalState) =>
state.features.loginFeatures.fastLogin.optIn;
diff --git a/ts/features/fci/analytics/index.ts b/ts/features/fci/analytics/index.ts
index 0eaf9c86e46..99a6073ccd4 100644
--- a/ts/features/fci/analytics/index.ts
+++ b/ts/features/fci/analytics/index.ts
@@ -20,7 +20,7 @@ export const trackFciDocOpening = (
total_doc_count: number,
environment: string
) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_DOC_OPENING",
buildEventProperties("UX", "action", {
expire_date,
@@ -34,7 +34,7 @@ export const trackFciUserExit = (
environment: string,
cta_id?: string
) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_USER_EXIT",
buildEventProperties("UX", "exit", {
screen_name,
@@ -44,7 +44,7 @@ export const trackFciUserExit = (
);
export const trackFciUxConversion = (environment: string) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_UX_CONVERSION",
buildEventProperties("UX", "action", {
environment
@@ -52,7 +52,7 @@ export const trackFciUxConversion = (environment: string) =>
);
export const trackFciUserDataConfirmed = (environment: string) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_USER_DATA_CONFIRMED",
buildEventProperties("UX", "action", { environment })
);
@@ -63,7 +63,7 @@ export const trackFciDocOpeningSuccess = (
optional_sign_count: number,
environment: string
) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_DOC_OPENING_SUCCESS",
buildEventProperties("UX", "control", {
doc_count,
@@ -74,13 +74,13 @@ export const trackFciDocOpeningSuccess = (
);
export const trackFciSigningDoc = (environment: string) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_SIGNING_DOC",
buildEventProperties("UX", "action", { environment })
);
export const trackFciShowSignatureFields = (environment: string) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_SHOW_SIGNATURE_FIELDS",
buildEventProperties("UX", "micro_action", { environment })
);
@@ -91,7 +91,7 @@ export const trackFciUxSuccess = (
optional_signed_count: number,
environment: string
) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_UX_SUCCESS",
buildEventProperties("UX", "screen_view", {
doc_signed_count,
@@ -102,14 +102,14 @@ export const trackFciUxSuccess = (
);
export const trackFciStartSignature = (environment: string) =>
- void mixpanelTrack(
+ mixpanelTrack(
"FCI_START_SIGNATURE",
buildEventProperties("UX", "action", { environment })
);
const trackFciAction =
(mp: NonNullable, environment: string) =>
- (action: Action): Promise => {
+ (action: Action): void => {
switch (action.type) {
case getType(fciStartRequest):
case getType(fciSignatureRequestFromId.request):
@@ -146,7 +146,6 @@ const trackFciAction =
})
);
}
- return Promise.resolve();
};
export default trackFciAction;
diff --git a/ts/features/fci/components/DocumentViewer.tsx b/ts/features/fci/components/DocumentViewer.tsx
index 14b23cdf843..aa9e0f8825b 100644
--- a/ts/features/fci/components/DocumentViewer.tsx
+++ b/ts/features/fci/components/DocumentViewer.tsx
@@ -1,17 +1,18 @@
import React, { useState } from "react";
import { StyleSheet } from "react-native";
-import { constNull } from "fp-ts/lib/function";
import * as pot from "@pagopa/ts-commons/lib/pot";
import ReactNativeBlobUtil from "react-native-blob-util";
import Pdf from "react-native-pdf";
import * as S from "fp-ts/lib/string";
-import { IOColors } from "@pagopa/io-app-design-system";
-import FooterWithButtons from "../../../components/ui/FooterWithButtons";
+import {
+ ButtonSolidProps,
+ FooterWithButtons,
+ IOColors
+} from "@pagopa/io-app-design-system";
import I18n from "../../../i18n";
import { isIos } from "../../../utils/platform";
import { share } from "../../../utils/share";
import { showToast } from "../../../utils/showToast";
-import { confirmButtonProps } from "../../../components/buttons/ButtonConfigurations";
import { FciDownloadPreviewDirectoryPath } from "../saga/networking/handleDownloadDocument";
import { useIODispatch, useIOSelector } from "../../../store/hooks";
import { fciDownloadPreview } from "../store/actions";
@@ -19,7 +20,7 @@ import {
fciDownloadPathSelector,
fciDownloadPreviewSelector
} from "../store/reducers/fciDownloadPreview";
-import { LoadingErrorComponent } from "../../../components/LoadingErrorComponent";
+import LoadingComponent from "./LoadingComponent";
const styles = StyleSheet.create({
pdf: {
@@ -31,94 +32,99 @@ const styles = StyleSheet.create({
export const getFileNameFromUrl = (url: string) =>
url.substring(url.lastIndexOf("/") + 1).split("?")[0] + ".pdf";
-const renderFooter = (url: string, filePath: string) =>
- isIos ? (
+const renderFooter = (url: string, filePath: string) => {
+ const confirmButtonProps: ButtonSolidProps = {
+ onPress: () => ReactNativeBlobUtil.ios.presentOptionsMenu(filePath),
+ label: I18n.t("messagePDFPreview.open"),
+ accessibilityLabel: I18n.t("messagePDFPreview.open")
+ };
+
+ const shareButtonProps: ButtonSolidProps = {
+ onPress: () => {
+ share(
+ `file://${
+ FciDownloadPreviewDirectoryPath + "/" + getFileNameFromUrl(url)
+ }`,
+ undefined,
+ false
+ )().catch(_ => {
+ showToast(I18n.t("messagePDFPreview.errors.sharing"));
+ });
+ },
+ label: I18n.t("global.buttons.share"),
+ accessibilityLabel: I18n.t("global.buttons.share")
+ };
+
+ const saveButtonProps: ButtonSolidProps = {
+ onPress: () => {
+ ReactNativeBlobUtil.MediaCollection.copyToMediaStore(
+ {
+ name: getFileNameFromUrl(url),
+ parentFolder: "",
+ mimeType: "application/pdf"
+ },
+ "Download",
+ FciDownloadPreviewDirectoryPath + "/" + getFileNameFromUrl(url)
+ )
+ .then(_ => {
+ showToast(
+ I18n.t("messagePDFPreview.savedAtLocation", {
+ name: "attachment.displayName"
+ }),
+ "success"
+ );
+ })
+ .catch(_ => {
+ showToast(I18n.t("messagePDFPreview.errors.saving"));
+ });
+ },
+ label: I18n.t("messagePDFPreview.save"),
+ accessibilityLabel: I18n.t("messagePDFPreview.save")
+ };
+
+ const openButtonProps: ButtonSolidProps = {
+ onPress: () => {
+ ReactNativeBlobUtil.android
+ .actionViewIntent(
+ FciDownloadPreviewDirectoryPath + "/" + getFileNameFromUrl(url),
+ "application/pdf"
+ )
+ .catch(_ => {
+ showToast(I18n.t("messagePDFPreview.errors.opening"));
+ });
+ },
+ label: I18n.t("messagePDFPreview.open"),
+ accessibilityLabel: I18n.t("messagePDFPreview.open")
+ };
+
+ return isIos ? (
{
- ReactNativeBlobUtil.ios.presentOptionsMenu(filePath);
- }, I18n.t("messagePDFPreview.open"))}
+ primary={{ type: "Solid", buttonProps: confirmButtonProps }}
/>
) : (
{
- share(
- `file://${
- FciDownloadPreviewDirectoryPath + "/" + getFileNameFromUrl(url)
- }`,
- undefined,
- false
- )().catch(_ => {
- showToast(I18n.t("messagePDFPreview.errors.sharing"));
- });
- },
- title: I18n.t("global.buttons.share")
- }}
- midButton={{
- bordered: true,
- primary: false,
- onPress: () => {
- ReactNativeBlobUtil.MediaCollection.copyToMediaStore(
- {
- name: getFileNameFromUrl(url),
- parentFolder: "",
- mimeType: "application/pdf"
- },
- "Download",
- FciDownloadPreviewDirectoryPath + "/" + getFileNameFromUrl(url)
- )
- .then(_ => {
- showToast(
- I18n.t("messagePDFPreview.savedAtLocation", {
- name: "attachment.displayName"
- }),
- "success"
- );
- })
- .catch(_ => {
- showToast(I18n.t("messagePDFPreview.errors.saving"));
- });
- },
- title: I18n.t("messagePDFPreview.save")
+ primary={{
+ type: "Solid",
+ buttonProps: shareButtonProps
}}
- rightButton={confirmButtonProps(() => {
- ReactNativeBlobUtil.android
- .actionViewIntent(
- FciDownloadPreviewDirectoryPath + "/" + getFileNameFromUrl(url),
- "application/pdf"
- )
- .catch(_ => {
- showToast(I18n.t("messagePDFPreview.errors.opening"));
- });
- }, I18n.t("messagePDFPreview.open"))}
+ secondary={{ type: "Outline", buttonProps: saveButtonProps }}
+ third={{ type: "Outline", buttonProps: openButtonProps }}
/>
);
+};
type Props = {
documentUrl: string;
- enableAnnotationRendering?: boolean;
onLoadComplete?: (totalPages: number) => void;
onPageChanged?: (page: number) => void;
onError: () => void;
};
-const LoadingComponent = () => (
-
-);
-
export const DocumentViewer = (props: Props): React.ReactElement => {
const [isError, setIsError] = useState(false);
const documentUrl = props.documentUrl;
- const enableAnnotationRendering = props.enableAnnotationRendering;
const dispatch = useIODispatch();
const fciDownloadSelector = useIOSelector(fciDownloadPreviewSelector);
const fciDownloadPath = useIOSelector(fciDownloadPathSelector);
@@ -128,7 +134,7 @@ export const DocumentViewer = (props: Props): React.ReactElement => {
}, [documentUrl, dispatch]);
if (pot.isLoading(fciDownloadSelector)) {
- return ;
+ return ;
}
if (pot.isError(fciDownloadSelector) || isError) {
@@ -148,7 +154,6 @@ export const DocumentViewer = (props: Props): React.ReactElement => {
setIsError(true);
}}
enablePaging
- enableAnnotationRendering={enableAnnotationRendering ? true : false}
/>
{renderFooter(documentUrl, fciDownloadPath)}
>
diff --git a/ts/features/fci/components/DocumentWithSignature.tsx b/ts/features/fci/components/DocumentWithSignature.tsx
index 4560d707252..58a5aedbe10 100644
--- a/ts/features/fci/components/DocumentWithSignature.tsx
+++ b/ts/features/fci/components/DocumentWithSignature.tsx
@@ -1,26 +1,31 @@
import * as React from "react";
import Pdf from "react-native-pdf";
-import { Body, Container, Left, Right } from "native-base";
import { constNull, pipe } from "fp-ts/lib/function";
import * as O from "fp-ts/lib/Option";
import * as pot from "@pagopa/ts-commons/lib/pot";
-import { SafeAreaView, StyleSheet } from "react-native";
-import { IconButton, IOColors } from "@pagopa/io-app-design-system";
-import { IOStyles } from "../../../components/core/variables/IOStyles";
-import FooterWithButtons from "../../../components/ui/FooterWithButtons";
+import { StyleSheet, View } from "react-native";
+import {
+ ButtonSolidProps,
+ FooterWithButtons,
+ H5,
+ HSpacer,
+ IconButton,
+ IOColors,
+ IOStyles,
+ VSpacer
+} from "@pagopa/io-app-design-system";
+import { SafeAreaView } from "react-native-safe-area-context";
import I18n from "../../../i18n";
import { ExistingSignatureFieldAttrs } from "../../../../definitions/fci/ExistingSignatureFieldAttrs";
import { SignatureFieldToBeCreatedAttrs } from "../../../../definitions/fci/SignatureFieldToBeCreatedAttrs";
import { fciSignatureDetailDocumentsSelector } from "../store/reducers/fciSignatureRequest";
-import AppHeader from "../../../components/ui/AppHeader";
import { useIODispatch, useIOSelector } from "../../../store/hooks";
import { WithTestID } from "../../../types/WithTestID";
-import { H5 } from "../../../components/core/typography/H5";
import { useOnFirstRender } from "../../../utils/hooks/useOnFirstRender";
import { fciDocumentSignatureFields } from "../store/actions";
import { fciSignatureFieldDrawingSelector } from "../store/reducers/fciSignatureFieldDrawing";
-import LoadingSpinnerOverlay from "../../../components/LoadingSpinnerOverlay";
import DocumentsNavigationBar from "./DocumentsNavigationBar";
+import LoadingComponent from "./LoadingComponent";
export type SignatureFieldAttrType =
| ExistingSignatureFieldAttrs
@@ -37,23 +42,32 @@ const styles = StyleSheet.create({
pdf: {
flex: 1,
backgroundColor: IOColors.bluegrey
+ },
+ header: {
+ alignItems: "center",
+ flexDirection: "row"
+ },
+ headerTitle: {
+ flex: 1,
+ textAlign: "center"
}
});
const DocumentWithSignature = (props: Props) => {
const pdfRef = React.useRef(null);
const [totalPages, setTotalPages] = React.useState(0);
- const [currentPage, setCurrentPage] = React.useState(0);
+ const [currentPage, setCurrentPage] = React.useState(1);
const documents = useIOSelector(fciSignatureDetailDocumentsSelector);
const parsedDocuments = useIOSelector(fciSignatureFieldDrawingSelector);
const { attrs, currentDoc } = props;
const dispatch = useIODispatch();
const onContinuePress = () => props.onClose();
- const continueButtonProps = {
- block: true,
- primary: true,
+ const continueButtonProps: ButtonSolidProps = {
onPress: onContinuePress,
- title: I18n.t("features.fci.documents.footer.backToSignFieldsList")
+ label: I18n.t("features.fci.documents.footer.backToSignFieldsList"),
+ accessibilityLabel: I18n.t(
+ "features.fci.documents.footer.backToSignFieldsList"
+ )
};
/**
@@ -89,7 +103,7 @@ const DocumentWithSignature = (props: Props) => {
source={{
uri: document
}}
- page={page + 1}
+ page={page}
onLoadComplete={(numberOfPages, _) => {
setTotalPages(numberOfPages);
}}
@@ -100,7 +114,6 @@ const DocumentWithSignature = (props: Props) => {
onError={props.onError}
onPressLink={constNull}
enablePaging
- enableAnnotationRendering={false}
style={styles.pdf}
/>
),
@@ -139,12 +152,6 @@ const DocumentWithSignature = (props: Props) => {
);
};
- /**
- * Renders the loading spinner.
- * @returns a loading spinner overlay
- */
- const LoadingView = () => ;
-
/**
* Callback to be used when the pdf cannot be loaded or the signature field cannot be drawn.
* It returns an empty fragment and calls the `onError` callback.
@@ -161,39 +168,40 @@ const DocumentWithSignature = (props: Props) => {
() =>
pot.fold(
parsedDocuments,
- () => ,
- () => ,
- () => ,
+ () => ,
+ () => ,
+ () => ,
() => ,
some => (
),
- () => ,
- () => ,
+ () => ,
+ () => ,
() =>
),
[ErrorView, RenderPdf, parsedDocuments]
);
return (
-
-
-
-
-
- {I18n.t("messagePDFPreview.title")}
-
-
-
-
-
-
+
+
+
+
+ {I18n.t("messagePDFPreview.title")}
+
+
+
+
{
currentPage,
totalPages
})}
- iconLeftColor={currentPage === 1 ? "bluegreyLight" : "blue"}
- iconRightColor={currentPage === totalPages ? "bluegreyLight" : "blue"}
+ iconLeftDisabled={currentPage === 1}
+ iconRightDisabled={currentPage === totalPages}
onPrevious={onPrevious}
onNext={onNext}
disabled={false}
testID={"FciDocumentsNavBarTestID"}
/>
-
-
-
-
-
+
+
+
);
};
export default DocumentWithSignature;
diff --git a/ts/features/fci/components/DocumentsNavigationBar.tsx b/ts/features/fci/components/DocumentsNavigationBar.tsx
index 66c8bd7150e..cf7bdcb7c92 100644
--- a/ts/features/fci/components/DocumentsNavigationBar.tsx
+++ b/ts/features/fci/components/DocumentsNavigationBar.tsx
@@ -1,10 +1,13 @@
import * as React from "react";
import { View, StyleSheet } from "react-native";
-import { IOColors, Icon, HSpacer } from "@pagopa/io-app-design-system";
-import ButtonDefaultOpacity from "../../../components/ButtonDefaultOpacity";
-import { H4 } from "../../../components/core/typography/H4";
-import { WithTestID } from "../../../types/WithTestID";
-import { IOStyles } from "../../../components/core/variables/IOStyles";
+import {
+ IOColors,
+ HSpacer,
+ H6,
+ IOStyles,
+ IconButton,
+ WithTestID
+} from "@pagopa/io-app-design-system";
const styles = StyleSheet.create({
container: {
@@ -13,13 +16,7 @@ const styles = StyleSheet.create({
borderColor: IOColors.bluegreyLight,
alignItems: "center",
paddingTop: 12,
- paddingBottom: 12
- },
- button: {
- paddingLeft: 8,
- paddingRight: 8,
- paddingBottom: 0,
- paddingTop: 0
+ paddingBottom: 14
},
shadow: {
// iOS
@@ -43,8 +40,8 @@ export type IndicatorPositionEnum = "left" | "right";
type Props = WithTestID<{
titleRight: string;
titleLeft: string;
- iconRightColor?: IOColors;
- iconLeftColor?: IOColors;
+ iconRightDisabled?: boolean;
+ iconLeftDisabled?: boolean;
disabled?: boolean;
indicatorPosition: IndicatorPositionEnum;
onPrevious: () => void;
@@ -52,41 +49,29 @@ type Props = WithTestID<{
}>;
const renderNavigationComponent = (
- { onPrevious, onNext, disabled, iconLeftColor, iconRightColor }: Props,
+ { onPrevious, onNext, iconLeftDisabled, iconRightDisabled }: Props,
title: string
) => (
<>
{/* button left */}
-
-
-
- {title}
+ icon="chevronLeft"
+ iconSize={24}
+ accessibilityLabel="previous"
+ />
+ {title}
{/* button right */}
-
-
-
+ icon="chevronRight"
+ iconSize={24}
+ accessibilityLabel="next"
+ />
>
);
@@ -101,13 +86,13 @@ const DocumentsNavigationBar = (props: Props) => (
<>
{renderNavigationComponent(props, props.titleLeft)}
- {props.titleRight}
+ {props.titleRight}
>
)}
{props.indicatorPosition === "right" && (
<>
- {props.titleLeft}
+ {props.titleLeft}
{renderNavigationComponent(props, props.titleRight)}
diff --git a/ts/features/fci/components/ErrorComponent.tsx b/ts/features/fci/components/ErrorComponent.tsx
index b73a2f6f181..b74d06224a7 100644
--- a/ts/features/fci/components/ErrorComponent.tsx
+++ b/ts/features/fci/components/ErrorComponent.tsx
@@ -1,12 +1,22 @@
import * as React from "react";
-import { SafeAreaView } from "react-native";
+import { View } from "react-native";
import { EmailString } from "@pagopa/ts-commons/lib/strings";
-import { IOPictograms, Pictogram } from "@pagopa/io-app-design-system";
+import {
+ ButtonOutline,
+ ButtonSolid,
+ ButtonSolidProps,
+ IOPictograms,
+ IOSpacingScale,
+ IOStyles,
+ Pictogram,
+ VSpacer
+} from "@pagopa/io-app-design-system";
+import {
+ SafeAreaView,
+ useSafeAreaInsets
+} from "react-native-safe-area-context";
import I18n from "../../../i18n";
-import { IOStyles } from "../../../components/core/variables/IOStyles";
-import BaseScreenComponent from "../../../components/screens/BaseScreenComponent";
import { WithTestID } from "../../../types/WithTestID";
-import { FooterStackButton } from "../../../components/buttons/FooterStackButtons";
import {
addTicketCustomField,
assistanceToolRemoteConfig,
@@ -35,11 +45,14 @@ export type Props = WithTestID<{
onPress: () => void;
}>;
+const DEFAULT_BOTTOM_PADDING: IOSpacingScale = 20;
+
const ErrorComponent = (props: Props) => {
const dispatch = useIODispatch();
const signatureRequestId = useIOSelector(fciSignatureRequestIdSelector);
const assistanceToolConfig = useIOSelector(assistanceToolConfigSelector);
const choosenTool = assistanceToolRemoteConfig(assistanceToolConfig);
+ const insets = useSafeAreaInsets();
const zendeskAssistanceLogAndStart = () => {
resetCustomFields();
@@ -64,63 +77,92 @@ const ErrorComponent = (props: Props) => {
}
};
- const retryButtonProps = {
+ const retryButtonProps: ButtonSolidProps = {
testID: "FciRetryButtonTestID",
- block: true,
- primary: true,
onPress: props.onPress,
- title: I18n.t("features.fci.errors.buttons.retry")
+ fullWidth: true,
+ label: I18n.t("features.fci.errors.buttons.retry"),
+ accessibilityLabel: I18n.t("features.fci.errors.buttons.retry")
};
- const closeButtonProps = {
+ const closeButtonProps: ButtonSolidProps = {
testID: "FciCloseButtonTestID",
- bordered: true,
- block: true,
onPress: props.onPress,
- title: I18n.t("features.fci.errors.buttons.close")
+ fullWidth: true,
+ label: I18n.t("features.fci.errors.buttons.close"),
+ accessibilityLabel: I18n.t("features.fci.errors.buttons.close")
};
- const assistanceButtonProps = {
+ const assistanceButtonProps: ButtonSolidProps = {
testID: "FciAssistanceButtonTestID",
- bordered: true,
- primary: false,
- block: true,
+ fullWidth: true,
onPress: handleAskAssistance,
- title: I18n.t("features.fci.errors.buttons.assistance")
+ label: I18n.t("features.fci.errors.buttons.assistance"),
+ accessibilityLabel: I18n.t("features.fci.errors.buttons.assistance")
};
+ /**
+ * Render the footer buttons as vertical stacked buttons
+ * @returns {React.ReactElement}
+ */
const footerButtons = () => {
if (props.retry && props.assistance) {
- return [retryButtonProps, assistanceButtonProps];
+ return (
+ <>
+
+
+
+ >
+ );
}
if (props.retry) {
- return [retryButtonProps, closeButtonProps];
+ return (
+ <>
+
+
+
+ >
+ );
}
if (props.assistance) {
- return [
- {
- ...closeButtonProps,
- bordered: false,
- title: I18n.t("features.fci.errors.buttons.back")
- },
- assistanceButtonProps
- ];
+ return (
+ <>
+
+
+
+ >
+ );
}
- return [closeButtonProps];
+ return ;
};
return (
-
-
- }
- title={props.title}
- body={props.subTitle}
- email={props.email}
- />
-
-
-
+
+ }
+ title={props.title}
+ body={props.subTitle}
+ email={props.email}
+ />
+
+ {footerButtons()}
+
+
);
};
diff --git a/ts/features/fci/components/InfoScreenComponent.tsx b/ts/features/fci/components/InfoScreenComponent.tsx
index 74ad818934e..eee25b6785e 100644
--- a/ts/features/fci/components/InfoScreenComponent.tsx
+++ b/ts/features/fci/components/InfoScreenComponent.tsx
@@ -1,13 +1,10 @@
import * as React from "react";
import { Linking, StyleSheet, Text, View } from "react-native";
import { EmailString } from "@pagopa/ts-commons/lib/strings";
-import { VSpacer } from "@pagopa/io-app-design-system";
+import { Body, H2, LabelLink, VSpacer } from "@pagopa/io-app-design-system";
import { useFocusEffect } from "@react-navigation/native";
import themeVariables from "../../../theme/variables";
import { setAccessibilityFocus } from "../../../utils/accessibility";
-import { Body } from "../../../components/core/typography/Body";
-import { H2 } from "../../../components/core/typography/H2";
-import { Link } from "../../../components/core/typography/Link";
type Props = {
image: React.ReactNode;
@@ -38,9 +35,9 @@ const renderNode = (body: string | React.ReactNode, email?: EmailString) => {
{email && <> >}