diff --git a/.github/workflows/e2e_android.yml b/.github/workflows/e2e_android.yml
index e97c3c8f9dc..a2943d82191 100644
--- a/.github/workflows/e2e_android.yml
+++ b/.github/workflows/e2e_android.yml
@@ -141,7 +141,7 @@ jobs:
matrix-e2e-android:
if: (!cancelled()) && needs.output_detox_tests_to_run.outputs.output1 != ''
- runs-on: macos-latest-xl
+ runs-on: macos-13
needs: [start_slack_thread, output_detox_tests_to_run]
strategy:
fail-fast: false
@@ -209,7 +209,22 @@ jobs:
force-avd-creation: false
disable-animations: true
arch: x86_64
- avd-name: Pixel_4_XL_API_28
+ avd-name: Pixel_6_Pro_API_33
+ script: yarn e2e:android-test /e2e/tests/${{matrix.testsuite}} --updateSnapshot
+ continue-on-error: true
+
+ - name: Run e2e tests for Android - Full Test - Retry
+ id: run_e2e_tests_full_retry
+ if: steps.run_e2e_tests.outcome == 'failure'
+ uses: reactivecircus/android-emulator-runner@v2
+ with:
+ working-directory: VAMobile
+ api-level: 28
+ profile: pixel_6_pro
+ force-avd-creation: false
+ disable-animations: true
+ arch: x86_64
+ avd-name: Pixel_6_Pro_API_33
script: yarn e2e:android-test /e2e/tests/${{matrix.testsuite}} --updateSnapshot
continue-on-error: true
@@ -224,7 +239,7 @@ jobs:
force-avd-creation: false
disable-animations: true
arch: x86_64
- avd-name: Pixel_4_XL_API_28
+ avd-name: Pixel_6_Pro_API_33
script: yarn e2e:android-test /e2e/tests/Navigation.e2e AvailabilityFramework.e2e ${{matrix.testsuite}}.e2e --updateSnapshot
continue-on-error: true
@@ -239,7 +254,7 @@ jobs:
force-avd-creation: false
disable-animations: true
arch: x86_64
- avd-name: Pixel_4_XL_API_28
+ avd-name: Pixel_6_Pro_API_33
script: yarn e2e:android-test /e2e/tests/Navigation.e2e AvailabilityFramework.e2e ${{matrix.testsuite}}.e2e --updateSnapshot
- name: Upload e2e-junit
@@ -250,7 +265,7 @@ jobs:
path: VAMobile/e2e/test_reports/e2e-junit.xml
- name: Upload artifacts on failure
- if: failure() || steps.run_e2e_tests.outcome == 'failure'
+ if: failure() || steps.run_e2e_tests_full_retry.outcome == 'failure'
uses: actions/upload-artifact@v4
with:
name: detox-artifacts-${{ runner.os }}-${{ github.run_id }}-${{matrix.testsuite}}
@@ -258,7 +273,7 @@ jobs:
retention-days: 1
- name: Fail workflow if needed(View e2e step for details)
- if: steps.run_e2e_tests.outcome == 'failure'
+ if: steps.run_e2e_tests_full_retry.outcome == 'failure'
run: exit 1
output-slack-results-and-update-detox-failure-ticket:
diff --git a/VAMobile/.detoxrc.json b/VAMobile/.detoxrc.json
index fd6d707132b..45067b8a2a8 100644
--- a/VAMobile/.detoxrc.json
+++ b/VAMobile/.detoxrc.json
@@ -34,7 +34,7 @@
"emulator": {
"type": "android.emulator",
"device": {
- "avdName": "Pixel_4_XL_API_28"
+ "avdName": "Pixel_6_Pro_API_33"
}
}
},
diff --git a/VAMobile/android/Gemfile.lock b/VAMobile/android/Gemfile.lock
index 4325f6d0040..24d3020d3c3 100644
--- a/VAMobile/android/Gemfile.lock
+++ b/VAMobile/android/Gemfile.lock
@@ -10,7 +10,7 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
- aws-partitions (1.1017.0)
+ aws-partitions (1.1020.0)
aws-sdk-core (3.214.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
@@ -113,7 +113,7 @@ GEM
google-apis-firebaseappdistribution_v1alpha (~> 0.2.0)
fastlane-plugin-slack_bot (1.4.0)
gh_inspector (1.1.3)
- google-apis-androidpublisher_v3 (0.74.0)
+ google-apis-androidpublisher_v3 (0.75.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-core (0.15.1)
addressable (~> 2.5, >= 2.5.1)
@@ -131,7 +131,7 @@ GEM
google-apis-core (>= 0.15.0, < 2.a)
google-apis-playcustomapp_v1 (0.16.0)
google-apis-core (>= 0.15.0, < 2.a)
- google-apis-storage_v1 (0.47.0)
+ google-apis-storage_v1 (0.48.0)
google-apis-core (>= 0.15.0, < 2.a)
google-cloud-core (1.7.1)
google-cloud-env (>= 1.0, < 3.a)
@@ -139,7 +139,7 @@ GEM
google-cloud-env (2.2.1)
faraday (>= 1.0, < 3.a)
google-cloud-errors (1.4.0)
- google-cloud-storage (1.52.0)
+ google-cloud-storage (1.53.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-core (~> 0.13)
@@ -148,15 +148,17 @@ GEM
google-cloud-core (~> 1.6)
googleauth (~> 1.9)
mini_mime (~> 1.0)
- googleauth (1.11.2)
+ google-logging-utils (0.1.0)
+ googleauth (1.12.0)
faraday (>= 1.0, < 3.a)
- google-cloud-env (~> 2.1)
+ google-cloud-env (~> 2.2)
+ google-logging-utils (~> 0.1)
jwt (>= 1.4, < 3.0)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
- http-cookie (1.0.7)
+ http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.2)
diff --git a/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md b/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md
index 7bd8620b2b7..055ace12bee 100644
--- a/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md
+++ b/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md
@@ -57,5 +57,5 @@ Snackbars provide feedback regarding API interactions at the bottom of the scree
- If a screen has bottom navigation, the snackbar should open above the navigation.
- There should only ever be one snackbar on the screen. Opening a new snackbar will close the previous snackbar.
-### Related
+## Related
* [Snackbar - Material Design](https://m3.material.io/components/snackbar/overview)
diff --git a/VAMobile/documentation/design/Components/Selection and input/Checkbox.md b/VAMobile/documentation/design/Components/Selection and input/Checkbox.md
index a90b5f6f822..c57638331d0 100644
--- a/VAMobile/documentation/design/Components/Selection and input/Checkbox.md
+++ b/VAMobile/documentation/design/Components/Selection and input/Checkbox.md
@@ -47,7 +47,7 @@ Allows users to select one or more items from a list. Checkboxes are an easily u
* Refer to the [VA Design System for accessibility considerations](https://design.va.gov/components/form/checkbox#accessibility-considerations)
* Screenreaders should announce the name, role, and state of each checkbox.
-### Related
+## Related
* [Checkbox - VA Design System](https://design.va.gov/components/form/checkbox)
* [Checkbox - USWDS](https://designsystem.digital.gov/components/checkbox/)
* [Checkbox - Material Design](https://m3.material.io/components/checkbox/overview)
\ No newline at end of file
diff --git a/VAMobile/documentation/design/Components/Selection and input/RadioButton.md b/VAMobile/documentation/design/Components/Selection and input/RadioButton.md
new file mode 100644
index 00000000000..a916c93d948
--- /dev/null
+++ b/VAMobile/documentation/design/Components/Selection and input/RadioButton.md
@@ -0,0 +1,37 @@
+---
+title: Radio button
+---
+
+Radio buttons allow users to select exactly one choice from a group.
+
+## Examples
+
+### Default
+**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/radio-button--default) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=6703-12221&t=Dj0bTSPSPnEJEFCa-4)
+
+
+### Tile
+**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/radio-button--tile) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=6703-12221&t=Dj0bTSPSPnEJEFCa-4)
+
+
+### Error
+**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/radio-button--error) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=6703-12221&t=Dj0bTSPSPnEJEFCa-4)
+
+
+## Usage
+[Refer to the VA Design System for usage guidance](https://design.va.gov/components/form/radio-button)
+
+## Code usage
+[Open Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/radio-button--docs)
+
+## Content considerations
+* Refer to the [VA Design System for content considerations](https://design.va.gov/components/form/radio-button#content-considerations)
+
+## Accessibility considerations
+* Refer to the [VA Design System for accessibility considerations](https://design.va.gov/components/form/radio-button#accessibility-considerations)
+* Screenreaders should announce the name, role, and state of each radio button.
+
+## Related
+* [Radio button - VA Design System](https://design.va.gov/components/form/radio-button)
+* [Radio buttons - USWDS](https://designsystem.digital.gov/components/radio-buttons/)
+* [Radio button - Material Design](https://m3.material.io/components/radio-button/overview)
\ No newline at end of file
diff --git a/VAMobile/documentation/design/Components/Typography/Text.md b/VAMobile/documentation/design/Components/Typography/Text.md
new file mode 100644
index 00000000000..4c57c965f81
--- /dev/null
+++ b/VAMobile/documentation/design/Components/Typography/Text.md
@@ -0,0 +1,44 @@
+---
+title: Text
+---
+
+Text is a typography component for headings, body copy, and display text.
+
+## Examples
+
+### Headings
+**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/text--heading) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=7101-3675&t=iL0TKvx4LGQO6STF-4)
+
+
+### Body
+**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/text--body) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=7101-3675&t=iL0TKvx4LGQO6STF-4)
+
+
+### Display
+**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/text--display) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=7101-3675&t=iL0TKvx4LGQO6STF-4)
+
+
+## Usage
+
+### When to use Text
+- To add content to a screen.
+
+### When to consider something else
+- For bulleted or numbered lists, use the Text list component (coming soon).
+- For smaller Navigation copy (such as the bottom tab bar), apply the Navigation text style directly to a text box.
+
+### How this component works
+- This component is built using the [composite typography tokens](/va-mobile-app/design/Foundation/Design%20tokens/Typography#text-styles).
+- Paragraph spacing is set to the minimum recommended values to align with accessibility guidelines ([WCAG SC 1.4.12](https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html)). While you can increase the amount of paragraph spacing, you should not decrease without consulting an accessibility specialist.
+
+### Choosing between variations
+There are 9 variations of the Text component.
+- Use a Heading variation (large, medium, small, x-small) for headings.
+- Use a Body variation (large, medium, small, x-small) for body copy.
+- Use the Display variation for larger display text.
+
+## Code usage
+[Open Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/text--docs)
+
+## Related
+- Text list (coming soon)
\ No newline at end of file
diff --git a/VAMobile/documentation/design/Foundation/Design tokens/Typography.md b/VAMobile/documentation/design/Foundation/Design tokens/Typography.md
new file mode 100644
index 00000000000..d31bd87cfb1
--- /dev/null
+++ b/VAMobile/documentation/design/Foundation/Design tokens/Typography.md
@@ -0,0 +1,46 @@
+---
+title: Typography
+sidebar_position: 4
+---
+
+# Typography
+
+Typographical selections intended to meet the highest standards of usability and accessibility, while setting a consistent look and feel in order to convey credibility.
+
+## Typography tokens
+
+Typography tokens define each property of a text style. They include font family, style, size, line height, and letter spacing. Math is used to calculate values for size and line height.
+
+- The base font size is 16. Additional sizes are created using a scale of 1.125
+- The default line height is set to 1.5x the font size. For headings, the line height is set to 1.2x. Line heights follow [accessibility best practices](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers) and should not be decreased without consulting an accessibility specialist.
+
+### Primitive
+
+
+### Semantic
+
+
+## Text styles
+
+Text styles (also known as composite tokens) combine each individual typography token into a defined style. They include styles for headings, body copy, and more. All properties are set using typography tokens, except for paragraph spacing. In the mobile app, spacing tokens are used to define paragraph spacing in a text style.
+
+### Headings
+
+
+### Body
+
+
+### Other
+
+
+## How to use typography tokens
+
+Designers and engineers are encouraged to use typography tokens to ensure a consistent look and feel throughout the app. Multiple typography tokens are combined to create composite tokens (aka text styles). To use typography tokens and text styles in the app, we recommend a few different approaches:
+
+- For Headings and Body copy, use the [Text component](/va-mobile-app/design/Components/Typography/Text).
+- For larger Display copy, use the [Text component](/va-mobile-app/design/Components/Typography/Text).
+- For smaller Navigation copy (such as the bottom tab bar), apply the Navigation text style directly to a text box.
+
+**Coming soon**
+- For bulleted/numbered lists, there will be a separate component in the future.
+- For inline links and styling (bold, italics, etc.), there will be a separate component in the future.
\ No newline at end of file
diff --git a/VAMobile/documentation/design/intro.md b/VAMobile/documentation/design/intro.md
index 1ac79477e1d..9ba259aec87 100644
--- a/VAMobile/documentation/design/intro.md
+++ b/VAMobile/documentation/design/intro.md
@@ -34,6 +34,10 @@ A system to help you write, design, and build digital services on the VA Mobile
### Selection and input
- [Checkbox](/va-mobile-app/design/Components/Selection%20and%20input/Checkbox)
+- [Radio button](/va-mobile-app/design/Components/Selection%20and%20input/RadioButton)
+
+### Typography
+- [Text](/va-mobile-app/design/Components/Typography/Text)
-----
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/useIsScreenReaderEnabled.mdx b/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/useIsScreenReaderEnabled.mdx
deleted file mode 100644
index 388fb7bdf94..00000000000
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/useIsScreenReaderEnabled.mdx
+++ /dev/null
@@ -1,8 +0,0 @@
-import HooksInfo from '../../../../src/components/HooksInfo'
-
-export const exampleString = `const screenReaderEnabled = useIsScreenReaderEnabled()\n
-const setFocus = useCallback(() => {
- if (ref.current && screenReaderEnabled) {}
-}`
-
-
diff --git a/VAMobile/documentation/docs/Flagship design library/Components/Selection and Input/Form Elements/RadioButton.md b/VAMobile/documentation/docs/Flagship design library/Components/Selection and Input/Form Elements/RadioButton.md
index e8bcbdd9cc0..2449adc1a5a 100644
--- a/VAMobile/documentation/docs/Flagship design library/Components/Selection and Input/Form Elements/RadioButton.md
+++ b/VAMobile/documentation/docs/Flagship design library/Components/Selection and Input/Form Elements/RadioButton.md
@@ -2,31 +2,4 @@
title: Radio button
---
-Radio buttons allow users to select exactly one choice from a group.
-
-## Examples
-
-### Master component
-
-
-### Examples
-
-
-## Usage
-
-[Refer to the VA Design System for usage guidance](https://design.va.gov/components/form/radio-button)
-
-## Content considerations
-* Refer to the [VA Design System for content considerations](https://design.va.gov/components/form/radio-button/#content-considerations)
-
-## Accessibility considerations
-* Refer to the [VA Design System for accessibility considerations](https://design.va.gov/components/form/radio-button/#accessibility-considerations)
-* Screenreaders should announce the name, role, and state of each checkbox.
-
-## Code usage
-Link to Storybook coming soon
-
-## Related
-* [Radio button - VA Design System](https://design.va.gov/components/form/radio-button)
-* [Radio buttons - USWDS](https://designsystem.digital.gov/components/radio-buttons/)
-* [Radio button - Material Design](https://m3.material.io/components/radio-button/overview)
\ No newline at end of file
+See documentation in [Design System](/va-mobile-app/design/Components/Selection%20and%20input/RadioButton).
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Flagship design library/Content/content-style-guide.md b/VAMobile/documentation/docs/Flagship design library/Content/content-style-guide.md
index 30d4a3eb393..847c4a99610 100644
--- a/VAMobile/documentation/docs/Flagship design library/Content/content-style-guide.md
+++ b/VAMobile/documentation/docs/Flagship design library/Content/content-style-guide.md
@@ -4,15 +4,15 @@ sidebar_position: 1
---
## Voice and tone
-We follow the [VA design system content principles](https://design.va.gov/content-style-guide/content-principles). In following these principles, we create consistent, clear, and customer-centered content that is based on Veteran feedback.
+We follow the [VA design system content principles](https://design.va.gov/content-style-guide/content-principles). In following these principles, we create consistent, clear, and user-centered content that is based on Veteran feedback.
-In addition, we follow [VA plain language standards](https://design.va.gov/content-style-guide/content-principles/plain-language) to help Veterans and their families find and understand the information they need.
+In addition, we follow [VA plain language standards](https://design.va.gov/content-style-guide/plain-language/) to help Veterans and their families find and understand the information they need.
Since we create content for health-related features, we also follow the [VA content guidelines for health content](https://design.va.gov/content-style-guide/health-content).
## Accessible and inclusive language
We write for all Veterans and those who care for them. Therefore, we use people-first language that is inclusive of the wide range of abilities and experiences of our users.
-We avoid words that are insensitive to the disabilities faced by our users. For example, we don’t use “view” or “see,” since a number of our users are blind or low-vision. We also avoid idioms, such as “at your fingertips” or “give an arm or a leg.” Not only are idioms often insensitive to Veterans’ experience but also idioms don’t follow plain language standards.
+We avoid words that are insensitive to the disabilities faced by our users. For example, we don’t use “see” since a number of our users are blind or low-vision. We also avoid idioms, such as “at your fingertips” or “give an arm or a leg.” Not only are idioms often insensitive to Veterans’ experience, but also idioms don’t follow plain language standards.
Resources to consider:
@@ -26,25 +26,22 @@ We follow [VA.gov content style guide rules](https://design.va.gov/content-style
### Capitalization
-- Screen names are title case. With the new navigation design, we will [change to sentence case for screen titles](https://github.com/department-of-veterans-affairs/va-mobile-app/issues/2575).
-- All other headings in the app are sentence case.
-- Buttons
- - For native actions, we use title case for iOS and all caps for Android.
- - For interface buttons, we use sentence case.
-
+- For native actions, we use title case for iOS and all caps for Android.
+- For interface buttons, we use sentence case.
### Times and time zones
-- We currently use `AM` and `PM` (both letters capitalized and no punctuation) since this is default formatting in React Native.
+- Due to default formatting in React Native, when times/time zones aren't hardcoded, our formatting differs from VA.gov. For example, React Native formats as `AM` and `PM` (both letters capitalized and no punctuation) and `EST` (three-letter format).
+- When times and timezones are hardcoded, we follow the VA.gov content style guide.
## Word choice, spelling, and naming conventions
### Content briefs
-We use [content briefs](https://github.com/department-of-veterans-affairs/va.gov-team/tree/master/products/content/content-briefs) to ensure consistent word choice and usage with other VA teams. VA Sitewide Content and IA team creates content briefs, sometimes in collaboration with the VA Mobile App content designer.
+We use [content briefs](https://github.com/department-of-veterans-affairs/va.gov-team/tree/master/products/content/content-briefs) to ensure consistent word choice and usage with other VA teams. VA.gov's content team creates content briefs, sometimes in collaboration with the VA Mobile App content designer.
### [Word List](https://design.va.gov/content-style-guide/word-list)
We use standard American English spelling in Merriam-Webster Dictionary. The words on the VA.gov word list are exceptions or need clarification.
### [Naming conventions](https://design.va.gov/content-style-guide/naming-and-labels)
-We follow VA.gov content style guide’s [rules for naming and labels](https://design.va.gov/content-style-guide/naming-and-labels) for tools, products, benefits, offices, and programs.
-In most cases, VA.gov will have already established a name for a tool, benefit, etc. For cases in which we would like to suggest a different name or need help with naming an app-specific feature, we work closely with VA Sitewide Content team to ensure alignment.
+We follow VA.gov content style guide’s [rules for naming and labels](https://design.va.gov/content-style-guide/naming-and-labels) for tools, products, benefits, offices, and programs.
+In most cases, VA.gov will have already established a name for a tool, benefit, etc. For cases in which we'd like to suggest a different name or need help with naming an app-specific feature, we work closely with VA.gov's content team to ensure alignment.
## Error messages
VA.gov’s design system includes a section on [how to help users recover from errors](https://design.va.gov/patterns/help-users-to/recover-from-errors). It details the structure, style, and tone for error and informational messages.
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/_category_.json b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/_category_.json
deleted file mode 100644
index a5092ce2692..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/_category_.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "label": "Icons",
- "position": 3
-}
-
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/_iconPathSection.mdx b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/_iconPathSection.mdx
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/checkboxIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/checkboxIcons.md
deleted file mode 100644
index d25ce6cd4d8..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/checkboxIcons.md
+++ /dev/null
@@ -1,18 +0,0 @@
-import { ReactComponent as CheckBoxEmpty} from '@componentsDocs/VAIcon/svgs/checkbox/CheckBoxEmpty.svg';
-import { ReactComponent as CheckBoxError} from '@componentsDocs/VAIcon/svgs/checkbox/CheckBoxError.svg';
-import { ReactComponent as CheckBoxFilled} from '@componentsDocs/VAIcon/svgs/checkbox/CheckBoxFilled.svg';
-import { ReactComponent as CheckBoxIntermediate} from '@componentsDocs/VAIcon/svgs/checkbox/CheckBoxIntermediate.svg';
-import IconsPathSection from '@site/src/components/IconsPathSection'
-
-# Checkbox
-
-:::info
-
-:::
-
-Name | Icon | File Name
-:---: | :---: | :---:
-Checkbox Empty | | CheckBoxEmpty.svg
-Checkbox Error | | CheckBoxError.svg
-Checkbox Filled | | CheckBoxFilled.svg
-Checkbox Intermediate | | CheckBoxIntermediate.svg
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md
deleted file mode 100644
index afa6f5a49c3..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md
+++ /dev/null
@@ -1,48 +0,0 @@
-import { ReactComponent as Add} from '@componentsDocs/VAIcon/svgs/Add.svg';
-import { ReactComponent as Building} from '@componentsDocs/VAIcon/svgs/Building.svg';
-import { ReactComponent as CheckMark} from '@componentsDocs/VAIcon/svgs/CheckMark.svg';
-import { ReactComponent as CircleCheckMark} from '@componentsDocs/VAIcon/svgs/CircleCheckMark.svg';
-import { ReactComponent as Compose} from '@componentsDocs/VAIcon/svgs/Compose.svg';
-import { ReactComponent as ExclamationTriangle} from '@componentsDocs/VAIcon/svgs/ExclamationTriangle.svg';
-import { ReactComponent as ExternalLink} from '@componentsDocs/VAIcon/svgs/ExternalLink.svg';
-import { ReactComponent as Folder} from '@componentsDocs/VAIcon/svgs/Folder.svg';
-import { ReactComponent as Inbox} from '@componentsDocs/VAIcon/svgs/Inbox.svg';
-import { ReactComponent as Info} from '@componentsDocs/VAIcon/svgs/Info.svg';
-import { ReactComponent as Minus} from '@componentsDocs/VAIcon/svgs/Minus.svg';
-import { ReactComponent as PaperClip} from '@componentsDocs/VAIcon/svgs/PaperClip.svg';
-import { ReactComponent as Phone} from '@componentsDocs/VAIcon/svgs/Phone.svg';
-import { ReactComponent as QuestionMark} from '@componentsDocs/VAIcon/svgs/QuestionMark.svg';
-import { ReactComponent as Remove} from '@componentsDocs/VAIcon/svgs/Remove.svg';
-import { ReactComponent as Reply} from '@componentsDocs/VAIcon/svgs/Reply.svg';
-import { ReactComponent as Trash} from '@componentsDocs/VAIcon/svgs/Trash.svg';
-import { ReactComponent as Unread} from '@componentsDocs/VAIcon/svgs/Unread.svg';
-import { ReactComponent as VideoCamera} from '@componentsDocs/VAIcon/svgs/VideoCamera.svg';
-import IconsPathSection from '@site/src/components/IconsPathSection'
-
-# Common
-
-:::info
-
-:::
-
-Name | Icon | File Location
-:---: | :---: | :---:
-Add | | Add.svg
-Building | | Building.svg
-Check Mark | | CheckMark.svg
-Check Mark in Circle | | CircleCheckMark.svg
-Compose | | Compose.svg
-Exclamation Triangle | | ExclamationTriangle.svg
-External Link | | ExternalLink.svg
-Folder | | Folder.svg
-Inbox | | Inbox.svg
-Info | | Info.svg
-Minus | | Minus.svg
-Paper Clip | | PaperClip.svg
-Phone | | Phone.svg
-Question Mark | | QuestionMark.svg
-Remove | | Remove.svg
-Reply | | Reply.svg
-Trash | | Trash.svg
-Unread | | Unread.svg
-Video Camera | | VideoCamera.svg
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/index.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/index.md
deleted file mode 100644
index 61943e252b1..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-title: Icons
----
-
-Icons are used sparingly throughout the VA mobile app as a way to enhance user understanding and wayfinding.
-
-
-
-* [Icons in Figma](https://www.figma.com/file/QVLPB3eOunmKrgQOuOt0SU/%F0%9F%93%90-DesignLibrary2.0---VAMobile?type=design&node-id=4156%3A7676&t=LWuS4oyNuplsuZBa-1)
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/linksIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/linksIcons.md
deleted file mode 100644
index df891a21a5a..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/linksIcons.md
+++ /dev/null
@@ -1,27 +0,0 @@
-import { ReactComponent as Calendar} from '@componentsDocs/VAIcon/svgs/links/Calendar.svg';
-import { ReactComponent as Chat} from '@componentsDocs/VAIcon/svgs/links/Chat.svg';
-import { ReactComponent as CircleExternalLink} from '@componentsDocs/VAIcon/svgs/links/CircleExternalLink.svg';
-import { ReactComponent as CirclePhone} from '@componentsDocs/VAIcon/svgs/links/CirclePhone.svg';
-import { ReactComponent as Directions} from '@componentsDocs/VAIcon/svgs/links/Directions.svg';
-import { ReactComponent as PhoneTTY} from '@componentsDocs/VAIcon/svgs/links/PhoneTTY.svg';
-import { ReactComponent as RightArrowBlueCircle} from '@componentsDocs/VAIcon/svgs/links/right-arrow-blue-circle.svg';
-import { ReactComponent as Text} from '@componentsDocs/VAIcon/svgs/links/Text.svg';
-import IconsPathSection from '@site/src/components/IconsPathSection'
-
-# Links
-
-:::info
-
-:::
-
-
-Name | Icon | File Name
-:---: | :---: | :---:
-Calendar | | Calendar.svg
-Chat | | Chat.svg
-Directions | | Directions.svg
-External Link in Circle | | CircleExternalLink.svg
-Phone in Circle | | CirclePhone.svg
-Phone TTY | | PhoneTTY.svg
-Right Arrow Blue Circle | | right-arrow-blue-circle.svg
-Text | | Text.svg
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/radioBtnIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/radioBtnIcons.md
deleted file mode 100644
index 2945864240d..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/radioBtnIcons.md
+++ /dev/null
@@ -1,15 +0,0 @@
-import { ReactComponent as RadioEmpty} from '@componentsDocs/VAIcon/svgs/radio/RadioEmpty.svg';
-import { ReactComponent as RadioFilled} from '@componentsDocs/VAIcon/svgs/radio/RadioFilled.svg';
-import IconsPathSection from '@site/src/components/IconsPathSection'
-
-
-# Radio Button
-
-:::info
-
-:::
-
-Name | Icon | File Name
-:---: | :---: | :---:
-Radio Empty/Disabled | | RadioEmpty.svg
-Radio Filled | | RadioFilled.svg
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/webviewIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/webviewIcons.md
deleted file mode 100644
index b4a17ae0c8e..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/webviewIcons.md
+++ /dev/null
@@ -1,16 +0,0 @@
-import { ReactComponent as ExternalLink} from '@componentsDocs/VAIcon/svgs/ExternalLink.svg';
-import { ReactComponent as Lock} from '@componentsDocs/VAIcon/svgs/Lock.svg';
-import { ReactComponent as Redo} from '@componentsDocs/VAIcon/svgs/Redo.svg';
-import IconsPathSection from '@site/src/components/IconsPathSection'
-
-# Webview
-
-:::info
-
-:::
-
-Name | Icon | File Name
-:---: | :---: | :---:
-External Link | | ExternalLink.svg
-Lock | | Lock.svg
-Redo | | Redo.svg
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/color-palette.md b/VAMobile/documentation/docs/Flagship design library/Foundation/color-palette.md
deleted file mode 100644
index 2432de774a3..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/color-palette.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Color palette
-sidebar_position: 2
----
-
-The VA mobile app has two color themes: Light and Dark. [The VA mobile app themes](https://www.figma.com/file/bGO6g5cCvWycrNjoK66PXc/VA-Mobile-Design-Tokens?node-id=151%3A76) use colors from the [VA style guide](https://design.va.gov/foundation/color-palette), and only deviate if necessary for accessibility purposes.
-
-
-
-**Themes**
-- [Light theme in Figma](https://www.figma.com/file/yXL0MkEKyAPGXPZqRH0VFZ/VA-Mobile-light-theme?node-id=183%3A441)
-- [Dark theme in Figma](https://www.figma.com/file/gOhb2kZvoQiXiGigqWZhnx/VA-Mobile-dark-theme?node-id=183%3A441)
-
-## Front-end
-Colors in code can be found under `src/styles/themes/VAColors.ts`. Any new colors should be added `src/styles/themes/VAColors.ts` and then used in `src/styles/themes/standardTheme.ts` or `src/styles/themescolorSchemes.ts`
-
-Some text, components(ex. snackbar), or icons use different colors than the default color set for each font. You can find the general guidelines for what colors to use for most text, components, and icons in the [VA Mobile app Design Library](https://www.figma.com/file/QVLPB3eOunmKrgQOuOt0SU/VAMobile-DesignLibrary1.0-%F0%9F%93%90?node-id=501%3A40&t=P62TR9FmT9E6a4O2-1).
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/color.md b/VAMobile/documentation/docs/Flagship design library/Foundation/color.md
new file mode 100644
index 00000000000..c8e31eab793
--- /dev/null
+++ b/VAMobile/documentation/docs/Flagship design library/Foundation/color.md
@@ -0,0 +1,6 @@
+---
+title: Color
+sidebar_position: 2
+---
+
+See documentation in [Design System](/va-mobile-app/design/Foundation/Design%20tokens/Color).
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/icons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/icons.md
new file mode 100644
index 00000000000..673709ccdac
--- /dev/null
+++ b/VAMobile/documentation/docs/Flagship design library/Foundation/icons.md
@@ -0,0 +1,6 @@
+---
+title: Icons
+sidebar_position: 5
+---
+
+See documentation in [Design System](/va-mobile-app/design/Foundation/Icons).
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/layout.md b/VAMobile/documentation/docs/Flagship design library/Foundation/layout.md
deleted file mode 100644
index c45ed11022f..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/layout.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Layout
-sidebar_position: 4
----
-
-
-
-* [Grid in Figma](https://www.figma.com/file/QVLPB3eOunmKrgQOuOt0SU/%F0%9F%93%90-DesignLibrary2.0---VAMobile?type=design&node-id=3859%3A7737&t=EuJmlpcIxjibtKua-1)
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/spacing.md b/VAMobile/documentation/docs/Flagship design library/Foundation/spacing.md
new file mode 100644
index 00000000000..8a53ad7844b
--- /dev/null
+++ b/VAMobile/documentation/docs/Flagship design library/Foundation/spacing.md
@@ -0,0 +1,6 @@
+---
+title: Spacing
+sidebar_position: 4
+---
+
+See documentation in [Design System](/va-mobile-app/design/Foundation/Design%20tokens/Spacing).
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/typography.md b/VAMobile/documentation/docs/Flagship design library/Foundation/typography.md
index 2451440b90e..102a8092899 100644
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/typography.md
+++ b/VAMobile/documentation/docs/Flagship design library/Foundation/typography.md
@@ -1,70 +1,6 @@
---
title: Typography
-sidebar_position: 5
+sidebar_position: 3
---
-Typography generally follows [VA.gov’s guidance](https://design.va.gov/foundation/typography) with some adjustments.
-
-* The mobile app doesn’t use CSS pixel measurements to define font sizes. Instead, we use points (PT) on iOS and density-independent pixels (DP) on Android. This allows our fonts to scale appropriately for all screen densities across devices. Below are resources that describe this in more detail:
- * [Guidance from W3C](https://w3c.github.io/wcag2ict/#guidance-when-applying-css-pixel-to-non-web-documents-and-software)
- * [Fonts in mobile apps for developers](https://www.skoumal.com/en/fonts-in-mobile-apps-for-developers/)
- * [Mobile design 101: pixels, points and resolutions](https://medium.com/@fluidui/mobile-design-101-pixels-points-and-resolutions-f60413035243)
-* With native and OS specific components, we utilize OS defined typography.
-
-
-
-
-
-## Front-end
-To support the common usage of colors for each font style, defaults colors have been set for each type of font under `src/styles/themes/standardTheme.ts`(See `buildTypography` function). Colors for each font style are based on the [Design Tokens - Design Library](https://www.figma.com/file/bGO6g5cCvWycrNjoK66PXc/%F0%9F%93%90-DesignTokens1.0---Library---VAMobile?node-id=115%3A157&t=RpifEcByzqSp4on7-1) file.
\ No newline at end of file
+See documentation in [Design System](/va-mobile-app/design/Foundation/Design%20tokens/Typography).
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/index.md b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/index.md
index d73a766cef1..0cf90b5199a 100644
--- a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/index.md
+++ b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/index.md
@@ -37,7 +37,7 @@ The following testing methods will be employed during development and testing of
| Integration Testing | In contrast to unit tests, integration tests run across individual modules of code to validate that separately developed modules are working together properly. Integration tests are also used to validate that the VA Mobile App front end interfaces with other systems and services, such as the VA.gov APIs, as designed. | Developers |
| End-to-end Testing | End-to-end testing, or system testing, looks to validate that the system as a whole works as intended. These tests are similar in nature to integration tests but are focused on the superset of delivered software and its connections to other systems. End-to-end testing will be done prior to release and will consist of both manual and automated testing to ensure adequate coverage of the delivered functionality. | Developers, QA, Product |
| User Acceptance Testing | User Acceptance Testing, sometimes referred to as "UAT" or just Acceptance Testing, involves the product team and other stakeholders interacting with the application to simulate real-world usage and signing off that the delivered software functions as defined in the designs and requirements. We will leverage pre-production distribution tools such as TestFlight to get the app in the hands of stakeholders to facilitate Acceptance Testing. | Product, Stakeholder community |
-| Accessibility Testing | Accessibility is a major requirement for the VA Mobile App and requires additional consideration beyond the standard testing process. QA will include accessibility checks in the manual functional testing activities. For a more detailed plan on accessibility testing approach see the [Mobile Accessibility Testing Plan](https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/va-mobile-app/testing/Accessibility%20Test%20Plan.md). | Developers, QA |
+| Accessibility Testing | Accessibility is a major requirement for the VA Mobile App and requires additional consideration beyond the standard testing process. QA will include accessibility checks in the manual functional testing activities. For a more detailed plan on accessibility testing approach see the [Mobile Accessibility Testing Plan](../QualityAssuranceProcess/Accessibility/testing-plan.md). | Developers, QA |
| Compatibility Testing | Software may behave differently depending on the specific device and operating system that it is running on. In order to validate that the software developed will work as intended across a variety of devices we will also perform manual functional testing of each feature on a variety of physical devices and OSs as defined on the [compatibility page](../QualityAssuranceProcess/Compatibility.md).
## Testing accounts and data
diff --git a/VAMobile/documentation/docs/UX/Resources.md b/VAMobile/documentation/docs/UX/Resources.md
index acc0eb1e275..7a3a2b42c48 100644
--- a/VAMobile/documentation/docs/UX/Resources.md
+++ b/VAMobile/documentation/docs/UX/Resources.md
@@ -56,6 +56,8 @@ VA Mobile app [UX resources on github](https://github.com/department-of-veterans
* This shows all the MVP components laid out as a library visible and inspectable in Invision. Deprecated July 2021.
* [Library style sheets (deprecated)](https://adhoc.invisionapp.com/share/AX108RJZPB6E#/screens/445194518)
Shows the components from the design library. Deprecated July 2021.
+### Figma 1.0 (before 2022)
+* [Figma files](https://github.com/department-of-veterans-affairs/va.gov-team/tree/master/products/va-mobile-app/ux-design/figma-files-1.0) that represent MVP feature work, prior to restructuring the IA & Navigation. Deprecated Q1 2022.
### Components
* [MVP Mobile App UI Styles on Google Docs (deprecated)](https://docs.google.com/document/d/1VC-CLWnhevB8HLBBHPwkSJvECn8EBie8HOkJylKE1lo/edit?usp=sharing)
\ No newline at end of file
diff --git a/VAMobile/documentation/yarn.lock b/VAMobile/documentation/yarn.lock
index 9aac5a74730..82095c26a34 100644
--- a/VAMobile/documentation/yarn.lock
+++ b/VAMobile/documentation/yarn.lock
@@ -6878,9 +6878,9 @@ multicast-dns@^7.2.5:
thunky "^1.0.2"
nanoid@^3.3.6:
- version "3.3.6"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
- integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
+ version "3.3.8"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
+ integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
negotiator@0.6.3:
version "0.6.3"
diff --git a/VAMobile/e2e/tests/Appointments.e2e.ts b/VAMobile/e2e/tests/Appointments.e2e.ts
index ba247203cfd..daa99b1819b 100644
--- a/VAMobile/e2e/tests/Appointments.e2e.ts
+++ b/VAMobile/e2e/tests/Appointments.e2e.ts
@@ -41,6 +41,7 @@ describe('Appointments Screen', () => {
.scroll(200, 'down')
await element(by.text('Vilanisi Reddy')).tap()
if (device.getPlatform() === 'android') {
+ await device.disableSynchronization()
await element(by.id(CommonE2eIdConstants.ADD_TO_CALENDAR_ID)).atIndex(0).tap()
await device.takeScreenshot('appointmentCalendar')
await device.launchApp({ newInstance: false })
@@ -50,14 +51,8 @@ describe('Appointments Screen', () => {
await device.takeScreenshot('appointmentGetDirections')
await device.launchApp({ newInstance: false })
- await device.disableSynchronization()
- await element(by.id(CommonE2eIdConstants.CALL_VA_TTY_PHONE_NUMBER_ID)).atIndex(0).tap()
- await device.takeScreenshot('appointmentVALocationPhoneNumber')
- await device.launchApp({ newInstance: false })
-
- await element(by.id(CommonE2eIdConstants.CALL_VA_PHONE_NUMBER_ID)).atIndex(0).tap()
- await device.takeScreenshot('apointmentVALocationTTY')
- await device.launchApp({ newInstance: false })
+ await expect(element(by.id(CommonE2eIdConstants.CALL_VA_TTY_PHONE_NUMBER_ID)).atIndex(0)).toExist()
+ await expect(element(by.id(CommonE2eIdConstants.CALL_VA_PHONE_NUMBER_ID)).atIndex(0)).toExist()
await element(by.id('UpcomingApptDetailsTestID')).scrollTo('bottom')
diff --git a/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts b/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts
index ad24d0f609f..18026f5513b 100644
--- a/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts
+++ b/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts
@@ -4,6 +4,9 @@ import { CommonE2eIdConstants, loginToDemoMode, openAppointments, openHealth, to
export const AppointmentsExpandede2eConstants = {
PATIENT_CANCELLATION: 'You canceled this appointment.',
+ VIDEO_VISIT_PREP_LINK_ID: 'prepareForVideoVisitTestID',
+ APPT_DIRECTIONS_ID: 'directionsTestID',
+ VA_APPT_CANCEL_ID: 'vaLinkApptsCancelTestID',
}
const checkMedicationWording = async ({
@@ -44,12 +47,12 @@ const checkMedicationWording = async ({
if (appointmentType === 'ATLAS' || appointmentType === 'Home' || appointmentType === 'GFE') {
await expect(element(by.text('Get your device ready to join.'))).toExist()
- await expect(element(by.id('prepareForVideoVisitTestID'))).toExist()
- await waitFor(element(by.id('prepareForVideoVisitTestID')))
+ await expect(element(by.id(AppointmentsExpandede2eConstants.VIDEO_VISIT_PREP_LINK_ID))).toExist()
+ await waitFor(element(by.id(AppointmentsExpandede2eConstants.VIDEO_VISIT_PREP_LINK_ID)))
.toBeVisible()
.whileElement(by.id(pastAppointment ? 'PastApptDetailsTestID' : 'UpcomingApptDetailsTestID'))
.scroll(300, 'down')
- await element(by.id('prepareForVideoVisitTestID')).tap()
+ await element(by.id(AppointmentsExpandede2eConstants.VIDEO_VISIT_PREP_LINK_ID)).tap()
await expect(element(by.text('Appointments help'))).toExist()
await element(by.text('Close')).tap()
} else if (appointmentType === 'Claim') {
@@ -73,7 +76,7 @@ const checkMedicationWording = async ({
).not.toExist()
await expect(element(by.text('Learn more about claim exam appointments'))).not.toExist()
await expect(element(by.text('Get your device ready to join.'))).not.toExist()
- await expect(element(by.id('prepareForVideoVisitTestID'))).not.toExist()
+ await expect(element(by.id(AppointmentsExpandede2eConstants.VIDEO_VISIT_PREP_LINK_ID))).not.toExist()
}
} else {
await expect(element(by.text('Prepare for your appointment'))).not.toExist()
@@ -191,7 +194,7 @@ const checkUpcomingApptDetails = async (
if (locationAddress != undefined) {
await expect(element(by.text(locationAddress))).toExist()
if (appointmentStatus !== 'Pending' && appointmentType !== 'CC') {
- await expect(element(by.id('directionsTestID'))).toExist()
+ await expect(element(by.id(AppointmentsExpandede2eConstants.APPT_DIRECTIONS_ID))).toExist()
await expect(element(by.id(CommonE2eIdConstants.CALL_VA_PHONE_NUMBER_ID)).atIndex(0)).toExist()
await expect(element(by.id(CommonE2eIdConstants.CALL_VA_TTY_PHONE_NUMBER_ID)).atIndex(0)).toExist()
}
@@ -269,7 +272,7 @@ const checkUpcomingApptDetails = async (
}
await expect(element(by.id(CommonE2eIdConstants.CALL_VA_PHONE_NUMBER_ID)).atIndex(1)).toExist()
await expect(element(by.id(CommonE2eIdConstants.CALL_VA_TTY_PHONE_NUMBER_ID)).atIndex(1)).toExist()
- await expect(element(by.id('vaLinkApptsCancelTestID'))).toExist()
+ await expect(element(by.id(AppointmentsExpandede2eConstants.VA_APPT_CANCEL_ID))).toExist()
}
} else if (appointmentStatus === 'Pending') {
if (appointmentType !== 'CC') {
@@ -346,36 +349,36 @@ const scrollToThenTap = async (text: string, pastAppointment: string) => {
text === 'At VA Palo Alto Health Care System' ||
text === 'At Hampton VA Medical Center'
) {
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
}
if (pastAppointment !== '') {
try {
await waitFor(element(by.text(text)))
.toBeVisible()
- .whileElement(by.id('appointmentsTestID'))
+ .whileElement(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID))
.scroll(250, 'down')
} catch (ex) {
await waitFor(element(by.text(text)))
.toBeVisible()
- .whileElement(by.id('appointmentsTestID'))
+ .whileElement(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID))
.scroll(250, 'up')
}
} else {
await waitFor(element(by.text(text)))
.toBeVisible()
- .whileElement(by.id('appointmentsTestID'))
+ .whileElement(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID))
.scroll(300, 'down')
try {
await waitFor(element(by.text(text)))
.toBeVisible()
- .whileElement(by.id('appointmentsTestID'))
+ .whileElement(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID))
.scroll(250, 'down')
} catch (ex) {
await waitFor(element(by.text(text)))
.toBeVisible()
- .whileElement(by.id('appointmentsTestID'))
+ .whileElement(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID))
.scroll(250, 'up')
}
}
@@ -395,7 +398,7 @@ export async function apppointmentVerification(pastAppointment = false) {
await waitFor(element(by.text('Upcoming')))
.toExist()
.withTimeout(10000)
- await element(by.id('appointmentsTestID')).scrollTo('top')
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('top')
await element(by.text('Past')).tap()
}
await scrollToThenTap('Vilanisi Reddy', pastAppointmentString)
@@ -711,12 +714,12 @@ export async function apppointmentVerification(pastAppointment = false) {
await waitFor(element(by.text('Upcoming')))
.toExist()
.withTimeout(10000)
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
} else {
await element(by.text('Past')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
}
await scrollToThenTap('At Fort Collins VA Clinic - Claim - Canceled', pastAppointmentString)
await expect(element(by.text('Fort Collins VA Clinic - Claim - Canceled canceled this appointment.'))).toExist()
@@ -803,12 +806,12 @@ export async function apppointmentVerification(pastAppointment = false) {
await waitFor(element(by.text('Upcoming')))
.toExist()
.withTimeout(10000)
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
} else {
await element(by.text('Past')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
}
await scrollToThenTap('At Central California VA Health Care System', pastAppointmentString)
@@ -901,16 +904,16 @@ export async function apppointmentVerification(pastAppointment = false) {
await waitFor(element(by.text('Upcoming')))
.toExist()
.withTimeout(10000)
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
} else {
await element(by.text('Past')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
}
await scrollToThenTap('John Jones', pastAppointmentString)
@@ -1002,20 +1005,20 @@ export async function apppointmentVerification(pastAppointment = false) {
await waitFor(element(by.text('Upcoming')))
.toExist()
.withTimeout(10000)
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
} else {
await element(by.text('Past')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
- await element(by.id('appointmentsTestID')).scrollTo('bottom')
- await element(by.id('next-page')).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
+ await element(by.id(CommonE2eIdConstants.APPOINTMENTS_SCROLL_ID)).scrollTo('bottom')
+ await element(by.id(CommonE2eIdConstants.NEXT_PAGE_ID)).tap()
}
await scrollToThenTap('Jane Jones', pastAppointmentString)
diff --git a/VAMobile/e2e/tests/Claims.e2e.ts b/VAMobile/e2e/tests/Claims.e2e.ts
index 4309db11d83..6ebde3a95b0 100644
--- a/VAMobile/e2e/tests/Claims.e2e.ts
+++ b/VAMobile/e2e/tests/Claims.e2e.ts
@@ -220,6 +220,10 @@ describe('Claims Screen', () => {
})
it('should verify details of claim on step 2', async () => {
+ await waitFor(element(by.id(ClaimsE2eIdConstants.CLAIM_3_ID)))
+ .toBeVisible()
+ .whileElement(by.id(CommonE2eIdConstants.CLAIMS_HISTORY_SCROLL_ID))
+ .scroll(100, 'down')
await element(by.id(ClaimsE2eIdConstants.CLAIM_3_ID)).tap()
await expect(element(by.id('Step 2 of 5. Initial review. Current step. Step 1 complete.'))).toExist()
await expect(
@@ -351,7 +355,10 @@ describe('Claims Screen', () => {
it('should verify details of claim on step 5', async () => {
await element(by.id(CommonE2eIdConstants.CLAIMS_HISTORY_SCROLL_ID)).scrollTo('top')
await element(by.id(ClaimsE2eIdConstants.CLAIM_2_ID)).tap()
- await element(by.id(CommonE2eIdConstants.CLAIMS_DETAILS_SCREEN_ID)).scrollTo('bottom')
+ await waitFor(element(by.id('Step 5 of 5. Complete. Complete.')))
+ .toBeVisible()
+ .whileElement(by.id(CommonE2eIdConstants.CLAIMS_DETAILS_SCREEN_ID))
+ .scroll(100, 'down')
await element(by.id('Step 5 of 5. Complete. Complete.')).tap()
await expect(element(by.text('Complete')).atIndex(1)).toExist()
await element(by.id(CommonE2eIdConstants.CLAIMS_DETAILS_BACK_ID)).tap()
diff --git a/VAMobile/e2e/tests/HomeScreen.e2e.ts b/VAMobile/e2e/tests/HomeScreen.e2e.ts
index 06f5abbbc6e..62790a7b9ff 100644
--- a/VAMobile/e2e/tests/HomeScreen.e2e.ts
+++ b/VAMobile/e2e/tests/HomeScreen.e2e.ts
@@ -33,7 +33,8 @@ describe('Home Screen', () => {
})
it(':android: should disable AF use case 3', async () => {
- await disableAF(undefined, 'WG_Home', undefined, 'AllowFunction')
+ await device.uninstallApp()
+ await device.installApp()
await device.launchApp({ newInstance: true, permissions: { notifications: 'YES' } })
await loginToDemoMode()
})
diff --git a/VAMobile/e2e/tests/PushNotifications.e2e.ts b/VAMobile/e2e/tests/PushNotifications.e2e.ts
index 54ad8fb9127..a7014ea8bf7 100644
--- a/VAMobile/e2e/tests/PushNotifications.e2e.ts
+++ b/VAMobile/e2e/tests/PushNotifications.e2e.ts
@@ -1,3 +1,10 @@
+/*
+Description:
+Detox script that follows the notifications test cases found in testRail (VA Mobile App > Active/Organized Cases > Home > Profile > Settings > Notifications)
+More information about detox and mocking user notifications can be found here: https://wix.github.io/Detox/docs/guide/mocking-user-notifications
+When to update:
+This script should be updated whenever any new notification types are added to the app and or if anything changes on how the notification is displayed in the app.
+*/
import { by, device, element, expect, waitFor } from 'detox'
import { backButton, loginToDemoMode } from './utils'
@@ -18,6 +25,7 @@ const mockNotification = {
},
}
+//This script is only run on iOS because there are additional requirements that can't be met for Android
describe(':ios: Push Notifications', () => {
it('dead state: should navigate to appropriate screen when launching', async () => {
await device.launchApp({
diff --git a/VAMobile/ios/Gemfile.lock b/VAMobile/ios/Gemfile.lock
index c0b9d6228f6..ed7740d18e4 100644
--- a/VAMobile/ios/Gemfile.lock
+++ b/VAMobile/ios/Gemfile.lock
@@ -5,7 +5,7 @@ GEM
base64
nkf
rexml
- activesupport (7.2.2)
+ activesupport (7.2.2.1)
base64
benchmark (>= 0.3)
bigdecimal
@@ -25,7 +25,7 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
- aws-partitions (1.1017.0)
+ aws-partitions (1.1020.0)
aws-sdk-core (3.214.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
@@ -128,7 +128,7 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.3.1)
- fastlane (2.225.0)
+ fastlane (2.226.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -168,7 +168,7 @@ GEM
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
- xcpretty (~> 0.3.0)
+ xcpretty (~> 0.4.0)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-plugin-slack_bot (1.4.0)
fastlane-sirp (1.0.0)
@@ -215,7 +215,7 @@ GEM
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
- http-cookie (1.0.7)
+ http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.8.3)
i18n (1.14.6)
@@ -247,7 +247,7 @@ GEM
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.3.9)
- rouge (2.0.7)
+ rouge (3.28.0)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
@@ -287,8 +287,8 @@ GEM
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
- xcpretty (0.3.0)
- rouge (~> 2.0.7)
+ xcpretty (0.4.0)
+ rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
diff --git a/VAMobile/package.json b/VAMobile/package.json
index 0dff0f1082d..83daafe4a2d 100644
--- a/VAMobile/package.json
+++ b/VAMobile/package.json
@@ -52,7 +52,7 @@
"@react-navigation/bottom-tabs": "^6.6.1",
"@react-navigation/native": "^6.1.18",
"@react-navigation/stack": "^6.4.1",
- "@reduxjs/toolkit": "^2.3.0",
+ "@reduxjs/toolkit": "^2.4.0",
"@tanstack/react-query": "^5.59.15",
"eslint-plugin-tsdoc": "^0.4.0",
"i18next": "^23.7.18",
@@ -83,7 +83,7 @@
"react-native-svg-transformer": "^1.5.0",
"react-native-toast-notifications": "^3.4.0",
"react-native-webp-format": "^1.2.0",
- "react-native-webview": "^13.12.3",
+ "react-native-webview": "^13.12.4",
"react-redux": "^9.1.2",
"styled-components": "^5.3.10",
"underscore": "^1.13.7"
@@ -101,12 +101,12 @@
"@react-native/metro-config": "^0.75.3",
"@react-native/typescript-config": "0.76.2",
"@testing-library/jest-dom": "^6.6.3",
- "@testing-library/react-native": "^12.8.1",
+ "@testing-library/react-native": "^12.9.0",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@tsconfig/react-native": "^3.0.5",
"@types/detox": "^18.1.0",
"@types/jest-when": "^3.5.5",
- "@types/lodash": "^4.17.7",
+ "@types/lodash": "^4.17.13",
"@types/luxon": "^3.4.2",
"@types/node": "^20.14.10",
"@types/react-native": "0.73.0",
@@ -132,7 +132,7 @@
"jest-environment-jsdom": "29.7.0",
"jest-image-snapshot": "^6.4.0",
"jest-junit": "^16.0.0",
- "jest-when": "^3.6.0",
+ "jest-when": "^3.7.0",
"lint-staged": "^15.2.9",
"metro-react-native-babel-preset": "^0.77.0",
"prettier": "^3.3.3",
diff --git a/VAMobile/src/App.tsx b/VAMobile/src/App.tsx
index bce892ba296..89350277fd9 100644
--- a/VAMobile/src/App.tsx
+++ b/VAMobile/src/App.tsx
@@ -19,6 +19,7 @@ import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'
import { NavigationContainer, useNavigationContainerRef } from '@react-navigation/native'
import { createStackNavigator } from '@react-navigation/stack'
+import { useIsScreenReaderEnabled } from '@department-of-veterans-affairs/mobile-component-library'
import { ActionSheetProvider, connectActionSheet } from '@expo/react-native-action-sheet'
import { QueryClientProvider } from '@tanstack/react-query'
import { ThemeProvider } from 'styled-components'
@@ -64,7 +65,7 @@ import { SnackBarState } from 'store/slices/snackBarSlice'
import { useColorScheme } from 'styles/themes/colorScheme'
import theme, { getTheme, setColorScheme } from 'styles/themes/standardTheme'
import getEnv from 'utils/env'
-import { useAppDispatch, useFontScale, useIsScreenReaderEnabled } from 'utils/hooks'
+import { useAppDispatch, useFontScale } from 'utils/hooks'
import { useHeaderStyles, useTopPaddingAsHeaderStyles } from 'utils/hooks/headerStyles'
import i18n from 'utils/i18n'
import { isIOS } from 'utils/platform'
diff --git a/VAMobile/src/components/Templates/CategoryLanding.tsx b/VAMobile/src/components/Templates/CategoryLanding.tsx
index 468d92dd323..cbd2103a90d 100644
--- a/VAMobile/src/components/Templates/CategoryLanding.tsx
+++ b/VAMobile/src/components/Templates/CategoryLanding.tsx
@@ -10,9 +10,11 @@ import {
} from 'react-native'
import { useSafeAreaInsets } from 'react-native-safe-area-context'
+import { useIsScreenReaderEnabled } from '@department-of-veterans-affairs/mobile-component-library'
+
import { CrisisLineButton, HeaderButton, TextView, TextViewProps, WaygateWrapper } from 'components'
import VAScrollView, { VAScrollViewProps } from 'components/VAScrollView'
-import { useIsScreenReaderEnabled, useTheme } from 'utils/hooks'
+import { useTheme } from 'utils/hooks'
import HeaderBanner, { HeaderBannerProps } from './HeaderBanner'
@@ -43,7 +45,7 @@ export const CategoryLanding: FC = ({
const insets = useSafeAreaInsets()
const fontScale = useWindowDimensions().fontScale
const theme = useTheme()
- const screenReaderEnabled = useIsScreenReaderEnabled(true)
+ const screenReaderEnabled = useIsScreenReaderEnabled()
const [scrollOffset, setScrollOffset] = useState(0)
const [trackScrollOffset, setTrackScrollOffset] = useState(true)
diff --git a/VAMobile/src/components/Templates/FeatureLandingAndChildTemplate.tsx b/VAMobile/src/components/Templates/FeatureLandingAndChildTemplate.tsx
index 7c554e21c0f..5c735eccad9 100644
--- a/VAMobile/src/components/Templates/FeatureLandingAndChildTemplate.tsx
+++ b/VAMobile/src/components/Templates/FeatureLandingAndChildTemplate.tsx
@@ -2,9 +2,11 @@ import React, { FC, ReactNode, useState } from 'react'
import { LayoutChangeEvent, StatusBar, View, ViewStyle, useWindowDimensions } from 'react-native'
import { useSafeAreaInsets } from 'react-native-safe-area-context'
+import { useIsScreenReaderEnabled } from '@department-of-veterans-affairs/mobile-component-library'
+
import { HeaderButton, TextView, TextViewProps, WaygateWrapper } from 'components'
import VAScrollView, { VAScrollViewProps } from 'components/VAScrollView'
-import { useIsScreenReaderEnabled, useTheme } from 'utils/hooks'
+import { useTheme } from 'utils/hooks'
import HeaderBanner, { HeaderBannerProps } from './HeaderBanner'
@@ -56,7 +58,7 @@ export const ChildTemplate: FC = ({
const insets = useSafeAreaInsets()
const fontScale = useWindowDimensions().fontScale
const theme = useTheme()
- const screenReaderEnabled = useIsScreenReaderEnabled(true)
+ const screenReaderEnabled = useIsScreenReaderEnabled()
const [scrollOffset, setScrollOffset] = useState(0)
const [trackScrollOffset, setTrackScrollOffset] = useState(true)
diff --git a/VAMobile/src/components/Templates/HeaderBanner.tsx b/VAMobile/src/components/Templates/HeaderBanner.tsx
index 7ee16d2507f..05af9409a10 100644
--- a/VAMobile/src/components/Templates/HeaderBanner.tsx
+++ b/VAMobile/src/components/Templates/HeaderBanner.tsx
@@ -4,11 +4,12 @@ import { Shadow, ShadowProps } from 'react-native-shadow-2'
import { useFocusEffect } from '@react-navigation/native'
+import { useIsScreenReaderEnabled } from '@department-of-veterans-affairs/mobile-component-library'
import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon'
import { Box, BoxProps, DescriptiveBackButton, IconWithText, TextView, TextViewProps } from 'components'
import MenuView, { MenuViewActionsType } from 'components/Menu'
-import { useAccessibilityFocus, useIsScreenReaderEnabled, useTheme } from 'utils/hooks'
+import { useAccessibilityFocus, useTheme } from 'utils/hooks'
export type HeaderLeftButtonProps = {
text: string
@@ -81,7 +82,7 @@ const HeaderBanner: FC = ({
const [focusTitle, setFocusTitle] = useAccessibilityFocus()
const focus = leftButton ? 'Left' : title ? 'Title' : 'Right'
useFocusEffect(focus === 'Title' ? setFocusTitle : setFocus)
- const screenReaderEnabled = useIsScreenReaderEnabled(true)
+ const screenReaderEnabled = useIsScreenReaderEnabled()
const TEXT_CONSTRAINT_THRESHOLD = 30
diff --git a/VAMobile/src/screens/HealthScreen/SecureMessaging/ViewMessage/CollapsibleMessage.tsx b/VAMobile/src/screens/HealthScreen/SecureMessaging/ViewMessage/CollapsibleMessage.tsx
index b8a0d6cc5c7..f607fe6ab0d 100644
--- a/VAMobile/src/screens/HealthScreen/SecureMessaging/ViewMessage/CollapsibleMessage.tsx
+++ b/VAMobile/src/screens/HealthScreen/SecureMessaging/ViewMessage/CollapsibleMessage.tsx
@@ -5,6 +5,7 @@ import { View, ViewStyle } from 'react-native'
import { useIsFocused } from '@react-navigation/native'
import { Icon } from '@department-of-veterans-affairs/mobile-component-library'
+import { useIsScreenReaderEnabled } from '@department-of-veterans-affairs/mobile-component-library'
import { useDownloadFileAttachment, useMessage } from 'api/secureMessaging'
import { SecureMessagingAttachment, SecureMessagingMessageAttributes } from 'api/types'
@@ -21,7 +22,7 @@ import {
import { NAMESPACE } from 'constants/namespaces'
import { bytesToFinalSizeDisplay, bytesToFinalSizeDisplayA11y } from 'utils/common'
import { getFormattedDateAndTimeZone } from 'utils/formattingUtils'
-import { useIsScreenReaderEnabled, useOrientation, useTheme } from 'utils/hooks'
+import { useOrientation, useTheme } from 'utils/hooks'
import { fixSpecialCharacters } from 'utils/jsonFormatting'
import { getLinkifiedText } from 'utils/secureMessaging'
@@ -60,7 +61,7 @@ function CollapsibleMessage({ message, isInitialMessage, collapsibleMessageRef }
const messageToUse = messageWithAttachmentData?.data.attributes || message
const { attachment, hasAttachments, senderName, sentDate, body } = messageToUse
- const screenReaderEnabled = useIsScreenReaderEnabled(true)
+ const screenReaderEnabled = useIsScreenReaderEnabled()
const dateTime = getFormattedDateAndTimeZone(sentDate)
const attachmentBoolean = hasAttachments || attachment
const attachLabel = attachmentBoolean ? t('secureMessaging.attachments.hasAttachment').toLowerCase() : ''
diff --git a/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/AccountSecurity/AccountSecurity.test.tsx b/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/AccountSecurity/AccountSecurity.test.tsx
index 70fc2f50c6a..d8aeb7b37aa 100644
--- a/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/AccountSecurity/AccountSecurity.test.tsx
+++ b/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/AccountSecurity/AccountSecurity.test.tsx
@@ -1,6 +1,7 @@
import React from 'react'
import { screen } from '@testing-library/react-native'
+import { t } from 'i18next'
import { context, mockNavProps, render } from 'testUtils'
@@ -13,11 +14,7 @@ context('AccountSecurity', () => {
})
it('initializes correctly', () => {
- expect(screen.getByText('Sign-in information')).toBeTruthy()
- expect(
- screen.getByText(
- 'To access or update your sign-in information, go to the website where you manage your account information. Any updates you make there will automatically update on the mobile app.',
- ),
- ).toBeTruthy()
+ expect(screen.getByText(t('accountSecurity.signIn'))).toBeTruthy()
+ expect(screen.getByText(t('accountSecurity.description'))).toBeTruthy()
})
})
diff --git a/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/InAppRecruitmentScreen/InAppRecruitmentScreen.test.tsx b/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/InAppRecruitmentScreen/InAppRecruitmentScreen.test.tsx
index 0cfb2d7749a..5eb7d01031c 100644
--- a/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/InAppRecruitmentScreen/InAppRecruitmentScreen.test.tsx
+++ b/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/InAppRecruitmentScreen/InAppRecruitmentScreen.test.tsx
@@ -2,6 +2,7 @@ import React from 'react'
import { Alert } from 'react-native'
import { fireEvent, screen } from '@testing-library/react-native'
+import { t } from 'i18next'
import { context, mockNavProps, render } from 'testUtils'
@@ -34,29 +35,29 @@ context('InAppRecruitmentScreen', () => {
})
it('renders screen correctly', () => {
- expect(screen.getByLabelText('Give feedback')).toBeTruthy()
- expect(screen.getByRole('header', { name: 'Make this app better for all Veterans' })).toBeTruthy()
- expect(screen.getByText('You can help us improve this app by being part of online feedback sessions.')).toBeTruthy()
- expect(screen.getByText('Register once by completing a 5-minute questionnaire.')).toBeTruthy()
- expect(screen.getByText('Wait to be matched with a session.')).toBeTruthy()
- expect(screen.getByText('Get paid for each session you complete (excludes VA employees).')).toBeTruthy()
- expect(screen.getByRole('button', { name: 'Go to questionnaire' })).toBeTruthy()
- expect(screen.getByRole('link', { name: 'Learn more about the Veteran Usability Project' })).toBeTruthy()
- expect(screen.getByText('VA contracts: 36C10B22C0011 & 36C10X18C0061')).toBeTruthy()
+ expect(screen.getByLabelText(t('giveFeedback'))).toBeTruthy()
+ expect(screen.getByRole('header', { name: t('inAppRecruitment.makeAppBetter.header') })).toBeTruthy()
+ expect(screen.getByText(t('inAppRecruitment.makeAppBetter.body'))).toBeTruthy()
+ expect(screen.getByText(t('inAppRecruitment.makeAppBetter.bullet.1'))).toBeTruthy()
+ expect(screen.getByText(t('inAppRecruitment.makeAppBetter.bullet.2'))).toBeTruthy()
+ expect(screen.getByText(t('inAppRecruitment.makeAppBetter.bullet.3'))).toBeTruthy()
+ expect(screen.getByRole('button', { name: t('inAppRecruitment.goToQuestionnaire') })).toBeTruthy()
+ expect(screen.getByRole('link', { name: t('inAppRecruitment.learnMore') })).toBeTruthy()
+ expect(screen.getByText(t('inAppRecruitment.contracts'))).toBeTruthy()
})
it('goes to the questionnaire when button is pressed', () => {
- fireEvent.press(screen.getByRole('button', { name: 'Go to questionnaire' }))
+ fireEvent.press(screen.getByRole('button', { name: t('inAppRecruitment.goToQuestionnaire') }))
const expectNavArgs = {
url: 'https://docs.google.com/forms/d/e/1FAIpQLSfRb0OtW34qKm8tGoQwwwDFs8IqwOMCLTde3DeM-ukKOEZBnA/viewform',
- displayTitle: 'va.gov',
- loadingMessage: 'Loading questionnaire...',
+ displayTitle: t('webview.vagov'),
+ loadingMessage: t('inAppRecruitment.goToQuestionnaire.loading'),
}
expect(mockNavigationSpy).toHaveBeenCalledWith('Webview', expectNavArgs)
})
it('goes to the Veteran Usability Project when link is pressed', () => {
- fireEvent.press(screen.getByRole('link', { name: 'Learn more about the Veteran Usability Project' }))
+ fireEvent.press(screen.getByRole('link', { name: t('inAppRecruitment.learnMore') }))
expect(Alert.alert).toBeCalled()
})
})
diff --git a/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/NotificationsSettingsScreen/NotificationsSettingsScreen.test.tsx b/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/NotificationsSettingsScreen/NotificationsSettingsScreen.test.tsx
index 83474786887..72994ec5e42 100644
--- a/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/NotificationsSettingsScreen/NotificationsSettingsScreen.test.tsx
+++ b/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/NotificationsSettingsScreen/NotificationsSettingsScreen.test.tsx
@@ -134,9 +134,7 @@ context('NotificationsSettingsScreen', () => {
.mockResolvedValue(responseData)
renderWithProps(true, false, false, [apptPrefOff])
await waitFor(() => expect(screen.queryByRole('switch', { name: 'Upcoming appointments' })).toBeFalsy())
- await waitFor(() =>
- expect(screen.getByText('To get app notifications, turn them on in your device settings.')).toBeTruthy(),
- )
+ await waitFor(() => expect(screen.getByText(t('notifications.settings.alert.text'))).toBeTruthy())
})
})
describe('when system notifications havent been requested', () => {
@@ -160,12 +158,6 @@ context('NotificationsSettingsScreen', () => {
.calledWith('/v0/push/prefs/1')
.mockResolvedValue(responseData)
renderWithProps(true, true, true, [])
- await waitFor(() =>
- expect(
- screen.getByText(
- "We're sorry. Something went wrong on our end. Please refresh this screen or try again later.",
- ),
- ).toBeTruthy(),
- )
+ await waitFor(() => expect(screen.getByText(t('errors.callHelpCenter.sorryWithRefresh'))).toBeTruthy())
})
})
diff --git a/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/SettingsScreen.test.tsx b/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/SettingsScreen.test.tsx
index adca3573a2d..ece33a4b97b 100644
--- a/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/SettingsScreen.test.tsx
+++ b/VAMobile/src/screens/HomeScreen/ProfileScreen/SettingsScreen/SettingsScreen.test.tsx
@@ -3,6 +3,7 @@ import { Share } from 'react-native'
import { BIOMETRY_TYPE } from 'react-native-keychain'
import { fireEvent, screen } from '@testing-library/react-native'
+import { t } from 'i18next'
import { InitialState } from 'store/slices'
import { context, mockNavProps, render, when } from 'testUtils'
@@ -73,34 +74,36 @@ context('SettingsScreen', () => {
})
it('initializes correctly', () => {
- expect(screen.getByRole('link', { name: 'Account security' })).toBeTruthy()
- expect(screen.getByRole('link', { name: 'Notifications' })).toBeTruthy()
- expect(screen.getByRole('link', { name: 'Share the app' })).toBeTruthy()
- expect(screen.getByRole('link', { name: 'Privacy policy' })).toBeTruthy()
- expect(screen.getByRole('link', { name: 'Developer Screen' })).toBeTruthy()
- expect(screen.getByRole('button', { name: 'Sign out' })).toBeTruthy()
+ expect(screen.getByRole('link', { name: t('accountSecurity') })).toBeTruthy()
+ expect(screen.getByRole('link', { name: t('notifications.title') })).toBeTruthy()
+ expect(screen.getByRole('link', { name: t('shareApp.title') })).toBeTruthy()
+ expect(screen.getByRole('link', { name: t('privacyPolicy.title') })).toBeTruthy()
+ expect(screen.getByRole('link', { name: t('debug.title') })).toBeTruthy()
+ expect(screen.getByRole('button', { name: t('logout.title') })).toBeTruthy()
})
describe('when privacy policy is clicked', () => {
it('should launch external link', () => {
- fireEvent.press(screen.getByRole('link', { name: 'Privacy policy' }))
+ fireEvent.press(screen.getByRole('link', { name: t('privacyPolicy.title') }))
expect(mockExternalLinkSpy).toHaveBeenCalled()
})
})
describe('when "Share the app" is clicked', () => {
it('should call Share.share', () => {
- fireEvent.press(screen.getByRole('link', { name: 'Share the app' }))
+ fireEvent.press(screen.getByRole('link', { name: t('shareApp.title') }))
expect(Share.share).toBeCalledWith({
- message:
- 'Download the VA: Health and Benefits on the App Store: https://apps.apple.com/us/app/va-health-and-benefits/id1559609596 or on Google Play: https://play.google.com/store/apps/details?id=gov.va.mobileapp',
+ message: t('shareApp.text', {
+ appleStoreLink: defaultEnvVars.APPLE_STORE_LINK,
+ googlePlayLink: defaultEnvVars.GOOGLE_PLAY_LINK,
+ }),
})
})
})
describe('on account security click', () => {
it('should call useRouteNavigation', () => {
- fireEvent.press(screen.getByRole('link', { name: 'Account security' }))
+ fireEvent.press(screen.getByRole('link', { name: t('accountSecurity') }))
expect(mockNavigationSpy).toHaveBeenCalledWith('AccountSecurity')
})
})
diff --git a/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/DirectDepositScreen.test.tsx b/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/DirectDepositScreen.test.tsx
index a1301a6e0b5..2bbc012fa19 100644
--- a/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/DirectDepositScreen.test.tsx
+++ b/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/DirectDepositScreen.test.tsx
@@ -1,6 +1,7 @@
import React from 'react'
import { fireEvent, screen } from '@testing-library/react-native'
+import { t } from 'i18next'
import { directDepositKeys } from 'api/directDeposit'
import { DirectDepositData } from 'api/types'
@@ -73,13 +74,13 @@ context('DirectDepositScreen', () => {
.calledWith('/v0/payment-information/benefits')
.mockResolvedValue(mockData)
initializeTestInstance(mockData)
- await waitFor(() => expect(screen.getByText('Account')).toBeTruthy())
+ await waitFor(() => expect(screen.getByText(t('directDeposit.account'))).toBeTruthy())
await waitFor(() => expect(screen.getByText('BoA')).toBeTruthy())
await waitFor(() => expect(screen.getByText('******1234')).toBeTruthy())
await waitFor(() => expect(screen.getByText('Savings account')).toBeTruthy())
await waitFor(() => fireEvent.press(screen.getByTestId('account-boa-******1234-savings-account')))
await waitFor(() =>
- expect(mockNavigationSpy).toBeCalledWith('EditDirectDeposit', { displayTitle: 'Edit account' }),
+ expect(mockNavigationSpy).toBeCalledWith('EditDirectDeposit', { displayTitle: t('directDeposit.edit.title') }),
)
})
})
@@ -90,7 +91,7 @@ context('DirectDepositScreen', () => {
.calledWith('/v0/payment-information/benefits')
.mockResolvedValue(noData)
initializeTestInstance()
- await waitFor(() => expect(screen.getByText('Add your bank account information')).toBeTruthy())
+ await waitFor(() => expect(screen.getByText(t('directDeposit.addBankAccountInformation'))).toBeTruthy())
})
})
@@ -100,7 +101,9 @@ context('DirectDepositScreen', () => {
.calledWith('/v0/payment-information/benefits')
.mockRejectedValue({ networkError: true } as api.APIError)
initializeTestInstance()
- await waitFor(() => expect(screen.getByRole('header', { name: "The app can't be loaded." })).toBeTruthy())
+ await waitFor(() =>
+ expect(screen.getByRole('header', { name: t('errors.networkConnection.header') })).toBeTruthy(),
+ )
})
})
})
diff --git a/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/EditDirectDepositScreen/EditDirectDepositScreen.test.tsx b/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/EditDirectDepositScreen/EditDirectDepositScreen.test.tsx
index 338690bbe4e..fde013e6111 100644
--- a/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/EditDirectDepositScreen/EditDirectDepositScreen.test.tsx
+++ b/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/EditDirectDepositScreen/EditDirectDepositScreen.test.tsx
@@ -1,5 +1,7 @@
import React from 'react'
+import { t } from 'i18next'
+
import { PaymentAccountData } from 'api/types'
import { DirectDepositErrors } from 'constants/errors'
import * as api from 'store/api'
@@ -43,9 +45,9 @@ context('EditDirectDepositScreen', () => {
describe('when user selects an account type', () => {
it('should update the value of the accountType', () => {
fireEvent.press(screen.getByTestId('accountType'))
- fireEvent.press(screen.getByText('Checking'))
- fireEvent.press(screen.getByText('Done'))
- expect(screen.getByText('Checking')).toBeTruthy()
+ fireEvent.press(screen.getByText(t('accountType.checking')))
+ fireEvent.press(screen.getByText(t('done')))
+ expect(screen.getByText(t('accountType.checking'))).toBeTruthy()
})
})
@@ -60,26 +62,26 @@ context('EditDirectDepositScreen', () => {
fireEvent.changeText(screen.getByTestId('routingNumber'), '053100300')
fireEvent.changeText(screen.getByTestId('accountNumber'), '12345678901234567')
fireEvent.press(screen.getByTestId('accountType'))
- fireEvent.press(screen.getByText('Checking'))
- fireEvent.press(screen.getByText('Done'))
+ fireEvent.press(screen.getByText(t('accountType.checking')))
+ fireEvent.press(screen.getByText(t('done')))
fireEvent.press(screen.getByTestId('checkBox'))
- fireEvent.press(screen.getByText('Save'))
+ fireEvent.press(screen.getByText(t('save')))
when(api.put as jest.Mock)
.calledWith(`/v0/payment-information/benefits`, bankData)
.mockResolvedValue('success')
- expect(screen.getByText('Saving your direct deposit information...')).toBeTruthy()
+ expect(screen.getByText(t('directDeposit.savingInformation'))).toBeTruthy()
await waitFor(() => expect(api.put as jest.Mock).toBeCalledWith(`/v0/payment-information/benefits`, bankData))
})
})
describe('when content is invalid', () => {
it('should display an AlertBox and field errors', () => {
- fireEvent.press(screen.getByRole('button', { name: 'Save' }))
- expect(screen.getByText('Check your direct deposit information')).toBeTruthy()
- expect(screen.getByText('Enter a 9-digit routing number')).toBeTruthy()
- expect(screen.getByText('Enter an account number')).toBeTruthy()
- expect(screen.getByText('Select an account type')).toBeTruthy()
- expect(screen.getByText('Select checkbox to confirm information')).toBeTruthy()
+ fireEvent.press(screen.getByRole('button', { name: t('save') }))
+ expect(screen.getByText(t('editDirectDeposit.pleaseCheckDDInfo'))).toBeTruthy()
+ expect(screen.getByText(t('editDirectDeposit.routingNumberFieldError'))).toBeTruthy()
+ expect(screen.getByText(t('editDirectDeposit.accountNumberFieldError'))).toBeTruthy()
+ expect(screen.getByText(t('editDirectDeposit.accountTypeFieldError'))).toBeTruthy()
+ expect(screen.getByText(t('editDirectDeposit.checkBoxFieldError'))).toBeTruthy()
})
})
@@ -95,10 +97,10 @@ context('EditDirectDepositScreen', () => {
fireEvent.changeText(screen.getByTestId('routingNumber'), '053100300')
fireEvent.changeText(screen.getByTestId('accountNumber'), '12345678901234567')
fireEvent.press(screen.getByTestId('accountType'))
- fireEvent.press(screen.getByText('Checking'))
- fireEvent.press(screen.getByText('Done'))
+ fireEvent.press(screen.getByText(t('accountType.checking')))
+ fireEvent.press(screen.getByText(t('done')))
fireEvent.press(screen.getByTestId('checkBox'))
- fireEvent.press(screen.getByText('Save'))
+ fireEvent.press(screen.getByText(t('save')))
when(api.put as jest.Mock)
.calledWith(`/v0/payment-information/benefits`, bankData)
.mockRejectedValue({
@@ -116,13 +118,7 @@ context('EditDirectDepositScreen', () => {
],
},
})
- await waitFor(() =>
- expect(
- screen.getByText(
- "We couldn't find a bank linked to this routing number. Please check your bank's 9-digit routing number and enter again.",
- ),
- ).toBeTruthy(),
- )
+ await waitFor(() => expect(screen.getByText(t('editDirectDeposit.errorInvalidRoutingNumber'))).toBeTruthy())
})
})
})
diff --git a/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/HowToUpdateDirectDepositScreen/HowToUpdateDirectDepositScreen.test.tsx b/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/HowToUpdateDirectDepositScreen/HowToUpdateDirectDepositScreen.test.tsx
index efd91c6069d..ab63573837c 100644
--- a/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/HowToUpdateDirectDepositScreen/HowToUpdateDirectDepositScreen.test.tsx
+++ b/VAMobile/src/screens/PaymentsScreen/DirectDepositScreen/HowToUpdateDirectDepositScreen/HowToUpdateDirectDepositScreen.test.tsx
@@ -2,6 +2,7 @@ import React from 'react'
import { Linking } from 'react-native'
import { fireEvent, screen } from '@testing-library/react-native'
+import { t } from 'i18next'
import { context, mockNavProps, render } from 'testUtils'
@@ -13,24 +14,18 @@ context('HowToUpdateDirectDepositScreen', () => {
})
it('initializes correctly', () => {
- expect(screen.getByLabelText('Direct deposit')).toBeTruthy()
+ expect(screen.getByLabelText(t('directDeposit.title'))).toBeTruthy()
expect(
screen.getByRole('heading', {
- name: 'You’ll need to sign in with a verified ID.me or Login.gov account to update your direct deposit information',
+ name: t('howToUpdateDirectDeposit.alert.title'),
}),
).toBeTruthy()
- expect(screen.getByText('We require this to protect bank account information and prevent fraud.')).toBeTruthy()
- expect(
- screen.getByText(
- 'If you have one, please sign out and sign back in using your verified ID.me or Login.gov account.',
- ),
- ).toBeTruthy()
- expect(screen.getByRole('header', { name: 'Call us to update your direct deposit information' })).toBeTruthy()
- expect(
- screen.getByText('You can call us. We’re here Monday through Friday, 8:00 a.m. to 9:00 p.m. ET.'),
- ).toBeTruthy()
+ expect(screen.getByText(t('howToUpdateDirectDeposit.alert.body.1'))).toBeTruthy()
+ expect(screen.getByText(t('howToUpdateDirectDeposit.alert.body.2'))).toBeTruthy()
+ expect(screen.getByRole('header', { name: t('howToUpdateDirectDeposit.card.title') })).toBeTruthy()
+ expect(screen.getByText(t('howToUpdateDirectDeposit.card.callUs'))).toBeTruthy()
expect(screen.getByRole('link', { name: '800-827-1000' })).toBeTruthy()
- expect(screen.getByRole('link', { name: 'TTY: 711' })).toBeTruthy()
+ expect(screen.getByRole('link', { name: t('contactVA.tty.displayText') })).toBeTruthy()
fireEvent.press(screen.getByRole('link', { name: '800-827-1000' }))
expect(Linking.openURL).toBeCalled()
})
diff --git a/VAMobile/src/utils/hooks/index.tsx b/VAMobile/src/utils/hooks/index.tsx
index e791f04b1d2..52666d665f3 100644
--- a/VAMobile/src/utils/hooks/index.tsx
+++ b/VAMobile/src/utils/hooks/index.tsx
@@ -7,7 +7,6 @@ import {
AlertButton,
AppState,
Dimensions,
- EmitterSubscription,
Keyboard,
Linking,
PixelRatio,
@@ -23,6 +22,7 @@ import { CommonActions, EventArg, useNavigation } from '@react-navigation/native
import { ParamListBase } from '@react-navigation/routers/lib/typescript/src/types'
import { StackNavigationProp } from '@react-navigation/stack'
+import { useIsScreenReaderEnabled } from '@department-of-veterans-affairs/mobile-component-library'
import { useActionSheet } from '@expo/react-native-action-sheet'
import { ActionSheetOptions } from '@expo/react-native-action-sheet/lib/typescript/types'
import { DateTime } from 'luxon'
@@ -187,46 +187,6 @@ export function useAccessibilityFocus(): [MutableRefObject, () => void] {
return [ref, setFocus]
}
-/**
- * Hook to check if the screen reader is enabled
- *
- * withListener - True to add a listener to live update screen reader status, default false
- * @returns boolean if the screen reader is on
- */
-export function useIsScreenReaderEnabled(withListener = false): boolean {
- const [screenReaderEnabled, setScreenReaderEnabled] = useState(false)
-
- useEffect(() => {
- let isMounted = true
- let screenReaderChangedSubscription: EmitterSubscription
-
- if (withListener) {
- screenReaderChangedSubscription = AccessibilityInfo.addEventListener(
- 'screenReaderChanged',
- (isScreenReaderEnabled) => {
- if (isMounted) {
- setScreenReaderEnabled(isScreenReaderEnabled)
- }
- },
- )
- }
- AccessibilityInfo.isScreenReaderEnabled().then((isScreenReaderEnabled) => {
- if (isMounted) {
- setScreenReaderEnabled(isScreenReaderEnabled)
- }
- })
-
- return () => {
- isMounted = false
- if (withListener) {
- screenReaderChangedSubscription?.remove()
- }
- }
- }, [screenReaderEnabled, withListener])
-
- return screenReaderEnabled
-}
-
/**
* Hook to display a warning that the user is leaving the app when tapping an external link
*
diff --git a/VAMobile/yarn.lock b/VAMobile/yarn.lock
index 52e0216a20d..c9a7e2d5136 100644
--- a/VAMobile/yarn.lock
+++ b/VAMobile/yarn.lock
@@ -2389,10 +2389,10 @@
color "^4.2.3"
warn-once "^0.1.0"
-"@reduxjs/toolkit@^2.3.0":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.3.0.tgz#d00134634d6c1678e8563ac50026e429e3b64420"
- integrity sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==
+"@reduxjs/toolkit@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.4.0.tgz#29fd3a19530fc50d648a9b1e0132da0cd5618f19"
+ integrity sha512-wJZEuSKj14tvNfxiIiJws0tQN77/rDqucBq528ApebMIRHyWpCanJVQRxQ8WWZC19iCDKxDsGlbAir3F1layxA==
dependencies:
immer "^10.0.3"
redux "^5.0.1"
@@ -2564,10 +2564,10 @@
lodash "^4.17.21"
redent "^3.0.0"
-"@testing-library/react-native@^12.8.1":
- version "12.8.1"
- resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-12.8.1.tgz#833c73a825aa87b9127717a44d4aeee44b59a963"
- integrity sha512-/7PIFCpeqAD3j7nzKQhZtm1T6RR/O/tB1We7JHtYP5RpTBj8rPitEpt6xGrD8R0ymOh+DxDKK7Zovfv5uDSRWg==
+"@testing-library/react-native@^12.9.0":
+ version "12.9.0"
+ resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-12.9.0.tgz#9c727d9ffec91024be3288ed9376df3673154784"
+ integrity sha512-wIn/lB1FjV2N4Q7i9PWVRck3Ehwq5pkhAef5X5/bmQ78J/NoOsGbVY2/DG5Y9Lxw+RfE+GvSEh/fe5Tz6sKSvw==
dependencies:
jest-matcher-utils "^29.7.0"
pretty-format "^29.7.0"
@@ -2760,10 +2760,10 @@
dependencies:
"@types/node" "*"
-"@types/lodash@^4.17.7":
- version "4.17.7"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612"
- integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==
+"@types/lodash@^4.17.13":
+ version "4.17.13"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb"
+ integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==
"@types/luxon@^3.4.2":
version "3.4.2"
@@ -7396,10 +7396,10 @@ jest-watcher@^29.7.0:
jest-util "^29.7.0"
string-length "^4.0.1"
-jest-when@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/jest-when/-/jest-when-3.6.0.tgz#b46ee408d68f671447b218f2ae6bd93fb5028acf"
- integrity sha512-+cZWTy0ekAJo7M9Om0Scdor1jm3wDiYJWmXE8U22UVnkH54YCXAuaqz3P+up/FdtOg8g4wHOxV7Thd7nKhT6Dg==
+jest-when@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/jest-when/-/jest-when-3.7.0.tgz#9a464964d7312214da8d12ea57957a06fbcc6244"
+ integrity sha512-aLbiyxmtksijcrKFir7n+t+XPbqSLV01eDkRyX28WM4VgA/iSc3mG8R8O2evDtOAa6SefrJiTIt/rTqqyrwVZg==
jest-worker@^29.6.3, jest-worker@^29.7.0:
version "29.7.0"
@@ -8377,9 +8377,9 @@ nan@^2.14.0:
integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==
nanoid@^3.1.23, nanoid@^3.3.7:
- version "3.3.7"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
- integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+ version "3.3.8"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
+ integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
natural-compare@^1.4.0:
version "1.4.0"
@@ -9388,10 +9388,10 @@ react-native-webp-format@^1.2.0:
resolved "https://registry.yarnpkg.com/react-native-webp-format/-/react-native-webp-format-1.2.0.tgz#6c7cbed4cdc8247711c7d7f656d0d4f739836c82"
integrity sha512-tUL/AbM6QwUsxsGutJ1bN4RW8JdD2w5Mpj+An4DvYKkm0bKHbODj7U7gI1+8X68GqJWOy+Ps2cbVmgNpSDfRPQ==
-react-native-webview@^13.12.3:
- version "13.12.3"
- resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.12.3.tgz#3aa9d2fc982ba2681e56d3e96e22b63a0d929270"
- integrity sha512-Y1I5YyDYyE7NC96RHLhd2nxh7ymLYOYLTefgx5ixxw2OToQK0ow3OJ+o77QcI1Tuevj5PCxwqC/14ceS/7yPJQ==
+react-native-webview@^13.12.4:
+ version "13.12.4"
+ resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.12.4.tgz#1a563a7fbd6bf53d688388d46708f273ed0ebb94"
+ integrity sha512-8lWeYPVWeOj0ya9ZpDesOQPRgczuN3ogQHlhS21sNXndd4kvfPG+WjlRdrvxYgj//udpwmzcWzagwLnEp60Aqg==
dependencies:
escape-string-regexp "^4.0.0"
invariant "2.2.4"
@@ -10357,7 +10357,7 @@ string-natural-compare@^3.0.1:
resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==
-"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -10374,6 +10374,15 @@ string-width@^2.0.0, string-width@^2.1.1:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
string-width@^5.0.1, string-width@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
@@ -10503,7 +10512,7 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
-"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -10524,6 +10533,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-ansi@^7.0.1, strip-ansi@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
@@ -11384,7 +11400,7 @@ word-wrap@~1.2.3:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f"
integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==
-"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -11402,6 +11418,15 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"