From 4d9d193f09ef42b84d728615b1853993b7474b56 Mon Sep 17 00:00:00 2001 From: tienifr Date: Fri, 5 Jan 2024 16:13:22 +0700 Subject: [PATCH 001/122] set default category for distance request --- src/pages/iou/request/step/IOURequestStepConfirmation.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.js b/src/pages/iou/request/step/IOURequestStepConfirmation.js index d41442edd670..3ff22ba218ab 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.js +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.js @@ -115,6 +115,15 @@ function IOURequestStepConfirmation({ IOU.setMoneyRequestBillable_temporaryForRefactor(transactionID, defaultBillable); }, [transactionID, defaultBillable]); + const defaultCategory = _.chain(policy) + .get('customUnits') + .find((customUnit) => customUnit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE) + .get('defaultCategory') + .value(); + useEffect(() => { + IOU.setMoneyRequestCategory_temporaryForRefactor(transactionID, defaultCategory); + }, [transactionID, defaultCategory]); + const navigateBack = useCallback(() => { // If there is not a report attached to the IOU with a reportID, then the participants were manually selected and the user needs taken // back to the participants step From 62f1fb19cf7f9c62ed0245876ba6f5551961ed5d Mon Sep 17 00:00:00 2001 From: tienifr Date: Fri, 5 Jan 2024 16:26:21 +0700 Subject: [PATCH 002/122] use lodashGet instead --- .../iou/request/step/IOURequestStepConfirmation.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.js b/src/pages/iou/request/step/IOURequestStepConfirmation.js index 3ff22ba218ab..27d284eb4965 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.js +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.js @@ -115,11 +115,11 @@ function IOURequestStepConfirmation({ IOU.setMoneyRequestBillable_temporaryForRefactor(transactionID, defaultBillable); }, [transactionID, defaultBillable]); - const defaultCategory = _.chain(policy) - .get('customUnits') - .find((customUnit) => customUnit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE) - .get('defaultCategory') - .value(); + const defaultCategory = lodashGet( + _.find(lodashGet(policy, 'customUnits', {}), (customUnit) => customUnit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE), + 'defaultCategory', + '', + ); useEffect(() => { IOU.setMoneyRequestCategory_temporaryForRefactor(transactionID, defaultCategory); }, [transactionID, defaultCategory]); From 9a0471b3f43715d78ef2f17fb038e77b1f560487 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:20:20 +0100 Subject: [PATCH 003/122] Create Automation for when main fail --- .github/workflows/failureNotifier.yml | 108 ++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 .github/workflows/failureNotifier.yml diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml new file mode 100644 index 000000000000..794c472994f3 --- /dev/null +++ b/.github/workflows/failureNotifier.yml @@ -0,0 +1,108 @@ +name: Notify on Workflow Failure + +on: + workflow_run: + workflows: ["Process new code merged to main"] + types: + - completed + +jobs: + notify-failure: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'failure' }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Fetch Workflow Run Details + id: fetch-workflow-details + uses: actions/github-script@v7 + with: + script: | + const runId = "${{ github.event.workflow_run.id }}"; + const runData = await github.rest.actions.getWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: runId + }); + return runData.data; + + - name: Fetch Workflow Run Jobs + id: fetch-workflow-jobs + uses: actions/github-script@v7 + with: + script: | + const runId = "${{ github.event.workflow_run.id }}"; + const jobsData = await github.rest.actions.listJobsForWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: runId, + }); + return jobsData.data; + + - name: Get merged pull request number + id: getMergedPullRequestNumber + uses: actions-ecosystem/action-get-merged-pull-request@59afe90821bb0b555082ce8ff1e36b03f91553d9 + with: + github_token: ${{ github.token }} + + + - name: Process Each Failed Job + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.OS_BOTIFY_TOKEN }} + script: | + const prNumber = ${{ steps.getMergedPullRequestNumber.outputs.number }}; + const runData = ${{fromJSON(steps.fetch-workflow-details.outputs.result)}}; + const jobs = ${{fromJSON(steps.fetch-workflow-jobs.outputs.result)}}; + const failureLabel = 'workflow-failure'; + + const prData = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + }); + + const pr = prData.data; + + const prLink = pr.html_url; + const prAuthor = pr.user.login; + const prMerger = pr.merged_by.login; + + for (let i=0; i issue.title.includes(jobName)); + if (!existingIssue) { + const issueTitle = `🔍 Investigation Needed: ${jobName} Failure due to PR Merge 🔍`; + const issueBody = `🚨 **Failure Summary** 🚨:\n\n + - **📋 Job Name**: [${jobName}](${jobLink})\n + - **🔧 Failure in Workflow**: Main branch\n + - **🔗 Triggered by PR**: [PR Link](${prLink})\n + - **👤 PR Author**: @${prAuthor}\n + - **🤝 Merged by**: @${prMerger}\n\n + ⚠️ **Action Required** ⚠️:\n\n + 🛠️ A recent merge appears to have caused a failure in the job named [${jobName}](${jobLink}). + This issue has been automatically created and labeled with \`${failureLabel}\` for investigation. \n\n + 👀 **Please look into the following**:\n + 1. **Why the PR caused the job to fail?**\n + 2. **Address any underlying issues.**\n\n + 🐛 We appreciate your help in squashing this bug!`; + github.rest.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: issueTitle, + body: issueBody, + labels: [failureLabel], + assignees: [prMerger, prAuthor] + }); + } + } + } From 0ce489bf90216bd510748ce44255f11106eb5d60 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Wed, 10 Jan 2024 18:55:29 +0100 Subject: [PATCH 004/122] Fix workflow --- .github/workflows/failureNotifier.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 794c472994f3..f1b94b97f8a3 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -6,6 +6,9 @@ on: types: - completed +permissions: + issues: write + jobs: notify-failure: runs-on: ubuntu-latest @@ -50,11 +53,10 @@ jobs: - name: Process Each Failed Job uses: actions/github-script@v7 with: - github-token: ${{ secrets.OS_BOTIFY_TOKEN }} script: | const prNumber = ${{ steps.getMergedPullRequestNumber.outputs.number }}; const runData = ${{fromJSON(steps.fetch-workflow-details.outputs.result)}}; - const jobs = ${{fromJSON(steps.fetch-workflow-jobs.outputs.result)}}; + const jobs = ${{steps.fetch-workflow-jobs.outputs.result}}; const failureLabel = 'workflow-failure'; const prData = await github.rest.pulls.get({ From 28143ef5b4c778d577abf2d966fa596a2ac6ea8b Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Wed, 10 Jan 2024 19:00:33 +0100 Subject: [PATCH 005/122] fix issue body --- .github/workflows/failureNotifier.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index f1b94b97f8a3..96647ee261c3 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -84,19 +84,19 @@ jobs: const existingIssue = issues.data.find(issue => issue.title.includes(jobName)); if (!existingIssue) { const issueTitle = `🔍 Investigation Needed: ${jobName} Failure due to PR Merge 🔍`; - const issueBody = `🚨 **Failure Summary** 🚨:\n\n - - **📋 Job Name**: [${jobName}](${jobLink})\n - - **🔧 Failure in Workflow**: Main branch\n - - **🔗 Triggered by PR**: [PR Link](${prLink})\n - - **👤 PR Author**: @${prAuthor}\n - - **🤝 Merged by**: @${prMerger}\n\n - ⚠️ **Action Required** ⚠️:\n\n - 🛠️ A recent merge appears to have caused a failure in the job named [${jobName}](${jobLink}). - This issue has been automatically created and labeled with \`${failureLabel}\` for investigation. \n\n - 👀 **Please look into the following**:\n - 1. **Why the PR caused the job to fail?**\n - 2. **Address any underlying issues.**\n\n - 🐛 We appreciate your help in squashing this bug!`; + const issueBody = `🚨 **Failure Summary** 🚨:\n\n` + + `- **📋 Job Name**: [${jobName}](${jobLink})\n` + + `- **🔧 Failure in Workflow**: Main branch\n` + + `- **🔗 Triggered by PR**: [PR Link](${prLink})\n` + + `- **👤 PR Author**: @${prAuthor}\n` + + `- **🤝 Merged by**: @${prMerger}\n\n` + + `⚠️ **Action Required** ⚠️:\n\n` + + `🛠️ A recent merge appears to have caused a failure in the job named [${jobName}](${jobLink}).\n` + + `This issue has been automatically created and labeled with \`${failureLabel}\` for investigation. \n\n` + + `👀 **Please look into the following**:\n` + + `1. **Why the PR caused the job to fail?**\n` + + `2. **Address any underlying issues.**\n\n` + + `🐛 We appreciate your help in squashing this bug!`; github.rest.issues.create({ owner: context.repo.owner, repo: context.repo.repo, From 0e41b6613fc611fc6d407d3a5876f4ac705e3e33 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Wed, 10 Jan 2024 19:24:48 +0100 Subject: [PATCH 006/122] add daily label --- .github/workflows/failureNotifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 96647ee261c3..fd70b02adb29 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -102,7 +102,7 @@ jobs: repo: context.repo.repo, title: issueTitle, body: issueBody, - labels: [failureLabel], + labels: [failureLabel, 'daily'], assignees: [prMerger, prAuthor] }); } From 10baa724ac7821a6f70a49c09b70b50ff206f0ae Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Fri, 12 Jan 2024 16:19:08 +0100 Subject: [PATCH 007/122] address review comments --- .github/workflows/failureNotifier.yml | 32 ++++++++------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index fd70b02adb29..82b0b0fbe6ed 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -17,19 +17,6 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Fetch Workflow Run Details - id: fetch-workflow-details - uses: actions/github-script@v7 - with: - script: | - const runId = "${{ github.event.workflow_run.id }}"; - const runData = await github.rest.actions.getWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: runId - }); - return runData.data; - - name: Fetch Workflow Run Jobs id: fetch-workflow-jobs uses: actions/github-script@v7 @@ -55,8 +42,7 @@ jobs: with: script: | const prNumber = ${{ steps.getMergedPullRequestNumber.outputs.number }}; - const runData = ${{fromJSON(steps.fetch-workflow-details.outputs.result)}}; - const jobs = ${{steps.fetch-workflow-jobs.outputs.result}}; + const jobs = ${{ steps.fetch-workflow-jobs.outputs.result }}; const failureLabel = 'workflow-failure'; const prData = await github.rest.pulls.get({ @@ -71,7 +57,7 @@ jobs: const prAuthor = pr.user.login; const prMerger = pr.merged_by.login; - for (let i=0; i issue.title.includes(jobName)); if (!existingIssue) { - const issueTitle = `🔍 Investigation Needed: ${jobName} Failure due to PR Merge 🔍`; + const issueTitle = `🔍 Investigation Needed: ${ jobName } Failure due to PR Merge 🔍`; const issueBody = `🚨 **Failure Summary** 🚨:\n\n` + - `- **📋 Job Name**: [${jobName}](${jobLink})\n` + + `- **📋 Job Name**: [${ jobName }](${ jobLink })\n` + `- **🔧 Failure in Workflow**: Main branch\n` + - `- **🔗 Triggered by PR**: [PR Link](${prLink})\n` + - `- **👤 PR Author**: @${prAuthor}\n` + - `- **🤝 Merged by**: @${prMerger}\n\n` + + `- **🔗 Triggered by PR**: [PR Link](${ prLink })\n` + + `- **👤 PR Author**: @${ prAuthor }\n` + + `- **🤝 Merged by**: @${ prMerger }\n\n` + `⚠️ **Action Required** ⚠️:\n\n` + - `🛠️ A recent merge appears to have caused a failure in the job named [${jobName}](${jobLink}).\n` + - `This issue has been automatically created and labeled with \`${failureLabel}\` for investigation. \n\n` + + `🛠️ A recent merge appears to have caused a failure in the job named [${ jobName }](${ jobLink }).\n` + + `This issue has been automatically created and labeled with \`${ failureLabel }\` for investigation. \n\n` + `👀 **Please look into the following**:\n` + `1. **Why the PR caused the job to fail?**\n` + `2. **Address any underlying issues.**\n\n` + From 556b831303bbc594b0c682f1bb993b2623fd0d27 Mon Sep 17 00:00:00 2001 From: tienifr Date: Fri, 19 Jan 2024 01:36:30 +0700 Subject: [PATCH 008/122] set default category only when unset --- src/pages/iou/request/step/IOURequestStepConfirmation.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.js b/src/pages/iou/request/step/IOURequestStepConfirmation.js index ee2a151c7876..0f535cb60e14 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.js +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.js @@ -121,6 +121,9 @@ function IOURequestStepConfirmation({ '', ); useEffect(() => { + if (!_.isEmpty(transaction.category)) { + return; + } IOU.setMoneyRequestCategory_temporaryForRefactor(transactionID, defaultCategory); }, [transactionID, defaultCategory]); From c77614e859ced32948a8a4084113c3ecb8f61345 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:02:59 +0100 Subject: [PATCH 009/122] address review comments --- .github/workflows/failureNotifier.yml | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 82b0b0fbe6ed..667fe3a737b2 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -14,9 +14,6 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'failure' }} steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Fetch Workflow Run Jobs id: fetch-workflow-jobs uses: actions/github-script@v7 @@ -29,34 +26,26 @@ jobs: run_id: runId, }); return jobsData.data; - - - name: Get merged pull request number - id: getMergedPullRequestNumber - uses: actions-ecosystem/action-get-merged-pull-request@59afe90821bb0b555082ce8ff1e36b03f91553d9 - with: - github_token: ${{ github.token }} - - name: Process Each Failed Job uses: actions/github-script@v7 with: script: | - const prNumber = ${{ steps.getMergedPullRequestNumber.outputs.number }}; - const jobs = ${{ steps.fetch-workflow-jobs.outputs.result }}; - const failureLabel = 'workflow-failure'; + const jobs = ${{steps.fetch-workflow-jobs.outputs.result}}; - const prData = await github.rest.pulls.get({ + const headCommit = "${{ github.event.workflow_run.head_commit.id }}"; + const prData = await github.rest.repos.listPullRequestsAssociatedWithCommit({ owner: context.repo.owner, repo: context.repo.repo, - pull_number: prNumber, + commit_sha: headCommit, }); - const pr = prData.data; - + const pr = prData.data[0]; const prLink = pr.html_url; const prAuthor = pr.user.login; - const prMerger = pr.merged_by.login; + const prMerger = "${{ github.event.workflow_run.actor.login }}"; + const failureLabel = 'workflow-failure'; for (let i = 0; i < jobs.total_count; i++) { if (jobs.jobs[i].conclusion == 'failure') { const jobName = jobs.jobs[i].name; From c7925f5820f36f06abd46bd3461f8cac70774355 Mon Sep 17 00:00:00 2001 From: tienifr Date: Tue, 23 Jan 2024 02:05:19 +0700 Subject: [PATCH 010/122] fix lint --- src/pages/iou/request/step/IOURequestStepConfirmation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.js b/src/pages/iou/request/step/IOURequestStepConfirmation.js index 0f535cb60e14..029836d0c654 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.js +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.js @@ -125,7 +125,7 @@ function IOURequestStepConfirmation({ return; } IOU.setMoneyRequestCategory_temporaryForRefactor(transactionID, defaultCategory); - }, [transactionID, defaultCategory]); + }, [transactionID, transaction.category, defaultCategory]); const navigateBack = useCallback(() => { // If there is not a report attached to the IOU with a reportID, then the participants were manually selected and the user needs taken From 127b8a7a3fefa712dedd13ed2ab04987d9683567 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:16:11 +0100 Subject: [PATCH 011/122] add a warning comment --- .github/workflows/preDeploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/preDeploy.yml b/.github/workflows/preDeploy.yml index 8f9512062e9d..f09865de0194 100644 --- a/.github/workflows/preDeploy.yml +++ b/.github/workflows/preDeploy.yml @@ -1,3 +1,4 @@ +# Reminder: If this workflow's name changes, update the name in the dependent workflow at .github/workflows/failureNotifier.yml. name: Process new code merged to main on: From 9dde0a3e9a42374c4cfd661ba5f12633db2b8415 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 23 Jan 2024 10:26:31 +0100 Subject: [PATCH 012/122] Update issueTitle Co-authored-by: Joel Davies --- .github/workflows/failureNotifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 667fe3a737b2..2377cd71d4d8 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -58,7 +58,7 @@ jobs: }); const existingIssue = issues.data.find(issue => issue.title.includes(jobName)); if (!existingIssue) { - const issueTitle = `🔍 Investigation Needed: ${ jobName } Failure due to PR Merge 🔍`; + const issueTitle = `Investigate workflow job failing on main: ${ jobName }`; const issueBody = `🚨 **Failure Summary** 🚨:\n\n` + `- **📋 Job Name**: [${ jobName }](${ jobLink })\n` + `- **🔧 Failure in Workflow**: Main branch\n` + From 92449cabf9dbe28c0f9bbe9184972f6128cc2aaf Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 23 Jan 2024 10:27:04 +0100 Subject: [PATCH 013/122] spacing Co-authored-by: Joel Davies --- .github/workflows/failureNotifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 2377cd71d4d8..96718a16c29f 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -31,7 +31,7 @@ jobs: uses: actions/github-script@v7 with: script: | - const jobs = ${{steps.fetch-workflow-jobs.outputs.result}}; + const jobs = ${{ steps.fetch-workflow-jobs.outputs.result }}; const headCommit = "${{ github.event.workflow_run.head_commit.id }}"; const prData = await github.rest.repos.listPullRequestsAssociatedWithCommit({ From 6aef1a7916c445a500df43ac891f5f8e2cbf4eee Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 23 Jan 2024 10:28:31 +0100 Subject: [PATCH 014/122] Update issueBody --- .github/workflows/failureNotifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 96718a16c29f..476f27737d6f 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -61,7 +61,7 @@ jobs: const issueTitle = `Investigate workflow job failing on main: ${ jobName }`; const issueBody = `🚨 **Failure Summary** 🚨:\n\n` + `- **📋 Job Name**: [${ jobName }](${ jobLink })\n` + - `- **🔧 Failure in Workflow**: Main branch\n` + + `- **🔧 Failure in Workflow**: Process new code merged to main\n` + `- **🔗 Triggered by PR**: [PR Link](${ prLink })\n` + `- **👤 PR Author**: @${ prAuthor }\n` + `- **🤝 Merged by**: @${ prMerger }\n\n` + From c3fc9052143d349d30891adc307c1211de40903f Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 23 Jan 2024 15:16:09 +0100 Subject: [PATCH 015/122] Update issue label Co-authored-by: Joel Davies --- .github/workflows/failureNotifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 476f27737d6f..c8901d499982 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -77,7 +77,7 @@ jobs: repo: context.repo.repo, title: issueTitle, body: issueBody, - labels: [failureLabel, 'daily'], + labels: [failureLabel, 'Daily'], assignees: [prMerger, prAuthor] }); } From 2aa59017fb9e43831aaf8b2f91ba2c20c2ece9a1 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:28:20 +0100 Subject: [PATCH 016/122] update workflow failure label name --- .github/workflows/failureNotifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index c8901d499982..79de3d3f5c7d 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -45,7 +45,7 @@ jobs: const prAuthor = pr.user.login; const prMerger = "${{ github.event.workflow_run.actor.login }}"; - const failureLabel = 'workflow-failure'; + const failureLabel = 'Workflow Failure'; for (let i = 0; i < jobs.total_count; i++) { if (jobs.jobs[i].conclusion == 'failure') { const jobName = jobs.jobs[i].name; From 3ad76b18a649ae5d13373b71b125cd2048725020 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:33:31 +0100 Subject: [PATCH 017/122] add error message to the issue body --- .github/workflows/failureNotifier.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 79de3d3f5c7d..604770eff4d7 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -58,13 +58,24 @@ jobs: }); const existingIssue = issues.data.find(issue => issue.title.includes(jobName)); if (!existingIssue) { + const annotations = await github.rest.checks.listAnnotations({ + owner: context.repo.owner, + repo: context.repo.repo, + check_run_id: jobs.jobs[i].id, + }); + let errorMessage = ""; + for(let j = 0; j < annotations.data.length; j++) { + errorMessage += annotations.data[j].annotation_level + ": "; + errorMessage += annotations.data[j].message + "\n"; + } const issueTitle = `Investigate workflow job failing on main: ${ jobName }`; const issueBody = `🚨 **Failure Summary** 🚨:\n\n` + `- **📋 Job Name**: [${ jobName }](${ jobLink })\n` + `- **🔧 Failure in Workflow**: Process new code merged to main\n` + `- **🔗 Triggered by PR**: [PR Link](${ prLink })\n` + `- **👤 PR Author**: @${ prAuthor }\n` + - `- **🤝 Merged by**: @${ prMerger }\n\n` + + `- **🤝 Merged by**: @${ prMerger }\n` + + `- **🐛 Error Message**: \n ${errorMessage}\n\n` + `⚠️ **Action Required** ⚠️:\n\n` + `🛠️ A recent merge appears to have caused a failure in the job named [${ jobName }](${ jobLink }).\n` + `This issue has been automatically created and labeled with \`${ failureLabel }\` for investigation. \n\n` + From 8c802edccf7f9221e06508086db22e94ba806afd Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Wed, 24 Jan 2024 11:32:22 +0700 Subject: [PATCH 018/122] refactor task preview for hidden case --- .../HTMLRenderers/MentionUserRenderer.js | 2 +- src/components/ReportActionItem/TaskPreview.tsx | 10 +--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js index 11ffabe4fe6a..f31fd304d47f 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js +++ b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js @@ -41,7 +41,7 @@ function MentionUserRenderer(props) { if (!_.isEmpty(htmlAttribAccountID)) { const user = lodashGet(personalDetails, htmlAttribAccountID); accountID = parseInt(htmlAttribAccountID, 10); - displayNameOrLogin = LocalePhoneNumber.formatPhoneNumber(lodashGet(user, 'login', '')) || lodashGet(user, 'displayName', '') || translate('common.hidden'); + displayNameOrLogin = lodashGet(user, 'displayName', '') || LocalePhoneNumber.formatPhoneNumber(lodashGet(user, 'login', '')) || translate('common.hidden'); navigationRoute = ROUTES.PROFILE.getRoute(htmlAttribAccountID); } else if (!_.isEmpty(props.tnode.data)) { // We need to remove the LTR unicode and leading @ from data as it is not part of the login diff --git a/src/components/ReportActionItem/TaskPreview.tsx b/src/components/ReportActionItem/TaskPreview.tsx index cbd166d79d3a..bbf2525198be 100644 --- a/src/components/ReportActionItem/TaskPreview.tsx +++ b/src/components/ReportActionItem/TaskPreview.tsx @@ -8,7 +8,6 @@ import type {OnyxEntry} from 'react-native-onyx'; import Checkbox from '@components/Checkbox'; import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; -import {usePersonalDetails} from '@components/OnyxProvider'; import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback'; import RenderHTML from '@components/RenderHTML'; import {showContextMenuForReport} from '@components/ShowContextMenuContext'; @@ -20,7 +19,6 @@ import useThemeStyles from '@hooks/useThemeStyles'; import ControlSelection from '@libs/ControlSelection'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import getButtonState from '@libs/getButtonState'; -import * as LocalePhoneNumber from '@libs/LocalePhoneNumber'; import Navigation from '@libs/Navigation/Navigation'; import * as ReportUtils from '@libs/ReportUtils'; import * as TaskUtils from '@libs/TaskUtils'; @@ -84,7 +82,6 @@ function TaskPreview({ }: TaskPreviewProps) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); - const personalDetails = usePersonalDetails() || CONST.EMPTY_OBJECT; const {translate} = useLocalize(); // The reportAction might not contain details regarding the taskReport @@ -95,13 +92,8 @@ function TaskPreview({ : action?.childStateNum === CONST.REPORT.STATE_NUM.APPROVED && action?.childStatusNum === CONST.REPORT.STATUS_NUM.APPROVED; const taskTitle = Str.htmlEncode(TaskUtils.getTaskTitle(taskReportID, action?.childReportName ?? '')); const taskAssigneeAccountID = Task.getTaskAssigneeAccountID(taskReport) ?? action?.childManagerAccountID ?? ''; - const assigneeLogin = personalDetails[taskAssigneeAccountID]?.login ?? ''; - const assigneeDisplayName = personalDetails[taskAssigneeAccountID]?.displayName ?? ''; - const taskAssignee = assigneeDisplayName || LocalePhoneNumber.formatPhoneNumber(assigneeLogin); const htmlForTaskPreview = - taskAssignee && taskAssigneeAccountID !== 0 - ? `@${taskAssignee} ${taskTitle}` - : `${taskTitle}`; + taskAssigneeAccountID !== 0 ? ` ${taskTitle}` : `${taskTitle}`; const isDeletedParentAction = ReportUtils.isCanceledTaskReport(taskReport, action); if (isDeletedParentAction) { From 6a8161a267ab1228f8735b0ef4dd557d9a5365ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20M=C3=B3rawski?= Date: Wed, 24 Jan 2024 14:30:14 +0100 Subject: [PATCH 019/122] delete the old component --- src/pages/SearchPage.js | 223 ---------------------------------------- 1 file changed, 223 deletions(-) delete mode 100755 src/pages/SearchPage.js diff --git a/src/pages/SearchPage.js b/src/pages/SearchPage.js deleted file mode 100755 index c420371f5a65..000000000000 --- a/src/pages/SearchPage.js +++ /dev/null @@ -1,223 +0,0 @@ -import PropTypes from 'prop-types'; -import React, {useCallback, useEffect, useRef, useState} from 'react'; -import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import OptionsSelector from '@components/OptionsSelector'; -import ScreenWrapper from '@components/ScreenWrapper'; -import useLocalize from '@hooks/useLocalize'; -import useNetwork from '@hooks/useNetwork'; -import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@libs/Navigation/Navigation'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import Performance from '@libs/Performance'; -import * as ReportUtils from '@libs/ReportUtils'; -import * as Report from '@userActions/Report'; -import Timing from '@userActions/Timing'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import personalDetailsPropType from './personalDetailsPropType'; -import reportPropTypes from './reportPropTypes'; - -const propTypes = { - /* Onyx Props */ - - /** Beta features list */ - betas: PropTypes.arrayOf(PropTypes.string), - - /** All of the personal details for everyone */ - personalDetails: PropTypes.objectOf(personalDetailsPropType), - - /** All reports shared with the user */ - reports: PropTypes.objectOf(reportPropTypes), - - /** Whether we are searching for reports in the server */ - isSearchingForReports: PropTypes.bool, - - /** - * The navigation prop passed by the navigator. - * - * This is required because transitionEnd event doesn't trigger in the automated testing environment. - */ - navigation: PropTypes.shape({}), -}; - -const defaultProps = { - betas: [], - personalDetails: {}, - reports: {}, - isSearchingForReports: false, - navigation: {}, -}; - -function SearchPage({betas, personalDetails, reports, isSearchingForReports, navigation}) { - const [searchValue, setSearchValue] = useState(''); - const [searchOptions, setSearchOptions] = useState({ - recentReports: {}, - personalDetails: {}, - userToInvite: {}, - }); - - const {isOffline} = useNetwork(); - const {translate} = useLocalize(); - const themeStyles = useThemeStyles(); - const isMounted = useRef(false); - - const updateOptions = useCallback(() => { - const { - recentReports: localRecentReports, - personalDetails: localPersonalDetails, - userToInvite: localUserToInvite, - } = OptionsListUtils.getSearchOptions(reports, personalDetails, searchValue.trim(), betas); - - setSearchOptions({ - recentReports: localRecentReports, - personalDetails: localPersonalDetails, - userToInvite: localUserToInvite, - }); - }, [reports, personalDetails, searchValue, betas]); - - useEffect(() => { - Timing.start(CONST.TIMING.SEARCH_RENDER); - Performance.markStart(CONST.TIMING.SEARCH_RENDER); - }, []); - - useEffect(() => { - updateOptions(); - }, [reports, personalDetails, betas, updateOptions]); - - useEffect(() => { - if (!isMounted.current) { - isMounted.current = true; - return; - } - - updateOptions(); - // Ignoring the rule intentionally, we want to run the code only when search Value changes to prevent additional runs. - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [searchValue]); - - /** - * Returns the sections needed for the OptionsSelector - * - * @returns {Array} - */ - const getSections = () => { - const sections = []; - let indexOffset = 0; - - if (searchOptions.recentReports.length > 0) { - sections.push({ - data: searchOptions.recentReports, - shouldShow: true, - indexOffset, - }); - indexOffset += searchOptions.recentReports.length; - } - - if (searchOptions.personalDetails.length > 0) { - sections.push({ - data: searchOptions.personalDetails, - shouldShow: true, - indexOffset, - }); - indexOffset += searchOptions.recentReports.length; - } - - if (searchOptions.userToInvite) { - sections.push({ - data: [searchOptions.userToInvite], - shouldShow: true, - indexOffset, - }); - } - - return sections; - }; - - const searchRendered = () => { - Timing.end(CONST.TIMING.SEARCH_RENDER); - Performance.markEnd(CONST.TIMING.SEARCH_RENDER); - }; - - const onChangeText = (value = '') => { - Report.searchInServer(searchValue); - setSearchValue(value); - }; - - /** - * Reset the search value and redirect to the selected report - * - * @param {Object} option - */ - const selectReport = (option) => { - if (!option) { - return; - } - if (option.reportID) { - Navigation.dismissModal(option.reportID); - } else { - Report.navigateToAndOpenReport([option.login]); - } - }; - - const isOptionsDataReady = ReportUtils.isReportDataReady() && OptionsListUtils.isPersonalDetailsReady(personalDetails); - const headerMessage = OptionsListUtils.getHeaderMessage( - searchOptions.recentReports.length + searchOptions.personalDetails.length !== 0, - Boolean(searchOptions.userToInvite), - searchValue, - ); - - return ( - - {({didScreenTransitionEnd, safeAreaPaddingBottomStyle}) => ( - <> - - - - - - )} - - ); -} - -SearchPage.propTypes = propTypes; -SearchPage.defaultProps = defaultProps; -SearchPage.displayName = 'SearchPage'; -export default withOnyx({ - reports: { - key: ONYXKEYS.COLLECTION.REPORT, - }, - personalDetails: { - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - }, - betas: { - key: ONYXKEYS.BETAS, - }, - isSearchingForReports: { - key: ONYXKEYS.IS_SEARCHING_FOR_REPORTS, - initWithStoredValues: false, - }, -})(SearchPage); From c82dbc35ed0caac73b195339112bff99f65bf102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20M=C3=B3rawski?= Date: Wed, 24 Jan 2024 14:30:51 +0100 Subject: [PATCH 020/122] search debounce and loading indicator added --- .../SelectionList/BaseSelectionList.tsx | 2 ++ src/components/SelectionList/types.ts | 3 +++ src/pages/SearchPage/index.js | 16 ++++++++++------ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index d97c47c84ee7..2c929d2f4f9c 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -58,6 +58,7 @@ function BaseSelectionList( shouldShowTooltips = true, shouldUseDynamicMaxToRenderPerBatch = false, rightHandSideComponent, + isLoadingNewOptions = false, }: BaseSelectionListProps, inputRef: ForwardedRef, ) { @@ -422,6 +423,7 @@ function BaseSelectionList( spellCheck={false} onSubmitEditing={selectFocusedOption} blurOnSubmit={!!flattenedSections.allOptions.length} + isLoading={isLoadingNewOptions} /> )} diff --git a/src/components/SelectionList/types.ts b/src/components/SelectionList/types.ts index a82ddef6febb..222c818dd66d 100644 --- a/src/components/SelectionList/types.ts +++ b/src/components/SelectionList/types.ts @@ -230,6 +230,9 @@ type BaseSelectionListProps = Partial ReactElement) | ReactElement | null; + + /** Whether to show the loading indicator for new options */ + isLoadingNewOptions?: boolean; }; type ItemLayout = { diff --git a/src/pages/SearchPage/index.js b/src/pages/SearchPage/index.js index 211f3622e06c..8a06d54a1f45 100644 --- a/src/pages/SearchPage/index.js +++ b/src/pages/SearchPage/index.js @@ -29,11 +29,15 @@ const propTypes = { /** All reports shared with the user */ reports: PropTypes.objectOf(reportPropTypes), + + /** Whether or not we are searching for reports on the server */ + isSearchingForReports: PropTypes.bool, }; const defaultProps = { betas: [], reports: {}, + isSearchingForReports: false, }; const setPerformanceTimersEnd = () => { @@ -43,7 +47,7 @@ const setPerformanceTimersEnd = () => { const SearchPageFooterInstance = ; -function SearchPage({betas, reports}) { +function SearchPage({betas, reports, isSearchingForReports}) { const [isScreenTransitionEnd, setIsScreenTransitionEnd] = useState(false); const {translate} = useLocalize(); const {isOffline} = useNetwork(); @@ -59,10 +63,9 @@ function SearchPage({betas, reports}) { Performance.markStart(CONST.TIMING.SEARCH_RENDER); }, []); - const onChangeText = (text = '') => { - Report.searchInServer(text); - setSearchValue(text); - }; + useEffect(() => { + Report.searchInServer(debouncedSearchValue.trim()); + }, [debouncedSearchValue]); const { recentReports, @@ -150,13 +153,14 @@ function SearchPage({betas, reports}) { textInputValue={searchValue} textInputLabel={translate('optionsSelector.nameEmailOrPhoneNumber')} textInputHint={offlineMessage} - onChangeText={onChangeText} + onChangeText={setSearchValue} headerMessage={headerMessage} onLayout={setPerformanceTimersEnd} autoFocus onSelectRow={selectReport} showLoadingPlaceholder={!didScreenTransitionEnd || !isOptionsDataReady} footerContent={SearchPageFooterInstance} + isLoadingNewOptions={isSearchingForReports} /> From 199a826e0e592b395cb644253e770f8f754ec302 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 25 Jan 2024 15:29:36 +0700 Subject: [PATCH 021/122] fix Remove old description page --- src/ROUTES.ts | 10 +- src/SCREENS.ts | 1 - .../MoneyRequestConfirmationList.js | 13 +- ...oraryForRefactorRequestConfirmationList.js | 12 +- .../ReportActionItem/MoneyRequestView.js | 12 +- .../AppNavigator/ModalStackNavigators.tsx | 1 - src/libs/Navigation/linkingConfig.ts | 1 - src/libs/Navigation/types.ts | 3 +- src/libs/actions/IOU.js | 5 +- src/pages/EditRequestDescriptionPage.js | 91 ---------- src/pages/EditRequestPage.js | 45 ++--- src/pages/EditSplitBillPage.js | 29 +-- src/pages/iou/MoneyRequestDescriptionPage.js | 165 ------------------ .../request/step/IOURequestStepDescription.js | 6 +- 14 files changed, 74 insertions(+), 320 deletions(-) delete mode 100644 src/pages/EditRequestDescriptionPage.js delete mode 100644 src/pages/iou/MoneyRequestDescriptionPage.js diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 9c4375b84ab6..6849585b4aa2 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -279,10 +279,6 @@ const ROUTES = { route: ':iouType/new/currency/:reportID?', getRoute: (iouType: string, reportID: string, currency: string, backTo: string) => `${iouType}/new/currency/${reportID}?currency=${currency}&backTo=${backTo}` as const, }, - MONEY_REQUEST_DESCRIPTION: { - route: ':iouType/new/description/:reportID?', - getRoute: (iouType: string, reportID = '') => `${iouType}/new/description/${reportID}` as const, - }, MONEY_REQUEST_CATEGORY: { route: ':iouType/new/category/:reportID?', getRoute: (iouType: string, reportID = '') => `${iouType}/new/category/${reportID}` as const, @@ -349,9 +345,9 @@ const ROUTES = { getUrlWithBackToParam(`create/${iouType}/date/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_STEP_DESCRIPTION: { - route: 'create/:iouType/description/:transactionID/:reportID', - getRoute: (iouType: ValueOf, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`create/${iouType}/description/${transactionID}/${reportID}`, backTo), + route: ':action/:iouType/description/:transactionID/:reportID', + getRoute: (action: ValueOf, iouType: ValueOf, transactionID: string, reportID: string, backTo = '') => + getUrlWithBackToParam(`${action}/${iouType}/description/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_STEP_DISTANCE: { route: 'create/:iouType/distance/:transactionID/:reportID', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 2bf40caede57..cee5d6e8f40b 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -144,7 +144,6 @@ const SCREENS = { CONFIRMATION: 'Money_Request_Confirmation', CURRENCY: 'Money_Request_Currency', DATE: 'Money_Request_Date', - DESCRIPTION: 'Money_Request_Description', CATEGORY: 'Money_Request_Category', TAG: 'Money_Request_Tag', MERCHANT: 'Money_Request_Merchant', diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index 590154b48bca..1544ead61dd4 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -663,11 +663,18 @@ function MoneyRequestConfirmationList(props) { title={props.iouComment} description={translate('common.description')} onPress={() => { - if (props.isEditingSplitBill) { - Navigation.navigate(ROUTES.EDIT_SPLIT_BILL.getRoute(props.reportID, props.reportActionID, CONST.EDIT_REQUEST_FIELD.DESCRIPTION)); + if (!props.isEditingSplitBill) { return; } - Navigation.navigate(ROUTES.MONEY_REQUEST_DESCRIPTION.getRoute(props.iouType, props.reportID)); + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute( + CONST.IOU.ACTION.EDIT, + CONST.IOU.TYPE.SPLIT, + transaction.transactionID, + props.reportID, + Navigation.getActiveRouteWithoutParams(), + ), + ); }} style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} diff --git a/src/components/MoneyTemporaryForRefactorRequestConfirmationList.js b/src/components/MoneyTemporaryForRefactorRequestConfirmationList.js index 2aff0444a59e..21824ee69813 100755 --- a/src/components/MoneyTemporaryForRefactorRequestConfirmationList.js +++ b/src/components/MoneyTemporaryForRefactorRequestConfirmationList.js @@ -691,11 +691,9 @@ function MoneyTemporaryForRefactorRequestConfirmationList({ title={iouComment} description={translate('common.description')} onPress={() => { - if (isEditingSplitBill) { - Navigation.navigate(ROUTES.EDIT_SPLIT_BILL.getRoute(reportID, reportActionID, CONST.EDIT_REQUEST_FIELD.DESCRIPTION)); - return; - } - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute(iouType, transaction.transactionID, reportID, Navigation.getActiveRouteWithoutParams())); + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute(CONST.IOU.ACTION.CREATE, iouType, transaction.transactionID, reportID, Navigation.getActiveRouteWithoutParams()), + ); }} style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} @@ -711,10 +709,6 @@ function MoneyTemporaryForRefactorRequestConfirmationList({ style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} onPress={() => { - if (isEditingSplitBill) { - Navigation.navigate(ROUTES.EDIT_SPLIT_BILL.getRoute(reportID, reportActionID, CONST.EDIT_REQUEST_FIELD.MERCHANT)); - return; - } Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(iouType, transaction.transactionID, reportID, Navigation.getActiveRouteWithoutParams())); }} disabled={didConfirm} diff --git a/src/components/ReportActionItem/MoneyRequestView.js b/src/components/ReportActionItem/MoneyRequestView.js index 3121328138ee..46e564926936 100644 --- a/src/components/ReportActionItem/MoneyRequestView.js +++ b/src/components/ReportActionItem/MoneyRequestView.js @@ -286,7 +286,17 @@ function MoneyRequestView({report, parentReport, parentReportActions, policyCate interactive={canEdit} shouldShowRightIcon={canEdit} titleStyle={styles.flex1} - onPress={() => Navigation.navigate(ROUTES.EDIT_REQUEST.getRoute(report.reportID, CONST.EDIT_REQUEST_FIELD.DESCRIPTION))} + onPress={() => + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute( + CONST.IOU.ACTION.EDIT, + CONST.IOU.TYPE.REQUEST, + transaction.transactionID, + report.reportID, + Navigation.getActiveRouteWithoutParams(), + ), + ) + } wrapperStyle={[styles.pv2, styles.taskDescriptionMenuItem]} brickRoadIndicator={hasViolations('comment') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''} numberOfLinesTitle={0} diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index c9325206e5b2..881597a827ee 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -96,7 +96,6 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator require('../../../pages/iou/steps/MoneyRequestConfirmPage').default as React.ComponentType, [SCREENS.MONEY_REQUEST.CURRENCY]: () => require('../../../pages/iou/IOUCurrencySelection').default as React.ComponentType, [SCREENS.MONEY_REQUEST.DATE]: () => require('../../../pages/iou/MoneyRequestDatePage').default as React.ComponentType, - [SCREENS.MONEY_REQUEST.DESCRIPTION]: () => require('../../../pages/iou/MoneyRequestDescriptionPage').default as React.ComponentType, [SCREENS.MONEY_REQUEST.CATEGORY]: () => require('../../../pages/iou/MoneyRequestCategoryPage').default as React.ComponentType, [SCREENS.MONEY_REQUEST.TAG]: () => require('../../../pages/iou/MoneyRequestTagPage').default as React.ComponentType, [SCREENS.MONEY_REQUEST.MERCHANT]: () => require('../../../pages/iou/MoneyRequestMerchantPage').default as React.ComponentType, diff --git a/src/libs/Navigation/linkingConfig.ts b/src/libs/Navigation/linkingConfig.ts index 5df2bcf0e57b..56d9d362ffb6 100644 --- a/src/libs/Navigation/linkingConfig.ts +++ b/src/libs/Navigation/linkingConfig.ts @@ -431,7 +431,6 @@ const linkingConfig: LinkingOptions = { [SCREENS.MONEY_REQUEST.CONFIRMATION]: ROUTES.MONEY_REQUEST_CONFIRMATION.route, [SCREENS.MONEY_REQUEST.DATE]: ROUTES.MONEY_REQUEST_DATE.route, [SCREENS.MONEY_REQUEST.CURRENCY]: ROUTES.MONEY_REQUEST_CURRENCY.route, - [SCREENS.MONEY_REQUEST.DESCRIPTION]: ROUTES.MONEY_REQUEST_DESCRIPTION.route, [SCREENS.MONEY_REQUEST.CATEGORY]: ROUTES.MONEY_REQUEST_CATEGORY.route, [SCREENS.MONEY_REQUEST.TAG]: ROUTES.MONEY_REQUEST_TAG.route, [SCREENS.MONEY_REQUEST.MERCHANT]: ROUTES.MONEY_REQUEST_MERCHANT.route, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 2371c764f42a..5cf2220c304a 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -201,7 +201,8 @@ type MoneyRequestNavigatorParamList = { field: string; threadReportID: string; }; - [SCREENS.MONEY_REQUEST.DESCRIPTION]: { + [SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: { + action: string; iouType: string; reportID: string; field: string; diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index eb9541edcad2..c15c24c61e72 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -201,9 +201,10 @@ function setMoneyRequestCurrency_temporaryForRefactor(transactionID, currency) { /** * @param {String} transactionID * @param {String} comment + * @param {Boolean} isDraft */ -function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment) { - Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {comment: {comment: comment.trim()}}); +function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment, isDraft) { + Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {comment: comment.trim()}}); } /** diff --git a/src/pages/EditRequestDescriptionPage.js b/src/pages/EditRequestDescriptionPage.js deleted file mode 100644 index 9b2a9e465746..000000000000 --- a/src/pages/EditRequestDescriptionPage.js +++ /dev/null @@ -1,91 +0,0 @@ -import {useFocusEffect} from '@react-navigation/native'; -import PropTypes from 'prop-types'; -import React, {useCallback, useRef} from 'react'; -import {View} from 'react-native'; -import FormProvider from '@components/Form/FormProvider'; -import InputWrapperWithRef from '@components/Form/InputWrapper'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import ScreenWrapper from '@components/ScreenWrapper'; -import TextInput from '@components/TextInput'; -import useLocalize from '@hooks/useLocalize'; -import useThemeStyles from '@hooks/useThemeStyles'; -import * as Browser from '@libs/Browser'; -import updateMultilineInputRange from '@libs/updateMultilineInputRange'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; - -const propTypes = { - /** Transaction default description value */ - defaultDescription: PropTypes.string.isRequired, - - /** Callback to fire when the Save button is pressed */ - onSubmit: PropTypes.func.isRequired, -}; - -function EditRequestDescriptionPage({defaultDescription, onSubmit}) { - const styles = useThemeStyles(); - const {translate} = useLocalize(); - const descriptionInputRef = useRef(null); - const focusTimeoutRef = useRef(null); - - useFocusEffect( - useCallback(() => { - focusTimeoutRef.current = setTimeout(() => { - if (descriptionInputRef.current) { - descriptionInputRef.current.focus(); - } - return () => { - if (!focusTimeoutRef.current) { - return; - } - clearTimeout(focusTimeoutRef.current); - }; - }, CONST.ANIMATED_TRANSITION); - }, []), - ); - - return ( - - - - - { - if (!el) { - return; - } - descriptionInputRef.current = el; - updateMultilineInputRange(descriptionInputRef.current); - }} - autoGrowHeight - containerStyles={[styles.autoGrowHeightMultilineInput]} - submitOnEnter={!Browser.isMobile()} - /> - - - - ); -} - -EditRequestDescriptionPage.propTypes = propTypes; -EditRequestDescriptionPage.displayName = 'EditRequestDescriptionPage'; - -export default EditRequestDescriptionPage; diff --git a/src/pages/EditRequestPage.js b/src/pages/EditRequestPage.js index 3eb9d88f1120..b57d65726389 100644 --- a/src/pages/EditRequestPage.js +++ b/src/pages/EditRequestPage.js @@ -22,7 +22,7 @@ import ROUTES from '@src/ROUTES'; import EditRequestAmountPage from './EditRequestAmountPage'; import EditRequestCategoryPage from './EditRequestCategoryPage'; import EditRequestCreatedPage from './EditRequestCreatedPage'; -import EditRequestDescriptionPage from './EditRequestDescriptionPage'; +// import EditRequestDescriptionPage from './EditRequestDescriptionPage'; import EditRequestDistancePage from './EditRequestDistancePage'; import EditRequestMerchantPage from './EditRequestMerchantPage'; import EditRequestReceiptPage from './EditRequestReceiptPage'; @@ -74,7 +74,7 @@ function EditRequestPage({report, route, policyCategories, policyTags, parentRep const { amount: transactionAmount, currency: transactionCurrency, - comment: transactionDescription, + // comment: transactionDescription, merchant: transactionMerchant, category: transactionCategory, tag: transactionTag, @@ -180,25 +180,28 @@ function EditRequestPage({report, route, policyCategories, policyTags, parentRep [transactionCategory, transaction.transactionID, report.reportID], ); - const saveComment = useCallback( - ({comment: newComment}) => { - // Only update comment if it has changed - if (newComment.trim() !== transactionDescription) { - IOU.updateMoneyRequestDescription(transaction.transactionID, report.reportID, newComment.trim()); - } - Navigation.dismissModal(); - }, - [transactionDescription, transaction.transactionID, report.reportID], - ); - - if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DESCRIPTION) { - return ( - - ); - } + // I removed EditRequestDescriptionPage because we won't use this component anymore. This page EditRequestPage also be removed in https://github.com/Expensify/App/issues/29107 + + // const saveComment = useCallback( + // ({comment: newComment}) => { + // // Only update comment if it has changed + // if (newComment.trim() !== transactionDescription) { + // IOU.updateMoneyRequestDescription(transaction.transactionID, report.reportID, newComment.trim()); + // } + // Navigation.dismissModal(); + // }, + // [transactionDescription, transaction.transactionID, report.reportID], + // ); + + // + // if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DESCRIPTION) { + // return ( + // + // ); + // } if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DATE) { return ( diff --git a/src/pages/EditSplitBillPage.js b/src/pages/EditSplitBillPage.js index 2be8d6f683ee..69416e87bb9b 100644 --- a/src/pages/EditSplitBillPage.js +++ b/src/pages/EditSplitBillPage.js @@ -15,7 +15,7 @@ import ROUTES from '@src/ROUTES'; import EditRequestAmountPage from './EditRequestAmountPage'; import EditRequestCategoryPage from './EditRequestCategoryPage'; import EditRequestCreatedPage from './EditRequestCreatedPage'; -import EditRequestDescriptionPage from './EditRequestDescriptionPage'; +// import EditRequestDescriptionPage from './EditRequestDescriptionPage'; import EditRequestMerchantPage from './EditRequestMerchantPage'; import EditRequestTagPage from './EditRequestTagPage'; import reportPropTypes from './reportPropTypes'; @@ -58,7 +58,7 @@ function EditSplitBillPage({route, transaction, draftTransaction, report}) { const { amount: transactionAmount, currency: transactionCurrency, - comment: transactionDescription, + // comment: transactionDescription, merchant: transactionMerchant, created: transactionCreated, category: transactionCategory, @@ -76,18 +76,19 @@ function EditSplitBillPage({route, transaction, draftTransaction, report}) { navigateBackToSplitDetails(); }; - if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DESCRIPTION) { - return ( - { - setDraftSplitTransaction({ - comment: transactionChanges.comment.trim(), - }); - }} - /> - ); - } + // I removed EditRequestDescriptionPage because we won't use this component anymore. This page EditSplitBillPage also be removed in https://github.com/Expensify/App/issues/29107 + // if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DESCRIPTION) { + // return ( + // { + // setDraftSplitTransaction({ + // comment: transactionChanges.comment.trim(), + // }); + // }} + // /> + // ); + // } if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DATE) { return ( diff --git a/src/pages/iou/MoneyRequestDescriptionPage.js b/src/pages/iou/MoneyRequestDescriptionPage.js deleted file mode 100644 index fe3100b8c3bd..000000000000 --- a/src/pages/iou/MoneyRequestDescriptionPage.js +++ /dev/null @@ -1,165 +0,0 @@ -import {useFocusEffect} from '@react-navigation/native'; -import lodashGet from 'lodash/get'; -import PropTypes from 'prop-types'; -import React, {useCallback, useEffect, useRef} from 'react'; -import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; -import FormProvider from '@components/Form/FormProvider'; -import InputWrapperWithRef from '@components/Form/InputWrapper'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import ScreenWrapper from '@components/ScreenWrapper'; -import TextInput from '@components/TextInput'; -import useLocalize from '@hooks/useLocalize'; -import useThemeStyles from '@hooks/useThemeStyles'; -import * as IOU from '@libs/actions/IOU'; -import * as Browser from '@libs/Browser'; -import * as MoneyRequestUtils from '@libs/MoneyRequestUtils'; -import Navigation from '@libs/Navigation/Navigation'; -import updateMultilineInputRange from '@libs/updateMultilineInputRange'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import {iouDefaultProps, iouPropTypes} from './propTypes'; - -const propTypes = { - /** Onyx Props */ - /** Holds data related to Money Request view state, rather than the underlying Money Request data. */ - iou: iouPropTypes, - - /** Route from navigation */ - route: PropTypes.shape({ - /** Params from the route */ - params: PropTypes.shape({ - /** The type of IOU report, i.e. bill, request, send */ - iouType: PropTypes.string, - - /** The report ID of the IOU */ - reportID: PropTypes.string, - - /** Which field we are editing */ - field: PropTypes.string, - - /** reportID for the "transaction thread" */ - threadReportID: PropTypes.string, - }), - }).isRequired, - - /** The current tab we have navigated to in the request modal. String that corresponds to the request type. */ - selectedTab: PropTypes.oneOf(_.values(CONST.TAB_REQUEST)), -}; - -const defaultProps = { - iou: iouDefaultProps, - selectedTab: '', -}; - -function MoneyRequestDescriptionPage({iou, route, selectedTab}) { - const styles = useThemeStyles(); - const {translate} = useLocalize(); - const inputRef = useRef(null); - const focusTimeoutRef = useRef(null); - const iouType = lodashGet(route, 'params.iouType', ''); - const reportID = lodashGet(route, 'params.reportID', ''); - const isDistanceRequest = MoneyRequestUtils.isDistanceRequest(iouType, selectedTab); - - useFocusEffect( - useCallback(() => { - focusTimeoutRef.current = setTimeout(() => { - if (inputRef.current) { - inputRef.current.focus(); - } - return () => { - if (!focusTimeoutRef.current) { - return; - } - clearTimeout(focusTimeoutRef.current); - }; - }, CONST.ANIMATED_TRANSITION); - }, []), - ); - - useEffect(() => { - const moneyRequestId = `${iouType}${reportID}`; - const shouldReset = iou.id !== moneyRequestId; - if (shouldReset) { - IOU.resetMoneyRequestInfo(moneyRequestId); - } - - if (!isDistanceRequest && (_.isEmpty(iou.participants) || (iou.amount === 0 && !iou.receiptPath) || shouldReset)) { - Navigation.goBack(ROUTES.MONEY_REQUEST.getRoute(iouType, reportID), true); - } - }, [iou.id, iou.participants, iou.amount, iou.receiptPath, iouType, reportID, isDistanceRequest]); - - function navigateBack() { - Navigation.goBack(ROUTES.MONEY_REQUEST_CONFIRMATION.getRoute(iouType, reportID)); - } - - /** - * Sets the money request comment by saving it to Onyx. - * - * @param {Object} value - * @param {String} value.moneyRequestComment - */ - function updateComment(value) { - IOU.setMoneyRequestDescription(value.moneyRequestComment); - navigateBack(); - } - - return ( - - <> - navigateBack()} - /> - updateComment(value)} - submitButtonText={translate('common.save')} - enabledWhenOffline - > - - { - if (!el) { - return; - } - inputRef.current = el; - updateMultilineInputRange(inputRef.current); - }} - autoGrowHeight - containerStyles={[styles.autoGrowHeightMultilineInput]} - submitOnEnter={!Browser.isMobile()} - /> - - - - - ); -} - -MoneyRequestDescriptionPage.propTypes = propTypes; -MoneyRequestDescriptionPage.defaultProps = defaultProps; -MoneyRequestDescriptionPage.displayName = 'MoneyRequestDescriptionPage'; - -export default withOnyx({ - iou: { - key: ONYXKEYS.IOU, - }, - selectedTab: { - key: `${ONYXKEYS.COLLECTION.SELECTED_TAB}${CONST.TAB.RECEIPT_TAB_ID}`, - }, -})(MoneyRequestDescriptionPage); diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 849f3276667e..c7c0260b6a3f 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -36,7 +36,7 @@ const defaultProps = { function IOURequestStepDescription({ route: { - params: {transactionID, backTo}, + params: {action, transactionID, backTo}, }, transaction, }) { @@ -44,7 +44,7 @@ function IOURequestStepDescription({ const {translate} = useLocalize(); const inputRef = useRef(null); const focusTimeoutRef = useRef(null); - + const isDraft = action === CONST.IOU.ACTION.CREATE; useFocusEffect( useCallback(() => { focusTimeoutRef.current = setTimeout(() => { @@ -70,7 +70,7 @@ function IOURequestStepDescription({ * @param {String} value.moneyRequestComment */ const updateComment = (value) => { - IOU.setMoneyRequestDescription_temporaryForRefactor(transactionID, value.moneyRequestComment); + IOU.setMoneyRequestDescription_temporaryForRefactor(transactionID, value.moneyRequestComment, isDraft); navigateBack(); }; From c983c5fac2addd7a03fe2241029f8cd7f1f3853b Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 25 Jan 2024 15:55:07 +0700 Subject: [PATCH 022/122] move change from old description page to new one --- src/pages/iou/request/step/IOURequestStepDescription.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index c7c0260b6a3f..06a64adcf650 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -96,7 +96,7 @@ function IOURequestStepDescription({ defaultValue={lodashGet(transaction, 'comment.comment', '')} label={translate('moneyRequestConfirmationList.whatsItFor')} accessibilityLabel={translate('moneyRequestConfirmationList.whatsItFor')} - role={CONST.ACCESSIBILITY_ROLE.TEXT} + role={CONST.ROLE.PRESENTATION} ref={(el) => { if (!el) { return; @@ -106,7 +106,6 @@ function IOURequestStepDescription({ }} autoGrowHeight containerStyles={[styles.autoGrowHeightMultilineInput]} - inputStyle={[styles.verticalAlignTop]} submitOnEnter={!Browser.isMobile()} /> From d93929e61cc8f36c48ac9bc07b0a1d1035b2b8b6 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 25 Jan 2024 17:19:50 +0700 Subject: [PATCH 023/122] update logic to save description in each case --- src/libs/actions/IOU.js | 5 ++--- .../request/step/IOURequestStepDescription.js | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index c15c24c61e72..eb9541edcad2 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -201,10 +201,9 @@ function setMoneyRequestCurrency_temporaryForRefactor(transactionID, currency) { /** * @param {String} transactionID * @param {String} comment - * @param {Boolean} isDraft */ -function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment, isDraft) { - Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {comment: comment.trim()}}); +function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment) { + Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {comment: {comment: comment.trim()}}); } /** diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 06a64adcf650..72d249a964f4 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -36,7 +36,7 @@ const defaultProps = { function IOURequestStepDescription({ route: { - params: {action, transactionID, backTo}, + params: {action,iouType, transactionID, reportID, backTo}, }, transaction, }) { @@ -70,7 +70,22 @@ function IOURequestStepDescription({ * @param {String} value.moneyRequestComment */ const updateComment = (value) => { - IOU.setMoneyRequestDescription_temporaryForRefactor(transactionID, value.moneyRequestComment, isDraft); + const newComment = value.moneyRequestComment + // Only update comment if it has changed + if (newComment.trim() !== lodashGet(transaction, 'comment.comment', '')) { + if (isDraft) { + IOU.setMoneyRequestDescription_temporaryForRefactor(transactionID, newComment, isDraft); + } else { + if (iouType ===CONST.IOU.TYPE.REQUEST) { + IOU.updateMoneyRequestDescription(transaction.transactionID, reportID, newComment.trim()); + } + if (iouType ===CONST.IOU.TYPE.SPLIT) { + IOU.setDraftSplitTransaction(transaction.transactionID, { + comment: newComment.trim() + }) + } + } + } navigateBack(); }; From e6901038e62a0ff3e640c54d328e54cdba580e37 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 25 Jan 2024 17:50:43 +0700 Subject: [PATCH 024/122] fix lint --- .../iou/request/step/IOURequestStepDescription.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 72d249a964f4..650380d4615a 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -36,7 +36,7 @@ const defaultProps = { function IOURequestStepDescription({ route: { - params: {action,iouType, transactionID, reportID, backTo}, + params: {action, iouType, transactionID, reportID, backTo}, }, transaction, }) { @@ -70,19 +70,19 @@ function IOURequestStepDescription({ * @param {String} value.moneyRequestComment */ const updateComment = (value) => { - const newComment = value.moneyRequestComment + const newComment = value.moneyRequestComment; // Only update comment if it has changed if (newComment.trim() !== lodashGet(transaction, 'comment.comment', '')) { if (isDraft) { IOU.setMoneyRequestDescription_temporaryForRefactor(transactionID, newComment, isDraft); } else { - if (iouType ===CONST.IOU.TYPE.REQUEST) { + if (iouType === CONST.IOU.TYPE.REQUEST) { IOU.updateMoneyRequestDescription(transaction.transactionID, reportID, newComment.trim()); } - if (iouType ===CONST.IOU.TYPE.SPLIT) { + if (iouType === CONST.IOU.TYPE.SPLIT) { IOU.setDraftSplitTransaction(transaction.transactionID, { - comment: newComment.trim() - }) + comment: newComment.trim(), + }); } } } From f1de3f2482f11bf9350ff32bf88e658ff28c6b70 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 25 Jan 2024 18:14:38 +0700 Subject: [PATCH 025/122] fix remove redandunt changr --- .../MoneyTemporaryForRefactorRequestConfirmationList.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/MoneyTemporaryForRefactorRequestConfirmationList.js b/src/components/MoneyTemporaryForRefactorRequestConfirmationList.js index 21824ee69813..ee7a02e58527 100755 --- a/src/components/MoneyTemporaryForRefactorRequestConfirmationList.js +++ b/src/components/MoneyTemporaryForRefactorRequestConfirmationList.js @@ -709,6 +709,10 @@ function MoneyTemporaryForRefactorRequestConfirmationList({ style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} onPress={() => { + if (isEditingSplitBill) { + Navigation.navigate(ROUTES.EDIT_SPLIT_BILL.getRoute(reportID, reportActionID, CONST.EDIT_REQUEST_FIELD.MERCHANT)); + return; + } Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(iouType, transaction.transactionID, reportID, Navigation.getActiveRouteWithoutParams())); }} disabled={didConfirm} From ddbe75a9883b46112d2a0d7b42e19b2950c828ef Mon Sep 17 00:00:00 2001 From: tienifr Date: Fri, 26 Jan 2024 18:26:08 +0700 Subject: [PATCH 026/122] fix: nvalid amount error displayed when value has more than 2 decimals --- .../ReimbursementAccount/ValidationStep.js | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/pages/ReimbursementAccount/ValidationStep.js b/src/pages/ReimbursementAccount/ValidationStep.js index 41f63b22f8f3..93230189b9d9 100644 --- a/src/pages/ReimbursementAccount/ValidationStep.js +++ b/src/pages/ReimbursementAccount/ValidationStep.js @@ -20,8 +20,11 @@ import TextLink from '@components/TextLink'; import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import compose from '@libs/compose'; +import * as CurrencyUtils from '@libs/CurrencyUtils'; +import getPermittedDecimalSeparator from '@libs/getPermittedDecimalSeparator'; import BankAccount from '@libs/models/BankAccount'; import * as ValidationUtils from '@libs/ValidationUtils'; +import withPolicy from '@pages/workspace/withPolicy'; import WorkspaceResetBankAccountModal from '@pages/workspace/WorkspaceResetBankAccountModal'; import * as BankAccounts from '@userActions/BankAccounts'; import * as Report from '@userActions/Report'; @@ -61,23 +64,20 @@ const defaultProps = { * Any dollar amount (e.g. 1.12) will be returned as 112 * * @param {String} amount field input + * @param {RegExp} amountRegex * @returns {String} */ -const filterInput = (amount) => { +const filterInput = (amount, amountRegex?: RegExp) => { let value = amount ? amount.toString().trim() : ''; - if (value === '' || _.isNaN(Number(value)) || !Math.abs(Str.fromUSDToNumber(value))) { + value = value.replace(/^0+|0+$/g, ''); + if (value === '' || _.isNaN(Number(value)) || !Math.abs(Str.fromUSDToNumber(value)) || (amountRegex && !amountRegex.test(value))) { return ''; } - // If the user enters the values in dollars, convert it to the respective cents amount - if (_.contains(value, '.')) { - value = Str.fromUSDToNumber(value); - } - return value; }; -function ValidationStep({reimbursementAccount, translate, onBackButtonPress, account, policyID}) { +function ValidationStep({reimbursementAccount, translate, onBackButtonPress, account, policyID, toLocaleDigit, policy}) { const styles = useThemeStyles(); /** * @param {Object} values - form input values passed by the Form component @@ -85,9 +85,13 @@ function ValidationStep({reimbursementAccount, translate, onBackButtonPress, acc */ const validate = (values) => { const errors = {}; + const decimalSeparator = toLocaleDigit('.'); + const outputCurrency = lodashGet(policy, 'outputCurrency', CONST.CURRENCY.USD); + + const amountRegex = RegExp(String.raw`^-?\d{0,8}([${getPermittedDecimalSeparator(decimalSeparator)}]\d{0,${CurrencyUtils.getCurrencyDecimals(outputCurrency)}})?$`, 'i'); _.each(values, (value, key) => { - const filteredValue = typeof value === 'string' ? filterInput(value) : value; + const filteredValue = typeof value === 'string' ? filterInput(value, amountRegex) : value; if (ValidationUtils.isRequiredFulfilled(filteredValue)) { return; } @@ -231,6 +235,7 @@ ValidationStep.displayName = 'ValidationStep'; export default compose( withLocalize, + withPolicy, withOnyx({ account: { key: ONYXKEYS.ACCOUNT, From 8cf2f20d097b97a7a97b4eba1e351d98a94723a2 Mon Sep 17 00:00:00 2001 From: tienifr Date: Fri, 26 Jan 2024 18:35:28 +0700 Subject: [PATCH 027/122] fix remove type --- src/pages/ReimbursementAccount/ValidationStep.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ReimbursementAccount/ValidationStep.js b/src/pages/ReimbursementAccount/ValidationStep.js index 93230189b9d9..2bebb4689440 100644 --- a/src/pages/ReimbursementAccount/ValidationStep.js +++ b/src/pages/ReimbursementAccount/ValidationStep.js @@ -67,7 +67,7 @@ const defaultProps = { * @param {RegExp} amountRegex * @returns {String} */ -const filterInput = (amount, amountRegex?: RegExp) => { +const filterInput = (amount, amountRegex) => { let value = amount ? amount.toString().trim() : ''; value = value.replace(/^0+|0+$/g, ''); if (value === '' || _.isNaN(Number(value)) || !Math.abs(Str.fromUSDToNumber(value)) || (amountRegex && !amountRegex.test(value))) { From b758b32583faaa374ffcae91be46944642867665 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20M=C3=B3rawski?= Date: Fri, 26 Jan 2024 14:36:55 +0100 Subject: [PATCH 028/122] referral cta bottom padding fix --- src/pages/SearchPage/SearchPageFooter.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/SearchPage/SearchPageFooter.tsx b/src/pages/SearchPage/SearchPageFooter.tsx index e0ef67ad9ec3..3d5ebfd2c193 100644 --- a/src/pages/SearchPage/SearchPageFooter.tsx +++ b/src/pages/SearchPage/SearchPageFooter.tsx @@ -8,7 +8,7 @@ function SearchPageFooter() { const themeStyles = useThemeStyles(); return ( - + ); From 61632f52e24a3363119c5657824c559c2b9ea96a Mon Sep 17 00:00:00 2001 From: Dylan Date: Sat, 27 Jan 2024 11:18:25 +0700 Subject: [PATCH 029/122] move logic to IOU.js --- src/libs/actions/IOU.js | 32 ++++++++++++++----- .../request/step/IOURequestStepDescription.js | 20 ++---------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index eb9541edcad2..73d90d1a5e8c 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -198,14 +198,6 @@ function setMoneyRequestCurrency_temporaryForRefactor(transactionID, currency) { Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {currency}); } -/** - * @param {String} transactionID - * @param {String} comment - */ -function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment) { - Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {comment: {comment: comment.trim()}}); -} - /** * @param {String} transactionID * @param {String} merchant @@ -3698,6 +3690,30 @@ function getIOUReportID(iou, route) { return lodashGet(route, 'params.reportID') || lodashGet(iou, 'participants.0.reportID', ''); } +/** + * @param {Object} transaction + * @param {String} comment + * @param {Boolean} isDraft + * @param {String} iouType + * @param {String} reportID + */ +function setMoneyRequestDescription_temporaryForRefactor(transaction, comment, isDraft, iouType, reportID) { + // Only update comment if it has changed + if (comment.trim() === lodashGet(transaction, 'comment.comment', '')) { + return; + } + if (isDraft) { + Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction.transactionID}`, {comment: {comment}}); + } else { + if (iouType === CONST.IOU.TYPE.REQUEST) { + updateMoneyRequestDescription(transaction.transactionID, reportID, comment); + } + if (iouType === CONST.IOU.TYPE.SPLIT) { + setDraftSplitTransaction(transaction.transactionID, {comment}); + } + } +} + export { setMoneyRequestParticipants, createDistanceRequest, diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 650380d4615a..ea16219fc380 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -36,7 +36,7 @@ const defaultProps = { function IOURequestStepDescription({ route: { - params: {action, iouType, transactionID, reportID, backTo}, + params: {action, iouType, reportID, backTo}, }, transaction, }) { @@ -70,22 +70,8 @@ function IOURequestStepDescription({ * @param {String} value.moneyRequestComment */ const updateComment = (value) => { - const newComment = value.moneyRequestComment; - // Only update comment if it has changed - if (newComment.trim() !== lodashGet(transaction, 'comment.comment', '')) { - if (isDraft) { - IOU.setMoneyRequestDescription_temporaryForRefactor(transactionID, newComment, isDraft); - } else { - if (iouType === CONST.IOU.TYPE.REQUEST) { - IOU.updateMoneyRequestDescription(transaction.transactionID, reportID, newComment.trim()); - } - if (iouType === CONST.IOU.TYPE.SPLIT) { - IOU.setDraftSplitTransaction(transaction.transactionID, { - comment: newComment.trim(), - }); - } - } - } + const newComment = value.moneyRequestComment.trim(); + IOU.setMoneyRequestDescription_temporaryForRefactor(transaction, newComment, isDraft, iouType, reportID); navigateBack(); }; From da8f7602cc7e72130d172b0b818e34b6cc592dc3 Mon Sep 17 00:00:00 2001 From: Dylan Date: Sun, 28 Jan 2024 15:09:06 +0700 Subject: [PATCH 030/122] remove comment --- src/pages/EditRequestPage.js | 23 ----------------------- src/pages/EditSplitBillPage.js | 14 -------------- 2 files changed, 37 deletions(-) diff --git a/src/pages/EditRequestPage.js b/src/pages/EditRequestPage.js index b57d65726389..6277dc64b874 100644 --- a/src/pages/EditRequestPage.js +++ b/src/pages/EditRequestPage.js @@ -180,29 +180,6 @@ function EditRequestPage({report, route, policyCategories, policyTags, parentRep [transactionCategory, transaction.transactionID, report.reportID], ); - // I removed EditRequestDescriptionPage because we won't use this component anymore. This page EditRequestPage also be removed in https://github.com/Expensify/App/issues/29107 - - // const saveComment = useCallback( - // ({comment: newComment}) => { - // // Only update comment if it has changed - // if (newComment.trim() !== transactionDescription) { - // IOU.updateMoneyRequestDescription(transaction.transactionID, report.reportID, newComment.trim()); - // } - // Navigation.dismissModal(); - // }, - // [transactionDescription, transaction.transactionID, report.reportID], - // ); - - // - // if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DESCRIPTION) { - // return ( - // - // ); - // } - if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DATE) { return ( { - // setDraftSplitTransaction({ - // comment: transactionChanges.comment.trim(), - // }); - // }} - // /> - // ); - // } - if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DATE) { return ( Date: Sun, 28 Jan 2024 20:19:53 +0700 Subject: [PATCH 031/122] fix lint --- .../HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js index f5a8e79ae2b9..4da34cf7ba0c 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js +++ b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js @@ -11,7 +11,6 @@ import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalD import useLocalize from '@hooks/useLocalize'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as LocalePhoneNumber from '@libs/LocalePhoneNumber'; import Navigation from '@libs/Navigation/Navigation'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as ReportUtils from '@libs/ReportUtils'; @@ -31,7 +30,6 @@ const propTypes = { function MentionUserRenderer(props) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); - const {translate} = useLocalize(); const defaultRendererProps = _.omit(props, ['TDefaultRenderer', 'style']); const htmlAttributeAccountID = lodashGet(props.tnode.attributes, 'accountid'); const personalDetails = usePersonalDetails() || CONST.EMPTY_OBJECT; From ccc3f5a5f79aa6d239b15c6231de12f535bf74bf Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 29 Jan 2024 12:15:26 +0700 Subject: [PATCH 032/122] remove comment --- src/libs/actions/IOU.js | 14 +++++--------- src/pages/EditRequestPage.js | 2 -- src/pages/EditSplitBillPage.js | 2 -- .../iou/request/step/IOURequestStepDescription.js | 5 ++++- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index fb9e7252a4c5..89edcb6438c8 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -3716,25 +3716,21 @@ function getIOUReportID(iou, route) { } /** - * @param {Object} transaction + * @param {String} transactionID * @param {String} comment * @param {Boolean} isDraft * @param {String} iouType * @param {String} reportID */ -function setMoneyRequestDescription_temporaryForRefactor(transaction, comment, isDraft, iouType, reportID) { - // Only update comment if it has changed - if (comment.trim() === lodashGet(transaction, 'comment.comment', '')) { - return; - } +function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment, isDraft, iouType, reportID) { if (isDraft) { - Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction.transactionID}`, {comment: {comment}}); + Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {comment: {comment}}); } else { if (iouType === CONST.IOU.TYPE.REQUEST) { - updateMoneyRequestDescription(transaction.transactionID, reportID, comment); + updateMoneyRequestDescription(transactionID, reportID, comment); } if (iouType === CONST.IOU.TYPE.SPLIT) { - setDraftSplitTransaction(transaction.transactionID, {comment}); + setDraftSplitTransaction(transactionID, {comment}); } } } diff --git a/src/pages/EditRequestPage.js b/src/pages/EditRequestPage.js index 6277dc64b874..7e1a9f7d9b7b 100644 --- a/src/pages/EditRequestPage.js +++ b/src/pages/EditRequestPage.js @@ -22,7 +22,6 @@ import ROUTES from '@src/ROUTES'; import EditRequestAmountPage from './EditRequestAmountPage'; import EditRequestCategoryPage from './EditRequestCategoryPage'; import EditRequestCreatedPage from './EditRequestCreatedPage'; -// import EditRequestDescriptionPage from './EditRequestDescriptionPage'; import EditRequestDistancePage from './EditRequestDistancePage'; import EditRequestMerchantPage from './EditRequestMerchantPage'; import EditRequestReceiptPage from './EditRequestReceiptPage'; @@ -74,7 +73,6 @@ function EditRequestPage({report, route, policyCategories, policyTags, parentRep const { amount: transactionAmount, currency: transactionCurrency, - // comment: transactionDescription, merchant: transactionMerchant, category: transactionCategory, tag: transactionTag, diff --git a/src/pages/EditSplitBillPage.js b/src/pages/EditSplitBillPage.js index 1d4dff90d490..1243095a3701 100644 --- a/src/pages/EditSplitBillPage.js +++ b/src/pages/EditSplitBillPage.js @@ -15,7 +15,6 @@ import ROUTES from '@src/ROUTES'; import EditRequestAmountPage from './EditRequestAmountPage'; import EditRequestCategoryPage from './EditRequestCategoryPage'; import EditRequestCreatedPage from './EditRequestCreatedPage'; -// import EditRequestDescriptionPage from './EditRequestDescriptionPage'; import EditRequestMerchantPage from './EditRequestMerchantPage'; import EditRequestTagPage from './EditRequestTagPage'; import reportPropTypes from './reportPropTypes'; @@ -58,7 +57,6 @@ function EditSplitBillPage({route, transaction, draftTransaction, report}) { const { amount: transactionAmount, currency: transactionCurrency, - // comment: transactionDescription, merchant: transactionMerchant, created: transactionCreated, category: transactionCategory, diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index ea16219fc380..1be4965de1e4 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -71,7 +71,10 @@ function IOURequestStepDescription({ */ const updateComment = (value) => { const newComment = value.moneyRequestComment.trim(); - IOU.setMoneyRequestDescription_temporaryForRefactor(transaction, newComment, isDraft, iouType, reportID); + // Only update comment if it has changed + if (newComment !== lodashGet(transaction, 'comment.comment', '')) { + IOU.setMoneyRequestDescription_temporaryForRefactor(transaction.transactionID, newComment, isDraft, iouType, reportID); + } navigateBack(); }; From caaf8c1994f24a701033e8ab141caaf6a3575757 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Mon, 29 Jan 2024 14:33:58 +0700 Subject: [PATCH 033/122] fix lint --- .../HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js index 4da34cf7ba0c..744fd17d461f 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js +++ b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js @@ -8,7 +8,6 @@ import {ShowContextMenuContext, showContextMenuForReport} from '@components/Show import Text from '@components/Text'; import UserDetailsTooltip from '@components/UserDetailsTooltip'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; -import useLocalize from '@hooks/useLocalize'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; From 481119fccc7e85675891f627e1fdce58e8791fb5 Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 30 Jan 2024 11:39:19 +0700 Subject: [PATCH 034/122] update logic split flow --- src/libs/actions/IOU.js | 29 ++++++------------- .../request/step/IOURequestStepDescription.js | 14 ++++++++- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 89edcb6438c8..0911c3a377c8 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -199,6 +199,15 @@ function setMoneyRequestCurrency_temporaryForRefactor(transactionID, currency) { Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {currency}); } +/** + * @param {String} transactionID + * @param {String} comment + * @param {Boolean} isDraft + */ +function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment, isDraft) { + Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {comment: comment.trim()}}); +} + /** * @param {String} transactionID * @param {String} merchant @@ -3715,26 +3724,6 @@ function getIOUReportID(iou, route) { return lodashGet(route, 'params.reportID') || lodashGet(iou, 'participants.0.reportID', ''); } -/** - * @param {String} transactionID - * @param {String} comment - * @param {Boolean} isDraft - * @param {String} iouType - * @param {String} reportID - */ -function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment, isDraft, iouType, reportID) { - if (isDraft) { - Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {comment: {comment}}); - } else { - if (iouType === CONST.IOU.TYPE.REQUEST) { - updateMoneyRequestDescription(transactionID, reportID, comment); - } - if (iouType === CONST.IOU.TYPE.SPLIT) { - setDraftSplitTransaction(transactionID, {comment}); - } - } -} - /** * @param {String} receiptFilename * @param {String} receiptPath diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 1be4965de1e4..fda51b113a96 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -73,7 +73,19 @@ function IOURequestStepDescription({ const newComment = value.moneyRequestComment.trim(); // Only update comment if it has changed if (newComment !== lodashGet(transaction, 'comment.comment', '')) { - IOU.setMoneyRequestDescription_temporaryForRefactor(transaction.transactionID, newComment, isDraft, iouType, reportID); + if (iouType === CONST.IOU.TYPE.REQUEST) { + IOU.setMoneyRequestDescription_temporaryForRefactor(transaction.transactionID, newComment, isDraft); + if (isDraft) { + IOU.updateMoneyRequestDescription(transaction.transactionID, reportID, newComment); + } + } + if (iouType === CONST.IOU.TYPE.SPLIT) { + if (isDraft) { + IOU.setMoneyRequestDescription_temporaryForRefactor(transaction.transactionID, newComment, isDraft); + } else { + IOU.setDraftSplitTransaction(transaction.transactionID, {newComment}); + } + } } navigateBack(); }; From 1c4544110b4968d5d00c1973d8d6fef2de7c6dc7 Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 30 Jan 2024 17:40:23 +0700 Subject: [PATCH 035/122] early return and update name --- src/libs/actions/IOU.js | 12 ++-------- .../request/step/IOURequestStepDescription.js | 24 ++++++++++--------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 4c1526a61ea7..9870877c1229 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -204,7 +204,7 @@ function setMoneyRequestCurrency_temporaryForRefactor(transactionID, currency) { * @param {String} comment * @param {Boolean} isDraft */ -function setMoneyRequestDescription_temporaryForRefactor(transactionID, comment, isDraft) { +function setMoneyRequestDescription(transactionID, comment, isDraft) { Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {comment: comment.trim()}}); } @@ -3587,13 +3587,6 @@ function setMoneyRequestCurrency(currency) { Onyx.merge(ONYXKEYS.IOU, {currency}); } -/** - * @param {String} comment - */ -function setMoneyRequestDescription(comment) { - Onyx.merge(ONYXKEYS.IOU, {comment: comment.trim()}); -} - /** * @param {String} merchant */ @@ -3780,7 +3773,7 @@ export { setMoneyRequestCategory_temporaryForRefactor, setMoneyRequestCreated_temporaryForRefactor, setMoneyRequestCurrency_temporaryForRefactor, - setMoneyRequestDescription_temporaryForRefactor, + setMoneyRequestDescription, setMoneyRequestMerchant_temporaryForRefactor, setMoneyRequestParticipants_temporaryForRefactor, setMoneyRequestReceipt, @@ -3790,7 +3783,6 @@ export { setMoneyRequestCategory, setMoneyRequestCreated, setMoneyRequestCurrency, - setMoneyRequestDescription, setMoneyRequestId, setMoneyRequestMerchant, setMoneyRequestParticipantsFromReport, diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index fda51b113a96..51e6737173e2 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -73,18 +73,20 @@ function IOURequestStepDescription({ const newComment = value.moneyRequestComment.trim(); // Only update comment if it has changed if (newComment !== lodashGet(transaction, 'comment.comment', '')) { - if (iouType === CONST.IOU.TYPE.REQUEST) { - IOU.setMoneyRequestDescription_temporaryForRefactor(transaction.transactionID, newComment, isDraft); - if (isDraft) { - IOU.updateMoneyRequestDescription(transaction.transactionID, reportID, newComment); - } + navigateBack(); + return; + } + if (iouType === CONST.IOU.TYPE.REQUEST) { + IOU.setMoneyRequestDescription(transaction.transactionID, newComment, isDraft); + if (!isDraft) { + IOU.updateMoneyRequestDescription(transaction.transactionID, reportID, newComment); } - if (iouType === CONST.IOU.TYPE.SPLIT) { - if (isDraft) { - IOU.setMoneyRequestDescription_temporaryForRefactor(transaction.transactionID, newComment, isDraft); - } else { - IOU.setDraftSplitTransaction(transaction.transactionID, {newComment}); - } + } + if (iouType === CONST.IOU.TYPE.SPLIT) { + if (isDraft) { + IOU.setMoneyRequestDescription(transaction.transactionID, newComment, isDraft); + } else { + IOU.setDraftSplitTransaction(transaction.transactionID, {newComment}); } } navigateBack(); From 37a228056a82ca9e0c239991681902b009e4fe1e Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 30 Jan 2024 18:54:01 +0700 Subject: [PATCH 036/122] clean code --- .../request/step/IOURequestStepDescription.js | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 51e6737173e2..3044bb0ee6be 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -76,19 +76,19 @@ function IOURequestStepDescription({ navigateBack(); return; } - if (iouType === CONST.IOU.TYPE.REQUEST) { - IOU.setMoneyRequestDescription(transaction.transactionID, newComment, isDraft); - if (!isDraft) { - IOU.updateMoneyRequestDescription(transaction.transactionID, reportID, newComment); - } + // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value + if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT) { + IOU.setDraftSplitTransaction(transaction.transactionID, {newComment}); + navigateBack(); + return; } - if (iouType === CONST.IOU.TYPE.SPLIT) { - if (isDraft) { - IOU.setMoneyRequestDescription(transaction.transactionID, newComment, isDraft); - } else { - IOU.setDraftSplitTransaction(transaction.transactionID, {newComment}); - } + + IOU.setMoneyRequestDescription(transaction.transactionID, newComment, action === CONST.IOU.ACTION.CREATE); + + if (action === CONST.IOU.ACTION.EDIT) { + IOU.updateMoneyRequestDescription(transaction.transactionID, reportID, newComment); } + navigateBack(); }; From 9cb9602c660c67df10d68898a28988c1421f073c Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 30 Jan 2024 19:01:42 +0700 Subject: [PATCH 037/122] clean code --- src/pages/iou/request/step/IOURequestStepDescription.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 3044bb0ee6be..de934f1e9fb5 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -44,7 +44,6 @@ function IOURequestStepDescription({ const {translate} = useLocalize(); const inputRef = useRef(null); const focusTimeoutRef = useRef(null); - const isDraft = action === CONST.IOU.ACTION.CREATE; useFocusEffect( useCallback(() => { focusTimeoutRef.current = setTimeout(() => { From 08ac5dce492ff3201594499194a9a0b9ff706439 Mon Sep 17 00:00:00 2001 From: DylanDylann <141406735+DylanDylann@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:33:03 +0700 Subject: [PATCH 038/122] Update src/pages/iou/request/step/IOURequestStepDescription.js Co-authored-by: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> --- src/pages/iou/request/step/IOURequestStepDescription.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index de934f1e9fb5..4ff95f2d5157 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -71,7 +71,7 @@ function IOURequestStepDescription({ const updateComment = (value) => { const newComment = value.moneyRequestComment.trim(); // Only update comment if it has changed - if (newComment !== lodashGet(transaction, 'comment.comment', '')) { + if (newComment === lodashGet(transaction, 'comment.comment', '')) { navigateBack(); return; } From 223373475223cc3d412d265f410fb9f45f7be483 Mon Sep 17 00:00:00 2001 From: Dylan Date: Tue, 30 Jan 2024 19:41:23 +0700 Subject: [PATCH 039/122] update iouType params --- src/components/MoneyRequestConfirmationList.js | 5 +---- .../iou/request/step/IOURequestStepDescription.js | 12 +++++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index cdbefc3594d0..3b95b12adad3 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -663,13 +663,10 @@ function MoneyRequestConfirmationList(props) { title={props.iouComment} description={translate('common.description')} onPress={() => { - if (!props.isEditingSplitBill) { - return; - } Navigation.navigate( ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute( CONST.IOU.ACTION.EDIT, - CONST.IOU.TYPE.SPLIT, + props.iouType, transaction.transactionID, props.reportID, Navigation.getActiveRouteWithoutParams(), diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 4ff95f2d5157..ee74e22afcd0 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -70,17 +70,19 @@ function IOURequestStepDescription({ */ const updateComment = (value) => { const newComment = value.moneyRequestComment.trim(); - // Only update comment if it has changed - if (newComment === lodashGet(transaction, 'comment.comment', '')) { - navigateBack(); - return; - } + // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT) { IOU.setDraftSplitTransaction(transaction.transactionID, {newComment}); navigateBack(); return; } + + // Only update comment if it has changed + if (newComment === lodashGet(transaction, 'comment.comment', '')) { + navigateBack(); + return; + } IOU.setMoneyRequestDescription(transaction.transactionID, newComment, action === CONST.IOU.ACTION.CREATE); From 28af0b859451961b1e4ed0fc89ca086fc2528753 Mon Sep 17 00:00:00 2001 From: Dylan Date: Wed, 31 Jan 2024 00:22:24 +0700 Subject: [PATCH 040/122] fix lint --- src/pages/iou/request/step/IOURequestStepDescription.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index ee74e22afcd0..41ddcc0c8feb 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -70,14 +70,14 @@ function IOURequestStepDescription({ */ const updateComment = (value) => { const newComment = value.moneyRequestComment.trim(); - + // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT) { IOU.setDraftSplitTransaction(transaction.transactionID, {newComment}); navigateBack(); return; } - + // Only update comment if it has changed if (newComment === lodashGet(transaction, 'comment.comment', '')) { navigateBack(); From a9e244750e68fa032a3b7cea0c0e0024f190e5a5 Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Wed, 31 Jan 2024 15:42:36 +0100 Subject: [PATCH 041/122] ref: remove push-notification-ios mocks since they are not needed --- __mocks__/@react-native-community/push-notification-ios.js | 5 ----- __mocks__/push-notification-ios.js | 5 ----- 2 files changed, 10 deletions(-) delete mode 100644 __mocks__/@react-native-community/push-notification-ios.js delete mode 100644 __mocks__/push-notification-ios.js diff --git a/__mocks__/@react-native-community/push-notification-ios.js b/__mocks__/@react-native-community/push-notification-ios.js deleted file mode 100644 index 0fe8354b9e08..000000000000 --- a/__mocks__/@react-native-community/push-notification-ios.js +++ /dev/null @@ -1,5 +0,0 @@ -export default { - addEventListener: jest.fn(), - requestPermissions: jest.fn(() => Promise.resolve()), - getInitialNotification: jest.fn(() => Promise.resolve()), -}; diff --git a/__mocks__/push-notification-ios.js b/__mocks__/push-notification-ios.js deleted file mode 100644 index 0fe8354b9e08..000000000000 --- a/__mocks__/push-notification-ios.js +++ /dev/null @@ -1,5 +0,0 @@ -export default { - addEventListener: jest.fn(), - requestPermissions: jest.fn(() => Promise.resolve()), - getInitialNotification: jest.fn(() => Promise.resolve()), -}; From 15d86b48d6a8e21642210e5c52c8afcefceef9c9 Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Wed, 31 Jan 2024 15:35:12 +0000 Subject: [PATCH 042/122] [TS migration] Migrate @react-native-firebase/perf.js mock --- __mocks__/@react-native-firebase/perf.js | 1 - __mocks__/@react-native-firebase/perf.ts | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) delete mode 100644 __mocks__/@react-native-firebase/perf.js create mode 100644 __mocks__/@react-native-firebase/perf.ts diff --git a/__mocks__/@react-native-firebase/perf.js b/__mocks__/@react-native-firebase/perf.js deleted file mode 100644 index 2d1ec238274a..000000000000 --- a/__mocks__/@react-native-firebase/perf.js +++ /dev/null @@ -1 +0,0 @@ -export default () => {}; diff --git a/__mocks__/@react-native-firebase/perf.ts b/__mocks__/@react-native-firebase/perf.ts new file mode 100644 index 000000000000..e304b1a1f007 --- /dev/null +++ b/__mocks__/@react-native-firebase/perf.ts @@ -0,0 +1,5 @@ +type PerfMock = () => void; + +const perfMock: PerfMock = () => {}; + +export default perfMock; From c74a850bcf32d5e350deb2212ace63c94d27fde4 Mon Sep 17 00:00:00 2001 From: Abdelrahman Khattab Date: Thu, 1 Feb 2024 02:48:15 +0200 Subject: [PATCH 043/122] Show participant name in non reimbursable transactions --- src/components/ReportActionItem/ReportPreview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 52e9d94eaefd..bb44f54640e8 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -201,7 +201,7 @@ function ReportPreview({ if (isApproved) { return translate('iou.managerApproved', {manager: payerOrApproverName}); } - const managerName = isPolicyExpenseChat ? ReportUtils.getPolicyName(chatReport) : ReportUtils.getDisplayNameForParticipant(managerID, true); + const managerName = isPolicyExpenseChat && !hasNonReimbursableTransactions ? ReportUtils.getPolicyName(chatReport) : ReportUtils.getDisplayNameForParticipant(managerID, true); let paymentVerb: TranslationPaths = hasNonReimbursableTransactions ? 'iou.payerSpent' : 'iou.payerOwes'; if (iouSettled || iouReport?.isWaitingOnBankAccount) { paymentVerb = 'iou.payerPaid'; From ee9aec05f8b5855386dc88845a0956a562a52ddc Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:00:12 +0100 Subject: [PATCH 044/122] add icons --- .../simple-illustration__profile.svg | 6 ++++++ src/components/HeaderWithBackButton/index.tsx | 9 +++++++++ src/components/HeaderWithBackButton/types.ts | 3 +++ src/components/Icon/Illustrations.ts | 2 ++ src/pages/settings/Profile/ProfilePage.js | 2 ++ 5 files changed, 22 insertions(+) create mode 100644 assets/images/simple-illustrations/simple-illustration__profile.svg diff --git a/assets/images/simple-illustrations/simple-illustration__profile.svg b/assets/images/simple-illustrations/simple-illustration__profile.svg new file mode 100644 index 000000000000..be704403f18e --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__profile.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/components/HeaderWithBackButton/index.tsx b/src/components/HeaderWithBackButton/index.tsx index 6c89221d9217..0476151a382b 100755 --- a/src/components/HeaderWithBackButton/index.tsx +++ b/src/components/HeaderWithBackButton/index.tsx @@ -22,6 +22,7 @@ import ROUTES from '@src/ROUTES'; import type HeaderWithBackButtonProps from './types'; function HeaderWithBackButton({ + icon, iconFill, guidesCallTaskID = '', onBackButtonPress = () => Navigation.goBack(ROUTES.HOME), @@ -100,6 +101,14 @@ function HeaderWithBackButton({ )} + {icon && ( + + )} {shouldShowAvatarWithDisplay ? ( & { /** Title color */ titleColor?: string; + /** Icon displayed on the left of the title */ + icon?: IconAsset; + /** Method to trigger when pressing download button of the header */ onDownloadButtonPress?: () => void; diff --git a/src/components/Icon/Illustrations.ts b/src/components/Icon/Illustrations.ts index 954c8d0392fc..7364a6d1a4de 100644 --- a/src/components/Icon/Illustrations.ts +++ b/src/components/Icon/Illustrations.ts @@ -50,6 +50,7 @@ import MoneyBadge from '@assets/images/simple-illustrations/simple-illustration_ import MoneyIntoWallet from '@assets/images/simple-illustrations/simple-illustration__moneyintowallet.svg'; import MoneyWings from '@assets/images/simple-illustrations/simple-illustration__moneywings.svg'; import OpenSafe from '@assets/images/simple-illustrations/simple-illustration__opensafe.svg'; +import Profile from '@assets/images/simple-illustrations/simple-illustration__profile.svg'; import SanFrancisco from '@assets/images/simple-illustrations/simple-illustration__sanfrancisco.svg'; import ShieldYellow from '@assets/images/simple-illustrations/simple-illustration__shield.svg'; import SmallRocket from '@assets/images/simple-illustrations/simple-illustration__smallrocket.svg'; @@ -118,4 +119,5 @@ export { CommentBubbles, TrashCan, TeleScope, + Profile, }; diff --git a/src/pages/settings/Profile/ProfilePage.js b/src/pages/settings/Profile/ProfilePage.js index c090a478f416..204fe3452db0 100755 --- a/src/pages/settings/Profile/ProfilePage.js +++ b/src/pages/settings/Profile/ProfilePage.js @@ -6,6 +6,7 @@ import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; +import * as Illustrations from '@components/Icon/Illustrations'; import MenuItem from '@components/MenuItem'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -111,6 +112,7 @@ function ProfilePage(props) { title={props.translate('common.profile')} onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS)} shouldShowBackButton={props.isSmallScreenWidth} + icon={Illustrations.Profile} /> From ae789f71968239062d026ebb60424b966449d0c4 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:08:57 +0100 Subject: [PATCH 045/122] add remaining icons --- .../simple-illustration__gears.svg | 101 ++++++++++++++++++ .../simple-illustration__lockclosed.svg | 17 +++ .../simple-illustration__palmtree.svg | 15 +++ .../simple-illustration__qr-code.svg | 4 + src/components/Icon/Illustrations.ts | 8 ++ src/pages/ShareCodePage.js | 2 + src/pages/settings/AboutPage/AboutPage.tsx | 2 + .../settings/Preferences/PreferencesPage.js | 2 + .../Security/SecuritySettingsPage.tsx | 3 + .../settings/Wallet/WalletPage/WalletPage.js | 1 + 10 files changed, 155 insertions(+) create mode 100644 assets/images/simple-illustrations/simple-illustration__gears.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__lockclosed.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__palmtree.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__qr-code.svg diff --git a/assets/images/simple-illustrations/simple-illustration__gears.svg b/assets/images/simple-illustrations/simple-illustration__gears.svg new file mode 100644 index 000000000000..3b4cbc001e3b --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__gears.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/simple-illustrations/simple-illustration__lockclosed.svg b/assets/images/simple-illustrations/simple-illustration__lockclosed.svg new file mode 100644 index 000000000000..3779b92b0b0f --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__lockclosed.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/images/simple-illustrations/simple-illustration__palmtree.svg b/assets/images/simple-illustrations/simple-illustration__palmtree.svg new file mode 100644 index 000000000000..2aef4956cde9 --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__palmtree.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/assets/images/simple-illustrations/simple-illustration__qr-code.svg b/assets/images/simple-illustrations/simple-illustration__qr-code.svg new file mode 100644 index 000000000000..10268d747588 --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__qr-code.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/Icon/Illustrations.ts b/src/components/Icon/Illustrations.ts index 7364a6d1a4de..51422e7b4a49 100644 --- a/src/components/Icon/Illustrations.ts +++ b/src/components/Icon/Illustrations.ts @@ -37,11 +37,13 @@ import ConciergeBubble from '@assets/images/simple-illustrations/simple-illustra import ConciergeNew from '@assets/images/simple-illustrations/simple-illustration__concierge.svg'; import CreditCardsNew from '@assets/images/simple-illustrations/simple-illustration__credit-cards.svg'; import EmailAddress from '@assets/images/simple-illustrations/simple-illustration__email-address.svg'; +import Gears from '@assets/images/simple-illustrations/simple-illustration__gears.svg'; import HandCard from '@assets/images/simple-illustrations/simple-illustration__handcard.svg'; import HandEarth from '@assets/images/simple-illustrations/simple-illustration__handearth.svg'; import HotDogStand from '@assets/images/simple-illustrations/simple-illustration__hotdogstand.svg'; import Hourglass from '@assets/images/simple-illustrations/simple-illustration__hourglass.svg'; import InvoiceBlue from '@assets/images/simple-illustrations/simple-illustration__invoice.svg'; +import LockClosed from '@assets/images/simple-illustrations/simple-illustration__lockclosed.svg'; import LockOpen from '@assets/images/simple-illustrations/simple-illustration__lockopen.svg'; import Luggage from '@assets/images/simple-illustrations/simple-illustration__luggage.svg'; import Mailbox from '@assets/images/simple-illustrations/simple-illustration__mailbox.svg'; @@ -50,7 +52,9 @@ import MoneyBadge from '@assets/images/simple-illustrations/simple-illustration_ import MoneyIntoWallet from '@assets/images/simple-illustrations/simple-illustration__moneyintowallet.svg'; import MoneyWings from '@assets/images/simple-illustrations/simple-illustration__moneywings.svg'; import OpenSafe from '@assets/images/simple-illustrations/simple-illustration__opensafe.svg'; +import PalmTree from '@assets/images/simple-illustrations/simple-illustration__palmtree.svg'; import Profile from '@assets/images/simple-illustrations/simple-illustration__profile.svg'; +import QrCode from '@assets/images/simple-illustrations/simple-illustration__qr-code.svg'; import SanFrancisco from '@assets/images/simple-illustrations/simple-illustration__sanfrancisco.svg'; import ShieldYellow from '@assets/images/simple-illustrations/simple-illustration__shield.svg'; import SmallRocket from '@assets/images/simple-illustrations/simple-illustration__smallrocket.svg'; @@ -120,4 +124,8 @@ export { TrashCan, TeleScope, Profile, + PalmTree, + LockClosed, + Gears, + QrCode, }; diff --git a/src/pages/ShareCodePage.js b/src/pages/ShareCodePage.js index 3f0ef6ca138e..94f74b9f21b6 100644 --- a/src/pages/ShareCodePage.js +++ b/src/pages/ShareCodePage.js @@ -6,6 +6,7 @@ import expensifyLogo from '@assets/images/expensify-logo-round-transparent.png'; import ContextMenuItem from '@components/ContextMenuItem'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; +import * as Illustrations from '@components/Icon/Illustrations'; import MenuItem from '@components/MenuItem'; import QRShareWithDownload from '@components/QRShare/QRShareWithDownload'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -88,6 +89,7 @@ class ShareCodePage extends React.Component { title={this.props.translate('common.shareCode')} onBackButtonPress={() => Navigation.goBack(isReport ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(this.props.report.reportID) : ROUTES.SETTINGS)} shouldShowBackButton={isReport || this.props.isSmallScreenWidth} + icon={Illustrations.QrCode} /> diff --git a/src/pages/settings/AboutPage/AboutPage.tsx b/src/pages/settings/AboutPage/AboutPage.tsx index f19c9eb2d534..375df9b2864b 100644 --- a/src/pages/settings/AboutPage/AboutPage.tsx +++ b/src/pages/settings/AboutPage/AboutPage.tsx @@ -4,6 +4,7 @@ import {View} from 'react-native'; import type {GestureResponderEvent, Text as RNText} from 'react-native'; import DeviceInfo from 'react-native-device-info'; import * as Expensicons from '@components/Icon/Expensicons'; +import * as Illustrations from '@components/Icon/Illustrations'; import IllustratedHeaderPageLayout from '@components/IllustratedHeaderPageLayout'; import LottieAnimations from '@components/LottieAnimations'; import MenuItemList from '@components/MenuItemList'; @@ -132,6 +133,7 @@ function AboutPage() { backgroundColor={theme.PAGE_THEMES[SCREENS.SETTINGS.ABOUT].backgroundColor} overlayContent={overlayContent} shouldShowOfflineIndicatorInWideScreen + icon={Illustrations.PalmTree} > {translate('footer.aboutExpensify')} diff --git a/src/pages/settings/Preferences/PreferencesPage.js b/src/pages/settings/Preferences/PreferencesPage.js index da0d87afe932..a81a0738c2b9 100755 --- a/src/pages/settings/Preferences/PreferencesPage.js +++ b/src/pages/settings/Preferences/PreferencesPage.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; +import * as Illustrations from '@components/Icon/Illustrations'; import IllustratedHeaderPageLayout from '@components/IllustratedHeaderPageLayout'; import LottieAnimations from '@components/LottieAnimations'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; @@ -55,6 +56,7 @@ function PreferencesPage(props) { illustration={LottieAnimations.PreferencesDJ} shouldShowBackButton={isSmallScreenWidth} shouldShowOfflineIndicatorInWideScreen + icon={Illustrations.Gears} > diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.js b/src/pages/settings/Wallet/WalletPage/WalletPage.js index 989b4f8838b9..417d5b890dea 100644 --- a/src/pages/settings/Wallet/WalletPage/WalletPage.js +++ b/src/pages/settings/Wallet/WalletPage/WalletPage.js @@ -341,6 +341,7 @@ function WalletPage({bankAccountList, cardList, fundList, isLoadingPaymentMethod Navigation.goBack(ROUTES.SETTINGS)} + icon={Illustrations.MoneyIntoWallet} shouldShowBackButton={isSmallScreenWidth} /> From e08ec7b12471003c48e86bef655e1e19409e1c9b Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:35:10 +0100 Subject: [PATCH 046/122] refactor --- src/components/HeaderWithBackButton/index.tsx | 7 ++++--- src/styles/variables.ts | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/HeaderWithBackButton/index.tsx b/src/components/HeaderWithBackButton/index.tsx index 0476151a382b..684e1e847705 100755 --- a/src/components/HeaderWithBackButton/index.tsx +++ b/src/components/HeaderWithBackButton/index.tsx @@ -17,6 +17,7 @@ import useThrottledButtonState from '@hooks/useThrottledButtonState'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; import getButtonState from '@libs/getButtonState'; import Navigation from '@libs/Navigation/Navigation'; +import variables from '@styles/variables'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type HeaderWithBackButtonProps from './types'; @@ -104,9 +105,9 @@ function HeaderWithBackButton({ {icon && ( )} {shouldShowAvatarWithDisplay ? ( diff --git a/src/styles/variables.ts b/src/styles/variables.ts index 296780abf0ae..a49ffb7c637f 100644 --- a/src/styles/variables.ts +++ b/src/styles/variables.ts @@ -81,6 +81,7 @@ export default { iconSizeSuperLarge: 60, iconSizeUltraLarge: 120, iconBottomBar: 24, + iconHeader: 48, emojiSize: 20, emojiLineHeight: 28, iouAmountTextSize: 40, From 53546d7fe370ccdb8eea240ca908d4d32f5abf6b Mon Sep 17 00:00:00 2001 From: Pavlo Tsimura Date: Thu, 1 Feb 2024 23:21:58 +0100 Subject: [PATCH 047/122] Hide smartScan fields for Scan requests only --- src/pages/iou/request/step/IOURequestStepConfirmation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.js b/src/pages/iou/request/step/IOURequestStepConfirmation.js index 0f1c2b27ad2e..22ff297c11ba 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.js +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.js @@ -372,7 +372,7 @@ function IOURequestStepConfirmation({ iouMerchant={transaction.merchant} iouCreated={transaction.created} isDistanceRequest={requestType === CONST.IOU.REQUEST_TYPE.DISTANCE} - shouldShowSmartScanFields={_.isEmpty(lodashGet(transaction, 'receipt.source', ''))} + shouldShowSmartScanFields={requestType !== CONST.IOU.REQUEST_TYPE.SCAN} /> )} From 0d60886e3dc914bad11f34122fe846d840ac8cb7 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 2 Feb 2024 12:28:49 +0700 Subject: [PATCH 048/122] merge main --- src/libs/Navigation/linkingConfig.ts | 506 -------------------- src/libs/Navigation/linkingConfig/config.ts | 1 - 2 files changed, 507 deletions(-) delete mode 100644 src/libs/Navigation/linkingConfig.ts diff --git a/src/libs/Navigation/linkingConfig.ts b/src/libs/Navigation/linkingConfig.ts deleted file mode 100644 index 56d9d362ffb6..000000000000 --- a/src/libs/Navigation/linkingConfig.ts +++ /dev/null @@ -1,506 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import type {LinkingOptions} from '@react-navigation/native'; -import CONST from '@src/CONST'; -import NAVIGATORS from '@src/NAVIGATORS'; -import ROUTES from '@src/ROUTES'; -import SCREENS from '@src/SCREENS'; -import type {RootStackParamList} from './types'; - -const linkingConfig: LinkingOptions = { - prefixes: [ - 'app://-/', - 'new-expensify://', - 'https://www.expensify.cash', - 'https://staging.expensify.cash', - 'https://dev.new.expensify.com', - CONST.NEW_EXPENSIFY_URL, - CONST.STAGING_NEW_EXPENSIFY_URL, - ], - config: { - initialRouteName: SCREENS.HOME, - screens: { - // Main Routes - [SCREENS.VALIDATE_LOGIN]: ROUTES.VALIDATE_LOGIN, - [SCREENS.UNLINK_LOGIN]: ROUTES.UNLINK_LOGIN, - [SCREENS.TRANSITION_BETWEEN_APPS]: ROUTES.TRANSITION_BETWEEN_APPS, - [SCREENS.CONCIERGE]: ROUTES.CONCIERGE, - [SCREENS.SIGN_IN_WITH_APPLE_DESKTOP]: ROUTES.APPLE_SIGN_IN, - [SCREENS.SIGN_IN_WITH_GOOGLE_DESKTOP]: ROUTES.GOOGLE_SIGN_IN, - [SCREENS.SAML_SIGN_IN]: ROUTES.SAML_SIGN_IN, - [SCREENS.DESKTOP_SIGN_IN_REDIRECT]: ROUTES.DESKTOP_SIGN_IN_REDIRECT, - [SCREENS.REPORT_ATTACHMENTS]: ROUTES.REPORT_ATTACHMENTS.route, - [SCREENS.PROFILE_AVATAR]: ROUTES.PROFILE_AVATAR.route, - [SCREENS.WORKSPACE_AVATAR]: ROUTES.WORKSPACE_AVATAR.route, - [SCREENS.REPORT_AVATAR]: ROUTES.REPORT_AVATAR.route, - - // Sidebar - [SCREENS.HOME]: { - path: ROUTES.HOME, - }, - - [NAVIGATORS.CENTRAL_PANE_NAVIGATOR]: { - screens: { - [SCREENS.REPORT]: ROUTES.REPORT_WITH_ID.route, - }, - }, - [SCREENS.NOT_FOUND]: '*', - [NAVIGATORS.LEFT_MODAL_NAVIGATOR]: { - screens: { - [SCREENS.LEFT_MODAL.SEARCH]: { - screens: { - [SCREENS.SEARCH_ROOT]: ROUTES.SEARCH, - }, - }, - }, - }, - [NAVIGATORS.RIGHT_MODAL_NAVIGATOR]: { - screens: { - [SCREENS.RIGHT_MODAL.SETTINGS]: { - screens: { - [SCREENS.SETTINGS.ROOT]: { - path: ROUTES.SETTINGS, - }, - [SCREENS.SETTINGS.WORKSPACES]: { - path: ROUTES.SETTINGS_WORKSPACES, - exact: true, - }, - [SCREENS.SETTINGS.PREFERENCES.ROOT]: { - path: ROUTES.SETTINGS_PREFERENCES, - exact: true, - }, - [SCREENS.SETTINGS.PREFERENCES.PRIORITY_MODE]: { - path: ROUTES.SETTINGS_PRIORITY_MODE, - exact: true, - }, - [SCREENS.SETTINGS.PREFERENCES.LANGUAGE]: { - path: ROUTES.SETTINGS_LANGUAGE, - exact: true, - }, - [SCREENS.SETTINGS.PREFERENCES.THEME]: { - path: ROUTES.SETTINGS_THEME, - exact: true, - }, - [SCREENS.SETTINGS.CLOSE]: { - path: ROUTES.SETTINGS_CLOSE, - exact: true, - }, - [SCREENS.SETTINGS.SECURITY]: { - path: ROUTES.SETTINGS_SECURITY, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.ROOT]: { - path: ROUTES.SETTINGS_WALLET, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.DOMAIN_CARD]: { - path: ROUTES.SETTINGS_WALLET_DOMAINCARD.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD]: { - path: ROUTES.SETTINGS_REPORT_FRAUD.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.CARD_GET_PHYSICAL.NAME]: { - path: ROUTES.SETTINGS_WALLET_CARD_GET_PHYSICAL_NAME.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.CARD_GET_PHYSICAL.PHONE]: { - path: ROUTES.SETTINGS_WALLET_CARD_GET_PHYSICAL_PHONE.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.CARD_GET_PHYSICAL.ADDRESS]: { - path: ROUTES.SETTINGS_WALLET_CARD_GET_PHYSICAL_ADDRESS.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.CARD_GET_PHYSICAL.CONFIRM]: { - path: ROUTES.SETTINGS_WALLET_CARD_GET_PHYSICAL_CONFIRM.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.ENABLE_PAYMENTS]: { - path: ROUTES.SETTINGS_ENABLE_PAYMENTS, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.TRANSFER_BALANCE]: { - path: ROUTES.SETTINGS_WALLET_TRANSFER_BALANCE, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.CHOOSE_TRANSFER_ACCOUNT]: { - path: ROUTES.SETTINGS_WALLET_CHOOSE_TRANSFER_ACCOUNT, - exact: true, - }, - [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED]: { - path: ROUTES.SETTINGS_WALLET_REPORT_CARD_LOST_OR_DAMAGED.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.CARD_ACTIVATE]: { - path: ROUTES.SETTINGS_WALLET_CARD_ACTIVATE.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS]: { - path: ROUTES.SETTINGS_WALLET_CARD_DIGITAL_DETAILS_UPDATE_ADDRESS.route, - exact: true, - }, - [SCREENS.SETTINGS.ADD_DEBIT_CARD]: { - path: ROUTES.SETTINGS_ADD_DEBIT_CARD, - exact: true, - }, - [SCREENS.SETTINGS.ADD_BANK_ACCOUNT]: { - path: ROUTES.SETTINGS_ADD_BANK_ACCOUNT, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.ROOT]: { - path: ROUTES.SETTINGS_PROFILE, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.PRONOUNS]: { - path: ROUTES.SETTINGS_PRONOUNS, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.DISPLAY_NAME]: { - path: ROUTES.SETTINGS_DISPLAY_NAME, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.TIMEZONE]: { - path: ROUTES.SETTINGS_TIMEZONE, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.TIMEZONE_SELECT]: { - path: ROUTES.SETTINGS_TIMEZONE_SELECT, - exact: true, - }, - [SCREENS.SETTINGS.ABOUT]: { - path: ROUTES.SETTINGS_ABOUT, - exact: true, - }, - [SCREENS.SETTINGS.APP_DOWNLOAD_LINKS]: { - path: ROUTES.SETTINGS_APP_DOWNLOAD_LINKS, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.CONTACT_METHODS]: { - path: ROUTES.SETTINGS_CONTACT_METHODS.route, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.CONTACT_METHOD_DETAILS]: { - path: ROUTES.SETTINGS_CONTACT_METHOD_DETAILS.route, - }, - [SCREENS.SETTINGS.LOUNGE_ACCESS]: { - path: ROUTES.SETTINGS_LOUNGE_ACCESS, - }, - [SCREENS.SETTINGS.PROFILE.NEW_CONTACT_METHOD]: { - path: ROUTES.SETTINGS_NEW_CONTACT_METHOD.route, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.PERSONAL_DETAILS.INITIAL]: { - path: ROUTES.SETTINGS_PERSONAL_DETAILS, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.PERSONAL_DETAILS.LEGAL_NAME]: { - path: ROUTES.SETTINGS_PERSONAL_DETAILS_LEGAL_NAME, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.PERSONAL_DETAILS.DATE_OF_BIRTH]: { - path: ROUTES.SETTINGS_PERSONAL_DETAILS_DATE_OF_BIRTH, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.PERSONAL_DETAILS.ADDRESS]: { - path: ROUTES.SETTINGS_PERSONAL_DETAILS_ADDRESS, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.PERSONAL_DETAILS.ADDRESS_COUNTRY]: { - path: ROUTES.SETTINGS_PERSONAL_DETAILS_ADDRESS_COUNTRY.route, - exact: true, - }, - [SCREENS.SETTINGS.TWO_FACTOR_AUTH]: { - path: ROUTES.SETTINGS_2FA.route, - exact: true, - }, - [SCREENS.SETTINGS.SHARE_CODE]: { - path: ROUTES.SETTINGS_SHARE_CODE, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.STATUS]: { - path: ROUTES.SETTINGS_STATUS, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.STATUS_CLEAR_AFTER]: { - path: ROUTES.SETTINGS_STATUS_CLEAR_AFTER, - }, - [SCREENS.SETTINGS.PROFILE.STATUS_CLEAR_AFTER_DATE]: { - path: ROUTES.SETTINGS_STATUS_CLEAR_AFTER_DATE, - }, - [SCREENS.SETTINGS.PROFILE.STATUS_CLEAR_AFTER_TIME]: { - path: ROUTES.SETTINGS_STATUS_CLEAR_AFTER_TIME, - }, - [SCREENS.WORKSPACE.INITIAL]: { - path: ROUTES.WORKSPACE_INITIAL.route, - }, - [SCREENS.WORKSPACE.SETTINGS]: { - path: ROUTES.WORKSPACE_SETTINGS.route, - }, - [SCREENS.WORKSPACE.CURRENCY]: { - path: ROUTES.WORKSPACE_SETTINGS_CURRENCY.route, - }, - [SCREENS.WORKSPACE.CARD]: { - path: ROUTES.WORKSPACE_CARD.route, - }, - [SCREENS.WORKSPACE.REIMBURSE]: { - path: ROUTES.WORKSPACE_REIMBURSE.route, - }, - [SCREENS.WORKSPACE.RATE_AND_UNIT]: { - path: ROUTES.WORKSPACE_RATE_AND_UNIT.route, - }, - [SCREENS.WORKSPACE.BILLS]: { - path: ROUTES.WORKSPACE_BILLS.route, - }, - [SCREENS.WORKSPACE.INVOICES]: { - path: ROUTES.WORKSPACE_INVOICES.route, - }, - [SCREENS.WORKSPACE.TRAVEL]: { - path: ROUTES.WORKSPACE_TRAVEL.route, - }, - [SCREENS.WORKSPACE.MEMBERS]: { - path: ROUTES.WORKSPACE_MEMBERS.route, - }, - [SCREENS.WORKSPACE.INVITE]: { - path: ROUTES.WORKSPACE_INVITE.route, - }, - [SCREENS.WORKSPACE.INVITE_MESSAGE]: { - path: ROUTES.WORKSPACE_INVITE_MESSAGE.route, - }, - [SCREENS.REIMBURSEMENT_ACCOUNT]: { - path: ROUTES.BANK_ACCOUNT_WITH_STEP_TO_OPEN.route, - exact: true, - }, - [SCREENS.GET_ASSISTANCE]: { - path: ROUTES.GET_ASSISTANCE.route, - }, - [SCREENS.KEYBOARD_SHORTCUTS]: { - path: ROUTES.KEYBOARD_SHORTCUTS, - }, - }, - }, - [SCREENS.RIGHT_MODAL.PRIVATE_NOTES]: { - screens: { - [SCREENS.PRIVATE_NOTES.LIST]: ROUTES.PRIVATE_NOTES_LIST.route, - [SCREENS.PRIVATE_NOTES.EDIT]: ROUTES.PRIVATE_NOTES_EDIT.route, - }, - }, - [SCREENS.RIGHT_MODAL.REPORT_DETAILS]: { - screens: { - [SCREENS.REPORT_DETAILS.ROOT]: ROUTES.REPORT_WITH_ID_DETAILS.route, - [SCREENS.REPORT_DETAILS.SHARE_CODE]: ROUTES.REPORT_WITH_ID_DETAILS_SHARE_CODE.route, - }, - }, - [SCREENS.RIGHT_MODAL.REPORT_SETTINGS]: { - screens: { - [SCREENS.REPORT_SETTINGS.ROOT]: { - path: ROUTES.REPORT_SETTINGS.route, - }, - [SCREENS.REPORT_SETTINGS.ROOM_NAME]: { - path: ROUTES.REPORT_SETTINGS_ROOM_NAME.route, - }, - [SCREENS.REPORT_SETTINGS.NOTIFICATION_PREFERENCES]: { - path: ROUTES.REPORT_SETTINGS_NOTIFICATION_PREFERENCES.route, - }, - [SCREENS.REPORT_SETTINGS.WRITE_CAPABILITY]: { - path: ROUTES.REPORT_SETTINGS_WRITE_CAPABILITY.route, - }, - }, - }, - [SCREENS.RIGHT_MODAL.REPORT_WELCOME_MESSAGE]: { - screens: { - [SCREENS.REPORT_WELCOME_MESSAGE_ROOT]: ROUTES.REPORT_WELCOME_MESSAGE.route, - }, - }, - [SCREENS.RIGHT_MODAL.NEW_CHAT]: { - screens: { - [SCREENS.NEW_CHAT.ROOT]: { - path: ROUTES.NEW, - exact: true, - screens: { - [SCREENS.NEW_CHAT.NEW_CHAT]: { - path: ROUTES.NEW_CHAT, - exact: true, - }, - [SCREENS.NEW_CHAT.NEW_ROOM]: { - path: ROUTES.NEW_ROOM, - exact: true, - }, - }, - }, - }, - }, - [SCREENS.RIGHT_MODAL.NEW_TASK]: { - screens: { - [SCREENS.NEW_TASK.ROOT]: ROUTES.NEW_TASK, - [SCREENS.NEW_TASK.TASK_ASSIGNEE_SELECTOR]: ROUTES.NEW_TASK_ASSIGNEE, - [SCREENS.NEW_TASK.TASK_SHARE_DESTINATION_SELECTOR]: ROUTES.NEW_TASK_SHARE_DESTINATION, - [SCREENS.NEW_TASK.DETAILS]: ROUTES.NEW_TASK_DETAILS, - [SCREENS.NEW_TASK.TITLE]: ROUTES.NEW_TASK_TITLE, - [SCREENS.NEW_TASK.DESCRIPTION]: ROUTES.NEW_TASK_DESCRIPTION, - }, - }, - [SCREENS.RIGHT_MODAL.TEACHERS_UNITE]: { - screens: { - [SCREENS.SAVE_THE_WORLD.ROOT]: ROUTES.TEACHERS_UNITE, - [SCREENS.I_KNOW_A_TEACHER]: ROUTES.I_KNOW_A_TEACHER, - [SCREENS.INTRO_SCHOOL_PRINCIPAL]: ROUTES.INTRO_SCHOOL_PRINCIPAL, - [SCREENS.I_AM_A_TEACHER]: ROUTES.I_AM_A_TEACHER, - }, - }, - [SCREENS.RIGHT_MODAL.DETAILS]: { - screens: { - [SCREENS.DETAILS_ROOT]: ROUTES.DETAILS.route, - }, - }, - [SCREENS.RIGHT_MODAL.PROFILE]: { - screens: { - [SCREENS.PROFILE_ROOT]: ROUTES.PROFILE.route, - }, - }, - [SCREENS.RIGHT_MODAL.PARTICIPANTS]: { - screens: { - [SCREENS.REPORT_PARTICIPANTS_ROOT]: ROUTES.REPORT_PARTICIPANTS.route, - }, - }, - [SCREENS.RIGHT_MODAL.ROOM_INVITE]: { - screens: { - [SCREENS.ROOM_INVITE_ROOT]: ROUTES.ROOM_INVITE.route, - }, - }, - [SCREENS.RIGHT_MODAL.ROOM_MEMBERS]: { - screens: { - [SCREENS.ROOM_MEMBERS_ROOT]: ROUTES.ROOM_MEMBERS.route, - }, - }, - [SCREENS.RIGHT_MODAL.MONEY_REQUEST]: { - screens: { - [SCREENS.MONEY_REQUEST.START]: ROUTES.MONEY_REQUEST_START.route, - [SCREENS.MONEY_REQUEST.CREATE]: { - path: ROUTES.MONEY_REQUEST_CREATE.route, - exact: true, - screens: { - distance: { - path: ROUTES.MONEY_REQUEST_CREATE_TAB_DISTANCE.route, - exact: true, - }, - manual: { - path: ROUTES.MONEY_REQUEST_CREATE_TAB_MANUAL.route, - exact: true, - }, - scan: { - path: ROUTES.MONEY_REQUEST_CREATE_TAB_SCAN.route, - exact: true, - }, - }, - }, - [SCREENS.MONEY_REQUEST.STEP_AMOUNT]: ROUTES.MONEY_REQUEST_STEP_AMOUNT.route, - [SCREENS.MONEY_REQUEST.STEP_CATEGORY]: ROUTES.MONEY_REQUEST_STEP_CATEGORY.route, - [SCREENS.MONEY_REQUEST.STEP_CONFIRMATION]: ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.route, - [SCREENS.MONEY_REQUEST.STEP_CURRENCY]: ROUTES.MONEY_REQUEST_STEP_CURRENCY.route, - [SCREENS.MONEY_REQUEST.STEP_DATE]: ROUTES.MONEY_REQUEST_STEP_DATE.route, - [SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.route, - [SCREENS.MONEY_REQUEST.STEP_DISTANCE]: ROUTES.MONEY_REQUEST_STEP_DISTANCE.route, - [SCREENS.MONEY_REQUEST.STEP_MERCHANT]: ROUTES.MONEY_REQUEST_STEP_MERCHANT.route, - [SCREENS.MONEY_REQUEST.STEP_PARTICIPANTS]: ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.route, - [SCREENS.MONEY_REQUEST.STEP_SCAN]: ROUTES.MONEY_REQUEST_STEP_SCAN.route, - [SCREENS.MONEY_REQUEST.STEP_TAG]: ROUTES.MONEY_REQUEST_STEP_TAG.route, - [SCREENS.MONEY_REQUEST.STEP_WAYPOINT]: ROUTES.MONEY_REQUEST_STEP_WAYPOINT.route, - [SCREENS.MONEY_REQUEST.ROOT]: { - path: ROUTES.MONEY_REQUEST.route, - exact: true, - screens: { - [SCREENS.MONEY_REQUEST.MANUAL_TAB]: { - path: ROUTES.MONEY_REQUEST_MANUAL_TAB, - exact: true, - }, - [SCREENS.MONEY_REQUEST.SCAN_TAB]: { - path: ROUTES.MONEY_REQUEST_SCAN_TAB, - exact: true, - }, - [SCREENS.MONEY_REQUEST.DISTANCE_TAB]: { - path: ROUTES.MONEY_REQUEST_DISTANCE_TAB.route, - exact: true, - }, - }, - }, - [SCREENS.MONEY_REQUEST.AMOUNT]: ROUTES.MONEY_REQUEST_AMOUNT.route, - [SCREENS.MONEY_REQUEST.STEP_TAX_AMOUNT]: ROUTES.MONEY_REQUEST_STEP_TAX_AMOUNT.route, - [SCREENS.MONEY_REQUEST.STEP_TAX_RATE]: ROUTES.MONEY_REQUEST_STEP_TAX_RATE.route, - [SCREENS.MONEY_REQUEST.PARTICIPANTS]: ROUTES.MONEY_REQUEST_PARTICIPANTS.route, - [SCREENS.MONEY_REQUEST.CONFIRMATION]: ROUTES.MONEY_REQUEST_CONFIRMATION.route, - [SCREENS.MONEY_REQUEST.DATE]: ROUTES.MONEY_REQUEST_DATE.route, - [SCREENS.MONEY_REQUEST.CURRENCY]: ROUTES.MONEY_REQUEST_CURRENCY.route, - [SCREENS.MONEY_REQUEST.CATEGORY]: ROUTES.MONEY_REQUEST_CATEGORY.route, - [SCREENS.MONEY_REQUEST.TAG]: ROUTES.MONEY_REQUEST_TAG.route, - [SCREENS.MONEY_REQUEST.MERCHANT]: ROUTES.MONEY_REQUEST_MERCHANT.route, - [SCREENS.MONEY_REQUEST.RECEIPT]: ROUTES.MONEY_REQUEST_RECEIPT.route, - [SCREENS.MONEY_REQUEST.DISTANCE]: ROUTES.MONEY_REQUEST_DISTANCE.route, - [SCREENS.IOU_SEND.ENABLE_PAYMENTS]: ROUTES.IOU_SEND_ENABLE_PAYMENTS, - [SCREENS.IOU_SEND.ADD_BANK_ACCOUNT]: ROUTES.IOU_SEND_ADD_BANK_ACCOUNT, - [SCREENS.IOU_SEND.ADD_DEBIT_CARD]: ROUTES.IOU_SEND_ADD_DEBIT_CARD, - }, - }, - [SCREENS.RIGHT_MODAL.SPLIT_DETAILS]: { - screens: { - [SCREENS.SPLIT_DETAILS.ROOT]: ROUTES.SPLIT_BILL_DETAILS.route, - [SCREENS.SPLIT_DETAILS.EDIT_REQUEST]: ROUTES.EDIT_SPLIT_BILL.route, - [SCREENS.SPLIT_DETAILS.EDIT_CURRENCY]: ROUTES.EDIT_SPLIT_BILL_CURRENCY.route, - }, - }, - [SCREENS.RIGHT_MODAL.TASK_DETAILS]: { - screens: { - [SCREENS.TASK.TITLE]: ROUTES.TASK_TITLE.route, - [SCREENS.TASK.DESCRIPTION]: ROUTES.TASK_DESCRIPTION.route, - [SCREENS.TASK.ASSIGNEE]: ROUTES.TASK_ASSIGNEE.route, - }, - }, - [SCREENS.RIGHT_MODAL.ADD_PERSONAL_BANK_ACCOUNT]: { - screens: { - [SCREENS.ADD_PERSONAL_BANK_ACCOUNT_ROOT]: ROUTES.BANK_ACCOUNT_PERSONAL, - }, - }, - [SCREENS.RIGHT_MODAL.ENABLE_PAYMENTS]: { - screens: { - [SCREENS.ENABLE_PAYMENTS_ROOT]: ROUTES.ENABLE_PAYMENTS, - }, - }, - [SCREENS.RIGHT_MODAL.WALLET_STATEMENT]: { - screens: { - [SCREENS.WALLET_STATEMENT_ROOT]: ROUTES.WALLET_STATEMENT_WITH_DATE, - }, - }, - [SCREENS.RIGHT_MODAL.FLAG_COMMENT]: { - screens: { - [SCREENS.FLAG_COMMENT_ROOT]: ROUTES.FLAG_COMMENT.route, - }, - }, - [SCREENS.RIGHT_MODAL.EDIT_REQUEST]: { - screens: { - [SCREENS.EDIT_REQUEST.ROOT]: ROUTES.EDIT_REQUEST.route, - [SCREENS.EDIT_REQUEST.CURRENCY]: ROUTES.EDIT_CURRENCY_REQUEST.route, - [SCREENS.EDIT_REQUEST.REPORT_FIELD]: ROUTES.EDIT_REPORT_FIELD_REQUEST.route, - }, - }, - [SCREENS.RIGHT_MODAL.SIGN_IN]: { - screens: { - [SCREENS.SIGN_IN_ROOT]: ROUTES.SIGN_IN_MODAL, - }, - }, - [SCREENS.RIGHT_MODAL.REFERRAL]: { - screens: { - [SCREENS.REFERRAL_DETAILS]: ROUTES.REFERRAL_DETAILS_MODAL.route, - }, - }, - ProcessMoneyRequestHold: { - screens: { - ProcessMoneyRequestHold_Root: ROUTES.PROCESS_MONEY_REQUEST_HOLD, - }, - }, - }, - }, - }, - }, -}; - -export default linkingConfig; diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index f1c9c316fe93..304215c0e49b 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -404,7 +404,6 @@ const config: LinkingOptions['config'] = { [SCREENS.MONEY_REQUEST.CONFIRMATION]: ROUTES.MONEY_REQUEST_CONFIRMATION.route, [SCREENS.MONEY_REQUEST.DATE]: ROUTES.MONEY_REQUEST_DATE.route, [SCREENS.MONEY_REQUEST.CURRENCY]: ROUTES.MONEY_REQUEST_CURRENCY.route, - [SCREENS.MONEY_REQUEST.DESCRIPTION]: ROUTES.MONEY_REQUEST_DESCRIPTION.route, [SCREENS.MONEY_REQUEST.CATEGORY]: ROUTES.MONEY_REQUEST_CATEGORY.route, [SCREENS.MONEY_REQUEST.TAG]: ROUTES.MONEY_REQUEST_TAG.route, [SCREENS.MONEY_REQUEST.MERCHANT]: ROUTES.MONEY_REQUEST_MERCHANT.route, From e3f6ecf7e9560656e774732dcc1c0904e2d5e4a1 Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 2 Feb 2024 16:50:17 +0700 Subject: [PATCH 049/122] update param --- src/pages/iou/request/step/IOURequestStepDescription.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 41ddcc0c8feb..2b753931aa4a 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -73,7 +73,7 @@ function IOURequestStepDescription({ // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT) { - IOU.setDraftSplitTransaction(transaction.transactionID, {newComment}); + IOU.setDraftSplitTransaction(transaction.transactionID, {comment: newComment}); navigateBack(); return; } From 1296790702833467b0fd7b5f016afb6ab160957b Mon Sep 17 00:00:00 2001 From: tienifr Date: Fri, 2 Feb 2024 16:56:01 +0700 Subject: [PATCH 050/122] set default category for distance request only --- src/pages/iou/request/step/IOURequestStepConfirmation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.js b/src/pages/iou/request/step/IOURequestStepConfirmation.js index 029836d0c654..6c3d40dc33ad 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.js +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.js @@ -121,7 +121,7 @@ function IOURequestStepConfirmation({ '', ); useEffect(() => { - if (!_.isEmpty(transaction.category)) { + if (requestType !== CONST.IOU.REQUEST_TYPE.DISTANCE || !_.isEmpty(transaction.category)) { return; } IOU.setMoneyRequestCategory_temporaryForRefactor(transactionID, defaultCategory); From cbbc7a37cb7903fe7028ba170b86c06d4cdf736b Mon Sep 17 00:00:00 2001 From: tienifr Date: Fri, 2 Feb 2024 17:01:13 +0700 Subject: [PATCH 051/122] fix lint --- src/pages/iou/request/step/IOURequestStepConfirmation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.js b/src/pages/iou/request/step/IOURequestStepConfirmation.js index acd66fb1a3ed..560e87b6d802 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.js +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.js @@ -125,7 +125,7 @@ function IOURequestStepConfirmation({ return; } IOU.setMoneyRequestCategory_temporaryForRefactor(transactionID, defaultCategory); - }, [transactionID, transaction.category, defaultCategory]); + }, [transactionID, transaction.category, requestType, defaultCategory]); const navigateBack = useCallback(() => { // If there is not a report attached to the IOU with a reportID, then the participants were manually selected and the user needs taken From 0a8cb71477fec6db85dba89b4a52083b7b3a1247 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:42:48 +0100 Subject: [PATCH 052/122] cleanup --- src/pages/settings/Security/SecuritySettingsPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/settings/Security/SecuritySettingsPage.tsx b/src/pages/settings/Security/SecuritySettingsPage.tsx index 4dcb292b2d86..c98b5a9f9ba5 100644 --- a/src/pages/settings/Security/SecuritySettingsPage.tsx +++ b/src/pages/settings/Security/SecuritySettingsPage.tsx @@ -1,6 +1,5 @@ import React, {useMemo} from 'react'; import {ScrollView, View} from 'react-native'; -import {LockClosed} from '@assets/images/simple-illustrations/simple-illustration__lockclosed.svg'; import * as Expensicons from '@components/Icon/Expensicons'; import * as Illustrations from '@components/Icon/Illustrations'; import IllustratedHeaderPageLayout from '@components/IllustratedHeaderPageLayout'; From 77626b747620d4916af99a177d41b4bf3e3d1391 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:17:12 +0100 Subject: [PATCH 053/122] adjust headers heights --- src/components/HeaderWithBackButton/index.tsx | 11 +++++++++-- src/components/HeaderWithBackButton/types.ts | 3 +++ src/pages/ShareCodePage.js | 1 + src/pages/settings/AboutPage/AboutPage.tsx | 1 + src/pages/settings/Preferences/PreferencesPage.js | 1 + src/pages/settings/Profile/ProfilePage.js | 1 + src/pages/settings/Security/SecuritySettingsPage.tsx | 1 + src/pages/settings/Wallet/WalletPage/WalletPage.js | 1 + src/styles/index.ts | 4 ++++ src/styles/variables.ts | 4 ++-- 10 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/components/HeaderWithBackButton/index.tsx b/src/components/HeaderWithBackButton/index.tsx index c6187bf80d66..7de71f014044 100755 --- a/src/components/HeaderWithBackButton/index.tsx +++ b/src/components/HeaderWithBackButton/index.tsx @@ -58,6 +58,7 @@ function HeaderWithBackButton({ shouldOverlay = false, singleExecution = (func) => func, shouldNavigateToTopMostReport = false, + isCentralPaneSettings = false, }: HeaderWithBackButtonProps) { const theme = useTheme(); const styles = useThemeStyles(); @@ -72,7 +73,13 @@ function HeaderWithBackButton({ // Hover on some part of close icons will not work on Electron if dragArea is true // https://github.com/Expensify/App/issues/29598 dataSet={{dragArea: false}} - style={[styles.headerBar, shouldShowBorderBottom && styles.borderBottom, shouldShowBackButton ? styles.pl0 : styles.pl5, shouldOverlay && StyleSheet.absoluteFillObject]} + style={[ + styles.headerBar, + isCentralPaneSettings && styles.headerBarExtendedHeight, + shouldShowBorderBottom && styles.borderBottom, + shouldShowBackButton ? styles.pl0 : styles.pl5, + shouldOverlay && StyleSheet.absoluteFillObject, + ]} > {shouldShowBackButton && ( @@ -119,7 +126,7 @@ function HeaderWithBackButton({
)} diff --git a/src/components/HeaderWithBackButton/types.ts b/src/components/HeaderWithBackButton/types.ts index b332d829dd43..a5fdf1bc0690 100644 --- a/src/components/HeaderWithBackButton/types.ts +++ b/src/components/HeaderWithBackButton/types.ts @@ -117,6 +117,9 @@ type HeaderWithBackButtonProps = Partial & { /** Whether we should overlay the 3 dots menu */ shouldOverlayDots?: boolean; + + /** Whether we should use increased height. */ + isCentralPaneSettings?: boolean; }; export type {ThreeDotsMenuItem}; diff --git a/src/pages/ShareCodePage.js b/src/pages/ShareCodePage.js index 94f74b9f21b6..69ef80900c9f 100644 --- a/src/pages/ShareCodePage.js +++ b/src/pages/ShareCodePage.js @@ -90,6 +90,7 @@ class ShareCodePage extends React.Component { onBackButtonPress={() => Navigation.goBack(isReport ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(this.props.report.reportID) : ROUTES.SETTINGS)} shouldShowBackButton={isReport || this.props.isSmallScreenWidth} icon={Illustrations.QrCode} + isCentralPaneSettings /> diff --git a/src/pages/settings/AboutPage/AboutPage.tsx b/src/pages/settings/AboutPage/AboutPage.tsx index 375df9b2864b..96a195d19d5e 100644 --- a/src/pages/settings/AboutPage/AboutPage.tsx +++ b/src/pages/settings/AboutPage/AboutPage.tsx @@ -134,6 +134,7 @@ function AboutPage() { overlayContent={overlayContent} shouldShowOfflineIndicatorInWideScreen icon={Illustrations.PalmTree} + isCentralPaneSettings > {translate('footer.aboutExpensify')} diff --git a/src/pages/settings/Preferences/PreferencesPage.js b/src/pages/settings/Preferences/PreferencesPage.js index a81a0738c2b9..5dcb4cc5265c 100755 --- a/src/pages/settings/Preferences/PreferencesPage.js +++ b/src/pages/settings/Preferences/PreferencesPage.js @@ -57,6 +57,7 @@ function PreferencesPage(props) { shouldShowBackButton={isSmallScreenWidth} shouldShowOfflineIndicatorInWideScreen icon={Illustrations.Gears} + isCentralPaneSettings > Navigation.goBack(ROUTES.SETTINGS)} shouldShowBackButton={props.isSmallScreenWidth} icon={Illustrations.Profile} + isCentralPaneSettings /> diff --git a/src/pages/settings/Security/SecuritySettingsPage.tsx b/src/pages/settings/Security/SecuritySettingsPage.tsx index c98b5a9f9ba5..cbfb1b958570 100644 --- a/src/pages/settings/Security/SecuritySettingsPage.tsx +++ b/src/pages/settings/Security/SecuritySettingsPage.tsx @@ -55,6 +55,7 @@ function SecuritySettingsPage() { backgroundColor={theme.PAGE_THEMES[SCREENS.SETTINGS.SECURITY].backgroundColor} shouldShowOfflineIndicatorInWideScreen icon={Illustrations.LockClosed} + isCentralPaneSettings > diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.js b/src/pages/settings/Wallet/WalletPage/WalletPage.js index 417d5b890dea..2db914570155 100644 --- a/src/pages/settings/Wallet/WalletPage/WalletPage.js +++ b/src/pages/settings/Wallet/WalletPage/WalletPage.js @@ -343,6 +343,7 @@ function WalletPage({bankAccountList, cardList, fundList, isLoadingPaymentMethod onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS)} icon={Illustrations.MoneyIntoWallet} shouldShowBackButton={isSmallScreenWidth} + isCentralPaneSettings /> diff --git a/src/styles/index.ts b/src/styles/index.ts index 0d4b420c00e4..07b41bce4b0a 100644 --- a/src/styles/index.ts +++ b/src/styles/index.ts @@ -2254,6 +2254,10 @@ const styles = (theme: ThemeColors) => width: '100%', }, + headerBarExtendedHeight: { + height: variables.contentHeaderExtendedHeight, + }, + imageViewContainer: { width: '100%', height: '100%', diff --git a/src/styles/variables.ts b/src/styles/variables.ts index a49ffb7c637f..09cef771d0cf 100644 --- a/src/styles/variables.ts +++ b/src/styles/variables.ts @@ -12,9 +12,9 @@ function getValueUsingPixelRatio(defaultValue: number, maxValue: number): number } export default { - // do we need to change it? bottomTabHeight: 80, - contentHeaderHeight: getValueUsingPixelRatio(80, 100), + contentHeaderHeight: getValueUsingPixelRatio(73, 100), + contentHeaderExtendedHeight: getValueUsingPixelRatio(80, 100), componentSizeSmall: getValueUsingPixelRatio(28, 32), componentSizeNormal: 40, componentSizeMedium: 48, From 02f327ed2e580f37978c5bfdd6a5704d92a753ca Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:32:43 +0100 Subject: [PATCH 054/122] fix height on small screens --- src/components/HeaderWithBackButton/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/HeaderWithBackButton/index.tsx b/src/components/HeaderWithBackButton/index.tsx index 7de71f014044..c8e39913853d 100755 --- a/src/components/HeaderWithBackButton/index.tsx +++ b/src/components/HeaderWithBackButton/index.tsx @@ -15,6 +15,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useThrottledButtonState from '@hooks/useThrottledButtonState'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; +import useWindowDimensions from '@hooks/useWindowDimensions'; import getButtonState from '@libs/getButtonState'; import Navigation from '@libs/Navigation/Navigation'; import variables from '@styles/variables'; @@ -66,6 +67,7 @@ function HeaderWithBackButton({ const [isDownloadButtonActive, temporarilyDisableDownloadButton] = useThrottledButtonState(); const {translate} = useLocalize(); const {isKeyboardShown} = useKeyboardState(); + const {isSmallScreenWidth} = useWindowDimensions(); const waitForNavigate = useWaitForNavigation(); return ( @@ -75,7 +77,7 @@ function HeaderWithBackButton({ dataSet={{dragArea: false}} style={[ styles.headerBar, - isCentralPaneSettings && styles.headerBarExtendedHeight, + isCentralPaneSettings && !isSmallScreenWidth && styles.headerBarExtendedHeight, shouldShowBorderBottom && styles.borderBottom, shouldShowBackButton ? styles.pl0 : styles.pl5, shouldOverlay && StyleSheet.absoluteFillObject, From 1229cbc8e1a8c00f21c776b2fe030aa8c28efc60 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:56:21 +0100 Subject: [PATCH 055/122] Revert "fix height on small screens" This reverts commit 02f327ed2e580f37978c5bfdd6a5704d92a753ca. --- src/components/HeaderWithBackButton/index.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/HeaderWithBackButton/index.tsx b/src/components/HeaderWithBackButton/index.tsx index c8e39913853d..7de71f014044 100755 --- a/src/components/HeaderWithBackButton/index.tsx +++ b/src/components/HeaderWithBackButton/index.tsx @@ -15,7 +15,6 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useThrottledButtonState from '@hooks/useThrottledButtonState'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; -import useWindowDimensions from '@hooks/useWindowDimensions'; import getButtonState from '@libs/getButtonState'; import Navigation from '@libs/Navigation/Navigation'; import variables from '@styles/variables'; @@ -67,7 +66,6 @@ function HeaderWithBackButton({ const [isDownloadButtonActive, temporarilyDisableDownloadButton] = useThrottledButtonState(); const {translate} = useLocalize(); const {isKeyboardShown} = useKeyboardState(); - const {isSmallScreenWidth} = useWindowDimensions(); const waitForNavigate = useWaitForNavigation(); return ( @@ -77,7 +75,7 @@ function HeaderWithBackButton({ dataSet={{dragArea: false}} style={[ styles.headerBar, - isCentralPaneSettings && !isSmallScreenWidth && styles.headerBarExtendedHeight, + isCentralPaneSettings && styles.headerBarExtendedHeight, shouldShowBorderBottom && styles.borderBottom, shouldShowBackButton ? styles.pl0 : styles.pl5, shouldOverlay && StyleSheet.absoluteFillObject, From 5a365b4d4c7de9aed418404d121927be699e97d8 Mon Sep 17 00:00:00 2001 From: Abdelrahman Khattab Date: Mon, 5 Feb 2024 10:06:48 +0200 Subject: [PATCH 056/122] changing the the report name in the search tab as well --- src/components/ReportActionItem/ReportPreview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index bb44f54640e8..52e9d94eaefd 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -201,7 +201,7 @@ function ReportPreview({ if (isApproved) { return translate('iou.managerApproved', {manager: payerOrApproverName}); } - const managerName = isPolicyExpenseChat && !hasNonReimbursableTransactions ? ReportUtils.getPolicyName(chatReport) : ReportUtils.getDisplayNameForParticipant(managerID, true); + const managerName = isPolicyExpenseChat ? ReportUtils.getPolicyName(chatReport) : ReportUtils.getDisplayNameForParticipant(managerID, true); let paymentVerb: TranslationPaths = hasNonReimbursableTransactions ? 'iou.payerSpent' : 'iou.payerOwes'; if (iouSettled || iouReport?.isWaitingOnBankAccount) { paymentVerb = 'iou.payerPaid'; From 7accee559695113ae345fa83966984970c16a489 Mon Sep 17 00:00:00 2001 From: Abdelrahman Khattab Date: Mon, 5 Feb 2024 10:09:35 +0200 Subject: [PATCH 057/122] changing the the report name in the search tab as well --- src/libs/ReportUtils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 228db29aea6c..7738a4889a69 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1856,7 +1856,8 @@ function getPolicyExpenseChatName(report: OnyxEntry, policy: OnyxEntry

, policy: OnyxEntry | undefined = undefined): string { const moneyRequestTotal = getMoneyRequestSpendBreakdown(report).totalDisplaySpend; const formattedAmount = CurrencyUtils.convertToDisplayString(moneyRequestTotal, report?.currency, hasOnlyDistanceRequestTransactions(report?.reportID)); - const payerOrApproverName = isExpenseReport(report) ? getPolicyName(report, false, policy) : getDisplayNameForParticipant(report?.managerID) ?? ''; + const payerOrApproverName = + isExpenseReport(report) && !hasNonReimbursableTransactions(report?.reportID ?? '') ? getPolicyName(report, false, policy) : getDisplayNameForParticipant(report?.managerID) ?? ''; const payerPaidAmountMessage = Localize.translateLocal('iou.payerPaidAmount', { payer: payerOrApproverName, amount: formattedAmount, From 80f96216d3bef94ef4f3997293ccc9709756aeaf Mon Sep 17 00:00:00 2001 From: Abdelrahman Khattab Date: Mon, 5 Feb 2024 10:12:38 +0200 Subject: [PATCH 058/122] minor --- src/components/ReportActionItem/ReportPreview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 52e9d94eaefd..bb44f54640e8 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -201,7 +201,7 @@ function ReportPreview({ if (isApproved) { return translate('iou.managerApproved', {manager: payerOrApproverName}); } - const managerName = isPolicyExpenseChat ? ReportUtils.getPolicyName(chatReport) : ReportUtils.getDisplayNameForParticipant(managerID, true); + const managerName = isPolicyExpenseChat && !hasNonReimbursableTransactions ? ReportUtils.getPolicyName(chatReport) : ReportUtils.getDisplayNameForParticipant(managerID, true); let paymentVerb: TranslationPaths = hasNonReimbursableTransactions ? 'iou.payerSpent' : 'iou.payerOwes'; if (iouSettled || iouReport?.isWaitingOnBankAccount) { paymentVerb = 'iou.payerPaid'; From 69e93cf7f4e98a6c70a9d5bf32c47847bdd49b49 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:22:44 +0100 Subject: [PATCH 059/122] fix colors in WS screen --- src/styles/theme/themes/dark.ts | 2 +- src/styles/theme/themes/light.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/styles/theme/themes/dark.ts b/src/styles/theme/themes/dark.ts index b9bf97037072..54a26a587e81 100644 --- a/src/styles/theme/themes/dark.ts +++ b/src/styles/theme/themes/dark.ts @@ -109,7 +109,7 @@ const darkTheme = { statusBarStyle: CONST.STATUS_BAR_STYLE.LIGHT_CONTENT, }, [SCREENS.SETTINGS.WORKSPACES]: { - backgroundColor: colors.pink800, + backgroundColor: colors.productDark100, statusBarStyle: CONST.STATUS_BAR_STYLE.LIGHT_CONTENT, }, [SCREENS.SETTINGS.WALLET.ROOT]: { diff --git a/src/styles/theme/themes/light.ts b/src/styles/theme/themes/light.ts index 3514e4c4b105..7aea2d48aac0 100644 --- a/src/styles/theme/themes/light.ts +++ b/src/styles/theme/themes/light.ts @@ -109,7 +109,7 @@ const lightTheme = { statusBarStyle: CONST.STATUS_BAR_STYLE.LIGHT_CONTENT, }, [SCREENS.SETTINGS.WORKSPACES]: { - backgroundColor: colors.pink800, + backgroundColor: colors.productLight100, statusBarStyle: CONST.STATUS_BAR_STYLE.LIGHT_CONTENT, }, [SCREENS.SETTINGS.WALLET.ROOT]: { From b94b7d9ded24bbcae8cdf5d8575ce75b612f759f Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Mon, 5 Feb 2024 15:02:56 +0100 Subject: [PATCH 060/122] ref: move react-navigation mock to TS --- __mocks__/@react-navigation/native/{index.js => index.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename __mocks__/@react-navigation/native/{index.js => index.ts} (69%) diff --git a/__mocks__/@react-navigation/native/index.js b/__mocks__/@react-navigation/native/index.ts similarity index 69% rename from __mocks__/@react-navigation/native/index.js rename to __mocks__/@react-navigation/native/index.ts index 09abd0d02bf9..4d0c63d28fce 100644 --- a/__mocks__/@react-navigation/native/index.js +++ b/__mocks__/@react-navigation/native/index.ts @@ -1,7 +1,7 @@ import {useIsFocused as realUseIsFocused} from '@react-navigation/native'; // We only want this mocked for storybook, not jest -const useIsFocused = process.env.NODE_ENV === 'test' ? realUseIsFocused : () => true; +const useIsFocused: () => boolean = process.env.NODE_ENV === 'test' ? realUseIsFocused : () => true; export * from '@react-navigation/core'; export * from '@react-navigation/native'; From 17b08301631205b41d9fe0f0236b5be29b8dc2fe Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Mon, 5 Feb 2024 15:25:28 +0100 Subject: [PATCH 061/122] fix: used better type --- __mocks__/@react-navigation/native/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__mocks__/@react-navigation/native/index.ts b/__mocks__/@react-navigation/native/index.ts index 4d0c63d28fce..aa8067a1c862 100644 --- a/__mocks__/@react-navigation/native/index.ts +++ b/__mocks__/@react-navigation/native/index.ts @@ -1,7 +1,7 @@ import {useIsFocused as realUseIsFocused} from '@react-navigation/native'; // We only want this mocked for storybook, not jest -const useIsFocused: () => boolean = process.env.NODE_ENV === 'test' ? realUseIsFocused : () => true; +const useIsFocused: typeof realUseIsFocused = process.env.NODE_ENV === 'test' ? realUseIsFocused : () => true; export * from '@react-navigation/core'; export * from '@react-navigation/native'; From f2e45df62b11c5e0b931a6a5dad5e826e7dadd24 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:58:47 +0100 Subject: [PATCH 062/122] fix header heights --- src/components/HeaderWithBackButton/index.tsx | 8 ++++++-- src/pages/home/HeaderView.js | 2 +- src/styles/index.ts | 4 ++-- src/styles/variables.ts | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/components/HeaderWithBackButton/index.tsx b/src/components/HeaderWithBackButton/index.tsx index 7de71f014044..aedba56a7b6b 100755 --- a/src/components/HeaderWithBackButton/index.tsx +++ b/src/components/HeaderWithBackButton/index.tsx @@ -15,6 +15,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useThrottledButtonState from '@hooks/useThrottledButtonState'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; +import useWindowDimensions from '@hooks/useWindowDimensions'; import getButtonState from '@libs/getButtonState'; import Navigation from '@libs/Navigation/Navigation'; import variables from '@styles/variables'; @@ -58,7 +59,6 @@ function HeaderWithBackButton({ shouldOverlay = false, singleExecution = (func) => func, shouldNavigateToTopMostReport = false, - isCentralPaneSettings = false, }: HeaderWithBackButtonProps) { const theme = useTheme(); const styles = useThemeStyles(); @@ -67,6 +67,10 @@ function HeaderWithBackButton({ const {translate} = useLocalize(); const {isKeyboardShown} = useKeyboardState(); const waitForNavigate = useWaitForNavigation(); + const {isSmallScreenWidth} = useWindowDimensions(); + + // If the icon is present, the header bar should be taller and use different font. + const isCentralPaneSettings = !!icon; return ( - + {isLoading ? ( diff --git a/src/styles/index.ts b/src/styles/index.ts index 07b41bce4b0a..bcce141b39aa 100644 --- a/src/styles/index.ts +++ b/src/styles/index.ts @@ -2254,8 +2254,8 @@ const styles = (theme: ThemeColors) => width: '100%', }, - headerBarExtendedHeight: { - height: variables.contentHeaderExtendedHeight, + headerBarDesktopHeight: { + height: variables.contentHeaderDesktopHeight, }, imageViewContainer: { diff --git a/src/styles/variables.ts b/src/styles/variables.ts index 09cef771d0cf..d643ad811a19 100644 --- a/src/styles/variables.ts +++ b/src/styles/variables.ts @@ -13,8 +13,8 @@ function getValueUsingPixelRatio(defaultValue: number, maxValue: number): number export default { bottomTabHeight: 80, - contentHeaderHeight: getValueUsingPixelRatio(73, 100), - contentHeaderExtendedHeight: getValueUsingPixelRatio(80, 100), + contentHeaderHeight: getValueUsingPixelRatio(72, 100), + contentHeaderDesktopHeight: getValueUsingPixelRatio(80, 100), componentSizeSmall: getValueUsingPixelRatio(28, 32), componentSizeNormal: 40, componentSizeMedium: 48, From 7875ed04b511625411eee885b1ee15a03d0fe006 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:28:55 +0100 Subject: [PATCH 063/122] cleanup --- src/components/HeaderWithBackButton/types.ts | 9 +++++---- src/pages/ShareCodePage.js | 1 - src/pages/settings/AboutPage/AboutPage.tsx | 1 - src/pages/settings/Preferences/PreferencesPage.js | 1 - src/pages/settings/Profile/ProfilePage.js | 1 - src/pages/settings/Security/SecuritySettingsPage.tsx | 1 - src/pages/settings/Wallet/WalletPage/WalletPage.js | 1 - 7 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/components/HeaderWithBackButton/types.ts b/src/components/HeaderWithBackButton/types.ts index a5fdf1bc0690..83afbad8636b 100644 --- a/src/components/HeaderWithBackButton/types.ts +++ b/src/components/HeaderWithBackButton/types.ts @@ -28,7 +28,11 @@ type HeaderWithBackButtonProps = Partial & { /** Title color */ titleColor?: string; - /** Icon displayed on the left of the title */ + /** + * Icon displayed on the left of the title. + * If it is passed, the new styling is applied to the component: + * taller header on desktop and different font of the title. + * */ icon?: IconAsset; /** Method to trigger when pressing download button of the header */ @@ -117,9 +121,6 @@ type HeaderWithBackButtonProps = Partial & { /** Whether we should overlay the 3 dots menu */ shouldOverlayDots?: boolean; - - /** Whether we should use increased height. */ - isCentralPaneSettings?: boolean; }; export type {ThreeDotsMenuItem}; diff --git a/src/pages/ShareCodePage.js b/src/pages/ShareCodePage.js index 69ef80900c9f..94f74b9f21b6 100644 --- a/src/pages/ShareCodePage.js +++ b/src/pages/ShareCodePage.js @@ -90,7 +90,6 @@ class ShareCodePage extends React.Component { onBackButtonPress={() => Navigation.goBack(isReport ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(this.props.report.reportID) : ROUTES.SETTINGS)} shouldShowBackButton={isReport || this.props.isSmallScreenWidth} icon={Illustrations.QrCode} - isCentralPaneSettings /> diff --git a/src/pages/settings/AboutPage/AboutPage.tsx b/src/pages/settings/AboutPage/AboutPage.tsx index 96a195d19d5e..375df9b2864b 100644 --- a/src/pages/settings/AboutPage/AboutPage.tsx +++ b/src/pages/settings/AboutPage/AboutPage.tsx @@ -134,7 +134,6 @@ function AboutPage() { overlayContent={overlayContent} shouldShowOfflineIndicatorInWideScreen icon={Illustrations.PalmTree} - isCentralPaneSettings > {translate('footer.aboutExpensify')} diff --git a/src/pages/settings/Preferences/PreferencesPage.js b/src/pages/settings/Preferences/PreferencesPage.js index 5dcb4cc5265c..a81a0738c2b9 100755 --- a/src/pages/settings/Preferences/PreferencesPage.js +++ b/src/pages/settings/Preferences/PreferencesPage.js @@ -57,7 +57,6 @@ function PreferencesPage(props) { shouldShowBackButton={isSmallScreenWidth} shouldShowOfflineIndicatorInWideScreen icon={Illustrations.Gears} - isCentralPaneSettings > Navigation.goBack(ROUTES.SETTINGS)} shouldShowBackButton={props.isSmallScreenWidth} icon={Illustrations.Profile} - isCentralPaneSettings /> diff --git a/src/pages/settings/Security/SecuritySettingsPage.tsx b/src/pages/settings/Security/SecuritySettingsPage.tsx index cbfb1b958570..c98b5a9f9ba5 100644 --- a/src/pages/settings/Security/SecuritySettingsPage.tsx +++ b/src/pages/settings/Security/SecuritySettingsPage.tsx @@ -55,7 +55,6 @@ function SecuritySettingsPage() { backgroundColor={theme.PAGE_THEMES[SCREENS.SETTINGS.SECURITY].backgroundColor} shouldShowOfflineIndicatorInWideScreen icon={Illustrations.LockClosed} - isCentralPaneSettings > diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.js b/src/pages/settings/Wallet/WalletPage/WalletPage.js index 2db914570155..417d5b890dea 100644 --- a/src/pages/settings/Wallet/WalletPage/WalletPage.js +++ b/src/pages/settings/Wallet/WalletPage/WalletPage.js @@ -343,7 +343,6 @@ function WalletPage({bankAccountList, cardList, fundList, isLoadingPaymentMethod onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS)} icon={Illustrations.MoneyIntoWallet} shouldShowBackButton={isSmallScreenWidth} - isCentralPaneSettings /> From 7d8e0d5f3fedcc8b6e5e2bb106231c91d50d69c3 Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 5 Feb 2024 22:51:22 +0700 Subject: [PATCH 064/122] fix types --- src/libs/Navigation/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 9c6cd8ed6981..cde54e2559e2 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -216,8 +216,8 @@ type MoneyRequestNavigatorParamList = { threadReportID: string; }; [SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: { - action: string; - iouType: string; + action: ValueOf; + iouType: ValueOf; reportID: string; field: string; threadReportID: string; From 85f2dc1763c9f0b2defdabd451f082a9d6a67dba Mon Sep 17 00:00:00 2001 From: Abdelrahman Khattab Date: Mon, 5 Feb 2024 17:51:48 +0200 Subject: [PATCH 065/122] fix LHN titles to show the participant name for reimbursable transactions as well --- src/libs/ReportUtils.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index ad12339a4338..4e5aaf46cf86 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2257,9 +2257,10 @@ function getReportPreviewMessage( } } + const containsNonReimbursable = hasNonReimbursableTransactions(report.reportID); const totalAmount = getMoneyRequestSpendBreakdown(report).totalDisplaySpend; const policyName = getPolicyName(report, false, policy); - const payerName = isExpenseReport(report) ? policyName : getDisplayNameForParticipant(report.managerID, !isPreviewMessageForParentChatReport); + const payerName = isExpenseReport(report) && !containsNonReimbursable ? policyName : getDisplayNameForParticipant(report.managerID, !isPreviewMessageForParentChatReport); const formattedAmount = CurrencyUtils.convertToDisplayString(totalAmount, report.currency); @@ -2303,8 +2304,6 @@ function getReportPreviewMessage( return Localize.translateLocal('iou.waitingOnBankAccount', {submitterDisplayName}); } - const containsNonReimbursable = hasNonReimbursableTransactions(report.reportID); - const lastActorID = reportAction?.actorAccountID; // if we have the amount in the originalMessage and lastActorID, we can use that to display the preview message for the latest request From e86aaa7f828e2c7424809878c3b5075321d5ed10 Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 5 Feb 2024 22:57:07 +0700 Subject: [PATCH 066/122] fix types --- src/components/ReportActionItem/MoneyRequestView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 285d4c6f860f..3cf009313c90 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -273,7 +273,7 @@ function MoneyRequestView({ ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute( CONST.IOU.ACTION.EDIT, CONST.IOU.TYPE.REQUEST, - transaction.transactionID, + transaction?.transactionID ?? '', report.reportID, Navigation.getActiveRouteWithoutParams(), ), From 111c1a298a6827f5629975e567ec376730905d82 Mon Sep 17 00:00:00 2001 From: Yauheni Date: Mon, 5 Feb 2024 16:59:21 +0100 Subject: [PATCH 067/122] Fix bug with Distance - By adding 2nd add stop user can delete empty location --- src/pages/iou/request/step/IOURequestStepWaypoint.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepWaypoint.js b/src/pages/iou/request/step/IOURequestStepWaypoint.js index 4c35951bc297..e9a3b13b0dc6 100644 --- a/src/pages/iou/request/step/IOURequestStepWaypoint.js +++ b/src/pages/iou/request/step/IOURequestStepWaypoint.js @@ -113,8 +113,8 @@ function IOURequestStepWaypoint({ const locationBias = useLocationBias(allWaypoints, userLocation); const waypointAddress = lodashGet(currentWaypoint, 'address', ''); - // Hide the menu when there is only start and finish waypoint - const shouldShowThreeDotsButton = waypointCount > 2; + // Hide the menu when there is only start and finish waypoint and the current waypoint is not empty + const shouldShowThreeDotsButton = waypointCount > 2 && waypointAddress; const shouldDisableEditor = isFocused && (Number.isNaN(parsedWaypointIndex) || parsedWaypointIndex < 0 || parsedWaypointIndex > waypointCount || (filledWaypointCount < 2 && parsedWaypointIndex >= waypointCount)); From 9070dc4c74fc95937cc30b95124420e16acd2af7 Mon Sep 17 00:00:00 2001 From: Yauheni Date: Mon, 5 Feb 2024 17:09:32 +0100 Subject: [PATCH 068/122] Update comment for shouldShowThreeDotsButton --- src/pages/iou/request/step/IOURequestStepWaypoint.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepWaypoint.js b/src/pages/iou/request/step/IOURequestStepWaypoint.js index e9a3b13b0dc6..93a87baa0481 100644 --- a/src/pages/iou/request/step/IOURequestStepWaypoint.js +++ b/src/pages/iou/request/step/IOURequestStepWaypoint.js @@ -113,7 +113,7 @@ function IOURequestStepWaypoint({ const locationBias = useLocationBias(allWaypoints, userLocation); const waypointAddress = lodashGet(currentWaypoint, 'address', ''); - // Hide the menu when there is only start and finish waypoint and the current waypoint is not empty + // Hide the menu when there is only start and finish waypoint or the current waypoint is empty const shouldShowThreeDotsButton = waypointCount > 2 && waypointAddress; const shouldDisableEditor = isFocused && From 446a515fdea9421821e2070a454e9a35c94245e1 Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 5 Feb 2024 23:20:41 +0700 Subject: [PATCH 069/122] add draft trsanaction to get default value --- .../request/step/IOURequestStepDescription.js | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 2b753931aa4a..9c16f6076201 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -2,6 +2,7 @@ import {useFocusEffect} from '@react-navigation/native'; import lodashGet from 'lodash/get'; import React, {useCallback, useRef} from 'react'; import {View} from 'react-native'; +import {withOnyx} from 'react-native-onyx'; import FormProvider from '@components/Form/FormProvider'; import InputWrapperWithRef from '@components/Form/InputWrapper'; import TextInput from '@components/TextInput'; @@ -28,10 +29,14 @@ const propTypes = { /** Onyx Props */ /** Holds data related to Money Request view state, rather than the underlying Money Request data. */ transaction: transactionPropTypes, + + /** The draft transaction that holds data to be persisted on the current transaction */ + draftTransaction: transactionPropTypes, }; const defaultProps = { transaction: {}, + draftTransaction: undefined, }; function IOURequestStepDescription({ @@ -39,6 +44,7 @@ function IOURequestStepDescription({ params: {action, iouType, reportID, backTo}, }, transaction, + draftTransaction, }) { const styles = useThemeStyles(); const {translate} = useLocalize(); @@ -60,6 +66,8 @@ function IOURequestStepDescription({ }, []), ); + const currentDescription = lodashGet(draftTransaction, 'comment.comment', undefined) || lodashGet(transaction, 'comment.comment', ''); + const navigateBack = () => { Navigation.goBack(backTo || ROUTES.HOME); }; @@ -79,7 +87,7 @@ function IOURequestStepDescription({ } // Only update comment if it has changed - if (newComment === lodashGet(transaction, 'comment.comment', '')) { + if (newComment === currentDescription) { navigateBack(); return; } @@ -112,7 +120,7 @@ function IOURequestStepDescription({ InputComponent={TextInput} inputID="moneyRequestComment" name="moneyRequestComment" - defaultValue={lodashGet(transaction, 'comment.comment', '')} + defaultValue={currentDescription} label={translate('moneyRequestConfirmationList.whatsItFor')} accessibilityLabel={translate('moneyRequestConfirmationList.whatsItFor')} role={CONST.ROLE.PRESENTATION} @@ -137,4 +145,12 @@ IOURequestStepDescription.propTypes = propTypes; IOURequestStepDescription.defaultProps = defaultProps; IOURequestStepDescription.displayName = 'IOURequestStepDescription'; -export default compose(withWritableReportOrNotFound, withFullTransactionOrNotFound)(IOURequestStepDescription); +export default compose( + withWritableReportOrNotFound, + withFullTransactionOrNotFound, + withOnyx({ + draftTransaction: { + key: ({transaction}) => `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transaction.transactionID}`, + }, + }), +)(IOURequestStepDescription); From 069e83e0abd8e46ab03427b7a959062bab7a3863 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 01:13:59 +0700 Subject: [PATCH 070/122] revert change --- .../HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js index 744fd17d461f..e3718a7de960 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js +++ b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js @@ -57,7 +57,7 @@ function MentionUserRenderer(props) { if (!_.isEmpty(htmlAttributeAccountID)) { const user = lodashGet(personalDetails, htmlAttributeAccountID); accountID = parseInt(htmlAttributeAccountID, 10); - displayNameOrLogin = ReportUtils.getDisplayNameForParticipant(accountID); + displayNameOrLogin = lodashGet(user, 'displayName', '') || LocalePhoneNumber.formatPhoneNumber(lodashGet(user, 'login', '')) || translate('common.hidden'); displayNameOrLogin = getMentionDisplayText(displayNameOrLogin, htmlAttributeAccountID, lodashGet(user, 'login', '')); navigationRoute = ROUTES.PROFILE.getRoute(htmlAttributeAccountID); } else if (!_.isEmpty(tnode.data)) { From 03743f793a96b3ad60f21f0adb633174c8c90d6c Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 08:04:32 +0700 Subject: [PATCH 071/122] fix lint --- .../HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js index e3718a7de960..cd6ada90b58b 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js +++ b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.js @@ -8,8 +8,10 @@ import {ShowContextMenuContext, showContextMenuForReport} from '@components/Show import Text from '@components/Text'; import UserDetailsTooltip from '@components/UserDetailsTooltip'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; +import useLocalize from '@hooks/useLocalize'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; +import * as LocalePhoneNumber from '@libs/LocalePhoneNumber'; import Navigation from '@libs/Navigation/Navigation'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as ReportUtils from '@libs/ReportUtils'; @@ -29,6 +31,7 @@ const propTypes = { function MentionUserRenderer(props) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); + const {translate} = useLocalize(); const defaultRendererProps = _.omit(props, ['TDefaultRenderer', 'style']); const htmlAttributeAccountID = lodashGet(props.tnode.attributes, 'accountid'); const personalDetails = usePersonalDetails() || CONST.EMPTY_OBJECT; From d7de25978c7c548ae3bfd515522a86f253f8b5ea Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 10:00:33 +0700 Subject: [PATCH 072/122] fix back loop between expensify card and active card page --- src/pages/settings/Wallet/ActivatePhysicalCardPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/settings/Wallet/ActivatePhysicalCardPage.js b/src/pages/settings/Wallet/ActivatePhysicalCardPage.js index 947252649cc4..649e42bfffbe 100644 --- a/src/pages/settings/Wallet/ActivatePhysicalCardPage.js +++ b/src/pages/settings/Wallet/ActivatePhysicalCardPage.js @@ -133,7 +133,7 @@ function ActivatePhysicalCardPage({ return ( Navigation.navigate(ROUTES.SETTINGS_WALLET_DOMAINCARD.getRoute(domain))} + onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS_WALLET_DOMAINCARD.getRoute(domain))} backgroundColor={theme.PAGE_THEMES[SCREENS.SETTINGS.PREFERENCES.ROOT].backgroundColor} illustration={LottieAnimations.Magician} scrollViewContainerStyles={[styles.mnh100]} From 3aa35d27473f9cc671adc5dbac63cbc026c27ff3 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Tue, 6 Feb 2024 12:43:25 +0800 Subject: [PATCH 073/122] memoize the sections --- src/components/ValuePicker/ValueSelectorModal.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/components/ValuePicker/ValueSelectorModal.js b/src/components/ValuePicker/ValueSelectorModal.js index e45ba873d8a3..34a84d7595ea 100644 --- a/src/components/ValuePicker/ValueSelectorModal.js +++ b/src/components/ValuePicker/ValueSelectorModal.js @@ -1,6 +1,6 @@ import _ from 'lodash'; import PropTypes from 'prop-types'; -import React, {useEffect, useState} from 'react'; +import React, {useEffect, useMemo, useState} from 'react'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import Modal from '@components/Modal'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -42,11 +42,9 @@ const defaultProps = { function ValueSelectorModal({items, selectedItem, label, isVisible, onClose, onItemSelected, shouldShowTooltips}) { const styles = useThemeStyles(); - const [sectionsData, setSectionsData] = useState([]); - - useEffect(() => { + const sections = useMemo(() => { const itemsData = _.map(items, (item) => ({value: item.value, alternateText: item.description, keyForList: item.value, text: item.label, isSelected: item === selectedItem})); - setSectionsData(itemsData); + return [{data: itemsData}]; }, [items, selectedItem]); return ( @@ -69,7 +67,7 @@ function ValueSelectorModal({items, selectedItem, label, isVisible, onClose, onI onBackButtonPress={onClose} /> Date: Tue, 6 Feb 2024 13:03:08 +0800 Subject: [PATCH 074/122] remove unused import --- src/components/ValuePicker/ValueSelectorModal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ValuePicker/ValueSelectorModal.js b/src/components/ValuePicker/ValueSelectorModal.js index 34a84d7595ea..f93df86c9ab9 100644 --- a/src/components/ValuePicker/ValueSelectorModal.js +++ b/src/components/ValuePicker/ValueSelectorModal.js @@ -1,6 +1,6 @@ import _ from 'lodash'; import PropTypes from 'prop-types'; -import React, {useEffect, useMemo, useState} from 'react'; +import React, {useMemo} from 'react'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import Modal from '@components/Modal'; import ScreenWrapper from '@components/ScreenWrapper'; From e3e0b2db46a1d8fa2097ba8cf51b045b690d5c26 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Tue, 6 Feb 2024 09:25:11 +0100 Subject: [PATCH 075/122] set breadcrumbs height --- src/components/Breadcrumbs.tsx | 2 +- src/pages/home/sidebar/AllSettingsScreen.tsx | 2 +- src/pages/home/sidebar/SidebarLinks.js | 2 +- src/pages/workspace/WorkspaceInitialPage.js | 2 +- src/styles/index.ts | 4 ++++ 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/Breadcrumbs.tsx b/src/components/Breadcrumbs.tsx index 6af3a4c6d477..34bc3f7e30c8 100644 --- a/src/components/Breadcrumbs.tsx +++ b/src/components/Breadcrumbs.tsx @@ -38,7 +38,7 @@ function Breadcrumbs({breadcrumbs, style}: BreadcrumbsProps) { const [primaryBreadcrumb, secondaryBreadcrumb] = breadcrumbs; return ( - + {primaryBreadcrumb.type === CONST.BREADCRUMB_TYPE.ROOT ? (

textDecorationLine: 'none', }, + breadcrumsContainer: { + height: 24, + }, + breadcrumb: { color: theme.textSupporting, fontSize: variables.fontSizeh1, From 44ae0ca42fe476ac98ebd88968b9e4157bf7d33b Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Tue, 6 Feb 2024 09:38:19 +0100 Subject: [PATCH 076/122] increase height on illustration header --- src/components/HeaderWithBackButton/index.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/HeaderWithBackButton/index.tsx b/src/components/HeaderWithBackButton/index.tsx index aedba56a7b6b..4ebfd4b24183 100755 --- a/src/components/HeaderWithBackButton/index.tsx +++ b/src/components/HeaderWithBackButton/index.tsx @@ -15,7 +15,6 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useThrottledButtonState from '@hooks/useThrottledButtonState'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; -import useWindowDimensions from '@hooks/useWindowDimensions'; import getButtonState from '@libs/getButtonState'; import Navigation from '@libs/Navigation/Navigation'; import variables from '@styles/variables'; @@ -67,7 +66,6 @@ function HeaderWithBackButton({ const {translate} = useLocalize(); const {isKeyboardShown} = useKeyboardState(); const waitForNavigate = useWaitForNavigation(); - const {isSmallScreenWidth} = useWindowDimensions(); // If the icon is present, the header bar should be taller and use different font. const isCentralPaneSettings = !!icon; @@ -79,7 +77,7 @@ function HeaderWithBackButton({ dataSet={{dragArea: false}} style={[ styles.headerBar, - isCentralPaneSettings && !isSmallScreenWidth && styles.headerBarDesktopHeight, + isCentralPaneSettings && styles.headerBarDesktopHeight, shouldShowBorderBottom && styles.borderBottom, shouldShowBackButton ? styles.pl0 : styles.pl5, shouldOverlay && StyleSheet.absoluteFillObject, From 0ff9e7f608a18ff9283f80407e7018210f301b02 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Tue, 6 Feb 2024 18:42:50 +0800 Subject: [PATCH 077/122] prevent modal click propagation --- src/components/Modal/BaseModal.tsx | 1 + src/components/PopoverWithoutOverlay/index.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/components/Modal/BaseModal.tsx b/src/components/Modal/BaseModal.tsx index c1f4df8d4c99..46e35aed1519 100644 --- a/src/components/Modal/BaseModal.tsx +++ b/src/components/Modal/BaseModal.tsx @@ -176,6 +176,7 @@ function BaseModal( return ( e.stopPropagation()} onBackdropPress={handleBackdropPress} // Note: Escape key on web/desktop will trigger onBackButtonPress callback // eslint-disable-next-line react/jsx-props-no-multi-spaces diff --git a/src/components/PopoverWithoutOverlay/index.tsx b/src/components/PopoverWithoutOverlay/index.tsx index 58d022ef9d65..b08a1e39438b 100644 --- a/src/components/PopoverWithoutOverlay/index.tsx +++ b/src/components/PopoverWithoutOverlay/index.tsx @@ -121,6 +121,7 @@ function PopoverWithoutOverlay( e.stopPropagation()} > Date: Tue, 6 Feb 2024 18:08:24 +0700 Subject: [PATCH 078/122] fix types --- src/libs/Navigation/types.ts | 4 +-- .../request/step/IOURequestStepDescription.js | 27 +++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 676dcafb7d05..b65f7553a3d6 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -218,9 +218,9 @@ type MoneyRequestNavigatorParamList = { [SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: { action: ValueOf; iouType: ValueOf; + transactionID: string; reportID: string; - field: string; - threadReportID: string; + backTo: string; }; [SCREENS.MONEY_REQUEST.CATEGORY]: { iouType: string; diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 9c16f6076201..3f42af8d0976 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -1,5 +1,6 @@ import {useFocusEffect} from '@react-navigation/native'; import lodashGet from 'lodash/get'; +import lodashIsEmpty from 'lodash/isEmpty'; import React, {useCallback, useRef} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; @@ -31,12 +32,12 @@ const propTypes = { transaction: transactionPropTypes, /** The draft transaction that holds data to be persisted on the current transaction */ - draftTransaction: transactionPropTypes, + splitDraftTransaction: transactionPropTypes, }; const defaultProps = { transaction: {}, - draftTransaction: undefined, + splitDraftTransaction: {}, }; function IOURequestStepDescription({ @@ -44,7 +45,7 @@ function IOURequestStepDescription({ params: {action, iouType, reportID, backTo}, }, transaction, - draftTransaction, + splitDraftTransaction, }) { const styles = useThemeStyles(); const {translate} = useLocalize(); @@ -66,7 +67,11 @@ function IOURequestStepDescription({ }, []), ); - const currentDescription = lodashGet(draftTransaction, 'comment.comment', undefined) || lodashGet(transaction, 'comment.comment', ''); + let currentDescription = lodashGet(transaction, 'comment.comment', ''); + + if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT && !lodashIsEmpty(splitDraftTransaction)) { + currentDescription = lodashGet(splitDraftTransaction, 'comment.comment', '') + } const navigateBack = () => { Navigation.goBack(backTo || ROUTES.HOME); @@ -79,15 +84,15 @@ function IOURequestStepDescription({ const updateComment = (value) => { const newComment = value.moneyRequestComment.trim(); - // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value - if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT) { - IOU.setDraftSplitTransaction(transaction.transactionID, {comment: newComment}); + // Only update comment if it has changed + if (newComment === currentDescription) { navigateBack(); return; } - // Only update comment if it has changed - if (newComment === currentDescription) { + // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value + if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT) { + IOU.setDraftSplitTransaction(transaction.transactionID, {comment: newComment}); navigateBack(); return; } @@ -149,8 +154,8 @@ export default compose( withWritableReportOrNotFound, withFullTransactionOrNotFound, withOnyx({ - draftTransaction: { - key: ({transaction}) => `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transaction.transactionID}`, + splitDraftTransaction: { + key: ({route}) => `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${route.transactionID}`, }, }), )(IOURequestStepDescription); From e45d6e0865ccbfd814a7762bf7401938fa494a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20M=C3=B3rawski?= Date: Tue, 6 Feb 2024 12:58:31 +0100 Subject: [PATCH 079/122] simplifying referral CTA dismissing --- src/components/ReferralProgramCTA.tsx | 32 ++- src/pages/SearchPage.js | 227 ---------------------- src/pages/SearchPage/SearchPageFooter.tsx | 37 +--- 3 files changed, 31 insertions(+), 265 deletions(-) delete mode 100755 src/pages/SearchPage.js diff --git a/src/components/ReferralProgramCTA.tsx b/src/components/ReferralProgramCTA.tsx index f1c7539cc6b5..4e0ed1f573f9 100644 --- a/src/components/ReferralProgramCTA.tsx +++ b/src/components/ReferralProgramCTA.tsx @@ -1,32 +1,45 @@ import React from 'react'; +import {withOnyx} from 'react-native-onyx'; import useLocalize from '@hooks/useLocalize'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; +import * as User from '@userActions/User'; import CONST from '@src/CONST'; import Navigation from '@src/libs/Navigation/Navigation'; +import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import type {DismissedReferralBanners} from '@src/types/onyx/Account'; import Icon from './Icon'; import {Close} from './Icon/Expensicons'; import {PressableWithoutFeedback} from './Pressable'; import Text from './Text'; import Tooltip from './Tooltip'; -type ReferralProgramCTAProps = { +type ReferralProgramCTAOnyxProps = { + dismissedReferralBanners: DismissedReferralBanners; +}; + +type ReferralProgramCTAProps = ReferralProgramCTAOnyxProps & { referralContentType: | typeof CONST.REFERRAL_PROGRAM.CONTENT_TYPES.MONEY_REQUEST | typeof CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT | typeof CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SEND_MONEY | typeof CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND; - - /** Method to trigger when pressing close button of the banner */ - onCloseButtonPress?: () => void; }; -function ReferralProgramCTA({referralContentType, onCloseButtonPress = () => {}}: ReferralProgramCTAProps) { +function ReferralProgramCTA({referralContentType, dismissedReferralBanners}: ReferralProgramCTAProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const theme = useTheme(); + const handleDismissCallToAction = () => { + User.dismissReferralBanner(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND); + }; + + if (!referralContentType || dismissedReferralBanners[referralContentType]) { + return null; + } + return ( { @@ -47,7 +60,7 @@ function ReferralProgramCTA({referralContentType, onCloseButtonPress = () => {}} { e.preventDefault(); }} @@ -67,4 +80,9 @@ function ReferralProgramCTA({referralContentType, onCloseButtonPress = () => {}} ); } -export default ReferralProgramCTA; +export default withOnyx({ + dismissedReferralBanners: { + key: ONYXKEYS.ACCOUNT, + selector: (data) => data?.dismissedReferralBanners ?? {}, + }, +})(ReferralProgramCTA); diff --git a/src/pages/SearchPage.js b/src/pages/SearchPage.js deleted file mode 100755 index d8eef6f447ae..000000000000 --- a/src/pages/SearchPage.js +++ /dev/null @@ -1,227 +0,0 @@ -import PropTypes from 'prop-types'; -import React, {useCallback, useEffect, useRef, useState} from 'react'; -import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import OptionsSelector from '@components/OptionsSelector'; -import ScreenWrapper from '@components/ScreenWrapper'; -import useLocalize from '@hooks/useLocalize'; -import useNetwork from '@hooks/useNetwork'; -import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@libs/Navigation/Navigation'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import Performance from '@libs/Performance'; -import * as ReportUtils from '@libs/ReportUtils'; -import * as Report from '@userActions/Report'; -import Timing from '@userActions/Timing'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import personalDetailsPropType from './personalDetailsPropType'; -import reportPropTypes from './reportPropTypes'; - -const propTypes = { - /* Onyx Props */ - - /** Beta features list */ - betas: PropTypes.arrayOf(PropTypes.string), - - /** All of the personal details for everyone */ - personalDetails: PropTypes.objectOf(personalDetailsPropType), - - /** All reports shared with the user */ - reports: PropTypes.objectOf(reportPropTypes), - - /** Whether we are searching for reports in the server */ - isSearchingForReports: PropTypes.bool, - - /** - * The navigation prop passed by the navigator. - * - * This is required because transitionEnd event doesn't trigger in the automated testing environment. - */ - navigation: PropTypes.shape({}), -}; - -const defaultProps = { - betas: [], - personalDetails: {}, - reports: {}, - isSearchingForReports: false, - navigation: {}, -}; - -function SearchPage({betas, personalDetails, reports, isSearchingForReports, navigation}) { - const [searchValue, setSearchValue] = useState(''); - const [searchOptions, setSearchOptions] = useState({ - recentReports: {}, - personalDetails: {}, - userToInvite: {}, - }); - - const {isOffline} = useNetwork(); - const {translate} = useLocalize(); - const themeStyles = useThemeStyles(); - const isMounted = useRef(false); - - const updateOptions = useCallback(() => { - const { - recentReports: localRecentReports, - personalDetails: localPersonalDetails, - userToInvite: localUserToInvite, - } = OptionsListUtils.getSearchOptions(reports, personalDetails, searchValue.trim(), betas); - - setSearchOptions({ - recentReports: localRecentReports, - personalDetails: localPersonalDetails, - userToInvite: localUserToInvite, - }); - }, [reports, personalDetails, searchValue, betas]); - - useEffect(() => { - Timing.start(CONST.TIMING.SEARCH_RENDER); - Performance.markStart(CONST.TIMING.SEARCH_RENDER); - }, []); - - useEffect(() => { - updateOptions(); - }, [reports, personalDetails, betas, updateOptions]); - - useEffect(() => { - if (!isMounted.current) { - isMounted.current = true; - return; - } - - updateOptions(); - // Ignoring the rule intentionally, we want to run the code only when search Value changes to prevent additional runs. - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [searchValue]); - - /** - * Returns the sections needed for the OptionsSelector - * - * @returns {Array} - */ - const getSections = () => { - const sections = []; - let indexOffset = 0; - - if (searchOptions.recentReports.length > 0) { - sections.push({ - data: searchOptions.recentReports, - shouldShow: true, - indexOffset, - }); - indexOffset += searchOptions.recentReports.length; - } - - if (searchOptions.personalDetails.length > 0) { - sections.push({ - data: searchOptions.personalDetails, - shouldShow: true, - indexOffset, - }); - indexOffset += searchOptions.recentReports.length; - } - - if (searchOptions.userToInvite) { - sections.push({ - data: [searchOptions.userToInvite], - shouldShow: true, - indexOffset, - }); - } - - return sections; - }; - - const searchRendered = () => { - Timing.end(CONST.TIMING.SEARCH_RENDER); - Performance.markEnd(CONST.TIMING.SEARCH_RENDER); - }; - - const onChangeText = (value = '') => { - Report.searchInServer(searchValue); - setSearchValue(value); - }; - - /** - * Reset the search value and redirect to the selected report - * - * @param {Object} option - */ - const selectReport = (option) => { - if (!option) { - return; - } - if (option.reportID) { - Navigation.dismissModal(option.reportID); - } else { - Report.navigateToAndOpenReport([option.login]); - } - }; - - const isOptionsDataReady = ReportUtils.isReportDataReady() && OptionsListUtils.isPersonalDetailsReady(personalDetails); - const headerMessage = OptionsListUtils.getHeaderMessage( - searchOptions.recentReports.length + searchOptions.personalDetails.length !== 0, - Boolean(searchOptions.userToInvite), - searchValue, - ); - - return ( - - {({didScreenTransitionEnd, safeAreaPaddingBottomStyle}) => ( - <> - - - - - - )} - - ); -} - -SearchPage.propTypes = propTypes; -SearchPage.defaultProps = defaultProps; -SearchPage.displayName = 'SearchPage'; -export default withOnyx({ - reports: { - key: ONYXKEYS.COLLECTION.REPORT, - }, - personalDetails: { - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - }, - betas: { - key: ONYXKEYS.BETAS, - }, - isSearchingForReports: { - key: ONYXKEYS.IS_SEARCHING_FOR_REPORTS, - initWithStoredValues: false, - }, -})(SearchPage); diff --git a/src/pages/SearchPage/SearchPageFooter.tsx b/src/pages/SearchPage/SearchPageFooter.tsx index fcc04d8bc5af..3d5ebfd2c193 100644 --- a/src/pages/SearchPage/SearchPageFooter.tsx +++ b/src/pages/SearchPage/SearchPageFooter.tsx @@ -1,44 +1,19 @@ -import React, {useState} from 'react'; +import React from 'react'; import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; import ReferralProgramCTA from '@components/ReferralProgramCTA'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as User from '@userActions/User'; import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import type {DismissedReferralBanners} from '@src/types/onyx/Account'; -type SearchPageFooterOnyxProps = { - dismissedReferralBanners: DismissedReferralBanners; -}; -function SearchPageFooter({dismissedReferralBanners}: SearchPageFooterOnyxProps) { - const [shouldShowReferralCTA, setShouldShowReferralCTA] = useState(!dismissedReferralBanners[CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND]); +function SearchPageFooter() { const themeStyles = useThemeStyles(); - const closeCallToActionBanner = () => { - setShouldShowReferralCTA(false); - User.dismissReferralBanner(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND); - }; - return ( - <> - {shouldShowReferralCTA && ( - - - - )} - + + + ); } SearchPageFooter.displayName = 'SearchPageFooter'; -export default withOnyx({ - dismissedReferralBanners: { - key: ONYXKEYS.ACCOUNT, - selector: (data) => data?.dismissedReferralBanners ?? {}, - }, -})(SearchPageFooter); +export default SearchPageFooter; From efa0eff51fad0805d6c475d737ccb2138647983a Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:16:53 +0100 Subject: [PATCH 080/122] add test for failureNotifier workflow --- .github/workflows/failureNotifier.yml | 2 +- .../assertions/failureNotifierAssertions.js | 20 ++++++ workflow_tests/failureNotifier.test.js | 61 +++++++++++++++++++ workflow_tests/mocks/failureNotifierMocks.js | 24 ++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 workflow_tests/assertions/failureNotifierAssertions.js create mode 100644 workflow_tests/failureNotifier.test.js create mode 100644 workflow_tests/mocks/failureNotifierMocks.js diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 604770eff4d7..17e18e6e53f0 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -10,7 +10,7 @@ permissions: issues: write jobs: - notify-failure: + notifyFailure: runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'failure' }} steps: diff --git a/workflow_tests/assertions/failureNotifierAssertions.js b/workflow_tests/assertions/failureNotifierAssertions.js new file mode 100644 index 000000000000..2491c4fa8469 --- /dev/null +++ b/workflow_tests/assertions/failureNotifierAssertions.js @@ -0,0 +1,20 @@ +const utils = require('../utils/utils'); + +const assertNotifyFailureJobExecuted = (workflowResult, didExecute = true) => { + const steps = [ + utils.createStepAssertion('Fetch Workflow Run Jobs', true, null, 'NOTIFYFAILURE', 'Fetch Workflow Run Jobs', [], []), + utils.createStepAssertion('Process Each Failed Job', true, null, 'NOTIFYFAILURE', 'Process Each Failed Job', [], []), + ]; + + for (const expectedStep of steps) { + if (didExecute) { + expect(workflowResult).toEqual(expect.arrayContaining([expectedStep])); + } else { + expect(workflowResult).not.toEqual(expect.arrayContaining([expectedStep])); + } + } +}; + +module.exports = { + assertNotifyFailureJobExecuted, +}; diff --git a/workflow_tests/failureNotifier.test.js b/workflow_tests/failureNotifier.test.js new file mode 100644 index 000000000000..1509cc5cc53a --- /dev/null +++ b/workflow_tests/failureNotifier.test.js @@ -0,0 +1,61 @@ +const path = require('path'); +const kieMockGithub = require('@kie/mock-github'); +const utils = require('./utils/utils'); +const assertions = require('./assertions/failureNotifierAssertions'); +const mocks = require('./mocks/failureNotifierMocks'); +const eAct = require('./utils/ExtendedAct'); + +jest.setTimeout(90 * 1000); +let mockGithub; +const FILES_TO_COPY_INTO_TEST_REPO = [ + { + src: path.resolve(__dirname, '..', '.github', 'workflows', 'failureNotifier.yml'), + dest: '.github/workflows/failureNotifier.yml', + }, +]; + +describe('test workflow failureNotifier', () => { + const githubToken = 'dummy_github_token'; + const actor = 'Dummy Actor'; + beforeEach(async () => { + // create a local repository and copy required files + mockGithub = new kieMockGithub.MockGithub({ + repo: { + testFailureNotifierWorkflowRepo: { + files: FILES_TO_COPY_INTO_TEST_REPO, + + // if any branches besides main are need add: pushedBranches: ['staging', 'production'], + }, + }, + }); + + await mockGithub.setup(); + }); + + afterEach(async () => { + await mockGithub.teardown(); + }); + it('runs the notify failure when main fails', async () => { + const repoPath = mockGithub.repo.getPath('testFailureNotifierWorkflowRepo') || ''; + const workflowPath = path.join(repoPath, '.github', 'workflows', 'failureNotifier.yml'); + let act = new eAct.ExtendedAct(repoPath, workflowPath); + const event = 'workflow_run'; + act = act.setEvent({ + workflow_run: { + name: 'Process new code merged to main', + conclusion: 'failure', + }, + }); + const testMockSteps = { + notifyFailure: mocks.FAILURENOTIFIER__NOTIFYFAILURE__STEP_MOCKS, + }; + const result = await act.runEvent(event, { + workflowFile: path.join(repoPath, '.github', 'workflows', 'failureNotifier.yml'), + mockSteps: testMockSteps, + actor, + }); + + // assert execution with imported assertions + assertions.assertNotifyFailureJobExecuted(result); + }); +}); diff --git a/workflow_tests/mocks/failureNotifierMocks.js b/workflow_tests/mocks/failureNotifierMocks.js new file mode 100644 index 000000000000..f265ba4c191a --- /dev/null +++ b/workflow_tests/mocks/failureNotifierMocks.js @@ -0,0 +1,24 @@ +const utils = require('../utils/utils'); + +// notifyfailure +const FAILURENOTIFIER__NOTIFYFAILURE__FETCH_WORKFLOW_RUN_JOBS__STEP_MOCK = utils.createMockStep( + 'Fetch Workflow Run Jobs', + 'Fetch Workflow Run Jobs', + 'NOTIFYFAILURE', + [], + [], + // add outputs if needed +); +const FAILURENOTIFIER__NOTIFYFAILURE__PROCESS_EACH_FAILED_JOB__STEP_MOCK = utils.createMockStep( + 'Process Each Failed Job', + 'Process Each Failed Job', + 'NOTIFYFAILURE', + [], + [], + // add outputs if needed +); +const FAILURENOTIFIER__NOTIFYFAILURE__STEP_MOCKS = [FAILURENOTIFIER__NOTIFYFAILURE__FETCH_WORKFLOW_RUN_JOBS__STEP_MOCK, FAILURENOTIFIER__NOTIFYFAILURE__PROCESS_EACH_FAILED_JOB__STEP_MOCK]; + +module.exports = { + FAILURENOTIFIER__NOTIFYFAILURE__STEP_MOCKS, +}; From 7a9fe0ea10861d8d5feacade769e3386c0623afe Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:24:06 +0100 Subject: [PATCH 081/122] fix lint errors --- workflow_tests/failureNotifier.test.js | 2 -- workflow_tests/mocks/failureNotifierMocks.js | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/workflow_tests/failureNotifier.test.js b/workflow_tests/failureNotifier.test.js index 1509cc5cc53a..655d5ed64d83 100644 --- a/workflow_tests/failureNotifier.test.js +++ b/workflow_tests/failureNotifier.test.js @@ -1,6 +1,5 @@ const path = require('path'); const kieMockGithub = require('@kie/mock-github'); -const utils = require('./utils/utils'); const assertions = require('./assertions/failureNotifierAssertions'); const mocks = require('./mocks/failureNotifierMocks'); const eAct = require('./utils/ExtendedAct'); @@ -15,7 +14,6 @@ const FILES_TO_COPY_INTO_TEST_REPO = [ ]; describe('test workflow failureNotifier', () => { - const githubToken = 'dummy_github_token'; const actor = 'Dummy Actor'; beforeEach(async () => { // create a local repository and copy required files diff --git a/workflow_tests/mocks/failureNotifierMocks.js b/workflow_tests/mocks/failureNotifierMocks.js index f265ba4c191a..e1a29453655e 100644 --- a/workflow_tests/mocks/failureNotifierMocks.js +++ b/workflow_tests/mocks/failureNotifierMocks.js @@ -1,3 +1,4 @@ +/* eslint-disable rulesdir/no-negated-variables */ const utils = require('../utils/utils'); // notifyfailure From b890290548a83a091980af8935f30820c5c606d9 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Tue, 6 Feb 2024 21:52:07 +0800 Subject: [PATCH 082/122] add comment --- src/components/Modal/BaseModal.tsx | 1 + src/components/PopoverWithoutOverlay/index.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/components/Modal/BaseModal.tsx b/src/components/Modal/BaseModal.tsx index 46e35aed1519..7fc5013f58a0 100644 --- a/src/components/Modal/BaseModal.tsx +++ b/src/components/Modal/BaseModal.tsx @@ -176,6 +176,7 @@ function BaseModal( return ( e.stopPropagation()} onBackdropPress={handleBackdropPress} // Note: Escape key on web/desktop will trigger onBackButtonPress callback diff --git a/src/components/PopoverWithoutOverlay/index.tsx b/src/components/PopoverWithoutOverlay/index.tsx index b08a1e39438b..a87e1f1f0412 100644 --- a/src/components/PopoverWithoutOverlay/index.tsx +++ b/src/components/PopoverWithoutOverlay/index.tsx @@ -121,6 +121,7 @@ function PopoverWithoutOverlay( e.stopPropagation()} > Date: Tue, 6 Feb 2024 21:02:19 +0700 Subject: [PATCH 083/122] fix lint --- src/libs/actions/IOU.ts | 1 - .../iou/request/step/IOURequestStepDescription.js | 15 ++++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 9a6bb63aae25..c7e2d6b09dc0 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -286,7 +286,6 @@ function setMoneyRequestOriginalCurrency_temporaryForRefactor(transactionID: str Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {originalCurrency}); } - function setMoneyRequestDescription(transactionID: string, comment: string, isDraft: boolean) { Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {comment: comment.trim()}}); } diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 3f42af8d0976..367c79fed6a1 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -51,6 +51,10 @@ function IOURequestStepDescription({ const {translate} = useLocalize(); const inputRef = useRef(null); const focusTimeoutRef = useRef(null); + // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value + const isEditingSplitBill = iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT; + const currentDescription = + isEditingSplitBill && !lodashIsEmpty(splitDraftTransaction) ? lodashGet(splitDraftTransaction, 'comment.comment', '') : lodashGet(transaction, 'comment.comment', ''); useFocusEffect( useCallback(() => { focusTimeoutRef.current = setTimeout(() => { @@ -67,12 +71,6 @@ function IOURequestStepDescription({ }, []), ); - let currentDescription = lodashGet(transaction, 'comment.comment', ''); - - if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT && !lodashIsEmpty(splitDraftTransaction)) { - currentDescription = lodashGet(splitDraftTransaction, 'comment.comment', '') - } - const navigateBack = () => { Navigation.goBack(backTo || ROUTES.HOME); }; @@ -155,7 +153,10 @@ export default compose( withFullTransactionOrNotFound, withOnyx({ splitDraftTransaction: { - key: ({route}) => `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${route.transactionID}`, + key: ({route}) => { + const transactionID = lodashGet(route, 'params.transactionID', 0); + return `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`; + }, }, }), )(IOURequestStepDescription); From c40f1d3ecff432c5eb852c841e99714d31939833 Mon Sep 17 00:00:00 2001 From: DylanDylann <141406735+DylanDylann@users.noreply.github.com> Date: Tue, 6 Feb 2024 21:36:44 +0700 Subject: [PATCH 084/122] Update src/pages/iou/request/step/IOURequestStepDescription.js Co-authored-by: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> --- src/pages/iou/request/step/IOURequestStepDescription.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepDescription.js b/src/pages/iou/request/step/IOURequestStepDescription.js index 367c79fed6a1..25477170f505 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.js +++ b/src/pages/iou/request/step/IOURequestStepDescription.js @@ -89,7 +89,7 @@ function IOURequestStepDescription({ } // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value - if (iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT) { + if (isEditingSplitBill) { IOU.setDraftSplitTransaction(transaction.transactionID, {comment: newComment}); navigateBack(); return; From f2b7144c18fc1eac3317caececf00487214c3340 Mon Sep 17 00:00:00 2001 From: Pavlo Tsimura Date: Tue, 6 Feb 2024 16:43:07 +0100 Subject: [PATCH 085/122] Fix setting tag for split requests --- src/pages/iou/request/step/IOURequestStepTag.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepTag.js b/src/pages/iou/request/step/IOURequestStepTag.js index 1297b98a0814..a05a14cb4403 100644 --- a/src/pages/iou/request/step/IOURequestStepTag.js +++ b/src/pages/iou/request/step/IOURequestStepTag.js @@ -69,7 +69,7 @@ function IOURequestStepTag({ const updateTag = (selectedTag) => { const isSelectedTag = selectedTag.searchText === tag; const updatedTag = !isSelectedTag ? selectedTag.searchText : ''; - if (isSplitBill) { + if (isSplitBill && isEditing) { IOU.setDraftSplitTransaction(transactionID, {tag: selectedTag.searchText}); navigateBack(); return; From cc2db7b1322ec15f98931df6aa1ec306dc018cd1 Mon Sep 17 00:00:00 2001 From: Jakub Kosmydel <104823336+kosmydel@users.noreply.github.com> Date: Tue, 6 Feb 2024 17:05:05 +0100 Subject: [PATCH 086/122] fix Profile icon --- .../simple-illustrations/simple-illustration__profile.svg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/images/simple-illustrations/simple-illustration__profile.svg b/assets/images/simple-illustrations/simple-illustration__profile.svg index be704403f18e..85312f26e186 100644 --- a/assets/images/simple-illustrations/simple-illustration__profile.svg +++ b/assets/images/simple-illustrations/simple-illustration__profile.svg @@ -1,6 +1,6 @@ - - - - + + + + From b19b85744b5627bf87181eb9be65c1ec813922a4 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Tue, 6 Feb 2024 17:11:25 +0100 Subject: [PATCH 087/122] Fix crash on iOS if requestAmount is 0 --- src/components/ReportActionItem/MoneyRequestPreview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.tsx b/src/components/ReportActionItem/MoneyRequestPreview.tsx index f321c63375d0..70a313c77e9e 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview.tsx @@ -321,7 +321,7 @@ function MoneyRequestPreview({ {shouldShowDescription && } {shouldShowMerchant && {merchantOrDescription}} - {isBillSplit && participantAccountIDs.length > 0 && requestAmount && requestAmount > 0 && ( + {isBillSplit && participantAccountIDs.length > 0 && !!requestAmount && requestAmount > 0 && ( {translate('iou.amountEach', { amount: CurrencyUtils.convertToDisplayString( From e4d0d92a2293e21abf9a4d60cd3ccf7e1a0f17b6 Mon Sep 17 00:00:00 2001 From: Cristi Paval Date: Tue, 6 Feb 2024 18:27:35 +0200 Subject: [PATCH 088/122] Fix warning on the server --- src/libs/actions/IOU.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index a7a82e642e62..4e43b16b6ccf 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -3071,7 +3071,7 @@ function getSendMoneyParams( paymentMethodType, transactionID: optimisticTransaction.transactionID, newIOUReportDetails, - createdReportActionID: isNewChat ? optimisticCreatedAction.reportActionID : '', + createdReportActionID: isNewChat ? optimisticCreatedAction.reportActionID : '0', reportPreviewReportActionID: reportPreviewAction.reportActionID, }, optimisticData, From cadc4967bf9d94884e5e0e31c0fb2eeb531b28c2 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 6 Feb 2024 11:43:11 -0500 Subject: [PATCH 089/122] fix lint on main --- src/components/MenuItem.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 0bf649b54a6e..4d7089fb24bd 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -384,7 +384,11 @@ function MenuItem( onPress(event); return; } - singleExecution(waitForNavigate(() => onPress(event)))(); + singleExecution( + waitForNavigate(() => { + onPress(event); + }), + )(); } }; From d3773106105f4c92f6c223028cf3873d678175c4 Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 6 Feb 2024 18:07:35 +0100 Subject: [PATCH 090/122] remove comments Co-authored-by: Rocio Perez-Cano --- workflow_tests/mocks/failureNotifierMocks.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/workflow_tests/mocks/failureNotifierMocks.js b/workflow_tests/mocks/failureNotifierMocks.js index e1a29453655e..9e41859a29d4 100644 --- a/workflow_tests/mocks/failureNotifierMocks.js +++ b/workflow_tests/mocks/failureNotifierMocks.js @@ -8,7 +8,6 @@ const FAILURENOTIFIER__NOTIFYFAILURE__FETCH_WORKFLOW_RUN_JOBS__STEP_MOCK = utils 'NOTIFYFAILURE', [], [], - // add outputs if needed ); const FAILURENOTIFIER__NOTIFYFAILURE__PROCESS_EACH_FAILED_JOB__STEP_MOCK = utils.createMockStep( 'Process Each Failed Job', @@ -16,7 +15,6 @@ const FAILURENOTIFIER__NOTIFYFAILURE__PROCESS_EACH_FAILED_JOB__STEP_MOCK = utils 'NOTIFYFAILURE', [], [], - // add outputs if needed ); const FAILURENOTIFIER__NOTIFYFAILURE__STEP_MOCKS = [FAILURENOTIFIER__NOTIFYFAILURE__FETCH_WORKFLOW_RUN_JOBS__STEP_MOCK, FAILURENOTIFIER__NOTIFYFAILURE__PROCESS_EACH_FAILED_JOB__STEP_MOCK]; From 534a3c72b6e094d8db70d48edbce8f2052af4e2b Mon Sep 17 00:00:00 2001 From: rayane-djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Tue, 6 Feb 2024 18:08:45 +0100 Subject: [PATCH 091/122] run prettier --- workflow_tests/mocks/failureNotifierMocks.js | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/workflow_tests/mocks/failureNotifierMocks.js b/workflow_tests/mocks/failureNotifierMocks.js index 9e41859a29d4..6d37f08ff7ac 100644 --- a/workflow_tests/mocks/failureNotifierMocks.js +++ b/workflow_tests/mocks/failureNotifierMocks.js @@ -2,20 +2,8 @@ const utils = require('../utils/utils'); // notifyfailure -const FAILURENOTIFIER__NOTIFYFAILURE__FETCH_WORKFLOW_RUN_JOBS__STEP_MOCK = utils.createMockStep( - 'Fetch Workflow Run Jobs', - 'Fetch Workflow Run Jobs', - 'NOTIFYFAILURE', - [], - [], -); -const FAILURENOTIFIER__NOTIFYFAILURE__PROCESS_EACH_FAILED_JOB__STEP_MOCK = utils.createMockStep( - 'Process Each Failed Job', - 'Process Each Failed Job', - 'NOTIFYFAILURE', - [], - [], -); +const FAILURENOTIFIER__NOTIFYFAILURE__FETCH_WORKFLOW_RUN_JOBS__STEP_MOCK = utils.createMockStep('Fetch Workflow Run Jobs', 'Fetch Workflow Run Jobs', 'NOTIFYFAILURE', [], []); +const FAILURENOTIFIER__NOTIFYFAILURE__PROCESS_EACH_FAILED_JOB__STEP_MOCK = utils.createMockStep('Process Each Failed Job', 'Process Each Failed Job', 'NOTIFYFAILURE', [], []); const FAILURENOTIFIER__NOTIFYFAILURE__STEP_MOCKS = [FAILURENOTIFIER__NOTIFYFAILURE__FETCH_WORKFLOW_RUN_JOBS__STEP_MOCK, FAILURENOTIFIER__NOTIFYFAILURE__PROCESS_EACH_FAILED_JOB__STEP_MOCK]; module.exports = { From 3199e7e225f1469f10c2447c158d5e04f42b1945 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Tue, 6 Feb 2024 18:15:48 +0100 Subject: [PATCH 092/122] Fix after regression --- src/pages/ShareCodePage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/ShareCodePage.tsx b/src/pages/ShareCodePage.tsx index 831f0eb8f1d8..dcfb9f6861bf 100644 --- a/src/pages/ShareCodePage.tsx +++ b/src/pages/ShareCodePage.tsx @@ -109,7 +109,8 @@ function ShareCodePage({report, session, currentUserPersonalDetails}: ShareCodeP isAnonymousAction title={translate('common.download')} icon={Expensicons.Download} - onPress={qrCodeRef.current?.download} + // eslint-disable-next-line @typescript-eslint/no-misused-promises + onPress={() => qrCodeRef.current?.download?.()} /> )} From 6f8a5d555b0caa52135a2d7f2876fc74be6a7fd0 Mon Sep 17 00:00:00 2001 From: caitlinwhite1 Date: Tue, 6 Feb 2024 11:28:33 -0600 Subject: [PATCH 093/122] update Account Settings to Settings --- docs/_data/_routes.yml | 4 ++-- .../{account-settings => Settings}/Account-Details.md | 0 .../{account-settings => Settings}/Close-Account.md | 0 .../{account-settings => Settings}/Copilot.md | 0 .../{account-settings => Settings}/Merge-Accounts.md | 0 .../Notification-Troubleshooting.md | 0 .../{account-settings => Settings}/Preferences.md | 0 .../hubs/{account-settings => settings}/index.html | 0 8 files changed, 2 insertions(+), 2 deletions(-) rename docs/articles/expensify-classic/{account-settings => Settings}/Account-Details.md (100%) rename docs/articles/expensify-classic/{account-settings => Settings}/Close-Account.md (100%) rename docs/articles/expensify-classic/{account-settings => Settings}/Copilot.md (100%) rename docs/articles/expensify-classic/{account-settings => Settings}/Merge-Accounts.md (100%) rename docs/articles/expensify-classic/{account-settings => Settings}/Notification-Troubleshooting.md (100%) rename docs/articles/expensify-classic/{account-settings => Settings}/Preferences.md (100%) rename docs/expensify-classic/hubs/{account-settings => settings}/index.html (100%) diff --git a/docs/_data/_routes.yml b/docs/_data/_routes.yml index 33ef4ebcf0a8..d355e53d8a52 100644 --- a/docs/_data/_routes.yml +++ b/docs/_data/_routes.yml @@ -19,8 +19,8 @@ platforms: icon: /assets/images/accounting.svg description: From setting up your account to ensuring you get the most out of Expensify’s suite of features, click here to get started on streamlining your expense management journey. - - href: account-settings - title: Account Settings + - href: settings + title: Settings icon: /assets/images/gears.svg description: Discover how to personalize your profile, add secondary logins, and grant delegated access to employees with our comprehensive guide on Account Settings. diff --git a/docs/articles/expensify-classic/account-settings/Account-Details.md b/docs/articles/expensify-classic/Settings/Account-Details.md similarity index 100% rename from docs/articles/expensify-classic/account-settings/Account-Details.md rename to docs/articles/expensify-classic/Settings/Account-Details.md diff --git a/docs/articles/expensify-classic/account-settings/Close-Account.md b/docs/articles/expensify-classic/Settings/Close-Account.md similarity index 100% rename from docs/articles/expensify-classic/account-settings/Close-Account.md rename to docs/articles/expensify-classic/Settings/Close-Account.md diff --git a/docs/articles/expensify-classic/account-settings/Copilot.md b/docs/articles/expensify-classic/Settings/Copilot.md similarity index 100% rename from docs/articles/expensify-classic/account-settings/Copilot.md rename to docs/articles/expensify-classic/Settings/Copilot.md diff --git a/docs/articles/expensify-classic/account-settings/Merge-Accounts.md b/docs/articles/expensify-classic/Settings/Merge-Accounts.md similarity index 100% rename from docs/articles/expensify-classic/account-settings/Merge-Accounts.md rename to docs/articles/expensify-classic/Settings/Merge-Accounts.md diff --git a/docs/articles/expensify-classic/account-settings/Notification-Troubleshooting.md b/docs/articles/expensify-classic/Settings/Notification-Troubleshooting.md similarity index 100% rename from docs/articles/expensify-classic/account-settings/Notification-Troubleshooting.md rename to docs/articles/expensify-classic/Settings/Notification-Troubleshooting.md diff --git a/docs/articles/expensify-classic/account-settings/Preferences.md b/docs/articles/expensify-classic/Settings/Preferences.md similarity index 100% rename from docs/articles/expensify-classic/account-settings/Preferences.md rename to docs/articles/expensify-classic/Settings/Preferences.md diff --git a/docs/expensify-classic/hubs/account-settings/index.html b/docs/expensify-classic/hubs/settings/index.html similarity index 100% rename from docs/expensify-classic/hubs/account-settings/index.html rename to docs/expensify-classic/hubs/settings/index.html From 541d7ef6818f832e49836866e536fe45b925c0dc Mon Sep 17 00:00:00 2001 From: Cristi Paval Date: Tue, 6 Feb 2024 19:29:55 +0200 Subject: [PATCH 094/122] Fix 2 more fallback ids --- src/libs/actions/IOU.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index dd118c36a8a1..d23a52088642 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -918,7 +918,7 @@ function createDistanceRequest( // If the report is an iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function const isMoneyRequestReport = ReportUtils.isMoneyRequestReport(report); const currentChatReport = isMoneyRequestReport ? ReportUtils.getReport(report.chatReportID) : report; - const moneyRequestReportID = isMoneyRequestReport ? report.reportID : ''; + const moneyRequestReportID = isMoneyRequestReport ? report.reportID : '0'; const currentCreated = DateUtils.enrichMoneyRequestTimestamp(created); const optimisticReceipt: Receipt = { @@ -1276,7 +1276,7 @@ function requestMoney( // If the report is iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function const isMoneyRequestReport = ReportUtils.isMoneyRequestReport(report); const currentChatReport = isMoneyRequestReport ? ReportUtils.getReport(report.chatReportID) : report; - const moneyRequestReportID = isMoneyRequestReport ? report.reportID : ''; + const moneyRequestReportID = isMoneyRequestReport ? report.reportID : '0'; const currentCreated = DateUtils.enrichMoneyRequestTimestamp(created); const {payerAccountID, payerEmail, iouReport, chatReport, transaction, iouAction, createdChatReportActionID, createdIOUReportActionID, reportPreviewAction, onyxData} = getMoneyRequestInformation( From 0736a70e0ff318a527ced47c1c8436921b08e99a Mon Sep 17 00:00:00 2001 From: caitlinwhite1 Date: Tue, 6 Feb 2024 12:04:54 -0600 Subject: [PATCH 095/122] updating Settings to settings --- .../expensify-classic/{Settings => settings}/Account-Details.md | 0 .../expensify-classic/{Settings => settings}/Close-Account.md | 0 docs/articles/expensify-classic/{Settings => settings}/Copilot.md | 0 .../expensify-classic/{Settings => settings}/Merge-Accounts.md | 0 .../{Settings => settings}/Notification-Troubleshooting.md | 0 .../expensify-classic/{Settings => settings}/Preferences.md | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename docs/articles/expensify-classic/{Settings => settings}/Account-Details.md (100%) rename docs/articles/expensify-classic/{Settings => settings}/Close-Account.md (100%) rename docs/articles/expensify-classic/{Settings => settings}/Copilot.md (100%) rename docs/articles/expensify-classic/{Settings => settings}/Merge-Accounts.md (100%) rename docs/articles/expensify-classic/{Settings => settings}/Notification-Troubleshooting.md (100%) rename docs/articles/expensify-classic/{Settings => settings}/Preferences.md (100%) diff --git a/docs/articles/expensify-classic/Settings/Account-Details.md b/docs/articles/expensify-classic/settings/Account-Details.md similarity index 100% rename from docs/articles/expensify-classic/Settings/Account-Details.md rename to docs/articles/expensify-classic/settings/Account-Details.md diff --git a/docs/articles/expensify-classic/Settings/Close-Account.md b/docs/articles/expensify-classic/settings/Close-Account.md similarity index 100% rename from docs/articles/expensify-classic/Settings/Close-Account.md rename to docs/articles/expensify-classic/settings/Close-Account.md diff --git a/docs/articles/expensify-classic/Settings/Copilot.md b/docs/articles/expensify-classic/settings/Copilot.md similarity index 100% rename from docs/articles/expensify-classic/Settings/Copilot.md rename to docs/articles/expensify-classic/settings/Copilot.md diff --git a/docs/articles/expensify-classic/Settings/Merge-Accounts.md b/docs/articles/expensify-classic/settings/Merge-Accounts.md similarity index 100% rename from docs/articles/expensify-classic/Settings/Merge-Accounts.md rename to docs/articles/expensify-classic/settings/Merge-Accounts.md diff --git a/docs/articles/expensify-classic/Settings/Notification-Troubleshooting.md b/docs/articles/expensify-classic/settings/Notification-Troubleshooting.md similarity index 100% rename from docs/articles/expensify-classic/Settings/Notification-Troubleshooting.md rename to docs/articles/expensify-classic/settings/Notification-Troubleshooting.md diff --git a/docs/articles/expensify-classic/Settings/Preferences.md b/docs/articles/expensify-classic/settings/Preferences.md similarity index 100% rename from docs/articles/expensify-classic/Settings/Preferences.md rename to docs/articles/expensify-classic/settings/Preferences.md From 2831fef789dfab1114f965037243425650128b0d Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Tue, 6 Feb 2024 19:13:01 +0100 Subject: [PATCH 096/122] Fix condition evaluation to false due to param being a string --- src/components/ReportActionItem/MoneyRequestAction.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestAction.tsx b/src/components/ReportActionItem/MoneyRequestAction.tsx index ff29bf5b0ee8..82098b52f2c3 100644 --- a/src/components/ReportActionItem/MoneyRequestAction.tsx +++ b/src/components/ReportActionItem/MoneyRequestAction.tsx @@ -92,7 +92,7 @@ function MoneyRequestAction({ } // If the childReportID is not present, we need to create a new thread - const childReportID = action?.childReportID ?? '0'; + const childReportID = action?.childReportID ?? 0; if (!childReportID) { const thread = ReportUtils.buildTransactionThread(action, requestReportID); const userLogins = PersonalDetailsUtils.getLoginsByAccountIDs(thread.participantAccountIDs ?? []); From 19c11c852c3b06f0eeeacc62ed7f571da2f89a70 Mon Sep 17 00:00:00 2001 From: Cristi Paval Date: Tue, 6 Feb 2024 20:29:16 +0200 Subject: [PATCH 097/122] Revert last change --- src/libs/actions/IOU.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index d23a52088642..dd118c36a8a1 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -918,7 +918,7 @@ function createDistanceRequest( // If the report is an iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function const isMoneyRequestReport = ReportUtils.isMoneyRequestReport(report); const currentChatReport = isMoneyRequestReport ? ReportUtils.getReport(report.chatReportID) : report; - const moneyRequestReportID = isMoneyRequestReport ? report.reportID : '0'; + const moneyRequestReportID = isMoneyRequestReport ? report.reportID : ''; const currentCreated = DateUtils.enrichMoneyRequestTimestamp(created); const optimisticReceipt: Receipt = { @@ -1276,7 +1276,7 @@ function requestMoney( // If the report is iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function const isMoneyRequestReport = ReportUtils.isMoneyRequestReport(report); const currentChatReport = isMoneyRequestReport ? ReportUtils.getReport(report.chatReportID) : report; - const moneyRequestReportID = isMoneyRequestReport ? report.reportID : '0'; + const moneyRequestReportID = isMoneyRequestReport ? report.reportID : ''; const currentCreated = DateUtils.enrichMoneyRequestTimestamp(created); const {payerAccountID, payerEmail, iouReport, chatReport, transaction, iouAction, createdChatReportActionID, createdIOUReportActionID, reportPreviewAction, onyxData} = getMoneyRequestInformation( From e7aeb33a2be77e1aade12dbef96dd73082017480 Mon Sep 17 00:00:00 2001 From: caitlinwhite1 Date: Tue, 6 Feb 2024 12:29:26 -0600 Subject: [PATCH 098/122] Update redirects.csv a link to expensify.com was breaking everything, updating to useDot link --- docs/redirects.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/redirects.csv b/docs/redirects.csv index 988b07d729f0..f30157e19916 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -48,5 +48,5 @@ https://community.expensify.com/discussion/4463/how-to-remove-or-manage-settings https://community.expensify.com/discussion/5793/how-to-connect-your-personal-card-to-import-expenses,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-credit-cards/Personal-Credit-Cards https://community.expensify.com/discussion/4826/how-to-set-your-annual-subscription-size,https://help.expensify.com/articles/expensify-classic/billing-and-subscriptions/Annual-Subscription https://community.expensify.com/discussion/5667/deep-dive-how-does-the-annual-subscription-billing-work,https://help.expensify.com/articles/expensify-classic/billing-and-subscriptions/Annual-Subscription -https://help.expensify.com/expensify-classic/hubs/getting-started/plan-types,https://www.expensify.com/pricing +https://help.expensify.com/expensify-classic/hubs/getting-started/plan-types,https://use.expensify.com/ https://help.expensify.com/articles/expensify-classic/getting-started/Employees,https://help.expensify.com/articles/expensify-classic/getting-started/Join-your-company's-workspace From 6c2abde357968c1d38730cd379b3fd654130e766 Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Tue, 6 Feb 2024 19:35:22 +0100 Subject: [PATCH 099/122] Update src/components/ReportActionItem/MoneyRequestAction.tsx Co-authored-by: Aldo Canepa Garay <87341702+aldo-expensify@users.noreply.github.com> --- src/components/ReportActionItem/MoneyRequestAction.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestAction.tsx b/src/components/ReportActionItem/MoneyRequestAction.tsx index 82098b52f2c3..9e169b23391a 100644 --- a/src/components/ReportActionItem/MoneyRequestAction.tsx +++ b/src/components/ReportActionItem/MoneyRequestAction.tsx @@ -92,7 +92,7 @@ function MoneyRequestAction({ } // If the childReportID is not present, we need to create a new thread - const childReportID = action?.childReportID ?? 0; + const childReportID = action?.childReportID; if (!childReportID) { const thread = ReportUtils.buildTransactionThread(action, requestReportID); const userLogins = PersonalDetailsUtils.getLoginsByAccountIDs(thread.participantAccountIDs ?? []); From 7a2a2b07bab6ca1e7ebd5e7ae0807cdff0786a2d Mon Sep 17 00:00:00 2001 From: OSBotify Date: Tue, 6 Feb 2024 19:47:06 +0000 Subject: [PATCH 100/122] Update version to 1.4.37-3 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index e179b59f4b30..a21e96eda07f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -98,8 +98,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001043702 - versionName "1.4.37-2" + versionCode 1001043703 + versionName "1.4.37-3" } flavorDimensions "default" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index b529bbbcd100..214073033436 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.37.2 + 1.4.37.3 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index af5704061df2..232a81f62818 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.4.37.2 + 1.4.37.3 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 8209491d19ff..d9fab01ad34a 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 1.4.37 CFBundleVersion - 1.4.37.2 + 1.4.37.3 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 072684aa77c2..4142f3e2367b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.4.37-2", + "version": "1.4.37-3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.37-2", + "version": "1.4.37-3", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e08a8bdcb70a..2548bed5c625 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.37-2", + "version": "1.4.37-3", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From c556c5bbaa08277bbe45bfedd133df53b6518c6c Mon Sep 17 00:00:00 2001 From: codinggeek2023 Date: Wed, 7 Feb 2024 01:38:57 +0530 Subject: [PATCH 101/122] Add ShouldShowSubscriptionsMenu to settings^C --- src/libs/ShouldShowSubscriptionsMenu/index.native.ts | 6 ++++++ src/libs/ShouldShowSubscriptionsMenu/index.ts | 6 ++++++ src/pages/home/sidebar/AllSettingsScreen.tsx | 5 +++-- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 src/libs/ShouldShowSubscriptionsMenu/index.native.ts create mode 100644 src/libs/ShouldShowSubscriptionsMenu/index.ts diff --git a/src/libs/ShouldShowSubscriptionsMenu/index.native.ts b/src/libs/ShouldShowSubscriptionsMenu/index.native.ts new file mode 100644 index 000000000000..b9f28d42e0a0 --- /dev/null +++ b/src/libs/ShouldShowSubscriptionsMenu/index.native.ts @@ -0,0 +1,6 @@ +/** + * Indicates whether the subscription menu should show in the all settings screen + */ +const ShouldShowSubscriptionsMenu = (): boolean => false; + +export default ShouldShowSubscriptionsMenu; \ No newline at end of file diff --git a/src/libs/ShouldShowSubscriptionsMenu/index.ts b/src/libs/ShouldShowSubscriptionsMenu/index.ts new file mode 100644 index 000000000000..28ed3ee6092b --- /dev/null +++ b/src/libs/ShouldShowSubscriptionsMenu/index.ts @@ -0,0 +1,6 @@ +/** + * Indicates whether the subscription menu should show in the all settings screen + */ +const ShouldShowSubscriptionsMenu = (): boolean => true; + +export default ShouldShowSubscriptionsMenu; \ No newline at end of file diff --git a/src/pages/home/sidebar/AllSettingsScreen.tsx b/src/pages/home/sidebar/AllSettingsScreen.tsx index aa308d523db4..c3f2ab281c34 100644 --- a/src/pages/home/sidebar/AllSettingsScreen.tsx +++ b/src/pages/home/sidebar/AllSettingsScreen.tsx @@ -18,6 +18,7 @@ import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type {Policy, PolicyMembers} from '@src/types/onyx'; +import ShouldShowSubscriptionsMenu from '@libs/ShouldShowSubscriptionsMenu'; type AllSettingsScreenOnyxProps = { policies: OnyxCollection; @@ -49,7 +50,7 @@ function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) { focused: !isSmallScreenWidth, brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies, policyMembers) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, - { + ...(ShouldShowSubscriptionsMenu() ? [{ translationKey: 'allSettingsScreen.subscriptions', icon: Expensicons.MoneyBag, action: () => { @@ -58,7 +59,7 @@ function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) { shouldShowRightIcon: true, iconRight: Expensicons.NewWindow, link: CONST.OLDDOT_URLS.ADMIN_POLICIES_URL, - }, + }] : []), { translationKey: 'allSettingsScreen.cardsAndDomains', icon: Expensicons.CardsAndDomains, From 52f6753b6ffa3d55447a7ba3db3ab00697865148 Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Tue, 6 Feb 2024 12:26:59 -0800 Subject: [PATCH 102/122] fix typo and remove url fragments --- .github/scripts/createHelpRedirects.sh | 2 +- docs/redirects.csv | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/scripts/createHelpRedirects.sh b/.github/scripts/createHelpRedirects.sh index 1ae2220253c4..14ed9de953fc 100755 --- a/.github/scripts/createHelpRedirects.sh +++ b/.github/scripts/createHelpRedirects.sh @@ -19,7 +19,7 @@ function checkCloudflareResult { if ! [[ "$RESULT_MESSAGE" == "true" ]]; then ERROR_MESSAGE=$(echo "$RESULTS" | jq .errors) - error "Error calling Cloudfalre API: $ERROR_MESSAGE" + error "Error calling Cloudflare API: $ERROR_MESSAGE" exit 1 fi } diff --git a/docs/redirects.csv b/docs/redirects.csv index 988b07d729f0..cabd76deaf1f 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -34,8 +34,8 @@ https://help.expensify.com/articles/expensify-classic/expensify-card/Expensify-C https://help.expensify.com/articles/expensify-classic/expensify-partner-program/How-to-Join-the-ExpensifyApproved!-Partner-Program.html,https://use.expensify.com/accountants-program https://help.expensify.com/articles/expensify-classic/getting-started/approved-accountants/Card-Revenue-Share-For-Expensify-Approved-Partners, https://use.expensify.com/blog/maximizing-rewards-expensifyapproved-accounting-partners-now-earn-0-5-revenue-share https://help.expensify.com/articles/expensify-classic/bank-accounts-and-credit-cards/International-Reimbursements,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-credit-cards/Global-Reimbursements -https://community.expensify.com/discussion/4452/how-to-merge-accounts,https://help.expensify.com/articles/expensify-classic/account-settings/Merge-Accounts#gsc.tab=0 -https://community.expensify.com/discussion/4783/how-to-add-or-remove-a-copilot#latest,https://help.expensify.com/articles/expensify-classic/account-settings/Copilot#gsc.tab=0 +https://community.expensify.com/discussion/4452/how-to-merge-accounts,https://help.expensify.com/articles/expensify-classic/account-settings/Merge-Accounts +https://community.expensify.com/discussion/4783/how-to-add-or-remove-a-copilot,https://help.expensify.com/articles/expensify-classic/account-settings/Copilot https://community.expensify.com/discussion/4343/expensify-anz-partnership-announcement,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Connect-ANZ https://community.expensify.com/discussion/7318/deep-dive-company-credit-card-import-options,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards https://community.expensify.com/discussion/2673/personalize-your-commercial-card-feed-name,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Commercial-Card-Feeds From 1c6a312f26d85e4e201f2b7020de40a42a0ff4e6 Mon Sep 17 00:00:00 2001 From: codinggeek2023 Date: Wed, 7 Feb 2024 02:13:23 +0530 Subject: [PATCH 103/122] Add types --- src/libs/ShouldShowSubscriptionsMenu/index.native.ts | 6 ++++-- src/libs/ShouldShowSubscriptionsMenu/index.ts | 6 ++++-- src/libs/ShouldShowSubscriptionsMenu/types.tsx | 3 +++ src/pages/home/sidebar/AllSettingsScreen.tsx | 4 ++-- 4 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 src/libs/ShouldShowSubscriptionsMenu/types.tsx diff --git a/src/libs/ShouldShowSubscriptionsMenu/index.native.ts b/src/libs/ShouldShowSubscriptionsMenu/index.native.ts index b9f28d42e0a0..c495ead79a12 100644 --- a/src/libs/ShouldShowSubscriptionsMenu/index.native.ts +++ b/src/libs/ShouldShowSubscriptionsMenu/index.native.ts @@ -1,6 +1,8 @@ +import type ShouldShowSubscriptionsMenu from './types'; + /** * Indicates whether the subscription menu should show in the all settings screen */ -const ShouldShowSubscriptionsMenu = (): boolean => false; +const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = () => false; -export default ShouldShowSubscriptionsMenu; \ No newline at end of file +export default shouldShowSubscriptionsMenu; \ No newline at end of file diff --git a/src/libs/ShouldShowSubscriptionsMenu/index.ts b/src/libs/ShouldShowSubscriptionsMenu/index.ts index 28ed3ee6092b..24dfa231cae9 100644 --- a/src/libs/ShouldShowSubscriptionsMenu/index.ts +++ b/src/libs/ShouldShowSubscriptionsMenu/index.ts @@ -1,6 +1,8 @@ +import type ShouldShowSubscriptionsMenu from './types'; + /** * Indicates whether the subscription menu should show in the all settings screen */ -const ShouldShowSubscriptionsMenu = (): boolean => true; +const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = () => true; -export default ShouldShowSubscriptionsMenu; \ No newline at end of file +export default shouldShowSubscriptionsMenu; \ No newline at end of file diff --git a/src/libs/ShouldShowSubscriptionsMenu/types.tsx b/src/libs/ShouldShowSubscriptionsMenu/types.tsx new file mode 100644 index 000000000000..9694a57310d5 --- /dev/null +++ b/src/libs/ShouldShowSubscriptionsMenu/types.tsx @@ -0,0 +1,3 @@ +type ShouldShowSubscriptionsMenu = () => boolean; + +export default ShouldShowSubscriptionsMenu; \ No newline at end of file diff --git a/src/pages/home/sidebar/AllSettingsScreen.tsx b/src/pages/home/sidebar/AllSettingsScreen.tsx index c3f2ab281c34..9b09878ef9da 100644 --- a/src/pages/home/sidebar/AllSettingsScreen.tsx +++ b/src/pages/home/sidebar/AllSettingsScreen.tsx @@ -18,7 +18,7 @@ import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type {Policy, PolicyMembers} from '@src/types/onyx'; -import ShouldShowSubscriptionsMenu from '@libs/ShouldShowSubscriptionsMenu'; +import shouldShowSubscriptionsMenu from '@libs/ShouldShowSubscriptionsMenu'; type AllSettingsScreenOnyxProps = { policies: OnyxCollection; @@ -50,7 +50,7 @@ function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) { focused: !isSmallScreenWidth, brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies, policyMembers) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, - ...(ShouldShowSubscriptionsMenu() ? [{ + ...(shouldShowSubscriptionsMenu() ? [{ translationKey: 'allSettingsScreen.subscriptions', icon: Expensicons.MoneyBag, action: () => { From 6afffdc31bd82cfa44a98bb278c6576cbfd14c71 Mon Sep 17 00:00:00 2001 From: Riya Shete <156463907+codinggeek2023@users.noreply.github.com> Date: Wed, 7 Feb 2024 02:23:58 +0530 Subject: [PATCH 104/122] Update src/libs/ShouldShowSubscriptionsMenu/index.native.ts Co-authored-by: Aimane Chnaif <96077027+aimane-chnaif@users.noreply.github.com> --- src/libs/ShouldShowSubscriptionsMenu/index.native.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ShouldShowSubscriptionsMenu/index.native.ts b/src/libs/ShouldShowSubscriptionsMenu/index.native.ts index c495ead79a12..d5aa2c1c0ea7 100644 --- a/src/libs/ShouldShowSubscriptionsMenu/index.native.ts +++ b/src/libs/ShouldShowSubscriptionsMenu/index.native.ts @@ -3,6 +3,6 @@ import type ShouldShowSubscriptionsMenu from './types'; /** * Indicates whether the subscription menu should show in the all settings screen */ -const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = () => false; +const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = false; export default shouldShowSubscriptionsMenu; \ No newline at end of file From 317543e6c6b91a54469e633bbab2f64711320ce5 Mon Sep 17 00:00:00 2001 From: Riya Shete <156463907+codinggeek2023@users.noreply.github.com> Date: Wed, 7 Feb 2024 02:24:14 +0530 Subject: [PATCH 105/122] Update src/libs/ShouldShowSubscriptionsMenu/types.tsx Co-authored-by: Aimane Chnaif <96077027+aimane-chnaif@users.noreply.github.com> --- src/libs/ShouldShowSubscriptionsMenu/types.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ShouldShowSubscriptionsMenu/types.tsx b/src/libs/ShouldShowSubscriptionsMenu/types.tsx index 9694a57310d5..4d02442a9421 100644 --- a/src/libs/ShouldShowSubscriptionsMenu/types.tsx +++ b/src/libs/ShouldShowSubscriptionsMenu/types.tsx @@ -1,3 +1,3 @@ -type ShouldShowSubscriptionsMenu = () => boolean; +type ShouldShowSubscriptionsMenu = boolean; export default ShouldShowSubscriptionsMenu; \ No newline at end of file From f483d64c64a66e17be39f89cb3a84087a1afd88a Mon Sep 17 00:00:00 2001 From: Riya Shete <156463907+codinggeek2023@users.noreply.github.com> Date: Wed, 7 Feb 2024 02:24:36 +0530 Subject: [PATCH 106/122] Update src/pages/home/sidebar/AllSettingsScreen.tsx Co-authored-by: Aimane Chnaif <96077027+aimane-chnaif@users.noreply.github.com> --- src/pages/home/sidebar/AllSettingsScreen.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/sidebar/AllSettingsScreen.tsx b/src/pages/home/sidebar/AllSettingsScreen.tsx index 9b09878ef9da..c761c5ad2bdf 100644 --- a/src/pages/home/sidebar/AllSettingsScreen.tsx +++ b/src/pages/home/sidebar/AllSettingsScreen.tsx @@ -50,7 +50,7 @@ function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) { focused: !isSmallScreenWidth, brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies, policyMembers) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, - ...(shouldShowSubscriptionsMenu() ? [{ + ...(shouldShowSubscriptionsMenu ? [{ translationKey: 'allSettingsScreen.subscriptions', icon: Expensicons.MoneyBag, action: () => { From 90334c2646537e8f752a8ce907345141c98f6736 Mon Sep 17 00:00:00 2001 From: Riya Shete <156463907+codinggeek2023@users.noreply.github.com> Date: Wed, 7 Feb 2024 02:24:43 +0530 Subject: [PATCH 107/122] Update src/libs/ShouldShowSubscriptionsMenu/index.ts Co-authored-by: Aimane Chnaif <96077027+aimane-chnaif@users.noreply.github.com> --- src/libs/ShouldShowSubscriptionsMenu/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ShouldShowSubscriptionsMenu/index.ts b/src/libs/ShouldShowSubscriptionsMenu/index.ts index 24dfa231cae9..9632ff707249 100644 --- a/src/libs/ShouldShowSubscriptionsMenu/index.ts +++ b/src/libs/ShouldShowSubscriptionsMenu/index.ts @@ -3,6 +3,6 @@ import type ShouldShowSubscriptionsMenu from './types'; /** * Indicates whether the subscription menu should show in the all settings screen */ -const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = () => true; +const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = true; export default shouldShowSubscriptionsMenu; \ No newline at end of file From 18fe488b2b31da036b5b28dccc10ee91f9baf200 Mon Sep 17 00:00:00 2001 From: codinggeek2023 Date: Wed, 7 Feb 2024 02:30:29 +0530 Subject: [PATCH 108/122] Rename folder --- .../index.native.ts | 0 .../index.ts | 0 .../types.tsx | 0 src/pages/home/sidebar/AllSettingsScreen.tsx | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) rename src/libs/{ShouldShowSubscriptionsMenu => shouldShowSubscriptionsMenu}/index.native.ts (100%) rename src/libs/{ShouldShowSubscriptionsMenu => shouldShowSubscriptionsMenu}/index.ts (100%) rename src/libs/{ShouldShowSubscriptionsMenu => shouldShowSubscriptionsMenu}/types.tsx (100%) diff --git a/src/libs/ShouldShowSubscriptionsMenu/index.native.ts b/src/libs/shouldShowSubscriptionsMenu/index.native.ts similarity index 100% rename from src/libs/ShouldShowSubscriptionsMenu/index.native.ts rename to src/libs/shouldShowSubscriptionsMenu/index.native.ts diff --git a/src/libs/ShouldShowSubscriptionsMenu/index.ts b/src/libs/shouldShowSubscriptionsMenu/index.ts similarity index 100% rename from src/libs/ShouldShowSubscriptionsMenu/index.ts rename to src/libs/shouldShowSubscriptionsMenu/index.ts diff --git a/src/libs/ShouldShowSubscriptionsMenu/types.tsx b/src/libs/shouldShowSubscriptionsMenu/types.tsx similarity index 100% rename from src/libs/ShouldShowSubscriptionsMenu/types.tsx rename to src/libs/shouldShowSubscriptionsMenu/types.tsx diff --git a/src/pages/home/sidebar/AllSettingsScreen.tsx b/src/pages/home/sidebar/AllSettingsScreen.tsx index c761c5ad2bdf..c4a3319b0c15 100644 --- a/src/pages/home/sidebar/AllSettingsScreen.tsx +++ b/src/pages/home/sidebar/AllSettingsScreen.tsx @@ -18,7 +18,7 @@ import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type {Policy, PolicyMembers} from '@src/types/onyx'; -import shouldShowSubscriptionsMenu from '@libs/ShouldShowSubscriptionsMenu'; +import shouldShowSubscriptionsMenu from '@libs/shouldShowSubscriptionsMenu'; type AllSettingsScreenOnyxProps = { policies: OnyxCollection; From 1a90974f20e7dd2245d5ad882af88ee437563e1d Mon Sep 17 00:00:00 2001 From: codinggeek2023 Date: Wed, 7 Feb 2024 02:48:10 +0530 Subject: [PATCH 109/122] Fix Lint --- .../index.native.ts | 2 +- src/libs/shouldShowSubscriptionsMenu/index.ts | 2 +- .../shouldShowSubscriptionsMenu/types.tsx | 2 +- src/pages/home/sidebar/AllSettingsScreen.tsx | 46 ++++++++++--------- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/libs/shouldShowSubscriptionsMenu/index.native.ts b/src/libs/shouldShowSubscriptionsMenu/index.native.ts index d5aa2c1c0ea7..c98302e9a87d 100644 --- a/src/libs/shouldShowSubscriptionsMenu/index.native.ts +++ b/src/libs/shouldShowSubscriptionsMenu/index.native.ts @@ -5,4 +5,4 @@ import type ShouldShowSubscriptionsMenu from './types'; */ const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = false; -export default shouldShowSubscriptionsMenu; \ No newline at end of file +export default shouldShowSubscriptionsMenu; diff --git a/src/libs/shouldShowSubscriptionsMenu/index.ts b/src/libs/shouldShowSubscriptionsMenu/index.ts index 9632ff707249..2f2b7f17c2c5 100644 --- a/src/libs/shouldShowSubscriptionsMenu/index.ts +++ b/src/libs/shouldShowSubscriptionsMenu/index.ts @@ -5,4 +5,4 @@ import type ShouldShowSubscriptionsMenu from './types'; */ const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = true; -export default shouldShowSubscriptionsMenu; \ No newline at end of file +export default shouldShowSubscriptionsMenu; diff --git a/src/libs/shouldShowSubscriptionsMenu/types.tsx b/src/libs/shouldShowSubscriptionsMenu/types.tsx index 4d02442a9421..e72b55234639 100644 --- a/src/libs/shouldShowSubscriptionsMenu/types.tsx +++ b/src/libs/shouldShowSubscriptionsMenu/types.tsx @@ -1,3 +1,3 @@ type ShouldShowSubscriptionsMenu = boolean; -export default ShouldShowSubscriptionsMenu; \ No newline at end of file +export default ShouldShowSubscriptionsMenu; diff --git a/src/pages/home/sidebar/AllSettingsScreen.tsx b/src/pages/home/sidebar/AllSettingsScreen.tsx index c4a3319b0c15..8897a26e0b6b 100644 --- a/src/pages/home/sidebar/AllSettingsScreen.tsx +++ b/src/pages/home/sidebar/AllSettingsScreen.tsx @@ -1,7 +1,7 @@ -import React, {useMemo} from 'react'; -import {ScrollView} from 'react-native'; -import type {OnyxCollection} from 'react-native-onyx'; -import {withOnyx} from 'react-native-onyx'; +import React, { useMemo } from 'react'; +import { ScrollView } from 'react-native'; +import type { OnyxCollection } from 'react-native-onyx'; +import { withOnyx } from 'react-native-onyx'; import Breadcrumbs from '@components/Breadcrumbs'; import * as Expensicons from '@components/Icon/Expensicons'; import MenuItemList from '@components/MenuItemList'; @@ -11,14 +11,14 @@ import useThemeStyles from '@hooks/useThemeStyles'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; import useWindowDimensions from '@hooks/useWindowDimensions'; import Navigation from '@libs/Navigation/Navigation'; -import {hasGlobalWorkspaceSettingsRBR} from '@libs/WorkspacesSettingsUtils'; +import shouldShowSubscriptionsMenu from '@libs/shouldShowSubscriptionsMenu'; +import { hasGlobalWorkspaceSettingsRBR } from '@libs/WorkspacesSettingsUtils'; import * as Link from '@userActions/Link'; import CONST from '@src/CONST'; -import type {TranslationPaths} from '@src/languages/types'; +import type { TranslationPaths } from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type {Policy, PolicyMembers} from '@src/types/onyx'; -import shouldShowSubscriptionsMenu from '@libs/shouldShowSubscriptionsMenu'; +import type { Policy, PolicyMembers } from '@src/types/onyx'; type AllSettingsScreenOnyxProps = { policies: OnyxCollection; @@ -27,11 +27,11 @@ type AllSettingsScreenOnyxProps = { type AllSettingsScreenProps = AllSettingsScreenOnyxProps; -function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) { +function AllSettingsScreen({ policies, policyMembers }: AllSettingsScreenProps) { const styles = useThemeStyles(); const waitForNavigate = useWaitForNavigation(); - const {translate} = useLocalize(); - const {isSmallScreenWidth} = useWindowDimensions(); + const { translate } = useLocalize(); + const { isSmallScreenWidth } = useWindowDimensions(); /** * Retuns a list of menu items data for All workspaces settings @@ -50,16 +50,20 @@ function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) { focused: !isSmallScreenWidth, brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies, policyMembers) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, - ...(shouldShowSubscriptionsMenu ? [{ - translationKey: 'allSettingsScreen.subscriptions', - icon: Expensicons.MoneyBag, - action: () => { - Link.openOldDotLink(CONST.OLDDOT_URLS.ADMIN_POLICIES_URL); - }, - shouldShowRightIcon: true, - iconRight: Expensicons.NewWindow, - link: CONST.OLDDOT_URLS.ADMIN_POLICIES_URL, - }] : []), + ...(shouldShowSubscriptionsMenu + ? [ + { + translationKey: 'allSettingsScreen.subscriptions', + icon: Expensicons.MoneyBag, + action: () => { + Link.openOldDotLink(CONST.OLDDOT_URLS.ADMIN_POLICIES_URL); + }, + shouldShowRightIcon: true, + iconRight: Expensicons.NewWindow, + link: CONST.OLDDOT_URLS.ADMIN_POLICIES_URL, + }, + ] + : []), { translationKey: 'allSettingsScreen.cardsAndDomains', icon: Expensicons.CardsAndDomains, From c12daf25d78aa4967b7515d09a01392806a536cf Mon Sep 17 00:00:00 2001 From: codinggeek2023 Date: Wed, 7 Feb 2024 02:55:40 +0530 Subject: [PATCH 110/122] revert lint --- .../index.native.ts | 2 +- src/libs/shouldShowSubscriptionsMenu/index.ts | 2 +- .../shouldShowSubscriptionsMenu/types.tsx | 2 +- src/pages/home/sidebar/AllSettingsScreen.tsx | 46 +++++++++---------- 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/libs/shouldShowSubscriptionsMenu/index.native.ts b/src/libs/shouldShowSubscriptionsMenu/index.native.ts index c98302e9a87d..d5aa2c1c0ea7 100644 --- a/src/libs/shouldShowSubscriptionsMenu/index.native.ts +++ b/src/libs/shouldShowSubscriptionsMenu/index.native.ts @@ -5,4 +5,4 @@ import type ShouldShowSubscriptionsMenu from './types'; */ const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = false; -export default shouldShowSubscriptionsMenu; +export default shouldShowSubscriptionsMenu; \ No newline at end of file diff --git a/src/libs/shouldShowSubscriptionsMenu/index.ts b/src/libs/shouldShowSubscriptionsMenu/index.ts index 2f2b7f17c2c5..9632ff707249 100644 --- a/src/libs/shouldShowSubscriptionsMenu/index.ts +++ b/src/libs/shouldShowSubscriptionsMenu/index.ts @@ -5,4 +5,4 @@ import type ShouldShowSubscriptionsMenu from './types'; */ const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = true; -export default shouldShowSubscriptionsMenu; +export default shouldShowSubscriptionsMenu; \ No newline at end of file diff --git a/src/libs/shouldShowSubscriptionsMenu/types.tsx b/src/libs/shouldShowSubscriptionsMenu/types.tsx index e72b55234639..4d02442a9421 100644 --- a/src/libs/shouldShowSubscriptionsMenu/types.tsx +++ b/src/libs/shouldShowSubscriptionsMenu/types.tsx @@ -1,3 +1,3 @@ type ShouldShowSubscriptionsMenu = boolean; -export default ShouldShowSubscriptionsMenu; +export default ShouldShowSubscriptionsMenu; \ No newline at end of file diff --git a/src/pages/home/sidebar/AllSettingsScreen.tsx b/src/pages/home/sidebar/AllSettingsScreen.tsx index 8897a26e0b6b..c4a3319b0c15 100644 --- a/src/pages/home/sidebar/AllSettingsScreen.tsx +++ b/src/pages/home/sidebar/AllSettingsScreen.tsx @@ -1,7 +1,7 @@ -import React, { useMemo } from 'react'; -import { ScrollView } from 'react-native'; -import type { OnyxCollection } from 'react-native-onyx'; -import { withOnyx } from 'react-native-onyx'; +import React, {useMemo} from 'react'; +import {ScrollView} from 'react-native'; +import type {OnyxCollection} from 'react-native-onyx'; +import {withOnyx} from 'react-native-onyx'; import Breadcrumbs from '@components/Breadcrumbs'; import * as Expensicons from '@components/Icon/Expensicons'; import MenuItemList from '@components/MenuItemList'; @@ -11,14 +11,14 @@ import useThemeStyles from '@hooks/useThemeStyles'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; import useWindowDimensions from '@hooks/useWindowDimensions'; import Navigation from '@libs/Navigation/Navigation'; -import shouldShowSubscriptionsMenu from '@libs/shouldShowSubscriptionsMenu'; -import { hasGlobalWorkspaceSettingsRBR } from '@libs/WorkspacesSettingsUtils'; +import {hasGlobalWorkspaceSettingsRBR} from '@libs/WorkspacesSettingsUtils'; import * as Link from '@userActions/Link'; import CONST from '@src/CONST'; -import type { TranslationPaths } from '@src/languages/types'; +import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type { Policy, PolicyMembers } from '@src/types/onyx'; +import type {Policy, PolicyMembers} from '@src/types/onyx'; +import shouldShowSubscriptionsMenu from '@libs/shouldShowSubscriptionsMenu'; type AllSettingsScreenOnyxProps = { policies: OnyxCollection; @@ -27,11 +27,11 @@ type AllSettingsScreenOnyxProps = { type AllSettingsScreenProps = AllSettingsScreenOnyxProps; -function AllSettingsScreen({ policies, policyMembers }: AllSettingsScreenProps) { +function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) { const styles = useThemeStyles(); const waitForNavigate = useWaitForNavigation(); - const { translate } = useLocalize(); - const { isSmallScreenWidth } = useWindowDimensions(); + const {translate} = useLocalize(); + const {isSmallScreenWidth} = useWindowDimensions(); /** * Retuns a list of menu items data for All workspaces settings @@ -50,20 +50,16 @@ function AllSettingsScreen({ policies, policyMembers }: AllSettingsScreenProps) focused: !isSmallScreenWidth, brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies, policyMembers) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, - ...(shouldShowSubscriptionsMenu - ? [ - { - translationKey: 'allSettingsScreen.subscriptions', - icon: Expensicons.MoneyBag, - action: () => { - Link.openOldDotLink(CONST.OLDDOT_URLS.ADMIN_POLICIES_URL); - }, - shouldShowRightIcon: true, - iconRight: Expensicons.NewWindow, - link: CONST.OLDDOT_URLS.ADMIN_POLICIES_URL, - }, - ] - : []), + ...(shouldShowSubscriptionsMenu ? [{ + translationKey: 'allSettingsScreen.subscriptions', + icon: Expensicons.MoneyBag, + action: () => { + Link.openOldDotLink(CONST.OLDDOT_URLS.ADMIN_POLICIES_URL); + }, + shouldShowRightIcon: true, + iconRight: Expensicons.NewWindow, + link: CONST.OLDDOT_URLS.ADMIN_POLICIES_URL, + }] : []), { translationKey: 'allSettingsScreen.cardsAndDomains', icon: Expensicons.CardsAndDomains, From 208ada51f20ea34e06ec8b2905fa76e97a03807e Mon Sep 17 00:00:00 2001 From: codinggeek2023 Date: Wed, 7 Feb 2024 02:56:59 +0530 Subject: [PATCH 111/122] push suggested lint --- src/pages/home/sidebar/AllSettingsScreen.tsx | 26 +++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/pages/home/sidebar/AllSettingsScreen.tsx b/src/pages/home/sidebar/AllSettingsScreen.tsx index c4a3319b0c15..0406c38cf659 100644 --- a/src/pages/home/sidebar/AllSettingsScreen.tsx +++ b/src/pages/home/sidebar/AllSettingsScreen.tsx @@ -11,6 +11,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; import useWindowDimensions from '@hooks/useWindowDimensions'; import Navigation from '@libs/Navigation/Navigation'; +import shouldShowSubscriptionsMenu from '@libs/shouldShowSubscriptionsMenu'; import {hasGlobalWorkspaceSettingsRBR} from '@libs/WorkspacesSettingsUtils'; import * as Link from '@userActions/Link'; import CONST from '@src/CONST'; @@ -18,7 +19,6 @@ import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type {Policy, PolicyMembers} from '@src/types/onyx'; -import shouldShowSubscriptionsMenu from '@libs/shouldShowSubscriptionsMenu'; type AllSettingsScreenOnyxProps = { policies: OnyxCollection; @@ -50,16 +50,20 @@ function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) { focused: !isSmallScreenWidth, brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies, policyMembers) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, - ...(shouldShowSubscriptionsMenu ? [{ - translationKey: 'allSettingsScreen.subscriptions', - icon: Expensicons.MoneyBag, - action: () => { - Link.openOldDotLink(CONST.OLDDOT_URLS.ADMIN_POLICIES_URL); - }, - shouldShowRightIcon: true, - iconRight: Expensicons.NewWindow, - link: CONST.OLDDOT_URLS.ADMIN_POLICIES_URL, - }] : []), + ...(shouldShowSubscriptionsMenu + ? [ + { + translationKey: 'allSettingsScreen.subscriptions', + icon: Expensicons.MoneyBag, + action: () => { + Link.openOldDotLink(CONST.OLDDOT_URLS.ADMIN_POLICIES_URL); + }, + shouldShowRightIcon: true, + iconRight: Expensicons.NewWindow, + link: CONST.OLDDOT_URLS.ADMIN_POLICIES_URL, + }, + ] + : []), { translationKey: 'allSettingsScreen.cardsAndDomains', icon: Expensicons.CardsAndDomains, From 5e59bee371d79abfe790fc801c9545d20bdec3f1 Mon Sep 17 00:00:00 2001 From: codinggeek2023 Date: Wed, 7 Feb 2024 02:57:27 +0530 Subject: [PATCH 112/122] push suggested lint --- src/libs/shouldShowSubscriptionsMenu/index.native.ts | 2 +- src/libs/shouldShowSubscriptionsMenu/index.ts | 2 +- src/libs/shouldShowSubscriptionsMenu/types.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/shouldShowSubscriptionsMenu/index.native.ts b/src/libs/shouldShowSubscriptionsMenu/index.native.ts index d5aa2c1c0ea7..c98302e9a87d 100644 --- a/src/libs/shouldShowSubscriptionsMenu/index.native.ts +++ b/src/libs/shouldShowSubscriptionsMenu/index.native.ts @@ -5,4 +5,4 @@ import type ShouldShowSubscriptionsMenu from './types'; */ const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = false; -export default shouldShowSubscriptionsMenu; \ No newline at end of file +export default shouldShowSubscriptionsMenu; diff --git a/src/libs/shouldShowSubscriptionsMenu/index.ts b/src/libs/shouldShowSubscriptionsMenu/index.ts index 9632ff707249..2f2b7f17c2c5 100644 --- a/src/libs/shouldShowSubscriptionsMenu/index.ts +++ b/src/libs/shouldShowSubscriptionsMenu/index.ts @@ -5,4 +5,4 @@ import type ShouldShowSubscriptionsMenu from './types'; */ const shouldShowSubscriptionsMenu: ShouldShowSubscriptionsMenu = true; -export default shouldShowSubscriptionsMenu; \ No newline at end of file +export default shouldShowSubscriptionsMenu; diff --git a/src/libs/shouldShowSubscriptionsMenu/types.tsx b/src/libs/shouldShowSubscriptionsMenu/types.tsx index 4d02442a9421..e72b55234639 100644 --- a/src/libs/shouldShowSubscriptionsMenu/types.tsx +++ b/src/libs/shouldShowSubscriptionsMenu/types.tsx @@ -1,3 +1,3 @@ type ShouldShowSubscriptionsMenu = boolean; -export default ShouldShowSubscriptionsMenu; \ No newline at end of file +export default ShouldShowSubscriptionsMenu; From acf03b5c7102f914fb3d015c9e8ad3d6df9b7b72 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Tue, 6 Feb 2024 22:10:56 +0000 Subject: [PATCH 113/122] Update version to 1.4.37-4 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index a21e96eda07f..bd795fb84af5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -98,8 +98,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001043703 - versionName "1.4.37-3" + versionCode 1001043704 + versionName "1.4.37-4" } flavorDimensions "default" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 214073033436..6c8c96bb9f4a 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.37.3 + 1.4.37.4 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 232a81f62818..8c73a6cece43 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.4.37.3 + 1.4.37.4 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index d9fab01ad34a..2b88b0375075 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 1.4.37 CFBundleVersion - 1.4.37.3 + 1.4.37.4 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 4142f3e2367b..520373fbfd6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.4.37-3", + "version": "1.4.37-4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.37-3", + "version": "1.4.37-4", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 2548bed5c625..08120fa0f902 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.37-3", + "version": "1.4.37-4", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 0389ac7ddba21f906710637a0864dcc79b65ae65 Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Tue, 6 Feb 2024 23:28:47 +0100 Subject: [PATCH 114/122] Fix variable declared twice --- src/libs/ReportUtils.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index bc91f74f3fdc..64d79a3cd812 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2312,8 +2312,6 @@ function getReportPreviewMessage( return `${requestorName ? `${requestorName}: ` : ''}${Localize.translateLocal('iou.requestedAmount', {formattedAmount: amountToDisplay})}`; } - const containsNonReimbursable = hasNonReimbursableTransactions(report.reportID); - return Localize.translateLocal(containsNonReimbursable ? 'iou.payerSpentAmount' : 'iou.payerOwesAmount', {payer: payerName ?? '', amount: formattedAmount}); } From d94353f5d7cd5e980b5e33e73d53c792e325039c Mon Sep 17 00:00:00 2001 From: OSBotify Date: Tue, 6 Feb 2024 22:46:12 +0000 Subject: [PATCH 115/122] Update version to 1.4.37-5 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index bd795fb84af5..990ef0ff5af0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -98,8 +98,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001043704 - versionName "1.4.37-4" + versionCode 1001043705 + versionName "1.4.37-5" } flavorDimensions "default" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 6c8c96bb9f4a..c247501da949 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.37.4 + 1.4.37.5 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 8c73a6cece43..3af0459775a7 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.4.37.4 + 1.4.37.5 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 2b88b0375075..48aecefa5974 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 1.4.37 CFBundleVersion - 1.4.37.4 + 1.4.37.5 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 520373fbfd6c..ac352c7ec6f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.4.37-4", + "version": "1.4.37-5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.37-4", + "version": "1.4.37-5", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 08120fa0f902..e7862fb463c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.37-4", + "version": "1.4.37-5", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From ff622a4ae568171569e62d9b50ffb49203d87f8f Mon Sep 17 00:00:00 2001 From: OSBotify Date: Tue, 6 Feb 2024 22:56:52 +0000 Subject: [PATCH 116/122] Update version to 1.4.37-6 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 990ef0ff5af0..5dd4858fe0d7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -98,8 +98,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001043705 - versionName "1.4.37-5" + versionCode 1001043706 + versionName "1.4.37-6" } flavorDimensions "default" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index c247501da949..e01da07d28b7 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.37.5 + 1.4.37.6 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 3af0459775a7..f2004108628c 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.4.37.5 + 1.4.37.6 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 48aecefa5974..6d85c5af21a5 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 1.4.37 CFBundleVersion - 1.4.37.5 + 1.4.37.6 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index ac352c7ec6f0..5d63067adc81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.4.37-5", + "version": "1.4.37-6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.37-5", + "version": "1.4.37-6", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e7862fb463c7..e7b8631496bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.37-5", + "version": "1.4.37-6", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 7f4cdce48d7246380da7bf860fa928bae89bfa89 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Tue, 6 Feb 2024 23:54:16 +0000 Subject: [PATCH 117/122] Update version to 1.4.37-7 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 5dd4858fe0d7..1301f18d7e8f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -98,8 +98,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001043706 - versionName "1.4.37-6" + versionCode 1001043707 + versionName "1.4.37-7" } flavorDimensions "default" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index e01da07d28b7..a2effb8de0b1 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.37.6 + 1.4.37.7 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index f2004108628c..02b01e7153d0 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.4.37.6 + 1.4.37.7 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 6d85c5af21a5..69e1e7d6e9d9 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 1.4.37 CFBundleVersion - 1.4.37.6 + 1.4.37.7 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 5d63067adc81..11099886bfb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.4.37-6", + "version": "1.4.37-7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.37-6", + "version": "1.4.37-7", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e7b8631496bf..71983e0e1679 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.37-6", + "version": "1.4.37-7", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 6021ef002557767af89a204fd9d0f8e5f3aeaee7 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Wed, 7 Feb 2024 09:39:45 +0000 Subject: [PATCH 118/122] Update version to 1.4.38-0 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 4 ++-- ios/NewExpensifyTests/Info.plist | 4 ++-- ios/NotificationServiceExtension/Info.plist | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 1301f18d7e8f..6ed326f9dee1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -98,8 +98,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001043707 - versionName "1.4.37-7" + versionCode 1001043800 + versionName "1.4.38-0" } flavorDimensions "default" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index a2effb8de0b1..5b280de0c195 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.4.37 + 1.4.38 CFBundleSignature ???? CFBundleURLTypes @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.37.7 + 1.4.38.0 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 02b01e7153d0..8d17d0c0c572 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.4.37 + 1.4.38 CFBundleSignature ???? CFBundleVersion - 1.4.37.7 + 1.4.38.0 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 69e1e7d6e9d9..7af26a2c647b 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -11,9 +11,9 @@ CFBundleName $(PRODUCT_NAME) CFBundleShortVersionString - 1.4.37 + 1.4.38 CFBundleVersion - 1.4.37.7 + 1.4.38.0 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 11099886bfb0..1825fa649ae9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.4.37-7", + "version": "1.4.38-0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.37-7", + "version": "1.4.38-0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 71983e0e1679..4a8a7ec5612a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.37-7", + "version": "1.4.38-0", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From ca0c103016d62e732992e8421c6898fd18844744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Wed, 7 Feb 2024 10:42:13 +0100 Subject: [PATCH 119/122] e2e action: improve logging in error case --- .github/workflows/e2ePerformanceTests.yml | 5 +++-- babel.config.js | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 31bfdf963525..60ba16164eb6 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -200,9 +200,10 @@ jobs: if: failure() run: | echo ${{ steps.schedule-awsdf-main.outputs.data }} - cat "./mainResults/Host_Machine_Files/\$WORKING_DIRECTORY/Test spec output.txt" unzip "Customer Artifacts.zip" -d mainResults - cat ./mainResults/Host_Machine_Files/\$WORKING_DIRECTORY/debug.log + cat "./mainResults/Host_Machine_Files/\$WORKING_DIRECTORY/logcat.txt" || true + cat ./mainResults/Host_Machine_Files/\$WORKING_DIRECTORY/debug.log || true + cat "./mainResults/Host_Machine_Files/\$WORKING_DIRECTORY/Test spec output.txt" || true - name: Unzip AWS Device Farm results if: ${{ always() }} diff --git a/babel.config.js b/babel.config.js index 0a17f2b0f01c..d3bcecdae8cb 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,5 +1,7 @@ require('dotenv').config(); +const IS_E2E_TESTING = process.env.E2E_TESTING === 'true'; + const defaultPresets = ['@babel/preset-react', '@babel/preset-env', '@babel/preset-flow', '@babel/preset-typescript']; const defaultPlugins = [ // Adding the commonjs: true option to react-native-web plugin can cause styling conflicts @@ -72,7 +74,8 @@ const metro = { ], env: { production: { - plugins: [['transform-remove-console', {exclude: ['error', 'warn']}]], + // Keep console logs for e2e tests + plugins: IS_E2E_TESTING ? [] : [['transform-remove-console', {exclude: ['error', 'warn']}]], }, }, }; From 527fcd14ba60b0a3f1aadfbc255b55ee4e871395 Mon Sep 17 00:00:00 2001 From: Vit Horacek Date: Wed, 7 Feb 2024 10:10:22 +0000 Subject: [PATCH 120/122] Skip the SearchPage test until its refactored --- tests/perf-test/SearchPage.perf-test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/perf-test/SearchPage.perf-test.js b/tests/perf-test/SearchPage.perf-test.js index b27a2e2115be..8c6148f9e103 100644 --- a/tests/perf-test/SearchPage.perf-test.js +++ b/tests/perf-test/SearchPage.perf-test.js @@ -103,7 +103,7 @@ function SearchPageWrapper(args) { ); } -test('[Search Page] should interact when text input changes', async () => { +test.skip('[Search Page] should interact when text input changes', async () => { const {addListener} = TestHelper.createAddListenerMock(); const scenario = async () => { @@ -130,7 +130,7 @@ test('[Search Page] should interact when text input changes', async () => { .then(() => measurePerformance(, {scenario})); }); -test('[Search Page] should render options list', async () => { +test.skip('[Search Page] should render options list', async () => { const {triggerTransitionEnd, addListener} = TestHelper.createAddListenerMock(); const smallMockedPersonalDetails = getMockedPersonalDetails(5); @@ -156,7 +156,7 @@ test('[Search Page] should render options list', async () => { .then(() => measurePerformance(, {scenario})); }); -test('[Search Page] should search in options list', async () => { +test.skip('[Search Page] should search in options list', async () => { const {triggerTransitionEnd, addListener} = TestHelper.createAddListenerMock(); const scenario = async () => { @@ -183,7 +183,7 @@ test('[Search Page] should search in options list', async () => { .then(() => measurePerformance(, {scenario})); }); -test('[Search Page] should click on list item', async () => { +test.skip('[Search Page] should click on list item', async () => { const {triggerTransitionEnd, addListener} = TestHelper.createAddListenerMock(); const scenario = async () => { From a0a9dbcb9d17abd72faaaf2ac98bc957afa438ce Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Wed, 7 Feb 2024 10:17:39 +0000 Subject: [PATCH 121/122] update AdHoc provision profiles --- ios/NewApp_AdHoc.mobileprovision.gpg | Bin 11362 -> 11432 bytes ...c_Notification_Service.mobileprovision.gpg | Bin 10923 -> 11024 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ios/NewApp_AdHoc.mobileprovision.gpg b/ios/NewApp_AdHoc.mobileprovision.gpg index 454857981834c86eb6bf9f6841c49de4253f0fcf..643c81bd0b9cf8a4b18f31a173581d6bf6df785b 100644 GIT binary patch literal 11432 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 diff --git a/ios/NewApp_AdHoc_Notification_Service.mobileprovision.gpg b/ios/NewApp_AdHoc_Notification_Service.mobileprovision.gpg index ba92588406385474af829bbdfc8623954388da04..8a5170cfe69758c440e0e5b0cf37f8e62b64dbbc 100644 GIT binary patch literal 11024 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 KJt|k$8xI{92zNRF literal 10923 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 Date: Wed, 7 Feb 2024 07:56:30 -0700 Subject: [PATCH 122/122] Remove "free" marketing copy from meta tags --- web/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/index.html b/web/index.html index 7b2fbe018111..ba57c852d921 100644 --- a/web/index.html +++ b/web/index.html @@ -3,7 +3,7 @@ New Expensify - + @@ -11,7 +11,7 @@ - +