refactor: route next/navigation through compat re-export (#33636)

This commit is contained in:
yyh 2026-03-18 12:57:03 +08:00 committed by GitHub
parent 04c0bf61fa
commit 296b7044af
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
269 changed files with 320 additions and 328 deletions

View File

@ -41,7 +41,7 @@ import userEvent from '@testing-library/user-event'
// Router (if component uses useRouter, usePathname, useSearchParams) // Router (if component uses useRouter, usePathname, useSearchParams)
// WHY: Isolates tests from Next.js routing, enables testing navigation behavior // WHY: Isolates tests from Next.js routing, enables testing navigation behavior
// const mockPush = vi.fn() // const mockPush = vi.fn()
// vi.mock('next/navigation', () => ({ // vi.mock('@/next/navigation', () => ({
// useRouter: () => ({ push: mockPush }), // useRouter: () => ({ push: mockPush }),
// usePathname: () => '/test-path', // usePathname: () => '/test-path',
// })) // }))

View File

@ -29,7 +29,7 @@ const mockOnPlanInfoChanged = vi.fn()
const mockDeleteAppMutation = vi.fn().mockResolvedValue(undefined) const mockDeleteAppMutation = vi.fn().mockResolvedValue(undefined)
let mockDeleteMutationPending = false let mockDeleteMutationPending = false
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: mockRouterPush, 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 }>) => { default: (loader: () => Promise<{ default: React.ComponentType }>) => {
let Component: React.ComponentType<Record<string, unknown>> | null = null let Component: React.ComponentType<Record<string, unknown>> | null = null
loader().then((mod) => { loader().then((mod) => {

View File

@ -38,7 +38,7 @@ let mockShowTagManagementModal = false
const mockRouterPush = vi.fn() const mockRouterPush = vi.fn()
const mockRouterReplace = vi.fn() const mockRouterReplace = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: mockRouterPush, push: mockRouterPush,
replace: mockRouterReplace, replace: mockRouterReplace,
@ -46,7 +46,7 @@ vi.mock('next/navigation', () => ({
useSearchParams: () => new URLSearchParams(), useSearchParams: () => new URLSearchParams(),
})) }))
vi.mock('next/dynamic', () => ({ vi.mock('@/next/dynamic', () => ({
default: (_loader: () => Promise<{ default: React.ComponentType }>) => { default: (_loader: () => Promise<{ default: React.ComponentType }>) => {
const LazyComponent = (props: Record<string, unknown>) => { const LazyComponent = (props: Record<string, unknown>) => {
return <div data-testid="dynamic-component" {...props} /> return <div data-testid="dynamic-component" {...props} />

View File

@ -35,7 +35,7 @@ const mockRouterPush = vi.fn()
const mockRouterReplace = vi.fn() const mockRouterReplace = vi.fn()
const mockOnPlanInfoChanged = vi.fn() const mockOnPlanInfoChanged = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: mockRouterPush, push: mockRouterPush,
replace: mockRouterReplace, replace: mockRouterReplace,
@ -117,7 +117,7 @@ vi.mock('ahooks', async () => {
}) })
// Mock dynamically loaded modals with test stubs // Mock dynamically loaded modals with test stubs
vi.mock('next/dynamic', () => ({ vi.mock('@/next/dynamic', () => ({
default: (loader: () => Promise<{ default: React.ComponentType }>) => { default: (loader: () => Promise<{ default: React.ComponentType }>) => {
let Component: React.ComponentType<Record<string, unknown>> | null = null let Component: React.ComponentType<Record<string, unknown>> | null = null
loader().then((mod) => { loader().then((mod) => {

View File

@ -64,7 +64,7 @@ vi.mock('@/service/use-education', () => ({
// ─── Navigation mocks ─────────────────────────────────────────────────────── // ─── Navigation mocks ───────────────────────────────────────────────────────
const mockRouterPush = vi.fn() const mockRouterPush = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: mockRouterPush }), useRouter: () => ({ push: mockRouterPush }),
usePathname: () => '/billing', usePathname: () => '/billing',
useSearchParams: () => new URLSearchParams(), useSearchParams: () => new URLSearchParams(),

View File

@ -54,7 +54,7 @@ vi.mock('@/app/components/base/toast', () => ({
})) }))
// ─── Navigation mocks ─────────────────────────────────────────────────────── // ─── Navigation mocks ───────────────────────────────────────────────────────
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/billing', usePathname: () => '/billing',
useSearchParams: () => new URLSearchParams(), useSearchParams: () => new URLSearchParams(),

View File

@ -63,7 +63,7 @@ vi.mock('@/service/use-billing', () => ({
})) }))
// ─── Navigation mocks ─────────────────────────────────────────────────────── // ─── Navigation mocks ───────────────────────────────────────────────────────
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: mockRouterPush }), useRouter: () => ({ push: mockRouterPush }),
usePathname: () => '/billing', usePathname: () => '/billing',
useSearchParams: () => new URLSearchParams(), useSearchParams: () => new URLSearchParams(),

View File

@ -18,7 +18,7 @@ let mockSearchParams = new URLSearchParams()
const mockMutateAsync = vi.fn() const mockMutateAsync = vi.fn()
// ─── Module mocks ──────────────────────────────────────────────────────────── // ─── Module mocks ────────────────────────────────────────────────────────────
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useSearchParams: () => mockSearchParams, useSearchParams: () => mockSearchParams,
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/', usePathname: () => '/',

View File

@ -51,7 +51,7 @@ vi.mock('@/hooks/use-async-window-open', () => ({
})) }))
// ─── Navigation mocks ─────────────────────────────────────────────────────── // ─── Navigation mocks ───────────────────────────────────────────────────────
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/billing', usePathname: () => '/billing',
useSearchParams: () => new URLSearchParams(), useSearchParams: () => new URLSearchParams(),

View File

@ -13,7 +13,7 @@ import { DataSourceType } from '@/models/datasets'
import { renderHookWithNuqs } from '@/test/nuqs-testing' import { renderHookWithNuqs } from '@/test/nuqs-testing'
const mockPush = vi.fn() const mockPush = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useSearchParams: () => new URLSearchParams(''), useSearchParams: () => new URLSearchParams(''),
useRouter: () => ({ push: mockPush }), useRouter: () => ({ push: mockPush }),
usePathname: () => '/datasets/ds-1/documents', usePathname: () => '/datasets/ds-1/documents',

View File

@ -7,12 +7,12 @@ import type { Mock } from 'vitest'
*/ */
import { fireEvent, render, screen } from '@testing-library/react' 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' import { useDocumentDetail, useDocumentMetadata } from '@/service/knowledge/use-document'
// Mock Next.js router // Mock Next.js router
const mockPush = vi.fn() const mockPush = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: vi.fn(() => ({ useRouter: vi.fn(() => ({
push: mockPush, push: mockPush,
})), })),

View File

@ -8,7 +8,7 @@ const replaceMock = vi.fn()
const backMock = vi.fn() const backMock = vi.fn()
const useSearchParamsMock = vi.fn(() => new URLSearchParams()) const useSearchParamsMock = vi.fn(() => new URLSearchParams())
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
usePathname: vi.fn(() => '/chatbot/test-app'), usePathname: vi.fn(() => '/chatbot/test-app'),
useRouter: vi.fn(() => ({ useRouter: vi.fn(() => ({
replace: replaceMock, replace: replaceMock,

View File

@ -4,7 +4,7 @@ import WebAppStoreProvider, { useWebAppStore } from '@/context/web-app-context'
import { AccessMode } from '@/models/access-control' import { AccessMode } from '@/models/access-control'
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
usePathname: vi.fn(() => '/chatbot/sample-app'), usePathname: vi.fn(() => '/chatbot/sample-app'),
useSearchParams: vi.fn(() => { useSearchParams: vi.fn(() => {
const params = new URLSearchParams() const params = new URLSearchParams()

View File

@ -19,7 +19,7 @@ const mockUninstall = vi.fn()
const mockUpdatePinStatus = vi.fn() const mockUpdatePinStatus = vi.fn()
let mockInstalledApps: InstalledApp[] = [] let mockInstalledApps: InstalledApp[] = []
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useSelectedLayoutSegments: () => mockSegments, useSelectedLayoutSegments: () => mockSegments,
useRouter: () => ({ useRouter: () => ({
push: mockPush, push: mockPush,

View File

@ -5,7 +5,7 @@ import TextGeneration from '@/app/components/share/text-generation'
const useSearchParamsMock = vi.fn(() => new URLSearchParams()) const useSearchParamsMock = vi.fn(() => new URLSearchParams())
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useSearchParams: () => useSearchParamsMock(), useSearchParams: () => useSearchParamsMock(),
})) }))

View File

@ -13,7 +13,6 @@ import {
RiTerminalWindowLine, RiTerminalWindowLine,
} from '@remixicon/react' } from '@remixicon/react'
import { useUnmount } from 'ahooks' import { useUnmount } from 'ahooks'
import { usePathname, useRouter } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -26,6 +25,7 @@ import { useAppContext } from '@/context/app-context'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import useDocumentTitle from '@/hooks/use-document-title' import useDocumentTitle from '@/hooks/use-document-title'
import dynamic from '@/next/dynamic' import dynamic from '@/next/dynamic'
import { usePathname, useRouter } from '@/next/navigation'
import { fetchAppDetailDirect } from '@/service/apps' import { fetchAppDetailDirect } from '@/service/apps'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'

View File

@ -7,7 +7,6 @@ import {
RiEqualizer2Line, RiEqualizer2Line,
} from '@remixicon/react' } from '@remixicon/react'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import { usePathname } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -17,6 +16,7 @@ import Loading from '@/app/components/base/loading'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import Indicator from '@/app/components/header/indicator' import Indicator from '@/app/components/header/indicator'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { usePathname } from '@/next/navigation'
import { fetchTracingConfig as doFetchTracingConfig, fetchTracingStatus, updateTracingStatus } from '@/service/apps' import { fetchTracingConfig as doFetchTracingConfig, fetchTracingStatus, updateTracingStatus } from '@/service/apps'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'
import ConfigButton from './config-button' import ConfigButton from './config-button'

View File

@ -9,7 +9,6 @@ import {
RiFocus2Fill, RiFocus2Fill,
RiFocus2Line, RiFocus2Line,
} from '@remixicon/react' } from '@remixicon/react'
import { usePathname } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useEffect, useMemo, useState } from 'react' import { useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -23,6 +22,7 @@ import DatasetDetailContext from '@/context/dataset-detail'
import { useEventEmitterContextContext } from '@/context/event-emitter' import { useEventEmitterContextContext } from '@/context/event-emitter'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import useDocumentTitle from '@/hooks/use-document-title' import useDocumentTitle from '@/hooks/use-document-title'
import { usePathname } from '@/next/navigation'
import { useDatasetDetail, useDatasetRelatedApps } from '@/service/knowledge/use-dataset' import { useDatasetDetail, useDatasetRelatedApps } from '@/service/knowledge/use-dataset'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'

View File

@ -6,7 +6,7 @@ import DatasetsLayout from './layout'
const mockReplace = vi.fn() const mockReplace = vi.fn()
const mockUseAppContext = vi.fn() const mockUseAppContext = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
replace: mockReplace, replace: mockReplace,
}), }),

View File

@ -1,11 +1,11 @@
'use client' 'use client'
import { useRouter } from 'next/navigation'
import { useEffect } from 'react' import { useEffect } from 'react'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { ExternalApiPanelProvider } from '@/context/external-api-panel-context' import { ExternalApiPanelProvider } from '@/context/external-api-panel-context'
import { ExternalKnowledgeApiProvider } from '@/context/external-knowledge-api-context' import { ExternalKnowledgeApiProvider } from '@/context/external-knowledge-api-context'
import { useRouter } from '@/next/navigation'
export default function DatasetsLayout({ children }: { children: React.ReactNode }) { export default function DatasetsLayout({ children }: { children: React.ReactNode }) {
const { isCurrentWorkspaceEditor, isCurrentWorkspaceDatasetOperator, currentWorkspace, isLoadingCurrentWorkspace } = useAppContext() const { isCurrentWorkspaceEditor, isCurrentWorkspaceDatasetOperator, currentWorkspace, isLoadingCurrentWorkspace } = useAppContext()

View File

@ -1,15 +1,15 @@
'use client' 'use client'
import {
useRouter,
useSearchParams,
} from 'next/navigation'
import { import {
useEffect, useEffect,
useMemo, useMemo,
} from 'react' } from 'react'
import EducationApplyPage from '@/app/education-apply/education-apply-page' import EducationApplyPage from '@/app/education-apply/education-apply-page'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import {
useRouter,
useSearchParams,
} from '@/next/navigation'
export default function EducationApply() { export default function EducationApply() {
const router = useRouter() const router = useRouter()

View File

@ -6,7 +6,7 @@ const mockReplace = vi.fn()
const mockUseAppContext = vi.fn() const mockUseAppContext = vi.fn()
let mockPathname = '/apps' let mockPathname = '/apps'
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
usePathname: () => mockPathname, usePathname: () => mockPathname,
useRouter: () => ({ useRouter: () => ({
replace: mockReplace, replace: mockReplace,

View File

@ -1,10 +1,10 @@
'use client' 'use client'
import type { ReactNode } from 'react' import type { ReactNode } from 'react'
import { usePathname, useRouter } from 'next/navigation'
import { useEffect } from 'react' import { useEffect } from 'react'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { usePathname, useRouter } from '@/next/navigation'
const datasetOperatorRedirectRoutes = ['/apps', '/app', '/explore', '/tools'] as const const datasetOperatorRedirectRoutes = ['/apps', '/app', '/explore', '/tools'] as const

View File

@ -9,7 +9,6 @@ import {
RiInformation2Fill, RiInformation2Fill,
} from '@remixicon/react' } from '@remixicon/react'
import { produce } from 'immer' import { produce } from 'immer'
import { useParams } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useEffect, useMemo, useState } from 'react' import { useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next' 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 Loading from '@/app/components/base/loading'
import DifyLogo from '@/app/components/base/logo/dify-logo' import DifyLogo from '@/app/components/base/logo/dify-logo'
import useDocumentTitle from '@/hooks/use-document-title' import useDocumentTitle from '@/hooks/use-document-title'
import { useParams } from '@/next/navigation'
import { useGetHumanInputForm, useSubmitHumanInputForm } from '@/service/use-share' import { useGetHumanInputForm, useSubmitHumanInputForm } from '@/service/use-share'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'

View File

@ -1,12 +1,12 @@
'use client' 'use client'
import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect } from 'react' import { useCallback, useEffect } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import AppUnavailable from '@/app/components/base/app-unavailable' import AppUnavailable from '@/app/components/base/app-unavailable'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import { useWebAppStore } from '@/context/web-app-context' import { useWebAppStore } from '@/context/web-app-context'
import { usePathname, useRouter, useSearchParams } from '@/next/navigation'
import { useGetUserCanAccessApp } from '@/service/access-control' import { useGetUserCanAccessApp } from '@/service/access-control'
import { useGetWebAppInfo, useGetWebAppMeta, useGetWebAppParams } from '@/service/use-share' import { useGetWebAppInfo, useGetWebAppMeta, useGetWebAppParams } from '@/service/use-share'
import { webAppLogout } from '@/service/webapp-auth' import { webAppLogout } from '@/service/webapp-auth'

View File

@ -1,11 +1,11 @@
'use client' 'use client'
import type { FC, PropsWithChildren } from 'react' import type { FC, PropsWithChildren } from 'react'
import { useRouter, useSearchParams } from 'next/navigation'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import AppUnavailable from '@/app/components/base/app-unavailable' import AppUnavailable from '@/app/components/base/app-unavailable'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import { useWebAppStore } from '@/context/web-app-context' import { useWebAppStore } from '@/context/web-app-context'
import { useRouter, useSearchParams } from '@/next/navigation'
import { fetchAccessToken } from '@/service/share' import { fetchAccessToken } from '@/service/share'
import { setWebAppAccessToken, setWebAppPassport, webAppLoginStatus, webAppLogout } from '@/service/webapp-auth' import { setWebAppAccessToken, setWebAppPassport, webAppLoginStatus, webAppLogout } from '@/service/webapp-auth'

View File

@ -1,14 +1,14 @@
'use client' 'use client'
import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react' import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react'
import { useRouter, useSearchParams } from 'next/navigation'
import { useState } from 'react' import { useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Input from '@/app/components/base/input' import Input from '@/app/components/base/input'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import Countdown from '@/app/components/signin/countdown' import Countdown from '@/app/components/signin/countdown'
import { useLocale } from '@/context/i18n' import { useLocale } from '@/context/i18n'
import { useRouter, useSearchParams } from '@/next/navigation'
import { sendWebAppResetPasswordCode, verifyWebAppResetPasswordCode } from '@/service/common' import { sendWebAppResetPasswordCode, verifyWebAppResetPasswordCode } from '@/service/common'
export default function CheckCode() { export default function CheckCode() {

View File

@ -1,7 +1,6 @@
'use client' 'use client'
import { RiArrowLeftLine, RiLockPasswordLine } from '@remixicon/react' import { RiArrowLeftLine, RiLockPasswordLine } from '@remixicon/react'
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { useRouter, useSearchParams } from 'next/navigation'
import { useState } from 'react' import { useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' 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 { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '@/app/components/signin/countdown'
import { emailRegex } from '@/config' import { emailRegex } from '@/config'
import { useLocale } from '@/context/i18n' import { useLocale } from '@/context/i18n'
import useDocumentTitle from '@/hooks/use-document-title' import useDocumentTitle from '@/hooks/use-document-title'
import Link from '@/next/link' import Link from '@/next/link'
import { useRouter, useSearchParams } from '@/next/navigation'
import { sendResetPasswordCode } from '@/service/common' import { sendResetPasswordCode } from '@/service/common'
export default function CheckCode() { export default function CheckCode() {

View File

@ -1,13 +1,13 @@
'use client' 'use client'
import { RiCheckboxCircleFill } from '@remixicon/react' import { RiCheckboxCircleFill } from '@remixicon/react'
import { useCountDown } from 'ahooks' import { useCountDown } from 'ahooks'
import { useRouter, useSearchParams } from 'next/navigation'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Input from '@/app/components/base/input' import Input from '@/app/components/base/input'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import { validPassword } from '@/config' import { validPassword } from '@/config'
import { useRouter, useSearchParams } from '@/next/navigation'
import { changeWebAppPasswordWithToken } from '@/service/common' import { changeWebAppPasswordWithToken } from '@/service/common'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'

View File

@ -1,7 +1,6 @@
'use client' 'use client'
import type { FormEvent } from 'react' import type { FormEvent } from 'react'
import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react' import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react'
import { useRouter, useSearchParams } from 'next/navigation'
import { useCallback, useEffect, useRef, useState } from 'react' import { useCallback, useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' 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 Countdown from '@/app/components/signin/countdown'
import { useLocale } from '@/context/i18n' import { useLocale } from '@/context/i18n'
import { useWebAppStore } from '@/context/web-app-context' import { useWebAppStore } from '@/context/web-app-context'
import { useRouter, useSearchParams } from '@/next/navigation'
import { sendWebAppEMailLoginCode, webAppEmailLoginWithCode } from '@/service/common' import { sendWebAppEMailLoginCode, webAppEmailLoginWithCode } from '@/service/common'
import { fetchAccessToken } from '@/service/share' import { fetchAccessToken } from '@/service/share'
import { setWebAppAccessToken, setWebAppPassport } from '@/service/webapp-auth' import { setWebAppAccessToken, setWebAppPassport } from '@/service/webapp-auth'

View File

@ -1,11 +1,11 @@
'use client' 'use client'
import { useRouter, useSearchParams } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect } from 'react' import { useCallback, useEffect } from 'react'
import AppUnavailable from '@/app/components/base/app-unavailable' import AppUnavailable from '@/app/components/base/app-unavailable'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
import { useRouter, useSearchParams } from '@/next/navigation'
import { fetchWebOAuth2SSOUrl, fetchWebOIDCSSOUrl, fetchWebSAMLSSOUrl } from '@/service/share' import { fetchWebOAuth2SSOUrl, fetchWebOIDCSSOUrl, fetchWebSAMLSSOUrl } from '@/service/share'
import { SSOProtocol } from '@/types/feature' import { SSOProtocol } from '@/types/feature'

View File

@ -1,5 +1,4 @@
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { useRouter, useSearchParams } from 'next/navigation'
import { useState } from 'react' import { useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' 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 { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '@/app/components/signin/countdown'
import { emailRegex } from '@/config' import { emailRegex } from '@/config'
import { useLocale } from '@/context/i18n' import { useLocale } from '@/context/i18n'
import { useRouter, useSearchParams } from '@/next/navigation'
import { sendWebAppEMailLoginCode } from '@/service/common' import { sendWebAppEMailLoginCode } from '@/service/common'
export default function MailAndCodeAuth() { export default function MailAndCodeAuth() {

View File

@ -1,6 +1,5 @@
'use client' 'use client'
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { useRouter, useSearchParams } from 'next/navigation'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
@ -10,6 +9,7 @@ import { emailRegex } from '@/config'
import { useLocale } from '@/context/i18n' import { useLocale } from '@/context/i18n'
import { useWebAppStore } from '@/context/web-app-context' import { useWebAppStore } from '@/context/web-app-context'
import Link from '@/next/link' import Link from '@/next/link'
import { useRouter, useSearchParams } from '@/next/navigation'
import { webAppLogin } from '@/service/common' import { webAppLogin } from '@/service/common'
import { fetchAccessToken } from '@/service/share' import { fetchAccessToken } from '@/service/share'
import { setWebAppAccessToken, setWebAppPassport } from '@/service/webapp-auth' import { setWebAppAccessToken, setWebAppPassport } from '@/service/webapp-auth'

View File

@ -1,11 +1,11 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import { useRouter, useSearchParams } from 'next/navigation'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security' import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import { useRouter, useSearchParams } from '@/next/navigation'
import { fetchMembersOAuth2SSOUrl, fetchMembersOIDCSSOUrl, fetchMembersSAMLSSOUrl } from '@/service/share' import { fetchMembersOAuth2SSOUrl, fetchMembersOIDCSSOUrl, fetchMembersSAMLSSOUrl } from '@/service/share'
import { SSOProtocol } from '@/types/feature' import { SSOProtocol } from '@/types/feature'

View File

@ -1,6 +1,5 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import { useRouter, useSearchParams } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback } from 'react' import { useCallback } from 'react'
import { useTranslation } from 'react-i18next' 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 { useGlobalPublicStore } from '@/context/global-public-context'
import { useWebAppStore } from '@/context/web-app-context' import { useWebAppStore } from '@/context/web-app-context'
import { AccessMode } from '@/models/access-control' import { AccessMode } from '@/models/access-control'
import { useRouter, useSearchParams } from '@/next/navigation'
import { webAppLogout } from '@/service/webapp-auth' import { webAppLogout } from '@/service/webapp-auth'
import ExternalMemberSsoAuth from './components/external-member-sso-auth' import ExternalMemberSsoAuth from './components/external-member-sso-auth'
import NormalForm from './normalForm' import NormalForm from './normalForm'

View File

@ -1,7 +1,6 @@
import type { ResponseError } from '@/service/fetch' import type { ResponseError } from '@/service/fetch'
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { useRouter } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useState } from 'react' import { useState } from 'react'
import { Trans, useTranslation } from 'react-i18next' 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 Input from '@/app/components/base/input'
import Modal from '@/app/components/base/modal' import Modal from '@/app/components/base/modal'
import { ToastContext } from '@/app/components/base/toast/context' import { ToastContext } from '@/app/components/base/toast/context'
import { useRouter } from '@/next/navigation'
import { import {
checkEmailExisted, checkEmailExisted,
resetEmail, resetEmail,

View File

@ -3,7 +3,6 @@ import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/r
import { import {
RiGraduationCapFill, RiGraduationCapFill,
} from '@remixicon/react' } from '@remixicon/react'
import { useRouter } from 'next/navigation'
import { Fragment } from 'react' import { Fragment } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { resetUser } from '@/app/components/base/amplitude/utils' 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 { LogOut01 } from '@/app/components/base/icons/src/vender/line/general'
import PremiumBadge from '@/app/components/base/premium-badge' import PremiumBadge from '@/app/components/base/premium-badge'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import { useRouter } from '@/next/navigation'
import { useLogout, useUserProfile } from '@/service/use-common' import { useLogout, useUserProfile } from '@/service/use-common'
export type IAppSelector = { export type IAppSelector = {

View File

@ -1,5 +1,4 @@
'use client' 'use client'
import { useRouter } from 'next/navigation'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' 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 Textarea from '@/app/components/base/textarea'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { useRouter } from '@/next/navigation'
import { useLogout } from '@/service/use-common' import { useLogout } from '@/service/use-common'
import { useDeleteAccountFeedback } from '../state' import { useDeleteAccountFeedback } from '../state'

View File

@ -1,11 +1,11 @@
'use client' 'use client'
import { RiArrowRightUpLine, RiRobot2Line } from '@remixicon/react' import { RiArrowRightUpLine, RiRobot2Line } from '@remixicon/react'
import { useRouter } from 'next/navigation'
import { useCallback } from 'react' import { useCallback } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import DifyLogo from '@/app/components/base/logo/dify-logo' import DifyLogo from '@/app/components/base/logo/dify-logo'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
import { useRouter } from '@/next/navigation'
import Avatar from './avatar' import Avatar from './avatar'
const Header = () => { const Header = () => {

View File

@ -7,7 +7,6 @@ import {
RiMailLine, RiMailLine,
RiTranslate2, RiTranslate2,
} from '@remixicon/react' } from '@remixicon/react'
import { useRouter, useSearchParams } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useEffect, useRef } from 'react' import { useEffect, useRef } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -17,6 +16,7 @@ import Loading from '@/app/components/base/loading'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
import { setPostLoginRedirect } from '@/app/signin/utils/post-login-redirect' import { setPostLoginRedirect } from '@/app/signin/utils/post-login-redirect'
import { useRouter, useSearchParams } from '@/next/navigation'
import { useIsLogin, useUserProfile } from '@/service/use-common' import { useIsLogin, useUserProfile } from '@/service/use-common'
import { useAuthorizeOAuthApp, useOAuthAppInfo } from '@/service/use-oauth' import { useAuthorizeOAuthApp, useOAuthAppInfo } from '@/service/use-oauth'

View File

@ -1,11 +1,11 @@
'use client' 'use client'
import { useRouter, useSearchParams } from 'next/navigation'
import { useEffect } from 'react' import { useEffect } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import useDocumentTitle from '@/hooks/use-document-title' import useDocumentTitle from '@/hooks/use-document-title'
import { useRouter, useSearchParams } from '@/next/navigation'
import { useInvitationCheck } from '@/service/use-common' import { useInvitationCheck } from '@/service/use-common'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'

View File

@ -2,13 +2,13 @@
import type { ReactNode } from 'react' import type { ReactNode } from 'react'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import { parseAsBoolean, useQueryState } from 'nuqs' import { parseAsBoolean, useQueryState } from 'nuqs'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { import {
EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION, EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION,
EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, EDUCATION_VERIFYING_LOCALSTORAGE_ITEM,
} from '@/app/education-apply/constants' } from '@/app/education-apply/constants'
import { usePathname, useRouter, useSearchParams } from '@/next/navigation'
import { sendGAEvent } from '@/utils/gtag' import { sendGAEvent } from '@/utils/gtag'
import { fetchSetupStatusWithCache } from '@/utils/setup-status' import { fetchSetupStatusWithCache } from '@/utils/setup-status'
import { resolvePostLoginRedirect } from '../signin/utils/post-login-redirect' import { resolvePostLoginRedirect } from '../signin/utils/post-login-redirect'

View File

@ -19,7 +19,7 @@ vi.mock('zustand/react/shallow', () => ({
useShallow: (fn: unknown) => fn, useShallow: (fn: unknown) => fn,
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
usePathname: () => mockPathname, usePathname: () => mockPathname,
})) }))

View File

@ -7,7 +7,7 @@ import { render } from '@testing-library/react'
import * as React from 'react' import * as React from 'react'
// Mock Next.js navigation // Mock Next.js navigation
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useSelectedLayoutSegment: () => 'overview', useSelectedLayoutSegment: () => 'overview',
})) }))

View File

@ -5,7 +5,7 @@ import * as React from 'react'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
import AppInfoModals from '../app-info-modals' import AppInfoModals from '../app-info-modals'
vi.mock('next/dynamic', () => ({ vi.mock('@/next/dynamic', () => ({
default: (loader: () => Promise<{ default: React.ComponentType }>) => { default: (loader: () => Promise<{ default: React.ComponentType }>) => {
const LazyComp = React.lazy(loader) const LazyComp = React.lazy(loader)
return function DynamicWrapper(props: Record<string, unknown>) { return function DynamicWrapper(props: Record<string, unknown>) {

View File

@ -23,7 +23,7 @@ let mockAppDetail: Record<string, unknown> | undefined = {
icon_background: '#FFEAD5', icon_background: '#FFEAD5',
} }
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ replace: mockReplace }), useRouter: () => ({ replace: mockReplace }),
})) }))

View File

@ -1,7 +1,6 @@
import type { DuplicateAppModalProps } from '@/app/components/app/duplicate-modal' import type { DuplicateAppModalProps } from '@/app/components/app/duplicate-modal'
import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal' import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal'
import type { EnvironmentVariable } from '@/app/components/workflow/types' import type { EnvironmentVariable } from '@/app/components/workflow/types'
import { useRouter } from 'next/navigation'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector' 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 { ToastContext } from '@/app/components/base/toast/context'
import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import { useRouter } from '@/next/navigation'
import { copyApp, deleteApp, exportAppConfig, updateAppInfo } from '@/service/apps' import { copyApp, deleteApp, exportAppConfig, updateAppInfo } from '@/service/apps'
import { useInvalidateAppList } from '@/service/use-apps' import { useInvalidateAppList } from '@/service/use-apps'
import { fetchWorkflowDraft } from '@/service/workflow' import { fetchWorkflowDraft } from '@/service/workflow'

View File

@ -80,7 +80,7 @@ const createDataset = (overrides: Partial<DataSet> = {}): DataSet => ({
...overrides, ...overrides,
}) })
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ replace: mockReplace }), useRouter: () => ({ replace: mockReplace }),
})) }))

View File

@ -90,7 +90,7 @@ const createDataset = (overrides: Partial<DataSet> = {}): DataSet => ({
...overrides, ...overrides,
}) })
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
replace: mockReplace, replace: mockReplace,
}), }),

View File

@ -1,11 +1,11 @@
import type { DataSet } from '@/models/datasets' import type { DataSet } from '@/models/datasets'
import { RiMoreFill } from '@remixicon/react' import { RiMoreFill } from '@remixicon/react'
import { useRouter } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useSelector as useAppContextWithSelector } from '@/context/app-context' import { useSelector as useAppContextWithSelector } from '@/context/app-context'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import { useRouter } from '@/next/navigation'
import { checkIsUsedInApp, deleteDataset } from '@/service/datasets' import { checkIsUsedInApp, deleteDataset } from '@/service/datasets'
import { datasetDetailQueryKeyPrefix, useInvalidDatasetList } from '@/service/knowledge/use-dataset' import { datasetDetailQueryKeyPrefix, useInvalidDatasetList } from '@/service/knowledge/use-dataset'
import { useInvalid } from '@/service/use-base' import { useInvalid } from '@/service/use-base'

View File

@ -1,12 +1,12 @@
import type { NavIcon } from './nav-link' import type { NavIcon } from './nav-link'
import { useHover, useKeyPress } from 'ahooks' import { useHover, useKeyPress } from 'ahooks'
import { usePathname } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { useShallow } from 'zustand/react/shallow' import { useShallow } from 'zustand/react/shallow'
import { useStore as useAppStore } from '@/app/components/app/store' import { useStore as useAppStore } from '@/app/components/app/store'
import { useEventEmitterContextContext } from '@/context/event-emitter' import { useEventEmitterContextContext } from '@/context/event-emitter'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import { usePathname } from '@/next/navigation'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Divider from '../base/divider' import Divider from '../base/divider'
import { getKeyboardKeyCodeBySystem } from '../workflow/utils' import { getKeyboardKeyCodeBySystem } from '../workflow/utils'

View File

@ -4,7 +4,7 @@ import * as React from 'react'
import NavLink from '..' import NavLink from '..'
// Mock Next.js navigation // Mock Next.js navigation
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useSelectedLayoutSegment: () => 'overview', useSelectedLayoutSegment: () => 'overview',
})) }))

