-
Notifications
You must be signed in to change notification settings - Fork 13.4k
feat(react-router): upgrade to react router 6 #30831
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
ShaneK
wants to merge
106
commits into
major-9.0
Choose a base branch
from
sk/react-router-6
base: major-9.0
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+7,547
−5,420
Open
Changes from all commits
Commits
Show all changes
106 commits
Select commit
Hold shift + click to select a range
4262324
chore(deps): update react router to v6
thetaPC f0127bd
refactor(utils): update matchPath for rr6
thetaPC cccf290
refactor(reactrouterviewstack): update for rr6 and improvements
thetaPC af7710b
refactor(test): updated test pages
thetaPC e364fea
chore(matchPath): use the correct library
thetaPC 6a42e69
chore(rr6): run lint
thetaPC 4aad76a
chore(StackManager): upgrade to rr6 and add comments
thetaPC fd6baac
chore(StackManager): more upgrades for rr6
thetaPC e76c1e8
docs(StackManager): update comment
thetaPC 2436ba3
docs(matchPath): remove comment
thetaPC ca27ed6
chore(IonRouteInner): upgrade to rr6
thetaPC 37f76c7
chore(StackManager): run lint
thetaPC a78f6b3
feat(IonRouter): migrate to functional component with react router 6
thetaPC 93202c0
chore(IonRouteInner): update render
thetaPC 0008059
docs(IonRouter, ReactRouterViewStack, StackManager): update comments
thetaPC 0a0dcb6
feat(IonReactRouter): migrate to a functional component and react rou…
thetaPC 331b394
feat(IonReactMemoryRouter): migrate to a functional component and rea…
thetaPC 205a705
chore(IonReactMemoryRouter): remove unused type
thetaPC 7ff8994
feat(IonReactHashRouter): migrate to a functional component and react…
thetaPC c45c0f9
docs(many): update comments
thetaPC 12c49f5
refactor(many): remove `exact` from test pages
thetaPC 71fb8cb
refactor(many): update to use <Navigate>
thetaPC c6f8dd4
refactor(many): replace `render` with `element`
thetaPC 366004e
refactor(Tabs2): switch to navigate
thetaPC 5cccf0b
refactor(many): update to prevent compile errors
thetaPC e6e17eb
refactor(IonReactRouter): split component to use hooks correctly
thetaPC 2656e98
chore: update package and sync file
thetaPC 10bb889
docs(IonReactRouter): use updated param names
thetaPC 7a20697
fix(ReactRouterViewStack, StackManager): use correct value & add valu…
thetaPC 9d69a69
Merge branch 'main' of github.com:ionic-team/ionic-framework into mh/…
thetaPC 9c5f55a
test(rr5): keep the old pages
thetaPC 49cbc46
test(dynamic-ionpage-classnames): use old version for rr5
thetaPC a926134
chore(rr5, rr6): update package
thetaPC a65886b
test(app, routing): use index
thetaPC 51933fe
Merge branch 'main' of github.com:ionic-team/ionic-framework into mh/…
ShaneK 43e546b
Merge branch 'main' of github.com:ionic-team/ionic-framework into mh/…
ShaneK fca5e6c
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 80ae239
WIP
ShaneK c8cefd5
WIP
ShaneK b0c95d4
merge
ShaneK 662fd70
WIP
ShaneK 210bc16
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 6f7631d
feat(react-router): have navigation in the routing page generally wor…
ShaneK 6f72bbf
feat(react-router): adding support for route params
ShaneK 0949a87
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 8fd53b2
fix(react-router): addressing some migration issues with memory and h…
ShaneK 0ceee27
fix(react-router): improving navigation stack reliability
ShaneK a6131ba
fix(react-router): improving matching with wildcard and parameter routes
ShaneK 8035c82
fix(react-router): fixing redirect for test app so it uses replace ro…
ShaneK a9a1de2
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK e293cc0
chore(test): adding text in refs test for people manually testing
ShaneK 99436a3
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 33fc844
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 28ca3a7
fix(react-router): adding support for nested parameter access
ShaneK 0d83b77
fix(react-router): skip IonPage wait for Navigate, adding documentati…
ShaneK 054220d
trying to fix redirect
ShaneK 1ed61a9
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 8dddf77
fix(react-router): fixing dynamic tab and nested outlet tests so they…
ShaneK 5b735cd
fix(router): correct relative base and param reuse
ShaneK 881068e
Fixing test app tabs views
ShaneK 6cae9ad
fix(react-router): trying to better handle nested routing
ShaneK 763621d
fix(react-router): prevent unmounted Navigate components from trigger…
ShaneK d51f95e
fix(react-router): use state to track IonRouterOutlet ref id in test
ShaneK 59f2dbf
fix(react): automatically dismiss inline overlays on navigation
ShaneK 96c96fc
fix(react-router): add wildcard to refs route for nested routing
ShaneK 383ec04
chore(status): updating status file
ShaneK 10c31ed
chore(react-router): improving continuous testability
ShaneK 045b0a7
fix(react-router): correct tab and nested outlet navigation
ShaneK 3073a24
fix(react-router): fixing relative paths in tab context tests
ShaneK 584dcf2
fix(react-router): prioritize specific route matches
ShaneK b02c197
fix(react-router): prevent incorrect view reuse for parameterized routes
ShaneK 7fd0659
fix(react-router): nested redirect fix
ShaneK fc6e482
chore(react-router): cleaning up console logs
ShaneK 6575a92
chore(react-router): removing rr5 test app since it will no longer be…
ShaneK fbed1e0
chore(react-router): fixing types, removing usued variable
ShaneK 8fbd2d4
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 3912623
fix(react-router): hide deactivated catch-all routes
ShaneK 00798d4
fix(react-router): adding legacy peer dep flag during installation to…
ShaneK 82fd1ba
fix(react-router): fixing views not being cleaned up properly, causin…
ShaneK 5a77916
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 397b6f7
chore(react-router): code clean up
ShaneK 71e55ad
chore(react-router): refactor
ShaneK 418ac75
chore(react-router): cleaning up util files
ShaneK 99dcb35
chore(react-router): minor clean up
ShaneK a23f555
fix(react): fixing inline overlays being a bit eager to dismiss
ShaneK a565a37
fix(overlays): removing old band-aid code
ShaneK cb94f73
chore(docs): removing status doc link
ShaneK fedca46
fix(react-router): preserve nested outlet params when navigating betw…
ShaneK b2a7105
chore(react-router): adding migration details to BREAKING.md
ShaneK 7fc43b6
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 6762e5b
fix(react-router): isolate tab history to prevent cross-tab back navi…
ShaneK b196665
Merge branch 'main' of github.com:ionic-team/ionic-framework into sk/…
ShaneK 2ff49c4
Merge branch 'major-9.0' of github.com:ionic-team/ionic-framework int…
ShaneK c283319
fix(react-router): isolate tab history to prevent cross-tab back navi…
ShaneK 6a61ecf
chore(git): merge conflict resolution
ShaneK 07104c2
fix(react-router): support React Router 6 style relative paths in Ion…
ShaneK e1e7a2e
fix(react-router): moving view stack back to generate ID
ShaneK d0451ed
chore(react-router): lots of comments, code clean up, comment clean u…
ShaneK 6f184e5
refactor(react-router): extract helper functions from computeParentPath
ShaneK d44fc11
refactor(react-router): extract helper functions from render callback
ShaneK 289f6ed
chore(react-router): documentation, comment clean up, and more
ShaneK ab3dde2
fix(react-router): cleanup orphaned sibling views after replace navig…
ShaneK ffa2e06
fix(react-router): prevent menu button flicker during non-animated pa…
ShaneK 4fa0260
fix(react): preserve framework classes when IonPage className prop ch…
ShaneK 8052ea1
test(react-router): fix test for nested outlet rendering on direct na…
ShaneK 1e2bebb
fix(react-router): cleanup sibling views on push navigation to contai…
ShaneK File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
brandyscarney marked this conversation as resolved.
Show resolved
Hide resolved
brandyscarney marked this conversation as resolved.
Show resolved
Hide resolved
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
brandyscarney marked this conversation as resolved.
Show resolved
Hide resolved
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| #!/bin/bash | ||
| set -x | ||
|
|
||
| # Change to script's directory | ||
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||
| cd "$SCRIPT_DIR" | ||
|
|
||
| # Inside core | ||
| echo "Building core..." | ||
| cd ../../../core | ||
| npm run build | ||
|
|
||
| # Inside packages/react | ||
| echo "Building packages/react..." | ||
| cd ../packages/react | ||
| npm ci | ||
| npm run sync | ||
| npm run build | ||
|
|
||
| # Inside packages/react-router | ||
| echo "Building packages/react-router..." | ||
| cd ../react-router | ||
| npm ci | ||
| npm run sync | ||
| npm run build | ||
|
|
||
| # Inside packages/react-router/test | ||
| echo "Building test app..." | ||
| cd ./test | ||
| rm -rf build/reactrouter6 || true | ||
| sh ./build.sh reactrouter6 | ||
| cd build/reactrouter6 | ||
| echo "Installing dependencies..." | ||
| npm install --legacy-peer-deps > npm_install.log 2>&1 | ||
| npm run sync | ||
|
|
||
| echo "Cleaning up port 3000..." | ||
| lsof -ti:3000 | xargs kill -9 || true | ||
|
|
||
| echo "Starting server..." | ||
| # Start server in background and save PID | ||
| npm start > server.log 2>&1 & | ||
| SERVER_PID=$! | ||
|
|
||
| # Ensure server is killed on script exit | ||
| trap "kill $SERVER_PID" EXIT | ||
|
|
||
| echo "Waiting for server to start (30s)..." | ||
| sleep 30 | ||
|
|
||
| echo "Checking server status..." | ||
| SERVER_RESPONSE=$(curl -s -v http://localhost:3000 2>&1) | ||
| if echo "$SERVER_RESPONSE" | grep -q "Child compilation failed"; then | ||
| echo "Server started but has compilation errors. Exiting." | ||
| echo "$SERVER_RESPONSE" | ||
| exit 1 | ||
| fi | ||
|
|
||
| if ! echo "$SERVER_RESPONSE" | grep -q "200 OK"; then | ||
| echo "Server did not return 200 OK. Exiting." | ||
| echo "$SERVER_RESPONSE" | ||
| exit 1 | ||
| fi | ||
| echo "Server is healthy." | ||
|
|
||
| echo "Running Cypress tests..." | ||
| npm run cypress | ||
|
|
90 changes: 46 additions & 44 deletions
90
packages/react-router/src/ReactRouter/IonReactHashRouter.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,53 +1,55 @@ | ||
| import type { Action as HistoryAction, History, Location as HistoryLocation } from 'history'; | ||
| import { createHashHistory as createHistory } from 'history'; | ||
| import React from 'react'; | ||
| import type { BrowserRouterProps } from 'react-router-dom'; | ||
| import { Router } from 'react-router-dom'; | ||
| /** | ||
| * `IonReactHashRouter` provides a way to use hash-based routing in Ionic | ||
| * React applications. | ||
| */ | ||
|
|
||
| import type { Action as HistoryAction, Location as HistoryLocation } from 'history'; | ||
| import type { PropsWithChildren } from 'react'; | ||
| import React, { useEffect, useRef } from 'react'; | ||
| import type { HashRouterProps } from 'react-router-dom'; | ||
| import { HashRouter, useLocation, useNavigationType } from 'react-router-dom'; | ||
|
|
||
| import { IonRouter } from './IonRouter'; | ||
|
|
||
| interface IonReactHashRouterProps extends BrowserRouterProps { | ||
| history?: History; | ||
| } | ||
| const RouterContent = ({ children }: PropsWithChildren<{}>) => { | ||
| const location = useLocation(); | ||
| const navigationType = useNavigationType(); | ||
|
|
||
| export class IonReactHashRouter extends React.Component<IonReactHashRouterProps> { | ||
| history: History; | ||
| historyListenHandler?: (location: HistoryLocation, action: HistoryAction) => void; | ||
| const historyListenHandler = useRef<(location: HistoryLocation, action: HistoryAction) => void>(); | ||
|
|
||
| constructor(props: IonReactHashRouterProps) { | ||
| super(props); | ||
| const { history, ...rest } = props; | ||
| this.history = history || createHistory(rest); | ||
| this.history.listen(this.handleHistoryChange.bind(this)); | ||
| this.registerHistoryListener = this.registerHistoryListener.bind(this); | ||
| } | ||
| const registerHistoryListener = (cb: (location: HistoryLocation, action: HistoryAction) => void) => { | ||
| historyListenHandler.current = cb; | ||
| }; | ||
|
|
||
| /** | ||
| * history@4.x passes separate location and action | ||
| * params. history@5.x passes location and action | ||
| * together as a single object. | ||
| * TODO: If support for React Router <=5 is dropped | ||
| * this logic is no longer needed. We can just assume | ||
| * a single object with both location and action. | ||
| * Processes navigation changes within the application. | ||
| * | ||
| * Its purpose is to relay the current `location` and the associated | ||
| * `action` ('PUSH', 'POP', or 'REPLACE') to any registered listeners, | ||
| * primarily for `IonRouter` to manage Ionic-specific UI updates and | ||
| * navigation stack behavior. | ||
| * | ||
| * @param location The current browser history location object. | ||
| * @param action The type of navigation action ('PUSH', 'POP', or | ||
| * 'REPLACE'). | ||
| */ | ||
| handleHistoryChange(location: HistoryLocation, action: HistoryAction) { | ||
| const locationValue = (location as any).location || location; | ||
| const actionValue = (location as any).action || action; | ||
| if (this.historyListenHandler) { | ||
| this.historyListenHandler(locationValue, actionValue); | ||
| const handleHistoryChange = (location: HistoryLocation, action: HistoryAction) => { | ||
| if (historyListenHandler.current) { | ||
| historyListenHandler.current(location, action); | ||
| } | ||
| } | ||
|
|
||
| registerHistoryListener(cb: (location: HistoryLocation, action: HistoryAction) => void) { | ||
| this.historyListenHandler = cb; | ||
| } | ||
|
|
||
| render() { | ||
| const { children, ...props } = this.props; | ||
| return ( | ||
| <Router history={this.history} {...props}> | ||
| <IonRouter registerHistoryListener={this.registerHistoryListener}>{children}</IonRouter> | ||
| </Router> | ||
| ); | ||
| } | ||
| } | ||
| }; | ||
|
|
||
| useEffect(() => { | ||
| handleHistoryChange(location, navigationType); | ||
| }, [location, navigationType]); | ||
|
|
||
| return <IonRouter registerHistoryListener={registerHistoryListener}>{children}</IonRouter>; | ||
| }; | ||
|
|
||
| export const IonReactHashRouter = ({ children, ...routerProps }: PropsWithChildren<HashRouterProps>) => { | ||
| return ( | ||
| <HashRouter {...routerProps}> | ||
| <RouterContent>{children}</RouterContent> | ||
| </HashRouter> | ||
| ); | ||
| }; |
87 changes: 46 additions & 41 deletions
87
packages/react-router/src/ReactRouter/IonReactMemoryRouter.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,51 +1,56 @@ | ||
| import type { Action as HistoryAction, Location as HistoryLocation, MemoryHistory } from 'history'; | ||
| import React from 'react'; | ||
| /** | ||
| * `IonReactMemoryRouter` provides a way to use `react-router` in | ||
| * environments where a traditional browser history (like `BrowserRouter`) | ||
| * isn't available or desirable. | ||
| */ | ||
|
|
||
| import type { Action as HistoryAction, Location as HistoryLocation } from 'history'; | ||
| import type { PropsWithChildren } from 'react'; | ||
| import React, { useEffect, useRef } from 'react'; | ||
| import type { MemoryRouterProps } from 'react-router'; | ||
| import { Router } from 'react-router'; | ||
| import { MemoryRouter, useLocation, useNavigationType } from 'react-router'; | ||
|
|
||
| import { IonRouter } from './IonRouter'; | ||
|
|
||
| interface IonReactMemoryRouterProps extends MemoryRouterProps { | ||
| history: MemoryHistory; | ||
| } | ||
| const RouterContent = ({ children }: PropsWithChildren<{}>) => { | ||
| const location = useLocation(); | ||
| const navigationType = useNavigationType(); | ||
|
|
||
| export class IonReactMemoryRouter extends React.Component<IonReactMemoryRouterProps> { | ||
| history: MemoryHistory; | ||
| historyListenHandler?: (location: HistoryLocation, action: HistoryAction) => void; | ||
| const historyListenHandler = useRef<(location: HistoryLocation, action: HistoryAction) => void>(); | ||
|
|
||
| constructor(props: IonReactMemoryRouterProps) { | ||
| super(props); | ||
| this.history = props.history; | ||
| this.history.listen(this.handleHistoryChange.bind(this)); | ||
| this.registerHistoryListener = this.registerHistoryListener.bind(this); | ||
| } | ||
| const registerHistoryListener = (cb: (location: HistoryLocation, action: HistoryAction) => void) => { | ||
| historyListenHandler.current = cb; | ||
| }; | ||
|
|
||
| /** | ||
| * history@4.x passes separate location and action | ||
| * params. history@5.x passes location and action | ||
| * together as a single object. | ||
| * TODO: If support for React Router <=5 is dropped | ||
| * this logic is no longer needed. We can just assume | ||
| * a single object with both location and action. | ||
| * Processes navigation changes within the application. | ||
| * | ||
| * Its purpose is to relay the current `location` and the associated | ||
| * `action` ('PUSH', 'POP', or 'REPLACE') to any registered listeners, | ||
| * primarily for `IonRouter` to manage Ionic-specific UI updates and | ||
| * navigation stack behavior. | ||
| * | ||
| * @param location The current browser history location object. | ||
| * @param action The type of navigation action ('PUSH', 'POP', or | ||
| * 'REPLACE'). | ||
| */ | ||
| handleHistoryChange(location: HistoryLocation, action: HistoryAction) { | ||
| const locationValue = (location as any).location || location; | ||
| const actionValue = (location as any).action || action; | ||
| if (this.historyListenHandler) { | ||
| this.historyListenHandler(locationValue, actionValue); | ||
| const handleHistoryChange = (location: HistoryLocation, action: HistoryAction) => { | ||
| if (historyListenHandler.current) { | ||
| historyListenHandler.current(location, action); | ||
| } | ||
| } | ||
|
|
||
| registerHistoryListener(cb: (location: HistoryLocation, action: HistoryAction) => void) { | ||
| this.historyListenHandler = cb; | ||
| } | ||
|
|
||
| render() { | ||
| const { children, ...props } = this.props; | ||
| return ( | ||
| <Router {...props}> | ||
| <IonRouter registerHistoryListener={this.registerHistoryListener}>{children}</IonRouter> | ||
| </Router> | ||
| ); | ||
| } | ||
| } | ||
| }; | ||
|
|
||
| useEffect(() => { | ||
| handleHistoryChange(location, navigationType); | ||
| }, [location, navigationType]); | ||
|
|
||
| return <IonRouter registerHistoryListener={registerHistoryListener}>{children}</IonRouter>; | ||
| }; | ||
|
|
||
| export const IonReactMemoryRouter = ({ children, ...routerProps }: PropsWithChildren<MemoryRouterProps>) => { | ||
| return ( | ||
| <MemoryRouter {...routerProps}> | ||
| <RouterContent>{children}</RouterContent> | ||
| </MemoryRouter> | ||
| ); | ||
| }; |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.