From b93eccfdad7181fc99b7bbe739cf38011364c2b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Fri, 10 Jan 2025 15:37:27 +0100 Subject: [PATCH] more typesafety --- webapp/src/ai_integration.ts | 8 +++++--- webapp/src/components/modals/ai_modal.tsx | 10 ++++++---- webapp/src/types/ai.tsx | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 webapp/src/types/ai.tsx diff --git a/webapp/src/ai_integration.ts b/webapp/src/ai_integration.ts index 93d8ab6688..5c13a87aed 100644 --- a/webapp/src/ai_integration.ts +++ b/webapp/src/ai_integration.ts @@ -4,6 +4,8 @@ import {GlobalState} from 'mattermost-webapp/packages/types/src/store'; import {useSelector} from 'react-redux'; +import {BotSelector, Bot, BotsLoaderHook} from './types/ai'; + export const aiPluginID = 'mattermost-ai'; export const useAIAvailable = () => { @@ -12,21 +14,21 @@ export const useAIAvailable = () => { }; export const useAIAvailableBots = () => { - return useSelector((state) => { + return useSelector((state) => { //@ts-ignore plugins state is a thing return state['plugins-' + aiPluginID]?.bots || []; }); }; export const useBotSelector = () => { - return useSelector((state) => { + return useSelector((state) => { //@ts-ignore plugins state is a thing return state['plugins-' + aiPluginID]?.botSelector; }); }; export const useBotsLoaderHook = () => { - return useSelector((state) => { + return useSelector((state) => { //@ts-ignore plugins state is a thing return state['plugins-' + aiPluginID]?.botsLoaderHook || (() => null); }); diff --git a/webapp/src/components/modals/ai_modal.tsx b/webapp/src/components/modals/ai_modal.tsx index 456df94672..7e808feb0f 100644 --- a/webapp/src/components/modals/ai_modal.tsx +++ b/webapp/src/components/modals/ai_modal.tsx @@ -15,6 +15,8 @@ import {Textbox} from 'src/webapp_globals'; import {generateStatusUpdate} from 'src/client'; import {useBotSelector, useBotsLoaderHook} from 'src/ai_integration'; +import {Bot} from 'src/types/ai'; + import postEventListener, {PostUpdateWebsocketMessage} from 'src/websocket'; type Version = { @@ -53,12 +55,12 @@ const AIModal = ({playbookRunId, onAccept, onClose, isOpen}: Props) => { const [copied, setCopied] = useState(false); const [instruction, setInstruction] = useState(''); const suggestionBox = useRef(null); - const BotSelector = useBotSelector() as any; - const useBotlist = useBotsLoaderHook() as any; + const BotSelector = useBotSelector(); + const useBotlist = useBotsLoaderHook(); const {bots, activeBot, setActiveBot} = useBotlist(); const [currentVersion, setCurrentVersion] = useState(0); const [versions, setVersions] = useState([]); - const [generating, setGenerating] = useState(null); + const [generating, setGenerating] = useState(false); useEffect(() => { if (activeBot?.id && isOpen) { @@ -89,7 +91,7 @@ const AIModal = ({playbookRunId, onAccept, onClose, isOpen}: Props) => { }; }, [generating]); - const onBotChange = useCallback((bot: any) => { + const onBotChange = useCallback((bot: Bot) => { setActiveBot(bot); setCurrentVersion(versions.length + 1); setVersions([...versions, {instruction: '', value: '', prevValue: ''}]); diff --git a/webapp/src/types/ai.tsx b/webapp/src/types/ai.tsx new file mode 100644 index 0000000000..91c92f4ea0 --- /dev/null +++ b/webapp/src/types/ai.tsx @@ -0,0 +1,14 @@ +import React from 'react' + +export type Bot = { + id: string +} + +type BotSelectorProps = { + bots: Bot[] + activeBot: Bot + setActiveBot: (bot: Bot) => void +} + +export type BotsLoaderHook = () => BotSelectorProps +export type BotSelector = React.FunctionComponent