From 296b7044afbccf69dfb39f423ab5f802e7c187e4 Mon Sep 17 00:00:00 2001 From: yyh <92089059+lyzno1@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:57:03 +0800 Subject: [PATCH] refactor: route next/navigation through compat re-export (#33636) --- .../assets/component-test.template.tsx | 2 +- .../apps/app-card-operations-flow.test.tsx | 4 ++-- .../apps/app-list-browsing-flow.test.tsx | 4 ++-- web/__tests__/apps/create-app-flow.test.tsx | 4 ++-- .../billing/billing-integration.test.tsx | 2 +- .../billing/cloud-plan-payment-flow.test.tsx | 2 +- .../education-verification-flow.test.tsx | 2 +- .../billing/partner-stack-flow.test.tsx | 2 +- .../billing/pricing-modal-flow.test.tsx | 2 +- .../datasets/document-management.test.tsx | 2 +- .../document-detail-navigation-fix.test.tsx | 4 ++-- web/__tests__/embedded-user-id-auth.test.tsx | 2 +- web/__tests__/embedded-user-id-store.test.tsx | 2 +- .../explore/sidebar-lifecycle-flow.test.tsx | 2 +- .../share/text-generation-index-flow.test.tsx | 2 +- .../(appDetailLayout)/[appId]/layout-main.tsx | 2 +- .../[appId]/overview/tracing/panel.tsx | 2 +- .../[datasetId]/layout-main.tsx | 2 +- .../(commonLayout)/datasets/layout.spec.tsx | 2 +- web/app/(commonLayout)/datasets/layout.tsx | 2 +- .../(commonLayout)/education-apply/page.tsx | 8 +++---- .../(commonLayout)/role-route-guard.spec.tsx | 2 +- web/app/(commonLayout)/role-route-guard.tsx | 2 +- .../(humanInputLayout)/form/[token]/form.tsx | 2 +- .../components/authenticated-layout.tsx | 2 +- web/app/(shareLayout)/components/splash.tsx | 2 +- .../webapp-reset-password/check-code/page.tsx | 4 ++-- .../webapp-reset-password/page.tsx | 4 ++-- .../set-password/page.tsx | 2 +- .../webapp-signin/check-code/page.tsx | 2 +- .../components/external-member-sso-auth.tsx | 2 +- .../components/mail-and-code-auth.tsx | 2 +- .../components/mail-and-password-auth.tsx | 2 +- .../webapp-signin/components/sso-auth.tsx | 2 +- web/app/(shareLayout)/webapp-signin/page.tsx | 2 +- .../account-page/email-change-modal.tsx | 2 +- web/app/account/(commonLayout)/avatar.tsx | 2 +- .../delete-account/components/feed-back.tsx | 2 +- web/app/account/(commonLayout)/header.tsx | 2 +- web/app/account/oauth/authorize/page.tsx | 2 +- web/app/activate/activateForm.tsx | 4 ++-- web/app/components/app-initializer.tsx | 2 +- .../app-sidebar/__tests__/index.spec.tsx | 2 +- .../text-squeeze-fix-verification.spec.tsx | 2 +- .../__tests__/app-info-modals.spec.tsx | 2 +- .../__tests__/use-app-info-actions.spec.ts | 2 +- .../app-info/use-app-info-actions.ts | 2 +- .../__tests__/dropdown-callbacks.spec.tsx | 2 +- .../dataset-info/__tests__/index.spec.tsx | 2 +- .../app-sidebar/dataset-info/dropdown.tsx | 2 +- web/app/components/app-sidebar/index.tsx | 2 +- .../nav-link/__tests__/index.spec.tsx | 2 +- .../components/app-sidebar/nav-link/index.tsx | 2 +- .../dataset-config/context-var/index.spec.tsx | 2 +- .../context-var/var-picker.spec.tsx | 2 +- .../debug-with-single-model/index.spec.tsx | 2 +- .../components/app/configuration/index.tsx | 2 +- .../create-app-dialog/app-list/index.spec.tsx | 2 +- .../app/create-app-dialog/app-list/index.tsx | 2 +- .../app/create-app-modal/index.spec.tsx | 6 ++--- .../components/app/create-app-modal/index.tsx | 2 +- .../app/create-from-dsl-modal/index.tsx | 2 +- .../app/log-annotation/index.spec.tsx | 2 +- .../components/app/log-annotation/index.tsx | 2 +- web/app/components/app/log/index.tsx | 2 +- web/app/components/app/log/list.tsx | 2 +- web/app/components/app/overview/app-card.tsx | 2 +- .../app/switch-app-modal/index.spec.tsx | 2 +- .../components/app/switch-app-modal/index.tsx | 2 +- .../app/text-generate/item/index.tsx | 2 +- .../text-generate/saved-items/index.spec.tsx | 2 +- .../app/workflow-log/detail.spec.tsx | 2 +- .../components/app/workflow-log/detail.tsx | 2 +- .../app/workflow-log/index.spec.tsx | 2 +- .../components/app/workflow-log/list.spec.tsx | 2 +- .../apps/__tests__/app-card.spec.tsx | 4 ++-- .../components/apps/__tests__/list.spec.tsx | 4 ++-- .../apps/__tests__/new-app-card.spec.tsx | 4 ++-- web/app/components/apps/app-card.tsx | 2 +- web/app/components/apps/new-app-card.tsx | 8 +++---- .../base/audio-btn/__tests__/index.spec.tsx | 4 ++-- web/app/components/base/audio-btn/index.tsx | 2 +- .../__tests__/chat-wrapper.spec.tsx | 2 +- .../__tests__/header-in-mobile.spec.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../sidebar/__tests__/index.spec.tsx | 2 +- .../base/chat/chat/__tests__/hooks.spec.tsx | 4 ++-- .../chat/answer/__tests__/operation.spec.tsx | 2 +- .../chat-input-area/__tests__/index.spec.tsx | 2 +- web/app/components/base/chat/chat/hooks.ts | 2 +- .../inputs-form/__tests__/content.spec.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../annotation-reply/__tests__/index.spec.tsx | 2 +- .../annotation-reply/index.tsx | 2 +- .../__tests__/param-config-content.spec.tsx | 2 +- .../__tests__/voice-settings.spec.tsx | 2 +- .../text-to-speech/param-config-content.tsx | 2 +- .../__tests__/dynamic-pdf-preview.spec.tsx | 2 +- .../file-uploader/__tests__/hooks.spec.ts | 2 +- .../components/base/file-uploader/hooks.ts | 2 +- .../field/__tests__/file-uploader.spec.tsx | 2 +- .../base/__tests__/field.spec.tsx | 2 +- .../base/ga/__tests__/index.spec.tsx | 4 ++-- .../image-uploader/__tests__/hooks.spec.ts | 2 +- .../components/base/image-uploader/hooks.ts | 2 +- .../base/markdown/__tests__/index.spec.tsx | 2 +- .../new-audio-button/__tests__/index.spec.tsx | 4 ++-- .../base/new-audio-button/index.tsx | 2 +- .../base/voice-input/__tests__/index.spec.tsx | 2 +- web/app/components/base/voice-input/index.tsx | 2 +- .../base/zendesk/__tests__/index.spec.tsx | 4 ++-- .../__tests__/use-ps-info.spec.tsx | 2 +- .../billing/partner-stack/use-ps-info.ts | 2 +- .../billing/plan/__tests__/index.spec.tsx | 2 +- web/app/components/billing/plan/index.tsx | 2 +- .../__tests__/footer.spec.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../hooks/__tests__/use-dsl-import.spec.tsx | 2 +- .../hooks/use-dsl-import.ts | 2 +- .../datasets/create-from-pipeline/footer.tsx | 2 +- .../list/__tests__/create-card.spec.tsx | 2 +- .../create-from-pipeline/list/create-card.tsx | 2 +- .../template-card/__tests__/index.spec.tsx | 2 +- .../list/template-card/index.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../create/embedding-process/index.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../empty-dataset-creation-modal/index.tsx | 2 +- .../file-uploader/__tests__/index.spec.tsx | 2 +- .../__tests__/file-list-item.spec.tsx | 2 +- .../documents/__tests__/index.spec.tsx | 2 +- .../components/__tests__/operations.spec.tsx | 2 +- .../document-list/__tests__/index.spec.tsx | 2 +- .../__tests__/document-table-row.spec.tsx | 2 +- .../components/document-table-row.tsx | 2 +- .../documents/components/operations.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../__tests__/left-header.spec.tsx | 2 +- .../actions/__tests__/index.spec.tsx | 2 +- .../create-from-pipeline/actions/index.tsx | 2 +- .../local-file/__tests__/index.spec.tsx | 2 +- .../__tests__/file-list-item.spec.tsx | 2 +- .../create-from-pipeline/left-header.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../processing/embedding-process/index.tsx | 2 +- .../steps/__tests__/step-one-content.spec.tsx | 2 +- .../detail/__tests__/document-title.spec.tsx | 2 +- .../documents/detail/__tests__/index.spec.tsx | 2 +- .../detail/__tests__/new-segment.spec.tsx | 2 +- .../detail/completed/__tests__/index.spec.tsx | 2 +- .../__tests__/new-child-segment.spec.tsx | 2 +- .../__tests__/use-segment-list-data.spec.ts | 2 +- .../completed/hooks/use-segment-list-data.ts | 2 +- .../detail/completed/new-child-segment.tsx | 2 +- .../documents/detail/document-title.tsx | 2 +- .../datasets/documents/detail/index.tsx | 2 +- .../datasets/documents/detail/new-segment.tsx | 2 +- .../__tests__/document-settings.spec.tsx | 2 +- .../detail/settings/document-settings.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../__tests__/left-header.spec.tsx | 2 +- .../settings/pipeline-settings/index.tsx | 2 +- .../pipeline-settings/left-header.tsx | 2 +- .../components/datasets/documents/index.tsx | 2 +- .../connector/__tests__/index.spec.tsx | 2 +- .../connector/index.tsx | 2 +- .../create/ExternalApiSelect.tsx | 2 +- .../create/ExternalApiSelection.tsx | 2 +- .../__tests__/ExternalApiSelect.spec.tsx | 2 +- .../__tests__/ExternalApiSelection.spec.tsx | 2 +- .../create/__tests__/index.spec.tsx | 2 +- .../external-knowledge-base/create/index.tsx | 2 +- .../extra-info/__tests__/index.spec.tsx | 2 +- .../service-api/__tests__/index.spec.tsx | 2 +- .../hit-testing/__tests__/index.spec.tsx | 2 +- .../datasets/list/__tests__/datasets.spec.tsx | 2 +- .../datasets/list/__tests__/index.spec.tsx | 2 +- .../dataset-card/__tests__/index.spec.tsx | 2 +- .../datasets/list/dataset-card/index.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../__tests__/info-group.spec.tsx | 2 +- .../metadata/metadata-document/info-group.tsx | 2 +- .../explore/__tests__/index.spec.tsx | 2 +- .../create-app-modal/__tests__/index.spec.tsx | 2 +- .../explore/sidebar/__tests__/index.spec.tsx | 2 +- .../app-nav-item/__tests__/index.spec.tsx | 2 +- .../explore/sidebar/app-nav-item/index.tsx | 2 +- web/app/components/explore/sidebar/index.tsx | 2 +- .../__tests__/command-selector.spec.tsx | 2 +- .../goto-anything/__tests__/context.spec.tsx | 2 +- .../goto-anything/__tests__/index.spec.tsx | 2 +- .../goto-anything/command-selector.tsx | 2 +- web/app/components/goto-anything/context.tsx | 2 +- .../use-goto-anything-navigation.spec.ts | 2 +- .../hooks/use-goto-anything-navigation.ts | 2 +- .../header/__tests__/header-wrapper.spec.tsx | 4 ++-- .../account-dropdown/__tests__/index.spec.tsx | 6 ++--- .../header/account-dropdown/index.tsx | 2 +- .../account-setting/__tests__/index.spec.tsx | 2 +- .../language-page/__tests__/index.spec.tsx | 2 +- .../account-setting/language-page/index.tsx | 2 +- .../header/app-nav/__tests__/index.spec.tsx | 4 ++-- web/app/components/header/app-nav/index.tsx | 2 +- .../app-selector/__tests__/index.spec.tsx | 4 ++-- .../components/header/app-selector/index.tsx | 2 +- .../dataset-nav/__tests__/index.spec.tsx | 8 +++---- .../components/header/dataset-nav/index.tsx | 2 +- .../explore-nav/__tests__/index.spec.tsx | 4 ++-- .../components/header/explore-nav/index.tsx | 2 +- web/app/components/header/header-wrapper.tsx | 2 +- .../header/nav/__tests__/index.spec.tsx | 4 ++-- web/app/components/header/nav/index.tsx | 2 +- .../nav/nav-selector/__tests__/index.spec.tsx | 4 ++-- .../header/nav/nav-selector/index.tsx | 2 +- .../plugins-nav/__tests__/index.spec.tsx | 4 ++-- .../components/header/plugins-nav/index.tsx | 2 +- .../header/tools-nav/__tests__/index.spec.tsx | 2 +- web/app/components/header/tools-nav/index.tsx | 2 +- .../components/__tests__/conversion.spec.tsx | 2 +- .../components/__tests__/index.spec.tsx | 2 +- .../rag-pipeline/components/conversion.tsx | 2 +- .../components/panel/__tests__/index.spec.tsx | 2 +- .../__tests__/index.spec.tsx | 2 +- .../publisher/__tests__/index.spec.tsx | 2 +- .../publisher/__tests__/popup.spec.tsx | 2 +- .../rag-pipeline-header/publisher/popup.tsx | 2 +- .../__tests__/menu-dropdown.spec.tsx | 2 +- .../share/text-generation/index.tsx | 2 +- .../share/text-generation/menu-dropdown.tsx | 2 +- .../__tests__/configure-button.spec.tsx | 2 +- .../__tests__/use-configure-button.spec.ts | 2 +- .../hooks/use-configure-button.ts | 2 +- .../workflow-app/hooks/use-workflow-run.ts | 2 +- web/app/components/workflow-app/index.tsx | 2 +- .../__tests__/workflow-edge-events.spec.tsx | 2 +- web/app/components/workflow/header/index.tsx | 2 +- .../education-apply/education-apply-page.tsx | 8 +++---- .../education-apply/expire-notice-modal.tsx | 2 +- web/app/education-apply/hooks.ts | 2 +- web/app/education-apply/user-info.tsx | 2 +- .../forgot-password/ChangePasswordForm.tsx | 2 +- .../ForgotPasswordForm.spec.tsx | 2 +- .../forgot-password/ForgotPasswordForm.tsx | 4 ++-- web/app/forgot-password/page.tsx | 2 +- web/app/init/InitPasswordPopup.tsx | 2 +- web/app/install/installForm.spec.tsx | 2 +- web/app/install/installForm.tsx | 6 ++--- web/app/reset-password/check-code/page.tsx | 2 +- web/app/reset-password/page.tsx | 2 +- web/app/reset-password/set-password/page.tsx | 2 +- web/app/routePrefixHandle.tsx | 2 +- web/app/signin/check-code/page.tsx | 4 ++-- .../signin/components/mail-and-code-auth.tsx | 2 +- .../components/mail-and-password-auth.tsx | 2 +- web/app/signin/components/social-auth.tsx | 2 +- web/app/signin/components/sso-auth.tsx | 2 +- web/app/signin/invite-settings/page.tsx | 2 +- web/app/signin/normal-form.tsx | 2 +- web/app/signin/one-more-step.tsx | 2 +- web/app/signin/page.tsx | 2 +- web/app/signup/check-code/page.tsx | 2 +- web/app/signup/page.tsx | 2 +- web/app/signup/set-password/page.tsx | 2 +- web/context/modal-context.test.tsx | 2 +- web/context/web-app-context.tsx | 2 +- web/eslint.config.mjs | 22 +++---------------- web/hooks/use-import-dsl.ts | 2 +- web/hooks/use-pay.tsx | 2 +- web/next/navigation.ts | 8 +++++++ 269 files changed, 320 insertions(+), 328 deletions(-) create mode 100644 web/next/navigation.ts diff --git a/.agents/skills/frontend-testing/assets/component-test.template.tsx b/.agents/skills/frontend-testing/assets/component-test.template.tsx index 6b7803bd4b..ff38f88d23 100644 --- a/.agents/skills/frontend-testing/assets/component-test.template.tsx +++ b/.agents/skills/frontend-testing/assets/component-test.template.tsx @@ -41,7 +41,7 @@ import userEvent from '@testing-library/user-event' // Router (if component uses useRouter, usePathname, useSearchParams) // WHY: Isolates tests from Next.js routing, enables testing navigation behavior // const mockPush = vi.fn() -// vi.mock('next/navigation', () => ({ +// vi.mock('@/next/navigation', () => ({ // useRouter: () => ({ push: mockPush }), // usePathname: () => '/test-path', // })) diff --git a/web/__tests__/apps/app-card-operations-flow.test.tsx b/web/__tests__/apps/app-card-operations-flow.test.tsx index c3e8410955..c5766878a1 100644 --- a/web/__tests__/apps/app-card-operations-flow.test.tsx +++ b/web/__tests__/apps/app-card-operations-flow.test.tsx @@ -29,7 +29,7 @@ const mockOnPlanInfoChanged = vi.fn() const mockDeleteAppMutation = vi.fn().mockResolvedValue(undefined) let mockDeleteMutationPending = false -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush, }), @@ -57,7 +57,7 @@ vi.mock('@headlessui/react', async () => { } }) -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: (loader: () => Promise<{ default: React.ComponentType }>) => { let Component: React.ComponentType> | null = null loader().then((mod) => { diff --git a/web/__tests__/apps/app-list-browsing-flow.test.tsx b/web/__tests__/apps/app-list-browsing-flow.test.tsx index 079f667dbc..1be7e56086 100644 --- a/web/__tests__/apps/app-list-browsing-flow.test.tsx +++ b/web/__tests__/apps/app-list-browsing-flow.test.tsx @@ -38,7 +38,7 @@ let mockShowTagManagementModal = false const mockRouterPush = vi.fn() const mockRouterReplace = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush, replace: mockRouterReplace, @@ -46,7 +46,7 @@ vi.mock('next/navigation', () => ({ useSearchParams: () => new URLSearchParams(), })) -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: (_loader: () => Promise<{ default: React.ComponentType }>) => { const LazyComponent = (props: Record) => { return
diff --git a/web/__tests__/apps/create-app-flow.test.tsx b/web/__tests__/apps/create-app-flow.test.tsx index 4ac9824ddd..bc1f7a3a06 100644 --- a/web/__tests__/apps/create-app-flow.test.tsx +++ b/web/__tests__/apps/create-app-flow.test.tsx @@ -35,7 +35,7 @@ const mockRouterPush = vi.fn() const mockRouterReplace = vi.fn() const mockOnPlanInfoChanged = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush, replace: mockRouterReplace, @@ -117,7 +117,7 @@ vi.mock('ahooks', async () => { }) // Mock dynamically loaded modals with test stubs -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: (loader: () => Promise<{ default: React.ComponentType }>) => { let Component: React.ComponentType> | null = null loader().then((mod) => { diff --git a/web/__tests__/billing/billing-integration.test.tsx b/web/__tests__/billing/billing-integration.test.tsx index 4891760df4..64d358cbe6 100644 --- a/web/__tests__/billing/billing-integration.test.tsx +++ b/web/__tests__/billing/billing-integration.test.tsx @@ -64,7 +64,7 @@ vi.mock('@/service/use-education', () => ({ // ─── Navigation mocks ─────────────────────────────────────────────────────── const mockRouterPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush }), usePathname: () => '/billing', useSearchParams: () => new URLSearchParams(), diff --git a/web/__tests__/billing/cloud-plan-payment-flow.test.tsx b/web/__tests__/billing/cloud-plan-payment-flow.test.tsx index e01d9250fd..bd3b6aa8d8 100644 --- a/web/__tests__/billing/cloud-plan-payment-flow.test.tsx +++ b/web/__tests__/billing/cloud-plan-payment-flow.test.tsx @@ -54,7 +54,7 @@ vi.mock('@/app/components/base/toast', () => ({ })) // ─── Navigation mocks ─────────────────────────────────────────────────────── -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), usePathname: () => '/billing', useSearchParams: () => new URLSearchParams(), diff --git a/web/__tests__/billing/education-verification-flow.test.tsx b/web/__tests__/billing/education-verification-flow.test.tsx index 8c35cd9a8c..707f1d690a 100644 --- a/web/__tests__/billing/education-verification-flow.test.tsx +++ b/web/__tests__/billing/education-verification-flow.test.tsx @@ -63,7 +63,7 @@ vi.mock('@/service/use-billing', () => ({ })) // ─── Navigation mocks ─────────────────────────────────────────────────────── -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush }), usePathname: () => '/billing', useSearchParams: () => new URLSearchParams(), diff --git a/web/__tests__/billing/partner-stack-flow.test.tsx b/web/__tests__/billing/partner-stack-flow.test.tsx index 4f265478cd..fe642ac70b 100644 --- a/web/__tests__/billing/partner-stack-flow.test.tsx +++ b/web/__tests__/billing/partner-stack-flow.test.tsx @@ -18,7 +18,7 @@ let mockSearchParams = new URLSearchParams() const mockMutateAsync = vi.fn() // ─── Module mocks ──────────────────────────────────────────────────────────── -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSearchParams: () => mockSearchParams, useRouter: () => ({ push: vi.fn() }), usePathname: () => '/', diff --git a/web/__tests__/billing/pricing-modal-flow.test.tsx b/web/__tests__/billing/pricing-modal-flow.test.tsx index 7326ee3559..2ec7298618 100644 --- a/web/__tests__/billing/pricing-modal-flow.test.tsx +++ b/web/__tests__/billing/pricing-modal-flow.test.tsx @@ -51,7 +51,7 @@ vi.mock('@/hooks/use-async-window-open', () => ({ })) // ─── Navigation mocks ─────────────────────────────────────────────────────── -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), usePathname: () => '/billing', useSearchParams: () => new URLSearchParams(), diff --git a/web/__tests__/datasets/document-management.test.tsx b/web/__tests__/datasets/document-management.test.tsx index 8aedd4fc63..f9d80520ed 100644 --- a/web/__tests__/datasets/document-management.test.tsx +++ b/web/__tests__/datasets/document-management.test.tsx @@ -13,7 +13,7 @@ import { DataSourceType } from '@/models/datasets' import { renderHookWithNuqs } from '@/test/nuqs-testing' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSearchParams: () => new URLSearchParams(''), useRouter: () => ({ push: mockPush }), usePathname: () => '/datasets/ds-1/documents', diff --git a/web/__tests__/document-detail-navigation-fix.test.tsx b/web/__tests__/document-detail-navigation-fix.test.tsx index 6b348cd15b..5cb115830e 100644 --- a/web/__tests__/document-detail-navigation-fix.test.tsx +++ b/web/__tests__/document-detail-navigation-fix.test.tsx @@ -7,12 +7,12 @@ import type { Mock } from 'vitest' */ import { fireEvent, render, screen } from '@testing-library/react' -import { useRouter } from 'next/navigation' +import { useRouter } from '@/next/navigation' import { useDocumentDetail, useDocumentMetadata } from '@/service/knowledge/use-document' // Mock Next.js router const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: vi.fn(() => ({ push: mockPush, })), diff --git a/web/__tests__/embedded-user-id-auth.test.tsx b/web/__tests__/embedded-user-id-auth.test.tsx index 9231ac6199..cacd6331f8 100644 --- a/web/__tests__/embedded-user-id-auth.test.tsx +++ b/web/__tests__/embedded-user-id-auth.test.tsx @@ -8,7 +8,7 @@ const replaceMock = vi.fn() const backMock = vi.fn() const useSearchParamsMock = vi.fn(() => new URLSearchParams()) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: vi.fn(() => '/chatbot/test-app'), useRouter: vi.fn(() => ({ replace: replaceMock, diff --git a/web/__tests__/embedded-user-id-store.test.tsx b/web/__tests__/embedded-user-id-store.test.tsx index 901218e76b..04597ccfeb 100644 --- a/web/__tests__/embedded-user-id-store.test.tsx +++ b/web/__tests__/embedded-user-id-store.test.tsx @@ -4,7 +4,7 @@ import WebAppStoreProvider, { useWebAppStore } from '@/context/web-app-context' import { AccessMode } from '@/models/access-control' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: vi.fn(() => '/chatbot/sample-app'), useSearchParams: vi.fn(() => { const params = new URLSearchParams() diff --git a/web/__tests__/explore/sidebar-lifecycle-flow.test.tsx b/web/__tests__/explore/sidebar-lifecycle-flow.test.tsx index e2c18bcc4f..77f493ab18 100644 --- a/web/__tests__/explore/sidebar-lifecycle-flow.test.tsx +++ b/web/__tests__/explore/sidebar-lifecycle-flow.test.tsx @@ -19,7 +19,7 @@ const mockUninstall = vi.fn() const mockUpdatePinStatus = vi.fn() let mockInstalledApps: InstalledApp[] = [] -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegments: () => mockSegments, useRouter: () => ({ push: mockPush, diff --git a/web/__tests__/share/text-generation-index-flow.test.tsx b/web/__tests__/share/text-generation-index-flow.test.tsx index 3292474bec..2fec054a47 100644 --- a/web/__tests__/share/text-generation-index-flow.test.tsx +++ b/web/__tests__/share/text-generation-index-flow.test.tsx @@ -5,7 +5,7 @@ import TextGeneration from '@/app/components/share/text-generation' const useSearchParamsMock = vi.fn(() => new URLSearchParams()) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSearchParams: () => useSearchParamsMock(), })) diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx index 6f60899c85..0c87fd1a4d 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx @@ -13,7 +13,6 @@ import { RiTerminalWindowLine, } from '@remixicon/react' import { useUnmount } from 'ahooks' -import { usePathname, useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -26,6 +25,7 @@ import { useAppContext } from '@/context/app-context' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useDocumentTitle from '@/hooks/use-document-title' import dynamic from '@/next/dynamic' +import { usePathname, useRouter } from '@/next/navigation' import { fetchAppDetailDirect } from '@/service/apps' import { AppModeEnum } from '@/types/app' import { cn } from '@/utils/classnames' diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/panel.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/panel.tsx index 5e7d98d191..4201d11490 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/panel.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/panel.tsx @@ -7,7 +7,6 @@ import { RiEqualizer2Line, } from '@remixicon/react' import { useBoolean } from 'ahooks' -import { usePathname } from 'next/navigation' import * as React from 'react' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -17,6 +16,7 @@ import Loading from '@/app/components/base/loading' import Toast from '@/app/components/base/toast' import Indicator from '@/app/components/header/indicator' import { useAppContext } from '@/context/app-context' +import { usePathname } from '@/next/navigation' import { fetchTracingConfig as doFetchTracingConfig, fetchTracingStatus, updateTracingStatus } from '@/service/apps' import { cn } from '@/utils/classnames' import ConfigButton from './config-button' diff --git a/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx b/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx index 4f3f724e62..730b76ee19 100644 --- a/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx +++ b/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx @@ -9,7 +9,6 @@ import { RiFocus2Fill, RiFocus2Line, } from '@remixicon/react' -import { usePathname } from 'next/navigation' import * as React from 'react' import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -23,6 +22,7 @@ import DatasetDetailContext from '@/context/dataset-detail' import { useEventEmitterContextContext } from '@/context/event-emitter' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useDocumentTitle from '@/hooks/use-document-title' +import { usePathname } from '@/next/navigation' import { useDatasetDetail, useDatasetRelatedApps } from '@/service/knowledge/use-dataset' import { cn } from '@/utils/classnames' diff --git a/web/app/(commonLayout)/datasets/layout.spec.tsx b/web/app/(commonLayout)/datasets/layout.spec.tsx index 5873f344d0..9c01cffba8 100644 --- a/web/app/(commonLayout)/datasets/layout.spec.tsx +++ b/web/app/(commonLayout)/datasets/layout.spec.tsx @@ -6,7 +6,7 @@ import DatasetsLayout from './layout' const mockReplace = vi.fn() const mockUseAppContext = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace, }), diff --git a/web/app/(commonLayout)/datasets/layout.tsx b/web/app/(commonLayout)/datasets/layout.tsx index b543c42570..a465f8222b 100644 --- a/web/app/(commonLayout)/datasets/layout.tsx +++ b/web/app/(commonLayout)/datasets/layout.tsx @@ -1,11 +1,11 @@ 'use client' -import { useRouter } from 'next/navigation' import { useEffect } from 'react' import Loading from '@/app/components/base/loading' import { useAppContext } from '@/context/app-context' import { ExternalApiPanelProvider } from '@/context/external-api-panel-context' import { ExternalKnowledgeApiProvider } from '@/context/external-knowledge-api-context' +import { useRouter } from '@/next/navigation' export default function DatasetsLayout({ children }: { children: React.ReactNode }) { const { isCurrentWorkspaceEditor, isCurrentWorkspaceDatasetOperator, currentWorkspace, isLoadingCurrentWorkspace } = useAppContext() diff --git a/web/app/(commonLayout)/education-apply/page.tsx b/web/app/(commonLayout)/education-apply/page.tsx index fce6fe1d5d..44ba5ee8ad 100644 --- a/web/app/(commonLayout)/education-apply/page.tsx +++ b/web/app/(commonLayout)/education-apply/page.tsx @@ -1,15 +1,15 @@ 'use client' -import { - useRouter, - useSearchParams, -} from 'next/navigation' import { useEffect, useMemo, } from 'react' import EducationApplyPage from '@/app/education-apply/education-apply-page' import { useProviderContext } from '@/context/provider-context' +import { + useRouter, + useSearchParams, +} from '@/next/navigation' export default function EducationApply() { const router = useRouter() diff --git a/web/app/(commonLayout)/role-route-guard.spec.tsx b/web/app/(commonLayout)/role-route-guard.spec.tsx index 87bf9be8af..ca1550f0b8 100644 --- a/web/app/(commonLayout)/role-route-guard.spec.tsx +++ b/web/app/(commonLayout)/role-route-guard.spec.tsx @@ -6,7 +6,7 @@ const mockReplace = vi.fn() const mockUseAppContext = vi.fn() let mockPathname = '/apps' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: () => mockPathname, useRouter: () => ({ replace: mockReplace, diff --git a/web/app/(commonLayout)/role-route-guard.tsx b/web/app/(commonLayout)/role-route-guard.tsx index 1c42be9d15..483dfef095 100644 --- a/web/app/(commonLayout)/role-route-guard.tsx +++ b/web/app/(commonLayout)/role-route-guard.tsx @@ -1,10 +1,10 @@ 'use client' import type { ReactNode } from 'react' -import { usePathname, useRouter } from 'next/navigation' import { useEffect } from 'react' import Loading from '@/app/components/base/loading' import { useAppContext } from '@/context/app-context' +import { usePathname, useRouter } from '@/next/navigation' const datasetOperatorRedirectRoutes = ['/apps', '/app', '/explore', '/tools'] as const diff --git a/web/app/(humanInputLayout)/form/[token]/form.tsx b/web/app/(humanInputLayout)/form/[token]/form.tsx index d027ef8b7d..035da6be8a 100644 --- a/web/app/(humanInputLayout)/form/[token]/form.tsx +++ b/web/app/(humanInputLayout)/form/[token]/form.tsx @@ -9,7 +9,6 @@ import { RiInformation2Fill, } from '@remixicon/react' import { produce } from 'immer' -import { useParams } from 'next/navigation' import * as React from 'react' import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -21,6 +20,7 @@ import { getButtonStyle } from '@/app/components/base/chat/chat/answer/human-inp import Loading from '@/app/components/base/loading' import DifyLogo from '@/app/components/base/logo/dify-logo' import useDocumentTitle from '@/hooks/use-document-title' +import { useParams } from '@/next/navigation' import { useGetHumanInputForm, useSubmitHumanInputForm } from '@/service/use-share' import { cn } from '@/utils/classnames' diff --git a/web/app/(shareLayout)/components/authenticated-layout.tsx b/web/app/(shareLayout)/components/authenticated-layout.tsx index c874990448..9f956a8501 100644 --- a/web/app/(shareLayout)/components/authenticated-layout.tsx +++ b/web/app/(shareLayout)/components/authenticated-layout.tsx @@ -1,12 +1,12 @@ 'use client' -import { usePathname, useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' import AppUnavailable from '@/app/components/base/app-unavailable' import Loading from '@/app/components/base/loading' import { useWebAppStore } from '@/context/web-app-context' +import { usePathname, useRouter, useSearchParams } from '@/next/navigation' import { useGetUserCanAccessApp } from '@/service/access-control' import { useGetWebAppInfo, useGetWebAppMeta, useGetWebAppParams } from '@/service/use-share' import { webAppLogout } from '@/service/webapp-auth' diff --git a/web/app/(shareLayout)/components/splash.tsx b/web/app/(shareLayout)/components/splash.tsx index a2b847f74f..402005752d 100644 --- a/web/app/(shareLayout)/components/splash.tsx +++ b/web/app/(shareLayout)/components/splash.tsx @@ -1,11 +1,11 @@ 'use client' import type { FC, PropsWithChildren } from 'react' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import AppUnavailable from '@/app/components/base/app-unavailable' import Loading from '@/app/components/base/loading' import { useWebAppStore } from '@/context/web-app-context' +import { useRouter, useSearchParams } from '@/next/navigation' import { fetchAccessToken } from '@/service/share' import { setWebAppAccessToken, setWebAppPassport, webAppLoginStatus, webAppLogout } from '@/service/webapp-auth' diff --git a/web/app/(shareLayout)/webapp-reset-password/check-code/page.tsx b/web/app/(shareLayout)/webapp-reset-password/check-code/page.tsx index fbf45259e5..a0aa86e35b 100644 --- a/web/app/(shareLayout)/webapp-reset-password/check-code/page.tsx +++ b/web/app/(shareLayout)/webapp-reset-password/check-code/page.tsx @@ -1,14 +1,14 @@ 'use client' import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import Toast from '@/app/components/base/toast' import Countdown from '@/app/components/signin/countdown' - import { useLocale } from '@/context/i18n' + +import { useRouter, useSearchParams } from '@/next/navigation' import { sendWebAppResetPasswordCode, verifyWebAppResetPasswordCode } from '@/service/common' export default function CheckCode() { diff --git a/web/app/(shareLayout)/webapp-reset-password/page.tsx b/web/app/(shareLayout)/webapp-reset-password/page.tsx index 05ad79b3bd..3763e0bb2a 100644 --- a/web/app/(shareLayout)/webapp-reset-password/page.tsx +++ b/web/app/(shareLayout)/webapp-reset-password/page.tsx @@ -1,7 +1,6 @@ 'use client' import { RiArrowLeftLine, RiLockPasswordLine } from '@remixicon/react' import { noop } from 'es-toolkit/function' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -10,9 +9,10 @@ import Toast from '@/app/components/base/toast' import { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '@/app/components/signin/countdown' import { emailRegex } from '@/config' import { useLocale } from '@/context/i18n' - import useDocumentTitle from '@/hooks/use-document-title' + import Link from '@/next/link' +import { useRouter, useSearchParams } from '@/next/navigation' import { sendResetPasswordCode } from '@/service/common' export default function CheckCode() { diff --git a/web/app/(shareLayout)/webapp-reset-password/set-password/page.tsx b/web/app/(shareLayout)/webapp-reset-password/set-password/page.tsx index 9f59e8f9eb..1a97f6440b 100644 --- a/web/app/(shareLayout)/webapp-reset-password/set-password/page.tsx +++ b/web/app/(shareLayout)/webapp-reset-password/set-password/page.tsx @@ -1,13 +1,13 @@ 'use client' import { RiCheckboxCircleFill } from '@remixicon/react' import { useCountDown } from 'ahooks' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import Toast from '@/app/components/base/toast' import { validPassword } from '@/config' +import { useRouter, useSearchParams } from '@/next/navigation' import { changeWebAppPasswordWithToken } from '@/service/common' import { cn } from '@/utils/classnames' diff --git a/web/app/(shareLayout)/webapp-signin/check-code/page.tsx b/web/app/(shareLayout)/webapp-signin/check-code/page.tsx index afea9d668b..81b7c1b9a6 100644 --- a/web/app/(shareLayout)/webapp-signin/check-code/page.tsx +++ b/web/app/(shareLayout)/webapp-signin/check-code/page.tsx @@ -1,7 +1,6 @@ 'use client' import type { FormEvent } from 'react' import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -10,6 +9,7 @@ import Toast from '@/app/components/base/toast' import Countdown from '@/app/components/signin/countdown' import { useLocale } from '@/context/i18n' import { useWebAppStore } from '@/context/web-app-context' +import { useRouter, useSearchParams } from '@/next/navigation' import { sendWebAppEMailLoginCode, webAppEmailLoginWithCode } from '@/service/common' import { fetchAccessToken } from '@/service/share' import { setWebAppAccessToken, setWebAppPassport } from '@/service/webapp-auth' diff --git a/web/app/(shareLayout)/webapp-signin/components/external-member-sso-auth.tsx b/web/app/(shareLayout)/webapp-signin/components/external-member-sso-auth.tsx index 0776df036d..391479c870 100644 --- a/web/app/(shareLayout)/webapp-signin/components/external-member-sso-auth.tsx +++ b/web/app/(shareLayout)/webapp-signin/components/external-member-sso-auth.tsx @@ -1,11 +1,11 @@ 'use client' -import { useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect } from 'react' import AppUnavailable from '@/app/components/base/app-unavailable' import Loading from '@/app/components/base/loading' import Toast from '@/app/components/base/toast' import { useGlobalPublicStore } from '@/context/global-public-context' +import { useRouter, useSearchParams } from '@/next/navigation' import { fetchWebOAuth2SSOUrl, fetchWebOIDCSSOUrl, fetchWebSAMLSSOUrl } from '@/service/share' import { SSOProtocol } from '@/types/feature' diff --git a/web/app/(shareLayout)/webapp-signin/components/mail-and-code-auth.tsx b/web/app/(shareLayout)/webapp-signin/components/mail-and-code-auth.tsx index 5aa9d9f141..b350549784 100644 --- a/web/app/(shareLayout)/webapp-signin/components/mail-and-code-auth.tsx +++ b/web/app/(shareLayout)/webapp-signin/components/mail-and-code-auth.tsx @@ -1,5 +1,4 @@ import { noop } from 'es-toolkit/function' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -8,6 +7,7 @@ import Toast from '@/app/components/base/toast' import { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '@/app/components/signin/countdown' import { emailRegex } from '@/config' import { useLocale } from '@/context/i18n' +import { useRouter, useSearchParams } from '@/next/navigation' import { sendWebAppEMailLoginCode } from '@/service/common' export default function MailAndCodeAuth() { diff --git a/web/app/(shareLayout)/webapp-signin/components/mail-and-password-auth.tsx b/web/app/(shareLayout)/webapp-signin/components/mail-and-password-auth.tsx index f5c0e4a45c..87419438e3 100644 --- a/web/app/(shareLayout)/webapp-signin/components/mail-and-password-auth.tsx +++ b/web/app/(shareLayout)/webapp-signin/components/mail-and-password-auth.tsx @@ -1,6 +1,5 @@ 'use client' import { noop } from 'es-toolkit/function' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -10,6 +9,7 @@ import { emailRegex } from '@/config' import { useLocale } from '@/context/i18n' import { useWebAppStore } from '@/context/web-app-context' import Link from '@/next/link' +import { useRouter, useSearchParams } from '@/next/navigation' import { webAppLogin } from '@/service/common' import { fetchAccessToken } from '@/service/share' import { setWebAppAccessToken, setWebAppPassport } from '@/service/webapp-auth' diff --git a/web/app/(shareLayout)/webapp-signin/components/sso-auth.tsx b/web/app/(shareLayout)/webapp-signin/components/sso-auth.tsx index d8f3854868..79d67dde5c 100644 --- a/web/app/(shareLayout)/webapp-signin/components/sso-auth.tsx +++ b/web/app/(shareLayout)/webapp-signin/components/sso-auth.tsx @@ -1,11 +1,11 @@ 'use client' import type { FC } from 'react' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security' import Toast from '@/app/components/base/toast' +import { useRouter, useSearchParams } from '@/next/navigation' import { fetchMembersOAuth2SSOUrl, fetchMembersOIDCSSOUrl, fetchMembersSAMLSSOUrl } from '@/service/share' import { SSOProtocol } from '@/types/feature' diff --git a/web/app/(shareLayout)/webapp-signin/page.tsx b/web/app/(shareLayout)/webapp-signin/page.tsx index b3ad1d48a6..a5c2528cc7 100644 --- a/web/app/(shareLayout)/webapp-signin/page.tsx +++ b/web/app/(shareLayout)/webapp-signin/page.tsx @@ -1,6 +1,5 @@ 'use client' import type { FC } from 'react' -import { useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' @@ -8,6 +7,7 @@ import AppUnavailable from '@/app/components/base/app-unavailable' import { useGlobalPublicStore } from '@/context/global-public-context' import { useWebAppStore } from '@/context/web-app-context' import { AccessMode } from '@/models/access-control' +import { useRouter, useSearchParams } from '@/next/navigation' import { webAppLogout } from '@/service/webapp-auth' import ExternalMemberSsoAuth from './components/external-member-sso-auth' import NormalForm from './normalForm' diff --git a/web/app/account/(commonLayout)/account-page/email-change-modal.tsx b/web/app/account/(commonLayout)/account-page/email-change-modal.tsx index c146174ea9..f0dfd4f12f 100644 --- a/web/app/account/(commonLayout)/account-page/email-change-modal.tsx +++ b/web/app/account/(commonLayout)/account-page/email-change-modal.tsx @@ -1,7 +1,6 @@ import type { ResponseError } from '@/service/fetch' import { RiCloseLine } from '@remixicon/react' import { noop } from 'es-toolkit/function' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useState } from 'react' import { Trans, useTranslation } from 'react-i18next' @@ -10,6 +9,7 @@ import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import Modal from '@/app/components/base/modal' import { ToastContext } from '@/app/components/base/toast/context' +import { useRouter } from '@/next/navigation' import { checkEmailExisted, resetEmail, diff --git a/web/app/account/(commonLayout)/avatar.tsx b/web/app/account/(commonLayout)/avatar.tsx index 07b685b8c5..0b3541ae9c 100644 --- a/web/app/account/(commonLayout)/avatar.tsx +++ b/web/app/account/(commonLayout)/avatar.tsx @@ -3,7 +3,6 @@ import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/r import { RiGraduationCapFill, } from '@remixicon/react' -import { useRouter } from 'next/navigation' import { Fragment } from 'react' import { useTranslation } from 'react-i18next' import { resetUser } from '@/app/components/base/amplitude/utils' @@ -11,6 +10,7 @@ import { Avatar } from '@/app/components/base/avatar' import { LogOut01 } from '@/app/components/base/icons/src/vender/line/general' import PremiumBadge from '@/app/components/base/premium-badge' import { useProviderContext } from '@/context/provider-context' +import { useRouter } from '@/next/navigation' import { useLogout, useUserProfile } from '@/service/use-common' export type IAppSelector = { diff --git a/web/app/account/(commonLayout)/delete-account/components/feed-back.tsx b/web/app/account/(commonLayout)/delete-account/components/feed-back.tsx index 67fea3c141..ae73d778f8 100644 --- a/web/app/account/(commonLayout)/delete-account/components/feed-back.tsx +++ b/web/app/account/(commonLayout)/delete-account/components/feed-back.tsx @@ -1,5 +1,4 @@ 'use client' -import { useRouter } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -7,6 +6,7 @@ import CustomDialog from '@/app/components/base/dialog' import Textarea from '@/app/components/base/textarea' import Toast from '@/app/components/base/toast' import { useAppContext } from '@/context/app-context' +import { useRouter } from '@/next/navigation' import { useLogout } from '@/service/use-common' import { useDeleteAccountFeedback } from '../state' diff --git a/web/app/account/(commonLayout)/header.tsx b/web/app/account/(commonLayout)/header.tsx index bb58be87a8..5ef84a8f1e 100644 --- a/web/app/account/(commonLayout)/header.tsx +++ b/web/app/account/(commonLayout)/header.tsx @@ -1,11 +1,11 @@ 'use client' import { RiArrowRightUpLine, RiRobot2Line } from '@remixicon/react' -import { useRouter } from 'next/navigation' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import DifyLogo from '@/app/components/base/logo/dify-logo' import { useGlobalPublicStore } from '@/context/global-public-context' +import { useRouter } from '@/next/navigation' import Avatar from './avatar' const Header = () => { diff --git a/web/app/account/oauth/authorize/page.tsx b/web/app/account/oauth/authorize/page.tsx index 835a1e702e..5ca920343e 100644 --- a/web/app/account/oauth/authorize/page.tsx +++ b/web/app/account/oauth/authorize/page.tsx @@ -7,7 +7,6 @@ import { RiMailLine, RiTranslate2, } from '@remixicon/react' -import { useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' @@ -17,6 +16,7 @@ import Loading from '@/app/components/base/loading' import Toast from '@/app/components/base/toast' import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks' import { setPostLoginRedirect } from '@/app/signin/utils/post-login-redirect' +import { useRouter, useSearchParams } from '@/next/navigation' import { useIsLogin, useUserProfile } from '@/service/use-common' import { useAuthorizeOAuthApp, useOAuthAppInfo } from '@/service/use-oauth' diff --git a/web/app/activate/activateForm.tsx b/web/app/activate/activateForm.tsx index 421b816652..418d3b8bb1 100644 --- a/web/app/activate/activateForm.tsx +++ b/web/app/activate/activateForm.tsx @@ -1,11 +1,11 @@ 'use client' -import { useRouter, useSearchParams } from 'next/navigation' import { useEffect } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Loading from '@/app/components/base/loading' - import useDocumentTitle from '@/hooks/use-document-title' + +import { useRouter, useSearchParams } from '@/next/navigation' import { useInvitationCheck } from '@/service/use-common' import { cn } from '@/utils/classnames' diff --git a/web/app/components/app-initializer.tsx b/web/app/components/app-initializer.tsx index bf7aa39580..e08ece6666 100644 --- a/web/app/components/app-initializer.tsx +++ b/web/app/components/app-initializer.tsx @@ -2,13 +2,13 @@ import type { ReactNode } from 'react' import Cookies from 'js-cookie' -import { usePathname, useRouter, useSearchParams } from 'next/navigation' import { parseAsBoolean, useQueryState } from 'nuqs' import { useCallback, useEffect, useState } from 'react' import { EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION, EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, } from '@/app/education-apply/constants' +import { usePathname, useRouter, useSearchParams } from '@/next/navigation' import { sendGAEvent } from '@/utils/gtag' import { fetchSetupStatusWithCache } from '@/utils/setup-status' import { resolvePostLoginRedirect } from '../signin/utils/post-login-redirect' diff --git a/web/app/components/app-sidebar/__tests__/index.spec.tsx b/web/app/components/app-sidebar/__tests__/index.spec.tsx index 89db80e0f1..b2e1e92bbb 100644 --- a/web/app/components/app-sidebar/__tests__/index.spec.tsx +++ b/web/app/components/app-sidebar/__tests__/index.spec.tsx @@ -19,7 +19,7 @@ vi.mock('zustand/react/shallow', () => ({ useShallow: (fn: unknown) => fn, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: () => mockPathname, })) diff --git a/web/app/components/app-sidebar/__tests__/text-squeeze-fix-verification.spec.tsx b/web/app/components/app-sidebar/__tests__/text-squeeze-fix-verification.spec.tsx index fb19833dd2..a3868a8330 100644 --- a/web/app/components/app-sidebar/__tests__/text-squeeze-fix-verification.spec.tsx +++ b/web/app/components/app-sidebar/__tests__/text-squeeze-fix-verification.spec.tsx @@ -7,7 +7,7 @@ import { render } from '@testing-library/react' import * as React from 'react' // Mock Next.js navigation -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegment: () => 'overview', })) diff --git a/web/app/components/app-sidebar/app-info/__tests__/app-info-modals.spec.tsx b/web/app/components/app-sidebar/app-info/__tests__/app-info-modals.spec.tsx index f8612e8057..2f98089e40 100644 --- a/web/app/components/app-sidebar/app-info/__tests__/app-info-modals.spec.tsx +++ b/web/app/components/app-sidebar/app-info/__tests__/app-info-modals.spec.tsx @@ -5,7 +5,7 @@ import * as React from 'react' import { AppModeEnum } from '@/types/app' import AppInfoModals from '../app-info-modals' -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: (loader: () => Promise<{ default: React.ComponentType }>) => { const LazyComp = React.lazy(loader) return function DynamicWrapper(props: Record) { diff --git a/web/app/components/app-sidebar/app-info/__tests__/use-app-info-actions.spec.ts b/web/app/components/app-sidebar/app-info/__tests__/use-app-info-actions.spec.ts index 6104e2b641..deea28ce3e 100644 --- a/web/app/components/app-sidebar/app-info/__tests__/use-app-info-actions.spec.ts +++ b/web/app/components/app-sidebar/app-info/__tests__/use-app-info-actions.spec.ts @@ -23,7 +23,7 @@ let mockAppDetail: Record | undefined = { icon_background: '#FFEAD5', } -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace }), })) diff --git a/web/app/components/app-sidebar/app-info/use-app-info-actions.ts b/web/app/components/app-sidebar/app-info/use-app-info-actions.ts index 800f21de44..55ec13e506 100644 --- a/web/app/components/app-sidebar/app-info/use-app-info-actions.ts +++ b/web/app/components/app-sidebar/app-info/use-app-info-actions.ts @@ -1,7 +1,6 @@ import type { DuplicateAppModalProps } from '@/app/components/app/duplicate-modal' import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal' import type { EnvironmentVariable } from '@/app/components/workflow/types' -import { useRouter } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' @@ -9,6 +8,7 @@ import { useStore as useAppStore } from '@/app/components/app/store' import { ToastContext } from '@/app/components/base/toast/context' import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useProviderContext } from '@/context/provider-context' +import { useRouter } from '@/next/navigation' import { copyApp, deleteApp, exportAppConfig, updateAppInfo } from '@/service/apps' import { useInvalidateAppList } from '@/service/use-apps' import { fetchWorkflowDraft } from '@/service/workflow' diff --git a/web/app/components/app-sidebar/dataset-info/__tests__/dropdown-callbacks.spec.tsx b/web/app/components/app-sidebar/dataset-info/__tests__/dropdown-callbacks.spec.tsx index 512f9490c2..1df6fa79b7 100644 --- a/web/app/components/app-sidebar/dataset-info/__tests__/dropdown-callbacks.spec.tsx +++ b/web/app/components/app-sidebar/dataset-info/__tests__/dropdown-callbacks.spec.tsx @@ -80,7 +80,7 @@ const createDataset = (overrides: Partial = {}): DataSet => ({ ...overrides, }) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace }), })) diff --git a/web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx b/web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx index be27e247d7..a1e275d731 100644 --- a/web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx +++ b/web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx @@ -90,7 +90,7 @@ const createDataset = (overrides: Partial = {}): DataSet => ({ ...overrides, }) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace, }), diff --git a/web/app/components/app-sidebar/dataset-info/dropdown.tsx b/web/app/components/app-sidebar/dataset-info/dropdown.tsx index 96127c4210..528bac831f 100644 --- a/web/app/components/app-sidebar/dataset-info/dropdown.tsx +++ b/web/app/components/app-sidebar/dataset-info/dropdown.tsx @@ -1,11 +1,11 @@ import type { DataSet } from '@/models/datasets' import { RiMoreFill } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector as useAppContextWithSelector } from '@/context/app-context' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { useRouter } from '@/next/navigation' import { checkIsUsedInApp, deleteDataset } from '@/service/datasets' import { datasetDetailQueryKeyPrefix, useInvalidDatasetList } from '@/service/knowledge/use-dataset' import { useInvalid } from '@/service/use-base' diff --git a/web/app/components/app-sidebar/index.tsx b/web/app/components/app-sidebar/index.tsx index e24b005d01..13fde97f89 100644 --- a/web/app/components/app-sidebar/index.tsx +++ b/web/app/components/app-sidebar/index.tsx @@ -1,12 +1,12 @@ import type { NavIcon } from './nav-link' import { useHover, useKeyPress } from 'ahooks' -import { usePathname } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useState } from 'react' import { useShallow } from 'zustand/react/shallow' import { useStore as useAppStore } from '@/app/components/app/store' import { useEventEmitterContextContext } from '@/context/event-emitter' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' +import { usePathname } from '@/next/navigation' import { cn } from '@/utils/classnames' import Divider from '../base/divider' import { getKeyboardKeyCodeBySystem } from '../workflow/utils' diff --git a/web/app/components/app-sidebar/nav-link/__tests__/index.spec.tsx b/web/app/components/app-sidebar/nav-link/__tests__/index.spec.tsx index faaaa43300..fe46290002 100644 --- a/web/app/components/app-sidebar/nav-link/__tests__/index.spec.tsx +++ b/web/app/components/app-sidebar/nav-link/__tests__/index.spec.tsx @@ -4,7 +4,7 @@ import * as React from 'react' import NavLink from '..' // Mock Next.js navigation -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegment: () => 'overview', })) diff --git a/web/app/components/app-sidebar/nav-link/index.tsx b/web/app/components/app-sidebar/nav-link/index.tsx index a49a0b520e..cf986a7407 100644 --- a/web/app/components/app-sidebar/nav-link/index.tsx +++ b/web/app/components/app-sidebar/nav-link/index.tsx @@ -1,8 +1,8 @@ 'use client' import type { RemixiconComponentType } from '@remixicon/react' -import { useSelectedLayoutSegment } from 'next/navigation' import * as React from 'react' import Link from '@/next/link' +import { useSelectedLayoutSegment } from '@/next/navigation' import { cn } from '@/utils/classnames' export type NavIcon = React.ComponentType< diff --git a/web/app/components/app/configuration/dataset-config/context-var/index.spec.tsx b/web/app/components/app/configuration/dataset-config/context-var/index.spec.tsx index 7f71247d56..8c6e626b45 100644 --- a/web/app/components/app/configuration/dataset-config/context-var/index.spec.tsx +++ b/web/app/components/app/configuration/dataset-config/context-var/index.spec.tsx @@ -5,7 +5,7 @@ import * as React from 'react' import ContextVar from './index' // Mock external dependencies only -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), usePathname: () => '/test', })) diff --git a/web/app/components/app/configuration/dataset-config/context-var/var-picker.spec.tsx b/web/app/components/app/configuration/dataset-config/context-var/var-picker.spec.tsx index aa8dae813f..6704fa0afd 100644 --- a/web/app/components/app/configuration/dataset-config/context-var/var-picker.spec.tsx +++ b/web/app/components/app/configuration/dataset-config/context-var/var-picker.spec.tsx @@ -5,7 +5,7 @@ import * as React from 'react' import VarPicker from './var-picker' // Mock external dependencies only -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), usePathname: () => '/test', })) diff --git a/web/app/components/app/configuration/debug/debug-with-single-model/index.spec.tsx b/web/app/components/app/configuration/debug/debug-with-single-model/index.spec.tsx index 48141d0045..a75516a43f 100644 --- a/web/app/components/app/configuration/debug/debug-with-single-model/index.spec.tsx +++ b/web/app/components/app/configuration/debug/debug-with-single-model/index.spec.tsx @@ -155,7 +155,7 @@ vi.mock('@/service/debug', () => ({ stopChatMessageResponding: mockStopChatMessageResponding, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), usePathname: () => '/test', useParams: () => ({}), diff --git a/web/app/components/app/configuration/index.tsx b/web/app/components/app/configuration/index.tsx index 0e6ffb1e84..aa1bbe0a16 100644 --- a/web/app/components/app/configuration/index.tsx +++ b/web/app/components/app/configuration/index.tsx @@ -23,7 +23,6 @@ import { useBoolean, useGetState } from 'ahooks' import { clone } from 'es-toolkit/object' import { isEqual } from 'es-toolkit/predicate' import { produce } from 'immer' -import { usePathname } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -72,6 +71,7 @@ import { useModalContext } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import { PromptMode } from '@/models/debug' +import { usePathname } from '@/next/navigation' import { fetchAppDetailDirect, updateAppModelConfig } from '@/service/apps' import { fetchDatasets } from '@/service/datasets' import { fetchCollectionList } from '@/service/tools' diff --git a/web/app/components/app/create-app-dialog/app-list/index.spec.tsx b/web/app/components/app/create-app-dialog/app-list/index.spec.tsx index e0f459ee75..e2db3a94f7 100644 --- a/web/app/components/app/create-app-dialog/app-list/index.spec.tsx +++ b/web/app/components/app/create-app-dialog/app-list/index.spec.tsx @@ -62,7 +62,7 @@ vi.mock('@/app/components/workflow/plugin-dependency/hooks', () => ({ vi.mock('@/utils/app-redirection', () => ({ getRedirection: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), })) diff --git a/web/app/components/app/create-app-dialog/app-list/index.tsx b/web/app/components/app/create-app-dialog/app-list/index.tsx index b967ba7d55..5dea3e8aef 100644 --- a/web/app/components/app/create-app-dialog/app-list/index.tsx +++ b/web/app/components/app/create-app-dialog/app-list/index.tsx @@ -4,7 +4,6 @@ import type { CreateAppModalProps } from '@/app/components/explore/create-app-mo import type { App } from '@/models/explore' import { RiRobot2Line } from '@remixicon/react' import { useDebounceFn } from 'ahooks' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -19,6 +18,7 @@ import { usePluginDependencies } from '@/app/components/workflow/plugin-dependen import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useAppContext } from '@/context/app-context' import { DSLImportMode } from '@/models/app' +import { useRouter } from '@/next/navigation' import { importDSL } from '@/service/apps' import { fetchAppDetail } from '@/service/explore' import { useExploreAppList } from '@/service/use-explore' diff --git a/web/app/components/app/create-app-modal/index.spec.tsx b/web/app/components/app/create-app-modal/index.spec.tsx index a9adb17582..c253fcd457 100644 --- a/web/app/components/app/create-app-modal/index.spec.tsx +++ b/web/app/components/app/create-app-modal/index.spec.tsx @@ -1,13 +1,13 @@ import type { App } from '@/types/app' import { fireEvent, render, screen, waitFor } from '@testing-library/react' -import { useRouter } from 'next/navigation' import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest' import { trackEvent } from '@/app/components/base/amplitude' - import { ToastContext } from '@/app/components/base/toast/context' + import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useAppContext } from '@/context/app-context' import { useProviderContext } from '@/context/provider-context' +import { useRouter } from '@/next/navigation' import { createApp } from '@/service/apps' import { AppModeEnum } from '@/types/app' import { getRedirection } from '@/utils/app-redirection' @@ -23,7 +23,7 @@ vi.mock('ahooks', () => ({ useKeyPress: vi.fn(), useHover: () => false, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: vi.fn(), })) vi.mock('@/app/components/base/amplitude', () => ({ diff --git a/web/app/components/app/create-app-modal/index.tsx b/web/app/components/app/create-app-modal/index.tsx index 1c22913bb1..556773c341 100644 --- a/web/app/components/app/create-app-modal/index.tsx +++ b/web/app/components/app/create-app-modal/index.tsx @@ -4,7 +4,6 @@ import type { AppIconSelection } from '../../base/app-icon-picker' import { RiArrowRightLine, RiArrowRightSLine, RiExchange2Fill } from '@remixicon/react' import { useDebounceFn, useKeyPress } from 'ahooks' -import { useRouter } from 'next/navigation' import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' @@ -22,6 +21,7 @@ import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useAppContext } from '@/context/app-context' import { useProviderContext } from '@/context/provider-context' import useTheme from '@/hooks/use-theme' +import { useRouter } from '@/next/navigation' import { createApp } from '@/service/apps' import { AppModeEnum } from '@/types/app' import { getRedirection } from '@/utils/app-redirection' diff --git a/web/app/components/app/create-from-dsl-modal/index.tsx b/web/app/components/app/create-from-dsl-modal/index.tsx index a0c8360c29..eaaee50973 100644 --- a/web/app/components/app/create-from-dsl-modal/index.tsx +++ b/web/app/components/app/create-from-dsl-modal/index.tsx @@ -4,7 +4,6 @@ import type { MouseEventHandler } from 'react' import { RiCloseLine } from '@remixicon/react' import { useDebounceFn, useKeyPress } from 'ahooks' import { noop } from 'es-toolkit/function' -import { useRouter } from 'next/navigation' import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' @@ -22,6 +21,7 @@ import { DSLImportMode, DSLImportStatus, } from '@/models/app' +import { useRouter } from '@/next/navigation' import { importDSL, importDSLConfirm, diff --git a/web/app/components/app/log-annotation/index.spec.tsx b/web/app/components/app/log-annotation/index.spec.tsx index c7c654e870..de33ae6f66 100644 --- a/web/app/components/app/log-annotation/index.spec.tsx +++ b/web/app/components/app/log-annotation/index.spec.tsx @@ -7,7 +7,7 @@ import { AppModeEnum } from '@/types/app' import LogAnnotation from './index' const mockRouterPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush, }), diff --git a/web/app/components/app/log-annotation/index.tsx b/web/app/components/app/log-annotation/index.tsx index ca6182603d..c5c21289df 100644 --- a/web/app/components/app/log-annotation/index.tsx +++ b/web/app/components/app/log-annotation/index.tsx @@ -1,6 +1,5 @@ 'use client' import type { FC } from 'react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' @@ -11,6 +10,7 @@ import WorkflowLog from '@/app/components/app/workflow-log' import { PageType } from '@/app/components/base/features/new-feature-panel/annotation-reply/type' import Loading from '@/app/components/base/loading' import TabSlider from '@/app/components/base/tab-slider-plain' +import { useRouter } from '@/next/navigation' import { AppModeEnum } from '@/types/app' import { cn } from '@/utils/classnames' diff --git a/web/app/components/app/log/index.tsx b/web/app/components/app/log/index.tsx index e96c9ce0c9..59f454f754 100644 --- a/web/app/components/app/log/index.tsx +++ b/web/app/components/app/log/index.tsx @@ -4,13 +4,13 @@ import type { App } from '@/types/app' import { useDebounce } from 'ahooks' import dayjs from 'dayjs' import { omit } from 'es-toolkit/object' -import { usePathname, useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' import Pagination from '@/app/components/base/pagination' import { APP_PAGE_LIMIT } from '@/config' +import { usePathname, useRouter, useSearchParams } from '@/next/navigation' import { useChatConversations, useCompletionConversations } from '@/service/use-log' import { AppModeEnum } from '@/types/app' import EmptyElement from './empty-element' diff --git a/web/app/components/app/log/list.tsx b/web/app/components/app/log/list.tsx index 146af44a10..453c7c9d4c 100644 --- a/web/app/components/app/log/list.tsx +++ b/web/app/components/app/log/list.tsx @@ -14,7 +14,6 @@ import timezone from 'dayjs/plugin/timezone' import utc from 'dayjs/plugin/utc' import { get } from 'es-toolkit/compat' import { noop } from 'es-toolkit/function' -import { usePathname, useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -38,6 +37,7 @@ import { WorkflowContextProvider } from '@/app/components/workflow/context' import { useAppContext } from '@/context/app-context' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useTimestamp from '@/hooks/use-timestamp' +import { usePathname, useRouter, useSearchParams } from '@/next/navigation' import { fetchChatMessages, updateLogMessageAnnotations, updateLogMessageFeedbacks } from '@/service/log' import { AppSourceType } from '@/service/share' import { useChatConversationDetail, useCompletionConversationDetail } from '@/service/use-log' diff --git a/web/app/components/app/overview/app-card.tsx b/web/app/components/app/overview/app-card.tsx index 1b02e54d5f..42cf4d8618 100644 --- a/web/app/components/app/overview/app-card.tsx +++ b/web/app/components/app/overview/app-card.tsx @@ -14,7 +14,6 @@ import { RiVerifiedBadgeLine, RiWindowLine, } from '@remixicon/react' -import { usePathname, useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -34,6 +33,7 @@ import { useAppContext } from '@/context/app-context' import { useGlobalPublicStore } from '@/context/global-public-context' import { useDocLink } from '@/context/i18n' import { AccessMode } from '@/models/access-control' +import { usePathname, useRouter } from '@/next/navigation' import { useAppWhiteListSubjects } from '@/service/access-control' import { fetchAppDetailDirect } from '@/service/apps' import { useAppWorkflow } from '@/service/use-workflow' diff --git a/web/app/components/app/switch-app-modal/index.spec.tsx b/web/app/components/app/switch-app-modal/index.spec.tsx index c905d79b31..53007b986b 100644 --- a/web/app/components/app/switch-app-modal/index.spec.tsx +++ b/web/app/components/app/switch-app-modal/index.spec.tsx @@ -11,7 +11,7 @@ import SwitchAppModal from './index' const mockPush = vi.fn() const mockReplace = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, replace: mockReplace, diff --git a/web/app/components/app/switch-app-modal/index.tsx b/web/app/components/app/switch-app-modal/index.tsx index 8caa07c187..7c3269d52c 100644 --- a/web/app/components/app/switch-app-modal/index.tsx +++ b/web/app/components/app/switch-app-modal/index.tsx @@ -3,7 +3,6 @@ import type { App } from '@/types/app' import { RiCloseLine } from '@remixicon/react' import { noop } from 'es-toolkit/function' -import { useRouter } from 'next/navigation' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' @@ -20,6 +19,7 @@ import AppsFull from '@/app/components/billing/apps-full-in-dialog' import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useAppContext } from '@/context/app-context' import { useProviderContext } from '@/context/provider-context' +import { useRouter } from '@/next/navigation' import { deleteApp, switchApp } from '@/service/apps' import { AppModeEnum } from '@/types/app' import { getRedirection } from '@/utils/app-redirection' diff --git a/web/app/components/app/text-generate/item/index.tsx b/web/app/components/app/text-generate/item/index.tsx index 22358805a7..d22375a292 100644 --- a/web/app/components/app/text-generate/item/index.tsx +++ b/web/app/components/app/text-generate/item/index.tsx @@ -16,7 +16,6 @@ import { } from '@remixicon/react' import { useBoolean } from 'ahooks' import copy from 'copy-to-clipboard' -import { useParams } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -30,6 +29,7 @@ import Loading from '@/app/components/base/loading' import { Markdown } from '@/app/components/base/markdown' import NewAudioButton from '@/app/components/base/new-audio-button' import Toast from '@/app/components/base/toast' +import { useParams } from '@/next/navigation' import { fetchTextGenerationMessage } from '@/service/debug' import { AppSourceType, fetchMoreLikeThis, submitHumanInputForm, updateFeedback } from '@/service/share' import { submitHumanInputForm as submitHumanInputFormService } from '@/service/workflow' diff --git a/web/app/components/app/text-generate/saved-items/index.spec.tsx b/web/app/components/app/text-generate/saved-items/index.spec.tsx index f04a37bded..b45a1cca6c 100644 --- a/web/app/components/app/text-generate/saved-items/index.spec.tsx +++ b/web/app/components/app/text-generate/saved-items/index.spec.tsx @@ -10,7 +10,7 @@ import SavedItems from './index' vi.mock('copy-to-clipboard', () => ({ default: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({}), usePathname: () => '/', })) diff --git a/web/app/components/app/workflow-log/detail.spec.tsx b/web/app/components/app/workflow-log/detail.spec.tsx index 1ed7193d42..806c6e71b2 100644 --- a/web/app/components/app/workflow-log/detail.spec.tsx +++ b/web/app/components/app/workflow-log/detail.spec.tsx @@ -19,7 +19,7 @@ import DetailPanel from './detail' // ============================================================================ const mockRouterPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush, }), diff --git a/web/app/components/app/workflow-log/detail.tsx b/web/app/components/app/workflow-log/detail.tsx index ce85653e71..99d2c70228 100644 --- a/web/app/components/app/workflow-log/detail.tsx +++ b/web/app/components/app/workflow-log/detail.tsx @@ -1,12 +1,12 @@ 'use client' import type { FC } from 'react' import { RiCloseLine, RiPlayLargeLine } from '@remixicon/react' -import { useRouter } from 'next/navigation' import { useTranslation } from 'react-i18next' import { useStore } from '@/app/components/app/store' import TooltipPlus from '@/app/components/base/tooltip' import { WorkflowContextProvider } from '@/app/components/workflow/context' import Run from '@/app/components/workflow/run' +import { useRouter } from '@/next/navigation' type ILogDetail = { runID: string diff --git a/web/app/components/app/workflow-log/index.spec.tsx b/web/app/components/app/workflow-log/index.spec.tsx index e69169cde3..92f8eddf83 100644 --- a/web/app/components/app/workflow-log/index.spec.tsx +++ b/web/app/components/app/workflow-log/index.spec.tsx @@ -47,7 +47,7 @@ vi.mock('ahooks', () => ({ }, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn(), }), diff --git a/web/app/components/app/workflow-log/list.spec.tsx b/web/app/components/app/workflow-log/list.spec.tsx index 760d222692..36cc911248 100644 --- a/web/app/components/app/workflow-log/list.spec.tsx +++ b/web/app/components/app/workflow-log/list.spec.tsx @@ -23,7 +23,7 @@ import WorkflowAppLogList from './list' // ============================================================================ const mockRouterPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush, }), diff --git a/web/app/components/apps/__tests__/app-card.spec.tsx b/web/app/components/apps/__tests__/app-card.spec.tsx index 9bc23ce199..c87b22a3e8 100644 --- a/web/app/components/apps/__tests__/app-card.spec.tsx +++ b/web/app/components/apps/__tests__/app-card.spec.tsx @@ -11,7 +11,7 @@ import AppCard from '../app-card' // Mock next/navigation const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), @@ -111,7 +111,7 @@ vi.mock('@/utils/time', () => ({ })) // Mock dynamic imports -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: (importFn: () => Promise) => { const fnString = importFn.toString() diff --git a/web/app/components/apps/__tests__/list.spec.tsx b/web/app/components/apps/__tests__/list.spec.tsx index 989bf6a788..877c392e6d 100644 --- a/web/app/components/apps/__tests__/list.spec.tsx +++ b/web/app/components/apps/__tests__/list.spec.tsx @@ -8,7 +8,7 @@ import List from '../list' const mockReplace = vi.fn() const mockRouter = { replace: mockReplace } -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => mockRouter, useSearchParams: () => new URLSearchParams(''), })) @@ -124,7 +124,7 @@ vi.mock('@/hooks/use-pay', () => ({ CheckModal: () => null, })) -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: (importFn: () => Promise) => { const fnString = importFn.toString() diff --git a/web/app/components/apps/__tests__/new-app-card.spec.tsx b/web/app/components/apps/__tests__/new-app-card.spec.tsx index f4c357b9f9..9c98936bea 100644 --- a/web/app/components/apps/__tests__/new-app-card.spec.tsx +++ b/web/app/components/apps/__tests__/new-app-card.spec.tsx @@ -4,7 +4,7 @@ import * as React from 'react' import CreateAppCard from '../new-app-card' const mockReplace = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace, }), @@ -18,7 +18,7 @@ vi.mock('@/context/provider-context', () => ({ }), })) -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: (importFn: () => Promise<{ default: React.ComponentType }>) => { const fnString = importFn.toString() diff --git a/web/app/components/apps/app-card.tsx b/web/app/components/apps/app-card.tsx index 6a4a2181d6..31a3be05cd 100644 --- a/web/app/components/apps/app-card.tsx +++ b/web/app/components/apps/app-card.tsx @@ -7,7 +7,6 @@ import type { CreateAppModalProps } from '@/app/components/explore/create-app-mo import type { EnvironmentVariable } from '@/app/components/workflow/types' import type { App } from '@/types/app' import { RiBuildingLine, RiGlobalLine, RiLockLine, RiMoreFill, RiVerifiedBadgeLine } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -36,6 +35,7 @@ import { useProviderContext } from '@/context/provider-context' import { useAsyncWindowOpen } from '@/hooks/use-async-window-open' import { AccessMode } from '@/models/access-control' import dynamic from '@/next/dynamic' +import { useRouter } from '@/next/navigation' import { useGetUserCanAccessApp } from '@/service/access-control' import { copyApp, exportAppConfig, updateAppInfo } from '@/service/apps' import { fetchInstalledAppList } from '@/service/explore' diff --git a/web/app/components/apps/new-app-card.tsx b/web/app/components/apps/new-app-card.tsx index a14b10098f..7741190b8c 100644 --- a/web/app/components/apps/new-app-card.tsx +++ b/web/app/components/apps/new-app-card.tsx @@ -1,9 +1,5 @@ 'use client' -import { - useRouter, - useSearchParams, -} from 'next/navigation' import * as React from 'react' import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -13,6 +9,10 @@ import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons import AppListContext from '@/context/app-list-context' import { useProviderContext } from '@/context/provider-context' import dynamic from '@/next/dynamic' +import { + useRouter, + useSearchParams, +} from '@/next/navigation' import { cn } from '@/utils/classnames' const CreateAppModal = dynamic(() => import('@/app/components/app/create-app-modal'), { diff --git a/web/app/components/base/audio-btn/__tests__/index.spec.tsx b/web/app/components/base/audio-btn/__tests__/index.spec.tsx index c8d8ee851b..8f6c26d12b 100644 --- a/web/app/components/base/audio-btn/__tests__/index.spec.tsx +++ b/web/app/components/base/audio-btn/__tests__/index.spec.tsx @@ -1,14 +1,14 @@ import { act, render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import i18next from 'i18next' -import { useParams, usePathname } from 'next/navigation' +import { useParams, usePathname } from '@/next/navigation' import AudioBtn from '../index' const mockPlayAudio = vi.fn() const mockPauseAudio = vi.fn() const mockGetAudioPlayer = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: vi.fn(), usePathname: vi.fn(), })) diff --git a/web/app/components/base/audio-btn/index.tsx b/web/app/components/base/audio-btn/index.tsx index 8bea3193c8..47fefe19e5 100644 --- a/web/app/components/base/audio-btn/index.tsx +++ b/web/app/components/base/audio-btn/index.tsx @@ -1,10 +1,10 @@ 'use client' import { t } from 'i18next' -import { useParams, usePathname } from 'next/navigation' import { useState } from 'react' import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager' import Loading from '@/app/components/base/loading' import Tooltip from '@/app/components/base/tooltip' +import { useParams, usePathname } from '@/next/navigation' import s from './style.module.css' type AudioBtnProps = { diff --git a/web/app/components/base/chat/chat-with-history/__tests__/chat-wrapper.spec.tsx b/web/app/components/base/chat/chat-with-history/__tests__/chat-wrapper.spec.tsx index 60a5da5d49..bd5f01bcda 100644 --- a/web/app/components/base/chat/chat-with-history/__tests__/chat-wrapper.spec.tsx +++ b/web/app/components/base/chat/chat-with-history/__tests__/chat-wrapper.spec.tsx @@ -25,7 +25,7 @@ vi.mock('../context', () => ({ useChatWithHistoryContext: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: vi.fn(() => ({ push: vi.fn(), replace: vi.fn(), diff --git a/web/app/components/base/chat/chat-with-history/__tests__/header-in-mobile.spec.tsx b/web/app/components/base/chat/chat-with-history/__tests__/header-in-mobile.spec.tsx index 84bf9134d6..d75f9897a7 100644 --- a/web/app/components/base/chat/chat-with-history/__tests__/header-in-mobile.spec.tsx +++ b/web/app/components/base/chat/chat-with-history/__tests__/header-in-mobile.spec.tsx @@ -22,7 +22,7 @@ vi.mock('../context', () => ({ ChatWithHistoryContext: { Provider: ({ children }: { children: React.ReactNode }) =>
{children}
}, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: vi.fn(() => ({ push: vi.fn(), replace: vi.fn(), diff --git a/web/app/components/base/chat/chat-with-history/__tests__/index.spec.tsx b/web/app/components/base/chat/chat-with-history/__tests__/index.spec.tsx index 167cc7b385..e306569140 100644 --- a/web/app/components/base/chat/chat-with-history/__tests__/index.spec.tsx +++ b/web/app/components/base/chat/chat-with-history/__tests__/index.spec.tsx @@ -26,7 +26,7 @@ vi.mock('@/hooks/use-document-title', () => ({ default: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: vi.fn(() => ({ push: vi.fn(), replace: vi.fn(), diff --git a/web/app/components/base/chat/chat-with-history/sidebar/__tests__/index.spec.tsx b/web/app/components/base/chat/chat-with-history/sidebar/__tests__/index.spec.tsx index 896161f66c..bb62869f21 100644 --- a/web/app/components/base/chat/chat-with-history/sidebar/__tests__/index.spec.tsx +++ b/web/app/components/base/chat/chat-with-history/sidebar/__tests__/index.spec.tsx @@ -87,7 +87,7 @@ vi.mock('@/context/global-public-context', () => ({ })) // Mock next/navigation -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), usePathname: () => '/test', })) diff --git a/web/app/components/base/chat/chat/__tests__/hooks.spec.tsx b/web/app/components/base/chat/chat/__tests__/hooks.spec.tsx index da989d8b7c..f5b261d5f3 100644 --- a/web/app/components/base/chat/chat/__tests__/hooks.spec.tsx +++ b/web/app/components/base/chat/chat/__tests__/hooks.spec.tsx @@ -1,8 +1,8 @@ import type { ChatConfig, ChatItemInTree } from '../../types' import type { FileEntity } from '@/app/components/base/file-uploader/types' import { act, renderHook } from '@testing-library/react' -import { useParams, usePathname } from 'next/navigation' import { WorkflowRunningStatus } from '@/app/components/workflow/types' +import { useParams, usePathname } from '@/next/navigation' import { sseGet, ssePost } from '@/service/base' import { useChat } from '../hooks' @@ -28,7 +28,7 @@ vi.mock('@/hooks/use-timestamp', () => ({ default: () => ({ formatTime: vi.fn().mockReturnValue('10:00 AM') }), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: vi.fn(() => ({})), usePathname: vi.fn(() => ''), useRouter: vi.fn(() => ({})), diff --git a/web/app/components/base/chat/chat/answer/__tests__/operation.spec.tsx b/web/app/components/base/chat/chat/answer/__tests__/operation.spec.tsx index baff417669..836397a586 100644 --- a/web/app/components/base/chat/chat/answer/__tests__/operation.spec.tsx +++ b/web/app/components/base/chat/chat/answer/__tests__/operation.spec.tsx @@ -111,7 +111,7 @@ vi.mock('@/app/components/base/chat/chat/log', () => ({ default: () => , })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: vi.fn(() => ({ appId: 'test-app' })), usePathname: vi.fn(() => '/apps/test-app'), })) diff --git a/web/app/components/base/chat/chat/chat-input-area/__tests__/index.spec.tsx b/web/app/components/base/chat/chat/chat-input-area/__tests__/index.spec.tsx index cb1d0f2a55..f628b7de82 100644 --- a/web/app/components/base/chat/chat/chat-input-area/__tests__/index.spec.tsx +++ b/web/app/components/base/chat/chat/chat-input-area/__tests__/index.spec.tsx @@ -208,7 +208,7 @@ vi.mock('../../check-input-forms-hooks', () => ({ // --------------------------------------------------------------------------- // Next.js navigation // --------------------------------------------------------------------------- -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ token: 'test-token' }), useRouter: () => ({ push: vi.fn() }), usePathname: () => '/test', diff --git a/web/app/components/base/chat/chat/hooks.ts b/web/app/components/base/chat/chat/hooks.ts index 307fd52443..9c06f49b3d 100644 --- a/web/app/components/base/chat/chat/hooks.ts +++ b/web/app/components/base/chat/chat/hooks.ts @@ -15,7 +15,6 @@ import type { import { uniqBy } from 'es-toolkit/compat' import { noop } from 'es-toolkit/function' import { produce, setAutoFreeze } from 'immer' -import { useParams, usePathname } from 'next/navigation' import { useCallback, useEffect, @@ -33,6 +32,7 @@ import { import { useToastContext } from '@/app/components/base/toast/context' import { NodeRunningStatus, WorkflowRunningStatus } from '@/app/components/workflow/types' import useTimestamp from '@/hooks/use-timestamp' +import { useParams, usePathname } from '@/next/navigation' import { sseGet, ssePost, diff --git a/web/app/components/base/chat/embedded-chatbot/inputs-form/__tests__/content.spec.tsx b/web/app/components/base/chat/embedded-chatbot/inputs-form/__tests__/content.spec.tsx index aad2d3d09b..689a9e0439 100644 --- a/web/app/components/base/chat/embedded-chatbot/inputs-form/__tests__/content.spec.tsx +++ b/web/app/components/base/chat/embedded-chatbot/inputs-form/__tests__/content.spec.tsx @@ -9,7 +9,7 @@ vi.mock('../../context', () => ({ useEmbeddedChatbotContext: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ token: 'test-token' }), useRouter: () => ({ push: vi.fn() }), usePathname: () => '/', diff --git a/web/app/components/base/features/new-feature-panel/__tests__/index.spec.tsx b/web/app/components/base/features/new-feature-panel/__tests__/index.spec.tsx index 20632c4954..77f9a0253b 100644 --- a/web/app/components/base/features/new-feature-panel/__tests__/index.spec.tsx +++ b/web/app/components/base/features/new-feature-panel/__tests__/index.spec.tsx @@ -3,7 +3,7 @@ import { render, screen } from '@testing-library/react' import { FeaturesProvider } from '../../context' import NewFeaturePanel from '../index' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), usePathname: () => '/app/test-app-id/configuration', })) diff --git a/web/app/components/base/features/new-feature-panel/annotation-reply/__tests__/index.spec.tsx b/web/app/components/base/features/new-feature-panel/annotation-reply/__tests__/index.spec.tsx index f2ddc5482d..03ddbc6322 100644 --- a/web/app/components/base/features/new-feature-panel/annotation-reply/__tests__/index.spec.tsx +++ b/web/app/components/base/features/new-feature-panel/annotation-reply/__tests__/index.spec.tsx @@ -7,7 +7,7 @@ import AnnotationReply from '../index' const originalConsoleError = console.error const mockPush = vi.fn() let mockPathname = '/app/test-app-id/configuration' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush }), usePathname: () => mockPathname, })) diff --git a/web/app/components/base/features/new-feature-panel/annotation-reply/index.tsx b/web/app/components/base/features/new-feature-panel/annotation-reply/index.tsx index df8982407c..1ad4ef613e 100644 --- a/web/app/components/base/features/new-feature-panel/annotation-reply/index.tsx +++ b/web/app/components/base/features/new-feature-panel/annotation-reply/index.tsx @@ -2,7 +2,6 @@ import type { OnFeaturesChange } from '@/app/components/base/features/types' import type { AnnotationReplyConfig } from '@/models/debug' import { RiEqualizer2Line, RiExternalLinkLine } from '@remixicon/react' import { produce } from 'immer' -import { usePathname, useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -14,6 +13,7 @@ import FeatureCard from '@/app/components/base/features/new-feature-panel/featur import { MessageFast } from '@/app/components/base/icons/src/vender/features' import AnnotationFullModal from '@/app/components/billing/annotation-full/modal' import { ANNOTATION_DEFAULT } from '@/config' +import { usePathname, useRouter } from '@/next/navigation' type Props = { disabled?: boolean diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/param-config-content.spec.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/param-config-content.spec.tsx index 66d870f28f..535d40e00a 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/param-config-content.spec.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/param-config-content.spec.tsx @@ -22,7 +22,7 @@ const mockUseAppVoices = vi.fn((_appId: string, _language?: string) => ({ data: mockVoiceItems, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: () => mockPathname, useParams: () => ({}), })) diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/voice-settings.spec.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/voice-settings.spec.tsx index 658d5f500b..f77802c133 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/voice-settings.spec.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/voice-settings.spec.tsx @@ -35,7 +35,7 @@ vi.mock('@/app/components/base/portal-to-follow-elem', () => ({ PortalToFollowElemContent: ({ children }: { children: React.ReactNode }) =>
{children}
, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: () => '/app/test-app-id/configuration', useParams: () => ({ appId: 'test-app-id' }), })) diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx index 11db9346ff..d4e008c4e6 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx @@ -3,7 +3,6 @@ import type { OnFeaturesChange } from '@/app/components/base/features/types' import type { Item } from '@/app/components/base/select' import { Listbox, ListboxButton, ListboxOption, ListboxOptions, Transition } from '@headlessui/react' import { produce } from 'immer' -import { usePathname } from 'next/navigation' import * as React from 'react' import { Fragment } from 'react' import { useTranslation } from 'react-i18next' @@ -13,6 +12,7 @@ import { useFeatures, useFeaturesStore } from '@/app/components/base/features/ho import Switch from '@/app/components/base/switch' import Tooltip from '@/app/components/base/tooltip' import { languages } from '@/i18n-config/language' +import { usePathname } from '@/next/navigation' import { useAppVoices } from '@/service/use-apps' import { TtsAutoPlay } from '@/types/app' import { cn } from '@/utils/classnames' diff --git a/web/app/components/base/file-uploader/__tests__/dynamic-pdf-preview.spec.tsx b/web/app/components/base/file-uploader/__tests__/dynamic-pdf-preview.spec.tsx index cdae4a2e4f..868f153dbc 100644 --- a/web/app/components/base/file-uploader/__tests__/dynamic-pdf-preview.spec.tsx +++ b/web/app/components/base/file-uploader/__tests__/dynamic-pdf-preview.spec.tsx @@ -40,7 +40,7 @@ const mockPdfPreview = vi.hoisted(() => vi.fn(() => null), ) -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: mockDynamic, })) diff --git a/web/app/components/base/file-uploader/__tests__/hooks.spec.ts b/web/app/components/base/file-uploader/__tests__/hooks.spec.ts index 8343974967..824a3b7a03 100644 --- a/web/app/components/base/file-uploader/__tests__/hooks.spec.ts +++ b/web/app/components/base/file-uploader/__tests__/hooks.spec.ts @@ -6,7 +6,7 @@ import { useFile, useFileSizeLimit } from '../hooks' const mockNotify = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ token: undefined }), })) diff --git a/web/app/components/base/file-uploader/hooks.ts b/web/app/components/base/file-uploader/hooks.ts index 4aab60175c..27345b22ff 100644 --- a/web/app/components/base/file-uploader/hooks.ts +++ b/web/app/components/base/file-uploader/hooks.ts @@ -4,7 +4,6 @@ import type { FileUpload } from '@/app/components/base/features/types' import type { FileUploadConfigResponse } from '@/models/common' import { noop } from 'es-toolkit/function' import { produce } from 'immer' -import { useParams } from 'next/navigation' import { useCallback, useState, @@ -20,6 +19,7 @@ import { } from '@/app/components/base/file-uploader/constants' import { useToastContext } from '@/app/components/base/toast/context' import { SupportUploadFileTypes } from '@/app/components/workflow/types' +import { useParams } from '@/next/navigation' import { uploadRemoteFileInfo } from '@/service/common' import { TransferMethod } from '@/types/app' import { formatFileSize } from '@/utils/format' diff --git a/web/app/components/base/form/components/field/__tests__/file-uploader.spec.tsx b/web/app/components/base/form/components/field/__tests__/file-uploader.spec.tsx index dee7c97222..bff8e9cbf9 100644 --- a/web/app/components/base/form/components/field/__tests__/file-uploader.spec.tsx +++ b/web/app/components/base/form/components/field/__tests__/file-uploader.spec.tsx @@ -27,7 +27,7 @@ vi.mock('../../..', () => ({ useFieldContext: () => mockField, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ token: 'test-token' }), })) diff --git a/web/app/components/base/form/form-scenarios/base/__tests__/field.spec.tsx b/web/app/components/base/form/form-scenarios/base/__tests__/field.spec.tsx index 1d7734f670..81190dc277 100644 --- a/web/app/components/base/form/form-scenarios/base/__tests__/field.spec.tsx +++ b/web/app/components/base/form/form-scenarios/base/__tests__/field.spec.tsx @@ -6,7 +6,7 @@ import { useAppForm } from '../../..' import BaseField from '../field' import { BaseFieldType } from '../types' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({}), })) diff --git a/web/app/components/base/ga/__tests__/index.spec.tsx b/web/app/components/base/ga/__tests__/index.spec.tsx index ee7f7a2a9d..619c4514dc 100644 --- a/web/app/components/base/ga/__tests__/index.spec.tsx +++ b/web/app/components/base/ga/__tests__/index.spec.tsx @@ -31,11 +31,11 @@ vi.mock('@/config', () => ({ }, })) -vi.mock('next/headers', () => ({ +vi.mock('@/next/headers', () => ({ headers: mockHeaders, })) -vi.mock('next/script', () => ({ +vi.mock('@/next/script', () => ({ default: ({ id, strategy, diff --git a/web/app/components/base/image-uploader/__tests__/hooks.spec.ts b/web/app/components/base/image-uploader/__tests__/hooks.spec.ts index f79ea98081..e4295dfb09 100644 --- a/web/app/components/base/image-uploader/__tests__/hooks.spec.ts +++ b/web/app/components/base/image-uploader/__tests__/hooks.spec.ts @@ -9,7 +9,7 @@ vi.mock('@/app/components/base/toast/context', () => ({ useToastContext: () => ({ notify: mockNotify }), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ token: undefined }), })) diff --git a/web/app/components/base/image-uploader/hooks.ts b/web/app/components/base/image-uploader/hooks.ts index 03cf0feeca..9251d3888f 100644 --- a/web/app/components/base/image-uploader/hooks.ts +++ b/web/app/components/base/image-uploader/hooks.ts @@ -1,9 +1,9 @@ import type { ClipboardEvent } from 'react' import type { ImageFile, VisionSettings } from '@/types/app' -import { useParams } from 'next/navigation' import { useCallback, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useToastContext } from '@/app/components/base/toast/context' +import { useParams } from '@/next/navigation' import { ALLOW_FILE_EXTENSIONS, TransferMethod } from '@/types/app' import { getImageUploadErrorMessage, imageUpload } from './utils' diff --git a/web/app/components/base/markdown/__tests__/index.spec.tsx b/web/app/components/base/markdown/__tests__/index.spec.tsx index 5d0261b074..08c4527003 100644 --- a/web/app/components/base/markdown/__tests__/index.spec.tsx +++ b/web/app/components/base/markdown/__tests__/index.spec.tsx @@ -7,7 +7,7 @@ const { mockReactMarkdownWrapper } = vi.hoisted(() => ({ mockReactMarkdownWrapper: vi.fn(), })) -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: () => { const MockStreamdownWrapper = (props: { latexContent: string }) => { mockReactMarkdownWrapper(props) diff --git a/web/app/components/base/new-audio-button/__tests__/index.spec.tsx b/web/app/components/base/new-audio-button/__tests__/index.spec.tsx index 64dd590012..23696fca74 100644 --- a/web/app/components/base/new-audio-button/__tests__/index.spec.tsx +++ b/web/app/components/base/new-audio-button/__tests__/index.spec.tsx @@ -1,15 +1,15 @@ import { act, render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import i18next from 'i18next' -import { useParams, usePathname } from 'next/navigation' import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' +import { useParams, usePathname } from '@/next/navigation' import AudioBtn from '../index' const mockPlayAudio = vi.fn() const mockPauseAudio = vi.fn() const mockGetAudioPlayer = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: vi.fn(), usePathname: vi.fn(), })) diff --git a/web/app/components/base/new-audio-button/index.tsx b/web/app/components/base/new-audio-button/index.tsx index 7e1e1ccc78..c6569ff958 100644 --- a/web/app/components/base/new-audio-button/index.tsx +++ b/web/app/components/base/new-audio-button/index.tsx @@ -3,11 +3,11 @@ import { RiVolumeUpLine, } from '@remixicon/react' import { t } from 'i18next' -import { useParams, usePathname } from 'next/navigation' import { useState } from 'react' import ActionButton, { ActionButtonState } from '@/app/components/base/action-button' import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager' import Tooltip from '@/app/components/base/tooltip' +import { useParams, usePathname } from '@/next/navigation' type AudioBtnProps = { id?: string diff --git a/web/app/components/base/voice-input/__tests__/index.spec.tsx b/web/app/components/base/voice-input/__tests__/index.spec.tsx index ac9c367e6a..e252c42f84 100644 --- a/web/app/components/base/voice-input/__tests__/index.spec.tsx +++ b/web/app/components/base/voice-input/__tests__/index.spec.tsx @@ -47,7 +47,7 @@ vi.mock('@/service/share', () => ({ audioToText: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: vi.fn(() => mockState.params), usePathname: vi.fn(() => mockState.pathname), })) diff --git a/web/app/components/base/voice-input/index.tsx b/web/app/components/base/voice-input/index.tsx index 8e26bbc895..9ae390a3ca 100644 --- a/web/app/components/base/voice-input/index.tsx +++ b/web/app/components/base/voice-input/index.tsx @@ -1,8 +1,8 @@ import { useRafInterval } from 'ahooks' import Recorder from 'js-audio-recorder' -import { useParams, usePathname } from 'next/navigation' import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' +import { useParams, usePathname } from '@/next/navigation' import { AppSourceType, audioToText } from '@/service/share' import { cn } from '@/utils/classnames' import s from './index.module.css' diff --git a/web/app/components/base/zendesk/__tests__/index.spec.tsx b/web/app/components/base/zendesk/__tests__/index.spec.tsx index 4ab84a0088..e928b1437b 100644 --- a/web/app/components/base/zendesk/__tests__/index.spec.tsx +++ b/web/app/components/base/zendesk/__tests__/index.spec.tsx @@ -26,7 +26,7 @@ vi.mock('@/config', () => ({ })) // Mock next/headers -vi.mock('next/headers', () => ({ +vi.mock('@/next/headers', () => ({ headers: vi.fn(() => ({ get: vi.fn((name: string) => { if (name === 'x-nonce') @@ -44,7 +44,7 @@ type ScriptProps = { 'nonce'?: string 'data-testid'?: string } -vi.mock('next/script', () => ({ +vi.mock('@/next/script', () => ({ __esModule: true, default: vi.fn(({ children, id, src, nonce, 'data-testid': testId }: ScriptProps) => (
diff --git a/web/app/components/billing/partner-stack/__tests__/use-ps-info.spec.tsx b/web/app/components/billing/partner-stack/__tests__/use-ps-info.spec.tsx index ec79d18d29..2ea5db840f 100644 --- a/web/app/components/billing/partner-stack/__tests__/use-ps-info.spec.tsx +++ b/web/app/components/billing/partner-stack/__tests__/use-ps-info.spec.tsx @@ -48,7 +48,7 @@ vi.mock('js-cookie', () => { remove, } }) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSearchParams: () => ({ get: (key: string) => searchParamsValues[key] ?? null, }), diff --git a/web/app/components/billing/partner-stack/use-ps-info.ts b/web/app/components/billing/partner-stack/use-ps-info.ts index 51d693f358..7c45d7ef87 100644 --- a/web/app/components/billing/partner-stack/use-ps-info.ts +++ b/web/app/components/billing/partner-stack/use-ps-info.ts @@ -1,8 +1,8 @@ import { useBoolean } from 'ahooks' import Cookies from 'js-cookie' -import { useSearchParams } from 'next/navigation' import { useCallback } from 'react' import { PARTNER_STACK_CONFIG } from '@/config' +import { useSearchParams } from '@/next/navigation' import { useBindPartnerStackInfo } from '@/service/use-billing' const usePSInfo = () => { diff --git a/web/app/components/billing/plan/__tests__/index.spec.tsx b/web/app/components/billing/plan/__tests__/index.spec.tsx index 79597b4b22..bed7ebd9fb 100644 --- a/web/app/components/billing/plan/__tests__/index.spec.tsx +++ b/web/app/components/billing/plan/__tests__/index.spec.tsx @@ -7,7 +7,7 @@ let currentPath = '/billing' const push = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push }), usePathname: () => currentPath, })) diff --git a/web/app/components/billing/plan/index.tsx b/web/app/components/billing/plan/index.tsx index 2f953c3a8e..b420110a4d 100644 --- a/web/app/components/billing/plan/index.tsx +++ b/web/app/components/billing/plan/index.tsx @@ -7,7 +7,6 @@ import { RiGroupLine, } from '@remixicon/react' import { useUnmountedRef } from 'ahooks' -import { usePathname, useRouter } from 'next/navigation' import * as React from 'react' import { useEffect } from 'react' import { useTranslation } from 'react-i18next' @@ -19,6 +18,7 @@ import VerifyStateModal from '@/app/education-apply/verify-state-modal' import { useAppContext } from '@/context/app-context' import { useModalContextSelector } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' +import { usePathname, useRouter } from '@/next/navigation' import { useEducationVerify } from '@/service/use-education' import { getDaysUntilEndOfMonth } from '@/utils/time' import { Loading } from '../../base/icons/src/public/thought' diff --git a/web/app/components/datasets/create-from-pipeline/__tests__/footer.spec.tsx b/web/app/components/datasets/create-from-pipeline/__tests__/footer.spec.tsx index 19f1f74e1d..7f1bc0e00c 100644 --- a/web/app/components/datasets/create-from-pipeline/__tests__/footer.spec.tsx +++ b/web/app/components/datasets/create-from-pipeline/__tests__/footer.spec.tsx @@ -7,7 +7,7 @@ import Footer from '../footer' let mockSearchParams = new URLSearchParams() const mockReplace = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace }), useSearchParams: () => mockSearchParams, })) diff --git a/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/__tests__/index.spec.tsx b/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/__tests__/index.spec.tsx index 820332dcc3..7f292c8ff9 100644 --- a/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/__tests__/index.spec.tsx +++ b/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/__tests__/index.spec.tsx @@ -8,7 +8,7 @@ import TabItem from '../tab/item' import Uploader from '../uploader' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/hooks/__tests__/use-dsl-import.spec.tsx b/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/hooks/__tests__/use-dsl-import.spec.tsx index ac56206003..f97b14af0f 100644 --- a/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/hooks/__tests__/use-dsl-import.spec.tsx +++ b/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/hooks/__tests__/use-dsl-import.spec.tsx @@ -5,7 +5,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { CreateFromDSLModalTab, useDSLImport } from '../use-dsl-import' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/hooks/use-dsl-import.ts b/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/hooks/use-dsl-import.ts index c839fad3a2..ff7aa1cafb 100644 --- a/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/hooks/use-dsl-import.ts +++ b/web/app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/hooks/use-dsl-import.ts @@ -1,6 +1,5 @@ 'use client' import { useDebounceFn } from 'ahooks' -import { useRouter } from 'next/navigation' import { useCallback, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' @@ -10,6 +9,7 @@ import { DSLImportMode, DSLImportStatus, } from '@/models/app' +import { useRouter } from '@/next/navigation' import { useImportPipelineDSL, useImportPipelineDSLConfirm } from '@/service/use-pipeline' export enum CreateFromDSLModalTab { diff --git a/web/app/components/datasets/create-from-pipeline/footer.tsx b/web/app/components/datasets/create-from-pipeline/footer.tsx index 23e83d1da3..ae1bb48394 100644 --- a/web/app/components/datasets/create-from-pipeline/footer.tsx +++ b/web/app/components/datasets/create-from-pipeline/footer.tsx @@ -1,8 +1,8 @@ import { RiFileUploadLine } from '@remixicon/react' -import { useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' +import { useRouter, useSearchParams } from '@/next/navigation' import { useInvalidDatasetList } from '@/service/knowledge/use-dataset' import Divider from '../../base/divider' import CreateFromDSLModal, { CreateFromDSLModalTab } from './create-options/create-from-dsl-modal' diff --git a/web/app/components/datasets/create-from-pipeline/list/__tests__/create-card.spec.tsx b/web/app/components/datasets/create-from-pipeline/list/__tests__/create-card.spec.tsx index 96bc82f010..c4702df9c7 100644 --- a/web/app/components/datasets/create-from-pipeline/list/__tests__/create-card.spec.tsx +++ b/web/app/components/datasets/create-from-pipeline/list/__tests__/create-card.spec.tsx @@ -4,7 +4,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import CreateCard from '../create-card' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/components/datasets/create-from-pipeline/list/create-card.tsx b/web/app/components/datasets/create-from-pipeline/list/create-card.tsx index b32a7dba2d..f6a20c50e0 100644 --- a/web/app/components/datasets/create-from-pipeline/list/create-card.tsx +++ b/web/app/components/datasets/create-from-pipeline/list/create-card.tsx @@ -1,10 +1,10 @@ import { RiAddCircleLine } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { trackEvent } from '@/app/components/base/amplitude' import Toast from '@/app/components/base/toast' +import { useRouter } from '@/next/navigation' import { useCreatePipelineDataset } from '@/service/knowledge/use-create-dataset' import { useInvalidDatasetList } from '@/service/knowledge/use-dataset' diff --git a/web/app/components/datasets/create-from-pipeline/list/template-card/__tests__/index.spec.tsx b/web/app/components/datasets/create-from-pipeline/list/template-card/__tests__/index.spec.tsx index 4455672383..3dcff12e9d 100644 --- a/web/app/components/datasets/create-from-pipeline/list/template-card/__tests__/index.spec.tsx +++ b/web/app/components/datasets/create-from-pipeline/list/template-card/__tests__/index.spec.tsx @@ -6,7 +6,7 @@ import { ChunkingMode } from '@/models/datasets' import TemplateCard from '../index' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/components/datasets/create-from-pipeline/list/template-card/index.tsx b/web/app/components/datasets/create-from-pipeline/list/template-card/index.tsx index b3395a83d5..7684e924b6 100644 --- a/web/app/components/datasets/create-from-pipeline/list/template-card/index.tsx +++ b/web/app/components/datasets/create-from-pipeline/list/template-card/index.tsx @@ -1,5 +1,4 @@ import type { PipelineTemplate } from '@/models/pipeline' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -8,6 +7,7 @@ import Confirm from '@/app/components/base/confirm' import Modal from '@/app/components/base/modal' import Toast from '@/app/components/base/toast' import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks' +import { useRouter } from '@/next/navigation' import { useCreatePipelineDatasetFromCustomized } from '@/service/knowledge/use-create-dataset' import { useInvalidDatasetList } from '@/service/knowledge/use-dataset' import { diff --git a/web/app/components/datasets/create/embedding-process/__tests__/index.spec.tsx b/web/app/components/datasets/create/embedding-process/__tests__/index.spec.tsx index 686139250a..d1787fc47a 100644 --- a/web/app/components/datasets/create/embedding-process/__tests__/index.spec.tsx +++ b/web/app/components/datasets/create/embedding-process/__tests__/index.spec.tsx @@ -16,7 +16,7 @@ import { const mockPush = vi.fn() const mockRouter = { push: mockPush } -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => mockRouter, })) diff --git a/web/app/components/datasets/create/embedding-process/index.tsx b/web/app/components/datasets/create/embedding-process/index.tsx index 89c57b612d..812eb2e51c 100644 --- a/web/app/components/datasets/create/embedding-process/index.tsx +++ b/web/app/components/datasets/create/embedding-process/index.tsx @@ -6,7 +6,6 @@ import { RiLoader2Fill, RiTerminalBoxLine, } from '@remixicon/react' -import { useRouter } from 'next/navigation' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -15,6 +14,7 @@ import { Plan } from '@/app/components/billing/type' import { useProviderContext } from '@/context/provider-context' import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' import Link from '@/next/link' +import { useRouter } from '@/next/navigation' import { useProcessRule } from '@/service/knowledge/use-dataset' import { useInvalidDocumentList } from '@/service/knowledge/use-document' import IndexingProgressItem from './indexing-progress-item' diff --git a/web/app/components/datasets/create/empty-dataset-creation-modal/__tests__/index.spec.tsx b/web/app/components/datasets/create/empty-dataset-creation-modal/__tests__/index.spec.tsx index f5379bc543..2df124d7b6 100644 --- a/web/app/components/datasets/create/empty-dataset-creation-modal/__tests__/index.spec.tsx +++ b/web/app/components/datasets/create/empty-dataset-creation-modal/__tests__/index.spec.tsx @@ -7,7 +7,7 @@ import EmptyDatasetCreationModal from '../index' // Mock Next.js router const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/datasets/create/empty-dataset-creation-modal/index.tsx b/web/app/components/datasets/create/empty-dataset-creation-modal/index.tsx index 0a4064de2a..b417c15e8f 100644 --- a/web/app/components/datasets/create/empty-dataset-creation-modal/index.tsx +++ b/web/app/components/datasets/create/empty-dataset-creation-modal/index.tsx @@ -1,5 +1,4 @@ 'use client' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' @@ -9,6 +8,7 @@ import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import Modal from '@/app/components/base/modal' import { ToastContext } from '@/app/components/base/toast/context' +import { useRouter } from '@/next/navigation' import { createEmptyDataset } from '@/service/datasets' import { useInvalidDatasetList } from '@/service/knowledge/use-dataset' diff --git a/web/app/components/datasets/create/file-uploader/__tests__/index.spec.tsx b/web/app/components/datasets/create/file-uploader/__tests__/index.spec.tsx index da337efce2..c0635bebd1 100644 --- a/web/app/components/datasets/create/file-uploader/__tests__/index.spec.tsx +++ b/web/app/components/datasets/create/file-uploader/__tests__/index.spec.tsx @@ -58,7 +58,7 @@ vi.mock('@/app/components/datasets/common/document-file-icon', () => ({ })) // Mock SimplePieChart -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: () => { const Component = ({ percentage }: { percentage: number }) => (
diff --git a/web/app/components/datasets/create/file-uploader/components/__tests__/file-list-item.spec.tsx b/web/app/components/datasets/create/file-uploader/components/__tests__/file-list-item.spec.tsx index dd88af4395..e7a25cbdd8 100644 --- a/web/app/components/datasets/create/file-uploader/components/__tests__/file-list-item.spec.tsx +++ b/web/app/components/datasets/create/file-uploader/components/__tests__/file-list-item.spec.tsx @@ -17,7 +17,7 @@ vi.mock('@/types/app', () => ({ })) // Mock SimplePieChart with dynamic import handling -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: () => { const DynamicComponent = ({ percentage, stroke, fill }: { percentage: number, stroke: string, fill: string }) => (
diff --git a/web/app/components/datasets/documents/__tests__/index.spec.tsx b/web/app/components/datasets/documents/__tests__/index.spec.tsx index f464c97395..2dd91dd7f3 100644 --- a/web/app/components/datasets/documents/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/__tests__/index.spec.tsx @@ -13,7 +13,7 @@ type MockState = Parameters[0] // Mock Next.js router const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, replace: vi.fn(), diff --git a/web/app/components/datasets/documents/components/__tests__/operations.spec.tsx b/web/app/components/datasets/documents/components/__tests__/operations.spec.tsx index 5422c23b9a..ce73368e1a 100644 --- a/web/app/components/datasets/documents/components/__tests__/operations.spec.tsx +++ b/web/app/components/datasets/documents/components/__tests__/operations.spec.tsx @@ -4,7 +4,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import Operations from '../operations' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/datasets/documents/components/document-list/__tests__/index.spec.tsx b/web/app/components/datasets/documents/components/document-list/__tests__/index.spec.tsx index 279c85f2f0..48e6b58766 100644 --- a/web/app/components/datasets/documents/components/document-list/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/components/document-list/__tests__/index.spec.tsx @@ -9,7 +9,7 @@ import DocumentList from '../../list' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/datasets/documents/components/document-list/components/__tests__/document-table-row.spec.tsx b/web/app/components/datasets/documents/components/document-list/components/__tests__/document-table-row.spec.tsx index 1c5145f7ed..d5e4f480be 100644 --- a/web/app/components/datasets/documents/components/document-list/components/__tests__/document-table-row.spec.tsx +++ b/web/app/components/datasets/documents/components/document-list/components/__tests__/document-table-row.spec.tsx @@ -9,7 +9,7 @@ import DocumentTableRow from '../document-table-row' const mockPush = vi.fn() let mockSearchParams = '' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/datasets/documents/components/document-list/components/document-table-row.tsx b/web/app/components/datasets/documents/components/document-list/components/document-table-row.tsx index 3694b81138..c5f0f0af37 100644 --- a/web/app/components/datasets/documents/components/document-list/components/document-table-row.tsx +++ b/web/app/components/datasets/documents/components/document-list/components/document-table-row.tsx @@ -1,7 +1,6 @@ import type { FC } from 'react' import type { SimpleDocumentDetail } from '@/models/datasets' import { pick } from 'es-toolkit/object' -import { useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' @@ -13,6 +12,7 @@ import SummaryStatus from '@/app/components/datasets/documents/detail/completed/ import StatusItem from '@/app/components/datasets/documents/status-item' import useTimestamp from '@/hooks/use-timestamp' import { DataSourceType } from '@/models/datasets' +import { useRouter, useSearchParams } from '@/next/navigation' import { formatNumber } from '@/utils/format' import DocumentSourceIcon from './document-source-icon' import { renderTdValue } from './utils' diff --git a/web/app/components/datasets/documents/components/operations.tsx b/web/app/components/datasets/documents/components/operations.tsx index 84e16c7c48..ff3563c3fe 100644 --- a/web/app/components/datasets/documents/components/operations.tsx +++ b/web/app/components/datasets/documents/components/operations.tsx @@ -14,7 +14,6 @@ import { } from '@remixicon/react' import { useBoolean, useDebounceFn } from 'ahooks' import { noop } from 'es-toolkit/function' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -28,6 +27,7 @@ import { ToastContext } from '@/app/components/base/toast/context' import Tooltip from '@/app/components/base/tooltip' import { IS_CE_EDITION } from '@/config' import { DataSourceType, DocumentActionType } from '@/models/datasets' +import { useRouter } from '@/next/navigation' import { useDocumentArchive, useDocumentDelete, diff --git a/web/app/components/datasets/documents/create-from-pipeline/__tests__/index.spec.tsx b/web/app/components/datasets/documents/create-from-pipeline/__tests__/index.spec.tsx index 476ac1294b..8a2e251770 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/__tests__/index.spec.tsx @@ -90,7 +90,7 @@ vi.mock('@/app/components/base/amplitude', () => ({ trackEvent: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'test-dataset-id' }), useRouter: () => ({ push: vi.fn(), diff --git a/web/app/components/datasets/documents/create-from-pipeline/__tests__/left-header.spec.tsx b/web/app/components/datasets/documents/create-from-pipeline/__tests__/left-header.spec.tsx index c75a36a5fc..c4ddec7434 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/__tests__/left-header.spec.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/__tests__/left-header.spec.tsx @@ -3,7 +3,7 @@ import { render, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' import LeftHeader from '../left-header' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'test-ds-id' }), })) diff --git a/web/app/components/datasets/documents/create-from-pipeline/actions/__tests__/index.spec.tsx b/web/app/components/datasets/documents/create-from-pipeline/actions/__tests__/index.spec.tsx index b3cedd71af..93861ef76a 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/actions/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/actions/__tests__/index.spec.tsx @@ -4,7 +4,7 @@ import Actions from '../index' // Mock next/navigation - useParams returns datasetId const mockDatasetId = 'test-dataset-id' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: mockDatasetId }), })) diff --git a/web/app/components/datasets/documents/create-from-pipeline/actions/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/actions/index.tsx index c53fadf826..dab76da832 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/actions/index.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/actions/index.tsx @@ -1,11 +1,11 @@ import { RiArrowRightLine } from '@remixicon/react' -import { useParams } from 'next/navigation' import * as React from 'react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Checkbox from '@/app/components/base/checkbox' import Link from '@/next/link' +import { useParams } from '@/next/navigation' type ActionsProps = { disabled?: boolean diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/__tests__/index.spec.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/__tests__/index.spec.tsx index 87010638b2..4ec21ab1fb 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/__tests__/index.spec.tsx @@ -26,7 +26,7 @@ vi.mock('@/app/components/datasets/common/document-file-icon', () => ({ })) // Mock SimplePieChart -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: () => { const Component = ({ percentage }: { percentage: number }) => (
diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/components/__tests__/file-list-item.spec.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/components/__tests__/file-list-item.spec.tsx index df7fe3540b..fcb0878978 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/components/__tests__/file-list-item.spec.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/components/__tests__/file-list-item.spec.tsx @@ -17,7 +17,7 @@ vi.mock('@/types/app', () => ({ })) // Mock SimplePieChart with dynamic import handling -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: () => { const DynamicComponent = ({ percentage, stroke, fill }: { percentage: number, stroke: string, fill: string }) => (
diff --git a/web/app/components/datasets/documents/create-from-pipeline/left-header.tsx b/web/app/components/datasets/documents/create-from-pipeline/left-header.tsx index 375886cbc4..d464041d13 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/left-header.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/left-header.tsx @@ -1,10 +1,10 @@ import type { Step } from './step-indicator' import { RiArrowLeftLine } from '@remixicon/react' -import { useParams } from 'next/navigation' import * as React from 'react' import Button from '@/app/components/base/button' import Effect from '@/app/components/base/effect' import Link from '@/next/link' +import { useParams } from '@/next/navigation' import StepIndicator from './step-indicator' type LeftHeaderProps = { diff --git a/web/app/components/datasets/documents/create-from-pipeline/processing/embedding-process/__tests__/index.spec.tsx b/web/app/components/datasets/documents/create-from-pipeline/processing/embedding-process/__tests__/index.spec.tsx index 1d0518e11e..f59f5c091b 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/processing/embedding-process/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/processing/embedding-process/__tests__/index.spec.tsx @@ -10,7 +10,7 @@ import { RETRIEVE_METHOD } from '@/types/app' import EmbeddingProcess from '../index' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/datasets/documents/create-from-pipeline/processing/embedding-process/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/processing/embedding-process/index.tsx index 49c85ae433..099c3018cd 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/processing/embedding-process/index.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/processing/embedding-process/index.tsx @@ -10,7 +10,6 @@ import { RiLoader2Fill, RiTerminalBoxLine, } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -26,6 +25,7 @@ import { useProviderContext } from '@/context/provider-context' import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' import { DatasourceType } from '@/models/pipeline' import Link from '@/next/link' +import { useRouter } from '@/next/navigation' import { useIndexingStatusBatch, useProcessRule } from '@/service/knowledge/use-dataset' import { useInvalidDocumentList } from '@/service/knowledge/use-document' import { cn } from '@/utils/classnames' diff --git a/web/app/components/datasets/documents/create-from-pipeline/steps/__tests__/step-one-content.spec.tsx b/web/app/components/datasets/documents/create-from-pipeline/steps/__tests__/step-one-content.spec.tsx index ff0c1b125c..2e121dbbd1 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/steps/__tests__/step-one-content.spec.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/steps/__tests__/step-one-content.spec.tsx @@ -143,7 +143,7 @@ vi.mock('@/service/base', () => ({ upload: vi.fn().mockResolvedValue({ id: 'uploaded-file-id' }), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'mock-dataset-id' }), useRouter: () => ({ push: vi.fn() }), usePathname: () => '/datasets/mock-dataset-id', diff --git a/web/app/components/datasets/documents/detail/__tests__/document-title.spec.tsx b/web/app/components/datasets/documents/detail/__tests__/document-title.spec.tsx index e7945fc409..3eb1017b8d 100644 --- a/web/app/components/datasets/documents/detail/__tests__/document-title.spec.tsx +++ b/web/app/components/datasets/documents/detail/__tests__/document-title.spec.tsx @@ -5,7 +5,7 @@ import { ChunkingMode } from '@/models/datasets' import { DocumentTitle } from '../document-title' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/datasets/documents/detail/__tests__/index.spec.tsx b/web/app/components/datasets/documents/detail/__tests__/index.spec.tsx index f01a64e34e..be4d2304bd 100644 --- a/web/app/components/datasets/documents/detail/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/detail/__tests__/index.spec.tsx @@ -25,7 +25,7 @@ const mocks = vi.hoisted(() => { }) // --- External mocks --- -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mocks.push }), useSearchParams: () => new URLSearchParams(mocks.state.searchParams), })) diff --git a/web/app/components/datasets/documents/detail/__tests__/new-segment.spec.tsx b/web/app/components/datasets/documents/detail/__tests__/new-segment.spec.tsx index 73082108a0..dd0cc3cd16 100644 --- a/web/app/components/datasets/documents/detail/__tests__/new-segment.spec.tsx +++ b/web/app/components/datasets/documents/detail/__tests__/new-segment.spec.tsx @@ -6,7 +6,7 @@ import { IndexingType } from '../../../create/step-two' import NewSegmentModal from '../new-segment' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'test-dataset-id', documentId: 'test-document-id', diff --git a/web/app/components/datasets/documents/detail/completed/__tests__/index.spec.tsx b/web/app/components/datasets/documents/detail/completed/__tests__/index.spec.tsx index 59ecbf5f25..2a68e6f627 100644 --- a/web/app/components/datasets/documents/detail/completed/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/detail/completed/__tests__/index.spec.tsx @@ -49,7 +49,7 @@ const { mockOnDelete: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: () => '/datasets/test-dataset-id/documents/test-document-id', })) diff --git a/web/app/components/datasets/documents/detail/completed/__tests__/new-child-segment.spec.tsx b/web/app/components/datasets/documents/detail/completed/__tests__/new-child-segment.spec.tsx index 1b26a15b65..48e8782740 100644 --- a/web/app/components/datasets/documents/detail/completed/__tests__/new-child-segment.spec.tsx +++ b/web/app/components/datasets/documents/detail/completed/__tests__/new-child-segment.spec.tsx @@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import NewChildSegmentModal from '../new-child-segment' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'test-dataset-id', documentId: 'test-document-id', diff --git a/web/app/components/datasets/documents/detail/completed/hooks/__tests__/use-segment-list-data.spec.ts b/web/app/components/datasets/documents/detail/completed/hooks/__tests__/use-segment-list-data.spec.ts index f54c00e3e7..6e9239c972 100644 --- a/web/app/components/datasets/documents/detail/completed/hooks/__tests__/use-segment-list-data.spec.ts +++ b/web/app/components/datasets/documents/detail/completed/hooks/__tests__/use-segment-list-data.spec.ts @@ -68,7 +68,7 @@ const { mockPathname: { current: '/datasets/test/documents/test' }, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: () => mockPathname.current, })) diff --git a/web/app/components/datasets/documents/detail/completed/hooks/use-segment-list-data.ts b/web/app/components/datasets/documents/detail/completed/hooks/use-segment-list-data.ts index aa91e9f464..8948f6b547 100644 --- a/web/app/components/datasets/documents/detail/completed/hooks/use-segment-list-data.ts +++ b/web/app/components/datasets/documents/detail/completed/hooks/use-segment-list-data.ts @@ -1,12 +1,12 @@ import type { FileEntity } from '@/app/components/datasets/common/image-uploader/types' import type { SegmentDetailModel, SegmentsResponse, SegmentUpdater } from '@/models/datasets' import { useQueryClient } from '@tanstack/react-query' -import { usePathname } from 'next/navigation' import { useCallback, useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useToastContext } from '@/app/components/base/toast/context' import { useEventEmitterContextContext } from '@/context/event-emitter' import { ChunkingMode } from '@/models/datasets' +import { usePathname } from '@/next/navigation' import { useChunkListAllKey, useChunkListDisabledKey, diff --git a/web/app/components/datasets/documents/detail/completed/new-child-segment.tsx b/web/app/components/datasets/documents/detail/completed/new-child-segment.tsx index e28fb774fb..edc0fca04c 100644 --- a/web/app/components/datasets/documents/detail/completed/new-child-segment.tsx +++ b/web/app/components/datasets/documents/detail/completed/new-child-segment.tsx @@ -1,7 +1,6 @@ import type { FC } from 'react' import type { ChildChunkDetail, SegmentUpdater } from '@/models/datasets' import { RiCloseLine, RiExpandDiagonalLine } from '@remixicon/react' -import { useParams } from 'next/navigation' import { memo, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' @@ -10,6 +9,7 @@ import { useStore as useAppStore } from '@/app/components/app/store' import Divider from '@/app/components/base/divider' import { ToastContext } from '@/app/components/base/toast/context' import { ChunkingMode } from '@/models/datasets' +import { useParams } from '@/next/navigation' import { useAddChildSegment } from '@/service/knowledge/use-segment' import { cn } from '@/utils/classnames' import { formatNumber } from '@/utils/format' diff --git a/web/app/components/datasets/documents/detail/document-title.tsx b/web/app/components/datasets/documents/detail/document-title.tsx index ec44e3ea97..2190338ab2 100644 --- a/web/app/components/datasets/documents/detail/document-title.tsx +++ b/web/app/components/datasets/documents/detail/document-title.tsx @@ -1,6 +1,6 @@ import type { FC } from 'react' import type { ChunkingMode, ParentMode } from '@/models/datasets' -import { useRouter } from 'next/navigation' +import { useRouter } from '@/next/navigation' import { cn } from '@/utils/classnames' import DocumentPicker from '../../common/document-picker' diff --git a/web/app/components/datasets/documents/detail/index.tsx b/web/app/components/datasets/documents/detail/index.tsx index b6842605c6..891c177169 100644 --- a/web/app/components/datasets/documents/detail/index.tsx +++ b/web/app/components/datasets/documents/detail/index.tsx @@ -1,7 +1,6 @@ 'use client' import type { FC } from 'react' import type { DataSourceInfo, FileItem, FullDocumentDetail, LegacyDataSourceInfo } from '@/models/datasets' -import { useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -13,6 +12,7 @@ import Metadata from '@/app/components/datasets/metadata/metadata-document' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import { ChunkingMode } from '@/models/datasets' +import { useRouter, useSearchParams } from '@/next/navigation' import { useDocumentDetail, useDocumentMetadata, useInvalidDocumentList } from '@/service/knowledge/use-document' import { useCheckSegmentBatchImportProgress, useChildSegmentListKey, useSegmentBatchImport, useSegmentListKey } from '@/service/knowledge/use-segment' import { useInvalid } from '@/service/use-base' diff --git a/web/app/components/datasets/documents/detail/new-segment.tsx b/web/app/components/datasets/documents/detail/new-segment.tsx index d2e27e9969..8db909f889 100644 --- a/web/app/components/datasets/documents/detail/new-segment.tsx +++ b/web/app/components/datasets/documents/detail/new-segment.tsx @@ -2,7 +2,6 @@ import type { FC } from 'react' import type { FileEntity } from '@/app/components/datasets/common/image-uploader/types' import type { SegmentUpdater } from '@/models/datasets' import { RiCloseLine, RiExpandDiagonalLine } from '@remixicon/react' -import { useParams } from 'next/navigation' import { memo, useCallback, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' @@ -13,6 +12,7 @@ import { ToastContext } from '@/app/components/base/toast/context' import ImageUploaderInChunk from '@/app/components/datasets/common/image-uploader/image-uploader-in-chunk' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { ChunkingMode } from '@/models/datasets' +import { useParams } from '@/next/navigation' import { useAddSegment } from '@/service/knowledge/use-segment' import { cn } from '@/utils/classnames' import { formatNumber } from '@/utils/format' diff --git a/web/app/components/datasets/documents/detail/settings/__tests__/document-settings.spec.tsx b/web/app/components/datasets/documents/detail/settings/__tests__/document-settings.spec.tsx index 84534298c9..4ac30289e1 100644 --- a/web/app/components/datasets/documents/detail/settings/__tests__/document-settings.spec.tsx +++ b/web/app/components/datasets/documents/detail/settings/__tests__/document-settings.spec.tsx @@ -5,7 +5,7 @@ import DocumentSettings from '../document-settings' const mockPush = vi.fn() const mockBack = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, back: mockBack, diff --git a/web/app/components/datasets/documents/detail/settings/document-settings.tsx b/web/app/components/datasets/documents/detail/settings/document-settings.tsx index 67773cb7d6..bcbc149231 100644 --- a/web/app/components/datasets/documents/detail/settings/document-settings.tsx +++ b/web/app/components/datasets/documents/detail/settings/document-settings.tsx @@ -11,7 +11,6 @@ import type { WebsiteCrawlInfo, } from '@/models/datasets' import { useBoolean } from 'ahooks' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' @@ -24,6 +23,7 @@ import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/con import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks' import DatasetDetailContext from '@/context/dataset-detail' +import { useRouter } from '@/next/navigation' import { useDocumentDetail, useInvalidDocumentDetail, useInvalidDocumentList } from '@/service/knowledge/use-document' type DocumentSettingsProps = { diff --git a/web/app/components/datasets/documents/detail/settings/pipeline-settings/__tests__/index.spec.tsx b/web/app/components/datasets/documents/detail/settings/pipeline-settings/__tests__/index.spec.tsx index 9f2ccc0acd..764667c55c 100644 --- a/web/app/components/datasets/documents/detail/settings/pipeline-settings/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/detail/settings/pipeline-settings/__tests__/index.spec.tsx @@ -7,7 +7,7 @@ import PipelineSettings from '../index' // Mock Next.js router const mockPush = vi.fn() const mockBack = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, back: mockBack, diff --git a/web/app/components/datasets/documents/detail/settings/pipeline-settings/__tests__/left-header.spec.tsx b/web/app/components/datasets/documents/detail/settings/pipeline-settings/__tests__/left-header.spec.tsx index 9a1ffab673..30019ca67d 100644 --- a/web/app/components/datasets/documents/detail/settings/pipeline-settings/__tests__/left-header.spec.tsx +++ b/web/app/components/datasets/documents/detail/settings/pipeline-settings/__tests__/left-header.spec.tsx @@ -4,7 +4,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import LeftHeader from '../left-header' const mockBack = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ back: mockBack, }), diff --git a/web/app/components/datasets/documents/detail/settings/pipeline-settings/index.tsx b/web/app/components/datasets/documents/detail/settings/pipeline-settings/index.tsx index 08e13765e5..4c9dd641e3 100644 --- a/web/app/components/datasets/documents/detail/settings/pipeline-settings/index.tsx +++ b/web/app/components/datasets/documents/detail/settings/pipeline-settings/index.tsx @@ -2,13 +2,13 @@ import type { NotionPage } from '@/models/common' import type { CrawlResultItem, CustomFile, FileIndexingEstimateResponse } from '@/models/datasets' import type { OnlineDriveFile, PublishedPipelineRunPreviewResponse } from '@/models/pipeline' import { noop } from 'es-toolkit/function' -import { useRouter } from 'next/navigation' import { useCallback, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import AppUnavailable from '@/app/components/base/app-unavailable' import Loading from '@/app/components/base/loading' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { DatasourceType } from '@/models/pipeline' +import { useRouter } from '@/next/navigation' import { useInvalidDocumentDetail, useInvalidDocumentList } from '@/service/knowledge/use-document' import { usePipelineExecutionLog, useRunPublishedPipeline } from '@/service/use-pipeline' import ChunkPreview from '../../../create-from-pipeline/preview/chunk-preview' diff --git a/web/app/components/datasets/documents/detail/settings/pipeline-settings/left-header.tsx b/web/app/components/datasets/documents/detail/settings/pipeline-settings/left-header.tsx index 280d835586..15b06a5f10 100644 --- a/web/app/components/datasets/documents/detail/settings/pipeline-settings/left-header.tsx +++ b/web/app/components/datasets/documents/detail/settings/pipeline-settings/left-header.tsx @@ -1,10 +1,10 @@ import { RiArrowLeftLine } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Effect from '@/app/components/base/effect' +import { useRouter } from '@/next/navigation' type LeftHeaderProps = { title: string diff --git a/web/app/components/datasets/documents/index.tsx b/web/app/components/datasets/documents/index.tsx index 764b04227c..29d9c01f71 100644 --- a/web/app/components/datasets/documents/index.tsx +++ b/web/app/components/datasets/documents/index.tsx @@ -1,11 +1,11 @@ 'use client' import type { FC } from 'react' -import { useRouter } from 'next/navigation' import { useCallback } from 'react' import Loading from '@/app/components/base/loading' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useProviderContext } from '@/context/provider-context' import { DataSourceType } from '@/models/datasets' +import { useRouter } from '@/next/navigation' import { useDocumentList, useInvalidDocumentDetail, useInvalidDocumentList } from '@/service/knowledge/use-document' import { useChildSegmentListKey, useSegmentListKey } from '@/service/knowledge/use-segment' import { useInvalid } from '@/service/use-base' diff --git a/web/app/components/datasets/external-knowledge-base/connector/__tests__/index.spec.tsx b/web/app/components/datasets/external-knowledge-base/connector/__tests__/index.spec.tsx index a6a60aa856..64b24fb08f 100644 --- a/web/app/components/datasets/external-knowledge-base/connector/__tests__/index.spec.tsx +++ b/web/app/components/datasets/external-knowledge-base/connector/__tests__/index.spec.tsx @@ -7,7 +7,7 @@ import ExternalKnowledgeBaseConnector from '../index' const mockRouterBack = vi.fn() const mockReplace = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ back: mockRouterBack, replace: mockReplace, diff --git a/web/app/components/datasets/external-knowledge-base/connector/index.tsx b/web/app/components/datasets/external-knowledge-base/connector/index.tsx index cf36eed382..789e92c668 100644 --- a/web/app/components/datasets/external-knowledge-base/connector/index.tsx +++ b/web/app/components/datasets/external-knowledge-base/connector/index.tsx @@ -1,12 +1,12 @@ 'use client' import type { CreateKnowledgeBaseReq } from '@/app/components/datasets/external-knowledge-base/create/declarations' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useState } from 'react' import { trackEvent } from '@/app/components/base/amplitude' import { useToastContext } from '@/app/components/base/toast/context' import ExternalKnowledgeBaseCreate from '@/app/components/datasets/external-knowledge-base/create' +import { useRouter } from '@/next/navigation' import { createExternalKnowledgeBase } from '@/service/datasets' const ExternalKnowledgeBaseConnector = () => { diff --git a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx index f84e6c57c1..a527da982a 100644 --- a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx @@ -2,13 +2,13 @@ import { RiAddLine, RiArrowDownSLine, } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development' import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context' import { useModalContext } from '@/context/modal-context' +import { useRouter } from '@/next/navigation' type ApiItem = { value: string diff --git a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx index 75b9e8de9c..4652a8a5f1 100644 --- a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx @@ -1,7 +1,6 @@ 'use client' import { RiAddLine } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -9,6 +8,7 @@ import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context' import { useModalContext } from '@/context/modal-context' +import { useRouter } from '@/next/navigation' import ExternalApiSelect from './ExternalApiSelect' type ExternalApiSelectionProps = { diff --git a/web/app/components/datasets/external-knowledge-base/create/__tests__/ExternalApiSelect.spec.tsx b/web/app/components/datasets/external-knowledge-base/create/__tests__/ExternalApiSelect.spec.tsx index 3b8b35a5b7..7af75fbcdd 100644 --- a/web/app/components/datasets/external-knowledge-base/create/__tests__/ExternalApiSelect.spec.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/__tests__/ExternalApiSelect.spec.tsx @@ -12,7 +12,7 @@ const mocks = vi.hoisted(() => ({ mutateExternalKnowledgeApis: vi.fn(), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mocks.push, refresh: mocks.refresh }), })) diff --git a/web/app/components/datasets/external-knowledge-base/create/__tests__/ExternalApiSelection.spec.tsx b/web/app/components/datasets/external-knowledge-base/create/__tests__/ExternalApiSelection.spec.tsx index 702890bee9..97934f36e1 100644 --- a/web/app/components/datasets/external-knowledge-base/create/__tests__/ExternalApiSelection.spec.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/__tests__/ExternalApiSelection.spec.tsx @@ -10,7 +10,7 @@ const mocks = vi.hoisted(() => ({ externalKnowledgeApiList: [] as Array<{ id: string, name: string, settings: { endpoint: string } }>, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mocks.push, refresh: mocks.refresh }), })) diff --git a/web/app/components/datasets/external-knowledge-base/create/__tests__/index.spec.tsx b/web/app/components/datasets/external-knowledge-base/create/__tests__/index.spec.tsx index 213fe30ee3..a3282e441c 100644 --- a/web/app/components/datasets/external-knowledge-base/create/__tests__/index.spec.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/__tests__/index.spec.tsx @@ -7,7 +7,7 @@ import RetrievalSettings from '../RetrievalSettings' const mockReplace = vi.fn() const mockRefresh = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace, push: vi.fn(), diff --git a/web/app/components/datasets/external-knowledge-base/create/index.tsx b/web/app/components/datasets/external-knowledge-base/create/index.tsx index 07b6e71fa6..0e855259ba 100644 --- a/web/app/components/datasets/external-knowledge-base/create/index.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/index.tsx @@ -2,12 +2,12 @@ import type { CreateKnowledgeBaseReq } from './declarations' import { RiArrowLeftLine, RiArrowRightLine } from '@remixicon/react' -import { useRouter } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Divider from '@/app/components/base/divider' import { useDocLink } from '@/context/i18n' +import { useRouter } from '@/next/navigation' import ExternalApiSelection from './ExternalApiSelection' import InfoPanel from './InfoPanel' import KnowledgeBaseInfo from './KnowledgeBaseInfo' diff --git a/web/app/components/datasets/extra-info/__tests__/index.spec.tsx b/web/app/components/datasets/extra-info/__tests__/index.spec.tsx index c6f9066e6b..de61894a11 100644 --- a/web/app/components/datasets/extra-info/__tests__/index.spec.tsx +++ b/web/app/components/datasets/extra-info/__tests__/index.spec.tsx @@ -13,7 +13,7 @@ import Statistics from '../statistics' // Mock Setup -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn(), replace: vi.fn(), diff --git a/web/app/components/datasets/extra-info/service-api/__tests__/index.spec.tsx b/web/app/components/datasets/extra-info/service-api/__tests__/index.spec.tsx index 201649556f..8137052383 100644 --- a/web/app/components/datasets/extra-info/service-api/__tests__/index.spec.tsx +++ b/web/app/components/datasets/extra-info/service-api/__tests__/index.spec.tsx @@ -9,7 +9,7 @@ import ServiceApi from '../index' // Mock Setup -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn(), replace: vi.fn(), diff --git a/web/app/components/datasets/hit-testing/__tests__/index.spec.tsx b/web/app/components/datasets/hit-testing/__tests__/index.spec.tsx index fe7510b498..2dda6ecaae 100644 --- a/web/app/components/datasets/hit-testing/__tests__/index.spec.tsx +++ b/web/app/components/datasets/hit-testing/__tests__/index.spec.tsx @@ -27,7 +27,7 @@ vi.mock('@/app/components/datasets/external-knowledge-base/create/RetrievalSetti // Mock Setup -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn(), replace: vi.fn(), diff --git a/web/app/components/datasets/list/__tests__/datasets.spec.tsx b/web/app/components/datasets/list/__tests__/datasets.spec.tsx index 49bda88c8b..5b777e0b2e 100644 --- a/web/app/components/datasets/list/__tests__/datasets.spec.tsx +++ b/web/app/components/datasets/list/__tests__/datasets.spec.tsx @@ -6,7 +6,7 @@ import { ChunkingMode, DatasetPermission, DataSourceType } from '@/models/datase import { RETRIEVE_METHOD } from '@/types/app' import Datasets from '../datasets' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), })) diff --git a/web/app/components/datasets/list/__tests__/index.spec.tsx b/web/app/components/datasets/list/__tests__/index.spec.tsx index 73e0ba0960..37a787ff51 100644 --- a/web/app/components/datasets/list/__tests__/index.spec.tsx +++ b/web/app/components/datasets/list/__tests__/index.spec.tsx @@ -4,7 +4,7 @@ import List from '../index' const mockPush = vi.fn() const mockReplace = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, replace: mockReplace, diff --git a/web/app/components/datasets/list/dataset-card/__tests__/index.spec.tsx b/web/app/components/datasets/list/dataset-card/__tests__/index.spec.tsx index ebe80e4686..21ddda5ce6 100644 --- a/web/app/components/datasets/list/dataset-card/__tests__/index.spec.tsx +++ b/web/app/components/datasets/list/dataset-card/__tests__/index.spec.tsx @@ -22,7 +22,7 @@ vi.mock('@/hooks/use-format-time-from-now', () => ({ const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/components/datasets/list/dataset-card/index.tsx b/web/app/components/datasets/list/dataset-card/index.tsx index 85dba7e8ff..2a22255eda 100644 --- a/web/app/components/datasets/list/dataset-card/index.tsx +++ b/web/app/components/datasets/list/dataset-card/index.tsx @@ -1,9 +1,9 @@ 'use client' import type { DataSet } from '@/models/datasets' import { useHover } from 'ahooks' -import { useRouter } from 'next/navigation' import { useMemo, useRef } from 'react' import { useSelector as useAppContextWithSelector } from '@/context/app-context' +import { useRouter } from '@/next/navigation' import CornerLabels from './components/corner-labels' import DatasetCardFooter from './components/dataset-card-footer' import DatasetCardHeader from './components/dataset-card-header' diff --git a/web/app/components/datasets/metadata/metadata-document/__tests__/index.spec.tsx b/web/app/components/datasets/metadata/metadata-document/__tests__/index.spec.tsx index e56fe46422..9cc4f89bd8 100644 --- a/web/app/components/datasets/metadata/metadata-document/__tests__/index.spec.tsx +++ b/web/app/components/datasets/metadata/metadata-document/__tests__/index.spec.tsx @@ -45,7 +45,7 @@ vi.mock('../../hooks/use-check-metadata-name', () => ({ }), })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn(), }), diff --git a/web/app/components/datasets/metadata/metadata-document/__tests__/info-group.spec.tsx b/web/app/components/datasets/metadata/metadata-document/__tests__/info-group.spec.tsx index f30e188cd7..d783b882a8 100644 --- a/web/app/components/datasets/metadata/metadata-document/__tests__/info-group.spec.tsx +++ b/web/app/components/datasets/metadata/metadata-document/__tests__/info-group.spec.tsx @@ -22,7 +22,7 @@ type InputCombinedProps = { type: DataType } -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: vi.fn(), }), diff --git a/web/app/components/datasets/metadata/metadata-document/info-group.tsx b/web/app/components/datasets/metadata/metadata-document/info-group.tsx index 6d172c92f4..0b21d607bd 100644 --- a/web/app/components/datasets/metadata/metadata-document/info-group.tsx +++ b/web/app/components/datasets/metadata/metadata-document/info-group.tsx @@ -2,12 +2,12 @@ import type { FC } from 'react' import type { MetadataItemWithValue } from '../types' import { RiDeleteBinLine, RiQuestionLine } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useTranslation } from 'react-i18next' import Divider from '@/app/components/base/divider' import Tooltip from '@/app/components/base/tooltip' import useTimestamp from '@/hooks/use-timestamp' +import { useRouter } from '@/next/navigation' import { cn } from '@/utils/classnames' import AddMetadataButton from '../add-metadata-button' import InputCombined from '../edit-metadata-batch/input-combined' diff --git a/web/app/components/explore/__tests__/index.spec.tsx b/web/app/components/explore/__tests__/index.spec.tsx index cf76593613..5c743928e8 100644 --- a/web/app/components/explore/__tests__/index.spec.tsx +++ b/web/app/components/explore/__tests__/index.spec.tsx @@ -8,7 +8,7 @@ const mockReplace = vi.fn() const mockPush = vi.fn() const mockInstalledAppsData = { installed_apps: [] as const } -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace, push: mockPush, diff --git a/web/app/components/explore/create-app-modal/__tests__/index.spec.tsx b/web/app/components/explore/create-app-modal/__tests__/index.spec.tsx index 62353fb3c1..f389eeab29 100644 --- a/web/app/components/explore/create-app-modal/__tests__/index.spec.tsx +++ b/web/app/components/explore/create-app-modal/__tests__/index.spec.tsx @@ -19,7 +19,7 @@ vi.mock('@emoji-mart/data', () => ({ }, })) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({}), })) diff --git a/web/app/components/explore/sidebar/__tests__/index.spec.tsx b/web/app/components/explore/sidebar/__tests__/index.spec.tsx index 36e6ab217c..26c065a10c 100644 --- a/web/app/components/explore/sidebar/__tests__/index.spec.tsx +++ b/web/app/components/explore/sidebar/__tests__/index.spec.tsx @@ -13,7 +13,7 @@ let mockIsPending = false let mockInstalledApps: InstalledApp[] = [] let mockMediaType: string = MediaType.pc -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegments: () => mockSegments, useRouter: () => ({ push: mockPush, diff --git a/web/app/components/explore/sidebar/app-nav-item/__tests__/index.spec.tsx b/web/app/components/explore/sidebar/app-nav-item/__tests__/index.spec.tsx index 299c181c98..26af458c55 100644 --- a/web/app/components/explore/sidebar/app-nav-item/__tests__/index.spec.tsx +++ b/web/app/components/explore/sidebar/app-nav-item/__tests__/index.spec.tsx @@ -3,7 +3,7 @@ import AppNavItem from '../index' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, }), diff --git a/web/app/components/explore/sidebar/app-nav-item/index.tsx b/web/app/components/explore/sidebar/app-nav-item/index.tsx index 08558578f6..3f3d7a727e 100644 --- a/web/app/components/explore/sidebar/app-nav-item/index.tsx +++ b/web/app/components/explore/sidebar/app-nav-item/index.tsx @@ -2,11 +2,11 @@ import type { AppIconType } from '@/types/app' import { useHover } from 'ahooks' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useRef } from 'react' import AppIcon from '@/app/components/base/app-icon' import ItemOperation from '@/app/components/explore/item-operation' +import { useRouter } from '@/next/navigation' import { cn } from '@/utils/classnames' export type IAppNavItemProps = { diff --git a/web/app/components/explore/sidebar/index.tsx b/web/app/components/explore/sidebar/index.tsx index d8d636285b..4b328bb46d 100644 --- a/web/app/components/explore/sidebar/index.tsx +++ b/web/app/components/explore/sidebar/index.tsx @@ -1,6 +1,5 @@ 'use client' import { useBoolean } from 'ahooks' -import { useSelectedLayoutSegments } from 'next/navigation' import * as React from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' @@ -8,6 +7,7 @@ import Confirm from '@/app/components/base/confirm' import Divider from '@/app/components/base/divider' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import Link from '@/next/link' +import { useSelectedLayoutSegments } from '@/next/navigation' import { useGetInstalledApps, useUninstallApp, useUpdateAppPinStatus } from '@/service/use-explore' import { cn } from '@/utils/classnames' import Toast from '../../base/toast' diff --git a/web/app/components/goto-anything/__tests__/command-selector.spec.tsx b/web/app/components/goto-anything/__tests__/command-selector.spec.tsx index 56e40a71f0..98c6ac784f 100644 --- a/web/app/components/goto-anything/__tests__/command-selector.spec.tsx +++ b/web/app/components/goto-anything/__tests__/command-selector.spec.tsx @@ -5,7 +5,7 @@ import { Command } from 'cmdk' import * as React from 'react' import CommandSelector from '../command-selector' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: () => '/app', })) diff --git a/web/app/components/goto-anything/__tests__/context.spec.tsx b/web/app/components/goto-anything/__tests__/context.spec.tsx index c427f76c61..70a30786df 100644 --- a/web/app/components/goto-anything/__tests__/context.spec.tsx +++ b/web/app/components/goto-anything/__tests__/context.spec.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { GotoAnythingProvider, useGotoAnythingContext } from '../context' let pathnameMock: string | null | undefined = '/' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: () => pathnameMock, })) diff --git a/web/app/components/goto-anything/__tests__/index.spec.tsx b/web/app/components/goto-anything/__tests__/index.spec.tsx index eb5fa8ccdd..b2050ef9fb 100644 --- a/web/app/components/goto-anything/__tests__/index.spec.tsx +++ b/web/app/components/goto-anything/__tests__/index.spec.tsx @@ -11,7 +11,7 @@ type TestSearchResult = Omit & { } const routerPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: routerPush, }), diff --git a/web/app/components/goto-anything/command-selector.tsx b/web/app/components/goto-anything/command-selector.tsx index bdb641cae6..59373c9e3a 100644 --- a/web/app/components/goto-anything/command-selector.tsx +++ b/web/app/components/goto-anything/command-selector.tsx @@ -1,9 +1,9 @@ import type { FC } from 'react' import type { ActionItem } from './actions/types' import { Command } from 'cmdk' -import { usePathname } from 'next/navigation' import { useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' +import { usePathname } from '@/next/navigation' import { slashCommandRegistry } from './actions/commands/registry' type Props = { diff --git a/web/app/components/goto-anything/context.tsx b/web/app/components/goto-anything/context.tsx index 5c2bf3cb6b..28fb08ac17 100644 --- a/web/app/components/goto-anything/context.tsx +++ b/web/app/components/goto-anything/context.tsx @@ -1,9 +1,9 @@ 'use client' import type { ReactNode } from 'react' -import { usePathname } from 'next/navigation' import * as React from 'react' import { createContext, useContext, useEffect, useState } from 'react' +import { usePathname } from '@/next/navigation' import { isInWorkflowPage } from '../workflow/constants' /** diff --git a/web/app/components/goto-anything/hooks/__tests__/use-goto-anything-navigation.spec.ts b/web/app/components/goto-anything/hooks/__tests__/use-goto-anything-navigation.spec.ts index 1ac3bbc17c..c8a6a4a13c 100644 --- a/web/app/components/goto-anything/hooks/__tests__/use-goto-anything-navigation.spec.ts +++ b/web/app/components/goto-anything/hooks/__tests__/use-goto-anything-navigation.spec.ts @@ -16,7 +16,7 @@ type MockCommandResult = { let mockFindCommandResult: MockCommandResult = null -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockRouterPush, }), diff --git a/web/app/components/goto-anything/hooks/use-goto-anything-navigation.ts b/web/app/components/goto-anything/hooks/use-goto-anything-navigation.ts index 73be6cd3ee..9c9871fa1d 100644 --- a/web/app/components/goto-anything/hooks/use-goto-anything-navigation.ts +++ b/web/app/components/goto-anything/hooks/use-goto-anything-navigation.ts @@ -3,9 +3,9 @@ import type { RefObject } from 'react' import type { Plugin } from '../../plugins/types' import type { ActionItem, SearchResult } from '../actions/types' -import { useRouter } from 'next/navigation' import { useCallback, useState } from 'react' import { selectWorkflowNode } from '@/app/components/workflow/utils/node-navigation' +import { useRouter } from '@/next/navigation' import { slashCommandRegistry } from '../actions/commands/registry' export type UseGotoAnythingNavigationReturn = { diff --git a/web/app/components/header/__tests__/header-wrapper.spec.tsx b/web/app/components/header/__tests__/header-wrapper.spec.tsx index b1948e0992..cdb6a7a849 100644 --- a/web/app/components/header/__tests__/header-wrapper.spec.tsx +++ b/web/app/components/header/__tests__/header-wrapper.spec.tsx @@ -1,10 +1,10 @@ import { act, render, screen } from '@testing-library/react' -import { usePathname } from 'next/navigation' import { vi } from 'vitest' import { useEventEmitterContextContext } from '@/context/event-emitter' +import { usePathname } from '@/next/navigation' import HeaderWrapper from '../header-wrapper' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ usePathname: vi.fn(), })) diff --git a/web/app/components/header/account-dropdown/__tests__/index.spec.tsx b/web/app/components/header/account-dropdown/__tests__/index.spec.tsx index e1d4c45810..eb4d543e66 100644 --- a/web/app/components/header/account-dropdown/__tests__/index.spec.tsx +++ b/web/app/components/header/account-dropdown/__tests__/index.spec.tsx @@ -3,12 +3,12 @@ import type { ModalContextState } from '@/context/modal-context' import type { ProviderContextState } from '@/context/provider-context' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { fireEvent, render, screen, waitFor } from '@testing-library/react' -import { useRouter } from 'next/navigation' import { Plan } from '@/app/components/billing/type' import { useAppContext } from '@/context/app-context' import { useGlobalPublicStore } from '@/context/global-public-context' import { useModalContext } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' +import { useRouter } from '@/next/navigation' import { useLogout } from '@/service/use-common' import AppSelector from '../index' @@ -53,8 +53,8 @@ vi.mock('@/service/use-common', () => ({ useLogout: vi.fn(), })) -vi.mock('next/navigation', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('@/next/navigation', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useRouter: vi.fn(), diff --git a/web/app/components/header/account-dropdown/index.tsx b/web/app/components/header/account-dropdown/index.tsx index 7048ccbde0..1697433ac4 100644 --- a/web/app/components/header/account-dropdown/index.tsx +++ b/web/app/components/header/account-dropdown/index.tsx @@ -1,7 +1,6 @@ 'use client' import type { MouseEventHandler, ReactNode } from 'react' -import { useRouter } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { resetUser } from '@/app/components/base/amplitude/utils' @@ -18,6 +17,7 @@ import { useModalContext } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' import { env } from '@/env' import Link from '@/next/link' +import { useRouter } from '@/next/navigation' import { useLogout } from '@/service/use-common' import { cn } from '@/utils/classnames' import AccountAbout from '../account-about' diff --git a/web/app/components/header/account-setting/__tests__/index.spec.tsx b/web/app/components/header/account-setting/__tests__/index.spec.tsx index 38cbb58a1b..2aa9db4771 100644 --- a/web/app/components/header/account-setting/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/__tests__/index.spec.tsx @@ -27,7 +27,7 @@ vi.mock('@/context/app-context', async (importOriginal) => { } }) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: vi.fn(() => ({ push: vi.fn(), replace: vi.fn(), diff --git a/web/app/components/header/account-setting/language-page/__tests__/index.spec.tsx b/web/app/components/header/account-setting/language-page/__tests__/index.spec.tsx index fb032ebd62..eafd57ed66 100644 --- a/web/app/components/header/account-setting/language-page/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/language-page/__tests__/index.spec.tsx @@ -61,7 +61,7 @@ vi.mock('@/app/components/base/select', async () => { } }) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ refresh: mockRefresh }), })) diff --git a/web/app/components/header/account-setting/language-page/index.tsx b/web/app/components/header/account-setting/language-page/index.tsx index 5751e88285..6c84a25428 100644 --- a/web/app/components/header/account-setting/language-page/index.tsx +++ b/web/app/components/header/account-setting/language-page/index.tsx @@ -2,7 +2,6 @@ import type { Item } from '@/app/components/base/select' import type { Locale } from '@/i18n-config' -import { useRouter } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' @@ -12,6 +11,7 @@ import { useAppContext } from '@/context/app-context' import { useLocale } from '@/context/i18n' import { setLocaleOnClient } from '@/i18n-config' import { languages } from '@/i18n-config/language' +import { useRouter } from '@/next/navigation' import { updateUserProfile } from '@/service/common' import { timezones } from '@/utils/timezone' diff --git a/web/app/components/header/app-nav/__tests__/index.spec.tsx b/web/app/components/header/app-nav/__tests__/index.spec.tsx index 0ccb468670..03f8edfacf 100644 --- a/web/app/components/header/app-nav/__tests__/index.spec.tsx +++ b/web/app/components/header/app-nav/__tests__/index.spec.tsx @@ -1,13 +1,13 @@ import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' -import { useParams } from 'next/navigation' import { useStore as useAppStore } from '@/app/components/app/store' import { useAppContext } from '@/context/app-context' +import { useParams } from '@/next/navigation' import { useInfiniteAppList } from '@/service/use-apps' import { AppModeEnum } from '@/types/app' import AppNav from '../index' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: vi.fn(), })) diff --git a/web/app/components/header/app-nav/index.tsx b/web/app/components/header/app-nav/index.tsx index 737dd96bab..214b7612bb 100644 --- a/web/app/components/header/app-nav/index.tsx +++ b/web/app/components/header/app-nav/index.tsx @@ -7,7 +7,6 @@ import { } from '@remixicon/react' import { flatten } from 'es-toolkit/compat' import { produce } from 'immer' -import { useParams } from 'next/navigation' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import CreateAppTemplateDialog from '@/app/components/app/create-app-dialog' @@ -15,6 +14,7 @@ import CreateAppModal from '@/app/components/app/create-app-modal' import CreateFromDSLModal from '@/app/components/app/create-from-dsl-modal' import { useStore as useAppStore } from '@/app/components/app/store' import { useAppContext } from '@/context/app-context' +import { useParams } from '@/next/navigation' import { useInfiniteAppList } from '@/service/use-apps' import { AppModeEnum } from '@/types/app' import Nav from '../nav' diff --git a/web/app/components/header/app-selector/__tests__/index.spec.tsx b/web/app/components/header/app-selector/__tests__/index.spec.tsx index 676aba7023..eddb7e52aa 100644 --- a/web/app/components/header/app-selector/__tests__/index.spec.tsx +++ b/web/app/components/header/app-selector/__tests__/index.spec.tsx @@ -1,12 +1,12 @@ import type { AppDetailResponse } from '@/models/app' import { act, fireEvent, render, screen } from '@testing-library/react' -import { useRouter } from 'next/navigation' import { vi } from 'vitest' import { useAppContext } from '@/context/app-context' +import { useRouter } from '@/next/navigation' import AppSelector from '../index' // Mock next/navigation -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: vi.fn(), })) diff --git a/web/app/components/header/app-selector/index.tsx b/web/app/components/header/app-selector/index.tsx index 13677ef7ab..89f87c2687 100644 --- a/web/app/components/header/app-selector/index.tsx +++ b/web/app/components/header/app-selector/index.tsx @@ -3,12 +3,12 @@ import type { AppDetailResponse } from '@/models/app' import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react' import { ChevronDownIcon, PlusIcon } from '@heroicons/react/24/solid' import { noop } from 'es-toolkit/function' -import { useRouter } from 'next/navigation' import { Fragment, useState } from 'react' import { useTranslation } from 'react-i18next' import CreateAppDialog from '@/app/components/app/create-app-dialog' import AppIcon from '@/app/components/base/app-icon' import { useAppContext } from '@/context/app-context' +import { useRouter } from '@/next/navigation' import Indicator from '../indicator' type IAppSelectorProps = { diff --git a/web/app/components/header/dataset-nav/__tests__/index.spec.tsx b/web/app/components/header/dataset-nav/__tests__/index.spec.tsx index a551538e98..a81fa0ca3f 100644 --- a/web/app/components/header/dataset-nav/__tests__/index.spec.tsx +++ b/web/app/components/header/dataset-nav/__tests__/index.spec.tsx @@ -1,18 +1,18 @@ import { act, fireEvent, render, screen, within } from '@testing-library/react' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { useAppContext } from '@/context/app-context' import { useParams, useRouter, useSelectedLayoutSegment, -} from 'next/navigation' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import { useAppContext } from '@/context/app-context' +} from '@/next/navigation' import { useDatasetDetail, useDatasetList, } from '@/service/knowledge/use-dataset' import DatasetNav from '../index' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: vi.fn(), useRouter: vi.fn(), useSelectedLayoutSegment: vi.fn(), diff --git a/web/app/components/header/dataset-nav/index.tsx b/web/app/components/header/dataset-nav/index.tsx index c0e79128e9..0b39560884 100644 --- a/web/app/components/header/dataset-nav/index.tsx +++ b/web/app/components/header/dataset-nav/index.tsx @@ -7,9 +7,9 @@ import { RiBook2Line, } from '@remixicon/react' import { flatten } from 'es-toolkit/compat' -import { useParams, useRouter } from 'next/navigation' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' +import { useParams, useRouter } from '@/next/navigation' import { useDatasetDetail, useDatasetList } from '@/service/knowledge/use-dataset' import { basePath } from '@/utils/var' import Nav from '../nav' diff --git a/web/app/components/header/explore-nav/__tests__/index.spec.tsx b/web/app/components/header/explore-nav/__tests__/index.spec.tsx index 79285cf53e..0ef271b034 100644 --- a/web/app/components/header/explore-nav/__tests__/index.spec.tsx +++ b/web/app/components/header/explore-nav/__tests__/index.spec.tsx @@ -1,9 +1,9 @@ import type { Mock } from 'vitest' import { render, screen } from '@testing-library/react' -import { useSelectedLayoutSegment } from 'next/navigation' +import { useSelectedLayoutSegment } from '@/next/navigation' import ExploreNav from '../index' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegment: vi.fn(), })) diff --git a/web/app/components/header/explore-nav/index.tsx b/web/app/components/header/explore-nav/index.tsx index a6f9faf24e..9931690e83 100644 --- a/web/app/components/header/explore-nav/index.tsx +++ b/web/app/components/header/explore-nav/index.tsx @@ -4,9 +4,9 @@ import { RiPlanetFill, RiPlanetLine, } from '@remixicon/react' -import { useSelectedLayoutSegment } from 'next/navigation' import { useTranslation } from 'react-i18next' import Link from '@/next/link' +import { useSelectedLayoutSegment } from '@/next/navigation' import { cn } from '@/utils/classnames' type ExploreNavProps = { diff --git a/web/app/components/header/header-wrapper.tsx b/web/app/components/header/header-wrapper.tsx index 1b81c1152c..e140939976 100644 --- a/web/app/components/header/header-wrapper.tsx +++ b/web/app/components/header/header-wrapper.tsx @@ -1,8 +1,8 @@ 'use client' -import { usePathname } from 'next/navigation' import * as React from 'react' import { useState } from 'react' import { useEventEmitterContextContext } from '@/context/event-emitter' +import { usePathname } from '@/next/navigation' import { cn } from '@/utils/classnames' import s from './index.module.css' diff --git a/web/app/components/header/nav/__tests__/index.spec.tsx b/web/app/components/header/nav/__tests__/index.spec.tsx index a47dc711c8..6ee8a7a924 100644 --- a/web/app/components/header/nav/__tests__/index.spec.tsx +++ b/web/app/components/header/nav/__tests__/index.spec.tsx @@ -7,11 +7,11 @@ import { screen, waitFor, } from '@testing-library/react' -import { useRouter, useSelectedLayoutSegment } from 'next/navigation' import * as React from 'react' import { vi } from 'vitest' import { useStore as useAppStore } from '@/app/components/app/store' import { useAppContext } from '@/context/app-context' +import { useRouter, useSelectedLayoutSegment } from '@/next/navigation' import { AppModeEnum } from '@/types/app' import Nav from '../index' @@ -69,7 +69,7 @@ vi.mock('@headlessui/react', () => { }) // Mock next/navigation -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegment: vi.fn(), useRouter: vi.fn(), })) diff --git a/web/app/components/header/nav/index.tsx b/web/app/components/header/nav/index.tsx index 5d86a77d04..1342bb1fa3 100644 --- a/web/app/components/header/nav/index.tsx +++ b/web/app/components/header/nav/index.tsx @@ -1,12 +1,12 @@ 'use client' import type { INavSelectorProps } from './nav-selector' -import { useSelectedLayoutSegment } from 'next/navigation' import * as React from 'react' import { useState } from 'react' import { useStore as useAppStore } from '@/app/components/app/store' import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows' import Link from '@/next/link' +import { useSelectedLayoutSegment } from '@/next/navigation' import { cn } from '@/utils/classnames' import NavSelector from './nav-selector' diff --git a/web/app/components/header/nav/nav-selector/__tests__/index.spec.tsx b/web/app/components/header/nav/nav-selector/__tests__/index.spec.tsx index 55d77389c6..152901b79c 100644 --- a/web/app/components/header/nav/nav-selector/__tests__/index.spec.tsx +++ b/web/app/components/header/nav/nav-selector/__tests__/index.spec.tsx @@ -1,11 +1,11 @@ import type { INavSelectorProps, NavItem } from '../index' import type { AppContextValue } from '@/context/app-context' import { act, fireEvent, render, screen } from '@testing-library/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { vi } from 'vitest' import { useStore as useAppStore } from '@/app/components/app/store' import { useAppContext } from '@/context/app-context' +import { useRouter } from '@/next/navigation' import { AppModeEnum } from '@/types/app' import NavSelector from '../index' @@ -63,7 +63,7 @@ vi.mock('@headlessui/react', () => { }) // Mock next/navigation -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: vi.fn(), })) diff --git a/web/app/components/header/nav/nav-selector/index.tsx b/web/app/components/header/nav/nav-selector/index.tsx index e66837c06c..264bfc0ffb 100644 --- a/web/app/components/header/nav/nav-selector/index.tsx +++ b/web/app/components/header/nav/nav-selector/index.tsx @@ -7,7 +7,6 @@ import { RiArrowRightSLine, } from '@remixicon/react' import { debounce } from 'es-toolkit/compat' -import { useRouter } from 'next/navigation' import { Fragment, useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useStore as useAppStore } from '@/app/components/app/store' @@ -16,6 +15,7 @@ import AppIcon from '@/app/components/base/app-icon' import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files' import Loading from '@/app/components/base/loading' import { useAppContext } from '@/context/app-context' +import { useRouter } from '@/next/navigation' import { cn } from '@/utils/classnames' export type NavItem = { diff --git a/web/app/components/header/plugins-nav/__tests__/index.spec.tsx b/web/app/components/header/plugins-nav/__tests__/index.spec.tsx index 009e573eb1..ab55225641 100644 --- a/web/app/components/header/plugins-nav/__tests__/index.spec.tsx +++ b/web/app/components/header/plugins-nav/__tests__/index.spec.tsx @@ -1,11 +1,11 @@ import type { Mock } from 'vitest' import { render, screen } from '@testing-library/react' -import { useSelectedLayoutSegment } from 'next/navigation' import { usePluginTaskStatus } from '@/app/components/plugins/plugin-page/plugin-tasks/hooks' +import { useSelectedLayoutSegment } from '@/next/navigation' import PluginsNav from '../index' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegment: vi.fn(), })) diff --git a/web/app/components/header/plugins-nav/index.tsx b/web/app/components/header/plugins-nav/index.tsx index 5501048915..c77eb4d57e 100644 --- a/web/app/components/header/plugins-nav/index.tsx +++ b/web/app/components/header/plugins-nav/index.tsx @@ -1,11 +1,11 @@ 'use client' -import { useSelectedLayoutSegment } from 'next/navigation' import { useTranslation } from 'react-i18next' import { Group } from '@/app/components/base/icons/src/vender/other' import Indicator from '@/app/components/header/indicator' import { usePluginTaskStatus } from '@/app/components/plugins/plugin-page/plugin-tasks/hooks' import Link from '@/next/link' +import { useSelectedLayoutSegment } from '@/next/navigation' import { cn } from '@/utils/classnames' import DownloadingIcon from './downloading-icon' diff --git a/web/app/components/header/tools-nav/__tests__/index.spec.tsx b/web/app/components/header/tools-nav/__tests__/index.spec.tsx index e3ceef43a4..361e6f8b84 100644 --- a/web/app/components/header/tools-nav/__tests__/index.spec.tsx +++ b/web/app/components/header/tools-nav/__tests__/index.spec.tsx @@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import ToolsNav from '../index' const mockUseSelectedLayoutSegment = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegment: () => mockUseSelectedLayoutSegment(), })) diff --git a/web/app/components/header/tools-nav/index.tsx b/web/app/components/header/tools-nav/index.tsx index d7abaa4680..141b576a4c 100644 --- a/web/app/components/header/tools-nav/index.tsx +++ b/web/app/components/header/tools-nav/index.tsx @@ -4,9 +4,9 @@ import { RiHammerFill, RiHammerLine, } from '@remixicon/react' -import { useSelectedLayoutSegment } from 'next/navigation' import { useTranslation } from 'react-i18next' import Link from '@/next/link' +import { useSelectedLayoutSegment } from '@/next/navigation' import { cn } from '@/utils/classnames' type ToolsNavProps = { diff --git a/web/app/components/rag-pipeline/components/__tests__/conversion.spec.tsx b/web/app/components/rag-pipeline/components/__tests__/conversion.spec.tsx index 2bd20fb5c3..c7ddf4711e 100644 --- a/web/app/components/rag-pipeline/components/__tests__/conversion.spec.tsx +++ b/web/app/components/rag-pipeline/components/__tests__/conversion.spec.tsx @@ -5,7 +5,7 @@ import Conversion from '../conversion' const mockConvert = vi.fn() const mockInvalidDatasetDetail = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'ds-123' }), })) diff --git a/web/app/components/rag-pipeline/components/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/__tests__/index.spec.tsx index 8974965274..36454d33e4 100644 --- a/web/app/components/rag-pipeline/components/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/__tests__/index.spec.tsx @@ -10,7 +10,7 @@ import RagPipelineChildren from '../rag-pipeline-children' import PipelineScreenShot from '../screenshot' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'test-dataset-id' }), useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/components/rag-pipeline/components/conversion.tsx b/web/app/components/rag-pipeline/components/conversion.tsx index db3c04e9bf..b433359eeb 100644 --- a/web/app/components/rag-pipeline/components/conversion.tsx +++ b/web/app/components/rag-pipeline/components/conversion.tsx @@ -1,10 +1,10 @@ -import { useParams } from 'next/navigation' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Confirm from '@/app/components/base/confirm' import Toast from '@/app/components/base/toast' +import { useParams } from '@/next/navigation' import { datasetDetailQueryKeyPrefix } from '@/service/knowledge/use-dataset' import { useInvalid } from '@/service/use-base' import { useConvertDatasetToPipeline } from '@/service/use-pipeline' diff --git a/web/app/components/rag-pipeline/components/panel/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/__tests__/index.spec.tsx index f651b16697..8bf870a344 100644 --- a/web/app/components/rag-pipeline/components/panel/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/__tests__/index.spec.tsx @@ -56,7 +56,7 @@ const { dynamicMocks, mockInputFieldEditorProps } = vi.hoisted(() => { return { dynamicMocks: { createMockComponent }, mockInputFieldEditorProps } }) -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: (_loader: () => Promise<{ default: React.ComponentType }>, _options?: Record) => { return dynamicMocks.createMockComponent() }, diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/index.spec.tsx index e1e6c2f7d5..f30db875b3 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/index.spec.tsx @@ -77,7 +77,7 @@ vi.mock('@/app/components/workflow/header', () => ({ })) const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'test-dataset-id' }), useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx index 345f3626ec..f0b187c0fd 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx @@ -8,7 +8,7 @@ import Publisher from '../index' import Popup from '../popup' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'test-dataset-id' }), useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx index a0baac7785..5d053f083a 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx @@ -19,7 +19,7 @@ let mockPublishedAt: string | undefined = '2024-01-01T00:00:00Z' let mockDraftUpdatedAt: string | undefined = '2024-06-01T00:00:00Z' let mockPipelineId: string | undefined = 'pipeline-123' let mockIsAllowPublishAsCustom = true -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useParams: () => ({ datasetId: 'ds-123' }), useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx index 6d292de6a0..6670a8f767 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx @@ -10,7 +10,6 @@ import { useBoolean, useKeyPress, } from 'ahooks' -import { useParams, useRouter } from 'next/navigation' import { memo, useCallback, @@ -40,6 +39,7 @@ import { useProviderContextSelector } from '@/context/provider-context' import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' import Link from '@/next/link' +import { useParams, useRouter } from '@/next/navigation' import { useInvalidDatasetList } from '@/service/knowledge/use-dataset' import { useInvalid } from '@/service/use-base' import { diff --git a/web/app/components/share/text-generation/__tests__/menu-dropdown.spec.tsx b/web/app/components/share/text-generation/__tests__/menu-dropdown.spec.tsx index 46d229c6b6..7ccd788cb0 100644 --- a/web/app/components/share/text-generation/__tests__/menu-dropdown.spec.tsx +++ b/web/app/components/share/text-generation/__tests__/menu-dropdown.spec.tsx @@ -5,7 +5,7 @@ import MenuDropdown from '../menu-dropdown' const mockReplace = vi.fn() const mockPathname = '/test-path' -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ replace: mockReplace, }), diff --git a/web/app/components/share/text-generation/index.tsx b/web/app/components/share/text-generation/index.tsx index 779358bfc6..6162e2a87b 100644 --- a/web/app/components/share/text-generation/index.tsx +++ b/web/app/components/share/text-generation/index.tsx @@ -4,12 +4,12 @@ import type { InputValueTypes, TextGenerationRunControl } from './types' import type { InstalledApp } from '@/models/explore' import type { VisionFile } from '@/types/app' import { useBoolean } from 'ahooks' -import { useSearchParams } from 'next/navigation' import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' import Toast from '@/app/components/base/toast' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' +import { useSearchParams } from '@/next/navigation' import { cn } from '@/utils/classnames' import { useTextGenerationAppState } from './hooks/use-text-generation-app-state' import { useTextGenerationBatch } from './hooks/use-text-generation-batch' diff --git a/web/app/components/share/text-generation/menu-dropdown.tsx b/web/app/components/share/text-generation/menu-dropdown.tsx index 43856a0e24..49633890d3 100644 --- a/web/app/components/share/text-generation/menu-dropdown.tsx +++ b/web/app/components/share/text-generation/menu-dropdown.tsx @@ -5,7 +5,6 @@ import type { SiteInfo } from '@/models/share' import { RiEqualizer2Line, } from '@remixicon/react' -import { usePathname, useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -18,6 +17,7 @@ import { import ThemeSwitcher from '@/app/components/base/theme-switcher' import { useWebAppStore } from '@/context/web-app-context' import { AccessMode } from '@/models/access-control' +import { usePathname, useRouter } from '@/next/navigation' import { webAppLogout } from '@/service/webapp-auth' import { cn } from '@/utils/classnames' import Divider from '../../base/divider' diff --git a/web/app/components/tools/workflow-tool/__tests__/configure-button.spec.tsx b/web/app/components/tools/workflow-tool/__tests__/configure-button.spec.tsx index e3bdb4e58a..9cd66e37ea 100644 --- a/web/app/components/tools/workflow-tool/__tests__/configure-button.spec.tsx +++ b/web/app/components/tools/workflow-tool/__tests__/configure-button.spec.tsx @@ -11,7 +11,7 @@ import MethodSelector from '../method-selector' // Mock Next.js navigation const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, replace: vi.fn(), diff --git a/web/app/components/tools/workflow-tool/hooks/__tests__/use-configure-button.spec.ts b/web/app/components/tools/workflow-tool/hooks/__tests__/use-configure-button.spec.ts index cf685a7590..ad0dd2eff2 100644 --- a/web/app/components/tools/workflow-tool/hooks/__tests__/use-configure-button.spec.ts +++ b/web/app/components/tools/workflow-tool/hooks/__tests__/use-configure-button.spec.ts @@ -5,7 +5,7 @@ import { InputVarType } from '@/app/components/workflow/types' import { isParametersOutdated, useConfigureButton } from '../use-configure-button' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/components/tools/workflow-tool/hooks/use-configure-button.ts b/web/app/components/tools/workflow-tool/hooks/use-configure-button.ts index 1aa968ddb1..701ae8fd01 100644 --- a/web/app/components/tools/workflow-tool/hooks/use-configure-button.ts +++ b/web/app/components/tools/workflow-tool/hooks/use-configure-button.ts @@ -1,11 +1,11 @@ import type { Emoji, WorkflowToolProviderOutputParameter, WorkflowToolProviderParameter, WorkflowToolProviderRequest, WorkflowToolProviderResponse } from '@/app/components/tools/types' import type { InputVar, Variable } from '@/app/components/workflow/types' import type { PublishWorkflowParams } from '@/types/workflow' -import { useRouter } from 'next/navigation' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import Toast from '@/app/components/base/toast' import { useAppContext } from '@/context/app-context' +import { useRouter } from '@/next/navigation' import { createWorkflowToolProvider, saveWorkflowToolProvider } from '@/service/tools' import { useInvalidateAllWorkflowTools, useInvalidateWorkflowToolDetailByAppID, useWorkflowToolDetailByAppID } from '@/service/use-tools' diff --git a/web/app/components/workflow-app/hooks/use-workflow-run.ts b/web/app/components/workflow-app/hooks/use-workflow-run.ts index ae4a21f5a0..de110f2525 100644 --- a/web/app/components/workflow-app/hooks/use-workflow-run.ts +++ b/web/app/components/workflow-app/hooks/use-workflow-run.ts @@ -4,7 +4,6 @@ import type { IOtherOptions } from '@/service/base' import type { VersionHistory } from '@/types/workflow' import { noop } from 'es-toolkit/function' import { produce } from 'immer' -import { usePathname } from 'next/navigation' import { useCallback, useRef } from 'react' import { useReactFlow, @@ -21,6 +20,7 @@ import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow- import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event' import { useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' +import { usePathname } from '@/next/navigation' import { handleStream, post, sseGet, ssePost } from '@/service/base' import { ContentType } from '@/service/fetch' import { useInvalidAllLastRun, useInvalidateWorkflowRunHistory } from '@/service/use-workflow' diff --git a/web/app/components/workflow-app/index.tsx b/web/app/components/workflow-app/index.tsx index 6a778ab6b8..0e8731869f 100644 --- a/web/app/components/workflow-app/index.tsx +++ b/web/app/components/workflow-app/index.tsx @@ -2,7 +2,6 @@ import type { Features as FeaturesData } from '@/app/components/base/features/types' import type { InjectWorkflowStoreSliceFn } from '@/app/components/workflow/store' -import { useSearchParams } from 'next/navigation' import { useEffect, useMemo, @@ -25,6 +24,7 @@ import { initialNodes, } from '@/app/components/workflow/utils' import { useAppContext } from '@/context/app-context' +import { useSearchParams } from '@/next/navigation' import { fetchRunDetail } from '@/service/log' import { useAppTriggers } from '@/service/use-tools' import { AppModeEnum } from '@/types/app' diff --git a/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx b/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx index 1e40ea65da..44bd1ea775 100644 --- a/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx +++ b/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx @@ -80,7 +80,7 @@ function createMouseEvent() { } as unknown as React.MouseEvent } -vi.mock('next/dynamic', () => ({ +vi.mock('@/next/dynamic', () => ({ default: () => () => null, })) diff --git a/web/app/components/workflow/header/index.tsx b/web/app/components/workflow/header/index.tsx index bf7479b198..5e6b714213 100644 --- a/web/app/components/workflow/header/index.tsx +++ b/web/app/components/workflow/header/index.tsx @@ -1,8 +1,8 @@ import type { HeaderInNormalProps } from './header-in-normal' import type { HeaderInRestoringProps } from './header-in-restoring' import type { HeaderInHistoryProps } from './header-in-view-history' -import { usePathname } from 'next/navigation' import dynamic from '@/next/dynamic' +import { usePathname } from '@/next/navigation' import { useWorkflowMode, } from '../hooks' diff --git a/web/app/education-apply/education-apply-page.tsx b/web/app/education-apply/education-apply-page.tsx index d457409d29..19ef26814d 100644 --- a/web/app/education-apply/education-apply-page.tsx +++ b/web/app/education-apply/education-apply-page.tsx @@ -2,10 +2,6 @@ import { RiExternalLinkLine } from '@remixicon/react' import { noop } from 'es-toolkit/function' -import { - useRouter, - useSearchParams, -} from 'next/navigation' import { useState, } from 'react' @@ -16,6 +12,10 @@ import { useToastContext } from '@/app/components/base/toast/context' import { EDUCATION_VERIFYING_LOCALSTORAGE_ITEM } from '@/app/education-apply/constants' import { useDocLink } from '@/context/i18n' import { useProviderContext } from '@/context/provider-context' +import { + useRouter, + useSearchParams, +} from '@/next/navigation' import { useEducationAdd, useInvalidateEducationStatus, diff --git a/web/app/education-apply/expire-notice-modal.tsx b/web/app/education-apply/expire-notice-modal.tsx index c44ee0f386..fc939ffc3c 100644 --- a/web/app/education-apply/expire-notice-modal.tsx +++ b/web/app/education-apply/expire-notice-modal.tsx @@ -1,6 +1,5 @@ 'use client' import { RiExternalLinkLine } from '@remixicon/react' -import { useRouter } from 'next/navigation' import * as React from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -9,6 +8,7 @@ import { useDocLink } from '@/context/i18n' import { useModalContextSelector } from '@/context/modal-context' import useTimestamp from '@/hooks/use-timestamp' import Link from '@/next/link' +import { useRouter } from '@/next/navigation' import { useEducationVerify } from '@/service/use-education' import { SparklesSoftAccent } from '../components/base/icons/src/public/common' diff --git a/web/app/education-apply/hooks.ts b/web/app/education-apply/hooks.ts index 52acde2975..79faa8b3b2 100644 --- a/web/app/education-apply/hooks.ts +++ b/web/app/education-apply/hooks.ts @@ -3,7 +3,6 @@ import { useDebounceFn, useLocalStorageState } from 'ahooks' import dayjs from 'dayjs' import timezone from 'dayjs/plugin/timezone' import utc from 'dayjs/plugin/utc' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useEffect, @@ -13,6 +12,7 @@ import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/con import { useAppContext } from '@/context/app-context' import { useModalContextSelector } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' +import { useRouter, useSearchParams } from '@/next/navigation' import { useEducationAutocomplete, useEducationVerify } from '@/service/use-education' import { EDUCATION_RE_VERIFY_ACTION, diff --git a/web/app/education-apply/user-info.tsx b/web/app/education-apply/user-info.tsx index 6481194870..dc10af7e3c 100644 --- a/web/app/education-apply/user-info.tsx +++ b/web/app/education-apply/user-info.tsx @@ -1,9 +1,9 @@ -import { useRouter } from 'next/navigation' import { useTranslation } from 'react-i18next' import { Avatar } from '@/app/components/base/avatar' import Button from '@/app/components/base/button' import { Triangle } from '@/app/components/base/icons/src/public/education' import { useAppContext } from '@/context/app-context' +import { useRouter } from '@/next/navigation' import { useLogout } from '@/service/use-common' const UserInfo = () => { diff --git a/web/app/forgot-password/ChangePasswordForm.tsx b/web/app/forgot-password/ChangePasswordForm.tsx index 880b010d9c..00f61cab2c 100644 --- a/web/app/forgot-password/ChangePasswordForm.tsx +++ b/web/app/forgot-password/ChangePasswordForm.tsx @@ -1,12 +1,12 @@ 'use client' import { CheckCircleIcon } from '@heroicons/react/24/solid' -import { useSearchParams } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Loading from '@/app/components/base/loading' import Toast from '@/app/components/base/toast' import { validPassword } from '@/config' +import { useSearchParams } from '@/next/navigation' import { changePasswordWithToken } from '@/service/common' import { useVerifyForgotPasswordToken } from '@/service/use-common' import { cn } from '@/utils/classnames' diff --git a/web/app/forgot-password/ForgotPasswordForm.spec.tsx b/web/app/forgot-password/ForgotPasswordForm.spec.tsx index aa360cb6c3..8ed120d146 100644 --- a/web/app/forgot-password/ForgotPasswordForm.spec.tsx +++ b/web/app/forgot-password/ForgotPasswordForm.spec.tsx @@ -5,7 +5,7 @@ import ForgotPasswordForm from './ForgotPasswordForm' const mockPush = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush }), })) diff --git a/web/app/forgot-password/ForgotPasswordForm.tsx b/web/app/forgot-password/ForgotPasswordForm.tsx index 274c2fd4e6..fdc35c20da 100644 --- a/web/app/forgot-password/ForgotPasswordForm.tsx +++ b/web/app/forgot-password/ForgotPasswordForm.tsx @@ -2,15 +2,15 @@ import type { InitValidateStatusResponse } from '@/models/common' import { useStore } from '@tanstack/react-form' -import { useRouter } from 'next/navigation' - import * as React from 'react' + import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import * as z from 'zod' import Button from '@/app/components/base/button' import { formContext, useAppForm } from '@/app/components/base/form' import { zodSubmitValidator } from '@/app/components/base/form/utils/zod-submit-validator' +import { useRouter } from '@/next/navigation' import { fetchInitValidateStatus, fetchSetupStatus, diff --git a/web/app/forgot-password/page.tsx b/web/app/forgot-password/page.tsx index 338f4eaf13..7014b9e5b6 100644 --- a/web/app/forgot-password/page.tsx +++ b/web/app/forgot-password/page.tsx @@ -1,9 +1,9 @@ 'use client' -import { useSearchParams } from 'next/navigation' import * as React from 'react' import ChangePasswordForm from '@/app/forgot-password/ChangePasswordForm' import { useGlobalPublicStore } from '@/context/global-public-context' import useDocumentTitle from '@/hooks/use-document-title' +import { useSearchParams } from '@/next/navigation' import { cn } from '@/utils/classnames' import Header from '../signin/_header' import ForgotPasswordForm from './ForgotPasswordForm' diff --git a/web/app/init/InitPasswordPopup.tsx b/web/app/init/InitPasswordPopup.tsx index c8598881a3..d2ec3c7e2b 100644 --- a/web/app/init/InitPasswordPopup.tsx +++ b/web/app/init/InitPasswordPopup.tsx @@ -1,10 +1,10 @@ 'use client' import type { InitValidateStatusResponse } from '@/models/common' -import { useRouter } from 'next/navigation' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import useDocumentTitle from '@/hooks/use-document-title' +import { useRouter } from '@/next/navigation' import { fetchInitValidateStatus, initValidate } from '@/service/common' import { basePath } from '@/utils/var' import Loading from '../components/base/loading' diff --git a/web/app/install/installForm.spec.tsx b/web/app/install/installForm.spec.tsx index 17ce35d6a1..1286d02343 100644 --- a/web/app/install/installForm.spec.tsx +++ b/web/app/install/installForm.spec.tsx @@ -7,7 +7,7 @@ import InstallForm from './installForm' const mockPush = vi.fn() const mockReplace = vi.fn() -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useRouter: () => ({ push: mockPush, replace: mockReplace }), })) diff --git a/web/app/install/installForm.tsx b/web/app/install/installForm.tsx index 28c9f0e702..292a922723 100644 --- a/web/app/install/installForm.tsx +++ b/web/app/install/installForm.tsx @@ -1,9 +1,8 @@ 'use client' import type { InitValidateStatusResponse, SetupStatusResponse } from '@/models/common' import { useStore } from '@tanstack/react-form' -import { useRouter } from 'next/navigation' - import * as React from 'react' + import { useEffect } from 'react' import { useTranslation } from 'react-i18next' import * as z from 'zod' @@ -13,9 +12,10 @@ import { zodSubmitValidator } from '@/app/components/base/form/utils/zod-submit- import Input from '@/app/components/base/input' import { validPassword } from '@/config' import { LICENSE_LINK } from '@/constants/link' - import useDocumentTitle from '@/hooks/use-document-title' + import Link from '@/next/link' +import { useRouter } from '@/next/navigation' import { fetchInitValidateStatus, fetchSetupStatus, login, setup } from '@/service/common' import { cn } from '@/utils/classnames' import { encryptPassword as encodePassword } from '@/utils/encryption' diff --git a/web/app/reset-password/check-code/page.tsx b/web/app/reset-password/check-code/page.tsx index cf4a6e6ce4..aac73b8e7d 100644 --- a/web/app/reset-password/check-code/page.tsx +++ b/web/app/reset-password/check-code/page.tsx @@ -1,6 +1,5 @@ 'use client' import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -8,6 +7,7 @@ import Input from '@/app/components/base/input' import Toast from '@/app/components/base/toast' import Countdown from '@/app/components/signin/countdown' import { useLocale } from '@/context/i18n' +import { useRouter, useSearchParams } from '@/next/navigation' import { sendResetPasswordCode, verifyResetPasswordCode } from '@/service/common' export default function CheckCode() { diff --git a/web/app/reset-password/page.tsx b/web/app/reset-password/page.tsx index 6fb399b8de..af9dc544a6 100644 --- a/web/app/reset-password/page.tsx +++ b/web/app/reset-password/page.tsx @@ -1,7 +1,6 @@ 'use client' import { RiArrowLeftLine, RiLockPasswordLine } from '@remixicon/react' import { noop } from 'es-toolkit/function' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -11,6 +10,7 @@ import { emailRegex } from '@/config' import { useLocale } from '@/context/i18n' import useDocumentTitle from '@/hooks/use-document-title' import Link from '@/next/link' +import { useRouter, useSearchParams } from '@/next/navigation' import { sendResetPasswordCode } from '@/service/common' import { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '../components/signin/countdown' diff --git a/web/app/reset-password/set-password/page.tsx b/web/app/reset-password/set-password/page.tsx index bf7947c79d..e187bb28cb 100644 --- a/web/app/reset-password/set-password/page.tsx +++ b/web/app/reset-password/set-password/page.tsx @@ -1,13 +1,13 @@ 'use client' import { RiCheckboxCircleFill } from '@remixicon/react' import { useCountDown } from 'ahooks' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import Toast from '@/app/components/base/toast' import { validPassword } from '@/config' +import { useRouter, useSearchParams } from '@/next/navigation' import { changePasswordWithToken } from '@/service/common' import { cn } from '@/utils/classnames' diff --git a/web/app/routePrefixHandle.tsx b/web/app/routePrefixHandle.tsx index d3a36a51fc..e772c7964a 100644 --- a/web/app/routePrefixHandle.tsx +++ b/web/app/routePrefixHandle.tsx @@ -1,7 +1,7 @@ 'use client' -import { usePathname } from 'next/navigation' import { useEffect } from 'react' +import { usePathname } from '@/next/navigation' import { basePath } from '@/utils/var' export default function RoutePrefixHandle() { diff --git a/web/app/signin/check-code/page.tsx b/web/app/signin/check-code/page.tsx index 24ac92157e..dfd346e502 100644 --- a/web/app/signin/check-code/page.tsx +++ b/web/app/signin/check-code/page.tsx @@ -1,7 +1,6 @@ 'use client' import type { FormEvent } from 'react' import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react' -import { useRouter, useSearchParams } from 'next/navigation' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { trackEvent } from '@/app/components/base/amplitude' @@ -9,8 +8,9 @@ import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import Toast from '@/app/components/base/toast' import Countdown from '@/app/components/signin/countdown' - import { useLocale } from '@/context/i18n' + +import { useRouter, useSearchParams } from '@/next/navigation' import { emailLoginWithCode, sendEMailLoginCode } from '@/service/common' import { encryptVerificationCode } from '@/utils/encryption' import { resolvePostLoginRedirect } from '../utils/post-login-redirect' diff --git a/web/app/signin/components/mail-and-code-auth.tsx b/web/app/signin/components/mail-and-code-auth.tsx index 4454fc821f..86fc0db36b 100644 --- a/web/app/signin/components/mail-and-code-auth.tsx +++ b/web/app/signin/components/mail-and-code-auth.tsx @@ -1,5 +1,4 @@ import type { FormEvent } from 'react' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -8,6 +7,7 @@ import Toast from '@/app/components/base/toast' import { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '@/app/components/signin/countdown' import { emailRegex } from '@/config' import { useLocale } from '@/context/i18n' +import { useRouter, useSearchParams } from '@/next/navigation' import { sendEMailLoginCode } from '@/service/common' type MailAndCodeAuthProps = { diff --git a/web/app/signin/components/mail-and-password-auth.tsx b/web/app/signin/components/mail-and-password-auth.tsx index 0ec7cd8a29..7ce4c9054f 100644 --- a/web/app/signin/components/mail-and-password-auth.tsx +++ b/web/app/signin/components/mail-and-password-auth.tsx @@ -1,6 +1,5 @@ import type { ResponseError } from '@/service/fetch' import { noop } from 'es-toolkit/function' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { trackEvent } from '@/app/components/base/amplitude' @@ -10,6 +9,7 @@ import Toast from '@/app/components/base/toast' import { emailRegex } from '@/config' import { useLocale } from '@/context/i18n' import Link from '@/next/link' +import { useRouter, useSearchParams } from '@/next/navigation' import { login } from '@/service/common' import { setWebAppAccessToken } from '@/service/webapp-auth' import { encryptPassword } from '@/utils/encryption' diff --git a/web/app/signin/components/social-auth.tsx b/web/app/signin/components/social-auth.tsx index 8a610bf093..35517a0505 100644 --- a/web/app/signin/components/social-auth.tsx +++ b/web/app/signin/components/social-auth.tsx @@ -1,7 +1,7 @@ -import { useSearchParams } from 'next/navigation' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import { API_PREFIX } from '@/config' +import { useSearchParams } from '@/next/navigation' import { getPurifyHref } from '@/utils' import { cn } from '@/utils/classnames' import style from '../page.module.css' diff --git a/web/app/signin/components/sso-auth.tsx b/web/app/signin/components/sso-auth.tsx index 43d5d2dfe8..904403ab2c 100644 --- a/web/app/signin/components/sso-auth.tsx +++ b/web/app/signin/components/sso-auth.tsx @@ -1,11 +1,11 @@ 'use client' import type { FC } from 'react' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security' import Toast from '@/app/components/base/toast' +import { useRouter, useSearchParams } from '@/next/navigation' import { getUserOAuth2SSOUrl, getUserOIDCSSOUrl, getUserSAMLSSOUrl } from '@/service/sso' import { SSOProtocol } from '@/types/feature' diff --git a/web/app/signin/invite-settings/page.tsx b/web/app/signin/invite-settings/page.tsx index a8d43d74c4..ac7a7191f8 100644 --- a/web/app/signin/invite-settings/page.tsx +++ b/web/app/signin/invite-settings/page.tsx @@ -2,7 +2,6 @@ import type { Locale } from '@/i18n-config' import { RiAccountCircleLine } from '@remixicon/react' import { noop } from 'es-toolkit/function' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -15,6 +14,7 @@ import { useGlobalPublicStore } from '@/context/global-public-context' import { setLocaleOnClient } from '@/i18n-config' import { languages, LanguagesSupported } from '@/i18n-config/language' import Link from '@/next/link' +import { useRouter, useSearchParams } from '@/next/navigation' import { activateMember } from '@/service/common' import { useInvitationCheck } from '@/service/use-common' import { timezones } from '@/utils/timezone' diff --git a/web/app/signin/normal-form.tsx b/web/app/signin/normal-form.tsx index 314da7616f..1916dd6d1c 100644 --- a/web/app/signin/normal-form.tsx +++ b/web/app/signin/normal-form.tsx @@ -1,5 +1,4 @@ import { RiContractLine, RiDoorLockLine, RiErrorWarningFill } from '@remixicon/react' -import { useRouter, useSearchParams } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -7,6 +6,7 @@ import Toast from '@/app/components/base/toast' import { IS_CE_EDITION } from '@/config' import { useGlobalPublicStore } from '@/context/global-public-context' import Link from '@/next/link' +import { useRouter, useSearchParams } from '@/next/navigation' import { invitationCheck } from '@/service/common' import { useIsLogin } from '@/service/use-common' import { LicenseStatus } from '@/types/feature' diff --git a/web/app/signin/one-more-step.tsx b/web/app/signin/one-more-step.tsx index 099f5d9c0b..1d632e272c 100644 --- a/web/app/signin/one-more-step.tsx +++ b/web/app/signin/one-more-step.tsx @@ -1,6 +1,5 @@ 'use client' import type { Reducer } from 'react' -import { useRouter, useSearchParams } from 'next/navigation' import { useReducer } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -10,6 +9,7 @@ import Tooltip from '@/app/components/base/tooltip' import { LICENSE_LINK } from '@/constants/link' import { languages, LanguagesSupported } from '@/i18n-config/language' import Link from '@/next/link' +import { useRouter, useSearchParams } from '@/next/navigation' import { useOneMoreStep } from '@/service/use-common' import { timezones } from '@/utils/timezone' import Input from '../components/base/input' diff --git a/web/app/signin/page.tsx b/web/app/signin/page.tsx index 6f3632393c..7fad92fe5d 100644 --- a/web/app/signin/page.tsx +++ b/web/app/signin/page.tsx @@ -1,6 +1,6 @@ 'use client' -import { useSearchParams } from 'next/navigation' import { useEffect } from 'react' +import { useSearchParams } from '@/next/navigation' import usePSInfo from '../components/billing/partner-stack/use-ps-info' import NormalForm from './normal-form' import OneMoreStep from './one-more-step' diff --git a/web/app/signup/check-code/page.tsx b/web/app/signup/check-code/page.tsx index c298c11535..00abc280f8 100644 --- a/web/app/signup/check-code/page.tsx +++ b/web/app/signup/check-code/page.tsx @@ -1,7 +1,6 @@ 'use client' import type { MailSendResponse, MailValidityResponse } from '@/service/use-common' import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react' -import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' @@ -9,6 +8,7 @@ import Input from '@/app/components/base/input' import Toast from '@/app/components/base/toast' import Countdown from '@/app/components/signin/countdown' import { useLocale } from '@/context/i18n' +import { useRouter, useSearchParams } from '@/next/navigation' import { useMailValidity, useSendMail } from '@/service/use-common' export default function CheckCode() { diff --git a/web/app/signup/page.tsx b/web/app/signup/page.tsx index a5a8fb40a7..da821ae50e 100644 --- a/web/app/signup/page.tsx +++ b/web/app/signup/page.tsx @@ -1,7 +1,7 @@ 'use client' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' +import { useRouter, useSearchParams } from '@/next/navigation' import MailForm from './components/input-mail' const Signup = () => { diff --git a/web/app/signup/set-password/page.tsx b/web/app/signup/set-password/page.tsx index 69af045f1a..c38fe68803 100644 --- a/web/app/signup/set-password/page.tsx +++ b/web/app/signup/set-password/page.tsx @@ -1,7 +1,6 @@ 'use client' import type { MailRegisterResponse } from '@/service/use-common' import Cookies from 'js-cookie' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { trackEvent } from '@/app/components/base/amplitude' @@ -9,6 +8,7 @@ import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import Toast from '@/app/components/base/toast' import { validPassword } from '@/config' +import { useRouter, useSearchParams } from '@/next/navigation' import { useMailRegister } from '@/service/use-common' import { cn } from '@/utils/classnames' import { sendGAEvent } from '@/utils/gtag' diff --git a/web/context/modal-context.test.tsx b/web/context/modal-context.test.tsx index 98f67a5473..6fac2e0cd5 100644 --- a/web/context/modal-context.test.tsx +++ b/web/context/modal-context.test.tsx @@ -13,7 +13,7 @@ vi.mock('@/config', async (importOriginal) => { } }) -vi.mock('next/navigation', () => ({ +vi.mock('@/next/navigation', () => ({ useSearchParams: vi.fn(() => new URLSearchParams()), })) diff --git a/web/context/web-app-context.tsx b/web/context/web-app-context.tsx index c5488a565c..33679fd44f 100644 --- a/web/context/web-app-context.tsx +++ b/web/context/web-app-context.tsx @@ -3,12 +3,12 @@ import type { FC, PropsWithChildren } from 'react' import type { ChatConfig } from '@/app/components/base/chat/types' import type { AppData, AppMeta } from '@/models/share' -import { usePathname, useSearchParams } from 'next/navigation' import { useEffect } from 'react' import { create } from 'zustand' import { getProcessedSystemVariablesFromUrlParams } from '@/app/components/base/chat/utils' import Loading from '@/app/components/base/loading' import { AccessMode } from '@/models/access-control' +import { usePathname, useSearchParams } from '@/next/navigation' import { useGetWebAppAccessModeByCode } from '@/service/use-share' import { useIsSystemFeaturesPending } from './global-public-context' diff --git a/web/eslint.config.mjs b/web/eslint.config.mjs index 778e81866b..0c7a2554e3 100644 --- a/web/eslint.config.mjs +++ b/web/eslint.config.mjs @@ -17,7 +17,7 @@ const disableRuleAutoFix = !(isInEditorEnv() || isInGitHooksOrLintStaged()) const NEXT_PLATFORM_RESTRICTED_IMPORT_PATHS = [ { name: 'next', - message: 'Import Next APIs from @/next instead of next.', + message: 'Import Next APIs from the corresponding @/next module instead of next.', }, ] @@ -31,24 +31,8 @@ const NEXT_PLATFORM_RESTRICTED_IMPORT_PATTERNS = [ message: 'Do not import next/font. Use the project font styles instead.', }, { - group: ['next/dynamic'], - message: 'Import Next APIs from @/next/dynamic instead of next/dynamic.', - }, - { - group: ['next/headers'], - message: 'Import Next APIs from @/next/headers instead of next/headers.', - }, - { - group: ['next/script'], - message: 'Import Next APIs from @/next/script instead of next/script.', - }, - { - group: ['next/server'], - message: 'Import Next APIs from @/next/server instead of next/server.', - }, - { - group: ['next/link'], - message: 'Import Next APIs from @/next/link instead of next/link.', + group: ['next/*', '!next/font', '!next/font/*', '!next/image', '!next/image/*'], + message: 'Import Next APIs from the corresponding @/next/* module instead of next/*.', }, ] diff --git a/web/hooks/use-import-dsl.ts b/web/hooks/use-import-dsl.ts index 454f580b42..903fd74c5b 100644 --- a/web/hooks/use-import-dsl.ts +++ b/web/hooks/use-import-dsl.ts @@ -3,7 +3,6 @@ import type { DSLImportResponse, } from '@/models/app' import type { AppIconType } from '@/types/app' -import { useRouter } from 'next/navigation' import { useCallback, useRef, @@ -15,6 +14,7 @@ import { usePluginDependencies } from '@/app/components/workflow/plugin-dependen import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useSelector } from '@/context/app-context' import { DSLImportStatus } from '@/models/app' +import { useRouter } from '@/next/navigation' import { importDSL, importDSLConfirm, diff --git a/web/hooks/use-pay.tsx b/web/hooks/use-pay.tsx index a72107daeb..5ce50fdb0f 100644 --- a/web/hooks/use-pay.tsx +++ b/web/hooks/use-pay.tsx @@ -1,10 +1,10 @@ 'use client' import type { IConfirm } from '@/app/components/base/confirm' -import { useRouter, useSearchParams } from 'next/navigation' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import Confirm from '@/app/components/base/confirm' +import { useRouter, useSearchParams } from '@/next/navigation' import { useNotionBinding } from '@/service/use-common' export type ConfirmType = Pick diff --git a/web/next/navigation.ts b/web/next/navigation.ts new file mode 100644 index 0000000000..ec7c112645 --- /dev/null +++ b/web/next/navigation.ts @@ -0,0 +1,8 @@ +export { + useParams, + usePathname, + useRouter, + useSearchParams, + useSelectedLayoutSegment, + useSelectedLayoutSegments, +} from 'next/navigation'