mirror of
https://github.com/wassname/chatGPTBox.git
synced 2026-06-27 20:20:58 +08:00
238 lines
6.2 KiB
React
238 lines
6.2 KiB
React
import { useTranslation } from 'react-i18next'
|
|
import { parseFloatWithClamp, parseIntWithClamp } from '../../utils/index.mjs'
|
|
import PropTypes from 'prop-types'
|
|
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'
|
|
import Browser from 'webextension-polyfill'
|
|
|
|
ApiParams.propTypes = {
|
|
config: PropTypes.object.isRequired,
|
|
updateConfig: PropTypes.func.isRequired,
|
|
}
|
|
|
|
function ApiParams({ config, updateConfig }) {
|
|
const { t } = useTranslation()
|
|
|
|
return (
|
|
<>
|
|
<label>
|
|
{t('Max Response Token Length') + `: ${config.maxResponseTokenLength}`}
|
|
<input
|
|
type="range"
|
|
min="100"
|
|
max="40000"
|
|
step="100"
|
|
value={config.maxResponseTokenLength}
|
|
onChange={(e) => {
|
|
const value = parseIntWithClamp(e.target.value, 1000, 100, 40000)
|
|
updateConfig({ maxResponseTokenLength: value })
|
|
}}
|
|
/>
|
|
</label>
|
|
<label>
|
|
{t('Max Conversation Length') + `: ${config.maxConversationContextLength}`}
|
|
<input
|
|
type="range"
|
|
min="0"
|
|
max="100"
|
|
step="1"
|
|
value={config.maxConversationContextLength}
|
|
onChange={(e) => {
|
|
const value = parseIntWithClamp(e.target.value, 9, 0, 100)
|
|
updateConfig({ maxConversationContextLength: value })
|
|
}}
|
|
/>
|
|
</label>
|
|
<label>
|
|
{t('Temperature') + `: ${config.temperature}`}
|
|
<input
|
|
type="range"
|
|
min="0"
|
|
max="2"
|
|
step="0.1"
|
|
value={config.temperature}
|
|
onChange={(e) => {
|
|
const value = parseFloatWithClamp(e.target.value, 1, 0, 2)
|
|
updateConfig({ temperature: value })
|
|
}}
|
|
/>
|
|
</label>
|
|
</>
|
|
)
|
|
}
|
|
|
|
ApiUrl.propTypes = {
|
|
config: PropTypes.object.isRequired,
|
|
updateConfig: PropTypes.func.isRequired,
|
|
}
|
|
|
|
function ApiUrl({ config, updateConfig }) {
|
|
const { t } = useTranslation()
|
|
|
|
return (
|
|
<>
|
|
<label>
|
|
{t('Custom ChatGPT Web API Url')}
|
|
<input
|
|
type="text"
|
|
value={config.customChatGptWebApiUrl}
|
|
onChange={(e) => {
|
|
const value = e.target.value
|
|
updateConfig({ customChatGptWebApiUrl: value })
|
|
}}
|
|
/>
|
|
</label>
|
|
<label>
|
|
{t('Custom ChatGPT Web API Path')}
|
|
<input
|
|
type="text"
|
|
value={config.customChatGptWebApiPath}
|
|
onChange={(e) => {
|
|
const value = e.target.value
|
|
updateConfig({ customChatGptWebApiPath: value })
|
|
}}
|
|
/>
|
|
</label>
|
|
<label>
|
|
{t('Custom OpenAI API Url')}
|
|
<input
|
|
type="text"
|
|
value={config.customOpenAiApiUrl}
|
|
onChange={(e) => {
|
|
const value = e.target.value
|
|
updateConfig({ customOpenAiApiUrl: value })
|
|
}}
|
|
/>
|
|
</label>
|
|
</>
|
|
)
|
|
}
|
|
|
|
Others.propTypes = {
|
|
config: PropTypes.object.isRequired,
|
|
updateConfig: PropTypes.func.isRequired,
|
|
}
|
|
|
|
function Others({ config, updateConfig }) {
|
|
const { t } = useTranslation()
|
|
|
|
return (
|
|
<>
|
|
<label>
|
|
<input
|
|
type="checkbox"
|
|
checked={config.disableWebModeHistory}
|
|
onChange={(e) => {
|
|
const checked = e.target.checked
|
|
updateConfig({ disableWebModeHistory: checked })
|
|
}}
|
|
/>
|
|
{t(
|
|
'Disable web mode history for better privacy protection, but it will result in unavailable conversations after a period of time',
|
|
)}
|
|
</label>
|
|
<label>
|
|
<input
|
|
type="checkbox"
|
|
checked={config.hideContextMenu}
|
|
onChange={async (e) => {
|
|
const checked = e.target.checked
|
|
await updateConfig({ hideContextMenu: checked })
|
|
Browser.runtime.sendMessage({
|
|
type: 'REFRESH_MENU',
|
|
})
|
|
}}
|
|
/>
|
|
{t('Hide context menu of this extension')}
|
|
</label>
|
|
<br />
|
|
<label>
|
|
{t('Custom Site Regex')}
|
|
<input
|
|
type="text"
|
|
value={config.siteRegex}
|
|
onChange={(e) => {
|
|
const regex = e.target.value
|
|
updateConfig({ siteRegex: regex })
|
|
}}
|
|
/>
|
|
</label>
|
|
<label>
|
|
<input
|
|
type="checkbox"
|
|
checked={config.useSiteRegexOnly}
|
|
onChange={(e) => {
|
|
const checked = e.target.checked
|
|
updateConfig({ useSiteRegexOnly: checked })
|
|
}}
|
|
/>
|
|
{t('Exclusively use Custom Site Regex for website matching, ignoring built-in rules')}
|
|
</label>
|
|
<br />
|
|
<label>
|
|
{t('Input Query')}
|
|
<input
|
|
type="text"
|
|
value={config.inputQuery}
|
|
onChange={(e) => {
|
|
const query = e.target.value
|
|
updateConfig({ inputQuery: query })
|
|
}}
|
|
/>
|
|
</label>
|
|
<label>
|
|
{t('Append Query')}
|
|
<input
|
|
type="text"
|
|
value={config.appendQuery}
|
|
onChange={(e) => {
|
|
const query = e.target.value
|
|
updateConfig({ appendQuery: query })
|
|
}}
|
|
/>
|
|
</label>
|
|
<label>
|
|
{t('Prepend Query')}
|
|
<input
|
|
type="text"
|
|
value={config.prependQuery}
|
|
onChange={(e) => {
|
|
const query = e.target.value
|
|
updateConfig({ prependQuery: query })
|
|
}}
|
|
/>
|
|
</label>
|
|
</>
|
|
)
|
|
}
|
|
|
|
AdvancedPart.propTypes = {
|
|
config: PropTypes.object.isRequired,
|
|
updateConfig: PropTypes.func.isRequired,
|
|
}
|
|
|
|
export function AdvancedPart({ config, updateConfig }) {
|
|
const { t } = useTranslation()
|
|
|
|
return (
|
|
<>
|
|
<Tabs selectedTabClassName="popup-tab--selected">
|
|
<TabList>
|
|
<Tab className="popup-tab">{t('API Params')}</Tab>
|
|
<Tab className="popup-tab">{t('API Url')}</Tab>
|
|
<Tab className="popup-tab">{t('Others')}</Tab>
|
|
</TabList>
|
|
|
|
<TabPanel>
|
|
<ApiParams config={config} updateConfig={updateConfig} />
|
|
</TabPanel>
|
|
<TabPanel>
|
|
<ApiUrl config={config} updateConfig={updateConfig} />
|
|
</TabPanel>
|
|
<TabPanel>
|
|
<Others config={config} updateConfig={updateConfig} />
|
|
</TabPanel>
|
|
</Tabs>
|
|
</>
|
|
)
|
|
}
|