From 8b9a9d05742caefb19b8edac57d98995d36babaa Mon Sep 17 00:00:00 2001 From: CodingOnStar Date: Sat, 11 Oct 2025 17:39:37 +0800 Subject: [PATCH] feat: integrate loading state in QuotaPanel and update ModelProviderPage to handle workspace validation --- .../account-setting/model-provider-page/index.tsx | 11 +++++++++-- .../provider-added-card/quota-panel.tsx | 11 +++++++++++ web/context/app-context.tsx | 5 ++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/web/app/components/header/account-setting/model-provider-page/index.tsx b/web/app/components/header/account-setting/model-provider-page/index.tsx index 98de1203b1..583ee5ba33 100644 --- a/web/app/components/header/account-setting/model-provider-page/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/index.tsx @@ -1,4 +1,4 @@ -import { useMemo } from 'react' +import { useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDebounce } from 'ahooks' import { @@ -22,6 +22,7 @@ import { useProviderContext } from '@/context/provider-context' import cn from '@/utils/classnames' import { useGlobalPublicStore } from '@/context/global-public-context' import QuotaPanel from './provider-added-card/quota-panel' +import { useAppContext } from '@/context/app-context' type Props = { searchText: string @@ -32,6 +33,7 @@ const FixedModelProvider = ['langgenius/openai/openai', 'langgenius/anthropic/an const ModelProviderPage = ({ searchText }: Props) => { const debouncedSearchText = useDebounce(searchText, { wait: 500 }) const { t } = useTranslation() + const { mutateCurrentWorkspace, isValidatingCurrentWorkspace } = useAppContext() const { data: textGenerationDefaultModel } = useDefaultModel(ModelTypeEnum.textGeneration) const { data: embeddingsDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding) const { data: rerankDefaultModel } = useDefaultModel(ModelTypeEnum.rerank) @@ -40,6 +42,7 @@ const ModelProviderPage = ({ searchText }: Props) => { const { modelProviders: providers } = useProviderContext() const { enable_marketplace } = useGlobalPublicStore(s => s.systemFeatures) const defaultModelNotConfigured = !textGenerationDefaultModel && !embeddingsDefaultModel && !speech2textDefaultModel && !rerankDefaultModel && !ttsDefaultModel + const [configuredProviders, notConfiguredProviders] = useMemo(() => { const configuredProviders: ModelProvider[] = [] const notConfiguredProviders: ModelProvider[] = [] @@ -82,6 +85,10 @@ const ModelProviderPage = ({ searchText }: Props) => { return [filteredConfiguredProviders, filteredNotConfiguredProviders] }, [configuredProviders, debouncedSearchText, notConfiguredProviders]) + useEffect(() => { + mutateCurrentWorkspace() + }, [mutateCurrentWorkspace]) + return (
@@ -107,7 +114,7 @@ const ModelProviderPage = ({ searchText }: Props) => { />
- + {!filteredConfiguredProviders?.length && (
diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx index d5734c5acc..b9143578d1 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx @@ -12,6 +12,7 @@ import InstallFromMarketplace from '@/app/components/plugins/install-plugin/inst import { useMarketplaceAllPlugins } from '../hooks' import { useBoolean } from 'ahooks' import useTimestamp from '@/hooks/use-timestamp' +import Loading from '@/app/components/base/loading' const allProviders = [ { key: ModelProviderQuotaGetPaid.OPENAI, Icon: OpenaiSmall }, @@ -33,9 +34,11 @@ const providerKeyToPluginId: Record = { type QuotaPanelProps = { providers: ModelProvider[] + isLoading?: boolean } const QuotaPanel: FC = ({ providers, + isLoading = false, }) => { const { t } = useTranslation() const { currentWorkspace } = useAppContext() @@ -74,6 +77,14 @@ const QuotaPanel: FC = ({ } } }, [providers, isShowInstallModal, hideInstallFromMarketplace]) + console.log('isLoading', isLoading) + if (isLoading) { + return ( +
+ +
+ ) + } return (
diff --git a/web/context/app-context.tsx b/web/context/app-context.tsx index 210ef273da..5f5f18499b 100644 --- a/web/context/app-context.tsx +++ b/web/context/app-context.tsx @@ -23,6 +23,7 @@ export type AppContextValue = { langGeniusVersionInfo: LangGeniusVersionResponse useSelector: typeof useSelector isLoadingCurrentWorkspace: boolean + isValidatingCurrentWorkspace: boolean } const userProfilePlaceholder = { @@ -69,6 +70,7 @@ const AppContext = createContext({ langGeniusVersionInfo: initialLangGeniusVersionInfo, useSelector, isLoadingCurrentWorkspace: false, + isValidatingCurrentWorkspace: false, }) export function useSelector(selector: (value: AppContextValue) => T): T { @@ -81,7 +83,7 @@ export type AppContextProviderProps = { export const AppContextProvider: FC = ({ children }) => { const { data: userProfileResponse, mutate: mutateUserProfile, error: userProfileError } = useSWR({ url: '/account/profile', params: {} }, fetchUserProfile) - const { data: currentWorkspaceResponse, mutate: mutateCurrentWorkspace, isLoading: isLoadingCurrentWorkspace } = useSWR({ url: '/workspaces/current', params: {} }, fetchCurrentWorkspace) + const { data: currentWorkspaceResponse, mutate: mutateCurrentWorkspace, isLoading: isLoadingCurrentWorkspace, isValidating: isValidatingCurrentWorkspace } = useSWR({ url: '/workspaces/current', params: {} }, fetchCurrentWorkspace) const [userProfile, setUserProfile] = useState(userProfilePlaceholder) const [langGeniusVersionInfo, setLangGeniusVersionInfo] = useState(initialLangGeniusVersionInfo) @@ -171,6 +173,7 @@ export const AppContextProvider: FC = ({ children }) => isCurrentWorkspaceDatasetOperator, mutateCurrentWorkspace, isLoadingCurrentWorkspace, + isValidatingCurrentWorkspace, }}>
{globalThis.document?.body?.getAttribute('data-public-maintenance-notice') && }