From 990affedd02bc46399f6062daad28cf2d6e64d51 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Thu, 11 Jul 2024 15:35:09 +0800 Subject: [PATCH] feat: added drag and drop sorting for providers list --- src/renderer/src/hooks/useProvider.ts | 11 +++- .../home/components/DragableAssistants.tsx | 0 .../src/pages/home/components/Navigation.tsx | 2 +- .../src/pages/settings/ModelSettings.tsx | 2 +- .../src/pages/settings/ProviderSettings.tsx | 58 ++++++++++++++----- src/renderer/src/store/llm.ts | 4 ++ 6 files changed, 57 insertions(+), 20 deletions(-) delete mode 100644 src/renderer/src/pages/home/components/DragableAssistants.tsx diff --git a/src/renderer/src/hooks/useProvider.ts b/src/renderer/src/hooks/useProvider.ts index 38c33d28..d0a38354 100644 --- a/src/renderer/src/hooks/useProvider.ts +++ b/src/renderer/src/hooks/useProvider.ts @@ -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() { diff --git a/src/renderer/src/pages/home/components/DragableAssistants.tsx b/src/renderer/src/pages/home/components/DragableAssistants.tsx deleted file mode 100644 index e69de29b..00000000 diff --git a/src/renderer/src/pages/home/components/Navigation.tsx b/src/renderer/src/pages/home/components/Navigation.tsx index d743f188..4196ccfc 100644 --- a/src/renderer/src/pages/home/components/Navigation.tsx +++ b/src/renderer/src/pages/home/components/Navigation.tsx @@ -12,7 +12,7 @@ interface Props { } const Navigation: FC = ({ activeAssistant }) => { - const providers = useProviders() + const { providers } = useProviders() const { model, setModel } = useAssistant(activeAssistant.id) const items: MenuProps['items'] = providers diff --git a/src/renderer/src/pages/settings/ModelSettings.tsx b/src/renderer/src/pages/settings/ModelSettings.tsx index d8b3f68c..6474fbe3 100644 --- a/src/renderer/src/pages/settings/ModelSettings.tsx +++ b/src/renderer/src/pages/settings/ModelSettings.tsx @@ -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 diff --git a/src/renderer/src/pages/settings/ProviderSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings.tsx index 52b7618d..bf030971 100644 --- a/src/renderer/src/pages/settings/ProviderSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings.tsx @@ -1,32 +1,58 @@ -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(providers[0]) + const onDragEnd = (result: DropResult) => { + if (result.destination) { + const sourceIndex = result.source.index + const destIndex = result.destination.index + const reorderProviders = droppableReorder(providers, sourceIndex, destIndex) + updateProviders(reorderProviders) + } + } + return ( - {providers.map((provider) => ( - setSelectedProvider(provider)}> - - {provider.name} - {provider.enabled && ( - - ON - + + + {(provided) => ( +
+ {providers.map((provider, index) => ( + + {(provided) => ( +
+ setSelectedProvider(provider)}> + + {provider.name} + {provider.enabled && ( + + ON + + )} + +
+ )} +
+ ))} +
)} -
- ))} + +
diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index 48c8cd6f..d0e61f22 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -95,6 +95,9 @@ const settingsSlice = createSlice({ updateProvider: (state, action: PayloadAction) => { state.providers = state.providers.map((p) => (p.id === action.payload.id ? { ...p, ...action.payload } : p)) }, + updateProviders: (state, action: PayloadAction) => { + state.providers = action.payload + }, addProvider: (state, action: PayloadAction) => { state.providers.push(action.payload) }, @@ -132,6 +135,7 @@ const settingsSlice = createSlice({ export const { updateProvider, + updateProviders, addProvider, removeProvider, addModel,