diff --git a/app/components/chat.tsx b/app/components/chat.tsx index 08bcd04fd..b96609550 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -37,6 +37,7 @@ import AutoIcon from "../icons/auto.svg"; import BottomIcon from "../icons/bottom.svg"; import StopIcon from "../icons/pause.svg"; import RobotIcon from "../icons/robot.svg"; +import PluginIcon from "../icons/plugin.svg"; import { ChatMessage, @@ -89,6 +90,7 @@ import { REQUEST_TIMEOUT_MS, UNFINISHED_INPUT, ServiceProvider, + Plugin, } from "../constant"; import { Avatar } from "./emoji"; import { ContextPrompts, MaskAvatar, MaskConfig } from "./mask"; @@ -476,6 +478,7 @@ export function ChatActions(props: { return model?.displayName ?? ""; }, [models, currentModel, currentProviderName]); const [showModelSelector, setShowModelSelector] = useState(false); + const [showPluginSelector, setShowPluginSelector] = useState(false); const [showUploadImage, setShowUploadImage] = useState(false); useEffect(() => { @@ -620,6 +623,33 @@ export function ChatActions(props: { }} /> )} + + setShowPluginSelector(true)} + text={Locale.Plugin.Name} + icon={} + /> + {showPluginSelector && ( + setShowPluginSelector(false)} + onSelection={(s) => { + if (s.length === 0) return; + const plugin = s[0]; + chatStore.updateCurrentSession((session) => { + session.mask.plugin = s; + }); + showToast(plugin); + }} + /> + )} ); } diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index da700c0fb..186bce8d6 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -443,7 +443,7 @@ export function Selector(props: { subTitle?: string; value: T; }>; - defaultSelectedValue?: T; + defaultSelectedValue?: T[] | T; onSelection?: (selection: T[]) => void; onClose?: () => void; multiple?: boolean; @@ -453,7 +453,10 @@ export function Selector(props: {
{props.items.map((item, i) => { - const selected = props.defaultSelectedValue === item.value; + // @ts-ignore + const selected = props.multiple + ? props.defaultSelectedValue?.includes(item.value) + : props.defaultSelectedValue === item.value; return (