diff --git a/src/components/ConversationCard/index.jsx b/src/components/ConversationCard/index.jsx index 0a4ba8a..5e8d2f1 100644 --- a/src/components/ConversationCard/index.jsx +++ b/src/components/ConversationCard/index.jsx @@ -1,11 +1,13 @@ -import { memo, useEffect, useMemo, useRef, useState } from 'react' +import { memo, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react' import PropTypes from 'prop-types' import Browser from 'webextension-polyfill' import InputBox from '../InputBox' import ConversationItem from '../ConversationItem' import { + apiModeToModelName, createElementAtPosition, - getApiModesStringArrayFromConfig, + getApiModesFromConfig, + isApiModeSelected, isFirefox, isMobile, isSafari, @@ -61,33 +63,33 @@ function ConversationCard(props) { const [completeDraggable, setCompleteDraggable] = useState(false) // `.some` for multi mode models. e.g. bingFree4-balanced const useForegroundFetch = bingWebModelKeys.some((n) => session.modelName.includes(n)) + const [apiModes, setApiModes] = useState([]) /** * @type {[ConversationItemData[], (conversationItemData: ConversationItemData[]) => void]} */ - const [conversationItemData, setConversationItemData] = useState( - (() => { - if (session.conversationRecords.length === 0) - if (props.question && triggered) - return [ - new ConversationItemData( - 'answer', - `
${t(`Waiting for response...`)}
`, - ), - ] - else return [] - else { - const ret = [] - for (const record of session.conversationRecords) { - ret.push(new ConversationItemData('question', record.question, true)) - ret.push(new ConversationItemData('answer', record.answer, true)) - } - return ret - } - })(), - ) + const [conversationItemData, setConversationItemData] = useState([]) const config = useConfig() + useLayoutEffect(() => { + if (session.conversationRecords.length === 0) { + if (props.question && triggered) + setConversationItemData([ + new ConversationItemData( + 'answer', + `${t(`Waiting for response...`)}
`, + ), + ]) + } else { + const ret = [] + for (const record of session.conversationRecords) { + ret.push(new ConversationItemData('question', record.question, true)) + ret.push(new ConversationItemData('answer', record.answer, true)) + } + setConversationItemData(ret) + } + }, []) + useEffect(() => { setCompleteDraggable(!isSafari() && !isFirefox() && !isMobile()) }, []) @@ -118,6 +120,15 @@ function ConversationCard(props) { } }, [props.question, triggered]) // usually only triggered once + useLayoutEffect(() => { + setApiModes(getApiModesFromConfig(config, true)) + }, [ + config.activeApiModes, + config.customApiModes, + config.azureDeploymentName, + config.ollamaModelName, + ]) + /** * @param {string} value * @param {boolean} appended @@ -369,25 +380,32 @@ function ConversationCard(props) { className="normal-button" required onChange={(e) => { - const modelName = e.target.value - const newSession = { ...session, modelName, aiName: modelNameToDesc(modelName, t) } + const apiMode = apiModes[e.target.value] + const modelName = apiModeToModelName(apiMode) + const newSession = { + ...session, + modelName, + apiMode, + aiName: modelNameToDesc(modelName, t), + } if (config.autoRegenAfterSwitchModel && conversationItemData.length > 0) getRetryFn(newSession)() else setSession(newSession) }} > - {getApiModesStringArrayFromConfig(config, true).map((modelName) => { + {apiModes.map((apiMode, index) => { + const modelName = apiModeToModelName(apiMode) const desc = modelNameToDesc(modelName, t) - if (desc) + if (desc) { + let selected + if (isApiModeSelected(apiMode, session)) selected = true + else selected = session.modelName === modelName return ( - ) + } })} diff --git a/src/config/index.mjs b/src/config/index.mjs index f34411d..174fcaf 100644 --- a/src/config/index.mjs +++ b/src/config/index.mjs @@ -286,6 +286,7 @@ export const defaultConfig = { themeMode: 'auto', /** @type {keyof Models}*/ modelName: getNavigatorLanguage() === 'zh' ? 'moonshotWebFree' : 'claude2WebFree', + apiMode: null, preferredLanguage: getNavigatorLanguage(), clickIconAction: 'popup', diff --git a/src/content-script/index.jsx b/src/content-script/index.jsx index 22557cb..c3bbe48 100644 --- a/src/content-script/index.jsx +++ b/src/content-script/index.jsx @@ -91,7 +91,7 @@ async function mountComponent(siteConfig) { render(