diff --git a/api/controllers/console/workspace/workspace.py b/api/controllers/console/workspace/workspace.py index 57a37f20f1..2cb1aeaaf8 100644 --- a/api/controllers/console/workspace/workspace.py +++ b/api/controllers/console/workspace/workspace.py @@ -29,7 +29,7 @@ from controllers.console.wraps import ( from enums.cloud_plan import CloudPlan from extensions.ext_database import db from fields.base import ResponseModel -from libs.helper import TimestampField, to_timestamp +from libs.helper import TimestampField, dump_response, to_timestamp from libs.login import current_account_with_tenant, login_required from models.account import Tenant, TenantCustomConfigDict, TenantStatus from services.account_service import TenantService @@ -56,6 +56,11 @@ class WorkspaceCustomConfigPayload(BaseModel): replace_webapp_logo: str | None = None +class WorkspaceCustomConfigResponse(ResponseModel): + remove_webapp_brand: bool | None = None + replace_webapp_logo: str | None = None + + class WorkspaceInfoPayload(BaseModel): name: str @@ -69,7 +74,7 @@ class TenantInfoResponse(ResponseModel): role: str | None = None in_trial: bool | None = None trial_end_reason: str | None = None - custom_config: dict | None = None + custom_config: WorkspaceCustomConfigResponse | None = None trial_credits: int | None = None trial_credits_used: int | None = None next_credit_reset_date: int | None = None @@ -101,9 +106,13 @@ register_schema_models( SwitchWorkspacePayload, WorkspaceCustomConfigPayload, WorkspaceInfoPayload, - TenantInfoResponse, ) -register_response_schema_models(console_ns, WorkspacePermissionResponse) +register_response_schema_models( + console_ns, + TenantInfoResponse, + WorkspaceCustomConfigResponse, + WorkspacePermissionResponse, +) provider_fields = { "provider_name": fields.String, @@ -238,13 +247,7 @@ class TenantApi(Resource): else: raise Unauthorized("workspace is archived") - return ( - TenantInfoResponse.model_validate( - WorkspaceService.get_tenant_info(tenant), - from_attributes=True, - ).model_dump(mode="json"), - 200, - ) + return dump_response(TenantInfoResponse, WorkspaceService.get_tenant_info(tenant)), 200 @console_ns.route("/workspaces/switch") diff --git a/api/tests/unit_tests/controllers/console/workspace/test_workspace.py b/api/tests/unit_tests/controllers/console/workspace/test_workspace.py index 95c69d30c2..a294e8e893 100644 --- a/api/tests/unit_tests/controllers/console/workspace/test_workspace.py +++ b/api/tests/unit_tests/controllers/console/workspace/test_workspace.py @@ -435,6 +435,23 @@ class TestTenantInfoResponse: assert payload["plan"] == "team" assert payload["created_at"] == int(created_at.timestamp()) + def test_tenant_info_response_has_typed_custom_config(self): + payload = TenantInfoResponse.model_validate( + { + "id": "t1", + "custom_config": { + "remove_webapp_brand": True, + "replace_webapp_logo": "logo-file-id", + "ignored": "value", + }, + } + ).model_dump(mode="json") + + assert payload["custom_config"] == { + "remove_webapp_brand": True, + "replace_webapp_logo": "logo-file-id", + } + class TestSwitchWorkspaceApi: def test_switch_success(self, app: Flask): diff --git a/packages/contracts/generated/api/console/info/orpc.gen.ts b/packages/contracts/generated/api/console/info/orpc.gen.ts index 0ef5bd4856..4eb342e9cf 100644 --- a/packages/contracts/generated/api/console/info/orpc.gen.ts +++ b/packages/contracts/generated/api/console/info/orpc.gen.ts @@ -4,16 +4,8 @@ import { oc } from '@orpc/contract' import { zPostInfoResponse } from './zod.gen' -/** - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated - */ export const post = oc .route({ - deprecated: true, - description: - 'Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', inputStructure: 'detailed', method: 'POST', operationId: 'postInfo', diff --git a/packages/contracts/generated/api/console/info/types.gen.ts b/packages/contracts/generated/api/console/info/types.gen.ts index 975f887a99..88ee9fd59d 100644 --- a/packages/contracts/generated/api/console/info/types.gen.ts +++ b/packages/contracts/generated/api/console/info/types.gen.ts @@ -6,9 +6,7 @@ export type ClientOptions = { export type TenantInfoResponse = { created_at?: number | null - custom_config?: { - [key: string]: unknown - } | null + custom_config?: WorkspaceCustomConfigResponse id: string in_trial?: boolean | null name?: string | null @@ -21,6 +19,11 @@ export type TenantInfoResponse = { trial_end_reason?: string | null } +export type WorkspaceCustomConfigResponse = { + remove_webapp_brand?: boolean | null + replace_webapp_logo?: string | null +} + export type PostInfoData = { body?: never path?: never diff --git a/packages/contracts/generated/api/console/info/zod.gen.ts b/packages/contracts/generated/api/console/info/zod.gen.ts index adb1ea23f2..f903e9307d 100644 --- a/packages/contracts/generated/api/console/info/zod.gen.ts +++ b/packages/contracts/generated/api/console/info/zod.gen.ts @@ -2,12 +2,20 @@ import * as z from 'zod' +/** + * WorkspaceCustomConfigResponse + */ +export const zWorkspaceCustomConfigResponse = z.object({ + remove_webapp_brand: z.boolean().nullish(), + replace_webapp_logo: z.string().nullish(), +}) + /** * TenantInfoResponse */ export const zTenantInfoResponse = z.object({ created_at: z.int().nullish(), - custom_config: z.record(z.string(), z.unknown()).nullish(), + custom_config: zWorkspaceCustomConfigResponse.optional(), id: z.string(), in_trial: z.boolean().nullish(), name: z.string().nullish(), diff --git a/packages/contracts/generated/api/console/workspaces/orpc.gen.ts b/packages/contracts/generated/api/console/workspaces/orpc.gen.ts index 242c2ccfa8..766859ec81 100644 --- a/packages/contracts/generated/api/console/workspaces/orpc.gen.ts +++ b/packages/contracts/generated/api/console/workspaces/orpc.gen.ts @@ -3682,16 +3682,8 @@ export const triggers = { get: get58, } -/** - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated - */ export const post63 = oc .route({ - deprecated: true, - description: - 'Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', inputStructure: 'detailed', method: 'POST', operationId: 'postWorkspacesCurrent', diff --git a/packages/contracts/generated/api/console/workspaces/types.gen.ts b/packages/contracts/generated/api/console/workspaces/types.gen.ts index cecf1f1284..e943f7924a 100644 --- a/packages/contracts/generated/api/console/workspaces/types.gen.ts +++ b/packages/contracts/generated/api/console/workspaces/types.gen.ts @@ -6,9 +6,7 @@ export type ClientOptions = { export type TenantInfoResponse = { created_at?: number | null - custom_config?: { - [key: string]: unknown - } | null + custom_config?: WorkspaceCustomConfigResponse id: string in_trial?: boolean | null name?: string | null @@ -500,6 +498,11 @@ export type SwitchWorkspacePayload = { tenant_id: string } +export type WorkspaceCustomConfigResponse = { + remove_webapp_brand?: boolean | null + replace_webapp_logo?: string | null +} + export type AccountWithRole = { avatar?: string | null created_at?: number | null diff --git a/packages/contracts/generated/api/console/workspaces/zod.gen.ts b/packages/contracts/generated/api/console/workspaces/zod.gen.ts index a27fc4f5b3..5c342d7d27 100644 --- a/packages/contracts/generated/api/console/workspaces/zod.gen.ts +++ b/packages/contracts/generated/api/console/workspaces/zod.gen.ts @@ -2,24 +2,6 @@ import * as z from 'zod' -/** - * TenantInfoResponse - */ -export const zTenantInfoResponse = z.object({ - created_at: z.int().nullish(), - custom_config: z.record(z.string(), z.unknown()).nullish(), - id: z.string(), - in_trial: z.boolean().nullish(), - name: z.string().nullish(), - next_credit_reset_date: z.int().nullish(), - plan: z.string().nullish(), - role: z.string().nullish(), - status: z.string().nullish(), - trial_credits: z.int().nullish(), - trial_credits_used: z.int().nullish(), - trial_end_reason: z.string().nullish(), -}) - /** * SimpleResultResponse */ @@ -455,6 +437,32 @@ export const zSwitchWorkspacePayload = z.object({ tenant_id: z.string(), }) +/** + * WorkspaceCustomConfigResponse + */ +export const zWorkspaceCustomConfigResponse = z.object({ + remove_webapp_brand: z.boolean().nullish(), + replace_webapp_logo: z.string().nullish(), +}) + +/** + * TenantInfoResponse + */ +export const zTenantInfoResponse = z.object({ + created_at: z.int().nullish(), + custom_config: zWorkspaceCustomConfigResponse.optional(), + id: z.string(), + in_trial: z.boolean().nullish(), + name: z.string().nullish(), + next_credit_reset_date: z.int().nullish(), + plan: z.string().nullish(), + role: z.string().nullish(), + status: z.string().nullish(), + trial_credits: z.int().nullish(), + trial_credits_used: z.int().nullish(), + trial_end_reason: z.string().nullish(), +}) + /** * AccountWithRole */ 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 94eda16b2e..9d3545d019 100644 --- a/web/app/components/datasets/settings/form/__tests__/index.spec.tsx +++ b/web/app/components/datasets/settings/form/__tests__/index.spec.tsx @@ -131,14 +131,6 @@ vi.mock('@/service/use-common', () => ({ ], }, }), - useCurrentWorkspace: () => ({ - data: { - trial_credits: 1000, - trial_credits_used: 100, - next_credit_reset_date: undefined, - }, - isPending: false, - }), })) vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () => ({ diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/quota-panel.spec.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/quota-panel.spec.tsx index db17ab7fc5..ed7f0e72d0 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/quota-panel.spec.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/quota-panel.spec.tsx @@ -7,11 +7,11 @@ import QuotaPanel from '../quota-panel' let mockWorkspaceData: { trial_credits: number trial_credits_used: number - next_credit_reset_date: string + next_credit_reset_date: number } | undefined = { trial_credits: 100, trial_credits_used: 30, - next_credit_reset_date: '2024-12-31', + next_credit_reset_date: 1735603200, } let mockWorkspaceIsPending = false let mockTrialModels: string[] | undefined = ['langgenius/openai/openai'] @@ -32,11 +32,18 @@ vi.mock('@/app/components/base/icons/src/public/llm', () => { } }) -vi.mock('@/service/use-common', () => ({ - useCurrentWorkspace: () => ({ - data: mockWorkspaceData, - isPending: mockWorkspaceIsPending, - }), +vi.mock('../use-trial-credits', () => ({ + useTrialCredits: () => { + const totalCredits = mockWorkspaceData?.trial_credits ?? 0 + const credits = Math.max(totalCredits - (mockWorkspaceData?.trial_credits_used ?? 0), 0) + return { + credits, + totalCredits, + isExhausted: credits <= 0, + isLoading: mockWorkspaceIsPending && !mockWorkspaceData, + nextCreditResetDate: mockWorkspaceData?.next_credit_reset_date, + } + }, })) const renderQuotaPanel = (ui: ReactElement) => renderWithSystemFeatures(ui, { @@ -78,7 +85,7 @@ describe('QuotaPanel', () => { mockWorkspaceData = { trial_credits: 100, trial_credits_used: 30, - next_credit_reset_date: '2024-12-31', + next_credit_reset_date: 1735603200, } mockWorkspaceIsPending = false mockTrialModels = ['langgenius/openai/openai'] @@ -118,7 +125,7 @@ describe('QuotaPanel', () => { mockWorkspaceData = { trial_credits: 10, trial_credits_used: 999, - next_credit_reset_date: '', + next_credit_reset_date: 0, } renderQuotaPanel() diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/use-trial-credits.spec.ts b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/use-trial-credits.spec.ts index 482ad70e16..b128cec385 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/use-trial-credits.spec.ts +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/use-trial-credits.spec.ts @@ -1,20 +1,34 @@ import { renderHook } from '@testing-library/react' import { useTrialCredits } from '../use-trial-credits' -const mockUseCurrentWorkspace = vi.fn() +const { mockUseQuery } = vi.hoisted(() => ({ + mockUseQuery: vi.fn(), +})) -vi.mock('@/service/use-common', () => ({ - useCurrentWorkspace: () => mockUseCurrentWorkspace(), +vi.mock('@tanstack/react-query', () => ({ + useQuery: () => mockUseQuery(), +})) + +vi.mock('@/service/client', () => ({ + consoleQuery: { + workspaces: { + current: { + post: { + queryOptions: () => ({ queryKey: ['console', 'workspaces', 'current', 'post'] }), + }, + }, + }, + }, })) describe('useTrialCredits', () => { beforeEach(() => { vi.clearAllMocks() - mockUseCurrentWorkspace.mockReturnValue({ + mockUseQuery.mockReturnValue({ data: { trial_credits: 100, trial_credits_used: 40, - next_credit_reset_date: '2026-04-01', + next_credit_reset_date: 1775001600, }, isPending: false, }) @@ -29,16 +43,16 @@ describe('useTrialCredits', () => { totalCredits: 100, isExhausted: false, isLoading: false, - nextCreditResetDate: '2026-04-01', + nextCreditResetDate: 1775001600, }) }) it('should keep the hook out of loading state during a background refetch', () => { - mockUseCurrentWorkspace.mockReturnValue({ + mockUseQuery.mockReturnValue({ data: { trial_credits: 80, trial_credits_used: 20, - next_credit_reset_date: '2026-05-01', + next_credit_reset_date: 1777593600, }, isPending: true, }) @@ -53,7 +67,7 @@ describe('useTrialCredits', () => { describe('when workspace data is missing or exhausted', () => { it('should report loading while the first workspace request is pending', () => { - mockUseCurrentWorkspace.mockReturnValue({ + mockUseQuery.mockReturnValue({ data: undefined, isPending: true, }) @@ -70,7 +84,7 @@ describe('useTrialCredits', () => { }) it('should clamp negative remaining credits to zero', () => { - mockUseCurrentWorkspace.mockReturnValue({ + mockUseQuery.mockReturnValue({ data: { trial_credits: 10, trial_credits_used: 99, diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/credits-exhausted-alert.stories.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/credits-exhausted-alert.stories.tsx index 904617fdef..b5e8f64d69 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/credits-exhausted-alert.stories.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-auth-dropdown/credits-exhausted-alert.stories.tsx @@ -1,6 +1,7 @@ import type { Meta, StoryObj } from '@storybook/nextjs-vite' import type { ICurrentWorkspace } from '@/models/common' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { consoleQuery } from '@/service/client' import CreditsExhaustedAlert from './credits-exhausted-alert' const baseWorkspace: ICurrentWorkspace = { @@ -20,7 +21,7 @@ function createSeededQueryClient(overrides?: Partial) { const qc = new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, retry: false } }, }) - qc.setQueryData(['common', 'current-workspace'], { ...baseWorkspace, ...overrides }) + qc.setQueryData(consoleQuery.workspaces.current.post.queryKey(), { ...baseWorkspace, ...overrides }) return qc } diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-trial-credits.ts b/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-trial-credits.ts index 91ff7b8820..7a2417d958 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-trial-credits.ts +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-trial-credits.ts @@ -1,7 +1,8 @@ -import { useCurrentWorkspace } from '@/service/use-common' +import { useQuery } from '@tanstack/react-query' +import { consoleQuery } from '@/service/client' export const useTrialCredits = () => { - const { data: currentWorkspace, isPending } = useCurrentWorkspace() + const { data: currentWorkspace, isPending } = useQuery(consoleQuery.workspaces.current.post.queryOptions()) const totalCredits = currentWorkspace?.trial_credits ?? 0 const credits = Math.max(totalCredits - (currentWorkspace?.trial_credits_used ?? 0), 0) diff --git a/web/app/device/page.tsx b/web/app/device/page.tsx index aa09936b1f..ecdfac3905 100644 --- a/web/app/device/page.tsx +++ b/web/app/device/page.tsx @@ -1,16 +1,14 @@ 'use client' -import type { ICurrentWorkspace } from '@/models/common' import { Button } from '@langgenius/dify-ui/button' import { useQuery } from '@tanstack/react-query' import { useEffect, useState } from 'react' import Divider from '@/app/components/base/divider' import { userProfileQueryOptions } from '@/features/account-profile/client' import { usePathname, useRouter, useSearchParams } from '@/next/navigation' -import { post } from '@/service/base' +import { consoleQuery } from '@/service/client' import { deviceLookup } from '@/service/device-flow' import { systemFeaturesQueryOptions } from '@/service/system-features' -import { commonQueryKeys } from '@/service/use-common' import AuthorizeAccount from './components/authorize-account' import AuthorizeSSO from './components/authorize-sso' import Chooser from './components/chooser' @@ -52,9 +50,8 @@ export default function DevicePage() { refetchOnMount: false, }) const account = userResp?.profile - const { data: currentWorkspace } = useQuery({ - queryKey: commonQueryKeys.currentWorkspace, - queryFn: () => post('/workspaces/current'), + const { data: currentWorkspace } = useQuery({ + ...consoleQuery.workspaces.current.post.queryOptions(), enabled: !!account && !profileErr, retry: false, refetchOnWindowFocus: false, @@ -174,7 +171,7 @@ export default function DevicePage() { accountEmail={account?.email} accountName={account?.name} accountAvatarUrl={account?.avatar_url ?? null} - defaultWorkspace={currentWorkspace?.name} + defaultWorkspace={currentWorkspace?.name ?? undefined} onApproved={() => setView({ kind: 'success' })} onDenied={() => setView({ kind: 'error_expired' })} onError={e => setErrMsg(e)} diff --git a/web/app/education-apply/education-apply-page.tsx b/web/app/education-apply/education-apply-page.tsx index 8db68c73ba..db9695693f 100644 --- a/web/app/education-apply/education-apply-page.tsx +++ b/web/app/education-apply/education-apply-page.tsx @@ -23,7 +23,7 @@ import { useRouter, useSearchParams, } from '@/next/navigation' -import { consoleClient } from '@/service/client' +import { consoleClient, consoleQuery } from '@/service/client' import { switchWorkspace } from '@/service/common' import { commonQueryKeys } from '@/service/use-common' import { @@ -129,7 +129,7 @@ const EducationApplyAgeContent = () => { try { await switchWorkspace({ url: '/workspaces/switch', body: { tenant_id: tenantId } }) await Promise.all([ - queryClient.invalidateQueries({ queryKey: commonQueryKeys.currentWorkspace }), + queryClient.invalidateQueries({ queryKey: consoleQuery.workspaces.current.post.key() }), queryClient.invalidateQueries({ queryKey: commonQueryKeys.workspaces }), ]) onPlanInfoChanged() diff --git a/web/context/app-context-provider.tsx b/web/context/app-context-provider.tsx index 9f1db7362a..b578bf3478 100644 --- a/web/context/app-context-provider.tsx +++ b/web/context/app-context-provider.tsx @@ -1,8 +1,9 @@ 'use client' +import type { PostWorkspacesCurrentResponse } from '@dify/contracts/api/console/workspaces/types.gen' import type { FC, ReactNode } from 'react' import type { ICurrentWorkspace, LangGeniusVersionResponse, UserProfileResponse } from '@/models/common' -import { useQueryClient, useSuspenseQuery } from '@tanstack/react-query' +import { useQuery, useQueryClient, useSuspenseQuery } from '@tanstack/react-query' import { useCallback, useEffect, useMemo } from 'react' import { setUserId, setUserProperties } from '@/app/components/base/amplitude' import { setZendeskConversationFields } from '@/app/components/base/zendesk/utils' @@ -17,9 +18,9 @@ import { } from '@/context/app-context' import { env } from '@/env' import { userProfileQueryOptions } from '@/features/account-profile/client' +import { consoleQuery } from '@/service/client' import { systemFeaturesQueryOptions } from '@/service/system-features' import { - useCurrentWorkspace, useLangGeniusVersion, } from '@/service/use-common' @@ -27,18 +28,52 @@ type AppContextProviderProps = { children: ReactNode } +const workspaceRoles = new Set(['owner', 'admin', 'editor', 'dataset_operator', 'normal']) + +const resolveWorkspaceRole = (role: PostWorkspacesCurrentResponse['role']): ICurrentWorkspace['role'] => { + if (role && workspaceRoles.has(role as ICurrentWorkspace['role'])) + return role as ICurrentWorkspace['role'] + + return initialWorkspaceInfo.role +} + +const normalizeCurrentWorkspace = (workspace?: PostWorkspacesCurrentResponse): ICurrentWorkspace => { + if (!workspace) + return initialWorkspaceInfo + + return { + id: workspace.id, + name: workspace.name ?? initialWorkspaceInfo.name, + plan: workspace.plan ?? initialWorkspaceInfo.plan, + status: workspace.status ?? initialWorkspaceInfo.status, + created_at: workspace.created_at ?? initialWorkspaceInfo.created_at, + role: resolveWorkspaceRole(workspace.role), + providers: initialWorkspaceInfo.providers, + trial_credits: workspace.trial_credits ?? initialWorkspaceInfo.trial_credits, + trial_credits_used: workspace.trial_credits_used ?? initialWorkspaceInfo.trial_credits_used, + next_credit_reset_date: workspace.next_credit_reset_date ?? initialWorkspaceInfo.next_credit_reset_date, + trial_end_reason: workspace.trial_end_reason ?? undefined, + custom_config: workspace.custom_config + ? { + remove_webapp_brand: workspace.custom_config.remove_webapp_brand ?? undefined, + replace_webapp_logo: workspace.custom_config.replace_webapp_logo ?? undefined, + } + : undefined, + } +} + export const AppContextProvider: FC = ({ children }) => { const queryClient = useQueryClient() const { data: systemFeatures } = useSuspenseQuery(systemFeaturesQueryOptions()) const { data: userProfileResp } = useSuspenseQuery(userProfileQueryOptions()) - const { data: currentWorkspaceResp, isPending: isLoadingCurrentWorkspace, isFetching: isValidatingCurrentWorkspace } = useCurrentWorkspace() + const { data: currentWorkspaceResp, isPending: isLoadingCurrentWorkspace, isFetching: isValidatingCurrentWorkspace } = useQuery(consoleQuery.workspaces.current.post.queryOptions()) const langGeniusVersionQuery = useLangGeniusVersion( userProfileResp?.meta.currentVersion, !systemFeatures.branding.enabled, ) const userProfile = useMemo(() => userProfileResp?.profile || userProfilePlaceholder, [userProfileResp?.profile]) - const currentWorkspace = useMemo(() => currentWorkspaceResp || initialWorkspaceInfo, [currentWorkspaceResp]) + const currentWorkspace = useMemo(() => normalizeCurrentWorkspace(currentWorkspaceResp), [currentWorkspaceResp]) const langGeniusVersionInfo = useMemo(() => { if (!userProfileResp?.meta?.currentVersion || !langGeniusVersionQuery.data) return initialLangGeniusVersionInfo @@ -64,7 +99,7 @@ export const AppContextProvider: FC = ({ children }) => }, [queryClient]) const mutateCurrentWorkspace = useCallback(() => { - queryClient.invalidateQueries({ queryKey: ['common', 'current-workspace'] }) + queryClient.invalidateQueries({ queryKey: consoleQuery.workspaces.current.post.key() }) }, [queryClient]) // #region Zendesk conversation fields diff --git a/web/service/use-common.ts b/web/service/use-common.ts index 879abbb560..9cbaae4982 100644 --- a/web/service/use-common.ts +++ b/web/service/use-common.ts @@ -10,7 +10,6 @@ import type { CodeBasedExtension, CommonResponse, FileUploadConfigResponse, - ICurrentWorkspace, IWorkspace, LangGeniusVersionResponse, Member, @@ -26,7 +25,6 @@ const NAME_SPACE = 'common' export const commonQueryKeys = { fileUploadConfig: [NAME_SPACE, 'file-upload-config'] as const, - currentWorkspace: [NAME_SPACE, 'current-workspace'] as const, workspaces: [NAME_SPACE, 'workspaces'] as const, members: [NAME_SPACE, 'members'] as const, filePreview: (fileID: string) => [NAME_SPACE, 'file-preview', fileID] as const, @@ -68,13 +66,6 @@ export const useLangGeniusVersion = (currentVersion?: string | null, enabled?: b }) } -export const useCurrentWorkspace = () => { - return useQuery({ - queryKey: commonQueryKeys.currentWorkspace, - queryFn: () => post('/workspaces/current'), - }) -} - export const useWorkspaces = () => { return useQuery<{ workspaces: IWorkspace[] }>({ queryKey: commonQueryKeys.workspaces,