mirror of
https://github.com/wassname/chatGPTBox.git
synced 2026-07-12 15:38:01 +08:00
improve b96ba7c0
This commit is contained in:
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Vorlagen-Template",
|
"Prompt Template": "Vorlagen-Template",
|
||||||
"Explain this: {{selection}}": "Erkläre das: {{selection}}",
|
"Explain this: {{selection}}": "Erkläre das: {{selection}}",
|
||||||
"New": "Neu",
|
"New": "Neu",
|
||||||
"DisplayMode": "Anzeigemodus",
|
"Always display floating window, disable sidebar for all site adapters": "Immer das schwebende Fenster anzeigen, die Seitenleiste für alle Website-Adapter deaktivieren"
|
||||||
"Display in sidebar": "In der Seitenleiste anzeigen",
|
|
||||||
"Display in floating toolbar": "In der schwebenden Symbolleiste anzeigen"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Prompt Template",
|
"Prompt Template": "Prompt Template",
|
||||||
"Explain this: {{selection}}": "Explain this: {{selection}}",
|
"Explain this: {{selection}}": "Explain this: {{selection}}",
|
||||||
"New": "New",
|
"New": "New",
|
||||||
"DisplayMode": "DisplayMode",
|
"Always display floating window, disable sidebar for all site adapters": "Always display floating window, disable sidebar for all site adapters"
|
||||||
"Display in sidebar": "Display in sidebar",
|
|
||||||
"Display in floating toolbar": "Display in floating toolbar"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Plantilla de sugerencias",
|
"Prompt Template": "Plantilla de sugerencias",
|
||||||
"Explain this: {{selection}}": "Explicar esto: {{selection}}",
|
"Explain this: {{selection}}": "Explicar esto: {{selection}}",
|
||||||
"New": "Nuevo",
|
"New": "Nuevo",
|
||||||
"DisplayMode": "Modo de visualización",
|
"Always display floating window, disable sidebar for all site adapters": "Mostrar siempre la ventana flotante, desactivar la barra lateral para todos los adaptadores de sitios"
|
||||||
"Display in sidebar": "Mostrar en la barra lateral",
|
|
||||||
"Display in floating toolbar": "Mostrar en la barra de herramientas flotante"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Modèle de suggestion",
|
"Prompt Template": "Modèle de suggestion",
|
||||||
"Explain this: {{selection}}": "Expliquer ceci : {{selection}}",
|
"Explain this: {{selection}}": "Expliquer ceci : {{selection}}",
|
||||||
"New": "Nouveau",
|
"New": "Nouveau",
|
||||||
"DisplayMode": "Mode d'affichage",
|
"Always display floating window, disable sidebar for all site adapters": "Toujours afficher la fenêtre flottante, désactiver la barre latérale pour tous les adaptateurs de site"
|
||||||
"Display in sidebar": "Afficher dans la barre latérale",
|
|
||||||
"Display in floating toolbar": "Afficher dans la barre d'outils flottante"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Template Prompt",
|
"Prompt Template": "Template Prompt",
|
||||||
"Explain this: {{selection}}": "Jelaskan ini: {{selection}}",
|
"Explain this: {{selection}}": "Jelaskan ini: {{selection}}",
|
||||||
"New": "Baru",
|
"New": "Baru",
|
||||||
"DisplayMode": "Mode Tampilan",
|
"Always display floating window, disable sidebar for all site adapters": "Selalu tampilkan jendela mengambang, nonaktifkan sidebar untuk semua adapter situs"
|
||||||
"Display in sidebar": "Tampilkan di bilah sisi",
|
|
||||||
"Display in floating toolbar": "Tampilkan di bilah alat mengambang"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Modello di prompt",
|
"Prompt Template": "Modello di prompt",
|
||||||
"Explain this: {{selection}}": "Spiega questo: {{selection}}",
|
"Explain this: {{selection}}": "Spiega questo: {{selection}}",
|
||||||
"New": "Nuovo",
|
"New": "Nuovo",
|
||||||
"DisplayMode": "Modalità di visualizzazione",
|
"Always display floating window, disable sidebar for all site adapters": "Mostra sempre la finestra flottante, disabilita la barra laterale per tutti gli adattatori del sito"
|
||||||
"Display in sidebar": "Visualizza nella barra laterale",
|
|
||||||
"Display in floating toolbar": "Visualizza nella barra degli strumenti flottante"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "プロンプトテンプレート",
|
"Prompt Template": "プロンプトテンプレート",
|
||||||
"Explain this: {{selection}}": "これを説明する: {{selection}}",
|
"Explain this: {{selection}}": "これを説明する: {{selection}}",
|
||||||
"New": "新規",
|
"New": "新規",
|
||||||
"DisplayMode": "表示モード",
|
"Always display floating window, disable sidebar for all site adapters": "常にフローティングウィンドウを表示し、すべてのサイトアダプターでサイドバーを無効にします"
|
||||||
"Display in sidebar": "サイドバーに表示",
|
|
||||||
"Display in floating toolbar": "フローティングツールバーに表示"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "프롬프트 템플릿",
|
"Prompt Template": "프롬프트 템플릿",
|
||||||
"Explain this: {{selection}}": "이것을 설명하세요: {{selection}}",
|
"Explain this: {{selection}}": "이것을 설명하세요: {{selection}}",
|
||||||
"New": "새로 만들기",
|
"New": "새로 만들기",
|
||||||
"DisplayMode": "디스플레이 모드",
|
"Always display floating window, disable sidebar for all site adapters": "항상 떠다니는 창을 표시하고 모든 사이트 어댑터의 사이드바를 비활성화합니다"
|
||||||
"Display in sidebar": "사이드바에 표시",
|
|
||||||
"Display in floating toolbar": "떠다니는 도구 모음에 표시"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Modelo de Prompt",
|
"Prompt Template": "Modelo de Prompt",
|
||||||
"Explain this: {{selection}}": "Explique isso: {{selection}}",
|
"Explain this: {{selection}}": "Explique isso: {{selection}}",
|
||||||
"New": "Novo",
|
"New": "Novo",
|
||||||
"DisplayMode": "Modo de Exibição",
|
"Always display floating window, disable sidebar for all site adapters": "Sempre exibir janela flutuante, desativar barra lateral para todos os adaptadores de site"
|
||||||
"Display in sidebar": "Exibir na barra lateral",
|
|
||||||
"Display in floating toolbar": "Exibir na barra de ferramentas flutuante"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Шаблон запроса",
|
"Prompt Template": "Шаблон запроса",
|
||||||
"Explain this: {{selection}}": "Объяснить это: {{selection}}",
|
"Explain this: {{selection}}": "Объяснить это: {{selection}}",
|
||||||
"New": "Новый",
|
"New": "Новый",
|
||||||
"DisplayMode": "Режим отображения",
|
"Always display floating window, disable sidebar for all site adapters": "Всегда отображать плавающее окно, отключить боковую панель для всех адаптеров сайтов"
|
||||||
"Display in sidebar": "Отображать в боковой панели",
|
|
||||||
"Display in floating toolbar": "Отображать в плавающей панели инструментов"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "Prompt Şablonu",
|
"Prompt Template": "Prompt Şablonu",
|
||||||
"Explain this: {{selection}}": "Bunu açıkla: {{selection}}",
|
"Explain this: {{selection}}": "Bunu açıkla: {{selection}}",
|
||||||
"New": "Yeni",
|
"New": "Yeni",
|
||||||
"DisplayMode": "Görüntüleme Modu",
|
"Always display floating window, disable sidebar for all site adapters": "Her zaman kayan pencereyi görüntüle, tüm site adaptörleri için kenar çubuğunu devre dışı bırak"
|
||||||
"Display in sidebar": "Kenar çubuğunda görüntüle",
|
|
||||||
"Display in floating toolbar": "Kayan araç çubuğunda görüntüle"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,9 +144,7 @@
|
|||||||
"Prompt Template": "提示模板",
|
"Prompt Template": "提示模板",
|
||||||
"Explain this: {{selection}}": "解释这个: {{selection}}",
|
"Explain this: {{selection}}": "解释这个: {{selection}}",
|
||||||
"New": "新建",
|
"New": "新建",
|
||||||
"DisplayMode": "显示方式",
|
"Always display floating window, disable sidebar for all site adapters": "总是显示浮动窗口, 禁用所有站点适配器的侧边栏",
|
||||||
"Display in sidebar": "在侧边栏显示",
|
|
||||||
"Display in floating toolbar": "在浮动工具栏显示",
|
|
||||||
"Temperature": "温度",
|
"Temperature": "温度",
|
||||||
"keep-alive Time": "保活时间",
|
"keep-alive Time": "保活时间",
|
||||||
"5m": "5分钟",
|
"5m": "5分钟",
|
||||||
|
|||||||
@@ -143,7 +143,5 @@
|
|||||||
"Prompt Template": "提示範本",
|
"Prompt Template": "提示範本",
|
||||||
"Explain this: {{selection}}": "解釋這個: {{selection}}",
|
"Explain this: {{selection}}": "解釋這個: {{selection}}",
|
||||||
"New": "新增",
|
"New": "新增",
|
||||||
"DisplayMode": "顯示模式",
|
"Always display floating window, disable sidebar for all site adapters": "總是顯示浮動視窗,停用所有網站適配器的側邊欄"
|
||||||
"Display in sidebar": "在側邊欄顯示",
|
|
||||||
"Display in floating toolbar": "在浮動工具列顯示"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
DesktopDownloadIcon,
|
DesktopDownloadIcon,
|
||||||
LinkExternalIcon,
|
LinkExternalIcon,
|
||||||
MoveToBottomIcon,
|
MoveToBottomIcon,
|
||||||
|
SearchIcon,
|
||||||
} from '@primer/octicons-react'
|
} from '@primer/octicons-react'
|
||||||
import { Pin, WindowDesktop, XLg } from 'react-bootstrap-icons'
|
import { Pin, WindowDesktop, XLg } from 'react-bootstrap-icons'
|
||||||
import FileSaver from 'file-saver'
|
import FileSaver from 'file-saver'
|
||||||
@@ -46,6 +47,7 @@ function ConversationCard(props) {
|
|||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const [isReady, setIsReady] = useState(!props.question)
|
const [isReady, setIsReady] = useState(!props.question)
|
||||||
const [port, setPort] = useState(() => Browser.runtime.connect())
|
const [port, setPort] = useState(() => Browser.runtime.connect())
|
||||||
|
const [triggered, setTriggered] = useState(!props.waitForTrigger)
|
||||||
const [session, setSession] = useState(props.session)
|
const [session, setSession] = useState(props.session)
|
||||||
const windowSize = useClampWindowSize([750, 1500], [250, 1100])
|
const windowSize = useClampWindowSize([750, 1500], [250, 1100])
|
||||||
const bodyRef = useRef(null)
|
const bodyRef = useRef(null)
|
||||||
@@ -59,7 +61,7 @@ function ConversationCard(props) {
|
|||||||
const [conversationItemData, setConversationItemData] = useState(
|
const [conversationItemData, setConversationItemData] = useState(
|
||||||
(() => {
|
(() => {
|
||||||
if (session.conversationRecords.length === 0)
|
if (session.conversationRecords.length === 0)
|
||||||
if (props.question)
|
if (props.question && triggered)
|
||||||
return [
|
return [
|
||||||
new ConversationItemData(
|
new ConversationItemData(
|
||||||
'answer',
|
'answer',
|
||||||
@@ -102,12 +104,12 @@ function ConversationCard(props) {
|
|||||||
|
|
||||||
useEffect(async () => {
|
useEffect(async () => {
|
||||||
// when the page is responsive, session may accumulate redundant data and needs to be cleared after remounting and before making a new request
|
// when the page is responsive, session may accumulate redundant data and needs to be cleared after remounting and before making a new request
|
||||||
if (props.question) {
|
if (props.question && triggered) {
|
||||||
const newSession = initSession({ ...session, question: props.question })
|
const newSession = initSession({ ...session, question: props.question })
|
||||||
setSession(newSession)
|
setSession(newSession)
|
||||||
await postMessage({ session: newSession })
|
await postMessage({ session: newSession })
|
||||||
}
|
}
|
||||||
}, [props.question]) // usually only triggered once
|
}, [props.question, triggered]) // usually only triggered once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} value
|
* @param {string} value
|
||||||
@@ -516,32 +518,53 @@ function ConversationCard(props) {
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<InputBox
|
{props.waitForTrigger && !triggered ? (
|
||||||
enabled={isReady}
|
<p
|
||||||
postMessage={postMessage}
|
className="manual-btn"
|
||||||
reverseResizeDir={props.pageMode}
|
style={{ display: 'flex', justifyContent: 'center' }}
|
||||||
onSubmit={async (question) => {
|
onClick={() => {
|
||||||
const newQuestion = new ConversationItemData('question', question)
|
setConversationItemData([
|
||||||
const newAnswer = new ConversationItemData(
|
new ConversationItemData(
|
||||||
'answer',
|
'answer',
|
||||||
`<p class="gpt-loading">${t('Waiting for response...')}</p>`,
|
`<p class="gpt-loading">${t(`Waiting for response...`)}</p>`,
|
||||||
)
|
),
|
||||||
setConversationItemData([...conversationItemData, newQuestion, newAnswer])
|
])
|
||||||
setIsReady(false)
|
setTriggered(true)
|
||||||
|
setIsReady(false)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<span className="icon-and-text">
|
||||||
|
<SearchIcon size="small" /> {t('Ask ChatGPT')}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
) : (
|
||||||
|
<InputBox
|
||||||
|
enabled={isReady}
|
||||||
|
postMessage={postMessage}
|
||||||
|
reverseResizeDir={props.pageMode}
|
||||||
|
onSubmit={async (question) => {
|
||||||
|
const newQuestion = new ConversationItemData('question', question)
|
||||||
|
const newAnswer = new ConversationItemData(
|
||||||
|
'answer',
|
||||||
|
`<p class="gpt-loading">${t('Waiting for response...')}</p>`,
|
||||||
|
)
|
||||||
|
setConversationItemData([...conversationItemData, newQuestion, newAnswer])
|
||||||
|
setIsReady(false)
|
||||||
|
|
||||||
const newSession = { ...session, question, isRetry: false }
|
const newSession = { ...session, question, isRetry: false }
|
||||||
setSession(newSession)
|
setSession(newSession)
|
||||||
try {
|
try {
|
||||||
await postMessage({ session: newSession })
|
await postMessage({ session: newSession })
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
updateAnswer(e, false, 'error')
|
updateAnswer(e, false, 'error')
|
||||||
}
|
}
|
||||||
bodyRef.current.scrollTo({
|
bodyRef.current.scrollTo({
|
||||||
top: bodyRef.current.scrollHeight,
|
top: bodyRef.current.scrollHeight,
|
||||||
behavior: 'instant',
|
behavior: 'instant',
|
||||||
})
|
})
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -557,6 +580,7 @@ ConversationCard.propTypes = {
|
|||||||
onDock: PropTypes.func,
|
onDock: PropTypes.func,
|
||||||
notClampSize: PropTypes.bool,
|
notClampSize: PropTypes.bool,
|
||||||
pageMode: PropTypes.bool,
|
pageMode: PropTypes.bool,
|
||||||
|
waitForTrigger: PropTypes.bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default memo(ConversationCard)
|
export default memo(ConversationCard)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import ReadButton from '../ReadButton'
|
|||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import MarkdownRender from '../MarkdownRender/markdown.jsx'
|
import MarkdownRender from '../MarkdownRender/markdown.jsx'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { isUsingCustomModel, isUsingOllamaModel } from '../../config/index.mjs'
|
import { isUsingCustomModel } from '../../config/index.mjs'
|
||||||
import { useConfig } from '../../hooks/use-config.mjs'
|
import { useConfig } from '../../hooks/use-config.mjs'
|
||||||
|
|
||||||
function AnswerTitle({ descName, modelName }) {
|
function AnswerTitle({ descName, modelName }) {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ function FloatingToolbar(props) {
|
|||||||
const windowSize = useClampWindowSize([750, 1500], [0, Infinity])
|
const windowSize = useClampWindowSize([750, 1500], [0, Infinity])
|
||||||
const config = useConfig(() => {
|
const config = useConfig(() => {
|
||||||
setRender(true)
|
setRender(true)
|
||||||
if (!triggered) {
|
if (!triggered && selection) {
|
||||||
props.container.style.position = 'absolute'
|
props.container.style.position = 'absolute'
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const left = Math.min(
|
const left = Math.min(
|
||||||
@@ -49,7 +49,7 @@ function FloatingToolbar(props) {
|
|||||||
|
|
||||||
if (!render) return <div />
|
if (!render) return <div />
|
||||||
|
|
||||||
if (triggered) {
|
if (triggered || (prompt && !selection)) {
|
||||||
const updatePosition = () => {
|
const updatePosition = () => {
|
||||||
const newPosition = setElementPositionInViewport(props.container, position.x, position.y)
|
const newPosition = setElementPositionInViewport(props.container, position.x, position.y)
|
||||||
if (position.x !== newPosition.x || position.y !== newPosition.y) setPosition(newPosition) // clear extra virtual position offset
|
if (position.x !== newPosition.x || position.y !== newPosition.y) setPosition(newPosition) // clear extra virtual position offset
|
||||||
@@ -106,6 +106,7 @@ function FloatingToolbar(props) {
|
|||||||
dockable={props.dockable}
|
dockable={props.dockable}
|
||||||
onDock={onDock}
|
onDock={onDock}
|
||||||
onUpdate={onUpdate}
|
onUpdate={onUpdate}
|
||||||
|
waitForTrigger={prompt && !triggered && !selection}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,11 +8,6 @@ export const TriggerMode = {
|
|||||||
manually: 'Manually',
|
manually: 'Manually',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DisplayMode = {
|
|
||||||
sidebar: 'Display in sidebar',
|
|
||||||
floatingToolbar: 'Display in floating toolbar',
|
|
||||||
}
|
|
||||||
|
|
||||||
export const ThemeMode = {
|
export const ThemeMode = {
|
||||||
light: 'Light',
|
light: 'Light',
|
||||||
dark: 'Dark',
|
dark: 'Dark',
|
||||||
@@ -213,8 +208,6 @@ export const defaultConfig = {
|
|||||||
|
|
||||||
/** @type {keyof TriggerMode}*/
|
/** @type {keyof TriggerMode}*/
|
||||||
triggerMode: 'manually',
|
triggerMode: 'manually',
|
||||||
/** @type {keyof DisplayMode}*/
|
|
||||||
displayMode: 'sidebar',
|
|
||||||
/** @type {keyof ThemeMode}*/
|
/** @type {keyof ThemeMode}*/
|
||||||
themeMode: 'auto',
|
themeMode: 'auto',
|
||||||
/** @type {keyof Models}*/
|
/** @type {keyof Models}*/
|
||||||
@@ -223,6 +216,7 @@ export const defaultConfig = {
|
|||||||
preferredLanguage: getNavigatorLanguage(),
|
preferredLanguage: getNavigatorLanguage(),
|
||||||
clickIconAction: 'popup',
|
clickIconAction: 'popup',
|
||||||
insertAtTop: isMobile(),
|
insertAtTop: isMobile(),
|
||||||
|
alwaysFloatingSidebar: false,
|
||||||
lockWhenAnswer: true,
|
lockWhenAnswer: true,
|
||||||
answerScrollMargin: 200,
|
answerScrollMargin: 200,
|
||||||
autoRegenAfterSwitchModel: false,
|
autoRegenAfterSwitchModel: false,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {
|
|||||||
import {
|
import {
|
||||||
createElementAtPosition,
|
createElementAtPosition,
|
||||||
cropText,
|
cropText,
|
||||||
|
endsWithQuestionMark,
|
||||||
getClientPosition,
|
getClientPosition,
|
||||||
getPossibleElementByQuerySelector,
|
getPossibleElementByQuerySelector,
|
||||||
} from '../utils'
|
} from '../utils'
|
||||||
@@ -33,28 +34,30 @@ import NotificationForChatGPTWeb from '../components/NotificationForChatGPTWeb'
|
|||||||
* @param {UserConfig} userConfig
|
* @param {UserConfig} userConfig
|
||||||
*/
|
*/
|
||||||
async function mountComponent(siteConfig, userConfig) {
|
async function mountComponent(siteConfig, userConfig) {
|
||||||
const retry = 10
|
if (!userConfig.alwaysFloatingSidebar) {
|
||||||
let oldUrl = location.href
|
const retry = 10
|
||||||
for (let i = 1; i <= retry; i++) {
|
let oldUrl = location.href
|
||||||
if (location.href !== oldUrl) {
|
for (let i = 1; i <= retry; i++) {
|
||||||
console.log(`SiteAdapters Retry ${i}/${retry}: stop`)
|
if (location.href !== oldUrl) {
|
||||||
return
|
console.log(`SiteAdapters Retry ${i}/${retry}: stop`)
|
||||||
}
|
return
|
||||||
const e =
|
}
|
||||||
(siteConfig &&
|
const e =
|
||||||
(getPossibleElementByQuerySelector(siteConfig.sidebarContainerQuery) ||
|
(siteConfig &&
|
||||||
getPossibleElementByQuerySelector(siteConfig.appendContainerQuery) ||
|
(getPossibleElementByQuerySelector(siteConfig.sidebarContainerQuery) ||
|
||||||
getPossibleElementByQuerySelector(siteConfig.resultsContainerQuery))) ||
|
getPossibleElementByQuerySelector(siteConfig.appendContainerQuery) ||
|
||||||
getPossibleElementByQuerySelector([userConfig.prependQuery]) ||
|
getPossibleElementByQuerySelector(siteConfig.resultsContainerQuery))) ||
|
||||||
getPossibleElementByQuerySelector([userConfig.appendQuery])
|
getPossibleElementByQuerySelector([userConfig.prependQuery]) ||
|
||||||
if (e) {
|
getPossibleElementByQuerySelector([userConfig.appendQuery])
|
||||||
console.log(`SiteAdapters Retry ${i}/${retry}: found`)
|
if (e) {
|
||||||
console.log(e)
|
console.log(`SiteAdapters Retry ${i}/${retry}: found`)
|
||||||
break
|
console.log(e)
|
||||||
} else {
|
break
|
||||||
console.log(`SiteAdapters Retry ${i}/${retry}: not found`)
|
} else {
|
||||||
if (i === retry) return
|
console.log(`SiteAdapters Retry ${i}/${retry}: not found`)
|
||||||
else await new Promise((r) => setTimeout(r, 500))
|
if (i === retry) return
|
||||||
|
else await new Promise((r) => setTimeout(r, 500))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
document.querySelectorAll('.chatgptbox-container,#chatgptbox-container').forEach((e) => {
|
document.querySelectorAll('.chatgptbox-container,#chatgptbox-container').forEach((e) => {
|
||||||
@@ -77,14 +80,17 @@ async function mountComponent(siteConfig, userConfig) {
|
|||||||
}
|
}
|
||||||
const toolbarContainer = createElementAtPosition(position.x, position.y)
|
const toolbarContainer = createElementAtPosition(position.x, position.y)
|
||||||
toolbarContainer.className = 'chatgptbox-toolbar-container-not-queryable'
|
toolbarContainer.className = 'chatgptbox-toolbar-container-not-queryable'
|
||||||
if (userConfig.displayMode === 'floatingToolbar') {
|
if (userConfig.alwaysFloatingSidebar && question) {
|
||||||
|
let triggered = false
|
||||||
|
if (userConfig.triggerMode === 'always') triggered = true
|
||||||
|
else if (userConfig.triggerMode === 'questionMark' && endsWithQuestionMark(question.trim()))
|
||||||
|
triggered = true
|
||||||
render(
|
render(
|
||||||
<FloatingToolbar
|
<FloatingToolbar
|
||||||
session={initSession({ modelName: userConfig.modelName })}
|
session={initSession({ modelName: userConfig.modelName })}
|
||||||
selection={question}
|
selection=""
|
||||||
container={toolbarContainer}
|
container={toolbarContainer}
|
||||||
dockable={true}
|
triggered={triggered}
|
||||||
triggered={true}
|
|
||||||
closeable={true}
|
closeable={true}
|
||||||
prompt={question}
|
prompt={question}
|
||||||
/>,
|
/>,
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ChatGPTBox",
|
"name": "ChatGPTBox",
|
||||||
"description": "Integrating ChatGPT into your browser deeply, everything you need is here",
|
"description": "Integrating ChatGPT into your browser deeply, everything you need is here",
|
||||||
"version": "2.5.7",
|
"version": "2.5.6",
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"icons": {
|
"icons": {
|
||||||
"16": "logo.png",
|
"16": "logo.png",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ChatGPTBox",
|
"name": "ChatGPTBox",
|
||||||
"description": "Integrating ChatGPT into your browser deeply, everything you need is here",
|
"description": "Integrating ChatGPT into your browser deeply, everything you need is here",
|
||||||
"version": "2.5.7",
|
"version": "2.5.6",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"icons": {
|
"icons": {
|
||||||
"16": "logo.png",
|
"16": "logo.png",
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import {
|
|||||||
Models,
|
Models,
|
||||||
ThemeMode,
|
ThemeMode,
|
||||||
TriggerMode,
|
TriggerMode,
|
||||||
DisplayMode,
|
|
||||||
isUsingMoonshotApi,
|
isUsingMoonshotApi,
|
||||||
} from '../../config/index.mjs'
|
} from '../../config/index.mjs'
|
||||||
import Browser from 'webextension-polyfill'
|
import Browser from 'webextension-polyfill'
|
||||||
@@ -120,24 +119,6 @@ export function GeneralPart({ config, updateConfig }) {
|
|||||||
})}
|
})}
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
|
||||||
<legend>{t('DisplayMode')}</legend>
|
|
||||||
<select
|
|
||||||
required
|
|
||||||
onChange={(e) => {
|
|
||||||
const mode = e.target.value
|
|
||||||
updateConfig({ displayMode: mode })
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{Object.entries(DisplayMode).map(([key, desc]) => {
|
|
||||||
return (
|
|
||||||
<option value={key} key={key} selected={key === config.displayMode}>
|
|
||||||
{t(desc)}
|
|
||||||
</option>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</select>
|
|
||||||
</label>
|
|
||||||
<label>
|
<label>
|
||||||
<legend>{t('Theme')}</legend>
|
<legend>{t('Theme')}</legend>
|
||||||
<select
|
<select
|
||||||
@@ -492,6 +473,17 @@ export function GeneralPart({ config, updateConfig }) {
|
|||||||
/>
|
/>
|
||||||
{t('Insert ChatGPT at the top of search results')}
|
{t('Insert ChatGPT at the top of search results')}
|
||||||
</label>
|
</label>
|
||||||
|
<label>
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
checked={config.alwaysFloatingSidebar}
|
||||||
|
onChange={(e) => {
|
||||||
|
const checked = e.target.checked
|
||||||
|
updateConfig({ alwaysFloatingSidebar: checked })
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{t('Always display floating window, disable sidebar for all site adapters')}
|
||||||
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
|
|||||||
Reference in New Issue
Block a user