diff --git a/web/__tests__/apps/app-list-browsing-flow.test.tsx b/web/__tests__/apps/app-list-browsing-flow.test.tsx index 5091ebb0e6b..d97ee7d9063 100644 --- a/web/__tests__/apps/app-list-browsing-flow.test.tsx +++ b/web/__tests__/apps/app-list-browsing-flow.test.tsx @@ -58,7 +58,51 @@ vi.mock('@/next/dynamic', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: mockIsLoadingCurrentWorkspace, + isLoadingWorkspacePermissionKeys: mockIsLoadingCurrentWorkspace, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: mockIsLoadingCurrentWorkspace, + isLoadingWorkspacePermissionKeys: mockIsLoadingCurrentWorkspace, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: mockIsLoadingCurrentWorkspace, + isLoadingWorkspacePermissionKeys: mockIsLoadingCurrentWorkspace, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: mockIsLoadingCurrentWorkspace, + isLoadingWorkspacePermissionKeys: mockIsLoadingCurrentWorkspace, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/__tests__/apps/create-app-flow.test.tsx b/web/__tests__/apps/create-app-flow.test.tsx index 6b6d6b22084..4b43c3b8302 100644 --- a/web/__tests__/apps/create-app-flow.test.tsx +++ b/web/__tests__/apps/create-app-flow.test.tsx @@ -45,7 +45,51 @@ vi.mock('@/next/navigation', () => ({ useSearchParams: () => new URLSearchParams(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: mockIsLoadingCurrentWorkspace, + isLoadingWorkspacePermissionKeys: mockIsLoadingCurrentWorkspace, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: mockIsLoadingCurrentWorkspace, + isLoadingWorkspacePermissionKeys: mockIsLoadingCurrentWorkspace, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: mockIsLoadingCurrentWorkspace, + isLoadingWorkspacePermissionKeys: mockIsLoadingCurrentWorkspace, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: mockIsLoadingCurrentWorkspace, + isLoadingWorkspacePermissionKeys: mockIsLoadingCurrentWorkspace, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/__tests__/billing/billing-integration.test.tsx b/web/__tests__/billing/billing-integration.test.tsx index 2a8057e6a71..35e89e2c3da 100644 --- a/web/__tests__/billing/billing-integration.test.tsx +++ b/web/__tests__/billing/billing-integration.test.tsx @@ -32,7 +32,23 @@ vi.mock('@/context/provider-context', () => ({ useProviderContext: () => mockProviderCtx, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/__tests__/billing/cloud-plan-payment-flow.test.tsx b/web/__tests__/billing/cloud-plan-payment-flow.test.tsx index 24c3a9c1dd2..d064ba5cfbd 100644 --- a/web/__tests__/billing/cloud-plan-payment-flow.test.tsx +++ b/web/__tests__/billing/cloud-plan-payment-flow.test.tsx @@ -25,7 +25,23 @@ const mockOpenAsyncWindow = vi.fn() // ─── Context mocks ─────────────────────────────────────────────────────────── -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/__tests__/billing/education-verification-flow.test.tsx b/web/__tests__/billing/education-verification-flow.test.tsx index 35905255800..628ec2812c1 100644 --- a/web/__tests__/billing/education-verification-flow.test.tsx +++ b/web/__tests__/billing/education-verification-flow.test.tsx @@ -37,7 +37,23 @@ vi.mock('@/context/provider-context', () => ({ useProviderContext: () => mockProviderCtx, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/__tests__/billing/pricing-modal-flow.test.tsx b/web/__tests__/billing/pricing-modal-flow.test.tsx index 3892e44b18b..dab3e83ef7d 100644 --- a/web/__tests__/billing/pricing-modal-flow.test.tsx +++ b/web/__tests__/billing/pricing-modal-flow.test.tsx @@ -24,7 +24,23 @@ vi.mock('@/context/provider-context', () => ({ useProviderContext: () => mockProviderCtx, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/__tests__/billing/self-hosted-plan-flow.test.tsx b/web/__tests__/billing/self-hosted-plan-flow.test.tsx index 4a7ed46f411..9726ffa6bb2 100644 --- a/web/__tests__/billing/self-hosted-plan-flow.test.tsx +++ b/web/__tests__/billing/self-hosted-plan-flow.test.tsx @@ -20,7 +20,23 @@ let mockAppCtx: Record = {} const originalLocation = window.location let assignedHref = '' -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/__tests__/explore/explore-app-list-flow.test.tsx b/web/__tests__/explore/explore-app-list-flow.test.tsx index a3b09eb0d8f..292852c9fe6 100644 --- a/web/__tests__/explore/explore-app-list-flow.test.tsx +++ b/web/__tests__/explore/explore-app-list-flow.test.tsx @@ -118,7 +118,27 @@ vi.mock('@/service/client', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) diff --git a/web/__tests__/header/account-dropdown-flow.test.tsx b/web/__tests__/header/account-dropdown-flow.test.tsx index 82b989eac7b..1175d05f97c 100644 --- a/web/__tests__/header/account-dropdown-flow.test.tsx +++ b/web/__tests__/header/account-dropdown-flow.test.tsx @@ -48,7 +48,23 @@ vi.mock('react-i18next', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/__tests__/plugins/plugin-page-shell-flow.test.tsx b/web/__tests__/plugins/plugin-page-shell-flow.test.tsx index 8f0e8b16e74..4ef21db04c6 100644 --- a/web/__tests__/plugins/plugin-page-shell-flow.test.tsx +++ b/web/__tests__/plugins/plugin-page-shell-flow.test.tsx @@ -39,7 +39,91 @@ vi.mock('@/context/i18n', () => ({ useDocLink: () => (path: string) => `https://docs.example.com${path}`, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: false, + isCurrentWorkspaceOwner: false, + langGeniusVersionInfo: { + current_env: 'CLOUD', + current_version: '1.0.0', + latest_version: '1.0.0', + version: '1.0.0', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + workspacePermissionKeys: [ + 'plugin.install', + 'plugin.delete', + 'plugin.plugin_preferences', + ], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: false, + isCurrentWorkspaceOwner: false, + langGeniusVersionInfo: { + current_env: 'CLOUD', + current_version: '1.0.0', + latest_version: '1.0.0', + version: '1.0.0', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + workspacePermissionKeys: [ + 'plugin.install', + 'plugin.delete', + 'plugin.plugin_preferences', + ], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: false, + isCurrentWorkspaceOwner: false, + langGeniusVersionInfo: { + current_env: 'CLOUD', + current_version: '1.0.0', + latest_version: '1.0.0', + version: '1.0.0', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + workspacePermissionKeys: [ + 'plugin.install', + 'plugin.delete', + 'plugin.plugin_preferences', + ], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: false, + isCurrentWorkspaceOwner: false, + langGeniusVersionInfo: { + current_env: 'CLOUD', + current_version: '1.0.0', + latest_version: '1.0.0', + version: '1.0.0', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + workspacePermissionKeys: [ + 'plugin.install', + 'plugin.delete', + 'plugin.plugin_preferences', + ], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ isCurrentWorkspaceManager: false, diff --git a/web/__tests__/tools/tool-provider-detail-flow.test.tsx b/web/__tests__/tools/tool-provider-detail-flow.test.tsx index abd0283145c..b63ae6ce9d8 100644 --- a/web/__tests__/tools/tool-provider-detail-flow.test.tsx +++ b/web/__tests__/tools/tool-provider-detail-flow.test.tsx @@ -44,7 +44,35 @@ vi.mock('@/i18n-config/language', () => ({ getLanguage: () => 'en_US', })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + workspacePermissionKeys: ['tool.manage', 'credential.create', 'credential.manage', 'credential.use'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + workspacePermissionKeys: ['tool.manage', 'credential.create', 'credential.manage', 'credential.use'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + workspacePermissionKeys: ['tool.manage', 'credential.create', 'credential.manage', 'credential.use'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + workspacePermissionKeys: ['tool.manage', 'credential.create', 'credential.manage', 'credential.use'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ isCurrentWorkspaceManager: true, diff --git a/web/__tests__/utils/mock-app-context-state.ts b/web/__tests__/utils/mock-app-context-state.ts index dcd524b233c..2caf653bbcc 100644 --- a/web/__tests__/utils/mock-app-context-state.ts +++ b/web/__tests__/utils/mock-app-context-state.ts @@ -23,6 +23,7 @@ export type AppContextStateMockState = { isLoadingCurrentWorkspace?: boolean isLoadingWorkspacePermissionKeys?: boolean workspacePermissionKeys?: string[] + datasetRbacEnabled?: boolean langGeniusVersionInfo?: Partial refreshUserProfile?: () => void refreshCurrentWorkspace?: () => void @@ -36,7 +37,6 @@ type AppContextStateAtomKind | 'userProfileEmail' | 'currentWorkspace' | 'currentWorkspaceId' - | 'workspaceRoleFlags' | 'isCurrentWorkspaceManager' | 'isCurrentWorkspaceOwner' | 'isCurrentWorkspaceEditor' @@ -44,6 +44,7 @@ type AppContextStateAtomKind | 'currentWorkspaceLoading' | 'workspacePermissionKeys' | 'workspacePermissionKeysLoading' + | 'datasetRbacEnabled' | 'langGeniusVersionInfo' | 'langGeniusCurrentVersion' | 'refreshUserProfile' @@ -120,11 +121,11 @@ const getLangGeniusVersionInfo = (state: AppContextStateMockState): LangGeniusVe ...state.langGeniusVersionInfo, }) -export const createAppContextStateAtomMock = async ( +export const createAppContextStateAtomMock = async ( importOriginal: () => Promise, getState: () => AppContextStateMockState, ) => { - const actual = await importOriginal() + const actual = await importOriginal() appContextStateMockRegistry = { getState, } @@ -136,7 +137,6 @@ export const createAppContextStateAtomMock = async ( userProfileEmailAtom: createMockAtom('userProfileEmail'), currentWorkspaceAtom: createMockAtom('currentWorkspace'), currentWorkspaceIdAtom: createMockAtom('currentWorkspaceId'), - workspaceRoleFlagsAtom: createMockAtom('workspaceRoleFlags'), isCurrentWorkspaceManagerAtom: createMockAtom('isCurrentWorkspaceManager'), isCurrentWorkspaceOwnerAtom: createMockAtom('isCurrentWorkspaceOwner'), isCurrentWorkspaceEditorAtom: createMockAtom('isCurrentWorkspaceEditor'), @@ -144,6 +144,7 @@ export const createAppContextStateAtomMock = async ( currentWorkspaceLoadingAtom: createMockAtom('currentWorkspaceLoading'), workspacePermissionKeysAtom: createMockAtom('workspacePermissionKeys'), workspacePermissionKeysLoadingAtom: createMockAtom('workspacePermissionKeysLoading'), + datasetRbacEnabledAtom: createMockAtom('datasetRbacEnabled'), langGeniusVersionInfoAtom: createMockAtom('langGeniusVersionInfo'), langGeniusCurrentVersionAtom: createMockAtom('langGeniusCurrentVersion'), refreshUserProfileAtom: createMockAtom('refreshUserProfile'), @@ -184,15 +185,6 @@ export const createAppContextStateJotaiMock = async ( if (atom[APP_CONTEXT_STATE_ATOM_KIND] === 'currentWorkspaceId') return currentWorkspace.id - if (atom[APP_CONTEXT_STATE_ATOM_KIND] === 'workspaceRoleFlags') { - return { - isCurrentWorkspaceManager: state.isCurrentWorkspaceManager ?? false, - isCurrentWorkspaceOwner: state.isCurrentWorkspaceOwner ?? false, - isCurrentWorkspaceEditor: state.isCurrentWorkspaceEditor ?? false, - isCurrentWorkspaceDatasetOperator: state.isCurrentWorkspaceDatasetOperator ?? false, - } - } - if (atom[APP_CONTEXT_STATE_ATOM_KIND] === 'isCurrentWorkspaceManager') return state.isCurrentWorkspaceManager ?? false @@ -214,6 +206,9 @@ export const createAppContextStateJotaiMock = async ( if (atom[APP_CONTEXT_STATE_ATOM_KIND] === 'workspacePermissionKeysLoading') return state.isLoadingWorkspacePermissionKeys ?? false + if (atom[APP_CONTEXT_STATE_ATOM_KIND] === 'datasetRbacEnabled') + return state.datasetRbacEnabled ?? false + if (atom[APP_CONTEXT_STATE_ATOM_KIND] === 'langGeniusVersionInfo') return getLangGeniusVersionInfo(state) diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/__tests__/layout-main.spec.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/__tests__/layout-main.spec.tsx index ebf508b1345..36266e0d4ea 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/__tests__/layout-main.spec.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/__tests__/layout-main.spec.tsx @@ -34,7 +34,27 @@ vi.mock('@/service/apps', () => ({ fetchAppDetailDirect: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx index 3bdf0113de2..62d1b3e6b22 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx @@ -10,13 +10,9 @@ import { useTranslation } from 'react-i18next' import { useShallow } from 'zustand/react/shallow' import { useStore } from '@/app/components/app/store' import Loading from '@/app/components/base/loading' -import { - currentWorkspaceAtom, - currentWorkspaceLoadingAtom, - userProfileIdAtom, - workspacePermissionKeysAtom, - workspacePermissionKeysLoadingAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '@/context/permission-state' +import { currentWorkspaceAtom, currentWorkspaceLoadingAtom } from '@/context/workspace-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import useDocumentTitle from '@/hooks/use-document-title' import { usePathname, useRouter } from '@/next/navigation' diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/__tests__/card-view.spec.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/__tests__/card-view.spec.tsx index 1935201e0d3..d565854c7ab 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/__tests__/card-view.spec.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/__tests__/card-view.spec.tsx @@ -44,7 +44,43 @@ vi.mock('@tanstack/react-query', async (importOriginal) => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + workspacePermissionKeys: mockAppState.appDetail.permission_keys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + workspacePermissionKeys: mockAppState.appDetail.permission_keys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + workspacePermissionKeys: mockAppState.appDetail.permission_keys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + workspacePermissionKeys: mockAppState.appDetail.permission_keys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx index 44af5962d30..9e3adb6cb8a 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx @@ -19,7 +19,8 @@ import MCPServiceCard from '@/app/components/tools/mcp/mcp-service-card' import { collaborationManager } from '@/app/components/workflow/collaboration/core/collaboration-manager' import { webSocketClient } from '@/app/components/workflow/collaboration/core/websocket-manager' import { isTriggerNode } from '@/app/components/workflow/types' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { fetchAppDetail, updateAppSiteAccessToken, diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/chart-view.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/chart-view.tsx index 6048493c081..8834a84ffc0 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/chart-view.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/chart-view.tsx @@ -11,8 +11,9 @@ import { TIME_PERIOD_MAPPING as LONG_TIME_PERIOD_MAPPING } from '@/app/component import { AvgResponseTime, AvgSessionInteractions, AvgUserInteractions, ConversationsChart, CostChart, EndUsersChart, MessagesChart, TokenPerSecond, UserSatisfactionRate, WorkflowCostChart, WorkflowDailyTerminalsChart, WorkflowMessagesChart } from '@/app/components/app/overview/app-chart' import { useStore as useAppStore } from '@/app/components/app/store' import { IS_CLOUD_EDITION } from '@/config' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDocLink } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { getAppACLCapabilities } from '@/utils/permission' import LongTimeRangePicker from './long-time-range-picker' import TimeRangePicker from './time-range-picker' 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 ed6f7b78195..076a99a3877 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/panel.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/panel.tsx @@ -25,7 +25,8 @@ import { WeaveIcon, } from '@/app/components/base/icons/src/public/tracing' import Loading from '@/app/components/base/loading' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { usePathname } from '@/next/navigation' import { fetchTracingConfig as doFetchTracingConfig, fetchTracingStatus, updateTracingStatus } from '@/service/apps' import { getAppACLCapabilities } from '@/utils/permission' diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/view.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/view.tsx index cb5ba455422..2ea350bd1e8 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/view.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/view.tsx @@ -4,7 +4,8 @@ import { useAtomValue } from 'jotai' import * as React from 'react' import ApikeyInfoPanel from '@/app/components/app/overview/apikey-info-panel' import { useStore as useAppStore } from '@/app/components/app/store' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { getAppACLCapabilities } from '@/utils/permission' import ChartView from './chart-view' import TracingPanel from './tracing/panel' diff --git a/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/__tests__/layout-main.spec.tsx b/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/__tests__/layout-main.spec.tsx index c76ef6ec268..356af3d7c25 100644 --- a/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/__tests__/layout-main.spec.tsx +++ b/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/__tests__/layout-main.spec.tsx @@ -23,7 +23,47 @@ vi.mock('@/service/knowledge/use-dataset', () => ({ useDatasetDetail: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: [], + }), () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: [], + }), () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: [], + }), () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: [], + }), () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => ({ diff --git a/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx b/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx index 36a9a792ea5..ce702368b08 100644 --- a/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx +++ b/web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx @@ -7,14 +7,11 @@ import * as React from 'react' import { useEffect } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' -import { - currentWorkspaceLoadingAtom, - datasetRbacEnabledAtom, - userProfileIdAtom, - workspacePermissionKeysAtom, - workspacePermissionKeysLoadingAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import DatasetDetailContext from '@/context/dataset-detail' +import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '@/context/permission-state' +import { datasetRbacEnabledAtom } from '@/context/system-features-state' +import { currentWorkspaceLoadingAtom } from '@/context/workspace-state' import useDocumentTitle from '@/hooks/use-document-title' import { usePathname, useRouter } from '@/next/navigation' import { useDatasetDetail } from '@/service/knowledge/use-dataset' diff --git a/web/app/(commonLayout)/datasets/layout.spec.tsx b/web/app/(commonLayout)/datasets/layout.spec.tsx index 9e162dc2e70..6f883923870 100644 --- a/web/app/(commonLayout)/datasets/layout.spec.tsx +++ b/web/app/(commonLayout)/datasets/layout.spec.tsx @@ -15,7 +15,27 @@ vi.mock('@/next/navigation', () => ({ usePathname: () => mockPathname, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => mockUseAppContext()) diff --git a/web/app/(commonLayout)/datasets/layout.tsx b/web/app/(commonLayout)/datasets/layout.tsx index fa6d3d0569a..e12f4cc9344 100644 --- a/web/app/(commonLayout)/datasets/layout.tsx +++ b/web/app/(commonLayout)/datasets/layout.tsx @@ -3,14 +3,10 @@ import { useAtomValue } from 'jotai' import { useEffect } from 'react' import Loading from '@/app/components/base/loading' -import { - currentWorkspaceIdAtom, - currentWorkspaceLoadingAtom, - workspacePermissionKeysAtom, - workspacePermissionKeysLoadingAtom, -} from '@/context/app-context-state' import { ExternalApiPanelProvider } from '@/context/external-api-panel-context' import { ExternalKnowledgeApiProvider } from '@/context/external-knowledge-api-context' +import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '@/context/permission-state' +import { currentWorkspaceIdAtom, currentWorkspaceLoadingAtom } from '@/context/workspace-state' import { usePathname, useRouter } from '@/next/navigation' import { hasPermission } from '@/utils/permission' diff --git a/web/app/account/(commonLayout)/delete-account/components/check-email.tsx b/web/app/account/(commonLayout)/delete-account/components/check-email.tsx index b37a4995f02..6b674ce5e1e 100644 --- a/web/app/account/(commonLayout)/delete-account/components/check-email.tsx +++ b/web/app/account/(commonLayout)/delete-account/components/check-email.tsx @@ -4,7 +4,7 @@ import { Input } from '@langgenius/dify-ui/input' import { useAtomValue } from 'jotai' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileEmailAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' import Link from '@/next/link' import { useSendDeleteAccountEmail } from '../state' 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 697c6df095c..96b25fd4e9f 100644 --- a/web/app/account/(commonLayout)/delete-account/components/feed-back.tsx +++ b/web/app/account/(commonLayout)/delete-account/components/feed-back.tsx @@ -6,7 +6,7 @@ import { toast } from '@langgenius/dify-ui/toast' import { useAtomValue } from 'jotai' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileEmailAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' import { useRouter } from '@/next/navigation' import { useLogout } from '@/service/use-common' import { useDeleteAccountFeedback } from '../state' diff --git a/web/app/components/app-sidebar/__tests__/app-detail-section.spec.tsx b/web/app/components/app-sidebar/__tests__/app-detail-section.spec.tsx index 78f9479b125..5da53a24e28 100644 --- a/web/app/components/app-sidebar/__tests__/app-detail-section.spec.tsx +++ b/web/app/components/app-sidebar/__tests__/app-detail-section.spec.tsx @@ -35,7 +35,23 @@ vi.mock('@/app/components/app/store', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/app-sidebar/__tests__/dataset-detail-section.spec.tsx b/web/app/components/app-sidebar/__tests__/dataset-detail-section.spec.tsx index 38f0b054f65..7f4e7921515 100644 --- a/web/app/components/app-sidebar/__tests__/dataset-detail-section.spec.tsx +++ b/web/app/components/app-sidebar/__tests__/dataset-detail-section.spec.tsx @@ -25,7 +25,23 @@ vi.mock('@/next/navigation', () => ({ usePathname: () => mockPathname, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/app-sidebar/app-detail-section.tsx b/web/app/components/app-sidebar/app-detail-section.tsx index 34866528aaa..cd489370312 100644 --- a/web/app/components/app-sidebar/app-detail-section.tsx +++ b/web/app/components/app-sidebar/app-detail-section.tsx @@ -22,7 +22,8 @@ import { useTranslation } from 'react-i18next' import { useStore } from '@/app/components/app/store' import Divider from '@/app/components/base/divider' import Annotations from '@/app/components/base/icons/src/vender/Annotations' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { usePathname } from '@/next/navigation' import { AppModeEnum } from '@/types/app' diff --git a/web/app/components/app-sidebar/app-info/__tests__/app-info-detail-panel.spec.tsx b/web/app/components/app-sidebar/app-info/__tests__/app-info-detail-panel.spec.tsx index 8edc1a6e02c..e133dfd1be7 100644 --- a/web/app/components/app-sidebar/app-info/__tests__/app-info-detail-panel.spec.tsx +++ b/web/app/components/app-sidebar/app-info/__tests__/app-info-detail-panel.spec.tsx @@ -18,7 +18,23 @@ const mockAppContextState = vi.hoisted(() => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/app-sidebar/app-info/app-info-detail-panel.tsx b/web/app/components/app-sidebar/app-info/app-info-detail-panel.tsx index 24e5275835b..d2361d96b7b 100644 --- a/web/app/components/app-sidebar/app-info/app-info-detail-panel.tsx +++ b/web/app/components/app-sidebar/app-info/app-info-detail-panel.tsx @@ -15,7 +15,8 @@ import * as React from 'react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import CardView from '@/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { AppModeEnum } from '@/types/app' import { getAppACLCapabilities, hasPermission } from '@/utils/permission' import AppIcon from '../../base/app-icon' diff --git a/web/app/components/app-sidebar/app-info/index.tsx b/web/app/components/app-sidebar/app-info/index.tsx index 4e2e2079316..aa27a4c5fb7 100644 --- a/web/app/components/app-sidebar/app-info/index.tsx +++ b/web/app/components/app-sidebar/app-info/index.tsx @@ -1,7 +1,8 @@ import type { AppInfoActions } from './use-app-info-actions' import { useAtomValue } from 'jotai' import * as React from 'react' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { getAppACLCapabilities } from '@/utils/permission' import AppInfoDetailPanel from './app-info-detail-panel' import AppInfoModals from './app-info-modals' diff --git a/web/app/components/app-sidebar/dataset-detail-section.tsx b/web/app/components/app-sidebar/dataset-detail-section.tsx index f29bfa457d4..4a474fddcd1 100644 --- a/web/app/components/app-sidebar/dataset-detail-section.tsx +++ b/web/app/components/app-sidebar/dataset-detail-section.tsx @@ -19,8 +19,9 @@ import { useTranslation } from 'react-i18next' import Divider from '@/app/components/base/divider' import { PipelineFill, PipelineLine } from '@/app/components/base/icons/src/vender/pipeline' import ExtraInfo from '@/app/components/datasets/extra-info' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import DatasetDetailContext from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { usePathname } from '@/next/navigation' import { useDatasetDetail, useDatasetRelatedApps } from '@/service/knowledge/use-dataset' 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 56f38e6b14b..65a8f1bc4b4 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 @@ -108,7 +108,23 @@ vi.mock('@/context/dataset-detail', () => ({ useDatasetDetailContextWithSelector: (selector: (state: { dataset?: DataSet }) => unknown) => selector({ dataset: mockDataset }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) 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 1c810de7673..96317ed4082 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 @@ -121,7 +121,23 @@ vi.mock('@/context/dataset-detail', () => ({ useDatasetDetailContextWithSelector: (selector: (state: { dataset?: DataSet }) => unknown) => selector({ dataset: mockDataset }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/app-sidebar/dataset-info/dropdown.tsx b/web/app/components/app-sidebar/dataset-info/dropdown.tsx index 29a3e23de22..a3d885ef425 100644 --- a/web/app/components/app-sidebar/dataset-info/dropdown.tsx +++ b/web/app/components/app-sidebar/dataset-info/dropdown.tsx @@ -20,8 +20,9 @@ import { useAtomValue } from 'jotai' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useRouter } from '@/next/navigation' import { checkIsUsedInApp, deleteDataset } from '@/service/datasets' diff --git a/web/app/components/app-sidebar/snippet-info/__tests__/dropdown.spec.tsx b/web/app/components/app-sidebar/snippet-info/__tests__/dropdown.spec.tsx index 9e83519382f..d511c3801cd 100644 --- a/web/app/components/app-sidebar/snippet-info/__tests__/dropdown.spec.tsx +++ b/web/app/components/app-sidebar/snippet-info/__tests__/dropdown.spec.tsx @@ -23,7 +23,23 @@ const mockAppContextState = vi.hoisted(() => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/app-sidebar/snippet-info/dropdown.tsx b/web/app/components/app-sidebar/snippet-info/dropdown.tsx index b7a3b7d400d..cd6d9b6d5da 100644 --- a/web/app/components/app-sidebar/snippet-info/dropdown.tsx +++ b/web/app/components/app-sidebar/snippet-info/dropdown.tsx @@ -24,7 +24,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import CreateSnippetDialog from '@/app/components/snippets/create-snippet-dialog' import { canCreateAndModifySnippets, canManageSnippets } from '@/app/components/snippets/utils/permission' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useRouter } from '@/next/navigation' import { useDeleteSnippetMutation, useExportSnippetMutation, useUpdateSnippetMutation } from '@/service/use-snippets' diff --git a/web/app/components/app/access-config/__tests__/index.spec.tsx b/web/app/components/app/access-config/__tests__/index.spec.tsx index 82c7a026f6e..5f2780c31b6 100644 --- a/web/app/components/app/access-config/__tests__/index.spec.tsx +++ b/web/app/components/app/access-config/__tests__/index.spec.tsx @@ -43,7 +43,27 @@ const mockMutations = vi.hoisted(() => ({ removeMemberBindings: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContext) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContext) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContext) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContext) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContext) diff --git a/web/app/components/app/access-config/index.tsx b/web/app/components/app/access-config/index.tsx index e99ee5adb4c..e3a26fe6de4 100644 --- a/web/app/components/app/access-config/index.tsx +++ b/web/app/components/app/access-config/index.tsx @@ -8,8 +8,9 @@ import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import AccessRulesEditor from '@/app/components/access-rules-editor' import { useStore } from '@/app/components/app/store' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useLocale } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { getAccessControlTemplateLanguage } from '@/i18n-config/language' import { diff --git a/web/app/components/app/app-access-control/add-member-or-group-pop.tsx b/web/app/components/app/app-access-control/add-member-or-group-pop.tsx index 0c3cc93fc8e..4047ef2d078 100644 --- a/web/app/components/app/app-access-control/add-member-or-group-pop.tsx +++ b/web/app/components/app/app-access-control/add-member-or-group-pop.tsx @@ -21,7 +21,7 @@ import { useDebounce } from 'ahooks' import { useAtomValue } from 'jotai' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { SubjectType } from '@/models/access-control' import { useSearchForWhiteListCandidates } from '@/service/access-control' import useAccessControlStore from '../../../../context/access-control-store' diff --git a/web/app/components/app/app-publisher/__tests__/index.spec.tsx b/web/app/components/app/app-publisher/__tests__/index.spec.tsx index 9b1033d754a..6b06c677203 100644 --- a/web/app/components/app/app-publisher/__tests__/index.spec.tsx +++ b/web/app/components/app/app-publisher/__tests__/index.spec.tsx @@ -107,7 +107,35 @@ vi.mock('@/service/use-tools', () => ({ useInvalidateWorkflowToolDetailByAppID: () => vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ isCurrentWorkspaceManager: true, diff --git a/web/app/components/app/configuration/dataset-config/__tests__/index.spec.tsx b/web/app/components/app/configuration/dataset-config/__tests__/index.spec.tsx index 8a6c41954a0..3fff312fea7 100644 --- a/web/app/components/app/configuration/dataset-config/__tests__/index.spec.tsx +++ b/web/app/components/app/configuration/dataset-config/__tests__/index.spec.tsx @@ -37,7 +37,39 @@ vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () })), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-123' }, + workspacePermissionKeys: [], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-123' }, + workspacePermissionKeys: [], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-123' }, + workspacePermissionKeys: [], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-123' }, + workspacePermissionKeys: [], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/app/configuration/dataset-config/index.tsx b/web/app/components/app/configuration/dataset-config/index.tsx index 0009ea796a0..c13699e25ee 100644 --- a/web/app/components/app/configuration/dataset-config/index.tsx +++ b/web/app/components/app/configuration/dataset-config/index.tsx @@ -29,8 +29,9 @@ import { getMultipleRetrievalConfig, getSelectedDatasetsMode, } from '@/app/components/workflow/nodes/knowledge-retrieval/utils' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import ConfigContext from '@/context/debug-configuration' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { AppModeEnum } from '@/types/app' import { getDatasetACLCapabilities } from '@/utils/permission' import FeaturePanel from '../base/feature-panel' diff --git a/web/app/components/app/configuration/dataset-config/select-dataset/__tests__/index.spec.tsx b/web/app/components/app/configuration/dataset-config/select-dataset/__tests__/index.spec.tsx index 70edc50e7dd..731f55b9b5d 100644 --- a/web/app/components/app/configuration/dataset-config/select-dataset/__tests__/index.spec.tsx +++ b/web/app/components/app/configuration/dataset-config/select-dataset/__tests__/index.spec.tsx @@ -35,7 +35,35 @@ vi.mock('@/service/knowledge/use-dataset', () => ({ let mockWorkspacePermissionKeys = ['dataset.create_and_management'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx b/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx index 0a8844bfee1..f6fae4f0945 100644 --- a/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx +++ b/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx @@ -14,7 +14,7 @@ import Badge from '@/app/components/base/badge' import Loading from '@/app/components/base/loading' import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import FeatureIcon from '@/app/components/header/account-setting/model-provider-page/model-selector/feature-icon' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useKnowledge } from '@/hooks/use-knowledge' import Link from '@/next/link' import { useInfiniteDatasets } from '@/service/knowledge/use-dataset' diff --git a/web/app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx b/web/app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx index dc397d6dc18..286264fcba8 100644 --- a/web/app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx +++ b/web/app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx @@ -14,7 +14,7 @@ import { useChat } from '@/app/components/base/chat/chat/hooks' import { getLastAnswer } from '@/app/components/base/chat/utils' import { useFeatures } from '@/app/components/base/features/hooks' import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useDebugConfigurationContext } from '@/context/debug-configuration' import { useEventEmitterContextContext } from '@/context/event-emitter' import { useProviderContext } from '@/context/provider-context' diff --git a/web/app/components/app/configuration/debug/debug-with-single-model/index.tsx b/web/app/components/app/configuration/debug/debug-with-single-model/index.tsx index 4346b76f949..1a18cd38841 100644 --- a/web/app/components/app/configuration/debug/debug-with-single-model/index.tsx +++ b/web/app/components/app/configuration/debug/debug-with-single-model/index.tsx @@ -10,7 +10,7 @@ import { useChat } from '@/app/components/base/chat/chat/hooks' import { getLastAnswer, isValidGeneratedAnswer } from '@/app/components/base/chat/utils' import { useFeatures } from '@/app/components/base/features/hooks' import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useDebugConfigurationContext } from '@/context/debug-configuration' import { useProviderContext } from '@/context/provider-context' import { diff --git a/web/app/components/app/configuration/hooks/__tests__/use-configuration.spec.tsx b/web/app/components/app/configuration/hooks/__tests__/use-configuration.spec.tsx index 6039f76630d..3977113fe17 100644 --- a/web/app/components/app/configuration/hooks/__tests__/use-configuration.spec.tsx +++ b/web/app/components/app/configuration/hooks/__tests__/use-configuration.spec.tsx @@ -51,7 +51,47 @@ vi.mock('ahooks', async () => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: false, + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['app.create_and_management'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: false, + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['app.create_and_management'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: false, + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['app.create_and_management'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: false, + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['app.create_and_management'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/app/configuration/hooks/use-configuration.ts b/web/app/components/app/configuration/hooks/use-configuration.ts index abb589be9b4..4fe11c8f67b 100644 --- a/web/app/components/app/configuration/hooks/use-configuration.ts +++ b/web/app/components/app/configuration/hooks/use-configuration.ts @@ -44,13 +44,10 @@ import { } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useIntegrationsSetting } from '@/app/components/header/account-setting/use-integrations-setting' import { ANNOTATION_DEFAULT, DATASET_DEFAULT, DEFAULT_AGENT_SETTING, DEFAULT_CHAT_PROMPT_CONFIG, DEFAULT_COMPLETION_PROMPT_CONFIG } from '@/config' -import { - currentWorkspaceAtom, - currentWorkspaceLoadingAtom, - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' +import { currentWorkspaceAtom, currentWorkspaceLoadingAtom } from '@/context/workspace-state' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import { PromptMode } from '@/models/debug' import { usePathname } from '@/next/navigation' diff --git a/web/app/components/app/create-app-dialog/app-list/__tests__/index.spec.tsx b/web/app/components/app/create-app-dialog/app-list/__tests__/index.spec.tsx index ea215c52b44..56737aab1d8 100644 --- a/web/app/components/app/create-app-dialog/app-list/__tests__/index.spec.tsx +++ b/web/app/components/app/create-app-dialog/app-list/__tests__/index.spec.tsx @@ -29,7 +29,39 @@ vi.mock('ahooks', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ 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 5d7c664ab17..a06972330a1 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 @@ -18,7 +18,8 @@ import Input from '@/app/components/base/input' import Loading from '@/app/components/base/loading' import CreateAppModal from '@/app/components/explore/create-app-modal' import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { DSLImportMode } from '@/models/app' import { useRouter } from '@/next/navigation' diff --git a/web/app/components/app/create-app-modal/__tests__/index.spec.tsx b/web/app/components/app/create-app-modal/__tests__/index.spec.tsx index ccc78f4a9c6..014aef99e73 100644 --- a/web/app/components/app/create-app-modal/__tests__/index.spec.tsx +++ b/web/app/components/app/create-app-modal/__tests__/index.spec.tsx @@ -74,7 +74,27 @@ vi.mock('@/utils/app-redirection', () => ({ vi.mock('@/context/provider-context', () => ({ useProviderContext: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) diff --git a/web/app/components/app/create-app-modal/index.tsx b/web/app/components/app/create-app-modal/index.tsx index 8ad3ae10757..e6525bd5384 100644 --- a/web/app/components/app/create-app-modal/index.tsx +++ b/web/app/components/app/create-app-modal/index.tsx @@ -20,7 +20,8 @@ import Divider from '@/app/components/base/divider' import { BubbleTextMod, ChatBot, ListSparkle, Logic } from '@/app/components/base/icons/src/vender/solid/communication' import Input from '@/app/components/base/input' import AppsFull from '@/app/components/billing/apps-full-in-dialog' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import useTheme from '@/hooks/use-theme' diff --git a/web/app/components/app/create-from-dsl-modal/__tests__/index.spec.tsx b/web/app/components/app/create-from-dsl-modal/__tests__/index.spec.tsx index 905c07e37d4..b0b2bf0b70f 100644 --- a/web/app/components/app/create-from-dsl-modal/__tests__/index.spec.tsx +++ b/web/app/components/app/create-from-dsl-modal/__tests__/index.spec.tsx @@ -85,7 +85,39 @@ vi.mock('@/app/components/workflow/plugin-dependency/hooks', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ 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 d76b1511302..3330f22ff1b 100644 --- a/web/app/components/app/create-from-dsl-modal/index.tsx +++ b/web/app/components/app/create-from-dsl-modal/index.tsx @@ -16,7 +16,8 @@ import { useSetNeedRefreshAppList } from '@/app/components/apps/storage' import Input from '@/app/components/base/input' import AppsFull from '@/app/components/billing/apps-full-in-dialog' import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { diff --git a/web/app/components/app/log/empty-element.tsx b/web/app/components/app/log/empty-element.tsx index a810f53e8e3..da48ac03982 100644 --- a/web/app/components/app/log/empty-element.tsx +++ b/web/app/components/app/log/empty-element.tsx @@ -5,7 +5,8 @@ import { useSuspenseQuery } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import * as React from 'react' import { Trans, useTranslation } from 'react-i18next' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import Link from '@/next/link' import { AppModeEnum } from '@/types/app' diff --git a/web/app/components/app/overview/app-card.tsx b/web/app/components/app/overview/app-card.tsx index 246b0c7a07b..e2f2838c542 100644 --- a/web/app/components/app/overview/app-card.tsx +++ b/web/app/components/app/overview/app-card.tsx @@ -14,8 +14,9 @@ import { useTranslation } from 'react-i18next' import AppBasic from '@/app/components/app-sidebar/basic' import { useStore as useAppStore } from '@/app/components/app/store' import SecretKeyButton from '@/app/components/develop/secret-key/secret-key-button' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDocLink } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { AccessMode } from '@/models/access-control' import { usePathname, useRouter } from '@/next/navigation' diff --git a/web/app/components/app/overview/embedded/index.tsx b/web/app/components/app/overview/embedded/index.tsx index f93901304b4..e29f76d241c 100644 --- a/web/app/components/app/overview/embedded/index.tsx +++ b/web/app/components/app/overview/embedded/index.tsx @@ -11,7 +11,7 @@ import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import { useThemeContext } from '@/app/components/base/chat/embedded-chatbot/theme/theme-context' import { InputVarType } from '@/app/components/workflow/types' -import { langGeniusVersionInfoAtom } from '@/context/app-context-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' import { basePath } from '@/utils/var' import { compressAndEncodeBase64, diff --git a/web/app/components/app/overview/trigger-card.tsx b/web/app/components/app/overview/trigger-card.tsx index a7112dfc3dd..43949e9290e 100644 --- a/web/app/components/app/overview/trigger-card.tsx +++ b/web/app/components/app/overview/trigger-card.tsx @@ -12,8 +12,9 @@ import { useTranslation } from 'react-i18next' import BlockIcon from '@/app/components/workflow/block-icon' import { useTriggerStatusStore } from '@/app/components/workflow/store/trigger-status' import { BlockEnum } from '@/app/components/workflow/types' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDocLink } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import Link from '@/next/link' import { diff --git a/web/app/components/apps/__tests__/app-card.spec.tsx b/web/app/components/apps/__tests__/app-card.spec.tsx index d984aeae6d1..8f527412de1 100644 --- a/web/app/components/apps/__tests__/app-card.spec.tsx +++ b/web/app/components/apps/__tests__/app-card.spec.tsx @@ -76,7 +76,27 @@ const mockAppContext = vi.hoisted(() => ({ // Mock app context -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContext) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContext) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContext) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContext) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContext) diff --git a/web/app/components/apps/__tests__/creators-filter.spec.tsx b/web/app/components/apps/__tests__/creators-filter.spec.tsx index 9f87aacf598..e1446278fc3 100644 --- a/web/app/components/apps/__tests__/creators-filter.spec.tsx +++ b/web/app/components/apps/__tests__/creators-filter.spec.tsx @@ -3,7 +3,35 @@ import CreatorsFilter from '../creators-filter' const mockOnChange = vi.hoisted(() => vi.fn()) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'member-2' }, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'member-2' }, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'member-2' }, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'member-2' }, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/apps/__tests__/index.spec.tsx b/web/app/components/apps/__tests__/index.spec.tsx index 1ca6f30f3b7..8f1a92ee620 100644 --- a/web/app/components/apps/__tests__/index.spec.tsx +++ b/web/app/components/apps/__tests__/index.spec.tsx @@ -69,7 +69,35 @@ vi.mock('@/app/education-apply/hooks', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/apps/__tests__/list.spec.tsx b/web/app/components/apps/__tests__/list.spec.tsx index af5945beb8d..43e59cfca61 100644 --- a/web/app/components/apps/__tests__/list.spec.tsx +++ b/web/app/components/apps/__tests__/list.spec.tsx @@ -71,7 +71,39 @@ vi.mock('@/service/client', () => ({ const mockIsCurrentWorkspaceDatasetOperator = vi.fn(() => false) let mockWorkspacePermissionKeys = ['app.create_and_management'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'creator-1' }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'creator-1' }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'creator-1' }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'creator-1' }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/apps/app-card.tsx b/web/app/components/apps/app-card.tsx index 46d908abc32..b97bd3eee8b 100644 --- a/web/app/components/apps/app-card.tsx +++ b/web/app/components/apps/app-card.tsx @@ -40,7 +40,8 @@ import AppIcon from '@/app/components/base/app-icon' import StarIcon from '@/app/components/base/icons/src/vender/Star' import { UserAvatarList } from '@/app/components/base/user-avatar-list' import { buildInstalledAppPath } from '@/app/components/explore/installed-app/routes' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { AppCardTags } from '@/features/tag-management/components/app-card-tags' diff --git a/web/app/components/apps/creators-filter.tsx b/web/app/components/apps/creators-filter.tsx index f78d335d631..a9bf4c12009 100644 --- a/web/app/components/apps/creators-filter.tsx +++ b/web/app/components/apps/creators-filter.tsx @@ -12,7 +12,7 @@ import { Input } from '@langgenius/dify-ui/input' import { useAtomValue } from 'jotai' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileIdAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useMembers } from '@/service/use-common' type CreatorsFilterProps = { diff --git a/web/app/components/apps/index.tsx b/web/app/components/apps/index.tsx index 400f11bf9a7..7525b7b991f 100644 --- a/web/app/components/apps/index.tsx +++ b/web/app/components/apps/index.tsx @@ -6,8 +6,8 @@ import { useAtomValue } from 'jotai' import { useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useEducationInit } from '@/app/education-apply/hooks' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' import AppListContext from '@/context/app-list-context' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import useDocumentTitle from '@/hooks/use-document-title' import { useImportDSL } from '@/hooks/use-import-dsl' import { DSLImportMode } from '@/models/app' diff --git a/web/app/components/apps/list.tsx b/web/app/components/apps/list.tsx index 7b56e49611d..151026b36bc 100644 --- a/web/app/components/apps/list.tsx +++ b/web/app/components/apps/list.tsx @@ -8,7 +8,7 @@ import { useAtomValue } from 'jotai' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNeedRefreshAppList } from '@/app/components/apps/storage' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { CheckModal } from '@/hooks/use-pay' diff --git a/web/app/components/apps/starred-app-card.tsx b/web/app/components/apps/starred-app-card.tsx index 31266a8e57b..b8ccf697da3 100644 --- a/web/app/components/apps/starred-app-card.tsx +++ b/web/app/components/apps/starred-app-card.tsx @@ -10,7 +10,8 @@ import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { AppTypeIcon } from '@/app/components/app/type-selector' import AppIcon from '@/app/components/base/app-icon' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import Link from '@/next/link' import { getRedirectionPath } from '@/utils/app-redirection' diff --git a/web/app/components/base/chat/chat/answer/human-input-content/__tests__/tips.spec.tsx b/web/app/components/base/chat/chat/answer/human-input-content/__tests__/tips.spec.tsx index dc1c8d7621b..fc35f72929d 100644 --- a/web/app/components/base/chat/chat/answer/human-input-content/__tests__/tips.spec.tsx +++ b/web/app/components/base/chat/chat/answer/human-input-content/__tests__/tips.spec.tsx @@ -8,7 +8,27 @@ const mockAppContextState = vi.hoisted(() => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) diff --git a/web/app/components/base/chat/chat/answer/human-input-content/tips.tsx b/web/app/components/base/chat/chat/answer/human-input-content/tips.tsx index ea4cb32ca75..28de256a681 100644 --- a/web/app/components/base/chat/chat/answer/human-input-content/tips.tsx +++ b/web/app/components/base/chat/chat/answer/human-input-content/tips.tsx @@ -2,7 +2,7 @@ import { useAtomValue } from 'jotai' import { memo } from 'react' import { Trans, useTranslation } from 'react-i18next' import Divider from '@/app/components/base/divider' -import { userProfileEmailAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' type TipsProps = { showEmailTip: boolean diff --git a/web/app/components/base/permission-selector/index.tsx b/web/app/components/base/permission-selector/index.tsx index 7d140ef5959..8c88b1da091 100644 --- a/web/app/components/base/permission-selector/index.tsx +++ b/web/app/components/base/permission-selector/index.tsx @@ -14,7 +14,7 @@ import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' // eslint-disable-next-line no-restricted-imports -- This legacy selector still relies on showLeftIcon/showClearIcon props from the old input. import Input from '@/app/components/base/input' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { PermissionLevel } from '@/models/permission' import MemberItem from './member-item' import Item from './permission-item' diff --git a/web/app/components/base/user-avatar-list/index.tsx b/web/app/components/base/user-avatar-list/index.tsx index c06c14f8b50..190e7d3cb2b 100644 --- a/web/app/components/base/user-avatar-list/index.tsx +++ b/web/app/components/base/user-avatar-list/index.tsx @@ -4,7 +4,7 @@ import { AvatarFallback, AvatarImage, AvatarRoot } from '@langgenius/dify-ui/ava import { useAtomValue } from 'jotai' import { memo } from 'react' import { getUserColor } from '@/app/components/workflow/collaboration/utils/user-color' -import { userProfileIdAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' type User = { id: string diff --git a/web/app/components/billing/apps-full-in-dialog/__tests__/index.spec.tsx b/web/app/components/billing/apps-full-in-dialog/__tests__/index.spec.tsx index b58c2b201e0..f05bbf592d0 100644 --- a/web/app/components/billing/apps-full-in-dialog/__tests__/index.spec.tsx +++ b/web/app/components/billing/apps-full-in-dialog/__tests__/index.spec.tsx @@ -22,7 +22,23 @@ vi.mock('@/config', async (importOriginal) => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/billing/apps-full-in-dialog/index.tsx b/web/app/components/billing/apps-full-in-dialog/index.tsx index 51e76325a3d..e32310d6df8 100644 --- a/web/app/components/billing/apps-full-in-dialog/index.tsx +++ b/web/app/components/billing/apps-full-in-dialog/index.tsx @@ -9,8 +9,9 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { Plan } from '@/app/components/billing/type' import { mailToSupport } from '@/app/components/header/utils/util' -import { langGeniusCurrentVersionAtom, userProfileEmailAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' import { useProviderContext } from '@/context/provider-context' +import { langGeniusCurrentVersionAtom } from '@/context/version-state' import UpgradeBtn from '../upgrade-btn' import s from './style.module.css' diff --git a/web/app/components/billing/billing-page/__tests__/index.spec.tsx b/web/app/components/billing/billing-page/__tests__/index.spec.tsx index 24fcb1d60eb..77a9db52373 100644 --- a/web/app/components/billing/billing-page/__tests__/index.spec.tsx +++ b/web/app/components/billing/billing-page/__tests__/index.spec.tsx @@ -34,7 +34,35 @@ vi.mock('@/hooks/use-async-window-open', () => ({ useAsyncWindowOpen: () => openAsyncWindowMock, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: isManager, + workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: isManager, + workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: isManager, + workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: isManager, + workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ isCurrentWorkspaceManager: isManager, diff --git a/web/app/components/billing/billing-page/index.tsx b/web/app/components/billing/billing-page/index.tsx index a4454fbb370..2302b9d5522 100644 --- a/web/app/components/billing/billing-page/index.tsx +++ b/web/app/components/billing/billing-page/index.tsx @@ -3,8 +3,9 @@ import type { FC } from 'react' import { useAtomValue } from 'jotai' import * as React from 'react' import { useTranslation } from 'react-i18next' -import { isCurrentWorkspaceManagerAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' +import { isCurrentWorkspaceManagerAtom } from '@/context/workspace-state' import { useAsyncWindowOpen } from '@/hooks/use-async-window-open' import { useBillingUrl } from '@/service/use-billing' import { BillingPermission, hasPermission } from '@/utils/permission' diff --git a/web/app/components/billing/hooks/use-education-discount.ts b/web/app/components/billing/hooks/use-education-discount.ts index 317be231003..98df1876955 100644 --- a/web/app/components/billing/hooks/use-education-discount.ts +++ b/web/app/components/billing/hooks/use-education-discount.ts @@ -3,7 +3,7 @@ import { toast } from '@langgenius/dify-ui/toast' import { useAtomValue } from 'jotai' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { fetchSubscriptionUrls } from '@/service/billing' import { BillingPermission, hasPermission } from '@/utils/permission' import { Plan } from '../type' diff --git a/web/app/components/billing/plan/__tests__/index.spec.tsx b/web/app/components/billing/plan/__tests__/index.spec.tsx index 6eed7388436..866e019cc37 100644 --- a/web/app/components/billing/plan/__tests__/index.spec.tsx +++ b/web/app/components/billing/plan/__tests__/index.spec.tsx @@ -44,7 +44,39 @@ vi.mock('@/context/provider-context', () => ({ useProviderContext: () => providerContextMock(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { email: 'user@example.com' }, + isCurrentWorkspaceManager, + workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { email: 'user@example.com' }, + isCurrentWorkspaceManager, + workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { email: 'user@example.com' }, + isCurrentWorkspaceManager, + workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { email: 'user@example.com' }, + isCurrentWorkspaceManager, + workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ userProfile: { email: 'user@example.com' }, diff --git a/web/app/components/billing/plan/index.tsx b/web/app/components/billing/plan/index.tsx index 089841d0327..ff0c451218c 100644 --- a/web/app/components/billing/plan/index.tsx +++ b/web/app/components/billing/plan/index.tsx @@ -16,8 +16,9 @@ import UsageInfo from '@/app/components/billing/usage-info' import { useSetEducationVerifying } from '@/app/education-apply/storage' import VerifyStateModal from '@/app/education-apply/verify-state-modal' import { IS_CLOUD_EDITION } from '@/config' -import { userProfileEmailAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' import { useModalContextSelector } from '@/context/modal-context' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { usePathname, useRouter } from '@/next/navigation' import { useEducationVerify } from '@/service/use-education' diff --git a/web/app/components/billing/pricing/__tests__/dialog.spec.tsx b/web/app/components/billing/pricing/__tests__/dialog.spec.tsx index 9c4e329641d..3c0db35cf42 100644 --- a/web/app/components/billing/pricing/__tests__/dialog.spec.tsx +++ b/web/app/components/billing/pricing/__tests__/dialog.spec.tsx @@ -44,7 +44,23 @@ vi.mock('../footer', () => ({ default: () =>
footer
, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/app/components/billing/pricing/__tests__/index.spec.tsx b/web/app/components/billing/pricing/__tests__/index.spec.tsx index 5ecb2d79d3a..655d930a2bb 100644 --- a/web/app/components/billing/pricing/__tests__/index.spec.tsx +++ b/web/app/components/billing/pricing/__tests__/index.spec.tsx @@ -27,7 +27,23 @@ vi.mock('@/next/link', () => ({ ), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/app/components/billing/pricing/index.tsx b/web/app/components/billing/pricing/index.tsx index 0640d63b92b..2ba6a57fd92 100644 --- a/web/app/components/billing/pricing/index.tsx +++ b/web/app/components/billing/pricing/index.tsx @@ -13,8 +13,8 @@ import { import { useAtomValue } from 'jotai' import * as React from 'react' import { useState } from 'react' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' import { useGetPricingPageLanguage } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { BillingPermission, hasPermission } from '@/utils/permission' import { NoiseBottom, NoiseTop } from './assets' diff --git a/web/app/components/billing/pricing/plans/cloud-plan-item/__tests__/index.spec.tsx b/web/app/components/billing/pricing/plans/cloud-plan-item/__tests__/index.spec.tsx index f86d5390e94..6f09657cdcf 100644 --- a/web/app/components/billing/pricing/plans/cloud-plan-item/__tests__/index.spec.tsx +++ b/web/app/components/billing/pricing/plans/cloud-plan-item/__tests__/index.spec.tsx @@ -14,7 +14,23 @@ import CloudPlanItem from '../index' let mockAppCtx: Record = {} const mockUseAppContext = vi.hoisted(() => vi.fn()) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/app/components/billing/pricing/plans/cloud-plan-item/index.tsx b/web/app/components/billing/pricing/plans/cloud-plan-item/index.tsx index 6dd974c12bd..81d6a126673 100644 --- a/web/app/components/billing/pricing/plans/cloud-plan-item/index.tsx +++ b/web/app/components/billing/pricing/plans/cloud-plan-item/index.tsx @@ -14,7 +14,7 @@ import { useAtomValue } from 'jotai' import * as React from 'react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { useAsyncWindowOpen } from '@/hooks/use-async-window-open' import { fetchSubscriptionUrls } from '@/service/billing' diff --git a/web/app/components/billing/pricing/plans/self-hosted-plan-item/__tests__/index.spec.tsx b/web/app/components/billing/pricing/plans/self-hosted-plan-item/__tests__/index.spec.tsx index 9e09f06e228..35046b153d0 100644 --- a/web/app/components/billing/pricing/plans/self-hosted-plan-item/__tests__/index.spec.tsx +++ b/web/app/components/billing/pricing/plans/self-hosted-plan-item/__tests__/index.spec.tsx @@ -17,7 +17,23 @@ vi.mock('../list', () => ({ ), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppCtx) }) diff --git a/web/app/components/billing/pricing/plans/self-hosted-plan-item/index.tsx b/web/app/components/billing/pricing/plans/self-hosted-plan-item/index.tsx index b80fe3ff52d..2db15952718 100644 --- a/web/app/components/billing/pricing/plans/self-hosted-plan-item/index.tsx +++ b/web/app/components/billing/pricing/plans/self-hosted-plan-item/index.tsx @@ -7,7 +7,7 @@ import * as React from 'react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { Azure, GoogleCloud } from '@/app/components/base/icons/src/public/billing' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { BillingPermission, hasPermission } from '@/utils/permission' import { contactSalesUrl, getStartedWithCommunityUrl, getWithPremiumUrl } from '../../../config' import { SelfHostedPlan } from '../../../type' diff --git a/web/app/components/custom/custom-web-app-brand/hooks/__tests__/use-web-app-brand.spec.tsx b/web/app/components/custom/custom-web-app-brand/hooks/__tests__/use-web-app-brand.spec.tsx index 3bd46ba9ce1..66f673eb3f4 100644 --- a/web/app/components/custom/custom-web-app-brand/hooks/__tests__/use-web-app-brand.spec.tsx +++ b/web/app/components/custom/custom-web-app-brand/hooks/__tests__/use-web-app-brand.spec.tsx @@ -53,7 +53,39 @@ vi.mock('@langgenius/dify-ui/toast', () => ({ vi.mock('@/service/common', () => ({ updateCurrentWorkspace: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + ...appContextStateRef.value, + refreshCurrentWorkspace: appContextStateRef.value?.mutateCurrentWorkspace, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + ...appContextStateRef.value, + refreshCurrentWorkspace: appContextStateRef.value?.mutateCurrentWorkspace, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + ...appContextStateRef.value, + refreshCurrentWorkspace: appContextStateRef.value?.mutateCurrentWorkspace, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + ...appContextStateRef.value, + refreshCurrentWorkspace: appContextStateRef.value?.mutateCurrentWorkspace, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/custom/custom-web-app-brand/hooks/use-web-app-brand.ts b/web/app/components/custom/custom-web-app-brand/hooks/use-web-app-brand.ts index fa6d0348d18..46177350dbd 100644 --- a/web/app/components/custom/custom-web-app-brand/hooks/use-web-app-brand.ts +++ b/web/app/components/custom/custom-web-app-brand/hooks/use-web-app-brand.ts @@ -6,8 +6,9 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { getImageUploadErrorMessage, imageUpload } from '@/app/components/base/image-uploader/utils' import { Plan } from '@/app/components/billing/type' -import { currentWorkspaceAtom, refreshCurrentWorkspaceAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' +import { currentWorkspaceAtom, refreshCurrentWorkspaceAtom } from '@/context/workspace-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { updateCurrentWorkspace } from '@/service/common' import { hasPermission } from '@/utils/permission' diff --git a/web/app/components/datasets/__tests__/mock-dataset-access.ts b/web/app/components/datasets/__tests__/mock-dataset-access.ts index fb6aff4650d..caf65ec35bb 100644 --- a/web/app/components/datasets/__tests__/mock-dataset-access.ts +++ b/web/app/components/datasets/__tests__/mock-dataset-access.ts @@ -69,12 +69,12 @@ const getUserProfile = (state: DatasetAccessMockState) => ({ const getWorkspacePermissionKeys = (state: DatasetAccessMockState) => state.workspacePermissionKeys ?? [] -export const createDatasetAccessAtomMock = async ( +export const createDatasetAccessAtomMock = async ( importOriginal: () => Promise, getState: () => DatasetAccessMockState, getOptions: () => DatasetAccessMockOptions = () => ({}), ) => { - const actual = await importOriginal() + const actual = await importOriginal() datasetAccessMockRegistry = { getState, getOptions, diff --git a/web/app/components/datasets/access-config/__tests__/index.spec.tsx b/web/app/components/datasets/access-config/__tests__/index.spec.tsx index 39c7cc8e794..9621a55ca79 100644 --- a/web/app/components/datasets/access-config/__tests__/index.spec.tsx +++ b/web/app/components/datasets/access-config/__tests__/index.spec.tsx @@ -75,7 +75,35 @@ vi.mock('@/context/dataset-detail', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ diff --git a/web/app/components/datasets/access-config/index.tsx b/web/app/components/datasets/access-config/index.tsx index 86b2aa061f1..9c9c2486272 100644 --- a/web/app/components/datasets/access-config/index.tsx +++ b/web/app/components/datasets/access-config/index.tsx @@ -7,13 +7,11 @@ import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import AccessRulesEditor from '@/app/components/access-rules-editor' import Loading from '@/app/components/base/loading' -import { - datasetRbacEnabledAtom, - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useLocale } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' +import { datasetRbacEnabledAtom } from '@/context/system-features-state' import { getAccessControlTemplateLanguage } from '@/i18n-config/language' import { useDatasetAccessRules, diff --git a/web/app/components/datasets/create/__tests__/index.spec.tsx b/web/app/components/datasets/create/__tests__/index.spec.tsx index aad3d88b67d..491842e272d 100644 --- a/web/app/components/datasets/create/__tests__/index.spec.tsx +++ b/web/app/components/datasets/create/__tests__/index.spec.tsx @@ -41,7 +41,43 @@ let mockCurrentUserId = 'user-1' let mockWorkspacePermissionKeys = ['dataset.create_and_management'] let mockIsLoadingWorkspacePermissionKeys = false -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: mockCurrentUserId }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: mockCurrentUserId }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: mockCurrentUserId }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: mockCurrentUserId }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => ({ diff --git a/web/app/components/datasets/create/index.tsx b/web/app/components/datasets/create/index.tsx index ac9653cdff7..f235a253960 100644 --- a/web/app/components/datasets/create/index.tsx +++ b/web/app/components/datasets/create/index.tsx @@ -11,12 +11,9 @@ import Loading from '@/app/components/base/loading' import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants' import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useIntegrationsSetting } from '@/app/components/header/account-setting/use-integrations-setting' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, - workspacePermissionKeysLoadingAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '@/context/permission-state' import { DataSourceProvider } from '@/models/common' import { DataSourceType } from '@/models/datasets' import { useRouter } from '@/next/navigation' diff --git a/web/app/components/datasets/documents/__tests__/index.spec.tsx b/web/app/components/datasets/documents/__tests__/index.spec.tsx index 072619bf6cd..fd171211a5e 100644 --- a/web/app/components/datasets/documents/__tests__/index.spec.tsx +++ b/web/app/components/datasets/documents/__tests__/index.spec.tsx @@ -47,7 +47,39 @@ vi.mock('@/context/provider-context', () => ({ })), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'test-user' }, + workspacePermissionKeys: ['dataset.create_and_management'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'test-user' }, + workspacePermissionKeys: ['dataset.create_and_management'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'test-user' }, + workspacePermissionKeys: ['dataset.create_and_management'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'test-user' }, + workspacePermissionKeys: ['dataset.create_and_management'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => ({ 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 fb14b1ec95d..5db8775741c 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 @@ -34,7 +34,39 @@ vi.mock('@/context/dataset-detail', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['dataset.create_and_management'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['dataset.create_and_management'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['dataset.create_and_management'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['dataset.create_and_management'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => ({ 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 0961eb2bcd9..db6c4ef920a 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 @@ -10,11 +10,9 @@ import ChunkingModeLabel from '@/app/components/datasets/common/chunking-mode-la import Operations from '@/app/components/datasets/documents/components/operations' import SummaryStatus from '@/app/components/datasets/documents/detail/completed/common/summary-status' import StatusItem from '@/app/components/datasets/documents/status-item' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import useTimestamp from '@/hooks/use-timestamp' import { DataSourceType } from '@/models/datasets' import { useRouter, useSearchParams } from '@/next/navigation' diff --git a/web/app/components/datasets/documents/components/list.tsx b/web/app/components/datasets/documents/components/list.tsx index d2d56f57cba..10c5bd03ad3 100644 --- a/web/app/components/datasets/documents/components/list.tsx +++ b/web/app/components/datasets/documents/components/list.tsx @@ -9,11 +9,9 @@ import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import EditMetadataBatchModal from '@/app/components/datasets/metadata/edit-metadata-batch/modal' import useBatchEditDocumentMetadata from '@/app/components/datasets/metadata/hooks/use-batch-edit-document-metadata' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector as useDatasetDetailContext } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { ChunkingMode, DocumentActionType } from '@/models/datasets' import { getDatasetACLCapabilities } from '@/utils/permission' import BatchAction from '../detail/completed/common/batch-action' 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 3c53226bb9c..ca0a3bbb43d 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 @@ -50,7 +50,43 @@ let mockCurrentUserId = 'user-1' let mockWorkspacePermissionKeys = ['dataset.create_and_management'] let mockIsLoadingWorkspacePermissionKeys = false -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: mockCurrentUserId }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: mockCurrentUserId }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: mockCurrentUserId }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: mockCurrentUserId }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => ({ diff --git a/web/app/components/datasets/documents/create-from-pipeline/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/index.tsx index 6ee21ae9d7d..f487b85f749 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/index.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/index.tsx @@ -10,12 +10,9 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' import { PlanUpgradeModal } from '@/app/components/billing/plan-upgrade-modal' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, - workspacePermissionKeysLoadingAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '@/context/permission-state' import { useProviderContextSelector } from '@/context/provider-context' import { DatasourceType } from '@/models/pipeline' import { useRouter } from '@/next/navigation' diff --git a/web/app/components/datasets/documents/detail/index.tsx b/web/app/components/datasets/documents/detail/index.tsx index 31de23ccef1..35d6adcc865 100644 --- a/web/app/components/datasets/documents/detail/index.tsx +++ b/web/app/components/datasets/documents/detail/index.tsx @@ -12,11 +12,9 @@ import Divider from '@/app/components/base/divider' import FloatRightContainer from '@/app/components/base/float-right-container' import Loading from '@/app/components/base/loading' import Metadata from '@/app/components/datasets/metadata/metadata-document' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import { ChunkingMode, DisplayStatusList } from '@/models/datasets' import { useRouter, useSearchParams } from '@/next/navigation' diff --git a/web/app/components/datasets/documents/index.tsx b/web/app/components/datasets/documents/index.tsx index d64fefe1325..e068073998b 100644 --- a/web/app/components/datasets/documents/index.tsx +++ b/web/app/components/datasets/documents/index.tsx @@ -3,11 +3,9 @@ import type { FC } from 'react' import { useAtomValue } from 'jotai' import { useCallback } from 'react' import Loading from '@/app/components/base/loading' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { DataSourceType } from '@/models/datasets' import { useRouter } from '@/next/navigation' diff --git a/web/app/components/datasets/extra-info/api-access/card.tsx b/web/app/components/datasets/extra-info/api-access/card.tsx index 13b65ca612d..08706e31648 100644 --- a/web/app/components/datasets/extra-info/api-access/card.tsx +++ b/web/app/components/datasets/extra-info/api-access/card.tsx @@ -5,11 +5,9 @@ import { useAtomValue } from 'jotai' import * as React from 'react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' import Link from '@/next/link' import { useDisableDatasetServiceApi, useEnableDatasetServiceApi } from '@/service/knowledge/use-dataset' 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 418f3076ca9..979c935397c 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 @@ -10,7 +10,35 @@ import ServiceApi from '../index' let mockWorkspacePermissionKeys: string[] = ['dataset.api_key.manage'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => ({ diff --git a/web/app/components/datasets/extra-info/service-api/index.tsx b/web/app/components/datasets/extra-info/service-api/index.tsx index e48b3c2eb7a..50df952cb41 100644 --- a/web/app/components/datasets/extra-info/service-api/index.tsx +++ b/web/app/components/datasets/extra-info/service-api/index.tsx @@ -6,7 +6,7 @@ import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import SecretKeyModal from '@/app/components/develop/secret-key/secret-key-modal' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { hasPermission } from '@/utils/permission' import Card from './card' 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 4f1d4dc7bf8..806fea14ed3 100644 --- a/web/app/components/datasets/hit-testing/__tests__/index.spec.tsx +++ b/web/app/components/datasets/hit-testing/__tests__/index.spec.tsx @@ -79,7 +79,27 @@ vi.mock('@/context/dataset-detail', () => ({ ), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) diff --git a/web/app/components/datasets/hit-testing/index.tsx b/web/app/components/datasets/hit-testing/index.tsx index 92332e97e95..33b818f343e 100644 --- a/web/app/components/datasets/hit-testing/index.tsx +++ b/web/app/components/datasets/hit-testing/index.tsx @@ -28,11 +28,9 @@ import { useContext } from 'use-context-selector' import FloatRightContainer from '@/app/components/base/float-right-container' import Loading from '@/app/components/base/loading' import docStyle from '@/app/components/datasets/documents/detail/completed/style.module.css' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import DatasetDetailContext from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import { useDatasetTestingRecords } from '@/service/knowledge/use-dataset' import { diff --git a/web/app/components/datasets/list/__tests__/index.spec.tsx b/web/app/components/datasets/list/__tests__/index.spec.tsx index f7b0906c58f..d4402b05f7c 100644 --- a/web/app/components/datasets/list/__tests__/index.spec.tsx +++ b/web/app/components/datasets/list/__tests__/index.spec.tsx @@ -20,7 +20,27 @@ vi.mock('@/next/navigation', () => ({ // Mock app context -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) 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 06886b21bac..584397f8a18 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 @@ -50,7 +50,27 @@ let mockAppContextState = { workspacePermissionKeys: [] as string[], } -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState) diff --git a/web/app/components/datasets/list/dataset-card/components/__tests__/operations-dropdown.spec.tsx b/web/app/components/datasets/list/dataset-card/components/__tests__/operations-dropdown.spec.tsx index a48126e2b8a..76f30efe5a3 100644 --- a/web/app/components/datasets/list/dataset-card/components/__tests__/operations-dropdown.spec.tsx +++ b/web/app/components/datasets/list/dataset-card/components/__tests__/operations-dropdown.spec.tsx @@ -20,7 +20,35 @@ const render = (ui: Parameters[0]) => renderWit }, }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ diff --git a/web/app/components/datasets/list/dataset-card/components/operations-dropdown.tsx b/web/app/components/datasets/list/dataset-card/components/operations-dropdown.tsx index d340b2e974f..7e2a41d5dfa 100644 --- a/web/app/components/datasets/list/dataset-card/components/operations-dropdown.tsx +++ b/web/app/components/datasets/list/dataset-card/components/operations-dropdown.tsx @@ -7,11 +7,9 @@ import { } from '@langgenius/dify-ui/dropdown-menu' import { useAtomValue } from 'jotai' import * as React from 'react' -import { - datasetRbacEnabledAtom, - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' +import { datasetRbacEnabledAtom } from '@/context/system-features-state' import { getDatasetACLCapabilities } from '@/utils/permission' import Operations from '../operations' diff --git a/web/app/components/datasets/list/dataset-card/index.tsx b/web/app/components/datasets/list/dataset-card/index.tsx index e568247a486..136622f8886 100644 --- a/web/app/components/datasets/list/dataset-card/index.tsx +++ b/web/app/components/datasets/list/dataset-card/index.tsx @@ -6,10 +6,8 @@ import { toast } from '@langgenius/dify-ui/toast' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { DatasetCardTags } from '@/features/tag-management/components/dataset-card-tags' import { useRouter } from '@/next/navigation' import { getDatasetACLCapabilities, hasOnlyDatasetPreviewPermission, hasPermission } from '@/utils/permission' diff --git a/web/app/components/datasets/list/index.tsx b/web/app/components/datasets/list/index.tsx index f079aa3414b..86faf776f58 100644 --- a/web/app/components/datasets/list/index.tsx +++ b/web/app/components/datasets/list/index.tsx @@ -6,11 +6,9 @@ import { useAtomValue } from 'jotai' // Libraries import { useState } from 'react' import { useTranslation } from 'react-i18next' -import { - isCurrentWorkspaceOwnerAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' import { useExternalApiPanel } from '@/context/external-api-panel-context' +import { workspacePermissionKeysAtom } from '@/context/permission-state' +import { isCurrentWorkspaceOwnerAtom } from '@/context/workspace-state' import { TagManagementModal } from '@/features/tag-management/components/tag-management-modal' import useDocumentTitle from '@/hooks/use-document-title' import { useRouter } from '@/next/navigation' diff --git a/web/app/components/datasets/settings/form/__tests__/index.spec.tsx b/web/app/components/datasets/settings/form/__tests__/index.spec.tsx index c3714c45a7f..3cc20431188 100644 --- a/web/app/components/datasets/settings/form/__tests__/index.spec.tsx +++ b/web/app/components/datasets/settings/form/__tests__/index.spec.tsx @@ -37,7 +37,47 @@ vi.mock('@tanstack/react-query', async (importOriginal) => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + }), () => ({ + isRbacEnabled: false, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + }), () => ({ + isRbacEnabled: false, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + }), () => ({ + isRbacEnabled: false, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + workspacePermissionKeys: mockWorkspacePermissionKeys, + }), () => ({ + isRbacEnabled: false, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => ({ diff --git a/web/app/components/datasets/settings/form/components/__tests__/basic-info-section.spec.tsx b/web/app/components/datasets/settings/form/components/__tests__/basic-info-section.spec.tsx index d1d83ceaafe..0d1ceaacf77 100644 --- a/web/app/components/datasets/settings/form/components/__tests__/basic-info-section.spec.tsx +++ b/web/app/components/datasets/settings/form/components/__tests__/basic-info-section.spec.tsx @@ -31,7 +31,35 @@ const mockAppContextState = vi.hoisted(() => ({ // Mock app-context -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: false, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: false, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: false, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: false, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ diff --git a/web/app/components/datasets/settings/form/hooks/__tests__/use-form-state.spec.ts b/web/app/components/datasets/settings/form/hooks/__tests__/use-form-state.spec.ts index 7172f218c84..bb5ce66364b 100644 --- a/web/app/components/datasets/settings/form/hooks/__tests__/use-form-state.spec.ts +++ b/web/app/components/datasets/settings/form/hooks/__tests__/use-form-state.spec.ts @@ -16,7 +16,39 @@ const { mockToastSuccess, mockToastError } = vi.hoisted(() => ({ const mockMutateDatasets = vi.fn() const mockInvalidDatasetList = vi.fn() -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: [], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: [], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: [], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: [], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => ({ diff --git a/web/app/components/datasets/settings/form/hooks/use-form-state.ts b/web/app/components/datasets/settings/form/hooks/use-form-state.ts index fb3541fb573..aea1d980b4d 100644 --- a/web/app/components/datasets/settings/form/hooks/use-form-state.ts +++ b/web/app/components/datasets/settings/form/hooks/use-form-state.ts @@ -11,11 +11,9 @@ import { useTranslation } from 'react-i18next' import { isReRankModelSelected } from '@/app/components/datasets/common/check-rerank-model' import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' -import { - userProfileIdAtom, - workspacePermissionKeysAtom, -} from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { DatasetPermission } from '@/models/datasets' import { updateDatasetSetting } from '@/service/datasets' import { useInvalidDatasetList } from '@/service/knowledge/use-dataset' diff --git a/web/app/components/datasets/settings/permission-selector/__tests__/index.spec.tsx b/web/app/components/datasets/settings/permission-selector/__tests__/index.spec.tsx index f37728f2724..784c16f1843 100644 --- a/web/app/components/datasets/settings/permission-selector/__tests__/index.spec.tsx +++ b/web/app/components/datasets/settings/permission-selector/__tests__/index.spec.tsx @@ -16,7 +16,35 @@ const mockAppContextState = vi.hoisted(() => ({ let mockIsRbacEnabled = false -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') + + return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ + isRbacEnabled: mockIsRbacEnabled, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createDatasetAccessAtomMock } = await import('@/app/components/datasets/__tests__/mock-dataset-access') return createDatasetAccessAtomMock(importOriginal, () => mockAppContextState, () => ({ diff --git a/web/app/components/datasets/settings/permission-selector/index.tsx b/web/app/components/datasets/settings/permission-selector/index.tsx index 8289c9698a5..32a4a45e501 100644 --- a/web/app/components/datasets/settings/permission-selector/index.tsx +++ b/web/app/components/datasets/settings/permission-selector/index.tsx @@ -11,10 +11,8 @@ import { useDebounceFn } from 'ahooks' import { useAtomValue } from 'jotai' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { - datasetRbacEnabledAtom, - userProfileAtom, -} from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' +import { datasetRbacEnabledAtom } from '@/context/system-features-state' import { DatasetPermission } from '@/models/datasets' import MemberItem from './member-item' import Item from './permission-item' diff --git a/web/app/components/detail-sidebar/__tests__/index.spec.tsx b/web/app/components/detail-sidebar/__tests__/index.spec.tsx index ae411cd74f0..c8bb4ee2aa1 100644 --- a/web/app/components/detail-sidebar/__tests__/index.spec.tsx +++ b/web/app/components/detail-sidebar/__tests__/index.spec.tsx @@ -30,7 +30,23 @@ vi.mock('@tanstack/react-hotkeys', async (importOriginal) => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/detail-sidebar/index.tsx b/web/app/components/detail-sidebar/index.tsx index ff2dbd85244..5d6538a0c13 100644 --- a/web/app/components/detail-sidebar/index.tsx +++ b/web/app/components/detail-sidebar/index.tsx @@ -8,7 +8,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import EnvNav from '@/app/components/header/env-nav' import AccountSection from '@/app/components/main-nav/components/account-section' import HelpMenu from '@/app/components/main-nav/components/help-menu' -import { langGeniusVersionInfoAtom } from '@/context/app-context-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' import { useDetailSidebarMode } from './storage' type DetailSidebarRenderProps = { diff --git a/web/app/components/develop/index.tsx b/web/app/components/develop/index.tsx index 7696bc6fca6..14d5ca7d504 100644 --- a/web/app/components/develop/index.tsx +++ b/web/app/components/develop/index.tsx @@ -4,7 +4,8 @@ import { useStore as useAppStore } from '@/app/components/app/store' import Loading from '@/app/components/base/loading' import ApiServer from '@/app/components/develop/ApiServer' import Doc from '@/app/components/develop/doc' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { getAppACLCapabilities } from '@/utils/permission' type IDevelopMainProps = { diff --git a/web/app/components/develop/secret-key/__tests__/secret-key-modal.spec.tsx b/web/app/components/develop/secret-key/__tests__/secret-key-modal.spec.tsx index bcce6ba7b58..22c9d8db809 100644 --- a/web/app/components/develop/secret-key/__tests__/secret-key-modal.spec.tsx +++ b/web/app/components/develop/secret-key/__tests__/secret-key-modal.spec.tsx @@ -27,7 +27,43 @@ const mockCurrentWorkspace = vi.fn().mockReturnValue({ const mockIsCurrentWorkspaceManager = vi.fn().mockReturnValue(true) const mockIsCurrentWorkspaceEditor = vi.fn().mockReturnValue(true) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: mockCurrentWorkspace(), + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager(), + isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor(), + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: mockCurrentWorkspace(), + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager(), + isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor(), + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: mockCurrentWorkspace(), + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager(), + isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor(), + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: mockCurrentWorkspace(), + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager(), + isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor(), + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/develop/secret-key/secret-key-modal.tsx b/web/app/components/develop/secret-key/secret-key-modal.tsx index ab56b24f832..e1af7eaff48 100644 --- a/web/app/components/develop/secret-key/secret-key-modal.tsx +++ b/web/app/components/develop/secret-key/secret-key-modal.tsx @@ -20,7 +20,7 @@ import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import CopyFeedback from '@/app/components/base/copy-feedback' import Loading from '@/app/components/base/loading' -import { currentWorkspaceAtom } from '@/context/app-context-state' +import { currentWorkspaceAtom } from '@/context/workspace-state' import useTimestamp from '@/hooks/use-timestamp' import { createApikey as createAppApikey, diff --git a/web/app/components/explore/app-list/__tests__/index.spec.tsx b/web/app/components/explore/app-list/__tests__/index.spec.tsx index 3dcdd5d18a4..3288effb8d9 100644 --- a/web/app/components/explore/app-list/__tests__/index.spec.tsx +++ b/web/app/components/explore/app-list/__tests__/index.spec.tsx @@ -124,7 +124,27 @@ vi.mock('@/service/client', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) diff --git a/web/app/components/explore/app-list/index.tsx b/web/app/components/explore/app-list/index.tsx index 27f2d383399..8cf6ebf7c69 100644 --- a/web/app/components/explore/app-list/index.tsx +++ b/web/app/components/explore/app-list/index.tsx @@ -18,8 +18,8 @@ import DSLConfirmModal from '@/app/components/app/create-from-dsl-modal/dsl-conf import AppCard from '@/app/components/explore/app-card' import Banner from '@/app/components/explore/banner/banner' import CreateAppModal from '@/app/components/explore/create-app-modal' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' import { useLocale } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useImportDSL } from '@/hooks/use-import-dsl' import { DSLImportMode } from '@/models/app' diff --git a/web/app/components/explore/banner/__tests__/banner.spec.tsx b/web/app/components/explore/banner/__tests__/banner.spec.tsx index 2be6855602a..7843afd5dce 100644 --- a/web/app/components/explore/banner/__tests__/banner.spec.tsx +++ b/web/app/components/explore/banner/__tests__/banner.spec.tsx @@ -25,7 +25,27 @@ vi.mock('@/context/i18n', () => ({ useLocale: () => 'en-US', })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) diff --git a/web/app/components/explore/banner/banner.tsx b/web/app/components/explore/banner/banner.tsx index 259ae66ea1c..cce03972965 100644 --- a/web/app/components/explore/banner/banner.tsx +++ b/web/app/components/explore/banner/banner.tsx @@ -5,7 +5,7 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { trackEvent } from '@/app/components/base/amplitude' import { Carousel, useCarousel } from '@/app/components/base/carousel' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useLocale } from '@/context/i18n' import { BannerItem } from './banner-item' diff --git a/web/app/components/explore/continue-work/__tests__/item.spec.tsx b/web/app/components/explore/continue-work/__tests__/item.spec.tsx index 73f4866b580..4fe976a61dd 100644 --- a/web/app/components/explore/continue-work/__tests__/item.spec.tsx +++ b/web/app/components/explore/continue-work/__tests__/item.spec.tsx @@ -18,7 +18,27 @@ const toastMocks = vi.hoisted(() => ({ warning: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) diff --git a/web/app/components/explore/continue-work/item.tsx b/web/app/components/explore/continue-work/item.tsx index da956642d26..6d06ef0c0cf 100644 --- a/web/app/components/explore/continue-work/item.tsx +++ b/web/app/components/explore/continue-work/item.tsx @@ -9,7 +9,8 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { AppTypeIcon } from '@/app/components/app/type-selector' import AppIcon from '@/app/components/base/app-icon' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' import Link from '@/next/link' 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 787dc75645b..7e81d4abe72 100644 --- a/web/app/components/header/account-dropdown/__tests__/index.spec.tsx +++ b/web/app/components/header/account-dropdown/__tests__/index.spec.tsx @@ -54,7 +54,23 @@ vi.mock('next-themes', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) }) diff --git a/web/app/components/header/account-dropdown/default-menu-content.tsx b/web/app/components/header/account-dropdown/default-menu-content.tsx index ac5e981d971..22a68c7d021 100644 --- a/web/app/components/header/account-dropdown/default-menu-content.tsx +++ b/web/app/components/header/account-dropdown/default-menu-content.tsx @@ -16,10 +16,12 @@ import PremiumBadge from '@/app/components/base/premium-badge' import ThemeSwitcher from '@/app/components/base/theme-switcher' import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants' import { IS_CLOUD_EDITION } from '@/config' -import { isCurrentWorkspaceOwnerAtom, langGeniusVersionInfoAtom, userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useDocLink } from '@/context/i18n' import { useModalContext } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' +import { langGeniusVersionInfoAtom } from '@/context/version-state' +import { isCurrentWorkspaceOwnerAtom } from '@/context/workspace-state' import { env } from '@/env' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import Link from '@/next/link' diff --git a/web/app/components/header/account-dropdown/index.tsx b/web/app/components/header/account-dropdown/index.tsx index 518398c4c62..ecab024a7e6 100644 --- a/web/app/components/header/account-dropdown/index.tsx +++ b/web/app/components/header/account-dropdown/index.tsx @@ -13,7 +13,8 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { resetUser } from '@/app/components/base/amplitude/utils' import { useSetEducationExpiredHasNoticed, useSetEducationReverifyHasNoticed, useSetEducationReverifyPrevExpireAt } from '@/app/education-apply/storage' -import { langGeniusVersionInfoAtom, userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' import { useRouter } from '@/next/navigation' import { useLogout } from '@/service/use-common' import AccountAbout from '../account-about' diff --git a/web/app/components/header/account-dropdown/main-nav-menu-content.tsx b/web/app/components/header/account-dropdown/main-nav-menu-content.tsx index 2faf2ad7f46..35c84586a8a 100644 --- a/web/app/components/header/account-dropdown/main-nav-menu-content.tsx +++ b/web/app/components/header/account-dropdown/main-nav-menu-content.tsx @@ -21,7 +21,7 @@ import { useTheme } from 'next-themes' import { useTranslation } from 'react-i18next' import PremiumBadge from '@/app/components/base/premium-badge' import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useModalContext } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' import Link from '@/next/link' 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 4348797d3ec..0f2b3384920 100644 --- a/web/app/components/header/account-setting/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/__tests__/index.spec.tsx @@ -22,7 +22,23 @@ vi.mock('@/context/provider-context', async (importOriginal) => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) }) diff --git a/web/app/components/header/account-setting/access-rules-page/__tests__/access-rule-section.spec.tsx b/web/app/components/header/account-setting/access-rules-page/__tests__/access-rule-section.spec.tsx index da2d87c56de..a8e375d198e 100644 --- a/web/app/components/header/account-setting/access-rules-page/__tests__/access-rule-section.spec.tsx +++ b/web/app/components/header/account-setting/access-rules-page/__tests__/access-rule-section.spec.tsx @@ -9,7 +9,31 @@ const mocks = vi.hoisted(() => ({ workspacePermissionKeys: [] as string[], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mocks.workspacePermissionKeys, diff --git a/web/app/components/header/account-setting/access-rules-page/access-rule-section.tsx b/web/app/components/header/account-setting/access-rules-page/access-rule-section.tsx index fc5bcbcc4b4..d6555228277 100644 --- a/web/app/components/header/account-setting/access-rules-page/access-rule-section.tsx +++ b/web/app/components/header/account-setting/access-rules-page/access-rule-section.tsx @@ -8,7 +8,7 @@ import { memo, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import Loading from '@/app/components/base/loading' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { hasPermission } from '@/utils/permission' import AccessRuleRow from './access-rule-row' diff --git a/web/app/components/header/account-setting/api-based-extension-page/__tests__/index.spec.tsx b/web/app/components/header/account-setting/api-based-extension-page/__tests__/index.spec.tsx index 198385eb101..0ecb1ee1575 100644 --- a/web/app/components/header/account-setting/api-based-extension-page/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/api-based-extension-page/__tests__/index.spec.tsx @@ -18,7 +18,31 @@ const { }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.current, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.current, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.current, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.current, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys.current, diff --git a/web/app/components/header/account-setting/api-based-extension-page/index.tsx b/web/app/components/header/account-setting/api-based-extension-page/index.tsx index 45d05fdf875..21430c00da9 100644 --- a/web/app/components/header/account-setting/api-based-extension-page/index.tsx +++ b/web/app/components/header/account-setting/api-based-extension-page/index.tsx @@ -7,7 +7,7 @@ import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { SearchInput } from '@/app/components/base/search-input' import { SkeletonContainer, SkeletonRectangle, SkeletonRow } from '@/app/components/base/skeleton' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { consoleQuery } from '@/service/client' import { hasPermission } from '@/utils/permission' import { Empty } from './empty' diff --git a/web/app/components/header/account-setting/data-source-page-new/__tests__/card.spec.tsx b/web/app/components/header/account-setting/data-source-page-new/__tests__/card.spec.tsx index 74daafa39c1..e8d0c125336 100644 --- a/web/app/components/header/account-setting/data-source-page-new/__tests__/card.spec.tsx +++ b/web/app/components/header/account-setting/data-source-page-new/__tests__/card.spec.tsx @@ -13,7 +13,31 @@ import { useDataSourceAuthUpdate } from '../hooks' let mockWorkspacePermissionKeys: string[] = ['credential.use', 'credential.create', 'credential.manage'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/app/components/header/account-setting/index.tsx b/web/app/components/header/account-setting/index.tsx index 2766957cd3a..da4e0113954 100644 --- a/web/app/components/header/account-setting/index.tsx +++ b/web/app/components/header/account-setting/index.tsx @@ -13,7 +13,7 @@ import { ACCOUNT_SETTING_TAB, } from '@/app/components/header/account-setting/constants' import MenuDialog from '@/app/components/header/account-setting/menu-dialog' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' diff --git a/web/app/components/header/account-setting/members-page/__tests__/index.spec.tsx b/web/app/components/header/account-setting/members-page/__tests__/index.spec.tsx index 93955c446ee..55ebf8b4efc 100644 --- a/web/app/components/header/account-setting/members-page/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/members-page/__tests__/index.spec.tsx @@ -18,7 +18,23 @@ const mockAppContextState = vi.hoisted(() => ({ })) const mockUseAppContext = vi.hoisted(() => vi.fn()) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/header/account-setting/members-page/__tests__/invite-button.spec.tsx b/web/app/components/header/account-setting/members-page/__tests__/invite-button.spec.tsx index 359294a4b75..384aeeb5b2e 100644 --- a/web/app/components/header/account-setting/members-page/__tests__/invite-button.spec.tsx +++ b/web/app/components/header/account-setting/members-page/__tests__/invite-button.spec.tsx @@ -8,7 +8,31 @@ import InviteButton from '../invite-button' const mockUseAppContext = vi.hoisted(() => vi.fn()) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-id' }, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-id' }, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-id' }, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-id' }, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ currentWorkspace: { id: 'workspace-id' }, diff --git a/web/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/dialog.spec.tsx b/web/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/dialog.spec.tsx index 3ddb717f933..dd232b1b87d 100644 --- a/web/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/dialog.spec.tsx +++ b/web/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/dialog.spec.tsx @@ -29,7 +29,23 @@ vi.mock('@langgenius/dify-ui/dialog', () => ({ ), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/index.spec.tsx b/web/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/index.spec.tsx index 9a3c881f391..ec299c4580f 100644 --- a/web/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/index.spec.tsx @@ -16,7 +16,23 @@ const mockUseAppContext = vi.hoisted(() => vi.fn()) const getSaveButton = () => screen.getByRole('button', { name: /operation\.(save|saving)/i }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx b/web/app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx index 7d17366df84..382fd50c198 100644 --- a/web/app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx +++ b/web/app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx @@ -7,7 +7,7 @@ import { toast } from '@langgenius/dify-ui/toast' import { useAtomValue } from 'jotai' import { useId, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { currentWorkspaceAtom, isCurrentWorkspaceOwnerAtom } from '@/context/app-context-state' +import { currentWorkspaceAtom, isCurrentWorkspaceOwnerAtom } from '@/context/workspace-state' import { updateWorkspaceInfo } from '@/service/common' type IEditWorkspaceModalProps = { diff --git a/web/app/components/header/account-setting/members-page/index.tsx b/web/app/components/header/account-setting/members-page/index.tsx index bd745507367..9e9962412f5 100644 --- a/web/app/components/header/account-setting/members-page/index.tsx +++ b/web/app/components/header/account-setting/members-page/index.tsx @@ -10,9 +10,11 @@ import { useTranslation } from 'react-i18next' import { NUM_INFINITE } from '@/app/components/billing/config' import { Plan } from '@/app/components/billing/type' import UpgradeBtn from '@/app/components/billing/upgrade-btn' -import { currentWorkspaceAtom, isCurrentWorkspaceOwnerAtom, userProfileEmailAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' import { useLocale } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' +import { currentWorkspaceAtom, isCurrentWorkspaceOwnerAtom } from '@/context/workspace-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { getAccessControlTemplateLanguage, LanguagesSupported } from '@/i18n-config/language' import { useUpdateRolesOfMember } from '@/service/access-control/use-member-roles' diff --git a/web/app/components/header/account-setting/members-page/invite-button.tsx b/web/app/components/header/account-setting/members-page/invite-button.tsx index e08415eedc9..595f4654231 100644 --- a/web/app/components/header/account-setting/members-page/invite-button.tsx +++ b/web/app/components/header/account-setting/members-page/invite-button.tsx @@ -4,7 +4,7 @@ import { useSuspenseQuery } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' -import { currentWorkspaceIdAtom } from '@/context/app-context-state' +import { currentWorkspaceIdAtom } from '@/context/workspace-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useWorkspacePermissions } from '@/service/use-workspace' diff --git a/web/app/components/header/account-setting/members-page/transfer-ownership-modal/__tests__/index.spec.tsx b/web/app/components/header/account-setting/members-page/transfer-ownership-modal/__tests__/index.spec.tsx index 434a0f4415c..78d3f80ca51 100644 --- a/web/app/components/header/account-setting/members-page/transfer-ownership-modal/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/members-page/transfer-ownership-modal/__tests__/index.spec.tsx @@ -15,7 +15,23 @@ const mockAppContextState = vi.hoisted(() => ({ })) const mockUseAppContext = vi.hoisted(() => vi.fn()) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/header/account-setting/members-page/transfer-ownership-modal/index.tsx b/web/app/components/header/account-setting/members-page/transfer-ownership-modal/index.tsx index ee198a7b555..3883dc0799b 100644 --- a/web/app/components/header/account-setting/members-page/transfer-ownership-modal/index.tsx +++ b/web/app/components/header/account-setting/members-page/transfer-ownership-modal/index.tsx @@ -6,7 +6,8 @@ import { useAtomValue } from 'jotai' import * as React from 'react' import { useCallback, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' -import { currentWorkspaceAtom, userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' +import { currentWorkspaceAtom } from '@/context/workspace-state' import { ownershipTransfer, sendOwnerEmail, verifyOwnerEmail } from '@/service/common' import MemberSelector from './member-selector' diff --git a/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/add-credential-in-load-balancing.spec.tsx b/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/add-credential-in-load-balancing.spec.tsx index e6da3be7181..88d482d9602 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/add-credential-in-load-balancing.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/add-credential-in-load-balancing.spec.tsx @@ -7,7 +7,31 @@ const mockWorkspacePermissionKeys = vi.hoisted(() => ({ value: ['credential.use', 'credential.create', 'credential.manage'], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys.value, diff --git a/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/add-custom-model.spec.tsx b/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/add-custom-model.spec.tsx index 8f75a0190ae..2101dad9e58 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/add-custom-model.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/add-custom-model.spec.tsx @@ -28,7 +28,31 @@ const mockWorkspacePermissionKeys = vi.hoisted(() => ({ value: ['credential.use', 'credential.create', 'credential.manage'], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys.value, diff --git a/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/switch-credential-in-load-balancing.spec.tsx b/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/switch-credential-in-load-balancing.spec.tsx index f354f2d3aa0..5e4a256f4ec 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/switch-credential-in-load-balancing.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/switch-credential-in-load-balancing.spec.tsx @@ -8,7 +8,31 @@ const mockWorkspacePermissionKeys = vi.hoisted(() => ({ value: ['credential.use', 'credential.create', 'credential.manage'], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys.value, diff --git a/web/app/components/header/account-setting/model-provider-page/model-auth/authorized/__tests__/index.spec.tsx b/web/app/components/header/account-setting/model-provider-page/model-auth/authorized/__tests__/index.spec.tsx index 6f886a0d78f..90d86161537 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-auth/authorized/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-auth/authorized/__tests__/index.spec.tsx @@ -13,7 +13,31 @@ let mockDeleteCredentialId: string | null = null let mockDoingAction = false let mockWorkspacePermissionKeys = ['credential.use', 'credential.create', 'credential.manage'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/app/components/header/account-setting/model-provider-page/model-modal/__tests__/index.spec.tsx b/web/app/components/header/account-setting/model-provider-page/model-modal/__tests__/index.spec.tsx index 5825a2d4211..b46f2a13dc6 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-modal/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-modal/__tests__/index.spec.tsx @@ -75,7 +75,31 @@ vi.mock('../../model-auth/hooks', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockState.workspacePermissionKeys, diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/__tests__/popup-item.spec.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/__tests__/popup-item.spec.tsx index 4d894e80624..3d58ea7c79d 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-selector/__tests__/popup-item.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-selector/__tests__/popup-item.spec.tsx @@ -88,7 +88,31 @@ const mockWorkspacePermissionKeys = vi.hoisted(() => ({ value: ['credential.use', 'credential.create', 'credential.manage'], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys.value, diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/index.spec.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/index.spec.tsx index 35395aa6e9f..2989e0e3d83 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/index.spec.tsx @@ -34,7 +34,35 @@ vi.mock('@/service/client', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager, diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/model-list-item.spec.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/model-list-item.spec.tsx index 0ba980b56ac..621d0fe6a5d 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/model-list-item.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/model-list-item.spec.tsx @@ -16,7 +16,31 @@ let mockModelLoadBalancingEnabled = false let mockPlanType: string = 'pro' let mockWorkspacePermissionKeys: string[] = ['plugin.model_config'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/model-list.spec.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/model-list.spec.tsx index c9111b67208..43ac342a714 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/model-list.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/model-list.spec.tsx @@ -6,7 +6,31 @@ import ModelList from '../model-list' const mockSetShowModelLoadBalancingModal = vi.fn() let mockWorkspacePermissionKeys: string[] = ['plugin.model_config', 'credential.manage', 'credential.use'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx index 598254ceeda..4e78e61f737 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx @@ -15,7 +15,7 @@ import { ManageCustomModelCredentials, } from '@/app/components/header/account-setting/model-provider-page/model-auth' import { IS_CE_EDITION } from '@/config' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContextSelector } from '@/context/provider-context' import { useCredentialPermissions } from '@/hooks/use-credential-permissions' import { renderI18nObject } from '@/i18n-config' diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/__tests__/api-key-section.spec.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/__tests__/api-key-section.spec.tsx index c70159f9a38..4ca83cbb577 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/__tests__/api-key-section.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/__tests__/api-key-section.spec.tsx @@ -3,7 +3,31 @@ import { fireEvent, render, screen } from '@testing-library/react' import { CustomConfigurationStatusEnum, PreferredProviderTypeEnum } from '../../../declarations' import ApiKeySection from '../api-key-section' -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/__tests__/dropdown-content.spec.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/__tests__/dropdown-content.spec.tsx index 93cb654799e..f278d40ea82 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/__tests__/dropdown-content.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/__tests__/dropdown-content.spec.tsx @@ -35,7 +35,31 @@ vi.mock('../../../model-auth/hooks', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx index ea642daca49..b892c7b6c01 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx @@ -10,7 +10,7 @@ import { useTranslation } from 'react-i18next' import Badge from '@/app/components/base/badge' import { Balance } from '@/app/components/base/icons/src/vender/line/financeAndECommerce' import { Plan } from '@/app/components/billing/type' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext, useProviderContextSelector } from '@/context/provider-context' import { consoleQuery } from '@/service/client' import { disableModel, enableModel } from '@/service/common' diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list.tsx index b1a6ceccf27..32799382572 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list.tsx @@ -11,8 +11,8 @@ import { AddCustomModel, ManageCustomModelCredentials, } from '@/app/components/header/account-setting/model-provider-page/model-auth' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' import { useModalContextSelector } from '@/context/modal-context' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { hasPermission } from '@/utils/permission' import { ConfigurationMethodEnum, diff --git a/web/app/components/header/account-setting/model-provider-page/system-model-selector/__tests__/index.spec.tsx b/web/app/components/header/account-setting/model-provider-page/system-model-selector/__tests__/index.spec.tsx index 4c0e14c3226..b7124ab81c8 100644 --- a/web/app/components/header/account-setting/model-provider-page/system-model-selector/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/system-model-selector/__tests__/index.spec.tsx @@ -34,7 +34,31 @@ const mockModelSelectorProps = vi.hoisted(() => [] as Array<{ hideProviderSettin let mockWorkspacePermissionKeys = ['plugin.model_config'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx b/web/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx index ece50247ec8..2077fd15238 100644 --- a/web/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx @@ -16,7 +16,7 @@ import { useAtomValue } from 'jotai' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { Infotip } from '@/app/components/base/infotip' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import { updateDefaultModel } from '@/service/common' import { hasPermission } from '@/utils/permission' diff --git a/web/app/components/header/account-setting/permissions-page/__tests__/index.spec.tsx b/web/app/components/header/account-setting/permissions-page/__tests__/index.spec.tsx index d67ce0f2648..0886a6838c4 100644 --- a/web/app/components/header/account-setting/permissions-page/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/permissions-page/__tests__/index.spec.tsx @@ -18,7 +18,31 @@ vi.mock('@langgenius/dify-ui/toast', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mocks.workspacePermissionKeys, diff --git a/web/app/components/header/account-setting/permissions-page/index.tsx b/web/app/components/header/account-setting/permissions-page/index.tsx index f1fa6572ca9..9887e860b13 100644 --- a/web/app/components/header/account-setting/permissions-page/index.tsx +++ b/web/app/components/header/account-setting/permissions-page/index.tsx @@ -7,8 +7,8 @@ import { toast } from '@langgenius/dify-ui/toast' import { useAtomValue } from 'jotai' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' import { useLocale } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { getAccessControlTemplateLanguage } from '@/i18n-config/language' import { useCreateWorkspaceRole, useUpdateWorkspaceRole } from '@/service/access-control/use-workspace-roles' import { hasPermission } from '@/utils/permission' diff --git a/web/app/components/header/account-setting/permissions-page/role-list/__tests__/row-menu.spec.tsx b/web/app/components/header/account-setting/permissions-page/role-list/__tests__/row-menu.spec.tsx index 6685ca0bb6c..44b81610292 100644 --- a/web/app/components/header/account-setting/permissions-page/role-list/__tests__/row-menu.spec.tsx +++ b/web/app/components/header/account-setting/permissions-page/role-list/__tests__/row-menu.spec.tsx @@ -30,7 +30,31 @@ const membersOfRoleQueryMock = vi.hoisted(() => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys.value, diff --git a/web/app/components/header/account-setting/permissions-page/role-list/row-menu.tsx b/web/app/components/header/account-setting/permissions-page/role-list/row-menu.tsx index 145a83c3467..32c460de8bd 100644 --- a/web/app/components/header/account-setting/permissions-page/role-list/row-menu.tsx +++ b/web/app/components/header/account-setting/permissions-page/role-list/row-menu.tsx @@ -22,7 +22,7 @@ import { useAtomValue } from 'jotai' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useCopyWorkspaceRole, useDeleteWorkspaceRole } from '@/service/access-control/use-workspace-roles' import { hasPermission } from '@/utils/permission' import { CopyMembersConfirmDialog } from './copy-members-confirm-dialog' diff --git a/web/app/components/header/account-setting/preference-page/__tests__/index.spec.tsx b/web/app/components/header/account-setting/preference-page/__tests__/index.spec.tsx index 70a21125fcf..74cb982e9bf 100644 --- a/web/app/components/header/account-setting/preference-page/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/preference-page/__tests__/index.spec.tsx @@ -68,7 +68,35 @@ vi.mock('@/next/navigation', () => ({ useRouter: () => ({ refresh: mockRefresh }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + refreshUserProfile: mockMutateUserProfile, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + refreshUserProfile: mockMutateUserProfile, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + refreshUserProfile: mockMutateUserProfile, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + refreshUserProfile: mockMutateUserProfile, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ userProfile: mockUserProfile, diff --git a/web/app/components/header/account-setting/preference-page/index.tsx b/web/app/components/header/account-setting/preference-page/index.tsx index c8a62fb90c5..88415897ad6 100644 --- a/web/app/components/header/account-setting/preference-page/index.tsx +++ b/web/app/components/header/account-setting/preference-page/index.tsx @@ -6,7 +6,7 @@ import { useAtomValue, useSetAtom } from 'jotai' import { useTheme } from 'next-themes' import { useState } from 'react' import { useTranslation } from 'react-i18next' -import { refreshUserProfileAtom, userProfileAtom } from '@/context/app-context-state' +import { refreshUserProfileAtom, userProfileAtom } from '@/context/account-state' import { useLocale } from '@/context/i18n' import { setLocaleOnClient } from '@/i18n-config' import { languages } from '@/i18n-config/language' diff --git a/web/app/components/header/account-setting/update-setting-dialog.tsx b/web/app/components/header/account-setting/update-setting-dialog.tsx index 2d72c46cf3b..e61e675b8b0 100644 --- a/web/app/components/header/account-setting/update-setting-dialog.tsx +++ b/web/app/components/header/account-setting/update-setting-dialog.tsx @@ -13,7 +13,7 @@ import { useTranslation } from 'react-i18next' import { convertTimezoneToOffsetStr } from '@/app/components/base/date-and-time-picker/utils/dayjs' import { AUTO_UPDATE_MODE, AUTO_UPDATE_STRATEGY } from '@/app/components/plugins/reference-setting-modal/auto-update-setting/types' import { convertLocalSecondsToUTCDaySeconds, convertUTCDaySecondsToLocalSeconds, dayjsToTimeOfDay, timeOfDayToDayjs } from '@/app/components/plugins/reference-setting-modal/auto-update-setting/utils' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useMutationPluginAutoUpgradeSettings, usePluginAutoUpgradeSettings } from '@/service/use-plugins' import UpdateSettingDialogForm from './update-setting-dialog-form' diff --git a/web/app/components/header/env-nav/__tests__/index.spec.tsx b/web/app/components/header/env-nav/__tests__/index.spec.tsx index f4c3e5f4b4f..982595ae688 100644 --- a/web/app/components/header/env-nav/__tests__/index.spec.tsx +++ b/web/app/components/header/env-nav/__tests__/index.spec.tsx @@ -8,7 +8,23 @@ const mockAppContextState = vi.hoisted(() => ({ })) const mockUseAppContext = vi.hoisted(() => vi.fn()) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/header/env-nav/index.tsx b/web/app/components/header/env-nav/index.tsx index a27daa7638a..13e414c20dc 100644 --- a/web/app/components/header/env-nav/index.tsx +++ b/web/app/components/header/env-nav/index.tsx @@ -4,7 +4,7 @@ import { useAtomValue } from 'jotai' import { useTranslation } from 'react-i18next' import { TerminalSquare } from '@/app/components/base/icons/src/vender/solid/development' import { Beaker02 } from '@/app/components/base/icons/src/vender/solid/education' -import { langGeniusVersionInfoAtom } from '@/context/app-context-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' const headerEnvClassName: { [k: string]: string } = { DEVELOPMENT: 'bg-[#FEC84B] border-[#FDB022] text-[#93370D]', diff --git a/web/app/components/integrations/__tests__/tool-provider-list.spec.tsx b/web/app/components/integrations/__tests__/tool-provider-list.spec.tsx index 6abc46550e3..d152d8e6210 100644 --- a/web/app/components/integrations/__tests__/tool-provider-list.spec.tsx +++ b/web/app/components/integrations/__tests__/tool-provider-list.spec.tsx @@ -98,7 +98,31 @@ const mockAppContextState = vi.hoisted(() => ({ workspacePermissionKeys: ['tool.manage', 'mcp.manage'] as string[], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContextState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContextState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContextState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContextState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockAppContextState.workspacePermissionKeys, diff --git a/web/app/components/main-nav/__tests__/index.spec.tsx b/web/app/components/main-nav/__tests__/index.spec.tsx index f2d65d67c43..4b1a9173df7 100644 --- a/web/app/components/main-nav/__tests__/index.spec.tsx +++ b/web/app/components/main-nav/__tests__/index.spec.tsx @@ -37,7 +37,23 @@ vi.mock('@/features/agent-v2/feature-flag', () => ({ isAgentV2Enabled: () => mockIsAgentV2Enabled(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current ?? {}) }) diff --git a/web/app/components/main-nav/__tests__/layout.spec.tsx b/web/app/components/main-nav/__tests__/layout.spec.tsx index 4d5a34056bf..5a69dc322ef 100644 --- a/web/app/components/main-nav/__tests__/layout.spec.tsx +++ b/web/app/components/main-nav/__tests__/layout.spec.tsx @@ -36,7 +36,23 @@ vi.mock('@tanstack/react-query', async (importOriginal) => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/main-nav/components/__tests__/support-menu.spec.tsx b/web/app/components/main-nav/components/__tests__/support-menu.spec.tsx index c245d37f151..320c4e3a99d 100644 --- a/web/app/components/main-nav/components/__tests__/support-menu.spec.tsx +++ b/web/app/components/main-nav/components/__tests__/support-menu.spec.tsx @@ -49,7 +49,23 @@ vi.mock('@/config', async (importOriginal) => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/main-nav/components/__tests__/workspace-card.spec.tsx b/web/app/components/main-nav/components/__tests__/workspace-card.spec.tsx index 182eaf02564..c4642082cf4 100644 --- a/web/app/components/main-nav/components/__tests__/workspace-card.spec.tsx +++ b/web/app/components/main-nav/components/__tests__/workspace-card.spec.tsx @@ -37,7 +37,23 @@ vi.mock('@/context/provider-context', () => ({ useProviderContext: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState.current) }) diff --git a/web/app/components/main-nav/components/account-section.tsx b/web/app/components/main-nav/components/account-section.tsx index e8809ea4a1a..1c60f9aef31 100644 --- a/web/app/components/main-nav/components/account-section.tsx +++ b/web/app/components/main-nav/components/account-section.tsx @@ -4,7 +4,7 @@ import { Avatar } from '@langgenius/dify-ui/avatar' import { cn } from '@langgenius/dify-ui/cn' import { useAtomValue } from 'jotai' import AccountDropdown from '@/app/components/header/account-dropdown' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' type AccountSectionProps = { compact?: boolean diff --git a/web/app/components/main-nav/components/help-menu.tsx b/web/app/components/main-nav/components/help-menu.tsx index 158a4a0f94a..d77e0c1ed06 100644 --- a/web/app/components/main-nav/components/help-menu.tsx +++ b/web/app/components/main-nav/components/help-menu.tsx @@ -22,8 +22,9 @@ import Compliance from '@/app/components/header/account-dropdown/compliance' import { ExternalLinkIndicator, MenuItemContent } from '@/app/components/header/account-dropdown/menu-item-content' import GithubStar from '@/app/components/header/github-star' import { IS_CLOUD_EDITION } from '@/config' -import { isCurrentWorkspaceOwnerAtom, langGeniusVersionInfoAtom } from '@/context/app-context-state' import { useDocLink } from '@/context/i18n' +import { langGeniusVersionInfoAtom } from '@/context/version-state' +import { isCurrentWorkspaceOwnerAtom } from '@/context/workspace-state' import { env } from '@/env' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import SupportMenu from './support-menu' diff --git a/web/app/components/main-nav/components/support-menu.tsx b/web/app/components/main-nav/components/support-menu.tsx index 8ab69c00163..a9cadde2bf8 100644 --- a/web/app/components/main-nav/components/support-menu.tsx +++ b/web/app/components/main-nav/components/support-menu.tsx @@ -6,9 +6,10 @@ import { Plan } from '@/app/components/billing/type' import { ExternalLinkIndicator, MenuItemContent } from '@/app/components/header/account-dropdown/menu-item-content' import { mailToSupport } from '@/app/components/header/utils/util' import { IS_CLOUD_EDITION, SUPPORT_EMAIL_ADDRESS, ZENDESK_WIDGET_KEY } from '@/config' -import { langGeniusVersionInfoAtom, userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useModalContext } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' +import { langGeniusVersionInfoAtom } from '@/context/version-state' type SupportMenuProps = { onContactUsClick?: () => void diff --git a/web/app/components/main-nav/components/web-apps-section.tsx b/web/app/components/main-nav/components/web-apps-section.tsx index 63b018b26c2..84da81e22a9 100644 --- a/web/app/components/main-nav/components/web-apps-section.tsx +++ b/web/app/components/main-nav/components/web-apps-section.tsx @@ -27,7 +27,7 @@ import Divider from '@/app/components/base/divider' import { SearchInput } from '@/app/components/base/search-input' import { isInstalledAppPath } from '@/app/components/explore/installed-app/routes' import AppNavItem from '@/app/components/explore/sidebar/app-nav-item' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { usePathname } from '@/next/navigation' import { useGetInstalledApps, useUninstallApp, useUpdateAppPinStatus } from '@/service/use-explore' import { hasPermission } from '@/utils/permission' diff --git a/web/app/components/main-nav/components/workspace-card.tsx b/web/app/components/main-nav/components/workspace-card.tsx index c66236aafa8..8ff5edd7d95 100644 --- a/web/app/components/main-nav/components/workspace-card.tsx +++ b/web/app/components/main-nav/components/workspace-card.tsx @@ -18,8 +18,8 @@ import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/con import LicenseNav from '@/app/components/header/license-env' import { buildIntegrationPath } from '@/app/components/integrations/routes' import { IS_CLOUD_EDITION } from '@/config' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' import { useModalContext } from '@/context/modal-context' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' import Link from '@/next/link' import { consoleQuery } from '@/service/client' diff --git a/web/app/components/main-nav/index.tsx b/web/app/components/main-nav/index.tsx index 961047b50e2..7210543d219 100644 --- a/web/app/components/main-nav/index.tsx +++ b/web/app/components/main-nav/index.tsx @@ -9,11 +9,8 @@ import { useTranslation } from 'react-i18next' import Badge from '@/app/components/base/badge' import DifyLogo from '@/app/components/base/logo/dify-logo' import EnvNav from '@/app/components/header/env-nav' -import { - isCurrentWorkspaceDatasetOperatorAtom, - isCurrentWorkspaceEditorAtom, - langGeniusVersionInfoAtom, -} from '@/context/app-context-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' +import { isCurrentWorkspaceDatasetOperatorAtom, isCurrentWorkspaceEditorAtom } from '@/context/workspace-state' import { isAgentV2Enabled } from '@/features/agent-v2/feature-flag' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import dynamic from '@/next/dynamic' diff --git a/web/app/components/main-nav/layout.tsx b/web/app/components/main-nav/layout.tsx index 2a50752f92a..757d5b102f1 100644 --- a/web/app/components/main-nav/layout.tsx +++ b/web/app/components/main-nav/layout.tsx @@ -7,7 +7,7 @@ import { useEffect } from 'react' import { useTranslation } from 'react-i18next' import { useShallow } from 'zustand/react/shallow' import { useStore as useAppStore } from '@/app/components/app/store' -import { isCurrentWorkspaceDatasetOperatorAtom, isCurrentWorkspaceEditorAtom } from '@/context/app-context-state' +import { isCurrentWorkspaceDatasetOperatorAtom, isCurrentWorkspaceEditorAtom } from '@/context/workspace-state' import { isAgentV2Enabled } from '@/features/agent-v2/feature-flag' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { usePathname } from '@/next/navigation' diff --git a/web/app/components/plugins/card/__tests__/index.spec.tsx b/web/app/components/plugins/card/__tests__/index.spec.tsx index 9b7319ca580..51979d44fe8 100644 --- a/web/app/components/plugins/card/__tests__/index.spec.tsx +++ b/web/app/components/plugins/card/__tests__/index.spec.tsx @@ -41,7 +41,31 @@ vi.mock('@/utils/format', () => ({ formatNumber: (num: number) => num.toLocaleString(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-123' }, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-123' }, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-123' }, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-123' }, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ currentWorkspace: { id: 'workspace-123' }, diff --git a/web/app/components/plugins/card/index.tsx b/web/app/components/plugins/card/index.tsx index d4707936eea..01a8aa8f4ba 100644 --- a/web/app/components/plugins/card/index.tsx +++ b/web/app/components/plugins/card/index.tsx @@ -4,8 +4,8 @@ import { cn } from '@langgenius/dify-ui/cn' import { useAtomValue } from 'jotai' import * as React from 'react' import { useTranslation } from '#i18n' -import { currentWorkspaceIdAtom } from '@/context/app-context-state' import { useGetLanguage } from '@/context/i18n' +import { currentWorkspaceIdAtom } from '@/context/workspace-state' import useTheme from '@/hooks/use-theme' import { renderI18nObject, diff --git a/web/app/components/plugins/install-plugin/base/__tests__/use-get-icon.spec.ts b/web/app/components/plugins/install-plugin/base/__tests__/use-get-icon.spec.ts index ec7ba4c34db..bf95fe49349 100644 --- a/web/app/components/plugins/install-plugin/base/__tests__/use-get-icon.spec.ts +++ b/web/app/components/plugins/install-plugin/base/__tests__/use-get-icon.spec.ts @@ -8,7 +8,19 @@ vi.mock('@/config', () => ({ API_PREFIX: 'https://api.example.com', })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + currentWorkspaceIdAtom: mockCurrentWorkspaceIdAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + currentWorkspaceIdAtom: mockCurrentWorkspaceIdAtom, +})) +vi.mock('@/context/permission-state', () => ({ + currentWorkspaceIdAtom: mockCurrentWorkspaceIdAtom, +})) +vi.mock('@/context/version-state', () => ({ + currentWorkspaceIdAtom: mockCurrentWorkspaceIdAtom, +})) +vi.mock('@/context/system-features-state', () => ({ currentWorkspaceIdAtom: mockCurrentWorkspaceIdAtom, })) diff --git a/web/app/components/plugins/install-plugin/base/use-get-icon.ts b/web/app/components/plugins/install-plugin/base/use-get-icon.ts index b390a7e951f..76a73a40369 100644 --- a/web/app/components/plugins/install-plugin/base/use-get-icon.ts +++ b/web/app/components/plugins/install-plugin/base/use-get-icon.ts @@ -1,7 +1,7 @@ import { useAtomValue } from 'jotai' import { useCallback } from 'react' import { API_PREFIX } from '@/config' -import { currentWorkspaceIdAtom } from '@/context/app-context-state' +import { currentWorkspaceIdAtom } from '@/context/workspace-state' const useGetIcon = () => { const currentWorkspaceId = useAtomValue(currentWorkspaceIdAtom) diff --git a/web/app/components/plugins/install-plugin/hooks/__tests__/use-workspace-plugin-install-permission.spec.ts b/web/app/components/plugins/install-plugin/hooks/__tests__/use-workspace-plugin-install-permission.spec.ts index f7ab89645e2..e592d8c509b 100644 --- a/web/app/components/plugins/install-plugin/hooks/__tests__/use-workspace-plugin-install-permission.spec.ts +++ b/web/app/components/plugins/install-plugin/hooks/__tests__/use-workspace-plugin-install-permission.spec.ts @@ -4,7 +4,67 @@ import useWorkspacePluginInstallPermission from '../use-workspace-plugin-install let mockWorkspacePermissionKeys: string[] = [] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + langGeniusVersionInfo: { + current_env: '', + current_version: '1.0.0', + latest_version: '', + release_date: '', + release_notes: '', + version: '', + can_auto_update: false, + }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + langGeniusVersionInfo: { + current_env: '', + current_version: '1.0.0', + latest_version: '', + release_date: '', + release_notes: '', + version: '', + can_auto_update: false, + }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + langGeniusVersionInfo: { + current_env: '', + current_version: '1.0.0', + latest_version: '', + release_date: '', + release_notes: '', + version: '', + can_auto_update: false, + }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + langGeniusVersionInfo: { + current_env: '', + current_version: '1.0.0', + latest_version: '', + release_date: '', + release_notes: '', + version: '', + can_auto_update: false, + }, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ langGeniusVersionInfo: { diff --git a/web/app/components/plugins/install-plugin/hooks/use-workspace-plugin-install-permission.ts b/web/app/components/plugins/install-plugin/hooks/use-workspace-plugin-install-permission.ts index 5e408886b23..9ff4e3c3826 100644 --- a/web/app/components/plugins/install-plugin/hooks/use-workspace-plugin-install-permission.ts +++ b/web/app/components/plugins/install-plugin/hooks/use-workspace-plugin-install-permission.ts @@ -1,6 +1,7 @@ import { useAtomValue } from 'jotai' import { useMemo } from 'react' -import { langGeniusVersionInfoAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' import { hasPermission } from '@/utils/permission' const useWorkspacePluginInstallPermission = () => { diff --git a/web/app/components/plugins/install-plugin/install-from-local-package/steps/__tests__/install.spec.tsx b/web/app/components/plugins/install-plugin/install-from-local-package/steps/__tests__/install.spec.tsx index 3b2057b4c05..698ff353897 100644 --- a/web/app/components/plugins/install-plugin/install-from-local-package/steps/__tests__/install.spec.tsx +++ b/web/app/components/plugins/install-plugin/install-from-local-package/steps/__tests__/install.spec.tsx @@ -62,7 +62,19 @@ const mockAppContextState = vi.hoisted(() => ({ langGeniusVersionInfo: { current_version: '1.0.0' as string | undefined }, })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, +})) +vi.mock('@/context/permission-state', () => ({ + langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, +})) +vi.mock('@/context/version-state', () => ({ + langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, +})) +vi.mock('@/context/system-features-state', () => ({ langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, })) diff --git a/web/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx b/web/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx index 6fda49807a8..8893caf3ec2 100644 --- a/web/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx +++ b/web/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx @@ -8,7 +8,7 @@ import * as React from 'react' import { useEffect, useMemo } from 'react' import { Trans, useTranslation } from 'react-i18next' import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed' -import { langGeniusVersionInfoAtom } from '@/context/app-context-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' import { uninstallPlugin } from '@/service/plugins' import { useInstallPackageFromLocal, usePluginTaskList } from '@/service/use-plugins' import { isEqualOrLaterThanVersion } from '@/utils/semver' diff --git a/web/app/components/plugins/install-plugin/install-from-marketplace/steps/__tests__/install.spec.tsx b/web/app/components/plugins/install-plugin/install-from-marketplace/steps/__tests__/install.spec.tsx index 7f878293e95..93151c02081 100644 --- a/web/app/components/plugins/install-plugin/install-from-marketplace/steps/__tests__/install.spec.tsx +++ b/web/app/components/plugins/install-plugin/install-from-marketplace/steps/__tests__/install.spec.tsx @@ -74,7 +74,19 @@ vi.mock('@/app/components/plugins/install-plugin/hooks/use-check-installed', () }), })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, +})) +vi.mock('@/context/permission-state', () => ({ + langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, +})) +vi.mock('@/context/version-state', () => ({ + langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, +})) +vi.mock('@/context/system-features-state', () => ({ langGeniusVersionInfoAtom: mockAppContextState.langGeniusVersionInfoAtom, })) diff --git a/web/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx b/web/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx index c8d934a39d4..8b0118c164e 100644 --- a/web/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx +++ b/web/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx @@ -8,7 +8,7 @@ import * as React from 'react' import { useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed' -import { langGeniusVersionInfoAtom } from '@/context/app-context-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' import { useInstallPackageFromMarketPlace, usePluginDeclarationFromMarketPlace, usePluginTaskList, useUpdatePackageFromMarketPlace } from '@/service/use-plugins' import { isEqualOrLaterThanVersion } from '@/utils/semver' import Card from '../../../card' diff --git a/web/app/components/plugins/marketplace/marketplace-install-permission-provider.tsx b/web/app/components/plugins/marketplace/marketplace-install-permission-provider.tsx index 0e25810c6de..20dfe6ff2c3 100644 --- a/web/app/components/plugins/marketplace/marketplace-install-permission-provider.tsx +++ b/web/app/components/plugins/marketplace/marketplace-install-permission-provider.tsx @@ -3,7 +3,7 @@ import type { ReactNode } from 'react' import { useAtomValue } from 'jotai' import { PluginInstallPermissionProvider } from '@/app/components/plugins/install-plugin/components/plugin-install-permission-provider' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { hasPermission } from '@/utils/permission' type MarketplaceInstallPermissionProviderProps = { diff --git a/web/app/components/plugins/plugin-auth/__tests__/plugin-auth-in-agent.spec.tsx b/web/app/components/plugins/plugin-auth/__tests__/plugin-auth-in-agent.spec.tsx index 2858aae7f8a..6b705550efe 100644 --- a/web/app/components/plugins/plugin-auth/__tests__/plugin-auth-in-agent.spec.tsx +++ b/web/app/components/plugins/plugin-auth/__tests__/plugin-auth-in-agent.spec.tsx @@ -38,7 +38,39 @@ vi.mock('@/service/use-tools', () => ({ const mockIsCurrentWorkspaceManager = vi.fn() const mockUserProfile = { id: 'test-user', name: 'Test User', email: 'test@example.com', avatar_url: '' } -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager(), + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager(), + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager(), + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockUserProfile, + isCurrentWorkspaceManager: mockIsCurrentWorkspaceManager(), + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ userProfile: mockUserProfile, diff --git a/web/app/components/plugins/plugin-auth/__tests__/plugin-auth.spec.tsx b/web/app/components/plugins/plugin-auth/__tests__/plugin-auth.spec.tsx index 9669186bcf6..20c8b932e26 100644 --- a/web/app/components/plugins/plugin-auth/__tests__/plugin-auth.spec.tsx +++ b/web/app/components/plugins/plugin-auth/__tests__/plugin-auth.spec.tsx @@ -23,7 +23,31 @@ vi.mock('../authorized', () => ({ ), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockAppContext.workspacePermissionKeys, diff --git a/web/app/components/plugins/plugin-auth/authorize/__tests__/index.spec.tsx b/web/app/components/plugins/plugin-auth/authorize/__tests__/index.spec.tsx index 842e063edfa..e0ee8bb4585 100644 --- a/web/app/components/plugins/plugin-auth/authorize/__tests__/index.spec.tsx +++ b/web/app/components/plugins/plugin-auth/authorize/__tests__/index.spec.tsx @@ -64,7 +64,31 @@ vi.mock('@/hooks/use-oauth', () => ({ openOAuthPopup: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockAppContext.workspacePermissionKeys, diff --git a/web/app/components/plugins/plugin-auth/authorized/__tests__/index.spec.tsx b/web/app/components/plugins/plugin-auth/authorized/__tests__/index.spec.tsx index ab725d66672..10fc8745e95 100644 --- a/web/app/components/plugins/plugin-auth/authorized/__tests__/index.spec.tsx +++ b/web/app/components/plugins/plugin-auth/authorized/__tests__/index.spec.tsx @@ -80,7 +80,35 @@ const mockAppContext = vi.hoisted(() => ({ workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'] as string[], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockAppContext.userProfile, + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockAppContext.userProfile, + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockAppContext.userProfile, + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: mockAppContext.userProfile, + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ userProfile: mockAppContext.userProfile, diff --git a/web/app/components/plugins/plugin-auth/authorized/__tests__/item.spec.tsx b/web/app/components/plugins/plugin-auth/authorized/__tests__/item.spec.tsx index d2b1c694105..ff364dc6250 100644 --- a/web/app/components/plugins/plugin-auth/authorized/__tests__/item.spec.tsx +++ b/web/app/components/plugins/plugin-auth/authorized/__tests__/item.spec.tsx @@ -5,7 +5,35 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { CredentialTypeEnum } from '../../types' import Item from '../item' -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'test-user' }, + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'test-user' }, + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'test-user' }, + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'test-user' }, + workspacePermissionKeys: ['credential.use', 'credential.create', 'credential.manage'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ userProfile: { id: 'test-user' }, diff --git a/web/app/components/plugins/plugin-auth/authorized/item.tsx b/web/app/components/plugins/plugin-auth/authorized/item.tsx index 8db0a72f15e..5e02784a8a5 100644 --- a/web/app/components/plugins/plugin-auth/authorized/item.tsx +++ b/web/app/components/plugins/plugin-auth/authorized/item.tsx @@ -16,7 +16,7 @@ import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import Badge from '@/app/components/base/badge' import Input from '@/app/components/base/input' -import { userProfileIdAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useCredentialPermissions } from '@/hooks/use-credential-permissions' import { CredentialTypeEnum } from '../types' diff --git a/web/app/components/plugins/plugin-item/__tests__/index.spec.tsx b/web/app/components/plugins/plugin-item/__tests__/index.spec.tsx index 50c24df5a14..76239d4a1b9 100644 --- a/web/app/components/plugins/plugin-item/__tests__/index.spec.tsx +++ b/web/app/components/plugins/plugin-item/__tests__/index.spec.tsx @@ -74,7 +74,31 @@ const createLangGeniusVersionInfo = (currentVersion: string) => ({ can_auto_update: false, }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + langGeniusVersionInfo: mockLangGeniusVersionInfo(), + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + langGeniusVersionInfo: mockLangGeniusVersionInfo(), + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + langGeniusVersionInfo: mockLangGeniusVersionInfo(), + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + langGeniusVersionInfo: mockLangGeniusVersionInfo(), + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ langGeniusVersionInfo: mockLangGeniusVersionInfo(), diff --git a/web/app/components/plugins/plugin-item/index.tsx b/web/app/components/plugins/plugin-item/index.tsx index ac3087503ed..b7c598b559b 100644 --- a/web/app/components/plugins/plugin-item/index.tsx +++ b/web/app/components/plugins/plugin-item/index.tsx @@ -17,7 +17,7 @@ import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import useRefreshPluginList from '@/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list' import { API_PREFIX } from '@/config' -import { langGeniusVersionInfoAtom } from '@/context/app-context-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useRenderI18nObject } from '@/hooks/use-i18n' import useTheme from '@/hooks/use-theme' diff --git a/web/app/components/plugins/plugin-page/__tests__/index.spec.tsx b/web/app/components/plugins/plugin-page/__tests__/index.spec.tsx index 4d36405ee5a..444711342cf 100644 --- a/web/app/components/plugins/plugin-page/__tests__/index.spec.tsx +++ b/web/app/components/plugins/plugin-page/__tests__/index.spec.tsx @@ -47,7 +47,75 @@ vi.mock('@/context/i18n', () => ({ useDocLink: () => (path: string) => `https://docs.example.com${path}`, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + isCurrentWorkspaceOwner: false, + langGeniusVersionInfo: { + current_env: 'CLOUD', + current_version: '1.0.0', + latest_version: '1.0.0', + version: '1.0.0', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + workspacePermissionKeys: ['plugin.install', 'plugin.delete', 'plugin.debug', 'plugin.plugin_preferences'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + isCurrentWorkspaceOwner: false, + langGeniusVersionInfo: { + current_env: 'CLOUD', + current_version: '1.0.0', + latest_version: '1.0.0', + version: '1.0.0', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + workspacePermissionKeys: ['plugin.install', 'plugin.delete', 'plugin.debug', 'plugin.plugin_preferences'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + isCurrentWorkspaceOwner: false, + langGeniusVersionInfo: { + current_env: 'CLOUD', + current_version: '1.0.0', + latest_version: '1.0.0', + version: '1.0.0', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + workspacePermissionKeys: ['plugin.install', 'plugin.delete', 'plugin.debug', 'plugin.plugin_preferences'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceManager: true, + isCurrentWorkspaceOwner: false, + langGeniusVersionInfo: { + current_env: 'CLOUD', + current_version: '1.0.0', + latest_version: '1.0.0', + version: '1.0.0', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + workspacePermissionKeys: ['plugin.install', 'plugin.delete', 'plugin.debug', 'plugin.plugin_preferences'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ isCurrentWorkspaceManager: true, diff --git a/web/app/components/plugins/plugin-page/__tests__/use-reference-setting.spec.ts b/web/app/components/plugins/plugin-page/__tests__/use-reference-setting.spec.ts index 29f9f31c313..d55bad3c85b 100644 --- a/web/app/components/plugins/plugin-page/__tests__/use-reference-setting.spec.ts +++ b/web/app/components/plugins/plugin-page/__tests__/use-reference-setting.spec.ts @@ -40,7 +40,23 @@ const setAppContextState = (state: MockAppContextState) => { } } -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/plugins/plugin-page/use-reference-setting.ts b/web/app/components/plugins/plugin-page/use-reference-setting.ts index 545e7609b0e..f821420830f 100644 --- a/web/app/components/plugins/plugin-page/use-reference-setting.ts +++ b/web/app/components/plugins/plugin-page/use-reference-setting.ts @@ -4,13 +4,9 @@ import { useSuspenseQuery } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { - currentWorkspaceLoadingAtom, - langGeniusVersionInfoAtom, - workspacePermissionKeysAtom, - workspacePermissionKeysLoadingAtom, - workspaceRoleFlagsAtom, -} from '@/context/app-context-state' +import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '@/context/permission-state' +import { langGeniusVersionInfoAtom } from '@/context/version-state' +import { currentWorkspaceLoadingAtom, isCurrentWorkspaceManagerAtom, isCurrentWorkspaceOwnerAtom } from '@/context/workspace-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useInvalidateReferenceSettings, useMutationPluginPermissionSettings, useMutationReferenceSettings, usePluginAutoUpgradeSettings, usePluginPermissionSettings } from '@/service/use-plugins' import { hasPermission } from '@/utils/permission' @@ -32,10 +28,8 @@ const useCanSetPluginSettings = () => { export const usePluginSettingsAccess = () => { const { t } = useTranslation() - const { - isCurrentWorkspaceManager, - isCurrentWorkspaceOwner, - } = useAtomValue(workspaceRoleFlagsAtom) + const isCurrentWorkspaceManager = useAtomValue(isCurrentWorkspaceManagerAtom) + const isCurrentWorkspaceOwner = useAtomValue(isCurrentWorkspaceOwnerAtom) const isLoadingCurrentWorkspace = useAtomValue(currentWorkspaceLoadingAtom) const isLoadingWorkspacePermissionKeys = useAtomValue(workspacePermissionKeysLoadingAtom) const workspacePermissionKeys = useAtomValue(workspacePermissionKeysAtom) @@ -132,10 +126,8 @@ export const useCanInstallPluginFromMarketplace = () => { const { data: systemFeatures } = useSuspenseQuery(systemFeaturesQueryOptions()) const marketplaceAccess = systemFeatures.enable_marketplace const rbacEnabled = systemFeatures.rbac_enabled - const { - isCurrentWorkspaceManager, - isCurrentWorkspaceOwner, - } = useAtomValue(workspaceRoleFlagsAtom) + const isCurrentWorkspaceManager = useAtomValue(isCurrentWorkspaceManagerAtom) + const isCurrentWorkspaceOwner = useAtomValue(isCurrentWorkspaceOwnerAtom) const workspacePermissionKeys = useAtomValue(workspacePermissionKeysAtom) const permissionQuery = usePluginPermissionSettings() const { data: permissions } = permissionQuery diff --git a/web/app/components/rag-pipeline/components/conversion.tsx b/web/app/components/rag-pipeline/components/conversion.tsx index e4a1cc30d28..a95ebdc8deb 100644 --- a/web/app/components/rag-pipeline/components/conversion.tsx +++ b/web/app/components/rag-pipeline/components/conversion.tsx @@ -13,8 +13,9 @@ import { useAtomValue } from 'jotai' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useParams } from '@/next/navigation' import { datasetDetailQueryKeyPrefix } from '@/service/knowledge/use-dataset' import { useInvalid } from '@/service/use-base' 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 b125907ff34..0943c5bdb18 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 @@ -147,7 +147,51 @@ vi.mock('@/context/dataset-detail', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ 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 f269bdd63ce..bc02a8f205a 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 @@ -139,7 +139,51 @@ vi.mock('@/context/dataset-detail', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ 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 95f7d36ee24..f3e69baec44 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 @@ -156,7 +156,51 @@ vi.mock('@/context/dataset-detail', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: mockCurrentUserId, + }, + isLoadingWorkspacePermissionKeys: mockIsLoadingWorkspacePermissionKeys, + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ 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 d2ed646c505..b30a85dbc31 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 @@ -25,9 +25,10 @@ import PremiumBadge from '@/app/components/base/premium-badge' import { useChecklistBeforePublish } from '@/app/components/workflow/hooks' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { IS_CLOUD_EDITION } from '@/config' -import { userProfileIdAtom, workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useModalContextSelector } from '@/context/modal-context' +import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '@/context/permission-state' import { useProviderContextSelector } from '@/context/provider-context' import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx index e5e337d2bc2..7bb8899a5a2 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx @@ -8,8 +8,9 @@ import { import { WorkflowWithInnerContext } from '@/app/components/workflow' import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars' import { useWorkflowStore } from '@/app/components/workflow/store' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { getDatasetACLCapabilities } from '@/utils/permission' import { useAvailableNodesMetaData, diff --git a/web/app/components/snippet-list/__tests__/index.spec.tsx b/web/app/components/snippet-list/__tests__/index.spec.tsx index 173233f19fb..95318454b11 100644 --- a/web/app/components/snippet-list/__tests__/index.spec.tsx +++ b/web/app/components/snippet-list/__tests__/index.spec.tsx @@ -72,7 +72,47 @@ const mockIsCurrentWorkspaceEditor = vi.fn(() => true) const mockIsCurrentWorkspaceDatasetOperator = vi.fn(() => false) const mockWorkspacePermissionKeys = vi.fn(() => ['snippets.create_and_modify']) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'creator-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: false, + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'creator-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: false, + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'creator-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: false, + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'creator-1' }, + currentWorkspace: { id: 'workspace-1' }, + isLoadingCurrentWorkspace: false, + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/snippet-list/components/__tests__/snippet-card.spec.tsx b/web/app/components/snippet-list/components/__tests__/snippet-card.spec.tsx index 80c19ac7329..94053d41d2d 100644 --- a/web/app/components/snippet-list/components/__tests__/snippet-card.spec.tsx +++ b/web/app/components/snippet-list/components/__tests__/snippet-card.spec.tsx @@ -26,7 +26,39 @@ const { mockUpdateMutate: vi.fn(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor(), + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor(), + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor(), + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor(), + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/snippet-list/components/__tests__/snippet-create-button.spec.tsx b/web/app/components/snippet-list/components/__tests__/snippet-create-button.spec.tsx index 01961b45f6d..3b3a61142c6 100644 --- a/web/app/components/snippet-list/components/__tests__/snippet-create-button.spec.tsx +++ b/web/app/components/snippet-list/components/__tests__/snippet-create-button.spec.tsx @@ -25,7 +25,35 @@ vi.mock('@langgenius/dify-ui/toast', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/snippet-list/components/snippet-card.tsx b/web/app/components/snippet-list/components/snippet-card.tsx index 285f8d20637..fbfcba7904d 100644 --- a/web/app/components/snippet-list/components/snippet-card.tsx +++ b/web/app/components/snippet-list/components/snippet-card.tsx @@ -24,7 +24,7 @@ import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import CreateSnippetDialog from '@/app/components/snippets/create-snippet-dialog' import { canCreateAndModifySnippets, canManageSnippets } from '@/app/components/snippets/utils/permission' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { TagSelector } from '@/features/tag-management/components/tag-selector' import Link from '@/next/link' import { useMembers } from '@/service/use-common' diff --git a/web/app/components/snippet-list/index.tsx b/web/app/components/snippet-list/index.tsx index 34a01b518da..f72c2dfd185 100644 --- a/web/app/components/snippet-list/index.tsx +++ b/web/app/components/snippet-list/index.tsx @@ -8,7 +8,8 @@ import { useDebounce } from 'ahooks' import { useAtomValue } from 'jotai' import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import { currentWorkspaceLoadingAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' +import { currentWorkspaceLoadingAtom } from '@/context/workspace-state' import { TagFilter } from '@/features/tag-management/components/tag-filter' import useDocumentTitle from '@/hooks/use-document-title' import dynamic from '@/next/dynamic' diff --git a/web/app/components/snippets/__tests__/import-snippet-dsl-dialog.spec.tsx b/web/app/components/snippets/__tests__/import-snippet-dsl-dialog.spec.tsx index 7d8f4a76c38..455dff64ef2 100644 --- a/web/app/components/snippets/__tests__/import-snippet-dsl-dialog.spec.tsx +++ b/web/app/components/snippets/__tests__/import-snippet-dsl-dialog.spec.tsx @@ -24,7 +24,35 @@ vi.mock('@/next/navigation', () => ({ useRouter: () => routerMocks, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: contextMocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: contextMocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: contextMocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: contextMocks.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx b/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx index 26a99f44473..4818f0920d9 100644 --- a/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx +++ b/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx @@ -52,7 +52,35 @@ vi.mock('@langgenius/dify-ui/toast', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockAppContext.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/snippets/components/snippet-main.tsx b/web/app/components/snippets/components/snippet-main.tsx index 55b860bb50b..a767d9d6d38 100644 --- a/web/app/components/snippets/components/snippet-main.tsx +++ b/web/app/components/snippets/components/snippet-main.tsx @@ -24,7 +24,7 @@ import { initialEdges, initialNodes, } from '@/app/components/workflow/utils' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useSnippetDraftStore } from '../draft-store' import { useConfigsMap } from '../hooks/use-configs-map' import { useGetRunAndTraceUrl } from '../hooks/use-get-run-and-trace-url' diff --git a/web/app/components/snippets/hooks/__tests__/use-create-snippet.spec.tsx b/web/app/components/snippets/hooks/__tests__/use-create-snippet.spec.tsx index 4ea1fdaa822..052f9c10acc 100644 --- a/web/app/components/snippets/hooks/__tests__/use-create-snippet.spec.tsx +++ b/web/app/components/snippets/hooks/__tests__/use-create-snippet.spec.tsx @@ -43,7 +43,35 @@ vi.mock('@/service/client', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys(), + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/snippets/hooks/use-create-snippet.ts b/web/app/components/snippets/hooks/use-create-snippet.ts index 6dd43379d33..2719593f979 100644 --- a/web/app/components/snippets/hooks/use-create-snippet.ts +++ b/web/app/components/snippets/hooks/use-create-snippet.ts @@ -3,7 +3,7 @@ import { toast } from '@langgenius/dify-ui/toast' import { useAtomValue } from 'jotai' import { useState } from 'react' import { useTranslation } from 'react-i18next' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useRouter } from '@/next/navigation' import { consoleClient } from '@/service/client' import { useCreateSnippetMutation } from '@/service/use-snippets' diff --git a/web/app/components/snippets/import-snippet-dsl-dialog.tsx b/web/app/components/snippets/import-snippet-dsl-dialog.tsx index 4c1dcfa65d3..249b9b3b11b 100644 --- a/web/app/components/snippets/import-snippet-dsl-dialog.tsx +++ b/web/app/components/snippets/import-snippet-dsl-dialog.tsx @@ -20,7 +20,7 @@ import { useAtomValue } from 'jotai' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import Uploader from '@/app/components/app/create-from-dsl-modal/uploader' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useRouter } from '@/next/navigation' import { useConfirmSnippetImportMutation, diff --git a/web/app/components/tools/hooks/use-tool-permissions.ts b/web/app/components/tools/hooks/use-tool-permissions.ts index b5d39bf7aae..33931805069 100644 --- a/web/app/components/tools/hooks/use-tool-permissions.ts +++ b/web/app/components/tools/hooks/use-tool-permissions.ts @@ -1,7 +1,7 @@ 'use client' import { useAtomValue } from 'jotai' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { hasPermission } from '@/utils/permission' export const useCanManageTools = () => { diff --git a/web/app/components/tools/mcp/__tests__/create-card.spec.tsx b/web/app/components/tools/mcp/__tests__/create-card.spec.tsx index 3a8650d9642..c24b5382a01 100644 --- a/web/app/components/tools/mcp/__tests__/create-card.spec.tsx +++ b/web/app/components/tools/mcp/__tests__/create-card.spec.tsx @@ -45,7 +45,19 @@ const mockAppContextState = vi.hoisted(() => ({ workspacePermissionKeysAtom: Symbol('workspacePermissionKeysAtom'), })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/permission-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/version-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/system-features-state', () => ({ workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, })) diff --git a/web/app/components/tools/mcp/__tests__/index.spec.tsx b/web/app/components/tools/mcp/__tests__/index.spec.tsx index 48a6e7e1388..a6b4cc61ced 100644 --- a/web/app/components/tools/mcp/__tests__/index.spec.tsx +++ b/web/app/components/tools/mcp/__tests__/index.spec.tsx @@ -31,7 +31,19 @@ vi.mock('@/service/use-tools', () => ({ }, })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/permission-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/version-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/system-features-state', () => ({ workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, })) diff --git a/web/app/components/tools/mcp/__tests__/provider-card.spec.tsx b/web/app/components/tools/mcp/__tests__/provider-card.spec.tsx index 8069a5e9aa4..34ac824637a 100644 --- a/web/app/components/tools/mcp/__tests__/provider-card.spec.tsx +++ b/web/app/components/tools/mcp/__tests__/provider-card.spec.tsx @@ -86,7 +86,19 @@ const mockAppContextState = vi.hoisted(() => ({ workspacePermissionKeysAtom: Symbol('workspacePermissionKeysAtom'), })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/permission-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/version-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/system-features-state', () => ({ workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, })) diff --git a/web/app/components/tools/mcp/detail/__tests__/content.spec.tsx b/web/app/components/tools/mcp/detail/__tests__/content.spec.tsx index 78116a1c408..793d6b61717 100644 --- a/web/app/components/tools/mcp/detail/__tests__/content.spec.tsx +++ b/web/app/components/tools/mcp/detail/__tests__/content.spec.tsx @@ -114,7 +114,19 @@ const mockAppContextState = vi.hoisted(() => ({ // Mock the app context -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/permission-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/version-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/system-features-state', () => ({ workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, })) diff --git a/web/app/components/tools/mcp/hooks/use-mcp-service-card.ts b/web/app/components/tools/mcp/hooks/use-mcp-service-card.ts index 074bf83ee0c..05e82e08a6d 100644 --- a/web/app/components/tools/mcp/hooks/use-mcp-service-card.ts +++ b/web/app/components/tools/mcp/hooks/use-mcp-service-card.ts @@ -5,7 +5,8 @@ import { useQuery, useQueryClient } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import { useCallback, useMemo, useState } from 'react' import { BlockEnum } from '@/app/components/workflow/types' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { fetchAppDetail } from '@/service/apps' import { useInvalidateMCPServerDetail, diff --git a/web/app/components/tools/provider/__tests__/custom-create-card.spec.tsx b/web/app/components/tools/provider/__tests__/custom-create-card.spec.tsx index d0e05c583c0..d462d8d296f 100644 --- a/web/app/components/tools/provider/__tests__/custom-create-card.spec.tsx +++ b/web/app/components/tools/provider/__tests__/custom-create-card.spec.tsx @@ -9,7 +9,19 @@ const mockAppContextState = vi.hoisted(() => ({ workspacePermissionKeysAtom: Symbol('workspacePermissionKeysAtom'), })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/permission-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/version-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/system-features-state', () => ({ workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, })) diff --git a/web/app/components/tools/provider/__tests__/detail.spec.tsx b/web/app/components/tools/provider/__tests__/detail.spec.tsx index 06ad5afbfc8..c3301fca0df 100644 --- a/web/app/components/tools/provider/__tests__/detail.spec.tsx +++ b/web/app/components/tools/provider/__tests__/detail.spec.tsx @@ -17,7 +17,19 @@ const mockAppContextState = vi.hoisted(() => ({ workspacePermissionKeysAtom: Symbol('workspacePermissionKeysAtom'), })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/permission-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/version-state', () => ({ + workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, +})) +vi.mock('@/context/system-features-state', () => ({ workspacePermissionKeysAtom: mockAppContextState.workspacePermissionKeysAtom, })) diff --git a/web/app/components/workflow-app/__tests__/index.spec.tsx b/web/app/components/workflow-app/__tests__/index.spec.tsx index 29a9be085e3..7f4b9ee1f1f 100644 --- a/web/app/components/workflow-app/__tests__/index.spec.tsx +++ b/web/app/components/workflow-app/__tests__/index.spec.tsx @@ -84,7 +84,47 @@ vi.mock('@/app/components/workflow/store/trigger-status', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + isLoadingCurrentWorkspace: appContextState.isLoadingCurrentWorkspace, + currentWorkspace: appContextState.currentWorkspace, + userProfile: appContextState.userProfile, + workspacePermissionKeys: appContextState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + isLoadingCurrentWorkspace: appContextState.isLoadingCurrentWorkspace, + currentWorkspace: appContextState.currentWorkspace, + userProfile: appContextState.userProfile, + workspacePermissionKeys: appContextState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + isLoadingCurrentWorkspace: appContextState.isLoadingCurrentWorkspace, + currentWorkspace: appContextState.currentWorkspace, + userProfile: appContextState.userProfile, + workspacePermissionKeys: appContextState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + isLoadingCurrentWorkspace: appContextState.isLoadingCurrentWorkspace, + currentWorkspace: appContextState.currentWorkspace, + userProfile: appContextState.userProfile, + workspacePermissionKeys: appContextState.workspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/workflow-app/components/workflow-main.tsx b/web/app/components/workflow-app/components/workflow-main.tsx index a16b6c831a5..e563a46c625 100644 --- a/web/app/components/workflow-app/components/workflow-main.tsx +++ b/web/app/components/workflow-app/components/workflow-main.tsx @@ -22,7 +22,8 @@ import { useCollaboration } from '@/app/components/workflow/collaboration/hooks/ import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { SupportUploadFileTypes } from '@/app/components/workflow/types' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { fetchWorkflowDraft } from '@/service/workflow' import { getAppACLCapabilities } from '@/utils/permission' import { diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-init.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-workflow-init.spec.ts index fb5c2135924..be1e6f17df5 100644 --- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-init.spec.ts +++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-init.spec.ts @@ -46,7 +46,39 @@ vi.mock('@/app/components/app/store', () => ({ selector(appStoreState), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['app.create_and_management'], + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['app.create_and_management'], + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['app.create_and_management'], + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + workspacePermissionKeys: ['app.create_and_management'], + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/app/components/workflow-app/hooks/use-workflow-init.ts b/web/app/components/workflow-app/hooks/use-workflow-init.ts index 782a8970699..5c026d26a25 100644 --- a/web/app/components/workflow-app/hooks/use-workflow-init.ts +++ b/web/app/components/workflow-app/hooks/use-workflow-init.ts @@ -14,7 +14,8 @@ import { useWorkflowStore, } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useWorkflowConfig } from '@/service/use-workflow' import { fetchNodesDefaultConfigs, diff --git a/web/app/components/workflow-app/index.tsx b/web/app/components/workflow-app/index.tsx index ae0f90abf95..35eaa35908d 100644 --- a/web/app/components/workflow-app/index.tsx +++ b/web/app/components/workflow-app/index.tsx @@ -20,7 +20,9 @@ import { initialEdges, initialNodes, } from '@/app/components/workflow/utils' -import { currentWorkspaceAtom, currentWorkspaceLoadingAtom, userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' +import { currentWorkspaceAtom, currentWorkspaceLoadingAtom } from '@/context/workspace-state' import { useSearchParams } from '@/next/navigation' import { fetchRunDetail } from '@/service/log' import { useAppTriggers } from '@/service/use-tools' diff --git a/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx b/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx index bface11be0d..050c7d845f4 100644 --- a/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx +++ b/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx @@ -23,7 +23,31 @@ const mockWorkspacePermissionKeys = vi.hoisted(() => ({ value: ['snippets.create_and_modify'] as string[], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys.value, diff --git a/web/app/components/workflow/block-selector/__tests__/tool-picker.spec.tsx b/web/app/components/workflow/block-selector/__tests__/tool-picker.spec.tsx index be94e8fb143..8f316580ab6 100644 --- a/web/app/components/workflow/block-selector/__tests__/tool-picker.spec.tsx +++ b/web/app/components/workflow/block-selector/__tests__/tool-picker.spec.tsx @@ -63,7 +63,31 @@ vi.mock('@/config', async (importOriginal) => { } }) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/app/components/workflow/comment/comment-icon.spec.tsx b/web/app/components/workflow/comment/comment-icon.spec.tsx index db0b9a81066..27ba2fb8028 100644 --- a/web/app/components/workflow/comment/comment-icon.spec.tsx +++ b/web/app/components/workflow/comment/comment-icon.spec.tsx @@ -29,7 +29,47 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + ...mockAppContextState, + userProfile: { + ...mockAppContextState.userProfile, + id: mockUserId, + }, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + ...mockAppContextState, + userProfile: { + ...mockAppContextState.userProfile, + id: mockUserId, + }, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + ...mockAppContextState, + userProfile: { + ...mockAppContextState.userProfile, + id: mockUserId, + }, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + ...mockAppContextState, + userProfile: { + ...mockAppContextState.userProfile, + id: mockUserId, + }, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ ...mockAppContextState, diff --git a/web/app/components/workflow/comment/comment-icon.tsx b/web/app/components/workflow/comment/comment-icon.tsx index e46576e145d..a9522f735bf 100644 --- a/web/app/components/workflow/comment/comment-icon.tsx +++ b/web/app/components/workflow/comment/comment-icon.tsx @@ -6,7 +6,7 @@ import { useAtomValue } from 'jotai' import { memo, useCallback, useMemo, useRef, useState } from 'react' import { useReactFlow, useViewport } from 'reactflow' import { UserAvatarList } from '@/app/components/base/user-avatar-list' -import { userProfileIdAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import CommentPreview from './comment-preview' type CommentIconProps = { diff --git a/web/app/components/workflow/comment/comment-input.spec.tsx b/web/app/components/workflow/comment/comment-input.spec.tsx index 39b3b919095..9c1ac19417e 100644 --- a/web/app/components/workflow/comment/comment-input.spec.tsx +++ b/web/app/components/workflow/comment/comment-input.spec.tsx @@ -32,7 +32,23 @@ vi.mock('react-i18next', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/comment/comment-input.tsx b/web/app/components/workflow/comment/comment-input.tsx index 2d616e3a798..38c280d65d2 100644 --- a/web/app/components/workflow/comment/comment-input.tsx +++ b/web/app/components/workflow/comment/comment-input.tsx @@ -4,7 +4,7 @@ import { cn } from '@langgenius/dify-ui/cn' import { useAtomValue } from 'jotai' import { memo, useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { MentionInput } from './mention-input' type CommentInputProps = { diff --git a/web/app/components/workflow/comment/thread.spec.tsx b/web/app/components/workflow/comment/thread.spec.tsx index 12589787cb8..2f975bbfb8d 100644 --- a/web/app/components/workflow/comment/thread.spec.tsx +++ b/web/app/components/workflow/comment/thread.spec.tsx @@ -38,7 +38,23 @@ vi.mock('@/hooks/use-format-time-from-now', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/comment/thread.tsx b/web/app/components/workflow/comment/thread.tsx index 1d4b9545449..0033c464a26 100644 --- a/web/app/components/workflow/comment/thread.tsx +++ b/web/app/components/workflow/comment/thread.tsx @@ -18,7 +18,7 @@ import { useReactFlow, useViewport } from 'reactflow' import Divider from '@/app/components/base/divider' import InlineDeleteConfirm from '@/app/components/base/inline-delete-confirm' import { getUserColor } from '@/app/components/workflow/collaboration/utils/user-color' -import { userProfileAtom, userProfileIdAtom } from '@/context/app-context-state' +import { userProfileAtom, userProfileIdAtom } from '@/context/account-state' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' import { useParams } from '@/next/navigation' import { useStore } from '../store' diff --git a/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx b/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx index 3a7de5e518d..8334066ebc2 100644 --- a/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx +++ b/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx @@ -20,7 +20,23 @@ const mockAppContextState = vi.hoisted(() => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx b/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx index a93aaa2a4cd..64f09f3cf12 100644 --- a/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx +++ b/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx @@ -32,7 +32,23 @@ const mockAppContextState = vi.hoisted(() => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/header/header-in-restoring.tsx b/web/app/components/workflow/header/header-in-restoring.tsx index cb1ab7c7d64..044e67796be 100644 --- a/web/app/components/workflow/header/header-in-restoring.tsx +++ b/web/app/components/workflow/header/header-in-restoring.tsx @@ -10,7 +10,7 @@ import { import { useTranslation } from 'react-i18next' import { PlanUpgradeModal } from '@/app/components/billing/plan-upgrade-modal' import { Plan } from '@/app/components/billing/type' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useProviderContext } from '@/context/provider-context' import useTheme from '@/hooks/use-theme' import { useInvalidAllLastRun, useResetWorkflowVersionHistory, useRestoreWorkflow } from '@/service/use-workflow' diff --git a/web/app/components/workflow/header/online-users.tsx b/web/app/components/workflow/header/online-users.tsx index 2094f69d526..68767fe99b7 100644 --- a/web/app/components/workflow/header/online-users.tsx +++ b/web/app/components/workflow/header/online-users.tsx @@ -13,7 +13,7 @@ import { useAtomValue } from 'jotai' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useReactFlow } from 'reactflow' -import { userProfileIdAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { getAvatar } from '@/service/common' import { useCollaboration } from '../collaboration/hooks/use-collaboration' import { getUserColor } from '../collaboration/utils/user-color' diff --git a/web/app/components/workflow/hooks/__tests__/use-node-plugin-installation.spec.ts b/web/app/components/workflow/hooks/__tests__/use-node-plugin-installation.spec.ts index 11ec795db5f..deeb72fe544 100644 --- a/web/app/components/workflow/hooks/__tests__/use-node-plugin-installation.spec.ts +++ b/web/app/components/workflow/hooks/__tests__/use-node-plugin-installation.spec.ts @@ -15,7 +15,31 @@ const mockInvalidateTriggers = vi.fn() const mockInvalidDataSourceList = vi.fn() let mockWorkspacePermissionKeys = ['plugin.install'] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/app/components/workflow/hooks/__tests__/use-workflow-comment.spec.ts b/web/app/components/workflow/hooks/__tests__/use-workflow-comment.spec.ts index 834527abd2a..8864193e462 100644 --- a/web/app/components/workflow/hooks/__tests__/use-workflow-comment.spec.ts +++ b/web/app/components/workflow/hooks/__tests__/use-workflow-comment.spec.ts @@ -49,7 +49,23 @@ vi.mock('@/next/navigation', () => ({ useParams: () => ({ appId: 'app-1' }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/hooks/use-workflow-comment.ts b/web/app/components/workflow/hooks/use-workflow-comment.ts index 04b17449771..9ec042cebe3 100644 --- a/web/app/components/workflow/hooks/use-workflow-comment.ts +++ b/web/app/components/workflow/hooks/use-workflow-comment.ts @@ -4,7 +4,7 @@ import { useAtomValue } from 'jotai' import { useCallback, useEffect, useMemo, useRef } from 'react' import { useReactFlow } from 'reactflow' import { collaborationManager } from '@/app/components/workflow/collaboration/core/collaboration-manager' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useParams } from '@/next/navigation' import { consoleClient } from '@/service/client' diff --git a/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx index 51a3f8813d8..c7e7f941db7 100644 --- a/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx +++ b/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx @@ -21,7 +21,23 @@ const mockAppContextState = vi.hoisted(() => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx index 515f307db56..2a96d2f38fe 100644 --- a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx +++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx @@ -70,7 +70,7 @@ import { hasRetryNode, isSupportCustomRunForm, } from '@/app/components/workflow/utils' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useAllBuiltInTools } from '@/service/use-tools' import { useAllTriggerPlugins } from '@/service/use-triggers' import { FlowType } from '@/types/common' diff --git a/web/app/components/workflow/nodes/_base/node.tsx b/web/app/components/workflow/nodes/_base/node.tsx index 80eeadad016..6aa40139a74 100644 --- a/web/app/components/workflow/nodes/_base/node.tsx +++ b/web/app/components/workflow/nodes/_base/node.tsx @@ -29,7 +29,7 @@ import { NodeRunningStatus, } from '@/app/components/workflow/types' import { hasErrorHandleNode, hasRetryNode } from '@/app/components/workflow/utils' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { selectWorkflowNode } from '../../utils/node-navigation' import AddVariablePopupWithPosition from './components/add-variable-popup-with-position' import EntryNodeContainer, { StartNodeTypeEnum } from './components/entry-node-container' diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/email-configure-modal.spec.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/email-configure-modal.spec.tsx index 0c88cde561d..7ebc50e195a 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/email-configure-modal.spec.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/email-configure-modal.spec.tsx @@ -15,7 +15,23 @@ vi.mock('@langgenius/dify-ui/toast', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/method-item.spec.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/method-item.spec.tsx index 5b9dd7c5494..43ed33916e2 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/method-item.spec.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/method-item.spec.tsx @@ -26,7 +26,23 @@ const mockAppContextState = vi.hoisted(() => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/test-email-sender.spec.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/test-email-sender.spec.tsx index 24d0e1a446b..07073583858 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/test-email-sender.spec.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/test-email-sender.spec.tsx @@ -31,7 +31,23 @@ const mockAppContextState = vi.hoisted(() => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/email-configure-modal.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/email-configure-modal.tsx index 067b20efe89..d330ab2217a 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/email-configure-modal.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/email-configure-modal.tsx @@ -12,7 +12,7 @@ import { useAtomValue } from 'jotai' import { memo, useCallback, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import Input from '@/app/components/base/input' -import { userProfileEmailAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' import MailBodyInput from './mail-body-input' import Recipient from './recipient' diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/method-item.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/method-item.tsx index a405b24e10d..7d4b4b53ec7 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/method-item.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/method-item.tsx @@ -21,7 +21,7 @@ import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import ActionButton, { ActionButtonState } from '@/app/components/base/action-button' import Badge from '@/app/components/base/badge/index' -import { userProfileEmailAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' import { DeliveryMethodType } from '../../types' import EmailConfigureModal from './email-configure-modal' import TestEmailSender from './test-email-sender' diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/recipient/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/recipient/__tests__/index.spec.tsx index feaeabddf61..2a8e63614bc 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/recipient/__tests__/index.spec.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/recipient/__tests__/index.spec.tsx @@ -13,7 +13,23 @@ vi.mock('react-i18next', () => ({ useTranslation: () => mockUseTranslation(), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/recipient/index.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/recipient/index.tsx index 590ce525558..27a907a91c9 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/recipient/index.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/recipient/index.tsx @@ -6,7 +6,8 @@ import { produce } from 'immer' import { useAtomValue } from 'jotai' import { memo } from 'react' import { useTranslation } from 'react-i18next' -import { currentWorkspaceAtom, userProfileEmailAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' +import { currentWorkspaceAtom } from '@/context/workspace-state' import { useMembers } from '@/service/use-common' import EmailInput from './email-input' import MemberSelector from './member-selector' diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/test-email-sender.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/test-email-sender.tsx index 69dd076a745..e4c4736c5ad 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/test-email-sender.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/test-email-sender.tsx @@ -25,7 +25,8 @@ import { isSystemVar, } from '@/app/components/workflow/nodes/_base/components/variable/utils' import { InputVarType, VarType } from '@/app/components/workflow/types' -import { currentWorkspaceAtom, userProfileEmailAtom } from '@/context/app-context-state' +import { userProfileEmailAtom } from '@/context/account-state' +import { currentWorkspaceAtom } from '@/context/workspace-state' import { useMembers } from '@/service/use-common' import { useTestEmailSender } from '@/service/use-workflow' import { getHumanInputFormDependencySelectors, isOutput } from '../../utils' diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/integration.spec.tsx b/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/integration.spec.tsx index f08d672fc82..15cc0e5d95c 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/integration.spec.tsx +++ b/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/integration.spec.tsx @@ -134,7 +134,23 @@ const mockAppContextState = vi.hoisted(() => ({ workspacePermissionKeys: [] as string[], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx b/web/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx index f3f38130ea3..41c4337b455 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx +++ b/web/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx @@ -6,7 +6,8 @@ import { useAtomValue } from 'jotai' import * as React from 'react' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { getDatasetACLCapabilities } from '@/utils/permission' import Item from './dataset-item' diff --git a/web/app/components/workflow/operator/hooks.ts b/web/app/components/workflow/operator/hooks.ts index eae5fef0362..e641c2c6e3a 100644 --- a/web/app/components/workflow/operator/hooks.ts +++ b/web/app/components/workflow/operator/hooks.ts @@ -1,7 +1,7 @@ import type { NoteNodeType } from '../note-node/types' import { useAtomValue } from 'jotai' import { useCallback } from 'react' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { CUSTOM_NOTE_NODE, } from '../note-node/constants' diff --git a/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx index fadf667628e..c256a12a57e 100644 --- a/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx +++ b/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx @@ -71,7 +71,23 @@ vi.mock('@/hooks/use-format-time-from-now', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/panel/comments-panel/index.tsx b/web/app/components/workflow/panel/comments-panel/index.tsx index 84c25c8d3b0..7f12c9a5855 100644 --- a/web/app/components/workflow/panel/comments-panel/index.tsx +++ b/web/app/components/workflow/panel/comments-panel/index.tsx @@ -10,7 +10,7 @@ import { UserAvatarList } from '@/app/components/base/user-avatar-list' import { useWorkflowComment } from '@/app/components/workflow/hooks/use-workflow-comment' import { useStore } from '@/app/components/workflow/store' import { ControlMode } from '@/app/components/workflow/types' -import { userProfileIdAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' const CommentsPanel = () => { diff --git a/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx index 3f17277dcbc..d1ba0aa5be8 100644 --- a/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx +++ b/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx @@ -65,7 +65,23 @@ type MockVersionHistoryItemProps = { handleClickActionMenuItem: (operation: VersionHistoryContextMenuOptions) => void } -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockAppContextState) }) diff --git a/web/app/components/workflow/panel/version-history-panel/index.tsx b/web/app/components/workflow/panel/version-history-panel/index.tsx index ec47de5cb84..d4ed49ba2bc 100644 --- a/web/app/components/workflow/panel/version-history-panel/index.tsx +++ b/web/app/components/workflow/panel/version-history-panel/index.tsx @@ -11,7 +11,7 @@ import VersionInfoModal from '@/app/components/app/app-publisher/version-info-mo import Divider from '@/app/components/base/divider' import { PlanUpgradeModal } from '@/app/components/billing/plan-upgrade-modal' import { Plan } from '@/app/components/billing/type' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useProviderContext } from '@/context/provider-context' import { useDeleteWorkflow, useInvalidAllLastRun, useResetWorkflowVersionHistory, useRestoreWorkflow, useUpdateWorkflow, useWorkflowVersionHistory } from '@/service/use-workflow' import { useDSL, useWorkflowRefreshDraft, useWorkflowRun } from '../../hooks' diff --git a/web/app/components/workflow/selection-contextmenu.tsx b/web/app/components/workflow/selection-contextmenu.tsx index 6353890e664..96eea98b023 100644 --- a/web/app/components/workflow/selection-contextmenu.tsx +++ b/web/app/components/workflow/selection-contextmenu.tsx @@ -16,7 +16,7 @@ import { useStore as useReactFlowStore } from 'reactflow' import { useCreateSnippetFromSelection } from '@/app/components/snippets/hooks/use-create-snippet-from-selection' import { canCreateAndModifySnippets } from '@/app/components/snippets/utils/permission' import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useNodesInteractions, useNodesReadOnly, useNodesSyncDraft } from './hooks' import { useWorkflowHistory, WorkflowHistoryEvent } from './hooks/use-workflow-history' import { ShortcutKbd } from './shortcuts/shortcut-kbd' diff --git a/web/app/education-apply/education-apply-page.tsx b/web/app/education-apply/education-apply-page.tsx index 7ab654d0b63..2dab5e14072 100644 --- a/web/app/education-apply/education-apply-page.tsx +++ b/web/app/education-apply/education-apply-page.tsx @@ -14,9 +14,10 @@ import { Trans, useTranslation } from 'react-i18next' import { useEducationDiscount } from '@/app/components/billing/hooks/use-education-discount' import { Plan } from '@/app/components/billing/type' import { useSetEducationVerifying } from '@/app/education-apply/storage' -import { currentWorkspaceAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' import { useDocLink } from '@/context/i18n' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { useProviderContext } from '@/context/provider-context' +import { currentWorkspaceAtom } from '@/context/workspace-state' import { useAsyncWindowOpen } from '@/hooks/use-async-window-open' import { useRouter, diff --git a/web/app/education-apply/user-info.tsx b/web/app/education-apply/user-info.tsx index 2abd17eb238..ccc725e5f78 100644 --- a/web/app/education-apply/user-info.tsx +++ b/web/app/education-apply/user-info.tsx @@ -3,7 +3,7 @@ import { Button } from '@langgenius/dify-ui/button' import { useAtomValue } from 'jotai' import { useTranslation } from 'react-i18next' import { Triangle } from '@/app/components/base/icons/src/public/education' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { useRouter } from '@/next/navigation' import { useLogout } from '@/service/use-common' diff --git a/web/context/__tests__/console-bootstrap.spec.tsx b/web/context/__tests__/console-bootstrap.spec.tsx index 2b26a7e9b14..a54c21667a2 100644 --- a/web/context/__tests__/console-bootstrap.spec.tsx +++ b/web/context/__tests__/console-bootstrap.spec.tsx @@ -10,18 +10,19 @@ import { setUserId, setUserProperties } from '@/app/components/base/amplitude' import { flushRegistrationSuccess } from '@/app/components/base/amplitude/registration-tracking' import { setZendeskConversationFields } from '@/app/components/base/zendesk/utils' import { ZENDESK_FIELD_IDS } from '@/config' +import { refreshUserProfileAtom, userProfileAtom } from '../account-state' import { initialWorkspaceInfo } from '../app-context-defaults' +import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom } from '../permission-state' +import { langGeniusVersionInfoAtom } from '../version-state' import { currentWorkspaceAtom, currentWorkspaceLoadingAtom, - langGeniusVersionInfoAtom, + isCurrentWorkspaceDatasetOperatorAtom, + isCurrentWorkspaceEditorAtom, + isCurrentWorkspaceManagerAtom, + isCurrentWorkspaceOwnerAtom, refreshCurrentWorkspaceAtom, - refreshUserProfileAtom, - userProfileAtom, - workspacePermissionKeysAtom, - workspacePermissionKeysLoadingAtom, - workspaceRoleFlagsAtom, -} from '../app-context-state' +} from '../workspace-state' const mockGetRequest = vi.hoisted(() => vi.fn()) const mockPermissionKeysState = vi.hoisted(() => ({ @@ -194,7 +195,10 @@ vi.mock('@/app/components/header/maintenance-notice', () => ({ function ConsoleBootstrapProbe() { const userProfile = useAtomValue(userProfileAtom) const currentWorkspace = useAtomValue(currentWorkspaceAtom) - const roleFlags = useAtomValue(workspaceRoleFlagsAtom) + const isCurrentWorkspaceManager = useAtomValue(isCurrentWorkspaceManagerAtom) + const isCurrentWorkspaceOwner = useAtomValue(isCurrentWorkspaceOwnerAtom) + const isCurrentWorkspaceEditor = useAtomValue(isCurrentWorkspaceEditorAtom) + const isCurrentWorkspaceDatasetOperator = useAtomValue(isCurrentWorkspaceDatasetOperatorAtom) const workspacePermissionKeys = useAtomValue(workspacePermissionKeysAtom) const isLoadingWorkspacePermissionKeys = useAtomValue(workspacePermissionKeysLoadingAtom) const isLoadingCurrentWorkspace = useAtomValue(currentWorkspaceLoadingAtom) @@ -230,19 +234,19 @@ function ConsoleBootstrapProbe() { manager: - {String(roleFlags.isCurrentWorkspaceManager)} + {String(isCurrentWorkspaceManager)} owner: - {String(roleFlags.isCurrentWorkspaceOwner)} + {String(isCurrentWorkspaceOwner)} editor: - {String(roleFlags.isCurrentWorkspaceEditor)} + {String(isCurrentWorkspaceEditor)} dataset operator: - {String(roleFlags.isCurrentWorkspaceDatasetOperator)} + {String(isCurrentWorkspaceDatasetOperator)} version: diff --git a/web/context/account-state.ts b/web/context/account-state.ts new file mode 100644 index 00000000000..a00ffc38e67 --- /dev/null +++ b/web/context/account-state.ts @@ -0,0 +1,29 @@ +'use client' + +import { atom } from 'jotai' +import { queryClientAtom } from 'jotai-tanstack-query' +import { userProfileQueryOptions } from '@/features/account-profile/client' +import { atomWithResolvedSuspenseQuery } from '@/utils/query-atoms' + +const accountProfileQueryAtom = atomWithResolvedSuspenseQuery(() => userProfileQueryOptions()) + +export const userProfileAtom = atom((get) => { + return get(accountProfileQueryAtom).data.profile +}) + +export const userProfileIdAtom = atom((get) => { + return get(userProfileAtom).id +}) + +export const userProfileEmailAtom = atom((get) => { + return get(userProfileAtom).email +}) + +export const accountProfileMetaAtom = atom((get) => { + return get(accountProfileQueryAtom).data.meta +}) + +export const refreshUserProfileAtom = atom(null, (get) => { + const queryClient = get(queryClientAtom) + queryClient.invalidateQueries({ queryKey: userProfileQueryOptions().queryKey }) +}) diff --git a/web/context/amplitude-identity-sync.ts b/web/context/amplitude-identity-sync.ts index 7ccbf570fba..0fab0b3fb09 100644 --- a/web/context/amplitude-identity-sync.ts +++ b/web/context/amplitude-identity-sync.ts @@ -6,10 +6,8 @@ import { atom } from 'jotai' import { atomEffect } from 'jotai-effect' import { setUserId, setUserProperties } from '@/app/components/base/amplitude' import { flushRegistrationSuccess } from '@/app/components/base/amplitude/registration-tracking' -import { - currentWorkspaceAtom, - userProfileAtom, -} from './app-context-state' +import { userProfileAtom } from './account-state' +import { currentWorkspaceAtom } from './workspace-state' type AmplitudeProperties = Record diff --git a/web/context/app-context-state.ts b/web/context/app-context-state.ts deleted file mode 100644 index 13b412182ba..00000000000 --- a/web/context/app-context-state.ts +++ /dev/null @@ -1,145 +0,0 @@ -'use client' - -import { atom } from 'jotai' -import { atomWithQuery, queryClientAtom } from 'jotai-tanstack-query' -import { userProfileQueryOptions } from '@/features/account-profile/client' -import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { workspacePermissionKeysQueryOptions } from '@/service/access-control/use-permission-keys' -import { consoleQuery } from '@/service/client' -import { atomWithResolvedSuspenseQuery } from '@/utils/query-atoms' -import { - initialLangGeniusVersionInfo, - initialWorkspaceInfo, -} from './app-context-defaults' -import { - emptyWorkspacePermissionKeys, - getLangGeniusVersionInfo, - getWorkspaceRoleFlags, - normalizeCurrentWorkspace, -} from './app-context-normalizers' - -const accountProfileQueryAtom = atomWithResolvedSuspenseQuery(() => userProfileQueryOptions()) - -const systemFeaturesQueryAtom = atomWithResolvedSuspenseQuery(() => systemFeaturesQueryOptions()) - -const systemFeaturesAtom = atom((get) => { - return get(systemFeaturesQueryAtom).data -}) - -export const userProfileAtom = atom((get) => { - return get(accountProfileQueryAtom).data.profile -}) - -export const userProfileIdAtom = atom((get) => { - return get(userProfileAtom).id -}) - -export const userProfileEmailAtom = atom((get) => { - return get(userProfileAtom).email -}) - -const profileMetaAtom = atom((get) => { - return get(accountProfileQueryAtom).data.meta -}) - -const currentWorkspaceQueryAtom = atomWithQuery(() => { - return consoleQuery.workspaces.current.post.queryOptions({ - select: normalizeCurrentWorkspace, - }) -}) - -const normalizedCurrentWorkspaceAtom = atom((get) => { - return get(currentWorkspaceQueryAtom).data ?? initialWorkspaceInfo -}) - -export const currentWorkspaceAtom = atom((get) => { - return get(normalizedCurrentWorkspaceAtom) -}) - -export const currentWorkspaceIdAtom = atom((get) => { - return get(currentWorkspaceAtom).id -}) - -export const workspaceRoleFlagsAtom = atom((get) => { - return getWorkspaceRoleFlags(get(currentWorkspaceAtom)) -}) - -export const isCurrentWorkspaceOwnerAtom = atom((get) => { - return get(workspaceRoleFlagsAtom).isCurrentWorkspaceOwner -}) - -export const isCurrentWorkspaceManagerAtom = atom((get) => { - return get(workspaceRoleFlagsAtom).isCurrentWorkspaceManager -}) - -export const isCurrentWorkspaceEditorAtom = atom((get) => { - return get(workspaceRoleFlagsAtom).isCurrentWorkspaceEditor -}) - -export const isCurrentWorkspaceDatasetOperatorAtom = atom((get) => { - return get(workspaceRoleFlagsAtom).isCurrentWorkspaceDatasetOperator -}) - -const workspacePermissionKeysQueryAtom = atomWithQuery((get) => { - const workspaceId = get(currentWorkspaceIdAtom) - - return workspacePermissionKeysQueryOptions(workspaceId) -}) - -export const workspacePermissionKeysAtom = atom((get) => { - return get(workspacePermissionKeysQueryAtom).data?.workspace?.permission_keys ?? emptyWorkspacePermissionKeys -}) - -export const workspacePermissionKeysLoadingAtom = atom((get) => { - return get(workspacePermissionKeysQueryAtom).isPending -}) - -export const currentWorkspaceLoadingAtom = atom((get) => { - return get(currentWorkspaceQueryAtom).isPending -}) - -export const datasetRbacEnabledAtom = atom((get) => { - return get(systemFeaturesAtom).rbac_enabled -}) - -const versionQueryAtom = atomWithQuery((get) => { - const meta = get(profileMetaAtom) - const systemFeaturesQuery = get(systemFeaturesQueryAtom) - const enabled = Boolean(meta.currentVersion && !systemFeaturesQuery.data.branding.enabled) - - return consoleQuery.version.get.queryOptions({ - input: { - query: { - current_version: meta.currentVersion ?? '', - }, - }, - enabled, - }) -}) - -export const langGeniusVersionInfoAtom = atom((get) => { - const meta = get(profileMetaAtom) - const versionData = get(versionQueryAtom).data - - if (!versionData) - return initialLangGeniusVersionInfo - - return getLangGeniusVersionInfo({ - meta, - versionData, - }) -}) - -export const langGeniusCurrentVersionAtom = atom((get) => { - return get(langGeniusVersionInfoAtom).current_version -}) - -export const refreshUserProfileAtom = atom(null, (get) => { - const queryClient = get(queryClientAtom) - queryClient.invalidateQueries({ queryKey: userProfileQueryOptions().queryKey }) -}) - -export const refreshCurrentWorkspaceAtom = atom(null, (get) => { - const queryClient = get(queryClientAtom) - queryClient.invalidateQueries({ queryKey: consoleQuery.workspaces.current.post.key() }) -}) diff --git a/web/context/modal-context-provider.tsx b/web/context/modal-context-provider.tsx index 910c6856208..75fbec631b8 100644 --- a/web/context/modal-context-provider.tsx +++ b/web/context/modal-context-provider.tsx @@ -21,8 +21,8 @@ import { isWorkspaceSettingTab, } from '@/app/components/header/account-setting/constants' import { useSetEducationVerifying } from '@/app/education-apply/storage' -import { currentWorkspaceIdAtom } from '@/context/app-context-state' import { useProviderContext } from '@/context/provider-context' +import { currentWorkspaceIdAtom } from '@/context/workspace-state' import { useAccountSettingModal, usePricingModal, diff --git a/web/context/modal-context.test.tsx b/web/context/modal-context.test.tsx index 30879b6c05e..5dac8396386 100644 --- a/web/context/modal-context.test.tsx +++ b/web/context/modal-context.test.tsx @@ -49,7 +49,27 @@ vi.mock('@/context/provider-context', () => ({ const mockUseAppContext = vi.fn() -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => mockUseAppContext()) diff --git a/web/context/permission-state.ts b/web/context/permission-state.ts new file mode 100644 index 00000000000..8ce72b64f0e --- /dev/null +++ b/web/context/permission-state.ts @@ -0,0 +1,21 @@ +'use client' + +import { atom } from 'jotai' +import { atomWithQuery } from 'jotai-tanstack-query' +import { workspacePermissionKeysQueryOptions } from '@/service/access-control/use-permission-keys' +import { emptyWorkspacePermissionKeys } from './app-context-normalizers' +import { currentWorkspaceIdAtom } from './workspace-state' + +const workspacePermissionKeysQueryAtom = atomWithQuery((get) => { + const workspaceId = get(currentWorkspaceIdAtom) + + return workspacePermissionKeysQueryOptions(workspaceId) +}) + +export const workspacePermissionKeysAtom = atom((get) => { + return get(workspacePermissionKeysQueryAtom).data?.workspace?.permission_keys ?? emptyWorkspacePermissionKeys +}) + +export const workspacePermissionKeysLoadingAtom = atom((get) => { + return get(workspacePermissionKeysQueryAtom).isPending +}) diff --git a/web/context/system-features-state.ts b/web/context/system-features-state.ts new file mode 100644 index 00000000000..25eb9115a57 --- /dev/null +++ b/web/context/system-features-state.ts @@ -0,0 +1,15 @@ +'use client' + +import { atom } from 'jotai' +import { systemFeaturesQueryOptions } from '@/features/system-features/client' +import { atomWithResolvedSuspenseQuery } from '@/utils/query-atoms' + +const systemFeaturesQueryAtom = atomWithResolvedSuspenseQuery(() => systemFeaturesQueryOptions()) + +export const systemFeaturesAtom = atom((get) => { + return get(systemFeaturesQueryAtom).data +}) + +export const datasetRbacEnabledAtom = atom((get) => { + return get(systemFeaturesAtom).rbac_enabled +}) diff --git a/web/context/version-state.ts b/web/context/version-state.ts new file mode 100644 index 00000000000..795104b6b18 --- /dev/null +++ b/web/context/version-state.ts @@ -0,0 +1,41 @@ +'use client' + +import { atom } from 'jotai' +import { atomWithQuery } from 'jotai-tanstack-query' +import { consoleQuery } from '@/service/client' +import { accountProfileMetaAtom } from './account-state' +import { initialLangGeniusVersionInfo } from './app-context-defaults' +import { getLangGeniusVersionInfo } from './app-context-normalizers' +import { systemFeaturesAtom } from './system-features-state' + +const versionQueryAtom = atomWithQuery((get) => { + const meta = get(accountProfileMetaAtom) + const systemFeatures = get(systemFeaturesAtom) + const enabled = Boolean(meta.currentVersion && !systemFeatures.branding.enabled) + + return consoleQuery.version.get.queryOptions({ + input: { + query: { + current_version: meta.currentVersion ?? '', + }, + }, + enabled, + }) +}) + +export const langGeniusVersionInfoAtom = atom((get) => { + const meta = get(accountProfileMetaAtom) + const versionData = get(versionQueryAtom).data + + if (!versionData) + return initialLangGeniusVersionInfo + + return getLangGeniusVersionInfo({ + meta, + versionData, + }) +}) + +export const langGeniusCurrentVersionAtom = atom((get) => { + return get(langGeniusVersionInfoAtom).current_version +}) diff --git a/web/context/workspace-state.ts b/web/context/workspace-state.ts new file mode 100644 index 00000000000..73462b35634 --- /dev/null +++ b/web/context/workspace-state.ts @@ -0,0 +1,53 @@ +'use client' + +import { atom } from 'jotai' +import { atomWithQuery, queryClientAtom } from 'jotai-tanstack-query' +import { consoleQuery } from '@/service/client' +import { initialWorkspaceInfo } from './app-context-defaults' +import { + getWorkspaceRoleFlags, + normalizeCurrentWorkspace, +} from './app-context-normalizers' + +const currentWorkspaceQueryAtom = atomWithQuery(() => { + return consoleQuery.workspaces.current.post.queryOptions({ + select: normalizeCurrentWorkspace, + }) +}) + +export const currentWorkspaceAtom = atom((get) => { + return get(currentWorkspaceQueryAtom).data ?? initialWorkspaceInfo +}) + +export const currentWorkspaceIdAtom = atom((get) => { + return get(currentWorkspaceAtom).id +}) + +const workspaceRoleFlagsAtom = atom((get) => { + return getWorkspaceRoleFlags(get(currentWorkspaceAtom)) +}) + +export const isCurrentWorkspaceOwnerAtom = atom((get) => { + return get(workspaceRoleFlagsAtom).isCurrentWorkspaceOwner +}) + +export const isCurrentWorkspaceManagerAtom = atom((get) => { + return get(workspaceRoleFlagsAtom).isCurrentWorkspaceManager +}) + +export const isCurrentWorkspaceEditorAtom = atom((get) => { + return get(workspaceRoleFlagsAtom).isCurrentWorkspaceEditor +}) + +export const isCurrentWorkspaceDatasetOperatorAtom = atom((get) => { + return get(workspaceRoleFlagsAtom).isCurrentWorkspaceDatasetOperator +}) + +export const currentWorkspaceLoadingAtom = atom((get) => { + return get(currentWorkspaceQueryAtom).isPending +}) + +export const refreshCurrentWorkspaceAtom = atom(null, (get) => { + const queryClient = get(queryClientAtom) + queryClient.invalidateQueries({ queryKey: consoleQuery.workspaces.current.post.key() }) +}) diff --git a/web/context/zendesk-conversation-sync.ts b/web/context/zendesk-conversation-sync.ts index 535731b4518..0d38888965f 100644 --- a/web/context/zendesk-conversation-sync.ts +++ b/web/context/zendesk-conversation-sync.ts @@ -4,11 +4,9 @@ import { atom } from 'jotai' import { atomEffect } from 'jotai-effect' import { setZendeskConversationFields } from '@/app/components/base/zendesk/utils' import { ZENDESK_FIELD_IDS } from '@/config' -import { - currentWorkspaceAtom, - langGeniusVersionInfoAtom, - userProfileAtom, -} from './app-context-state' +import { userProfileAtom } from './account-state' +import { langGeniusVersionInfoAtom } from './version-state' +import { currentWorkspaceAtom } from './workspace-state' type ZendeskSyncState = { email?: string diff --git a/web/features/agent-v2/agent-detail/access/components/__tests__/access-surface-cards.spec.tsx b/web/features/agent-v2/agent-detail/access/components/__tests__/access-surface-cards.spec.tsx index 32cb20138bb..da2b8e0a645 100644 --- a/web/features/agent-v2/agent-detail/access/components/__tests__/access-surface-cards.spec.tsx +++ b/web/features/agent-v2/agent-detail/access/components/__tests__/access-surface-cards.spec.tsx @@ -43,7 +43,79 @@ vi.mock('@/app/components/base/chat/embedded-chatbot/theme/theme-context', () => }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + workspacePermissionKeys: ['app.acl.edit'], + langGeniusVersionInfo: { + current_env: 'PRODUCTION', + current_version: '', + latest_version: '', + version: '', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + workspacePermissionKeys: ['app.acl.edit'], + langGeniusVersionInfo: { + current_env: 'PRODUCTION', + current_version: '', + latest_version: '', + version: '', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + workspacePermissionKeys: ['app.acl.edit'], + langGeniusVersionInfo: { + current_env: 'PRODUCTION', + current_version: '', + latest_version: '', + version: '', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { id: 'user-1' }, + currentWorkspace: { id: 'workspace-1' }, + workspacePermissionKeys: ['app.acl.edit'], + langGeniusVersionInfo: { + current_env: 'PRODUCTION', + current_version: '', + latest_version: '', + version: '', + release_date: '', + release_notes: '', + can_auto_update: false, + }, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/features/agent-v2/agent-detail/configure/components/__tests__/agent-prompt-editor.spec.tsx b/web/features/agent-v2/agent-detail/configure/components/__tests__/agent-prompt-editor.spec.tsx index 9ee09398606..5b1f4e55367 100644 --- a/web/features/agent-v2/agent-detail/configure/components/__tests__/agent-prompt-editor.spec.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/__tests__/agent-prompt-editor.spec.tsx @@ -151,7 +151,35 @@ vi.mock('@/context/i18n', () => ({ useDocLink: () => 'https://docs.example.com', })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-123' }, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-123' }, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-123' }, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + currentWorkspace: { id: 'workspace-123' }, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/hooks.ts b/web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/hooks.ts index c901f23f039..c31023c82da 100644 --- a/web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/hooks.ts +++ b/web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/hooks.ts @@ -5,7 +5,7 @@ import type { AgentTool } from '@/features/agent-v2/agent-composer/form-state' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { API_PREFIX } from '@/config' -import { currentWorkspaceIdAtom } from '@/context/app-context-state' +import { currentWorkspaceIdAtom } from '@/context/workspace-state' import useTheme from '@/hooks/use-theme' import { useAllBuiltInTools, diff --git a/web/features/agent-v2/agent-detail/configure/components/preview/__tests__/chat.spec.tsx b/web/features/agent-v2/agent-detail/configure/components/preview/__tests__/chat.spec.tsx index bfb02eb0168..e146eda508e 100644 --- a/web/features/agent-v2/agent-detail/configure/components/preview/__tests__/chat.spec.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/preview/__tests__/chat.spec.tsx @@ -96,7 +96,47 @@ vi.mock('@/app/components/base/chat/chat/hooks', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + avatar_url: '', + name: 'User', + }, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + avatar_url: '', + name: 'User', + }, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + avatar_url: '', + name: 'User', + }, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + avatar_url: '', + name: 'User', + }, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/features/agent-v2/agent-detail/configure/components/preview/__tests__/versions-panel.spec.tsx b/web/features/agent-v2/agent-detail/configure/components/preview/__tests__/versions-panel.spec.tsx index 6eac3ad01fd..ac147a4d373 100644 --- a/web/features/agent-v2/agent-detail/configure/components/preview/__tests__/versions-panel.spec.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/preview/__tests__/versions-panel.spec.tsx @@ -58,7 +58,51 @@ vi.mock('@/service/client', () => ({ }, })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: 'user-1', + name: 'Alice', + email: 'alice@example.com', + }, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: 'user-1', + name: 'Alice', + email: 'alice@example.com', + }, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: 'user-1', + name: 'Alice', + email: 'alice@example.com', + }, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + userProfile: { + id: 'user-1', + name: 'Alice', + email: 'alice@example.com', + }, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/features/agent-v2/agent-detail/configure/components/preview/chat-runtime.tsx b/web/features/agent-v2/agent-detail/configure/components/preview/chat-runtime.tsx index d035f52e0ed..0fec280282c 100644 --- a/web/features/agent-v2/agent-detail/configure/components/preview/chat-runtime.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/preview/chat-runtime.tsx @@ -36,7 +36,7 @@ import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/comp import { addFileInfos, sortAgentSorts } from '@/app/components/tools/utils' import { InputVarType, SupportUploadFileTypes } from '@/app/components/workflow/types' import { DEFAULT_CHAT_PROMPT_CONFIG, DEFAULT_COMPLETION_PROMPT_CONFIG } from '@/config' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { agentComposerModelAtom } from '@/features/agent-v2/agent-composer/store-modules/model' import { agentComposerPromptAtom } from '@/features/agent-v2/agent-composer/store-modules/prompt' import { ENABLE_AGENT_CLI_TOOLS } from '@/features/agent-v2/agent-detail/configure/feature-flags' diff --git a/web/features/agent-v2/agent-detail/configure/components/preview/versions-panel/index.tsx b/web/features/agent-v2/agent-detail/configure/components/preview/versions-panel/index.tsx index 44568a546c0..500bbdbb5e6 100644 --- a/web/features/agent-v2/agent-detail/configure/components/preview/versions-panel/index.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/preview/versions-panel/index.tsx @@ -5,7 +5,7 @@ import { useQuery } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import { useState } from 'react' import { useTranslation } from 'react-i18next' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { consoleQuery } from '@/service/client' import { CurrentDraftItem } from './current-draft-item' import { VersionFilter } from './filter' diff --git a/web/features/deployments/detail/access/permissions/access-subject-selector/subject-options.tsx b/web/features/deployments/detail/access/permissions/access-subject-selector/subject-options.tsx index 447a8009056..d1c3478c9ac 100644 --- a/web/features/deployments/detail/access/permissions/access-subject-selector/subject-options.tsx +++ b/web/features/deployments/detail/access/permissions/access-subject-selector/subject-options.tsx @@ -17,7 +17,7 @@ import { } from '@langgenius/dify-ui/combobox' import { useAtomValue } from 'jotai' import { useTranslation } from 'react-i18next' -import { userProfileAtom } from '@/context/app-context-state' +import { userProfileAtom } from '@/context/account-state' import { SubjectType } from '@/models/access-control' export function SubjectItem({ diff --git a/web/features/tag-management/__tests__/tag-filter.spec.tsx b/web/features/tag-management/__tests__/tag-filter.spec.tsx index bb9e0c058b4..0eedc4954bd 100644 --- a/web/features/tag-management/__tests__/tag-filter.spec.tsx +++ b/web/features/tag-management/__tests__/tag-filter.spec.tsx @@ -15,7 +15,35 @@ vi.mock('@tanstack/react-query', () => ({ useQuery: () => ({ data: mockUseQueryData.current }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/features/tag-management/__tests__/tag-management-modal.spec.tsx b/web/features/tag-management/__tests__/tag-management-modal.spec.tsx index ed5534ea741..4edeecc4b6b 100644 --- a/web/features/tag-management/__tests__/tag-management-modal.spec.tsx +++ b/web/features/tag-management/__tests__/tag-management-modal.spec.tsx @@ -44,7 +44,35 @@ vi.mock('@tanstack/react-query', () => ({ }), })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/features/tag-management/__tests__/tag-search-content.spec.tsx b/web/features/tag-management/__tests__/tag-search-content.spec.tsx index 8f682a58640..46257d249a7 100644 --- a/web/features/tag-management/__tests__/tag-search-content.spec.tsx +++ b/web/features/tag-management/__tests__/tag-search-content.spec.tsx @@ -15,7 +15,35 @@ const mockWorkspacePermissionKeys = vi.hoisted(() => ({ value: ['app.tag.manage', 'dataset.tag.manage'] as string[], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/features/tag-management/__tests__/tag-selector.spec.tsx b/web/features/tag-management/__tests__/tag-selector.spec.tsx index 819e25a517e..46fc64a7fef 100644 --- a/web/features/tag-management/__tests__/tag-selector.spec.tsx +++ b/web/features/tag-management/__tests__/tag-selector.spec.tsx @@ -33,7 +33,35 @@ const mockWorkspacePermissionKeys = vi.hoisted(() => ({ value: ['app.tag.manage', 'dataset.tag.manage', 'snippets.create_and_modify'] as string[], })) -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys.value, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ diff --git a/web/features/tag-management/components/tag-management-modal.tsx b/web/features/tag-management/components/tag-management-modal.tsx index 1e9dc18a53d..c67484b9c69 100644 --- a/web/features/tag-management/components/tag-management-modal.tsx +++ b/web/features/tag-management/components/tag-management-modal.tsx @@ -6,7 +6,7 @@ import { useMutation, useQuery } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import { useState } from 'react' import { useTranslation } from 'react-i18next' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { consoleQuery } from '@/service/client' import { hasPermission } from '@/utils/permission' import { getTagManagePermissionKey } from '../utils' diff --git a/web/features/tag-management/components/tag-search-content.tsx b/web/features/tag-management/components/tag-search-content.tsx index 9748c17adc8..b5d3126b9bc 100644 --- a/web/features/tag-management/components/tag-search-content.tsx +++ b/web/features/tag-management/components/tag-search-content.tsx @@ -4,7 +4,7 @@ import { ComboboxEmpty, ComboboxInput, ComboboxInputGroup, ComboboxItem, Combobo import { useAtomValue } from 'jotai' import { Fragment } from 'react' import { useTranslation } from 'react-i18next' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { hasPermission } from '@/utils/permission' import { getTagManagePermissionKey } from '../utils' import { isCreateTagOption } from './tag-combobox-item' diff --git a/web/features/tag-management/components/tag-selector.tsx b/web/features/tag-management/components/tag-selector.tsx index 105b19699e0..7ec9a2c588c 100644 --- a/web/features/tag-management/components/tag-selector.tsx +++ b/web/features/tag-management/components/tag-selector.tsx @@ -9,7 +9,7 @@ import { useMutation, useQuery } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { consoleQuery } from '@/service/client' import { hasPermission } from '@/utils/permission' import { useApplyTagBindingsMutation } from '../hooks/use-tag-mutations' diff --git a/web/hooks/use-credential-permissions.spec.ts b/web/hooks/use-credential-permissions.spec.ts index 6d91b4b2299..9b9fa6700a3 100644 --- a/web/hooks/use-credential-permissions.spec.ts +++ b/web/hooks/use-credential-permissions.spec.ts @@ -3,7 +3,31 @@ import { useCredentialPermissions } from './use-credential-permissions' let mockWorkspacePermissionKeys: string[] = [] -vi.mock('@/context/app-context-state', async (importOriginal) => { +vi.mock('@/context/account-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/workspace-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/permission-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/version-state', async (importOriginal) => { + const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') + return createAppContextStateAtomMock(importOriginal, () => ({ + workspacePermissionKeys: mockWorkspacePermissionKeys, + })) +}) +vi.mock('@/context/system-features-state', async (importOriginal) => { const { createAppContextStateAtomMock } = await import('@/__tests__/utils/mock-app-context-state') return createAppContextStateAtomMock(importOriginal, () => ({ workspacePermissionKeys: mockWorkspacePermissionKeys, diff --git a/web/hooks/use-credential-permissions.ts b/web/hooks/use-credential-permissions.ts index c65f0e889db..4515631a3e0 100644 --- a/web/hooks/use-credential-permissions.ts +++ b/web/hooks/use-credential-permissions.ts @@ -1,5 +1,5 @@ import { useAtomValue } from 'jotai' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { hasPermission } from '@/utils/permission' export const useCredentialPermissions = () => { diff --git a/web/hooks/use-import-dsl.ts b/web/hooks/use-import-dsl.ts index 8ca6488cb4e..970ad6a24a5 100644 --- a/web/hooks/use-import-dsl.ts +++ b/web/hooks/use-import-dsl.ts @@ -14,7 +14,8 @@ import { import { useTranslation } from 'react-i18next' import { useSetNeedRefreshAppList } from '@/app/components/apps/storage' import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks' -import { userProfileIdAtom, workspacePermissionKeysAtom } from '@/context/app-context-state' +import { userProfileIdAtom } from '@/context/account-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { DSLImportStatus } from '@/models/app' import { useRouter } from '@/next/navigation' diff --git a/web/service/__tests__/use-plugins.spec.tsx b/web/service/__tests__/use-plugins.spec.tsx index 2c274da5a7b..7066d5fa29c 100644 --- a/web/service/__tests__/use-plugins.spec.tsx +++ b/web/service/__tests__/use-plugins.spec.tsx @@ -39,7 +39,19 @@ vi.mock('@/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list', }), })) -vi.mock('@/context/app-context-state', () => ({ +vi.mock('@/context/account-state', () => ({ + workspacePermissionKeysAtom: mockWorkspacePermissionKeysAtom, +})) +vi.mock('@/context/workspace-state', () => ({ + workspacePermissionKeysAtom: mockWorkspacePermissionKeysAtom, +})) +vi.mock('@/context/permission-state', () => ({ + workspacePermissionKeysAtom: mockWorkspacePermissionKeysAtom, +})) +vi.mock('@/context/version-state', () => ({ + workspacePermissionKeysAtom: mockWorkspacePermissionKeysAtom, +})) +vi.mock('@/context/system-features-state', () => ({ workspacePermissionKeysAtom: mockWorkspacePermissionKeysAtom, })) diff --git a/web/service/use-plugins.ts b/web/service/use-plugins.ts index 07dc4db4f2e..0fa0506fedb 100644 --- a/web/service/use-plugins.ts +++ b/web/service/use-plugins.ts @@ -46,7 +46,7 @@ import { FormTypeEnum } from '@/app/components/base/form/types' import useRefreshPluginList from '@/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list' import { getFormattedPlugin } from '@/app/components/plugins/marketplace/utils' import { PluginCategoryEnum, PluginSource, TaskStatus } from '@/app/components/plugins/types' -import { workspacePermissionKeysAtom } from '@/context/app-context-state' +import { workspacePermissionKeysAtom } from '@/context/permission-state' import { fetchModelProviderModelList } from '@/service/common' import { fetchPluginInfoFromMarketPlace, uninstallPlugin } from '@/service/plugins' import { hasPermission } from '@/utils/permission'