From 9054085d1046996e6e12d501ee081c096d1cf6fe Mon Sep 17 00:00:00 2001 From: zzyangh <799463087@qq.com> Date: Fri, 5 Sep 2025 11:00:17 +0800 Subject: [PATCH] [fix](AvailabilityZone): Add support for provision route replacement --- .../__tests__/index.test.tsx | 26 +++++++++++++++++++ .../AvailabilityZoneWrapper/index.tsx | 9 ++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/base/src/page/AvailabilityZone/AvailabilityZoneWrapper/__tests__/index.test.tsx b/packages/base/src/page/AvailabilityZone/AvailabilityZoneWrapper/__tests__/index.test.tsx index c9c6f739d..9733312a3 100644 --- a/packages/base/src/page/AvailabilityZone/AvailabilityZoneWrapper/__tests__/index.test.tsx +++ b/packages/base/src/page/AvailabilityZone/AvailabilityZoneWrapper/__tests__/index.test.tsx @@ -265,5 +265,31 @@ describe('base/AvailabilityZone/AvailabilityZoneWrapper', () => { { replace: true } ); }); + + it('should handle path with provision prefix', async () => { + getRecentlyProjectIdByUserInfoSpy.mockReturnValue('project-123'); + + (useLocation as jest.Mock).mockImplementation(() => ({ + pathname: '/provision/project//dashboard', + search: '?test=true' + })); + + superRender(); + + const selectElement = screen.getByRole('combobox'); + fireEvent.mouseDown(selectElement); + + await act(async () => jest.advanceTimersByTime(0)); + + fireEvent.click(screen.getByText('Test Zone')); + fireEvent.click(screen.getByText('确 认')); + + await act(async () => jest.advanceTimersByTime(3000)); + + expect(navigateSpy).toHaveBeenCalledWith( + '/provision/project/project-123/dashboard?test=true', + { replace: true } + ); + }); }); }); diff --git a/packages/base/src/page/AvailabilityZone/AvailabilityZoneWrapper/index.tsx b/packages/base/src/page/AvailabilityZone/AvailabilityZoneWrapper/index.tsx index 899cb4448..aeba1a9c8 100644 --- a/packages/base/src/page/AvailabilityZone/AvailabilityZoneWrapper/index.tsx +++ b/packages/base/src/page/AvailabilityZone/AvailabilityZoneWrapper/index.tsx @@ -69,10 +69,13 @@ const AvailabilityZoneWrapper: React.FC = () => { res.data.data ); + const projectIdReplacementReg = + /^(\/sqle\/|\/provision\/|\/)project\/([^\/]+)\/(.+)$/; + // 当前项目不在用户绑定项目中 并且不存在近期选择项目 则需要去选择项目 if (!!projectID && !isProjectInBindProjects && !memorizedProjectID) { const newPathname = location.pathname.replace( - /^(\/sqle\/|\/)project\/([^\/]+)\/(.+)$/, + projectIdReplacementReg, (_, prefix, projectId, target) => { return `${prefix}project//${target}`; } @@ -82,7 +85,7 @@ const AvailabilityZoneWrapper: React.FC = () => { // 路径中没有默认项目 if (!projectID) { const newPathname = location.pathname.replace( - /^(\/sqle\/|\/)project\/\/(.+)$/, + /^(\/sqle\/|\/provision\/|\/)project\/\/(.+)$/, (_, prefix, target) => { return `${prefix}project/${memorizedProjectID}/${target}`; } @@ -94,7 +97,7 @@ const AvailabilityZoneWrapper: React.FC = () => { // 这是后端的业务逻辑 如果没有给后端传递可用区信息 则默认走当前ip的服务 // 这时项目下的页面路经就会携带项目id,如果选择其他可用区就会报错,因为可能在其他可用区中用户可能不属于该项目 const newPathname = location.pathname.replace( - /^(\/sqle\/|\/)project\/([^\/]+)\/(.+)$/, + projectIdReplacementReg, (_, prefix, projectId, target) => { return `${prefix}project/${memorizedProjectID}/${target}`; }