feat: added drag and drop sorting for providers list

This commit is contained in:
kangfenmao 2024-07-11 15:35:09 +08:00
parent 784770fd88
commit 990affedd0
6 changed files with 57 additions and 20 deletions

View File

@ -2,13 +2,20 @@ import { useAppDispatch, useAppSelector } from '@renderer/store'
import {
addModel as _addModel,
removeModel as _removeModel,
updateProvider as _updateProvider
updateProvider as _updateProvider,
updateProviders as _updateProviders
} from '@renderer/store/llm'
import { Assistant, Model, Provider } from '@renderer/types'
import { useDefaultModel } from './useAssistant'
export function useProviders() {
return useAppSelector((state) => state.llm.providers.filter((p) => p.enabled))
const providers = useAppSelector((state) => state.llm.providers.filter((p) => p.enabled))
const dispatch = useAppDispatch()
return {
providers,
updateProviders: (providers: Provider[]) => dispatch(_updateProviders(providers))
}
}
export function useSystemProviders() {

View File

@ -12,7 +12,7 @@ interface Props {
}
const Navigation: FC<Props> = ({ activeAssistant }) => {
const providers = useProviders()
const { providers } = useProviders()
const { model, setModel } = useAssistant(activeAssistant.id)
const items: MenuProps['items'] = providers

View File

@ -8,7 +8,7 @@ import { Model } from '@renderer/types'
const ModelSettings: FC = () => {
const { defaultModel, topicNamingModel, setDefaultModel, setTopicNamingModel } = useDefaultModel()
const providers = useProviders()
const { providers } = useProviders()
const allModels = providers.map((p) => p.models).flat()
const selectOptions = providers

View File

@ -1,19 +1,38 @@
import { useSystemProviders } from '@renderer/hooks/useProvider'
import { DragDropContext, Draggable, Droppable, DropResult } from '@hello-pangea/dnd'
import { useProviders, useSystemProviders } from '@renderer/hooks/useProvider'
import { getProviderLogo } from '@renderer/services/provider'
import { Provider } from '@renderer/types'
import { droppableReorder } from '@renderer/utils'
import { Avatar, Tag } from 'antd'
import { FC, useState } from 'react'
import styled from 'styled-components'
import { Avatar, Tag } from 'antd'
import { getProviderLogo } from '@renderer/services/provider'
import ProviderSetting from './components/ProviderSetting'
const ProviderSettings: FC = () => {
const providers = useSystemProviders()
const { updateProviders } = useProviders()
const [selectedProvider, setSelectedProvider] = useState<Provider>(providers[0])
const onDragEnd = (result: DropResult) => {
if (result.destination) {
const sourceIndex = result.source.index
const destIndex = result.destination.index
const reorderProviders = droppableReorder<Provider>(providers, sourceIndex, destIndex)
updateProviders(reorderProviders)
}
}
return (
<Container>
<ProviderListContainer>
{providers.map((provider) => (
<DragDropContext onDragEnd={onDragEnd}>
<Droppable droppableId="droppable">
{(provided) => (
<div {...provided.droppableProps} ref={provided.innerRef}>
{providers.map((provider, index) => (
<Draggable key={`draggable_${provider.id}_${index}`} draggableId={provider.id} index={index}>
{(provided) => (
<div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
<ProviderListItem
key={JSON.stringify(provider)}
className={provider.id === selectedProvider?.id ? 'active' : ''}
@ -26,7 +45,14 @@ const ProviderSettings: FC = () => {
</Tag>
)}
</ProviderListItem>
</div>
)}
</Draggable>
))}
</div>
)}
</Droppable>
</DragDropContext>
</ProviderListContainer>
<ProviderSetting provider={selectedProvider} key={JSON.stringify(selectedProvider)} />
</Container>

View File

@ -95,6 +95,9 @@ const settingsSlice = createSlice({
updateProvider: (state, action: PayloadAction<Provider>) => {
state.providers = state.providers.map((p) => (p.id === action.payload.id ? { ...p, ...action.payload } : p))
},
updateProviders: (state, action: PayloadAction<Provider[]>) => {
state.providers = action.payload
},
addProvider: (state, action: PayloadAction<Provider>) => {
state.providers.push(action.payload)
},
@ -132,6 +135,7 @@ const settingsSlice = createSlice({
export const {
updateProvider,
updateProviders,
addProvider,
removeProvider,
addModel,