mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-09 14:59:27 +08:00
refactor(ovms): lazy-load OVMS support check with SWR (#12226)
This commit is contained in:
parent
f878c8ab3b
commit
d391e55a8a
@ -10,7 +10,7 @@ import { useAppDispatch } from '@renderer/store'
|
|||||||
import { useAppSelector } from '@renderer/store'
|
import { useAppSelector } from '@renderer/store'
|
||||||
import { handleSaveData } from '@renderer/store'
|
import { handleSaveData } from '@renderer/store'
|
||||||
import { selectMemoryConfig } from '@renderer/store/memory'
|
import { selectMemoryConfig } from '@renderer/store/memory'
|
||||||
import { setAvatar, setFilesPath, setIsOvmsSupported, setResourcesPath, setUpdateState } from '@renderer/store/runtime'
|
import { setAvatar, setFilesPath, setResourcesPath, setUpdateState } from '@renderer/store/runtime'
|
||||||
import {
|
import {
|
||||||
type ToolPermissionRequestPayload,
|
type ToolPermissionRequestPayload,
|
||||||
type ToolPermissionResultPayload,
|
type ToolPermissionResultPayload,
|
||||||
@ -274,17 +274,4 @@ export function useAppInit() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
checkDataLimit()
|
checkDataLimit()
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// Check once when initing
|
|
||||||
window.api.ovms
|
|
||||||
.isSupported()
|
|
||||||
.then((result) => {
|
|
||||||
dispatch(setIsOvmsSupported(result))
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
logger.error('Failed to check isOvmsSupported. Fallback to false.', e as Error)
|
|
||||||
dispatch(setIsOvmsSupported(false))
|
|
||||||
})
|
|
||||||
}, [dispatch])
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import {
|
|||||||
import { DeleteIcon, EditIcon } from '@renderer/components/Icons'
|
import { DeleteIcon, EditIcon } from '@renderer/components/Icons'
|
||||||
import { ProviderAvatar } from '@renderer/components/ProviderAvatar'
|
import { ProviderAvatar } from '@renderer/components/ProviderAvatar'
|
||||||
import { useAllProviders, useProviders } from '@renderer/hooks/useProvider'
|
import { useAllProviders, useProviders } from '@renderer/hooks/useProvider'
|
||||||
import { useRuntime } from '@renderer/hooks/useRuntime'
|
|
||||||
import { useTimer } from '@renderer/hooks/useTimer'
|
import { useTimer } from '@renderer/hooks/useTimer'
|
||||||
import ImageStorage from '@renderer/services/ImageStorage'
|
import ImageStorage from '@renderer/services/ImageStorage'
|
||||||
import type { Provider, ProviderType } from '@renderer/types'
|
import type { Provider, ProviderType } from '@renderer/types'
|
||||||
@ -22,6 +21,7 @@ import { startTransition, useCallback, useEffect, useRef, useState } from 'react
|
|||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { useSearchParams } from 'react-router-dom'
|
import { useSearchParams } from 'react-router-dom'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
import useSWRImmutable from 'swr/immutable'
|
||||||
|
|
||||||
import AddProviderPopup from './AddProviderPopup'
|
import AddProviderPopup from './AddProviderPopup'
|
||||||
import ModelNotesPopup from './ModelNotesPopup'
|
import ModelNotesPopup from './ModelNotesPopup'
|
||||||
@ -32,6 +32,16 @@ const logger = loggerService.withContext('ProviderList')
|
|||||||
|
|
||||||
const BUTTON_WRAPPER_HEIGHT = 50
|
const BUTTON_WRAPPER_HEIGHT = 50
|
||||||
|
|
||||||
|
const getIsOvmsSupported = async (): Promise<boolean> => {
|
||||||
|
try {
|
||||||
|
const result = await window.api.ovms.isSupported()
|
||||||
|
return result
|
||||||
|
} catch (e) {
|
||||||
|
logger.warn('Fetching isOvmsSupported failed. Fallback to false.', e as Error)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const ProviderList: FC = () => {
|
const ProviderList: FC = () => {
|
||||||
const [searchParams, setSearchParams] = useSearchParams()
|
const [searchParams, setSearchParams] = useSearchParams()
|
||||||
const providers = useAllProviders()
|
const providers = useAllProviders()
|
||||||
@ -43,7 +53,8 @@ const ProviderList: FC = () => {
|
|||||||
const [dragging, setDragging] = useState(false)
|
const [dragging, setDragging] = useState(false)
|
||||||
const [providerLogos, setProviderLogos] = useState<Record<string, string>>({})
|
const [providerLogos, setProviderLogos] = useState<Record<string, string>>({})
|
||||||
const listRef = useRef<DraggableVirtualListRef>(null)
|
const listRef = useRef<DraggableVirtualListRef>(null)
|
||||||
const { isOvmsSupported } = useRuntime()
|
|
||||||
|
const { data: isOvmsSupported } = useSWRImmutable('ovms/isSupported', getIsOvmsSupported)
|
||||||
|
|
||||||
const setSelectedProvider = useCallback((provider: Provider) => {
|
const setSelectedProvider = useCallback((provider: Provider) => {
|
||||||
startTransition(() => _setSelectedProvider(provider))
|
startTransition(() => _setSelectedProvider(provider))
|
||||||
@ -278,6 +289,7 @@ const ProviderList: FC = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const filteredProviders = providers.filter((provider) => {
|
const filteredProviders = providers.filter((provider) => {
|
||||||
|
// don't show it when isOvmsSupported is loading
|
||||||
if (provider.id === 'ovms' && !isOvmsSupported) {
|
if (provider.id === 'ovms' && !isOvmsSupported) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,7 +73,6 @@ export interface RuntimeState {
|
|||||||
export: ExportState
|
export: ExportState
|
||||||
chat: ChatState
|
chat: ChatState
|
||||||
websearch: WebSearchState
|
websearch: WebSearchState
|
||||||
isOvmsSupported: boolean | undefined
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ExportState {
|
export interface ExportState {
|
||||||
@ -116,8 +115,7 @@ const initialState: RuntimeState = {
|
|||||||
},
|
},
|
||||||
websearch: {
|
websearch: {
|
||||||
activeSearches: {}
|
activeSearches: {}
|
||||||
},
|
}
|
||||||
isOvmsSupported: undefined
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const runtimeSlice = createSlice({
|
const runtimeSlice = createSlice({
|
||||||
@ -163,9 +161,6 @@ const runtimeSlice = createSlice({
|
|||||||
setExportState: (state, action: PayloadAction<Partial<ExportState>>) => {
|
setExportState: (state, action: PayloadAction<Partial<ExportState>>) => {
|
||||||
state.export = { ...state.export, ...action.payload }
|
state.export = { ...state.export, ...action.payload }
|
||||||
},
|
},
|
||||||
setIsOvmsSupported: (state, action: PayloadAction<boolean>) => {
|
|
||||||
state.isOvmsSupported = action.payload
|
|
||||||
},
|
|
||||||
// Chat related actions
|
// Chat related actions
|
||||||
toggleMultiSelectMode: (state, action: PayloadAction<boolean>) => {
|
toggleMultiSelectMode: (state, action: PayloadAction<boolean>) => {
|
||||||
state.chat.isMultiSelectMode = action.payload
|
state.chat.isMultiSelectMode = action.payload
|
||||||
@ -228,7 +223,6 @@ export const {
|
|||||||
setResourcesPath,
|
setResourcesPath,
|
||||||
setUpdateState,
|
setUpdateState,
|
||||||
setExportState,
|
setExportState,
|
||||||
setIsOvmsSupported,
|
|
||||||
// Chat related actions
|
// Chat related actions
|
||||||
toggleMultiSelectMode,
|
toggleMultiSelectMode,
|
||||||
setSelectedMessageIds,
|
setSelectedMessageIds,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user