Files
chatGPTBox/src/popup/sections/AdvancedPart.jsx
T
2024-03-23 15:16:54 +08:00

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>
</>
)
}