You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
return `⚠️ @${proposalAuthor} Your proposal is a duplicate of an already existing proposal and has been automatically withdrawn to prevent spam. Please review the existing proposals before submitting a new one.`;
return `⚠️ @${proposalAuthor} Your proposal is a duplicate of an already ${existingProposalWithURL} and has been automatically withdrawn to prevent spam. Please review the existing proposals before submitting a new one.`;
*[Contributing to Expensify](contributingGuides/CONTRIBUTING.md)
@@ -525,7 +526,7 @@ You can only build HybridApp if you have been granted access to [`Mobile-Expensi
525
526
4. Run `git config --global submodule.recurse true`in order to have the submodule updated when you pull App.
526
527
527
528
528
-
> [!Note]
529
+
> [!Note]
529
530
> #### For external agencies and C+ contributors only
530
531
>
531
532
> If you'd like to modify the `Mobile-Expensify` source code, it is best that you create your own fork. Then, you can swap origin of the remote repository by executing this command:
@@ -560,15 +561,15 @@ If for some reason, you need to target the standalone NewDot application, you ca
560
561
561
562
### Working with HybridApp vs Standalone NewDot
562
563
563
-
Day-to-day work with**HybridApp** shouldn't differ much from working on the standalone **NewDot** repository.
564
-
The primary difference is that the native code, which runs React Native, is located in the following directories:
564
+
Day-to-day work with**HybridApp** shouldn't differ much from working on the standalone **NewDot** repository.
565
+
The primary difference is that the native code, which runs React Native, is located in the following directories:
565
566
566
567
- `./Mobile-Expensify/Android`
567
568
- `./Mobile-Expensify/iOS`
568
569
569
570
### Important Notes:
570
571
1. **Root Folders Do Not Affect HybridApp Builds:**
571
-
- Changes made to the `./android` and `./ios` folders at the root of the repository **won't affect the HybridApp build**.
572
+
- Changes made to the `./android` and `./ios` folders at the root of the repository **won't affect the HybridApp build**.
572
573
573
574
2.**Modifying iOS Code for HybridApp:**
574
575
- If you need to remove `Pods`, you must do it in the **`./Mobile-Expensify/iOS`** directory.
@@ -583,23 +584,23 @@ The primary difference is that the native code, which runs React Native, is loca
583
584
584
585
### Updating the `Mobile-Expensify` Submodule
585
586
586
-
The `Mobile-Expensify` directory is a **Git submodule**. This means it points to a specific commit on the `Mobile-Expensify` repository.
587
+
The `Mobile-Expensify` directory is a **Git submodule**. This means it points to a specific commit on the `Mobile-Expensify` repository.
587
588
588
-
If you'd like to fetch the submodule while executing the `git pull` command in`Expensify/App` instead of updating it manually you can run this command in the root of the project:
589
+
If you'd like to fetch the submodule while executing the `git pull` command in`Expensify/App` instead of updating it manually you can run this command in the root of the project:
589
590
590
591
```
591
592
git config submodule.recurse true
592
593
```
593
594
594
-
> [!WARNING]
595
+
> [!WARNING]
595
596
> Please, remember that the submodule will get updated automatically only after executing the `git pull` command -if you switch between branches it is still recommended to execute `git submodule update` to make sure you're working on a compatible submodule version!
596
597
597
598
If you'd like to download the most recent changes from the `main` branch, please use the following command:
598
599
```bash
599
600
git submodule update --remote
600
601
```
601
602
602
-
It's important to emphasize that a git submodule is just a **regular git repository** after all. It means that you can switch branches, pull the newest changes, and execute all regular git commands within the `Mobile-Expensify` directory.
603
+
It's important to emphasize that a git submodule is just a **regular git repository** after all. It means that you can switch branches, pull the newest changes, and execute all regular git commands within the `Mobile-Expensify` directory.
603
604
604
605
### Adding HybridApp-related patches
605
606
@@ -805,7 +806,7 @@ Some pointers:
805
806
- When working with translations that involve plural forms, it's important to handle different cases correctly.
806
807
807
808
For example:
808
-
- zero: Used when there are no items **(optional)**.
809
+
- zero: Used when there are no items **(optional)**.
809
810
- one: Used when there's exactly one item.
810
811
- two: Used when there's two items. **(optional)**
811
812
- few: Used for a small number of items **(optional)**.
Learn how URLs are constructed and used to route users through all parts of the application.
3
+
4
+
[React Navigation](https://reactnavigation.org/) is the library used for all routing and navigation, so refer to its [docs](https://reactnavigation.org/docs/getting-started) to understand how the library works. This page will not focus on how routing works, but how URLs are constructed and what patterns to follow when adding new URLs.
5
+
6
+
## Definitions
7
+
- URL - The web address for every page in the app. On web, this is shown on the browser bar, and is of the format `https://new.expensify.com/<route>`
8
+
- Route - A unique identifier of a specific location within the app's navigation hierarchy
9
+
- Object Route - A route pointing to a specific object (eg. report, transaction, workspace, etc.)
10
+
- Page Route - A route for a specific page (eg. settings, add bank account, etc.)
11
+
12
+
This guide is based on [[PSR-1]] and [[PSR-2]].
13
+
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
14
+
"OPTIONAL" in this document are to be interpreted as described in [[RFC 2119]].
15
+
16
+
## Rules
17
+
When adding new routes, or refactoring existing routes, follow these rules:
18
+
19
+
### - MUST be unique
20
+
There are no aliases where different routes lead to the same place.
21
+
22
+
### - SHOULD be short
23
+
Aim for the shortest possible URL that is also still human readable.
24
+
25
+
Exceptions:
26
+
- When abbreviated paths are used in specific instances like `r/` (for reports) and `a/` (for accounts) for strategic purposes
27
+
28
+
### - MUST use kebab-case for all parts of a URL (eg. words separated by hyphens)
29
+
### - MUST use all lower case words
30
+
### - MUST be defined in `ROUTES.ts`
31
+
### - MUST convey page hierarchy
32
+
Just like breadcrumbs, the URL should reflect the path a user has taken.
33
+
34
+
Example of the paths taken to manage a workspace member:
35
+
1.`workspaces`
36
+
1.`workspaces/:policyID/overview`
37
+
1.`workspaces/:policyID/members`
38
+
1.`workspaces/:policyID/members/:memberID`
39
+
40
+
### - MUST have the route parameters validated
41
+
Since users can edit the route parameters at any time, to any value, the parameters must always be validated to ensure they are correct and the user has access.
42
+
43
+
### - MUST NOT start with a slash
44
+
### - MUST NOT contain jargon or acronyms
45
+
### - MUST NOT contain sensitive information that could be logged by third-parties
46
+
Internet routers and third-party-services can see and store any information in the URL. Do not put things like passwords, auth tokens, or PII (personally identifiable information).
47
+
48
+
### - SHOULD NOT use query parameters
49
+
Exceptions:
50
+
- When a URL needs to be encoded and added to the path (eg. `?backTo=URL`, `?forwardTo=URL`)
51
+
- When complex data needs to be part of the path (eg. `/search?q=QUERY`)
52
+
53
+
### - SHOULD NOT use optional parameters
54
+
If there are optional parameters, use two separate route definitions instead to be explicit.
55
+
56
+
### - SHOULD use plural nouns when there are multiple objects that can exist
57
+
Exceptions:
58
+
59
+
- When abbreviated paths are used in specific instances like `r/` (for reports) and `a/` (for accounts) then plurality does not matter
60
+
61
+
### - SHOULD use only the minimal necessary information to render the page
62
+
Examples:
63
+
-`r/:threadReportID` GOOD - `threadReportID` is all that is needed and all the rest of the page can be derived from that
64
+
-`r/:parentReportID/:threadReportID` BAD - the `parentReportID` is not necessary so it just adds cruft to the URL
65
+
66
+
Exceptions:
67
+
68
+
- When multiple IDs are **required** to render the page.
0 commit comments