View File

@ -1,8 +1,8 @@
'use client' 'use client'
import type { RemixiconComponentType } from '@remixicon/react' import type { RemixiconComponentType } from '@remixicon/react'
import { useSelectedLayoutSegment } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import Link from '@/next/link' import Link from '@/next/link'
import { useSelectedLayoutSegment } from '@/next/navigation'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'
export type NavIcon = React.ComponentType< export type NavIcon = React.ComponentType<

View File

@ -5,7 +5,7 @@ import * as React from 'react'
import ContextVar from './index' import ContextVar from './index'
// Mock external dependencies only // Mock external dependencies only
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/test', usePathname: () => '/test',
})) }))

View File

@ -5,7 +5,7 @@ import * as React from 'react'
import VarPicker from './var-picker' import VarPicker from './var-picker'
// Mock external dependencies only // Mock external dependencies only
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/test', usePathname: () => '/test',
})) }))

View File

@ -155,7 +155,7 @@ vi.mock('@/service/debug', () => ({
stopChatMessageResponding: mockStopChatMessageResponding, stopChatMessageResponding: mockStopChatMessageResponding,
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/test', usePathname: () => '/test',
useParams: () => ({}), useParams: () => ({}),

View File

@ -23,7 +23,6 @@ import { useBoolean, useGetState } from 'ahooks'
import { clone } from 'es-toolkit/object' import { clone } from 'es-toolkit/object'
import { isEqual } from 'es-toolkit/predicate' import { isEqual } from 'es-toolkit/predicate'
import { produce } from 'immer' import { produce } from 'immer'
import { usePathname } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -72,6 +71,7 @@ import { useModalContext } from '@/context/modal-context'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import { PromptMode } from '@/models/debug' import { PromptMode } from '@/models/debug'
import { usePathname } from '@/next/navigation'
import { fetchAppDetailDirect, updateAppModelConfig } from '@/service/apps' import { fetchAppDetailDirect, updateAppModelConfig } from '@/service/apps'
import { fetchDatasets } from '@/service/datasets' import { fetchDatasets } from '@/service/datasets'
import { fetchCollectionList } from '@/service/tools' import { fetchCollectionList } from '@/service/tools'

View File

@ -62,7 +62,7 @@ vi.mock('@/app/components/workflow/plugin-dependency/hooks', () => ({
vi.mock('@/utils/app-redirection', () => ({ vi.mock('@/utils/app-redirection', () => ({
getRedirection: vi.fn(), getRedirection: vi.fn(),
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
})) }))

View File

@ -4,7 +4,6 @@ import type { CreateAppModalProps } from '@/app/components/explore/create-app-mo
import type { App } from '@/models/explore' import type { App } from '@/models/explore'
import { RiRobot2Line } from '@remixicon/react' import { RiRobot2Line } from '@remixicon/react'
import { useDebounceFn } from 'ahooks' import { useDebounceFn } from 'ahooks'
import { useRouter } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useMemo, useState } from 'react' import { useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next' 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 { NEED_REFRESH_APP_LIST_KEY } from '@/config'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { DSLImportMode } from '@/models/app' import { DSLImportMode } from '@/models/app'
import { useRouter } from '@/next/navigation'
import { importDSL } from '@/service/apps' import { importDSL } from '@/service/apps'
import { fetchAppDetail } from '@/service/explore' import { fetchAppDetail } from '@/service/explore'
import { useExploreAppList } from '@/service/use-explore' import { useExploreAppList } from '@/service/use-explore'

View File

@ -1,13 +1,13 @@
import type { App } from '@/types/app' import type { App } from '@/types/app'
import { fireEvent, render, screen, waitFor } from '@testing-library/react' import { fireEvent, render, screen, waitFor } from '@testing-library/react'
import { useRouter } from 'next/navigation'
import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest' import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'
import { trackEvent } from '@/app/components/base/amplitude' import { trackEvent } from '@/app/components/base/amplitude'
import { ToastContext } from '@/app/components/base/toast/context' import { ToastContext } from '@/app/components/base/toast/context'
import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import { useRouter } from '@/next/navigation'
import { createApp } from '@/service/apps' import { createApp } from '@/service/apps'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
import { getRedirection } from '@/utils/app-redirection' import { getRedirection } from '@/utils/app-redirection'
@ -23,7 +23,7 @@ vi.mock('ahooks', () => ({
useKeyPress: vi.fn(), useKeyPress: vi.fn(),
useHover: () => false, useHover: () => false,
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: vi.fn(), useRouter: vi.fn(),
})) }))
vi.mock('@/app/components/base/amplitude', () => ({ vi.mock('@/app/components/base/amplitude', () => ({

View File

@ -4,7 +4,6 @@ import type { AppIconSelection } from '../../base/app-icon-picker'
import { RiArrowRightLine, RiArrowRightSLine, RiExchange2Fill } from '@remixicon/react' import { RiArrowRightLine, RiArrowRightSLine, RiExchange2Fill } from '@remixicon/react'
import { useDebounceFn, useKeyPress } from 'ahooks' import { useDebounceFn, useKeyPress } from 'ahooks'
import { useRouter } from 'next/navigation'
import { useCallback, useEffect, useRef, useState } from 'react' import { useCallback, useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector' 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 { useAppContext } from '@/context/app-context'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import useTheme from '@/hooks/use-theme' import useTheme from '@/hooks/use-theme'
import { useRouter } from '@/next/navigation'
import { createApp } from '@/service/apps' import { createApp } from '@/service/apps'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
import { getRedirection } from '@/utils/app-redirection' import { getRedirection } from '@/utils/app-redirection'

View File

@ -4,7 +4,6 @@ import type { MouseEventHandler } from 'react'
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import { useDebounceFn, useKeyPress } from 'ahooks' import { useDebounceFn, useKeyPress } from 'ahooks'
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { useRouter } from 'next/navigation'
import { useEffect, useMemo, useRef, useState } from 'react' import { useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
@ -22,6 +21,7 @@ import {
DSLImportMode, DSLImportMode,
DSLImportStatus, DSLImportStatus,
} from '@/models/app' } from '@/models/app'
import { useRouter } from '@/next/navigation'
import { import {
importDSL, importDSL,
importDSLConfirm, importDSLConfirm,

View File

@ -7,7 +7,7 @@ import { AppModeEnum } from '@/types/app'
import LogAnnotation from './index' import LogAnnotation from './index'
const mockRouterPush = vi.fn() const mockRouterPush = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: mockRouterPush, push: mockRouterPush,
}), }),

View File

@ -1,6 +1,5 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import { useRouter } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useMemo } from 'react' import { useMemo } from 'react'
import { useTranslation } from 'react-i18next' 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 { PageType } from '@/app/components/base/features/new-feature-panel/annotation-reply/type'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import TabSlider from '@/app/components/base/tab-slider-plain' import TabSlider from '@/app/components/base/tab-slider-plain'
import { useRouter } from '@/next/navigation'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'

View File

@ -4,13 +4,13 @@ import type { App } from '@/types/app'
import { useDebounce } from 'ahooks' import { useDebounce } from 'ahooks'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { omit } from 'es-toolkit/object' import { omit } from 'es-toolkit/object'
import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import Pagination from '@/app/components/base/pagination' import Pagination from '@/app/components/base/pagination'
import { APP_PAGE_LIMIT } from '@/config' import { APP_PAGE_LIMIT } from '@/config'
import { usePathname, useRouter, useSearchParams } from '@/next/navigation'
import { useChatConversations, useCompletionConversations } from '@/service/use-log' import { useChatConversations, useCompletionConversations } from '@/service/use-log'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
import EmptyElement from './empty-element' import EmptyElement from './empty-element'

View File

@ -14,7 +14,6 @@ import timezone from 'dayjs/plugin/timezone'
import utc from 'dayjs/plugin/utc' import utc from 'dayjs/plugin/utc'
import { get } from 'es-toolkit/compat' import { get } from 'es-toolkit/compat'
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect, useRef, useState } from 'react' import { useCallback, useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -38,6 +37,7 @@ import { WorkflowContextProvider } from '@/app/components/workflow/context'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import useTimestamp from '@/hooks/use-timestamp' import useTimestamp from '@/hooks/use-timestamp'
import { usePathname, useRouter, useSearchParams } from '@/next/navigation'
import { fetchChatMessages, updateLogMessageAnnotations, updateLogMessageFeedbacks } from '@/service/log' import { fetchChatMessages, updateLogMessageAnnotations, updateLogMessageFeedbacks } from '@/service/log'
import { AppSourceType } from '@/service/share' import { AppSourceType } from '@/service/share'
import { useChatConversationDetail, useCompletionConversationDetail } from '@/service/use-log' import { useChatConversationDetail, useCompletionConversationDetail } from '@/service/use-log'

View File

@ -14,7 +14,6 @@ import {
RiVerifiedBadgeLine, RiVerifiedBadgeLine,
RiWindowLine, RiWindowLine,
} from '@remixicon/react' } from '@remixicon/react'
import { usePathname, useRouter } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect, useMemo, useState } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -34,6 +33,7 @@ import { useAppContext } from '@/context/app-context'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
import { useDocLink } from '@/context/i18n' import { useDocLink } from '@/context/i18n'
import { AccessMode } from '@/models/access-control' import { AccessMode } from '@/models/access-control'
import { usePathname, useRouter } from '@/next/navigation'
import { useAppWhiteListSubjects } from '@/service/access-control' import { useAppWhiteListSubjects } from '@/service/access-control'
import { fetchAppDetailDirect } from '@/service/apps' import { fetchAppDetailDirect } from '@/service/apps'
import { useAppWorkflow } from '@/service/use-workflow' import { useAppWorkflow } from '@/service/use-workflow'

View File

@ -11,7 +11,7 @@ import SwitchAppModal from './index'
const mockPush = vi.fn() const mockPush = vi.fn()
const mockReplace = vi.fn() const mockReplace = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: mockPush, push: mockPush,
replace: mockReplace, replace: mockReplace,

View File

@ -3,7 +3,6 @@
import type { App } from '@/types/app' import type { App } from '@/types/app'
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { useRouter } from 'next/navigation'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector' 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 { NEED_REFRESH_APP_LIST_KEY } from '@/config'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import { useRouter } from '@/next/navigation'
import { deleteApp, switchApp } from '@/service/apps' import { deleteApp, switchApp } from '@/service/apps'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
import { getRedirection } from '@/utils/app-redirection' import { getRedirection } from '@/utils/app-redirection'

View File

@ -16,7 +16,6 @@ import {
} from '@remixicon/react' } from '@remixicon/react'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import copy from 'copy-to-clipboard' import copy from 'copy-to-clipboard'
import { useParams } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -30,6 +29,7 @@ import Loading from '@/app/components/base/loading'
import { Markdown } from '@/app/components/base/markdown' import { Markdown } from '@/app/components/base/markdown'
import NewAudioButton from '@/app/components/base/new-audio-button' import NewAudioButton from '@/app/components/base/new-audio-button'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import { useParams } from '@/next/navigation'
import { fetchTextGenerationMessage } from '@/service/debug' import { fetchTextGenerationMessage } from '@/service/debug'
import { AppSourceType, fetchMoreLikeThis, submitHumanInputForm, updateFeedback } from '@/service/share' import { AppSourceType, fetchMoreLikeThis, submitHumanInputForm, updateFeedback } from '@/service/share'
import { submitHumanInputForm as submitHumanInputFormService } from '@/service/workflow' import { submitHumanInputForm as submitHumanInputFormService } from '@/service/workflow'

View File

@ -10,7 +10,7 @@ import SavedItems from './index'
vi.mock('copy-to-clipboard', () => ({ vi.mock('copy-to-clipboard', () => ({
default: vi.fn(), default: vi.fn(),
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useParams: () => ({}), useParams: () => ({}),
usePathname: () => '/', usePathname: () => '/',
})) }))

View File

@ -19,7 +19,7 @@ import DetailPanel from './detail'
// ============================================================================ // ============================================================================
const mockRouterPush = vi.fn() const mockRouterPush = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: mockRouterPush, push: mockRouterPush,
}), }),

