diff --git a/.github/ISSUE_TEMPLATE/onboarding-request-engineering.yml b/.github/ISSUE_TEMPLATE/onboarding-request-engineering.yml
index 089106da503..284e92a6339 100644
--- a/.github/ISSUE_TEMPLATE/onboarding-request-engineering.yml
+++ b/.github/ISSUE_TEMPLATE/onboarding-request-engineering.yml
@@ -1,7 +1,7 @@
name: Onboarding Request (Engineering)
description: Fill out this form to request initiation of engineering onboarding for
title: "Onboarding: [name]"
-labels: [ onboarding ]
+labels: [ user-onboarding ]
assignees: timwright12
body:
- type: markdown
diff --git a/.github/ISSUE_TEMPLATE/release_ticket.md b/.github/ISSUE_TEMPLATE/release_ticket.md
index 64c24e0fd64..faa9246b6d8 100644
--- a/.github/ISSUE_TEMPLATE/release_ticket.md
+++ b/.github/ISSUE_TEMPLATE/release_ticket.md
@@ -3,7 +3,7 @@ name: Release Review Template
about: Template for requesting a production release for VA mobile app
title: "{{ env.releaseDate }} Release Sign-Off: {{ env.versionNumber }}"
labels: release
-assignees: timwright12, chrisj-usds, drjecker, dumathane, rachelhanster, kellylein, DonMcCaugheyUSDS, TKDickson
+assignees: timwright12, chrisj-usds, dumathane, rachelhanster, kellylein, DonMcCaugheyUSDS, TKDickson
---
diff --git a/.github/workflows/documentation_accessibility_checks.yml b/.github/workflows/documentation_accessibility_checks.yml
index dfce804cd6e..ba349c755e8 100644
--- a/.github/workflows/documentation_accessibility_checks.yml
+++ b/.github/workflows/documentation_accessibility_checks.yml
@@ -18,15 +18,15 @@ jobs:
run: npm cache clean --force
- name: Install Axe CLI globally
run: npm install -g @axe-core/cli@latest
- - name: Update npm
+ - name: Update npm
run: npm install -g npm@latest
- uses: actions/setup-node@v3
with:
node-version-file: 'VAMobile/.nvmrc'
cache: yarn
cache-dependency-path: VAMobile/yarn.lock
- - name: Install ChromeDriver
- run: npm install -g chromedriver@126.0.0
+ - name: Install latest version of chromeDriver
+ run: npm install -g chromedriver@latest
- name: Test build
working-directory: VAMobile
run: |
diff --git a/.github/workflows/e2e_android.yml b/.github/workflows/e2e_android.yml
index 07079320794..c7b675e39a0 100644
--- a/.github/workflows/e2e_android.yml
+++ b/.github/workflows/e2e_android.yml
@@ -30,16 +30,20 @@ on:
description: 'Add results to testRail?'
type: boolean
required: false
- device_specific:
- description: 'Is your testRail run Android only? (only check if adding results to testRail)'
- type: boolean
- required: false
schedule:
- cron: '0 4 * * 1,2,3,4,5'
workflow_run:
workflows: ['[Release] New Release Issue']
types:
- in_progress
+ workflow_call:
+ secrets:
+ TEST_RAIL_USER:
+ description: "TestRail robot userid"
+ required: true
+ TEST_RAIL_KEY:
+ description: "TestRail api key"
+ required: true
concurrency:
group: android-detox-${{ github.ref }}
@@ -343,7 +347,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
id: create-issue
- matrix-send_test_results_to_testrail:
+ matrix_send_test_results_to_testrail:
if: (!cancelled()) && github.event.inputs.run_testRail == 'true'
needs: [matrix-e2e-android, output_detox_tests_to_run]
strategy:
@@ -356,6 +360,66 @@ jobs:
with:
test_names: "${{matrix.testsuite}}"
testRail_name: ${{ inputs.testRail_name }}
- test_specific_OS_needed: ${{ inputs.device_specific}}
test_OS_name: "Android"
secrets: inherit
+
+ update-test-names:
+ if: (!cancelled()) && github.event.inputs.run_testRail == 'true'
+ needs: [matrix-e2e-android, output_detox_tests_to_run, matrix_send_test_results_to_testrail]
+ continue-on-error: false
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: update-test-names
+ run: |
+ for ((i=0; ; i+=250)); do
+ echo "i = $i"
+ getTestCaseNewName=$(curl -X GET -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/get_tests/${{ needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number }}&offset=$i")
+ echo $(jq --compact-output '[.tests[] | .title |= sub("(]).*$"; "]")]' <<< "$getTestCaseNewName") >> input.json
+ if [[ $(jq '._links.next == null' <<< "$getTestCaseNewName") == 'true' ]];
+ then
+ break
+ fi
+ done
+ getTestCaseNewName=$(jq --compact-output -s 'add' input.json)
+ groupTestCasesByTitle=$(echo $getTestCaseNewName | jq --compact-output '[group_by(.title)[] | [.[0].title, .[0].status_id, map(.id)[]]]')
+ getFirstTestNewName=$(echo $groupTestCasesByTitle | jq --compact-output '[.[] | .[0]]')
+ getCasesID=$(curl -X GET -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/get_cases/29")
+ updateRunWithNewCases=$(curl -X POST -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ -d '{"suite_id": 92, "include_all": false, "case_ids": '$(echo $getCasesID | jq --argjson testRailNames "$getFirstTestNewName" --compact-output '.cases | map(select(.title == $testRailNames[])) | map(.id)')'}' \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/update_run/${{needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number}}")
+ getTestCases=$(curl -X GET -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/get_tests/${{needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number}}")
+ for i in $(echo $getTestCases | jq -r '.tests[].id'); do
+ getTestName=$(echo $getTestCases | jq --argjson testIDs "$i" -r '.tests | map(select(.id == $testIDs)) | .[0].title')
+
+ getFailedTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 5)) | map(.title)')
+ isTestFailed=$(echo $getFailedTests | jq 'any(. == "'"$getTestName"'")')
+ getRetestTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 4)) | map(.title)')
+ isTestRetest=$(echo $getRetestTests | jq 'any(. == "'"$getTestName"'")')
+ getPassedTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 1)) | map(.title)')
+ isTestPassed=$(echo $getPassedTests | jq 'any(. == "'"$getTestName"'")')
+ if [[ "$isTestFailed" == "true" ]]; then
+ resp5=$(curl -X POST -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ -d '{"status_id": 5}' \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"")
+ elif [[ "$isTestRetest" == "true" ]]; then
+ resp5=$(curl -X POST -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ -d '{"status_id": 4}' \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"")
+ elif [[ "$isTestPassed" == "true" ]]; then
+ resp5=$(curl -X POST -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ -d '{"status_id": 1}' \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"")
+ fi
+ done
diff --git a/.github/workflows/e2e_detox_mapping.yml b/.github/workflows/e2e_detox_mapping.yml
index 366a531c42a..000c07e8344 100644
--- a/.github/workflows/e2e_detox_mapping.yml
+++ b/.github/workflows/e2e_detox_mapping.yml
@@ -68,32 +68,32 @@ jobs:
id: testing_matrix
run: |
resp=$(echo ${{steps.changed_files_dir.outputs.all_changed_and_modified_files}} |
- jq 'select(contains(["Login"])) += ["LoginScreen"] |
- select(contains(["AppealsDetailsScreen"])) += ["Appeals", "AppealsExpanded"] |
+ jq 'select(contains(["LoginScreen"])) += ["LoginScreen"] |
+ select(contains(["AppealDetailsScreen"])) += ["Appeals", "AppealsExpanded"] |
select(contains(["NeedHelpData"]) or contains(["NoClaimsAndAppeals"]) or contains(["NoClaimsAndAppealsAccess"]) or contains(["ClaimsAndAppealsListView"]) or contains(["claimsAndAppeals"])) += ["Appeals", "AppealsExpanded", "Claims"] |
- select(contains(["ClaimsDetailsScreen"]) or contains(["ClaimsLettersScreen"]) or contains(["SubmitEvidence"]) or contains(["ClaimsHistoryScreen"])) += ["Claims"] |
- select(contains(["ClaimsLettersScreen"]) or contains(["decisionLetters"])) += ["DecisionLetters"] |
+ select(contains(["ClaimDetailsScreen"]) or contains(["ClaimLettersScreen"]) or contains(["SubmitEvidence"]) or contains(["ClaimsHistoryScreen"])) += ["Claims"] |
+ select(contains(["ClaimLettersScreen"]) or contains(["decisionLetters"])) += ["DecisionLetters"] |
select(contains(["DisabilityRatingsScreen"]) or contains(["disabilityRating"])) += ["DisabilityRatings", "VeteranStatusCard"] |
select(contains(["Letters"]) or contains(["letters"])) += ["VALetters"] |
select(contains(["Appointments"]) or contains(["appointments"])) += ["Appointments", "AppointmentsExpanded"] |
- select(contains(["Cerner"]) or contains(["Facilities"])) += ["Cerner"] |
+ select(contains(["CernerAlert"]) or contains(["Facilities"])) += ["Cerner"] |
select(contains(["Pharmacy"]) or contains(["prescriptions"])) += ["Prescriptions"] |
select(contains(["SecureMessaging"]) or contains(["secureMessaging"])) += ["Messages"] |
select(contains(["Vaccines"]) or contains(["vaccines"])) += ["VaccineRecords"] |
select(contains(["ContactVAScreen"])) += ["HomeScreen"] |
select(contains(["MilitaryInformationScreen"]) or contains(["militaryService"]) or contains(["Nametag"])) += ["MilitaryInformation", "VeteranStatusCard"] |
- select(contains(["PersonalInformationScreen"]) or contains(["demographics"]) or contains(["personalInformation"])) += ["PeronsalInformationScreen", "VeteranStatusCard", "HomeScreen", "ProfileScreen"] |
+ select(contains(["PersonalInformationScreen"]) or contains(["demographics"]) or contains(["personalInformation"])) += ["PersonalInformationScreen", "VeteranStatusCard", "HomeScreen", "ProfileScreen"] |
select(contains(["SettingsScreen"])) += ["SettingsScreen"] |
- select(contains(["VeteranCrisisLineScreen"])) += ["VeteransCrisisLine", "SignIn"] |
+ select(contains(["VeteransCrisisLineScreen"])) += ["VeteransCrisisLine", "SignIn"] |
+ select(contains(["VeteranStatusScreen"])) += ["VeteranStatusCard"] |
select(contains(["OnboardingCarousel"])) += ["Onboarding"] |
select(contains(["PaymentHistory"]) or contains(["payments"])) += ["Payments"] |
select(contains(["DirectDepositScreen"]) or contains(["directDeposit"])) += ["DirectDeposit"] |
select(contains(["SplashScreen"])) += ["Onboarding", "LoginScreen"] |
- select(contains(["Auth"])) += ["SignIn"] |
+ select(contains(["auth"])) += ["SignIn"] |
select(contains(["authorizedServices"])) += ["Appeals", "AppealsExpanded", "Appointments", "AppointmentsExpanded", "Claims", "DirectDeposit", "DisabilityRatings", "PersonalInformationScreen", "VALetters", "MilitaryInformation", "Payments", "Prescriptions", "Messages", "VeteranStatusCard"] |
select(contains(["contactInformation"]) or contains(["ContactInformationScreen"])) += ["ContactInformation", "VALetters"] |
select(contains(["NotificationManager"])) += ["SettingsScreen", "PushNotifications"] |
- select(contains(["OnboardingCarousel"])) += ["Onboarding"] |
select(contains(["Types"]) or contains(["VAImage"])) +=
["AvailabilityFramework", "Cerner", "ContactInformation", "VALetters", "LoginScreen", "Onboarding", "ProfileScreen", "PushNotifications", "SettingsScreen", "SignIn", "VaccineRecords", "Claims", "Appeals", "AppealsExpanded", "DisabilityRatings", "Appointments", "AppointmentsExpanded", "Prescriptions", "Messages", "MilitaryInformation", "HomeScreen", "VeteransCrisisLine", "VeteranStatusCard", "DirectDeposit", "Payments", "PersonalInformationScreen"]
| unique')
@@ -147,7 +147,7 @@ jobs:
or contains(["TextArea"]) or contains(["TextLines"]) or contains(["TextView"]) or contains(["backButtonLabels"]) or contains(["common.ts"])) +=
["AvailabilityFramework", "Cerner", "ContactInformation", "VALetters", "LoginScreen", "Onboarding", "ProfileScreen", "PushNotifications", "SettingsScreen", "SignIn", "VaccineRecords", "Claims", "Appeals", "AppealsExpanded", "DisabilityRatings", "Appointments", "AppointmentsExpanded", "Prescriptions", "Messages", "MilitaryInformation", "HomeScreen", "VeteransCrisisLine", "VeteranStatusCard", "DirectDeposit", "Payments", "PersonalInformationScreen"]
| unique ')
-
+
test_matrix=$(echo "$resp" | jq --argjson a "${resp_file}" --argjson b "${resp}" --compact-output '$a + $b | unique')
echo "$test_matrix"
test_matrix=$(echo $test_matrix | jq --compact-output 'map(select(. == ("Appeals", "AppealsExpanded", "Appointments", "AppointmentExpanded", "AvailabilityFramework", "Cerner", "Claims",
diff --git a/.github/workflows/e2e_ios.yml b/.github/workflows/e2e_ios.yml
index 4cf563640aa..00822a7b1e3 100644
--- a/.github/workflows/e2e_ios.yml
+++ b/.github/workflows/e2e_ios.yml
@@ -30,16 +30,21 @@ on:
description: 'Add results to testRail?'
type: boolean
required: false
- device_specific:
- description: 'Is your testRail run iOS only? (only check if adding results to testRail)'
- type: boolean
- required: false
schedule:
- cron: '0 4 * * 1,2,3,4,5'
workflow_run:
workflows: ['[Release] New Release Issue']
types:
- in_progress
+ workflow_call:
+ secrets:
+ TEST_RAIL_USER:
+ description: "TestRail robot userid"
+ required: true
+ TEST_RAIL_KEY:
+ description: "TestRail api key"
+ required: true
+
concurrency:
group: ios-detox-${{ github.ref }}
@@ -321,7 +326,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
id: create-issue
- matrix-send_test_results_to_testrail:
+ matrix_send_test_results_to_testrail:
if: (!cancelled()) && github.event.inputs.run_testRail == 'true'
needs: [matrix-e2e-ios, output_detox_tests_to_run]
strategy:
@@ -334,6 +339,66 @@ jobs:
with:
test_names: "${{matrix.testsuite}}"
testRail_name: ${{ inputs.testRail_name }}
- test_specific_OS_needed: ${{ inputs.device_specific}}
test_OS_name: "iOS"
secrets: inherit
+
+ update-test-names:
+ if: (!cancelled()) && github.event.inputs.run_testRail == 'true'
+ needs: [matrix-e2e-ios, output_detox_tests_to_run, matrix_send_test_results_to_testrail]
+ runs-on: ubuntu-latest
+ continue-on-error: false
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: update-test-names
+ run: |
+ for ((i=0; ; i+=250)); do
+ echo "i = $i"
+ getTestCaseNewName=$(curl -X GET -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/get_tests/${{ needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number }}&offset=$i")
+ echo $(jq --compact-output '[.tests[] | .title |= sub("(]).*$"; "]")]' <<< "$getTestCaseNewName") >> input.json
+ if [[ $(jq '._links.next == null' <<< "$getTestCaseNewName") == 'true' ]];
+ then
+ break
+ fi
+ done
+ getTestCaseNewName=$(jq --compact-output -s 'add' input.json)
+ groupTestCasesByTitle=$(echo $getTestCaseNewName | jq --compact-output '[group_by(.title)[] | [.[0].title, .[0].status_id, map(.id)[]]]')
+ getFirstTestNewName=$(echo $groupTestCasesByTitle | jq --compact-output '[.[] | .[0]]')
+ getCasesID=$(curl -X GET -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/get_cases/29")
+ updateRunWithNewCases=$(curl -X POST -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ -d '{"suite_id": 92, "include_all": false, "case_ids": '$(echo $getCasesID | jq --argjson testRailNames "$getFirstTestNewName" --compact-output '.cases | map(select(.title == $testRailNames[])) | map(.id)')'}' \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/update_run/${{needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number}}")
+ getTestCases=$(curl -X GET -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/get_tests/${{needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number}}")
+ for i in $(echo $getTestCases | jq -r '.tests[].id'); do
+ getTestName=$(echo $getTestCases | jq --argjson testIDs "$i" -r '.tests | map(select(.id == $testIDs)) | .[0].title')
+
+ getFailedTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 5)) | map(.title)')
+ isTestFailed=$(echo $getFailedTests | jq 'any(. == "'"$getTestName"'")')
+ getRetestTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 4)) | map(.title)')
+ isTestRetest=$(echo $getRetestTests | jq 'any(. == "'"$getTestName"'")')
+ getPassedTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 1)) | map(.title)')
+ isTestPassed=$(echo $getPassedTests | jq 'any(. == "'"$getTestName"'")')
+ if [[ "$isTestFailed" == "true" ]]; then
+ resp5=$(curl -X POST -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ -d '{"status_id": 5}' \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"")
+ elif [[ "$isTestRetest" == "true" ]]; then
+ resp5=$(curl -X POST -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ -d '{"status_id": 4}' \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"")
+ elif [[ "$isTestPassed" == "true" ]]; then
+ resp5=$(curl -X POST -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ -d '{"status_id": 1}' \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"")
+ fi
+ done
diff --git a/.github/workflows/label_pull_request_onReview.yml b/.github/workflows/label_pull_request_onReview.yml
index 2751d5ce279..aad4113b01d 100644
--- a/.github/workflows/label_pull_request_onReview.yml
+++ b/.github/workflows/label_pull_request_onReview.yml
@@ -17,7 +17,7 @@ jobs:
- name: Remove old labels and add FE-Changes Requested
run: |
- gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Needs Review,FE-With QA" --add-label "FE-Changes Requested"
+ gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-With QA" --add-label "FE-Changes Requested"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -29,9 +29,9 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
- - name: Remove old labels and add FE-Needs Review
+ - name: Remove old labels
run: |
- gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Changes Requested" --add-label "FE-Needs Review"
+ gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Changes Requested"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -59,10 +59,10 @@ jobs:
if [[ $(jq '[.[] | select(. | IN("timwright12", "rbontrager", "DJUltraTom", "TKDickson"))] | length' <<< "$approvals") -gt 0 ]]
then
echo 'This PR has QA approval and one other'
- gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Needs Review,FE-With QA" --add-label "FE-Ready to Merge"
+ gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-With QA" --add-label "FE-Ready to Merge"
else
echo 'This PR requires QA approval'
- gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Needs Review" --add-label "FE-With QA"
+ gh pr edit ${{ github.event.pull_request.number }} --add-label "FE-With QA"
fi
else
echo 'This PR requires 2 approvals, including one QA approval'
diff --git a/.github/workflows/start_test_rail_run.yml b/.github/workflows/start_test_rail_run.yml
index 556a73aa57e..287e2c12a15 100644
--- a/.github/workflows/start_test_rail_run.yml
+++ b/.github/workflows/start_test_rail_run.yml
@@ -59,12 +59,18 @@ jobs:
echo "TICKET_NUMBER: ${{inputs.ticketNumber}}"
echo "MILESTONE_ID: ${{inputs.milestoneId}}"
echo "" >> input.json
+ resp=$(curl -X GET -H 'Content-Type: application/json' \
+ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
+ "https://dsvavsp.testrail.io//index.php?/api/v2/get_cases/29§ion_id=3239")
+ length=$(echo $resp | jq '.cases | map(select(.custom_release_candidate_test_case == true )) | map(.id) | length')
+ randomNumber=$(((RANDOM % ${length})))
+ getID=$(echo $resp | jq --argjson random $randomNumber --compact-output '.cases | map(select(.custom_release_candidate_test_case == true )) | map(.id) | .[$random]')
for ((i=0; ; i+=250)); do
echo "i = $i"
resp=$(curl -X GET -H 'Content-Type: application/json' \
-u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
"https://dsvavsp.testrail.io//index.php?/api/v2/get_cases/29&offset=$i")
- echo $(jq --compact-output '.cases | map(select(.custom_release_candidate_test_case == true)) | map(.id)' <<< "$resp") >> input.json
+ echo $(jq --argjson testID $getID --compact-output '.cases | map(select(.custom_release_candidate_test_case == true and (.section_id != 3239 or .id == $testID))) | map(.id)' <<< "$resp") >> input.json
if [[ $(jq '._links.next == null' <<< "$resp") == 'true' ]];
then
break
diff --git a/.github/workflows/update_testrail_results.yml b/.github/workflows/update_testrail_results.yml
index 3fe4e8b0e8c..a6bf3b822a5 100644
--- a/.github/workflows/update_testrail_results.yml
+++ b/.github/workflows/update_testrail_results.yml
@@ -16,13 +16,14 @@ on:
testRail_name:
type: string
default: ''
- test_specific_OS_needed:
- type: boolean
- default: false
test_OS_name:
type: string
default: ''
-
+ outputs:
+ test_run_id_number:
+ description: "The id number for the test run"
+ value: ${{ jobs.send_test_results_to_testrail.outputs.output1 }}
+
defaults:
run:
working-directory: VAMobile
@@ -30,6 +31,8 @@ defaults:
jobs:
send_test_results_to_testrail:
runs-on: ubuntu-latest
+ outputs:
+ output1: ${{ steps.run-id-selection.outputs.TEST_RUN_ID }}
steps:
- name: Checkout
uses: actions/checkout@v3
@@ -47,18 +50,13 @@ jobs:
echo "TEST_RUN_ID=$resp" >> "$GITHUB_OUTPUT"
if [ "$resp" == '' ]; then
if [[ "${{ inputs.testRail_name }}" == "" ]]; then
- if [[ ${{ inputs.test_specific_OS_needed}} == true ]]; then
- OS_name="${{inputs.test_OS_name}}: "
- else
- OS_name=''
- fi
resp=$(curl -X POST -H 'Content-Type: application/json' \
-u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
- -d '{"suite_id": 92, "include_all": false, "name": "'"${OS_name}$(date +'%Y-%m-%d')"'"}' \
+ -d '{"suite_id": 92, "include_all": false, "name": "'"$(date +'%Y-%m-%d')"'"}' \
"https://dsvavsp.testrail.io//index.php?/api/v2/add_run/29" )
resp=$(curl -X GET -H 'Content-Type: application/json' \
-u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \
- "https://dsvavsp.testrail.io//index.php?/api/v2/get_runs/29&is_completed=0" | jq '.runs[] | select(.name =="'"${OS_name}$(date +'%Y-%m-%d')"'") | .id')
+ "https://dsvavsp.testrail.io//index.php?/api/v2/get_runs/29&is_completed=0" | jq '.runs[] | select(.name =="'"$(date +'%Y-%m-%d')"'") | .id')
echo "$resp"
echo "TEST_RUN_ID=$resp" >> "$GITHUB_OUTPUT"
else
@@ -100,4 +98,3 @@ jobs:
--run-id ${{steps.run-id-selection.outputs.TEST_RUN_ID}} \
--section-id ${{steps.section-id-selection.outputs.SECTION_RUN_ID}} \
-f "/home/runner/work/va-mobile-app/va-mobile-app/e2e-junit.xml"
-
diff --git a/VAMobile/android/Gemfile.lock b/VAMobile/android/Gemfile.lock
index a7ff0fb738e..ee304c14cb0 100644
--- a/VAMobile/android/Gemfile.lock
+++ b/VAMobile/android/Gemfile.lock
@@ -10,20 +10,20 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
- aws-partitions (1.991.0)
- aws-sdk-core (3.209.1)
+ aws-partitions (1.998.0)
+ aws-sdk-core (3.211.0)
aws-eventstream (~> 1, >= 1.3.0)
- aws-partitions (~> 1, >= 1.651.0)
+ aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
jmespath (~> 1, >= 1.6.1)
- aws-sdk-kms (1.94.0)
- aws-sdk-core (~> 3, >= 3.207.0)
+ aws-sdk-kms (1.95.0)
+ aws-sdk-core (~> 3, >= 3.210.0)
aws-sigv4 (~> 1.5)
- aws-sdk-s3 (1.167.0)
- aws-sdk-core (~> 3, >= 3.207.0)
+ aws-sdk-s3 (1.169.0)
+ aws-sdk-core (~> 3, >= 3.210.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
- aws-sigv4 (1.10.0)
+ aws-sigv4 (1.10.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.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.73.0)
+ google-apis-androidpublisher_v3 (0.74.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-core (0.15.1)
addressable (~> 2.5, >= 2.5.1)
@@ -148,7 +148,7 @@ GEM
google-cloud-core (~> 1.6)
googleauth (~> 1.9)
mini_mime (~> 1.0)
- googleauth (1.11.1)
+ googleauth (1.11.2)
faraday (>= 1.0, < 3.a)
google-cloud-env (~> 2.1)
jwt (>= 1.4, < 3.0)
@@ -160,7 +160,7 @@ GEM
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.2)
- json (2.7.2)
+ json (2.7.4)
jwt (2.9.3)
base64
mini_magick (4.13.2)
@@ -168,7 +168,7 @@ GEM
multi_json (1.15.0)
multipart-post (2.4.1)
mutex_m (0.2.0)
- nanaimo (0.3.0)
+ nanaimo (0.4.0)
naturally (2.2.1)
nkf (0.2.0)
optparse (0.5.0)
@@ -181,7 +181,7 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
- rexml (3.3.8)
+ rexml (3.3.9)
rouge (2.0.7)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
@@ -205,12 +205,12 @@ GEM
uber (0.1.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
- xcodeproj (1.25.1)
+ xcodeproj (1.26.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
- nanaimo (~> 0.3.0)
+ nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
xcpretty (0.3.0)
rouge (~> 2.0.7)
diff --git a/VAMobile/documentation/design/Components/Alerts and progress/Alert.md b/VAMobile/documentation/design/Components/Alerts and progress/Alert.md
index 7fdc7afa2cf..86a041eed3a 100644
--- a/VAMobile/documentation/design/Components/Alerts and progress/Alert.md
+++ b/VAMobile/documentation/design/Components/Alerts and progress/Alert.md
@@ -8,19 +8,19 @@ Alerts are an in-content way to keep users informed of important and sometimes t
### Informational
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/alert--info) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=253-1119&mode=design&t=gceZHkCGGR5VP79F-4)
-
+
### Success
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/alert--success) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=253-1098&mode=design&t=gceZHkCGGR5VP79F-4)
-
+
### Warning
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/alert--warning) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=253-1077&mode=design&t=gceZHkCGGR5VP79F-4)
-
+
### Error
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/alert--error) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=253-1056&mode=design&t=gceZHkCGGR5VP79F-4)
-
+
## Usage
diff --git a/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md b/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md
index 0fd0a7fee5a..7bd8620b2b7 100644
--- a/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md
+++ b/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md
@@ -8,11 +8,11 @@ Snackbars provide feedback regarding API interactions at the bottom of the scree
### Default
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/snackbar--default) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=263-702&t=1BgtKDvOeoxfzmzR-4)
-
+
### Variations
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/snackbar--with-action) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=263-702&t=1BgtKDvOeoxfzmzR-4)
-
+
## Usage
diff --git a/VAMobile/documentation/design/Components/Buttons and links/Button.md b/VAMobile/documentation/design/Components/Buttons and links/Button.md
index 7ce424112d1..18189d5d82a 100644
--- a/VAMobile/documentation/design/Components/Buttons and links/Button.md
+++ b/VAMobile/documentation/design/Components/Buttons and links/Button.md
@@ -10,25 +10,25 @@ A button draws attention to important actions with a large selectable surface.
#### Primary
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--primary) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-606&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
#### Secondary
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--secondary) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-607&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
### Base
#### Primary
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--base) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-595&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
#### Secondary
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--base-secondary) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-596&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
### Destructive
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--destructive) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-586&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
## Usage
[Refer to the VA Design System for usage guidance](https://design.va.gov/components/button/)
diff --git a/VAMobile/documentation/design/Components/Buttons and links/Link.md b/VAMobile/documentation/design/Components/Buttons and links/Link.md
index d2f3ec2aad9..522c9717b7c 100644
--- a/VAMobile/documentation/design/Components/Buttons and links/Link.md
+++ b/VAMobile/documentation/design/Components/Buttons and links/Link.md
@@ -8,12 +8,12 @@ A link is a navigation element that can appear alone, inline (embedded), or in a
### Default
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/link--default) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=235-771&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
### Default (with icon)
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/link--default-with-icon) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=235-772&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
### Additional variants
* [Attachment](https://department-of-veterans-affairs.github.io/va-mobile-library/iframe.html?args=&id=link--attachment&viewMode=story)
diff --git a/VAMobile/documentation/design/Components/Navigation/Secondary/SegmentedControl.md b/VAMobile/documentation/design/Components/Navigation/Secondary/SegmentedControl.md
index 0d376da1bc7..e10802b3f8f 100644
--- a/VAMobile/documentation/design/Components/Navigation/Secondary/SegmentedControl.md
+++ b/VAMobile/documentation/design/Components/Navigation/Secondary/SegmentedControl.md
@@ -8,17 +8,17 @@ A segmented control is used to switch between related views of information withi
### Two segments
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/segmented-control--2-segments) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=211-244&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
### Three segments
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/segmented-control--3-segments) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=211-248&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
### Four segments
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/segmented-control--4-segments) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=211-253&mode=design&t=CNVVTHmCkOFHUVbq-4)
-
+
## Usage
diff --git a/VAMobile/documentation/design/Components/Selection and input/Checkbox.md b/VAMobile/documentation/design/Components/Selection and input/Checkbox.md
index 944ece80c14..a90b5f6f822 100644
--- a/VAMobile/documentation/design/Components/Selection and input/Checkbox.md
+++ b/VAMobile/documentation/design/Components/Selection and input/Checkbox.md
@@ -10,29 +10,29 @@ Allows users to select one or more items from a list. Checkboxes are an easily u
#### Default
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox--default) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-384&t=iHMS9U3pTWPZb8Qb-4)
-
+
#### Tile
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox--tile) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-384&t=iHMS9U3pTWPZb8Qb-4)
-
+
#### Error
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox--error) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-384&t=iHMS9U3pTWPZb8Qb-4)
-
+
### Checkbox Group
#### Default
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox-group--default) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-441&t=iHMS9U3pTWPZb8Qb-4)
-
+
#### Tile
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox-group--tile) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-441&t=iHMS9U3pTWPZb8Qb-4)
-
+
#### Error
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox-group--error) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-441&t=iHMS9U3pTWPZb8Qb-4)
-
+
## Usage
[Refer to the VA Design System for usage guidance](https://design.va.gov/components/form/checkbox)
diff --git a/VAMobile/documentation/design/Foundation/Design tokens/Color.md b/VAMobile/documentation/design/Foundation/Design tokens/Color.md
index 14525c56ea0..2a6901a1b68 100644
--- a/VAMobile/documentation/design/Foundation/Design tokens/Color.md
+++ b/VAMobile/documentation/design/Foundation/Design tokens/Color.md
@@ -11,15 +11,15 @@ To learn more about color tokens, see the [slides](https://docs.google.com/prese
## Primitive
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/design-tokens-colors--docs#primitive)
-
+
## Semantic
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/design-tokens-colors--docs#semantic)
-
+
## Component
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/design-tokens-colors--docs#component)
-
+
## How to use color tokens
diff --git a/VAMobile/documentation/design/Foundation/Design tokens/Spacing.md b/VAMobile/documentation/design/Foundation/Design tokens/Spacing.md
index e4f6f16f0d2..f8b36a83d3a 100644
--- a/VAMobile/documentation/design/Foundation/Design tokens/Spacing.md
+++ b/VAMobile/documentation/design/Foundation/Design tokens/Spacing.md
@@ -15,7 +15,7 @@ The VA follows the USWDS spacing tokens and adds additional semantic tokens for
### Primitive
**Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/design-tokens-spacing--docs#primitive)
-
+
## How to use spacing tokens
diff --git a/VAMobile/documentation/design/Foundation/Icons.md b/VAMobile/documentation/design/Foundation/Icons.md
index 6fa94bbe045..3bbbafe6152 100644
--- a/VAMobile/documentation/design/Foundation/Icons.md
+++ b/VAMobile/documentation/design/Foundation/Icons.md
@@ -12,40 +12,40 @@ Use icons to communicate meaning, action, status, or feedback.
[Refer to the VA Design System for additional guidance](https://design.va.gov/foundation/icons)
### Appointments
-
+
### Communication
-
+
### Feedback
-
+
### Form fields
-
+
### Health
-
+
### Interaction
-
+
### Messaging
-
+
### Navigation
-
+
### Payments
-
+
### Prescriptions
-
+
### Social media
-
+
### Other
-
+
**Note**: The VA Mobile App icon library includes several icons that are not included in the VA Design System. These include:
- check_box — used for form fields
diff --git a/VAMobile/documentation/docs/About our team/_category_.json b/VAMobile/documentation/docs/About our team/_category_.json
index eb13411165b..997fb675c43 100644
--- a/VAMobile/documentation/docs/About our team/_category_.json
+++ b/VAMobile/documentation/docs/About our team/_category_.json
@@ -1,4 +1,4 @@
{
"label": "About our team",
- "position": 7
+ "position": 9
}
diff --git a/VAMobile/documentation/docs/App Features/_category_.json b/VAMobile/documentation/docs/App Features/_category_.json
new file mode 100644
index 00000000000..cc93fa1470c
--- /dev/null
+++ b/VAMobile/documentation/docs/App Features/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "App Features",
+ "position": 10
+}
diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Auth Diagrams.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Auth Diagrams.md
index c28c3219a3b..08bf84f414a 100644
--- a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Auth Diagrams.md
+++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Auth Diagrams.md
@@ -2,9 +2,11 @@
title: Authentication Diagrams
---
-```mermaid
+### Username and Password Authorization Flow
+![Username and Password Authorization Flow](../../../../static/img/backend/username-and-password-authorization-flow.png)
+
+```
sequenceDiagram
- title: Username and Password Authorization Flow
participant User
participant App
participant Server
@@ -14,9 +16,11 @@ sequenceDiagram
App-->>User: Display auth result
```
-```mermaid
+### Biometrics Flow for Username and Password Initial Login
+![Biometrics Flow for Username and Password Initial Login](../../../../static/img/backend/biometrics-flow-for-username-and-password-initial-login.png)
+
+```
sequenceDiagram
- title: Biometrics Flow for Username and Password Initial Login
participant User
participant Keychain
participant App
@@ -30,9 +34,10 @@ sequenceDiagram
App-->>User: Display auth result
```
-```mermaid
+### Biometrics Flow for Username and Password Subsequent Login
+![Biometrics Flow for Username and Password Subsequent Login](../../../../static/img/backend/biometrics-flow-for-username-and-password-subsequent-login.png)
+```
sequenceDiagram
- title: Biometrics Flow for Username and Password Subsequent Login
participant User
participant Keychain
participant App
@@ -48,25 +53,26 @@ sequenceDiagram
App-->>User: Display auth result
```
-```mermaid
+### VA: Health and Benefits Biometrics Initial Login
+![Health and Benefits Biometrics Initial Login](../../../../static/img/backend/health-and-benefits-biometrics-initial-login.png)
+```
sequenceDiagram
- title: VA: Health and Benefits Biometrics Initial Login
participant User
participant Secure App Storage
participant App
- participant IAM
+ participant SIS
participant Identity Provider
User->>App: Tap Login button
- App->>IAM: Start the sign in process
- IAM->>User: Which Identity Provider do you want?
- User-->>IAM: This one please.
- IAM-->>Identity Provider: Please authenticate this person at IAL2/AAL2/LOA3
+ App->>SIS: Start the sign in process
+ SIS->>User: Which Identity Provider do you want?
+ User-->>SIS: This one please.
+ SIS-->>Identity Provider: Please authenticate this person at IAL2/AAL2/LOA3
Identity Provider->>User: Please send your username and password
User-->>Identity Provider: Here they are
- Identity Provider-->>IAM: It's them, I'm sure of it
- IAM-->>App: Here is a code to get your tokens
- App->>IAM: Please create a token and session for me
- IAM-->>App: Done and done! Here is the token
+ Identity Provider-->>SIS: It's them, I'm sure of it
+ SIS-->>App: Here is a code to get your tokens
+ App->>SIS: Please create a token and session for me
+ SIS-->>App: Done and done! Here is the token
App->>User: Do you want to use biometrics to log in?
User-->>App: Yes please!
App->>Secure App Storage: Please hang on to this for us and lock it with biometrics
@@ -74,20 +80,23 @@ sequenceDiagram
App-->>User: Display Auth Result
```
-```mermaid
+### VA: Health and Benefits Biometrics Subsequent Login
+![Health and Benefits Biometrics Subsequent Login](../../../../static/img/backend/health-and-benefits-biometrics-subsequent-login.png)
+```
sequenceDiagram
- title: VA: Health and Benefits Biometrics Subsequent Login
participant User
participant Secure App Storage
participant App
- participant IAM
+ participant SIS
App->>Secure App Storage: Is there a stored token?
Secure App Storage-->>App: Yes there is
App->>User: Can I please have your biometrics?
User-->>App: Here you go!
App->>Secure App Storage: Here are the biometrics, can you send the token to me?
Secure App Storage-->>App: Here it is!
- App->>IAM: Can I get a refreshed token, please? Here is the old one.
- IAM-->>App: Here you go, one new token.
+ App->>SIS: Can I get a refreshed token, please? Here is the old one.
+ SIS-->>App: Here you go, one new token.
App-->>User: Display Auth Result
```
+
+In order to regenerate these graphs, add 'mermaid' to the end of the \`\`\` at the beginning of each codeblock
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Endpoint Creation Checklist.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Endpoint Creation Checklist.md
index 82fcd132721..02bb817cf6b 100644
--- a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Endpoint Creation Checklist.md
+++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Endpoint Creation Checklist.md
@@ -42,7 +42,7 @@ title: Endpoint Creation Checklist
$ref: '#/components/responses/504'
```
-Regenerated HTML file by running `generate_static_docs.sh` command (`modules/mobile/docs/generate_static_docs.sh`)
+Regenerated [OpenAPI documentation](./OpenAPIDocumentation.md) HTML file by running `modules/mobile/docs/generate_static_docs.sh`
### Monitoring
diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ErrorHandling.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ErrorHandling.md
index 2cb495de19f..5cabc0971b6 100644
--- a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ErrorHandling.md
+++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ErrorHandling.md
@@ -12,7 +12,7 @@ The vets-api mobile endpoints generally follow the following pattern:
- the controller then uses [service objects](#outbound-request-service-objects) to communicate with other servers in the vets-api ecosystem. those service objects may perform their own validations. These will generally be the same as the ones performed in the controller but may occasionally differ.
- the external service processes that request and responds or times out
- the service object processes the response.
-- when the request fails (status is >= 400), the service objects will raise corresponding errors. These errors are rescued by [ExceptionHandling](#exception-handling) and responds with error details to the client.
+- when the request fails (status is >= 400), the service objects will raise corresponding errors. These errors are rescued by [ExceptionHandling](#exception-handling) and responds with error details to the client. (Note: this is only true if the service configuration uses the Faraday plug `faraday.use Faraday::Response::RaiseError`. Most services that make requests for data do use this plug.)
- when the request is successful (status is < 400), any additional business logic will be applied by the service object. This often includes parsing and converting the data to models.
- the data is then returned to the controller.
- the controller then performs any additional modifications that are necessary, serializes the data, and returns it to the client with an appropriate status code.
diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ModelsAndSerializers.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ModelsAndSerializers.md
new file mode 100644
index 00000000000..7d99e7782ae
--- /dev/null
+++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ModelsAndSerializers.md
@@ -0,0 +1,31 @@
+# Models
+
+Unlike a typical Rails app, most of the models in the mobile module do not use ActiveRecord. Most of our models are populated from upstream data sources, so there's no need to store the data in a local database, which makes them a bad fit for ActiveRecord. As a result, most vets-api models inherit from `Dry::Struct` instead of `ActiveRecord::Base` to represent data. Dry structs use [`Dry::Types`](https://dry-rb.org/gems/dry-types) to validate attribute data types.
+
+
+## Serializers
+
+Mobile serializers use `JSONAPI::Serializer` and they do two things:
+- ensure that our responses are formatted as valid [JSONAPI](./JSONAPI.md)
+- determine which attributes from the model are included in the response
+
+## Best Practice
+
+- all data should be converted to models in order to use type validation
+- all nested attributes should be fully detailed within the data model in order to whitelist and validate all attributes that will be serialized. In other words, if a model has an attribute that is a hash or an array of hashes, all attributes in the hash should also be validated with `Dry::Types`. For example, a hash could look like:
+```
+ attribute :debt_history do
+ attribute :date, Types::Date
+ attribute :letter_code, Types::String
+ attribute :description, Types::String
+ end
+```
+an array of hashes could look like:
+```
+ attribute :debt_history, Types::Array do
+ attribute :date, Types::Date
+ attribute :letter_code, Types::String
+ attribute :description, Types::String
+ end
+```
+- all data should be serialized to ensure JSONAPI compliance
diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/OpenAPIDocumentation.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/OpenAPIDocumentation.md
new file mode 100644
index 00000000000..8e9fb27134d
--- /dev/null
+++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/OpenAPIDocumentation.md
@@ -0,0 +1,27 @@
+# OpenAPI Documentation
+
+## OpenAPI Creation and Artifact Generation
+
+We document our API endpoints using [OpenAPI3](https://swagger.io/specification/). The documentation is recorded in a group of yaml files, which are converted to [HTML](../API/index.md) and JSON via the `modules/mobile/docs/generate_static_docs.sh` script. Developers must run that script each time they change the yaml to ensure that our documentation is up to date.
+
+## Setup
+
+Developers will need to install [redocly](https://redocly.com/docs/cli/installation#install-globally) in order to run the `generate_static_docs` script.
+
+## Using OpenAPI in RSpec
+
+The backend team uses the [committee-rails gem](https://github.com/willnet/committee-rails) to tie our documentation and specs together. This gem should be used in request specs to validate requests and responses against the JSON file generated by the `generate_static_docs` script. To add it to a request spec, simply call the method `assert_schema_conform(expected_status)`. This will use the uri path from the `request` object and the expected status (e.g., 200) to look up which schema the response should match and validate the `response.body` against it.
+
+## Limitations
+
+Our schema tests are only as good as the data we're testing against. These tests run against VCR cassettes we've either recorded or been given. These cassettes will not necessarily cover all cases. It's also possible for cassettes to become out of date, which can cause drift between our specs/OpenAPI documentation and reality.
+
+Schema tests are also only as good as the schema they're testing against. Schema should be written as strictly as possible. That means indicating when properties are required or nullable, when additional properties are not permitted in objects, indicating string formats, and specifying which strings are possible via the enum type. Greater specificity results in better documentation.
+
+## Best Practices
+
+- use [models and serializers](./ModelsAndSerializers.md) to lock down the schema
+- use all VCR cassettes available to ensure broad test coverage
+- only validate the schema once per unique case. In other words, if you need to run several tests with the same data setup and you expect the same response each time, there's no need to validate the schema each time.
+- use `nullable: true` when you know an attribute may be null. This should also be reflected in the model.
+- use `additionalProperties: false` on all objects. Additional properties should be prevented by the model and serializer.
diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Iam.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/sis.md
similarity index 83%
rename from VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Iam.md
rename to VAMobile/documentation/docs/Engineering/BackEnd/Architecture/sis.md
index 0dc89356d4f..ea8e501d8bf 100644
--- a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Iam.md
+++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/sis.md
@@ -1,14 +1,8 @@
---
-title: IAM
+title: SIS
---
-
-## Authentication Sequence Diagram
-
-![IAM sequence diagram](../../../../static/img/backend/iam-authentication-sequence-diagram.png)
-
-## Vets-API Authentication Activity Diagram
-
-![API authentication diagram](../../../../static/img/backend/vets-api-authentication-activity-diagram.png)
+For more info on how SIS works after mobile passes to them, you can view their [docs](https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/identity/Products/Sign-In%20Service/Engineering%20Docs/Authentication%20Types/Client%20Auth%20(User)/auth_flows/api_oauth.md
+) directly.
## Provider Details
diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Testing/ApiTokens.md b/VAMobile/documentation/docs/Engineering/BackEnd/Testing/ApiTokens.md
index 491de63b6f4..cbdaf932402 100644
--- a/VAMobile/documentation/docs/Engineering/BackEnd/Testing/ApiTokens.md
+++ b/VAMobile/documentation/docs/Engineering/BackEnd/Testing/ApiTokens.md
@@ -4,11 +4,11 @@ title: API Tokens
## Authorization and token types
-The mobile app currently uses two authorization services: IAM and SIS (short for Sign-In Service). IAM is a third party service and SIS is an in-house VA auth service. We expect to eventually sunset IAM in favor of SIS.
+The mobile app currently SIS tokens (short for Sign-In Service). SIS is an in-house VA auth service.
-The tokens are visually distinct: IAM tokens are 20 characters long, while SIS tokens are over a thousand characters long.
+SIS tokens are over a thousand characters long.
-The one important functional difference is that you have to include an additional header when using SIS tokens: `Authentication-Method: SIS`
+You have to include an additional header when using SIS tokens: `Authentication-Method: SIS`
## Fetching API tokens
@@ -16,13 +16,7 @@ We host a web app on heroku for fetching api tokens. You can fetch tokens in two
1. Manual: Go to the [token generator web app](https://va-mobile-cutter.herokuapp.com) and log in with a test user. User credentials are in 1Password.
-2. Automated: These requests use basic auth (ask teammates for username and password) and will only work if the test user has previously been logged in via the manual approach and the user's refresh token is still valid. There are routes for fetching IAM tokens:
-
-```bash
-GET https://va-mobile-cutter.herokuapp.com/auth/iam/token/judy.morrison@id.me
-```
-
-And SIS tokens:
+2. Automated: These requests use basic auth (ask teammates for username and password) and will only work if the test user has previously been logged in via the manual approach and the user's refresh token is still valid. The route for fetching SIS tokens is:
```bash
GET https://va-mobile-cutter.herokuapp.com/auth/sis/token/judy.morrison@id.me
diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Testing/StagingInstances.md b/VAMobile/documentation/docs/Engineering/BackEnd/Testing/StagingInstances.md
index 865fe4a202b..a0e34dc2d2d 100644
--- a/VAMobile/documentation/docs/Engineering/BackEnd/Testing/StagingInstances.md
+++ b/VAMobile/documentation/docs/Engineering/BackEnd/Testing/StagingInstances.md
@@ -25,13 +25,7 @@ You'll see "TERMINAL" as a tab. From here, you have access to the console. You c
### User Sign In
-You can then fetch an [api token](ApiTokens.md#fetching-api-tokens) and use that token to create either an IAM user session (deprecated):
-
-```ruby
-irb(main):001:0> user = IAMSSOeOAuth::SessionManager.new('EESBp0xiLD6p1g86q4g1').find_or_create_user
-```
-
-or an SIS user session:
+You can then fetch an [api token](ApiTokens.md#fetching-api-tokens) and use that token to create a SIS user session:
```ruby
irb(main):001:0> token = SignIn::AccessTokenJwtDecoder.new(access_token_jwt: 'crazylongsistoken').perform(with_validation: true)
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/AccessibilityInformation.md b/VAMobile/documentation/docs/Engineering/FrontEnd/AccessibilityInformation.md
index 2fa5f065108..56f30fc48f7 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/AccessibilityInformation.md
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/AccessibilityInformation.md
@@ -1,6 +1,5 @@
---
title: Accessibility Information
-sidebar_position: 1
---
# Accessibility Information
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/_category_.json
index 88392073f6d..9220f69134b 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/_category_.json
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/_category_.json
@@ -1,5 +1,3 @@
{
- "label": "Custom Hooks",
- "position": 3
+ "label": "Custom Hooks"
}
-
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DebuggingToolsInstructions.md b/VAMobile/documentation/docs/Engineering/FrontEnd/DebuggingToolsInstructions.md
index 3dabc1546df..292df26f202 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/DebuggingToolsInstructions.md
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DebuggingToolsInstructions.md
@@ -1,6 +1,5 @@
---
title: Debugging Tools
-sidebar_position: 4
---
# Debugging Instructions
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/_category_.json
new file mode 100644
index 00000000000..23d45f0e887
--- /dev/null
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/_category_.json
@@ -0,0 +1,3 @@
+{
+ "label": "Demo Mode"
+}
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/index.md b/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/index.md
new file mode 100644
index 00000000000..e76af4edfb4
--- /dev/null
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/index.md
@@ -0,0 +1,63 @@
+---
+title: Accessing Demo Mode
+---
+
+## Purpose
+
+* The VA Health and Benefit App’s Demo Mode mode provides a safe and non-productionalized environment for users to interact and engage with the app’s navigation, functionality, features, and designs.
+* Demo mode is set up with a single user that is not tied to any production test account and allow users to access all of the app’s latest offerings. Users can complete actions such as submitting a secure message or a prescription refill to experience the entire user journey without impacting other systems or teams.
+* Demo users should use the latest version of the app in order to experience the latest version of demo mode. Work in progress items that the VA Health and Benefits App Team is working on will not appear in demo mode until it is released into production.
+* Google Play store uses demo access to perform their testing; if unable to access they will decline the release
+
+## Steps to Access Demo Mode
+
+ 1. Download or update existing app to the latest version (any device)
+ 2. [Apple App Store Link](https://apps.apple.com/us/app/va-health-and-benefits/id1559609596)
+ 3. [Google Play Store Link](https://play.google.com/store/apps/details?id=gov.va.mobileapp&hl=en_US&gl=US)
+ 4. Open the app
+ 5. Tap the VA Logo 7 times
+ 6. Enter the Password (`Zhuzh-it`) and click demo button
+ 7. Screen is updated with a Demo Mode bar on the home screen
+ 8. Click the Sign In button
+ 9. Demo user is now at the home page of the mobile app and can explore
+
+## Steps to Access Demo Mode with a Screenreader
+
+ 1. Download or update the VA: Health and Benefits app to the latest version (version 2.37.0 or later) and open the app.
+ * [Apple App Store Link](https://apps.apple.com/us/app/va-health-and-benefits/id1559609596)
+ * [Google Play Store Link](https://play.google.com/store/apps/details?id=gov.va.mobileapp&hl=en_US&gl=US)
+ 2. Swipe past the Veterans Crisis Line link to the VA logo (it will come immediately after the Crisis Line link and before the "sign in" button).
+ * With VoiceOver (iOS), it will announce as "Department of Veterans Affairs logo, image, VA U.S. Department of Veterans Affairs".
+ * With Talkback (Android), it will announce as "Department of Veterans Affairs logo, image".
+ 3. Double-tap the VA logo image 7 times (14 times total).
+ 4. A modal window will appear to enter a password and focus will be on the input field.
+ * With VoiceOver (iOS), it will announce "Text field is editing, word mode, insertion point at start".
+ * With Talkback (Android), it will announce "Enter password, edit box".
+ 5. Enter the password (`Zhuzh-it`) into the text field.
+ 6. After entering the password, swipe to the "demo" button and double tap.
+ 7. After tapping the demo button, the login screen will update. The focus should shift back to the Veterans Crisis Line link, but depending on your phone's version, it might take you lower on the screen. If you have successfully activated demo mode, there will be an alert box that says "Demo mode, heading" directly below / after the Veterans Crisis Line link. Swipe past that and down to the "sign in" button.
+ 8. Double-tap the "sign in" button to login with demo mode.
+
+## Troubleshooting
+
+### Demo Mode’s password is not working
+
+* Case sensitive and space sensitive - review password entered
+* Mobile app may need to be updated - update the app
+* Demo password has changed, contact the mobile team in slack ([#va-mobile-app](https://dsva.slack.com/archives/C018V2JCWRJ))
+
+### A new feature does not appear in Demo Mode
+
+* If the new feature has not yet been released to production, it will not appear in demo mode
+* If the new feature is released to veterans in production, try the following:
+ * Download the latest version of VA Health and Benefits App
+ * Open the app and log into Demo
+ * Hard close the app (app switcher then swipe to close it)
+ * Open it again
+ * If it's still not there, data may be cached
+ * Log into demo mode
+ * Go to Settings -> Developer Screen -> Click the Remote Config button
+ * Scroll down to the Override Toggle section
+ * Tap the relevant feature toggle to on
+ * Click Apply Overrides
+ * Log back into Demo Mode
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DevSetupProcess.md b/VAMobile/documentation/docs/Engineering/FrontEnd/DevSetupProcess.md
index 47a28871dfd..8814dbc8848 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/DevSetupProcess.md
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DevSetupProcess.md
@@ -1,6 +1,5 @@
---
title: Development Setup Process
-sidebar_position: 5
---
# Development setup instructions
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DowntimeMessages.md b/VAMobile/documentation/docs/Engineering/FrontEnd/DowntimeMessages.md
index 4a3e07a03b8..e97783253f2 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/DowntimeMessages.md
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DowntimeMessages.md
@@ -1,6 +1,5 @@
---
title: Downtime Messages
-sidebar_position: 6
---
# Downtime Messages
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/PushNotifications/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/PushNotifications/_category_.json
index c51b88a0268..89dda607cf2 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/PushNotifications/_category_.json
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/PushNotifications/_category_.json
@@ -1,5 +1,3 @@
{
- "label": "Push Notifications",
- "position": 7
+ "label": "Push Notifications"
}
-
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Overview/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Overview/_category_.json
index 2e25bd9b246..0a00d901f0c 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Overview/_category_.json
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Overview/_category_.json
@@ -1,4 +1,3 @@
{
- "label": "Overview",
- "position": 1
-}
\ No newline at end of file
+ "label": "Overview"
+}
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Tutorials/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Tutorials/_category_.json
index b9ad330445a..4c518b6f1da 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Tutorials/_category_.json
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Tutorials/_category_.json
@@ -1,4 +1,3 @@
{
- "label": "Redux Toolkit Tutorials",
- "position": 2
-}
\ No newline at end of file
+ "label": "Redux Toolkit Tutorials"
+}
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/_category_.json
index d4b4162c8e3..a083de1496f 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/_category_.json
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/_category_.json
@@ -1,4 +1,3 @@
{
- "label": "Redux Toolkit",
- "position": 10
-}
\ No newline at end of file
+ "label": "Redux Toolkit"
+}
diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/SingleSignOn.md b/VAMobile/documentation/docs/Engineering/FrontEnd/SingleSignOn.md
index ecd00656881..725cda916ea 100644
--- a/VAMobile/documentation/docs/Engineering/FrontEnd/SingleSignOn.md
+++ b/VAMobile/documentation/docs/Engineering/FrontEnd/SingleSignOn.md
@@ -40,4 +40,4 @@ This will open the WebView screen with an SSO session, allowing the user to acce
## API documentation
-For more information on API usage for SSO, view the [Device SSO Token Exchange]() documentation.
+For more information on API usage for SSO, view the [Device SSO Token Exchange](https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/identity/Products/Sign-In%20Service/Engineering%20Docs/Authentication%20Types/Client%20Auth%20(User)/auth_flows/device_sso_token_exchange.md) documentation.
diff --git a/VAMobile/documentation/docs/Engineering/_category_.json b/VAMobile/documentation/docs/Engineering/_category_.json
index 2fc5457c048..37dd203f884 100644
--- a/VAMobile/documentation/docs/Engineering/_category_.json
+++ b/VAMobile/documentation/docs/Engineering/_category_.json
@@ -1,4 +1,4 @@
{
"label": "Engineering",
- "position": 4
+ "position": 5
}
diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md
index d94caed3fde..0c37b670ecc 100644
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md
+++ b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md
@@ -1,12 +1,10 @@
import { ReactComponent as Add} from '@componentsDocs/VAIcon/svgs/Add.svg';
import { ReactComponent as Building} from '@componentsDocs/VAIcon/svgs/Building.svg';
-import { ReactComponent as Bullet} from '@componentsDocs/VAIcon/svgs/Bullet.svg';
import { ReactComponent as CheckMark} from '@componentsDocs/VAIcon/svgs/CheckMark.svg';
import { ReactComponent as ChevronLeft} from '@componentsDocs/VAIcon/svgs/ChevronLeft.svg';
import { ReactComponent as ChevronRight} from '@componentsDocs/VAIcon/svgs/ChevronRight.svg';
import { ReactComponent as CircleCheckMark} from '@componentsDocs/VAIcon/svgs/CircleCheckMark.svg';
import { ReactComponent as Compose} from '@componentsDocs/VAIcon/svgs/Compose.svg';
-import { ReactComponent as Ellipsis} from '@componentsDocs/VAIcon/svgs/Ellipsis.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';
@@ -18,9 +16,7 @@ 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 Sort} from '@componentsDocs/VAIcon/svgs/Sort.svg';
import { ReactComponent as Trash} from '@componentsDocs/VAIcon/svgs/Trash.svg';
-import { ReactComponent as Truck} from '@componentsDocs/VAIcon/svgs/Truck.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'
@@ -35,13 +31,11 @@ Name | Icon | File Location
:---: | :---: | :---:
Add | | Add.svg
Building | | Building.svg
-Bullet | | Bullet.svg
Check Mark | | CheckMark.svg
Check Mark in Circle | | CircleCheckMark.svg
Chevron Left | | ChevronLeft.svg
Chevron Right | | ChevronRight.svg
Compose | | Compose.svg
-Ellipsis | | Ellipsis.svg
Exclamation Triangle | | ExclamationTriangle.svg
External Link | | ExternalLink.svg
Folder | | Folder.svg
@@ -53,8 +47,6 @@ Phone | | Phone.svg
Question Mark | | QuestionMark.svg
Remove | | Remove.svg
Reply | | Reply.svg
-Sort | | Sort.svg
Trash | | Trash.svg
-Truck | | Truck.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/navIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/navIcons.md
deleted file mode 100644
index 7ffde766175..00000000000
--- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/navIcons.md
+++ /dev/null
@@ -1,28 +0,0 @@
-import { ReactComponent as BenefitsSelected} from '@componentsDocs/VAIcon/svgs/navIcon/BenefitsSelected.svg';
-import { ReactComponent as BenefitsUnselected} from '@componentsDocs/VAIcon/svgs/navIcon/BenefitsUnselected.svg';
-import { ReactComponent as HealthSelected} from '@componentsDocs/VAIcon/svgs/navIcon/HealthSelected.svg';
-import { ReactComponent as HealthUnselected} from '@componentsDocs/VAIcon/svgs/navIcon/HealthUnselected.svg';
-import { ReactComponent as HomeSelected} from '@componentsDocs/VAIcon/svgs/navIcon/HomeSelected.svg';
-import { ReactComponent as HomeUnselected} from '@componentsDocs/VAIcon/svgs/navIcon/HomeUnselected.svg';
-import { ReactComponent as PaymentsSelected} from '@componentsDocs/VAIcon/svgs/navIcon/PaymentsSelected.svg';
-import { ReactComponent as PaymentsUnselected} from '@componentsDocs/VAIcon/svgs/navIcon/PaymentsUnselected.svg';
-import { ReactComponent as ProfileSelected} from '@componentsDocs/VAIcon/svgs/navIcon/ProfileSelected.svg';
-import IconsPathSection from '@site/src/components/IconsPathSection'
-
-# Navigation
-
-:::info
-
-:::
-
-Name | Icon | File Name
-:---: | :---: | :---:
-Benefits Selected | | BenefitsSelected.svg
-Benefits Unselected | | BenefitsUnselected.svg
-Health Selected | | HealthSelected.svg
-Health Unselected | | HealthUnselected.svg
-Home Selected | | HomeSelected.svg
-Home Unselected | | HomeUnselected.svg
-Payments Selected | | PaymentsSelected.svg
-Payments Unselected | | PaymentsUnselected.svg
-Profile Selected | | ProfileSelected.svg
diff --git a/VAMobile/documentation/docs/Flagship design library/Templates/Home.md b/VAMobile/documentation/docs/Flagship design library/Templates/Home.md
new file mode 100644
index 00000000000..6f92d6acb06
--- /dev/null
+++ b/VAMobile/documentation/docs/Flagship design library/Templates/Home.md
@@ -0,0 +1,107 @@
+---
+title: Home Screen
+sidebar_position: 4
+---
+
+The Home screen is the initial/default screen of the VA Health & Benefits mobile app. It sits at the top level of the hierarchical navigation (as a peer to the Health, Benefits and Payments category screens) and displays a personalized summary of a Veteran's current tasks and interactions with features in the VA mobile app. It also contains the primary entry point for the Veteran's Profile information (including App Settings).
+
+
+
+
+## Anatomy:
+
+The VA mobile app’s personalized home screen combines content that is variable, fixed, personalized, and evergreen to deliver an experience that surfaces value to Veterans and supports understanding of the app’s capabilities, regardless of what a Veteran’s interactions are with the VA. To do this in a way that's predictable and performant, the Home screen displays a mix of content types within predetermined locations (zones).
+
+Having a mix of content, arranged into intentional zones, ensures that users:
+
+* Always see elements that help demonstrate the current & future value of the app
+* Always see "personalized" information even if they don't have any active tasks at a given moment (users don’t experience an empty home screen in the absence of tasks)
+* See the things that are likely relevant and valuable to them first
+* Get a consistent information structure for screen readers to tab through that is present even if load times lag
+* See things that are important to proper app functioning when necessary
+
+
+### Zones
+
+The VA Mobile app Home screen zones ensure that the most impactful content items are getting the proper placement in the screen's hierarchy while also handling a variety of user contexts and technical situations.
+
+
+
+
+#### Zone 1: Mission-critical app info
+
+* **What it is:** Area for alerts and announcements from the app. It informs users when there’s something they need to do to ensure that the app is functioning and informs users of new features
+ * **Module appearance logic:** Variable & optional, can be personalized or universal: Modules appear to all users when in applicable situations. Otherwise, do not show.
+* **What lives in this zone:**
+ * [Encouraged update](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/App%20Features/EncouragedUpdate/) (MVP)
+ * [What’s new](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/App%20Features/WhatsNew/) (MVP)
+* **Guidelines for future module inclusion:**
+Information is appropriate for inclusion on the home screen within the mission-critical app info section when it:
+ * Conveys information that’s necessary for the app to function properly
+ * Conveys information about important changes within the app
+
+
+#### Zone 2: Activity
+
+* **What it is:** An alphabetical list of feature modules giving Veterans an overview of what VA is doing for them—includes any critical “in-flight” tasks or actions that may need attention. Each module contains personalized information briefly summarizing that activity and provides a secondary entry point into the app feature.
+ * **Module appearance logic:** Variable. Modules appear while that feature’s activity is still considered “in flight” or when there is a user action to take. Each feature has different periods of time/circumstances that determine how long they are visible on the home screen (ex: the Claims module stays until the claim closes, the Secure Message stays until any new messages have been viewed).
+ * **Module anatomy**
+ * **Title:** Feature name
+ * **Description text:** Indicates # of items with an in-flight status; terms used vary by feature; provides just enough information to accurately indicate what is happening/is needed.
+* **What lives in this zone:**
+ * Prescriptions (MVP)
+ * Appointments (MVP)
+ * Messages (MVP)
+ * Claims (MVP)
+ * Debts *(future)*
+ * Letters & documents *(future)*
+ * Payments *(future)*
+ * Vaccine/medical records *(future)*
+ * Travel pay *(future)*
+* **Guidelines for module inclusion:**
+A feature is appropriate for inclusion as an Activity module on the home screen when it:
+ * Has an “in-flight” status (ex: an open Claim, an upcoming Appointment)
+ * Has an action that is available for the user to take (ex: a refillable Prescription, an unread Message)
+
+
+#### Zone 3: About you:
+
+* **What it is:** A personalized, high-level snapshot of the individual Veteran at VA.
+ * **Module appearance logic:** Fixed appearance.
+* **What lives in this zone:**
+ * Branch of Service/Veteran Status card (MVP)
+ * Disability rating & monthly payment (MVP)
+* **Guidelines for module inclusion:**
+Information is appropriate for inclusion on the home screen within About you when it:
+ * **Is** or **provides access** to information relating to who the individual Veterans *is within VA* as opposed to relating to a specific activity or task
+ * Contains high-level data about the individual Veteran that changes infrequently
+
+
+#### Zone 4: VA resources:
+
+* **What it is:** Links to support/tools that are of universal interest to Veterans and a space for announcements from VA.
+ * **Module appearance logic:** Fixed appearance
+* **What lives in this zone:**
+ * Contact us (MVP)
+ * Find a VA Location (MVP)
+ * Banner space for VA announcements (MVP)
+ * Banner appearance is optional—use when needed.
+ * Display one banner at a time.
+ * Banner announcements should be of interest to all Veterans, and timely.
+* **Guidelines for module inclusion:**
+Information is appropriate for inclusion on the home screen within the VA resources section when it:
+ * Is a tool or information that is relevant to a general audience, and
+ * It does not fit within the Benefits, Health or Payment categories.
+
+
+### Screen Template
+The Home screen uses the [Category screen template](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/Flagship%20design%20library/Templates/ScreenTypes#category-landing-screen).
+
+
+### Resources
+* [Figma file: Home screen 2.0 Shipped File](https://www.figma.com/design/ddMWiCQCfmUKFhMcYG9fYv/Home-2.0---%F0%9F%9A%A2-Shipped---VA-Mobile?m=auto&node-id=1410-20598&t=a610026nBu9afD1A-1) (includes happy path as well as design for loading states, errors, and alternate statuses)
+* Mural: [Home screen 2.0 Appearance logic for error handling and edge cases](https://app.mural.co/t/adhoccorporateworkspace2583/m/adhoccorporateworkspace2583/1704381519703/cd6d78c5824a5fb0cc8b26597f0ad271072df8f2?wid=0-1705962128474)
+
+### Design Principles
+TBD (discussion of the role of surface and elevation in the home screen’s design)
+
diff --git a/VAMobile/documentation/docs/Flagship design library/Templates/ScreenTypes.md b/VAMobile/documentation/docs/Flagship design library/Templates/ScreenTypes.md
index 07948e4ddf5..0b50b46062e 100644
--- a/VAMobile/documentation/docs/Flagship design library/Templates/ScreenTypes.md
+++ b/VAMobile/documentation/docs/Flagship design library/Templates/ScreenTypes.md
@@ -16,26 +16,10 @@ The VA mobile app has 5 main screen types that fall into two categories:
## Hierarchical screens
-### Home screen
-
-
-* **Definition:** The Home screen is the initial/default screen of the app. It sits at the top level of the hierarchical navigation and summarizes a Veteran's interactions with the VA mobile app. It also provides access to the Veteran's profile information.
-
- The Home screen contains several zones of variable and fixed content:
- - **Activity:** Personalized modules that summarize "in-flight" activities and provide a secondary entry point to app features (variable appearance).
- - **About you:** Personalized high-level data, including the Veteran Status card (fixed appearance).
- - **VA resources:** General interest/evergreen links to VA tools as well as a banner space for announcements (fixed appearance).
-
- The Home screen displays the tab bar and a link to the Veteran Crisis line. It does not display a back button.
-- **Screen transition:** Screen transition between home and categories is top-level peer (fade through).
-- **Scroll behavior:** Content scrolls if it exceeds the panel height.
-- **Resources:**
- - [Figma file: Home screen template](https://www.figma.com/design/cdp7Be4UdYesq9fXeqaOgt/Navigation-2.0-Screen-Templates---%F0%9F%9A%A2-Shipped---VA-Mobile?node-id=7733-11182&t=GsZrpZDn1qDXDTr0-4)
-
### Category landing screen
-- **Definition:** Category screens sit at the top level of the hierarchical navigation (and are peers to the Home screen), grouping features of a similar type. Each category screen contains permanent entry points to features and variable description text when applicable. Features are grouped into subsections if the number of features in a category exceeds 6. Displays the tab bar and a link to the Veteran Crisis line. It does not display a back button.
+- **Definition:** The Category landing screen template is used by the navigation categories at the top of the app's hierarchy: Health, Benefits, and Payments. These navigation category landing screens group features of a similar type, providing permanent entry points to features and variable description text for each feature when applicable. The app's Home screen also uses this template, but has a special set of rules that distinguish it from the other top-level categories ([see Home Screen for a more detailed description](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/Flagship%20design%20library/Templates/Home)). The category landing screen template displays the tab bar and a link to the Veteran Crisis line. It does not display a back button.
- **Screen transition:** Screen transition between categories is top-level peer (fade through).
- **Scroll behavior:** Content scrolls if it exceeds the panel height.
- Screen title scroll behavior:
@@ -49,7 +33,7 @@ The VA mobile app has 5 main screen types that fall into two categories:
### Feature landing screen
-- **Definition:** The “home” screen of a feature. Features are parent sections with multiple children that generally live within a category. A complex feature (like pharmacy or secure messaging) can also have subsections. Displays the tab bar and a descriptive back button.
+- **Definition:** The “home” screen of a feature. Features are parent sections with multiple children that generally live within a category. A complex feature (like Prescriptions or Messages) can also have subsections. Displays the tab bar and a descriptive back button.
- **Screen transition:** Horizontal (pushing on & off from right).
- **Scroll behavior:** Content scrolls if it exceeds the panel height.
- Screen title scroll behavior:
diff --git a/VAMobile/documentation/docs/Flagship design library/Templates/image.png b/VAMobile/documentation/docs/Flagship design library/Templates/image.png
new file mode 100644
index 00000000000..fbcf1e907af
Binary files /dev/null and b/VAMobile/documentation/docs/Flagship design library/Templates/image.png differ
diff --git a/VAMobile/documentation/docs/Flagship design library/_category_.json b/VAMobile/documentation/docs/Flagship design library/_category_.json
index d4b4c000bbc..2a54e555dfd 100644
--- a/VAMobile/documentation/docs/Flagship design library/_category_.json
+++ b/VAMobile/documentation/docs/Flagship design library/_category_.json
@@ -1,4 +1,4 @@
{
"label": "Flagship design library",
- "position": 2
+ "position": 3
}
diff --git a/VAMobile/documentation/docs/Operations/_category_.json b/VAMobile/documentation/docs/Operations/_category_.json
index 16fb9d4ac89..05d3ec5b360 100644
--- a/VAMobile/documentation/docs/Operations/_category_.json
+++ b/VAMobile/documentation/docs/Operations/_category_.json
@@ -1,4 +1,4 @@
{
"label": "Operations",
- "position": 6
+ "position": 8
}
diff --git a/VAMobile/documentation/docs/Product/_category_.json b/VAMobile/documentation/docs/Product/_category_.json
index 6b2c3ee3e58..b1badb0e9b3 100644
--- a/VAMobile/documentation/docs/Product/_category_.json
+++ b/VAMobile/documentation/docs/Product/_category_.json
@@ -1,4 +1,4 @@
{
"label": "Product",
- "position": 3
+ "position": 4
}
diff --git a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-content-designers.md b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-content-designers.md
index 43144997840..ade5873fe9e 100644
--- a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-content-designers.md
+++ b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-content-designers.md
@@ -4,7 +4,9 @@ title: Checklist for content designers
# Accessibility checklist for content designers
-*Last update: April 23, 2024*
+*Last update: October 28, 2024*
+
+The following accessibility guidelines include guidance from both [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/) and [Mobile Content Accessibility Guidelines (MCAG)](https://getevinced.github.io/mcag/). Since the majority of the list is made up of WCAG guidance, we have included an indicator of "(MCAG)" whenever the guidance comes from MCAG.
## **Code quality**
Good quality code is resilient which makes it compatible with a wider range of browsers and assistive technologies.
@@ -26,7 +28,7 @@ Structuring content helps people group information and work out what's important
### **Headings should communicate content hierarchy.**
- Introduce each content section with a heading.
- Use heading levels to reflect a logical content hierarchy.
-- Begin the main body content with a heading level 1 that describes the page. Only one H1 should be used per screen and should make it clear to a user what information will be found on that screen.
+- Begin the main body content with a heading that describes the page. Only one primary (web equivalant to an H1) should be used per screen and should make it clear to a user what information will be found on that screen.
- Communicate the heading structure to developers, if it’s unclear.
### **Group related items as lists.**
@@ -40,12 +42,28 @@ Clear instructions for entering or fixing information will help a user complete
- Check that all required fields are visually identified.
- Check that each label makes the field’s purpose clear.
- Offer clear help text to help people enter information correctly.
+- Within a process that requires the user to enter the exact information more than one time after the user provides the data once, at least one of the following should be true:
+ - The fields are auto-populated, or
+ - The user can choose to auto-populate the fields
+ - Except when:
+ - The information is required to ensure the security of the content, or
+ - The previously entered information is no longer valid.
### **Messages should tell you what and how to fix an error.**
- Identify where mistakes are and describe the issue in language people will understand.
-- Offer suggestions for fixing an input error, where you can.
+- When there is an option for it, error messages include suggestions for revision, except when:
+ - The information may jeopardize the security or privacy of the user. (MCAG)
- Write error messages to be as specific as you can, rather than using generic messages.
- Avoid putting links inside error message text.
+- If a user input results in an error, the item in error should be clearly marked. (MCAG)
+- If a user input results in an error, the error is described by text. (MCAG)
+- Error messages should be located next to the item in error.
+
+### **Sensitive Transcations Error Prevention (MCAG)**
+- When users submit any action involving financial transactions, legal commitments, or authorization to access or change data owned by users, at least one of the following should be true:
+ - There is a mechanism that validates the user inputs and provides an option to correct errors, or
+ - The user can check and confirm the data before executing the transaction, or
+ - The submission is reversible.
## **Images**
@@ -95,7 +113,14 @@ Multimedia content can offer users an alternative to text. Everyone can watch or
## **Navigation**
Users want to navigate around the app easily. A user’s confidence in an app will build when they know where they are and that layouts are applied consistently.
- Provide a descriptive title for each page or view.
+ - The screen title should describe its' context. (MCAG)
+- Each screen title should be unique. (MCAG)
- Provide a unique name for common page regions that are used more than once on a page.
+- The order of elements on the screen should make sense and reflect the content hierarchy of the screen. (MCAG)
+
+### **Logical Content Grouping (MCAG)**
+Elements forming a single context unit should be grouped together so they are announced by assistive technologies as a single element.
+- When browsing through the screen with a screen reader or a similar assistive technology, ensure that elements that assemble a single context (i.e. a button, its' text, and its' icon **or** an image and its' caption) are announced as one unit and that each of its parts is not announced separately.
## **Sensory**
@@ -125,7 +150,34 @@ Text on web pages must be easy to read, see and scan. Accessible text makes the
### **Text should be easy to scan and read.**
- Avoid overusing text formatting, like underline, bold, italic and all caps.
- Left-align text. Avoid using right-align, center, or justified text.
+
+
+## **Unique Labels (MCAG)**
+- Interactive elements' labels and accessible names should be unique, except when elements have the exact functionality.
+
+
+## **Scaled Text Legibility (MCAG)**
+- Text blocks should not be written in all capital letters
+- Text blocks should not be written entirely in italics
+- Text blocks should not be written in lighter or thinner font weights. A minimum font weight of 400 is recommended.
+- Text blocks should not be set to have a justified alignment. All inter-word spacing should be even and consistent.
+- Text line lengths should not exceed 70 characters per row, including spaces, using the default font size / zoom settings.
+
+## **Predictability (MCAG)**
+- Users should remain in the same context (i.e. screen, modal, alerts) when they enter or update values in controls and form elements, except when:
+ - Users are informed about the context change up front.
+- No significant content or structure changes should occur when users enter or update values in controls and form elements, except when:
+ - The changes are due to filtering or sorting actions, and
+ - Users can predict the changes, and
+ - The location of the focus and assistive technologies in the UI is kept
+- Users should remain in the same context (i.e. screen, modal, alerts) when they shift the focus to any control or form element
+- No significant content or structure changes should occur when users shift the focus to any control or form element
+
+## **Consistent Help (MCAG)**
+- Help mechanisms and help center links should be visually located consistently across all screens.
+- Help mechanisms and help center links should be programmatically located consistently across all screens.
+- Help mechanisms and help center links should have the exact same identifying names across all screens.
---
diff --git a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers.md b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers.md
index cf0ee02e4ea..d812dc52ade 100644
--- a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers.md
+++ b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers.md
@@ -4,7 +4,9 @@ title: Checklist for UX designers
# Accessibility checklist for UX designers
-*Last update: April 23, 2024*
+*Last update: October 21, 2024*
+
+The following accessibility guidelines include guidance from both [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/) and [Mobile Content Accessibility Guidelines (MCAG)](https://getevinced.github.io/mcag/). Since the majority of the list is made up of WCAG guidance, we have included an indicator of "(MCAG)" whenever the guidance comes from MCAG.
## **Adaptable UI**
An adaptable user interface (UI) works for everyone. Someone’s screen size or text settings should never stop them from seeing and using anything.
@@ -35,22 +37,32 @@ A minimum contrast between two colors is necessary so that a user can perceive b
## **Target size**
When targets are small, it is difficult for users with hand tremors and those who have difficulty with fine motor movement to activate them accurately. Providing sufficient size, or sufficient spacing between targets, will reduce the likelihood of accidentally activating the wrong control.
-- Ensure that the size of the target for pointer inputs is at least 44 by 44 CSS pixels, except when:
+- Ensure that the size of the target for pointer inputs is at least 44 by 44 CSS pixels (or 7x7 millimeters), except when:
* The target does not overlap any other target and has a target offset of at least 44 CSS pixels to every adjacent target
* The interaction can be achieved through a different control on the same screen
* The target is in a sentence, or is in a bulleted or numbered list, or its’ size is otherwise constrained by the line-height of non-target text
+ * The target is a default user agent control and was not modified by the mobile app team (MCAG).
## **Content structure**
Structuring content helps people group information and work out what's important and what they need to read first. This structure must be shown visually and using code.
- Provide easily identifiable feedback (i.e. confirmation of a form submission, alerting the user when something goes wrong, notify the user of changes on the page, etc.). Instructions should be easy to identify.
-
-
-### **All tasks can be completed using only a keyboard.**
- Design headings that reflect a logical visual and semantic content hierarchy.
-- Ensure headings at the same level look similar across the app.
-- Note down intended heading levels for developers, if they’re unclear.
-
+- In a screen with multiple content sections (i.e. Prescription details), each section should have a heading.
+- Ensure headings at the same "level" look similar across the app.
+- Annotate intended headings for developers, if they are unclear.
+- Ensure that the order of the elements on the screen make sense and reflect the content hierarchy of the screen (MCAG).
+- Ensure that elements that assemble a single context (i.e. a heading and a single line of copy that should be read together) are announced by a screenreader as one unit and that each of the parts are not announced separately (MCAG).
+
+## **Spacing**
+Blocks of text (three lines or more in the body text font size without additional zoom) should have sufficient spacing between lines, words, and characters. Using typography and spacking tokens (see "Spacing tokens" below), each typography component will be pre-built into the library with the minimum spacing requirements.
+- Spaces between lines in text blocks are at least 0.9 times the font size and no more than 1.7 times the font size.
+- Spaces between paragraphs (with subsequent paragraphs) should be at least two times (double) that of the font size.
+- The font’s default inter-word spacing should not be changed.
+- The font’s default inter-letter spacing should not be changed.
+
+### **Spacing tokens**
+Typography tokens and various other components will be pre-built into the Flagship and Component libraries with the minimum required spacing tokens needed to follow accessibility best practices. While you can increase the amount of spacing used, you should never reduce it without consulting the accessibility specialist on the mobile app team. For full spacing token documentation, [see the design system](https://department-of-veterans-affairs.github.io/va-mobile-app/design/Foundation/Design%20tokens/Spacing).
## **Forms**
Clear instructions for entering or fixing information will help a user complete a form quickly and correctly the first time. Using autocomplete and giving someone a chance to review information helps reduce the amount of typing.
@@ -64,7 +76,9 @@ Clear instructions for entering or fixing information will help a user complete
### **Labels and error messages should be discernible.**
- Ensure form labels are visible at all times.
- Place error messages beneath the related form field.
-- Make error messages visible and noticeable using color, familiar icons, and text. Do not use color alone.
+- Make error messages visible and noticeable using color, familiar icons, and text. **Do not use color alone.**
+- If an element has both a visible label and an accessible name, the visible label's text should be included in the accessible name (MCAG).
+ - The accessible name's copy should start with the text of the visible label (MCAG).
### **Information should be checkable before submission.**
- Let people review the information they’ve entered in a form and fix any mistakes before they complete a legal or financial transaction, change saved data, or submit a test answer.
@@ -74,6 +88,19 @@ Clear instructions for entering or fixing information will help a user complete
* Except when: re-entering the information is essential, the information is required to ensure the security of the content, or previously entered information is no longer valid.
+## **Real-time updates (MCAG)**
+- There should be a visual indication for real-time updates on the screen.
+- There should be auditory indications for real-time updates while using the app.
+- Real-time updates should have tactile indications (haptics) unless a user has turned haptic feedback off.
+- Time-sensitive real-time updates should be reflected in a push notification when a user is not actively using the app unless a user has opted out of or turned off push notifications.
+
+## **Toast / snackbar (MCAG)**
+- The content of a snackbar should be announced by assistive technology without the focus shifting to it.
+- The font size of a snackbar message should be at the same as the base font size.
+- Each snackbar message should stay visible for at least 5 seconds plus one extra second for every 120 words (rounding up) unless the user can take an action (i.e. "undo").
+ - If there is an action that a user can take, the snackbar **should not** auto-dismiss.
+ - If the only option within the snackbar is to "dismiss", the snackbar **should** auto-dismiss.
+
## **Images**
Images, including icons, that are meaningful must have a text alternative (alt text) so that users who can’t see them, can still get the same visual information they contain.
- Identify decorative images so engineers can code them correctly.
@@ -81,6 +108,17 @@ Images, including icons, that are meaningful must have a text alternative (alt t
- If icons are used, they should have accompanying text and/or a label. Icons should not be used on their own, as it can cause issues for blind/low vision users and users with cognitive disabilities.
+## **External device support (MCAG)**
+If a smartphone device supports the connection of an external assistive technology device, users should be able to operate controls and other interactive elements of the app while using the device of their choosing.
+
+When designing, consider how your design will be used by a variety of assistive tech devices. These devices include, but are not limited to:
+- Braille displays
+- Switch control devices
+- Eye-tracking systems and/or technology
+- Augmentative and alternative communication (AAC) devices
+- Hearing aid compatibility
+- Adaptive keyboards and input devices (including a mouse)
+
## **Keyboard**
Any function or experience a user has when using a mouse must be available to keyboard users. Keyboard accessibility remains as important as ever and most major mobile operating systems do include keyboard interfaces, allowing mobile devices to be operated by external physical keyboards (e.g. keyboards connected via Bluetooth, USB On-The-Go) or alternative on-screen keyboards (e.g. scanning on-screen keyboards).
@@ -117,6 +155,7 @@ Users want to navigate around the app easily. A user’s confidence in an app wi
## **Dragging movement**
Some people cannot perform dragging movements in a precise manner. Others use a specialized or adapted input device, such as a trackball, head pointer, eye-gaze system, or speech-controlled mouse emulator, which may make dragging cumbersome and error-prone.
- Ensure that all functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging, unless dragging is essential or the functionality is determined by the user agent and not modified by the author.
+- Multipoint gestures should have a keyboard alternative.
## **Motion interaction**
@@ -139,6 +178,9 @@ Information that relies on sensory perceptions (like color or sound) to relay me
### **Communicate information using multiple accessible methods.**
- Add another method if using color to communicate important information.
+- Elements distinction should not solely rely on color cues (MCAG).
+- Elements' state distinction should not solely rely on color cues (MCAG).
+- Conveying information, indicating an action, or prompting a response should not soley rely on color cues (MCAG).
## **Tables**
@@ -180,7 +222,7 @@ Multimedia content can offer users an alternative to text. Users can watch or li
## **Consistent help**
When the placement of the help mechanism is kept consistent across a set of screens, users looking for help will find it easier to identify.
-- If a help option (contact form, chat box, etc.) is available to a user, ensure that the placement / location of this option is consistent across screens.
+- If a help option (contact form, chat box, etc.) is available to a user, ensure that the placement / location and naming of this option is consistent across screens.
## **Audio and moving content**
@@ -197,6 +239,9 @@ Content that moves or starts playing automatically grabs people's attention. Giv
- Stop moving content, including carousels, from playing automatically, unless it plays for 5 seconds or less.
- Let people pause, stop or hide any media content that plays automatically and is longer than 5 seconds.
+## **Web Views (MCAG)**
+- Content presented within Web Views should meet the WCAG 2.2, AA requirements, except when:
+ - Elements' target size should meet 2.5.5 Target Size (Enhanced) (AAA) instead of 2.5.8 Target Size (Minimum) (AA)
---
diff --git a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/ClosingBugTickets.md b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/ClosingBugTickets.md
new file mode 100644
index 00000000000..b7a94e14f60
--- /dev/null
+++ b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/ClosingBugTickets.md
@@ -0,0 +1,18 @@
+# Closing bug tickets
+
+## Why not just write up all bugs and keep those issues around forever?
+To deliver a meaningful, high-quality app to veterans, teams must devote some portion of their time to fixing bugs to improve the user experience. However, even on teams that are dedicating a reasonable portion of time towards those improvements, it's easy for a backlog of bug tickets to get bloated to the point where it's unmanageable (requires too much cognitive load to understand & prioritize).
+
+In addition to spending 30% of our time on maintenance (bug fixes, code upkeep, and the like), a clear set of definitions for bug tickets that we will close as 'not fixing' will help keep the backlog of bug tickets to a manageable, meaningful set.
+
+### When to close as not fixing
+Bug tickets that should be closed without fixing include:
+- Any bug in an external system, where the mobile app team cannot / will not be responsible for fixing it
+ - For high-severity bugs, ideally when closing they will include information about how the issue was communicated to the responsible external team
+- Bugs that are no longer relevant/no longer apply (for example, a visual issue with the UI of a screen, but the screen has since been redesigned to remove the previously-wrong element)
+- Bugs that are prohibitively 'expensive'/risky to fix (decision made in conjunction with the relevant FE team)
+- Low-severity bugs which have been reported from production, and we are unable to reproduce in staging
+
+### Process
+- Anyone can close a bug ticket as "not fixing" by closing the issue, adding a comment with explanation, and applying the "Closed - Can't / Won't Fix" label.
+- Anyone can open a previously "not fixing" bug ticket by re-opening it, adding a comment with explanation, and contacting the owning subteam about it.
\ No newline at end of file
diff --git a/VAMobile/documentation/docs/QA/_category_.json b/VAMobile/documentation/docs/QA/_category_.json
index d80b1470fb7..96adc258eb6 100644
--- a/VAMobile/documentation/docs/QA/_category_.json
+++ b/VAMobile/documentation/docs/QA/_category_.json
@@ -1,4 +1,4 @@
{
"label": "QA",
- "position": 5
-}
\ No newline at end of file
+ "position": 7
+}
diff --git a/VAMobile/documentation/docs/UX/_category_.json b/VAMobile/documentation/docs/UX/_category_.json
index 6a6d7e815af..036822b2bde 100644
--- a/VAMobile/documentation/docs/UX/_category_.json
+++ b/VAMobile/documentation/docs/UX/_category_.json
@@ -1,4 +1,4 @@
{
"label": "UX",
- "position": 4
+ "position": 6
}
diff --git a/VAMobile/documentation/docs/contributing.md b/VAMobile/documentation/docs/contributing.md
new file mode 100644
index 00000000000..3b26a9a724a
--- /dev/null
+++ b/VAMobile/documentation/docs/contributing.md
@@ -0,0 +1,47 @@
+---
+title: Contributing
+sidebar_position: 2
+---
+
+## VA Health & Benefits: Mobile & Web Collaboration
+
+### Collaboration Phases
+
+This model shows how collaboration between web and mobile teams evolves as web teams develop more experience working in the mobile app and add mobile specific resources to their teams.
+
+**The outcome is such that an Experience team owns one or multiple Veteran-facing experiences across modalities – mobile app(s), va.gov, and future modalities.**
+
+Any support with Experience teams will be dependent on prioritization.
+
+### Definitions
+
+Web team: An OCTO-led team that owns Veteran-facing va.gov experience(s).
+
+Mobile team: An OCTO-led team that owns all experiences in VA: Health and Benefits mobile app.
+
+Experience team: A yet-to-exist team that owns Veteran-facing experiences across all modalities: native mobile apps, va.gov, and current/future technologies.
+
+| Phase A: Mobile works independently | Phase B: Web experience advises mobile | Phase C: Mobile and Web split responsibilities | Phase D: Mobile advises web experience team** | Phase E: Web team works independently and become an Experience team. |
+| --- | --- | --- | --- | --- |
+| VAHB Mobile App team does all of the implementation and maintenance work | VAHB Mobile App team does all of the implementation and maintenance work | Web experience team works to identify, strategize, and design initiatives
VAHB builds/ships, measures and maintains. | Web experience team does all of the implementation and maintenance work
VAHB may lend resources as needed | **Experience** team does **all** the implementation and maintenance work |
+| | Web experience team advises mobile team as experience subject matter experts | VAHB team advises the experience team | VAHB team advises the experience team, runs QA, and reviews code. | VAHB runs QA and reviews code prior to submission and release |
+| Mobile OCTO team POs manage initiatives | Mobile OCTO team POs manage initiatives | Experience OCTO POs manage initiatives | Experience OCTO POs manage initiatives | Experience OCTO POs manage initiatives |
+
+### **_How an initiative will work in detail_**
+
+Transition Phase C (Mobile and Web split responsibilities) represents the next available stage of collaboration that web and mobile teams can move to while most mobile expertise is still within the mobile team.
+
+#### Success measures for Phase C
+
+1. Web teams move through the strategy and design phases with minimal support from the mobile team.
+2. The mobile team implement requirements and designs that the web experience team created with minimal rework.
+
+**What needs to be done to move on to the next step:**
+
+| Initiative Steps | Web Application Team | VAHB Mobile Team |
+|--------------------|----------------------|------------------|
+| Step 0: Identify | Create a [project brief](https://github.com/department-of-veterans-affairs/va-mobile-app/issues/new?template=feature-request.yml) that roughly lays out abstract requirements, risks, and major players. | - Mobile reviews the brief and gives feedback on mobile specific elements. - This is the review gate to consider if this feature or update is appropriate for VAHB. |
+| Step 1: Strategize | - Web team drafts product strategy and decides on requirements. - A formal kickoff could be scheduled at this stage to lay out how these teams will collaborate with each other, timelines, and points of contact. - Web team creates tickets on their own board for research and design. | - Mobile reviews and gives feedback on mobile specific considerations. - Mobile will prioritize resources to consult on Step 2 |
+| Step 2: Design | - Evaluative research, design and product ideation is done in order to define the first version of a feature. Finalize what is in and what isn’t. What does it look like? - Web creates an implementation plan and submits a [testplan request](https://github.com/department-of-veterans-affairs/va-mobile-app/issues/new?template=QA_Test_Plan.md) to the mobile QA team. | - Mobile will consult on research, design, data, content, accessibility, etc - Mobile reviews implementation plan - Mobile prioritizes implementation |
+| Step 3: Build/Ship | - Web shares test accounts and assists with testing - Web assists with providing app store and what’s new content | - Mobile copies over engineering tickets and test plans - Mobile points engineering and QA tickets - Mobile implements - Mobile leads all necessary steps to include in whole app release process, including phased release, app store info, and what’s new content |
+| Step 4: Measure | - Web assists with comparing web and mobile analytics | - Mobile monitors initial launch success |
diff --git a/VAMobile/documentation/package.json b/VAMobile/documentation/package.json
index 2a93aedf4c9..653269b88ba 100644
--- a/VAMobile/documentation/package.json
+++ b/VAMobile/documentation/package.json
@@ -28,7 +28,7 @@
"docusaurus-plugin-remote-content": "^4.0.0",
"file-loader": "^6.2.0",
"mdx-mermaid": "^1.3.2",
- "mermaid": "^10.1.0",
+ "mermaid": "^10.9.3",
"prism-react-renderer": "^1.2.1",
"raw-loader": "^4.0.2",
"react": "^17.0.1",
diff --git a/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-initial-login.png b/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-initial-login.png
new file mode 100644
index 00000000000..b67337376f3
Binary files /dev/null and b/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-initial-login.png differ
diff --git a/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-subsequent-login.png b/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-subsequent-login.png
new file mode 100644
index 00000000000..cc06c26e600
Binary files /dev/null and b/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-subsequent-login.png differ
diff --git a/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-initial-login.png b/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-initial-login.png
new file mode 100644
index 00000000000..54a25dfebc9
Binary files /dev/null and b/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-initial-login.png differ
diff --git a/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-subsequent-login.png b/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-subsequent-login.png
new file mode 100644
index 00000000000..2763845cc83
Binary files /dev/null and b/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-subsequent-login.png differ
diff --git a/VAMobile/documentation/static/img/backend/iam-authentication-sequence-diagram.png b/VAMobile/documentation/static/img/backend/iam-authentication-sequence-diagram.png
deleted file mode 100644
index 1b1ebdc6402..00000000000
Binary files a/VAMobile/documentation/static/img/backend/iam-authentication-sequence-diagram.png and /dev/null differ
diff --git a/VAMobile/documentation/static/img/backend/username-and-password-authorization-flow.png b/VAMobile/documentation/static/img/backend/username-and-password-authorization-flow.png
new file mode 100644
index 00000000000..afec0a28e53
Binary files /dev/null and b/VAMobile/documentation/static/img/backend/username-and-password-authorization-flow.png differ
diff --git a/VAMobile/documentation/static/img/backend/vets-api-authentication-activity-diagram.png b/VAMobile/documentation/static/img/backend/vets-api-authentication-activity-diagram.png
deleted file mode 100644
index 2d17a674053..00000000000
Binary files a/VAMobile/documentation/static/img/backend/vets-api-authentication-activity-diagram.png and /dev/null differ
diff --git a/VAMobile/documentation/static/img/home/vamobile-home-zones.png b/VAMobile/documentation/static/img/home/vamobile-home-zones.png
new file mode 100644
index 00000000000..be1e7646e78
Binary files /dev/null and b/VAMobile/documentation/static/img/home/vamobile-home-zones.png differ
diff --git a/VAMobile/documentation/yarn.lock b/VAMobile/documentation/yarn.lock
index 6913311f616..17396e773e9 100644
--- a/VAMobile/documentation/yarn.lock
+++ b/VAMobile/documentation/yarn.lock
@@ -1312,7 +1312,7 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
-"@braintree/sanitize-url@^6.0.2":
+"@braintree/sanitize-url@^6.0.1":
version "6.0.4"
resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783"
integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==
@@ -3683,13 +3683,6 @@ cose-base@^1.0.0:
dependencies:
layout-base "^1.0.0"
-cose-base@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01"
- integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==
- dependencies:
- layout-base "^2.0.0"
-
cosmiconfig@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
@@ -3938,20 +3931,10 @@ cytoscape-cose-bilkent@^4.1.0:
dependencies:
cose-base "^1.0.0"
-cytoscape-fcose@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471"
- integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==
- dependencies:
- cose-base "^2.2.0"
-
-cytoscape@^3.23.0:
- version "3.26.0"
- resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.26.0.tgz#b4c6961445fd51e1fd3cca83c3ffe924d9a8abc9"
- integrity sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==
- dependencies:
- heap "^0.2.6"
- lodash "^4.17.21"
+cytoscape@^3.28.1:
+ version "3.30.2"
+ resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.2.tgz#94149707fb6547a55e3b44f03ffe232706212161"
+ integrity sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==
"d3-array@1 - 2":
version "2.12.1"
@@ -4532,16 +4515,16 @@ domhandler@^5.0.2, domhandler@^5.0.3:
dependencies:
domelementtype "^2.3.0"
-dompurify@3.0.5:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.5.tgz#eb3d9cfa10037b6e73f32c586682c4b2ab01fbed"
- integrity sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==
-
dompurify@^2.2.8:
version "2.4.7"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc"
integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==
+"dompurify@^3.0.5 <3.1.7":
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.6.tgz#43c714a94c6a7b8801850f82e756685300a027e2"
+ integrity sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==
+
domutils@^2.5.2, domutils@^2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
@@ -4605,10 +4588,10 @@ electron-to-chromium@^1.5.4:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6"
integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==
-elkjs@^0.8.2:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e"
- integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==
+elkjs@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.9.3.tgz#16711f8ceb09f1b12b99e971b138a8384a529161"
+ integrity sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==
emoji-regex@^8.0.0:
version "8.0.0"
@@ -5529,11 +5512,6 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-heap@^0.2.6:
- version "0.2.7"
- resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc"
- integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==
-
history@^4.9.0:
version "4.10.1"
resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3"
@@ -5667,9 +5645,9 @@ http-parser-js@>=0.5.1:
integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==
http-proxy-middleware@^2.0.3:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f"
- integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6"
+ integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==
dependencies:
"@types/http-proxy" "^1.17.8"
http-proxy "^1.18.1"
@@ -6183,6 +6161,13 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
+katex@^0.16.9:
+ version "0.16.11"
+ resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.11.tgz#4bc84d5584f996abece5f01c6ad11304276a33f5"
+ integrity sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==
+ dependencies:
+ commander "^8.3.0"
+
keyv@^4.0.0:
version "4.5.3"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25"
@@ -6230,11 +6215,6 @@ layout-base@^1.0.0:
resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2"
integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==
-layout-base@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285"
- integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==
-
leven@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
@@ -6517,23 +6497,23 @@ merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-mermaid@^10.1.0:
- version "10.3.0"
- resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.3.0.tgz#45c1399fc8b95818822cbbd7b03a6093d15685a9"
- integrity sha512-H5quxuQjwXC8M1WuuzhAp2TdqGg74t5skfDBrNKJ7dt3z8Wprl5S6h9VJsRhoBUTSs1TMtHEdplLhCqXleZZLw==
+mermaid@^10.9.3:
+ version "10.9.3"
+ resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.9.3.tgz#90bc6f15c33dbe5d9507fed31592cc0d88fee9f7"
+ integrity sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==
dependencies:
- "@braintree/sanitize-url" "^6.0.2"
+ "@braintree/sanitize-url" "^6.0.1"
"@types/d3-scale" "^4.0.3"
"@types/d3-scale-chromatic" "^3.0.0"
- cytoscape "^3.23.0"
+ cytoscape "^3.28.1"
cytoscape-cose-bilkent "^4.1.0"
- cytoscape-fcose "^2.1.0"
d3 "^7.4.0"
d3-sankey "^0.12.3"
dagre-d3-es "7.0.10"
dayjs "^1.11.7"
- dompurify "3.0.5"
- elkjs "^0.8.2"
+ dompurify "^3.0.5 <3.1.7"
+ elkjs "^0.9.0"
+ katex "^0.16.9"
khroma "^2.0.0"
lodash-es "^4.17.21"
mdast-util-from-markdown "^1.3.0"
diff --git a/VAMobile/e2e/tests/Appeals.e2e.ts b/VAMobile/e2e/tests/Appeals.e2e.ts
index 047591a25f1..1ac75e392fa 100644
--- a/VAMobile/e2e/tests/Appeals.e2e.ts
+++ b/VAMobile/e2e/tests/Appeals.e2e.ts
@@ -1,3 +1,9 @@
+/*
+Description:
+Detox script that follows the Appeals test case found in testRail (VA Mobile App > RC Regression Test > Manual > Benefits Page Elements)
+When to update:
+This script should be updated whenever new things are added/changed in appeals details or if anything appeal wise is changed in src/store/api/demo/mocks/claims.json.
+*/
import { by, device, element, expect, waitFor } from 'detox'
import { setTimeout } from 'timers/promises'
diff --git a/VAMobile/e2e/tests/AppealsExpanded.e2e.ts b/VAMobile/e2e/tests/AppealsExpanded.e2e.ts
index f38aae054f7..46f4779e9f1 100644
--- a/VAMobile/e2e/tests/AppealsExpanded.e2e.ts
+++ b/VAMobile/e2e/tests/AppealsExpanded.e2e.ts
@@ -1,3 +1,10 @@
+/*
+Description:
+Detox script that tests for all appeal status types and verifies that the appeal appears in the claim list and that the appeal details page opens when clicked.
+As a note: most of the current status wording is checked in our unit tests so there this test does not check that.
+When to update:
+This script should be updated whenever a new appeal status types is created, if anything appeal wise is changed in src/store/api/demo/mocks/claims.json or if any new content changes are made to appeals.
+*/
import { by, device, element, expect, waitFor } from 'detox'
import {
@@ -160,6 +167,7 @@ describe('AppealsExpanded', () => {
const appealInfo = expectedInformation[i]
await expect(element(by.text('Appeal for ' + appealInfo[0]))).toExist()
await expect(element(by.text(appealInfo[1]))).toExist()
+ //This if statement tests the wording in the review past events dropdown. If appealInfo[2] is true but appealInfo[3] is undefined then the wording matches what we are checking for in appealInfo[1]. Otherwise the wording matches what is given in appealInfo[3].
if (appealInfo[2] !== undefined && appealInfo[2] === 'true') {
await element(by.text('Review past events')).tap()
if (appealInfo[3] === undefined) {
diff --git a/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts b/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts
index 46f53fa90cc..630d17cf08e 100644
--- a/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts
+++ b/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts
@@ -6,6 +6,55 @@ export const Appointmentse2eConstants = {
GET_DIRECTIONS_ID: 'directionsTestID',
}
+const checkMedicationWording = async ({
+ appointmentType,
+ appointmentStatus,
+ pastAppointment,
+}: {
+ appointmentType: string
+ appointmentStatus: string
+ pastAppointment: boolean
+}) => {
+ if (
+ appointmentType === 'Phone' ||
+ appointmentType === 'CC' ||
+ appointmentType === 'Onsite' ||
+ appointmentType === 'VA' ||
+ appointmentType === 'ATLAS' ||
+ appointmentType === 'GFE' ||
+ appointmentType === 'Home'
+ ) {
+ if (
+ appointmentStatus === 'Canceled' ||
+ (!pastAppointment && (appointmentStatus === 'Upcoming' || appointmentStatus === 'Confirmed'))
+ ) {
+ await expect(element(by.text('Prepare for your appointment'))).toExist()
+ await expect(element(by.text('Find a full list of things to bring to your appointment'))).toExist()
+
+ 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')))
+ .toBeVisible()
+ .whileElement(by.id(pastAppointment ? 'PastApptDetailsTestID' : 'UpcomingApptDetailsTestID'))
+ .scroll(300, 'down')
+ await element(by.id('prepareForVideoVisitTestID')).tap()
+ await expect(element(by.text('Appointments help'))).toExist()
+ await element(by.text('Close')).tap()
+ } else {
+ await expect(element(by.text('Get your device ready to join.'))).not.toExist()
+ await expect(element(by.id('prepareForVideoVisitTestID'))).not.toExist()
+ }
+ } else {
+ await expect(element(by.text('Prepare for your appointment'))).not.toExist()
+ await expect(element(by.text('Find a full list of things to bring to your appointment'))).not.toExist()
+ }
+ } else {
+ await expect(element(by.text('Prepare for your appointment'))).not.toExist()
+ await expect(element(by.text('Find a full list of things to bring to your appointment'))).not.toExist()
+ }
+}
+
const checkUpcomingApptDetails = async (
appointmentType: string,
appointmentStatus: string,
@@ -255,6 +304,7 @@ const checkUpcomingApptDetails = async (
await expect(element(by.id('CallTTYTestID')).atIndex(1)).toExist()
}
}
+ await checkMedicationWording({ appointmentType, appointmentStatus, pastAppointment })
await element(by.text('Appointments')).tap()
}
@@ -532,10 +582,6 @@ export async function apppointmentVerification(pastAppointment = false) {
if (!pastAppointment) {
await expect(element(by.text('Video appointment')))
await expect(element(by.text('You can join 30 minutes before your appointment time.'))).toExist()
- await expect(element(by.id('prepareForVideoVisitTestID'))).toExist()
- await element(by.id('prepareForVideoVisitTestID')).tap()
- await expect(element(by.text('Appointments help'))).toExist()
- await element(by.text('Close')).tap()
} else {
await expect(element(by.text('Past video appointment')))
}
diff --git a/VAMobile/e2e/tests/Prescriptions.e2e.ts b/VAMobile/e2e/tests/Prescriptions.e2e.ts
index ba1cf923952..c490c1f424d 100644
--- a/VAMobile/e2e/tests/Prescriptions.e2e.ts
+++ b/VAMobile/e2e/tests/Prescriptions.e2e.ts
@@ -1,9 +1,14 @@
+/*
+Description:
+Detox script that follows the prescriptions test case found in testRail (VA Mobile App > RC Regression Test > Manual > Health Page Elements)
+When to update:
+This script should be updated whenever new things are added/changed in prescriptions or if anything is changed in src/store/api/demo/mocks/prescriptions.json.
+*/
import { by, device, element, expect, waitFor } from 'detox'
import { setTimeout } from 'timers/promises'
import {
CommonE2eIdConstants,
- changeMockData,
checkImages,
loginToDemoMode,
openHealth,
@@ -63,6 +68,13 @@ beforeAll(async () => {
await openPrescriptions()
})
+/*
+Validates and tests the sort prescription options
+param name: String name of the sort option
+param first Prescription: String name of the first prescription that appears in the list once the sort option is selected
+param last Prescription: String name of the last prescription that appears in the list once the sort option is selected
+param first Instance: Boolean value that tells the test to scroll to the top so the filter and sort button is displayed
+*/
export async function validateSort(
name: string,
firstPrescription: string,
@@ -117,6 +129,12 @@ export async function validateSort(
})
}
+/*
+Validates and tests the filter prescription options
+param name: String name of the filter option
+param quantity: Number of prescriptions expected for a specific filter option
+param helperText: Optional string name of the helper text for the filter option
+*/
export async function validateFilter(name: string, quantity: number, helperText?: string) {
const filterDescription =
name === 'Pending' ? 'Pending refills' : name === 'Tracking' ? 'Refills with tracking' : `${name} prescriptions`
diff --git a/VAMobile/env/constant.env b/VAMobile/env/constant.env
index 620e7e605de..d912e23ce81 100644
--- a/VAMobile/env/constant.env
+++ b/VAMobile/env/constant.env
@@ -1,6 +1,7 @@
WEBVIEW_URL_CHANGE_LEGAL_NAME=https://www.va.gov/resources/how-to-change-your-legal-name-on-file-with-va/
WEBVIEW_URL_CORONA_FAQ=https://www.va.gov/coronavirus-veteran-frequently-asked-questions
WEBVIEW_URL_FACILITY_LOCATOR=https://www.va.gov/find-locations/
+WEBVIEW_URL_WHAT_TO_BRING_TO_APPOINTMENTS=https://www.va.gov/resources/what-should-i-bring-to-my-health-care-appointments/
LINK_URL_VA_NOTIFICATIONS=https://www.va.gov/profile/notifications/
LINK_URL_VA_SCHEDULING=https://www.va.gov/health-care/schedule-view-va-appointments/
LINK_URL_IN_APP_RECRUITMENT=https://docs.google.com/forms/d/e/1FAIpQLSfRb0OtW34qKm8tGoQwwwDFs8IqwOMCLTde3DeM-ukKOEZBnA/viewform
diff --git a/VAMobile/ios/Gemfile.lock b/VAMobile/ios/Gemfile.lock
index 50e26862d8d..e60cfae3a4c 100644
--- a/VAMobile/ios/Gemfile.lock
+++ b/VAMobile/ios/Gemfile.lock
@@ -5,7 +5,7 @@ GEM
base64
nkf
rexml
- activesupport (7.2.1.1)
+ activesupport (7.2.1.2)
base64
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
@@ -24,29 +24,29 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
- aws-partitions (1.991.0)
- aws-sdk-core (3.209.1)
+ aws-partitions (1.998.0)
+ aws-sdk-core (3.211.0)
aws-eventstream (~> 1, >= 1.3.0)
- aws-partitions (~> 1, >= 1.651.0)
+ aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
jmespath (~> 1, >= 1.6.1)
- aws-sdk-kms (1.94.0)
- aws-sdk-core (~> 3, >= 3.207.0)
+ aws-sdk-kms (1.95.0)
+ aws-sdk-core (~> 3, >= 3.210.0)
aws-sigv4 (~> 1.5)
- aws-sdk-s3 (1.167.0)
- aws-sdk-core (~> 3, >= 3.207.0)
+ aws-sdk-s3 (1.169.0)
+ aws-sdk-core (~> 3, >= 3.210.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
- aws-sigv4 (1.10.0)
+ aws-sigv4 (1.10.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
bigdecimal (3.1.8)
claide (1.1.0)
- cocoapods (1.15.2)
+ cocoapods (1.16.1)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
- cocoapods-core (= 1.15.2)
+ cocoapods-core (= 1.16.1)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 2.1, < 3.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
@@ -60,8 +60,8 @@ GEM
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 2.3.0, < 3.0)
- xcodeproj (>= 1.23.0, < 2.0)
- cocoapods-core (1.15.2)
+ xcodeproj (>= 1.26.0, < 2.0)
+ cocoapods-core (1.16.1)
activesupport (>= 5.0, < 8)
addressable (~> 2.8)
algoliasearch (~> 1.0)
@@ -126,7 +126,7 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.3.1)
- fastlane (2.224.0)
+ fastlane (2.225.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -142,6 +142,7 @@ GEM
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
+ fastlane-sirp (>= 1.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
@@ -168,6 +169,8 @@ GEM
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-plugin-slack_bot (1.4.0)
+ fastlane-sirp (1.0.0)
+ sysrandom (~> 1.0)
ffi (1.17.0)
ffi (1.17.0-arm64-darwin)
fourflusher (2.3.1)
@@ -216,7 +219,7 @@ GEM
i18n (1.14.6)
concurrent-ruby (~> 1.0)
jmespath (1.6.2)
- json (2.7.2)
+ json (2.7.4)
jwt (2.9.3)
base64
logger (1.6.1)
@@ -226,7 +229,7 @@ GEM
molinillo (0.8.0)
multi_json (1.15.0)
multipart-post (2.4.1)
- nanaimo (0.3.0)
+ nanaimo (0.4.0)
nap (1.1.0)
naturally (2.2.1)
netrc (0.11.0)
@@ -241,7 +244,7 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
- rexml (3.3.8)
+ rexml (3.3.9)
rouge (2.0.7)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
@@ -256,6 +259,7 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
+ sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@@ -274,12 +278,12 @@ GEM
xcode-install (2.8.1)
claide (>= 0.9.1)
fastlane (>= 2.1.0, < 3.0.0)
- xcodeproj (1.25.1)
+ xcodeproj (1.26.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
- nanaimo (~> 0.3.0)
+ nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
xcpretty (0.3.0)
rouge (~> 2.0.7)
diff --git a/VAMobile/ios/fastlane/Fastfile b/VAMobile/ios/fastlane/Fastfile
index c70792cdb42..1b28d55cbab 100644
--- a/VAMobile/ios/fastlane/Fastfile
+++ b/VAMobile/ios/fastlane/Fastfile
@@ -109,7 +109,7 @@ platform :ios do
slack_release_success(version.version_string, "iOS")
end
rescue => e
- slack_release_error(version, e)
+ slack_release_error(version, "iOS", e)
end
end
diff --git a/VAMobile/package.json b/VAMobile/package.json
index fef0af36993..55706892da5 100644
--- a/VAMobile/package.json
+++ b/VAMobile/package.json
@@ -52,8 +52,8 @@
"@react-navigation/bottom-tabs": "^6.6.1",
"@react-navigation/native": "^6.1.18",
"@react-navigation/stack": "^6.4.1",
- "@reduxjs/toolkit": "^2.2.8",
- "@tanstack/react-query": "^5.56.2",
+ "@reduxjs/toolkit": "^2.3.0",
+ "@tanstack/react-query": "^5.59.15",
"eslint-plugin-tsdoc": "^0.3.0",
"i18next": "^23.7.18",
"jsc-android": "^250231.0.0",
@@ -89,19 +89,19 @@
"underscore": "^1.13.7"
},
"devDependencies": {
- "@babel/core": "^7.24.9",
+ "@babel/core": "^7.26.0",
"@babel/plugin-proposal-private-methods": "^7.18.6",
"@babel/plugin-transform-runtime": "^7.24.7",
- "@babel/preset-env": "^7.24.8",
- "@babel/preset-typescript": "^7.25.7",
- "@babel/runtime": "^7.24.8",
+ "@babel/preset-env": "^7.26.0",
+ "@babel/preset-typescript": "^7.26.0",
+ "@babel/runtime": "^7.26.0",
"@department-of-veterans-affairs/eslint-config-mobile": "0.15.0",
"@react-native/babel-preset": "0.75.4",
"@react-native/eslint-config": "^0.75.3",
"@react-native/metro-config": "^0.75.3",
- "@react-native/typescript-config": "0.75.3",
- "@testing-library/jest-dom": "^6.5.0",
- "@testing-library/react-native": "^12.7.2",
+ "@react-native/typescript-config": "0.76.0",
+ "@testing-library/jest-dom": "^6.6.2",
+ "@testing-library/react-native": "^12.8.0",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@tsconfig/react-native": "^3.0.5",
"@types/detox": "^18.1.0",
@@ -124,7 +124,7 @@
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-jest": "^27.9.0",
"eslint-plugin-prettier": "^5.2.1",
- "eslint-plugin-react": "^7.37.1",
+ "eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-native": "^4.1.0",
"husky": "^9.1.6",
@@ -138,7 +138,7 @@
"prettier": "^3.3.3",
"react-devtools": "^5.3.1",
"react-test-renderer": "^18.3.1",
- "redux-mock-store": "^1.5.4",
+ "redux-mock-store": "^1.5.5",
"ts-jest": "^29.2.5",
"ts-node": "^10.9.2",
"typescript": "^5.5.4",
diff --git a/VAMobile/src/api/claimsAndAppeals/getAppeal.tsx b/VAMobile/src/api/claimsAndAppeals/getAppeal.tsx
index 89e4d48bb22..d747048113d 100644
--- a/VAMobile/src/api/claimsAndAppeals/getAppeal.tsx
+++ b/VAMobile/src/api/claimsAndAppeals/getAppeal.tsx
@@ -8,19 +8,19 @@ import { claimsAndAppealsKeys } from './queryKeys'
/**
* Fetch user Appeal
*/
-const getAppeal = async (id: string, abortSignal: AbortSignal): Promise => {
- const response = await get(`/v0/appeal/${id}`, {}, abortSignal)
+const getAppeal = async (id: string): Promise => {
+ const response = await get(`/v0/appeal/${id}`, {})
return response?.data
}
/**
* Returns a query for user Appeal
*/
-export const useAppeal = (id: string, abortSignal: AbortSignal, options?: { enabled?: boolean }) => {
+export const useAppeal = (id: string, options?: { enabled?: boolean }) => {
return useQuery({
...options,
queryKey: [claimsAndAppealsKeys.appeal, id],
- queryFn: () => getAppeal(id, abortSignal),
+ queryFn: () => getAppeal(id),
meta: {
errorName: 'getAppeal: Service error',
},
diff --git a/VAMobile/src/api/claimsAndAppeals/getClaim.tsx b/VAMobile/src/api/claimsAndAppeals/getClaim.tsx
index 6e22392688d..4d61137875d 100644
--- a/VAMobile/src/api/claimsAndAppeals/getClaim.tsx
+++ b/VAMobile/src/api/claimsAndAppeals/getClaim.tsx
@@ -8,19 +8,19 @@ import { claimsAndAppealsKeys } from './queryKeys'
/**
* Fetch user Claim
*/
-const getClaim = async (id: string, abortSignal?: AbortSignal): Promise => {
- const response = await get(`/v0/claim/${id}`, {}, abortSignal)
+const getClaim = async (id: string): Promise => {
+ const response = await get(`/v0/claim/${id}`, {})
return response?.data
}
/**
* Returns a query for user Claim
*/
-export const useClaim = (id: string, abortSignal?: AbortSignal, options?: { enabled?: boolean }) => {
+export const useClaim = (id: string, options?: { enabled?: boolean }) => {
return useQuery({
...options,
queryKey: [claimsAndAppealsKeys.claim, id],
- queryFn: () => getClaim(id, abortSignal),
+ queryFn: () => getClaim(id),
meta: {
errorName: 'getClaim: Service error',
},
diff --git a/VAMobile/src/components/CategoryLandingAlert.tsx b/VAMobile/src/components/CategoryLandingAlert.tsx
index ac7891c33a6..ab8d7ca435c 100644
--- a/VAMobile/src/components/CategoryLandingAlert.tsx
+++ b/VAMobile/src/components/CategoryLandingAlert.tsx
@@ -4,7 +4,9 @@ import { HapticFeedbackTypes } from 'react-native-haptic-feedback'
import { useIsFocused } from '@react-navigation/native'
-import { Box, TextView, VAIcon } from 'components'
+import { Icon } from '@department-of-veterans-affairs/mobile-component-library'
+
+import { Box, TextView } from 'components'
import { NAMESPACE } from 'constants/namespaces'
import { triggerHaptic } from 'utils/haptics'
import { useTheme } from 'utils/hooks'
@@ -32,22 +34,13 @@ const CategoryLandingAlert: FC = ({ text, isError }:
return (
-
+ = ({
{currentlySelectedOption?.label}
-
-
+
+
diff --git a/VAMobile/src/components/VAIconWithText/VAIconWithText.test.tsx b/VAMobile/src/components/IconWithText/IconWithText.test.tsx
similarity index 73%
rename from VAMobile/src/components/VAIconWithText/VAIconWithText.test.tsx
rename to VAMobile/src/components/IconWithText/IconWithText.test.tsx
index ad17e7691a1..a067c81eb4e 100644
--- a/VAMobile/src/components/VAIconWithText/VAIconWithText.test.tsx
+++ b/VAMobile/src/components/IconWithText/IconWithText.test.tsx
@@ -4,11 +4,11 @@ import { screen } from '@testing-library/react-native'
import { context, render } from 'testUtils'
-import VAIconWithText from './VAIconWithText'
+import IconWithText from './IconWithText'
context('VAIconWithText', () => {
beforeEach(() => {
- render()
+ render()
})
it('renders label, a11yLabel, and icon', () => {
diff --git a/VAMobile/src/components/IconWithText/IconWithText.tsx b/VAMobile/src/components/IconWithText/IconWithText.tsx
new file mode 100644
index 00000000000..4ccf36fb025
--- /dev/null
+++ b/VAMobile/src/components/IconWithText/IconWithText.tsx
@@ -0,0 +1,48 @@
+import React, { FC } from 'react'
+
+import { Icon, IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon'
+
+import { Box, ColorVariant, TextView, TextViewProps } from 'components'
+
+export type IconWithTextProps = IconProps & {
+ /** label to display below icon */
+ label: string
+ /** label color variant. default is textWithIconButton */
+ labelColor?: ColorVariant
+ /** optional a11y label */
+ labelA11y?: string
+ /** optional margin between text and icon */
+ mt?: number
+}
+
+/**
+ * Display icon with text label underneath
+ *
+ * @returns IconWithText component
+ */
+const IconWithText: FC = ({ label, labelColor, labelA11y, mt, ...iconProps }) => {
+ const props: IconProps = {
+ ...iconProps,
+ fill: iconProps.fill || 'link',
+ height: iconProps.height || 24,
+ width: iconProps.width || 24,
+ preventScaling: iconProps.preventScaling ?? true,
+ }
+
+ const textProps: TextViewProps = {
+ variant: 'textWithIconButton',
+ mt: mt || 3, // 6px total combined with line height
+ color: labelColor || 'textWithIconButton',
+ accessibilityLabel: labelA11y,
+ allowFontScaling: false,
+ }
+
+ return (
+
+
+ {label}
+
+ )
+}
+
+export default IconWithText
diff --git a/VAMobile/src/components/IconWithText/index.ts b/VAMobile/src/components/IconWithText/index.ts
new file mode 100644
index 00000000000..985a29d1cd4
--- /dev/null
+++ b/VAMobile/src/components/IconWithText/index.ts
@@ -0,0 +1,2 @@
+export * from './IconWithText'
+export { default } from './IconWithText'
diff --git a/VAMobile/src/components/Menu/MenuView.tsx b/VAMobile/src/components/Menu/MenuView.tsx
index 83a04555a20..6a81f08b4a9 100644
--- a/VAMobile/src/components/Menu/MenuView.tsx
+++ b/VAMobile/src/components/Menu/MenuView.tsx
@@ -2,11 +2,13 @@ import React, { FC, useEffect, useRef } from 'react'
import { useTranslation } from 'react-i18next'
import { Dimensions, Pressable, StyleProp, View, ViewStyle } from 'react-native'
+import { Icon } from '@department-of-veterans-affairs/mobile-component-library'
+import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon'
+
+import IconWithText from 'components/IconWithText'
import TextView from 'components/TextView'
-import VAIcon, { VA_ICON_MAP } from 'components/VAIcon'
-import VAIconWithText from 'components/VAIconWithText'
import { NAMESPACE } from 'constants/namespaces'
-import { VAIconColors, VATextColors } from 'styles/theme'
+import { VATextColors } from 'styles/theme'
import { useTheme } from 'utils/hooks'
import { isIOS } from 'utils/platform'
@@ -28,12 +30,10 @@ export type MenuItemActionsType = {
actionText: string
/** adds a divider after the action*/
addDivider: boolean
- /** name of the icon to show */
- iconName?: keyof typeof VA_ICON_MAP
+ /** icon props to show */
+ iconProps?: IconProps
/** method to */
onPress?: () => void
- /** color for the menu icon */
- iconColor?: keyof VAIconColors
/** color for the menu text */
textColor?: keyof VATextColors
/** action accessibility label */
@@ -100,7 +100,7 @@ const MenuView: FC = ({ actions }) => {
// gets the action passed down to the menu and creates the menu actions
const getActionsForMenu = () => {
return actions.map((item, index) => {
- const { iconName, actionText, accessibilityLabel, iconColor, textColor } = item
+ const { iconProps, actionText, accessibilityLabel, textColor } = item
const onPressMenu = () => {
hideMenu()
@@ -121,9 +121,7 @@ const MenuView: FC = ({ actions }) => {
viewStyle={menuStyle}
underlayColor={currentTheme.colors.buttonBackground.overFlowMenuButton}
accessibilityLabel={accessibilityLabel}>
- {iconName && (
-
- )}
+ {iconProps && }
{actionText}
@@ -139,7 +137,7 @@ const MenuView: FC = ({ actions }) => {
<>
-
+