View File

@ -1,12 +1,12 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import { RiCloseLine, RiPlayLargeLine } from '@remixicon/react' import { RiCloseLine, RiPlayLargeLine } from '@remixicon/react'
import { useRouter } from 'next/navigation'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useStore } from '@/app/components/app/store' import { useStore } from '@/app/components/app/store'
import TooltipPlus from '@/app/components/base/tooltip' import TooltipPlus from '@/app/components/base/tooltip'
import { WorkflowContextProvider } from '@/app/components/workflow/context' import { WorkflowContextProvider } from '@/app/components/workflow/context'
import Run from '@/app/components/workflow/run' import Run from '@/app/components/workflow/run'
import { useRouter } from '@/next/navigation'
type ILogDetail = { type ILogDetail = {
runID: string runID: string

View File

@ -47,7 +47,7 @@ vi.mock('ahooks', () => ({
}, },
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: vi.fn(), push: vi.fn(),
}), }),

View File

@ -23,7 +23,7 @@ import WorkflowAppLogList from './list'
// ============================================================================ // ============================================================================
const mockRouterPush = vi.fn() const mockRouterPush = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: mockRouterPush, push: mockRouterPush,
}), }),

View File

@ -11,7 +11,7 @@ import AppCard from '../app-card'
// Mock next/navigation // Mock next/navigation
const mockPush = vi.fn() const mockPush = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
push: mockPush, push: mockPush,
}), }),
@ -111,7 +111,7 @@ vi.mock('@/utils/time', () => ({
})) }))
// Mock dynamic imports // Mock dynamic imports
vi.mock('next/dynamic', () => ({ vi.mock('@/next/dynamic', () => ({
default: (importFn: () => Promise<unknown>) => { default: (importFn: () => Promise<unknown>) => {
const fnString = importFn.toString() const fnString = importFn.toString()

View File

@ -8,7 +8,7 @@ import List from '../list'
const mockReplace = vi.fn() const mockReplace = vi.fn()
const mockRouter = { replace: mockReplace } const mockRouter = { replace: mockReplace }
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => mockRouter, useRouter: () => mockRouter,
useSearchParams: () => new URLSearchParams(''), useSearchParams: () => new URLSearchParams(''),
})) }))
@ -124,7 +124,7 @@ vi.mock('@/hooks/use-pay', () => ({
CheckModal: () => null, CheckModal: () => null,
})) }))
vi.mock('next/dynamic', () => ({ vi.mock('@/next/dynamic', () => ({
default: (importFn: () => Promise<unknown>) => { default: (importFn: () => Promise<unknown>) => {
const fnString = importFn.toString() const fnString = importFn.toString()

View File

@ -4,7 +4,7 @@ import * as React from 'react'
import CreateAppCard from '../new-app-card' import CreateAppCard from '../new-app-card'
const mockReplace = vi.fn() const mockReplace = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ useRouter: () => ({
replace: mockReplace, 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 }>) => { default: (importFn: () => Promise<{ default: React.ComponentType }>) => {
const fnString = importFn.toString() const fnString = importFn.toString()

View File

@ -7,7 +7,6 @@ import type { CreateAppModalProps } from '@/app/components/explore/create-app-mo
import type { EnvironmentVariable } from '@/app/components/workflow/types' import type { EnvironmentVariable } from '@/app/components/workflow/types'
import type { App } from '@/types/app' import type { App } from '@/types/app'
import { RiBuildingLine, RiGlobalLine, RiLockLine, RiMoreFill, RiVerifiedBadgeLine } from '@remixicon/react' import { RiBuildingLine, RiGlobalLine, RiLockLine, RiMoreFill, RiVerifiedBadgeLine } from '@remixicon/react'
import { useRouter } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useEffect, useMemo, useState } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -36,6 +35,7 @@ import { useProviderContext } from '@/context/provider-context'
import { useAsyncWindowOpen } from '@/hooks/use-async-window-open' import { useAsyncWindowOpen } from '@/hooks/use-async-window-open'
import { AccessMode } from '@/models/access-control' import { AccessMode } from '@/models/access-control'
import dynamic from '@/next/dynamic' import dynamic from '@/next/dynamic'
import { useRouter } from '@/next/navigation'
import { useGetUserCanAccessApp } from '@/service/access-control' import { useGetUserCanAccessApp } from '@/service/access-control'
import { copyApp, exportAppConfig, updateAppInfo } from '@/service/apps' import { copyApp, exportAppConfig, updateAppInfo } from '@/service/apps'
import { fetchInstalledAppList } from '@/service/explore' import { fetchInstalledAppList } from '@/service/explore'

View File

@ -1,9 +1,5 @@
'use client' 'use client'
import {
useRouter,
useSearchParams,
} from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useEffect, useMemo, useState } from 'react' import { useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next' 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 AppListContext from '@/context/app-list-context'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import dynamic from '@/next/dynamic' import dynamic from '@/next/dynamic'
import {
useRouter,
useSearchParams,
} from '@/next/navigation'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'
const CreateAppModal = dynamic(() => import('@/app/components/app/create-app-modal'), { const CreateAppModal = dynamic(() => import('@/app/components/app/create-app-modal'), {

View File

@ -1,14 +1,14 @@
import { act, render, screen, waitFor } from '@testing-library/react' import { act, render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event' import userEvent from '@testing-library/user-event'
import i18next from 'i18next' import i18next from 'i18next'
import { useParams, usePathname } from 'next/navigation' import { useParams, usePathname } from '@/next/navigation'
import AudioBtn from '../index' import AudioBtn from '../index'
const mockPlayAudio = vi.fn() const mockPlayAudio = vi.fn()
const mockPauseAudio = vi.fn() const mockPauseAudio = vi.fn()
const mockGetAudioPlayer = vi.fn() const mockGetAudioPlayer = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useParams: vi.fn(), useParams: vi.fn(),
usePathname: vi.fn(), usePathname: vi.fn(),
})) }))

View File

@ -1,10 +1,10 @@
'use client' 'use client'
import { t } from 'i18next' import { t } from 'i18next'
import { useParams, usePathname } from 'next/navigation'
import { useState } from 'react' import { useState } from 'react'
import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager' import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import Tooltip from '@/app/components/base/tooltip' import Tooltip from '@/app/components/base/tooltip'
import { useParams, usePathname } from '@/next/navigation'
import s from './style.module.css' import s from './style.module.css'
type AudioBtnProps = { type AudioBtnProps = {

View File

@ -25,7 +25,7 @@ vi.mock('../context', () => ({
useChatWithHistoryContext: vi.fn(), useChatWithHistoryContext: vi.fn(),
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: vi.fn(() => ({ useRouter: vi.fn(() => ({
push: vi.fn(), push: vi.fn(),
replace: vi.fn(), replace: vi.fn(),

View File

@ -22,7 +22,7 @@ vi.mock('../context', () => ({
ChatWithHistoryContext: { Provider: ({ children }: { children: React.ReactNode }) => <div>{children}</div> }, ChatWithHistoryContext: { Provider: ({ children }: { children: React.ReactNode }) => <div>{children}</div> },
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: vi.fn(() => ({ useRouter: vi.fn(() => ({
push: vi.fn(), push: vi.fn(),
replace: vi.fn(), replace: vi.fn(),

View File

@ -26,7 +26,7 @@ vi.mock('@/hooks/use-document-title', () => ({
default: vi.fn(), default: vi.fn(),
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: vi.fn(() => ({ useRouter: vi.fn(() => ({
push: vi.fn(), push: vi.fn(),
replace: vi.fn(), replace: vi.fn(),

View File

@ -87,7 +87,7 @@ vi.mock('@/context/global-public-context', () => ({
})) }))
// Mock next/navigation // Mock next/navigation
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/test', usePathname: () => '/test',
})) }))

View File

@ -1,8 +1,8 @@
import type { ChatConfig, ChatItemInTree } from '../../types' import type { ChatConfig, ChatItemInTree } from '../../types'
import type { FileEntity } from '@/app/components/base/file-uploader/types' import type { FileEntity } from '@/app/components/base/file-uploader/types'
import { act, renderHook } from '@testing-library/react' import { act, renderHook } from '@testing-library/react'
import { useParams, usePathname } from 'next/navigation'
import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { WorkflowRunningStatus } from '@/app/components/workflow/types'
import { useParams, usePathname } from '@/next/navigation'
import { sseGet, ssePost } from '@/service/base' import { sseGet, ssePost } from '@/service/base'
import { useChat } from '../hooks' import { useChat } from '../hooks'
@ -28,7 +28,7 @@ vi.mock('@/hooks/use-timestamp', () => ({
default: () => ({ formatTime: vi.fn().mockReturnValue('10:00 AM') }), default: () => ({ formatTime: vi.fn().mockReturnValue('10:00 AM') }),
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useParams: vi.fn(() => ({})), useParams: vi.fn(() => ({})),
usePathname: vi.fn(() => ''), usePathname: vi.fn(() => ''),
useRouter: vi.fn(() => ({})), useRouter: vi.fn(() => ({})),

View File

@ -111,7 +111,7 @@ vi.mock('@/app/components/base/chat/chat/log', () => ({
default: () => <button data-testid="log-btn"><div className="i-ri-file-list-3-line" /></button>, default: () => <button data-testid="log-btn"><div className="i-ri-file-list-3-line" /></button>,
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useParams: vi.fn(() => ({ appId: 'test-app' })), useParams: vi.fn(() => ({ appId: 'test-app' })),
usePathname: vi.fn(() => '/apps/test-app'), usePathname: vi.fn(() => '/apps/test-app'),
})) }))

View File

@ -208,7 +208,7 @@ vi.mock('../../check-input-forms-hooks', () => ({
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Next.js navigation // Next.js navigation
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useParams: () => ({ token: 'test-token' }), useParams: () => ({ token: 'test-token' }),
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/test', usePathname: () => '/test',

View File

@ -15,7 +15,6 @@ import type {
import { uniqBy } from 'es-toolkit/compat' import { uniqBy } from 'es-toolkit/compat'
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { produce, setAutoFreeze } from 'immer' import { produce, setAutoFreeze } from 'immer'
import { useParams, usePathname } from 'next/navigation'
import { import {
useCallback, useCallback,
useEffect, useEffect,
@ -33,6 +32,7 @@ import {
import { useToastContext } from '@/app/components/base/toast/context' import { useToastContext } from '@/app/components/base/toast/context'
import { NodeRunningStatus, WorkflowRunningStatus } from '@/app/components/workflow/types' import { NodeRunningStatus, WorkflowRunningStatus } from '@/app/components/workflow/types'
import useTimestamp from '@/hooks/use-timestamp' import useTimestamp from '@/hooks/use-timestamp'
import { useParams, usePathname } from '@/next/navigation'
import { import {
sseGet, sseGet,
ssePost, ssePost,

View File

@ -9,7 +9,7 @@ vi.mock('../../context', () => ({
useEmbeddedChatbotContext: vi.fn(), useEmbeddedChatbotContext: vi.fn(),
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useParams: () => ({ token: 'test-token' }), useParams: () => ({ token: 'test-token' }),
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/', usePathname: () => '/',

View File

@ -3,7 +3,7 @@ import { render, screen } from '@testing-library/react'
import { FeaturesProvider } from '../../context' import { FeaturesProvider } from '../../context'
import NewFeaturePanel from '../index' import NewFeaturePanel from '../index'
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }), useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/app/test-app-id/configuration', usePathname: () => '/app/test-app-id/configuration',
})) }))

View File

@ -7,7 +7,7 @@ import AnnotationReply from '../index'
const originalConsoleError = console.error const originalConsoleError = console.error
const mockPush = vi.fn() const mockPush = vi.fn()
let mockPathname = '/app/test-app-id/configuration' let mockPathname = '/app/test-app-id/configuration'
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useRouter: () => ({ push: mockPush }), useRouter: () => ({ push: mockPush }),
usePathname: () => mockPathname, usePathname: () => mockPathname,
})) }))

View File

@ -2,7 +2,6 @@ import type { OnFeaturesChange } from '@/app/components/base/features/types'
import type { AnnotationReplyConfig } from '@/models/debug' import type { AnnotationReplyConfig } from '@/models/debug'
import { RiEqualizer2Line, RiExternalLinkLine } from '@remixicon/react' import { RiEqualizer2Line, RiExternalLinkLine } from '@remixicon/react'
import { produce } from 'immer' import { produce } from 'immer'
import { usePathname, useRouter } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' 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 { MessageFast } from '@/app/components/base/icons/src/vender/features'
import AnnotationFullModal from '@/app/components/billing/annotation-full/modal' import AnnotationFullModal from '@/app/components/billing/annotation-full/modal'
import { ANNOTATION_DEFAULT } from '@/config' import { ANNOTATION_DEFAULT } from '@/config'
import { usePathname, useRouter } from '@/next/navigation'
type Props = { type Props = {
disabled?: boolean disabled?: boolean

View File

@ -22,7 +22,7 @@ const mockUseAppVoices = vi.fn((_appId: string, _language?: string) => ({
data: mockVoiceItems, data: mockVoiceItems,
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
usePathname: () => mockPathname, usePathname: () => mockPathname,
useParams: () => ({}), useParams: () => ({}),
})) }))

View File

@ -35,7 +35,7 @@ vi.mock('@/app/components/base/portal-to-follow-elem', () => ({
PortalToFollowElemContent: ({ children }: { children: React.ReactNode }) => <div>{children}</div>, PortalToFollowElemContent: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
})) }))
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
usePathname: () => '/app/test-app-id/configuration', usePathname: () => '/app/test-app-id/configuration',
useParams: () => ({ appId: 'test-app-id' }), useParams: () => ({ appId: 'test-app-id' }),
})) }))

View File

@ -3,7 +3,6 @@ import type { OnFeaturesChange } from '@/app/components/base/features/types'
import type { Item } from '@/app/components/base/select' import type { Item } from '@/app/components/base/select'
import { Listbox, ListboxButton, ListboxOption, ListboxOptions, Transition } from '@headlessui/react' import { Listbox, ListboxButton, ListboxOption, ListboxOptions, Transition } from '@headlessui/react'
import { produce } from 'immer' import { produce } from 'immer'
import { usePathname } from 'next/navigation'
import * as React from 'react' import * as React from 'react'
import { Fragment } from 'react' import { Fragment } from 'react'
import { useTranslation } from 'react-i18next' 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 Switch from '@/app/components/base/switch'
import Tooltip from '@/app/components/base/tooltip' import Tooltip from '@/app/components/base/tooltip'
import { languages } from '@/i18n-config/language' import { languages } from '@/i18n-config/language'
import { usePathname } from '@/next/navigation'
import { useAppVoices } from '@/service/use-apps' import { useAppVoices } from '@/service/use-apps'
import { TtsAutoPlay } from '@/types/app' import { TtsAutoPlay } from '@/types/app'
import { cn } from '@/utils/classnames' import { cn } from '@/utils/classnames'

View File

@ -40,7 +40,7 @@ const mockPdfPreview = vi.hoisted(() =>
vi.fn(() => null), vi.fn(() => null),
) )
vi.mock('next/dynamic', () => ({ vi.mock('@/next/dynamic', () => ({
default: mockDynamic, default: mockDynamic,
})) }))

View File

@ -6,7 +6,7 @@ import { useFile, useFileSizeLimit } from '../hooks'
const mockNotify = vi.fn() const mockNotify = vi.fn()
vi.mock('next/navigation', () => ({ vi.mock('@/next/navigation', () => ({
useParams: () => ({ token: undefined }), useParams: () => ({ token: undefined }),
})) }))

View File

@ -4,7 +4,6 @@ import type { FileUpload } from '@/app/components/base/features/types'
import type { FileUploadConfigResponse } from '@/models/common' import type { FileUploadConfigResponse } from '@/models/common'
import { noop } from 'es-toolkit/function' import { noop } from 'es-toolkit/function'
import { produce } from 'immer' import { produce } from 'immer'
import { useParams } from 'next/navigation'
import { import {
useCallback, useCallback,
useState, useState,
@ -20,6 +19,7 @@ import {
} from '@/app/components/base/file-uploader/constants' } from '@/app/components/base/file-uploader/constants'
import { useToastContext } from '@/app/components/base/toast/context' import { useToastContext } from '@/app/components/base/toast/context'
import { SupportUploadFileTypes } from '@/app/components/workflow/types' import { SupportUploadFileTypes } from '@/app/components/workflow/types'
import { useParams } from '@/next/navigation'
import { uploadRemoteFileInfo } from '@/service/common' import { uploadRemoteFileInfo } from '@/service/common'
import { TransferMethod } from '@/types/app' import { TransferMethod } from '@/types/app'
import { formatFileSize } from '@/utils/format' import { formatFileSize } from '@/utils/format'

Some files were not shown because too many files have changed in this diff Show More