improve the compatibility of Safari and Firefox with the new style (#305, #371)

This commit is contained in:
josc146
2023-06-12 22:52:13 +08:00
parent 75d92bc4f8
commit a0c19d7df7
2 changed files with 41 additions and 10 deletions
+29 -5
View File
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'
import Browser from 'webextension-polyfill' import Browser from 'webextension-polyfill'
import InputBox from '../InputBox' import InputBox from '../InputBox'
import ConversationItem from '../ConversationItem' import ConversationItem from '../ConversationItem'
import { createElementAtPosition, isSafari } from '../../utils' import { createElementAtPosition, isFirefox, isMobile, isSafari } from '../../utils'
import { import {
LinkExternalIcon, LinkExternalIcon,
ArchiveIcon, ArchiveIcon,
@@ -47,6 +47,8 @@ function ConversationCard(props) {
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)
const [completeDraggable, setCompleteDraggable] = useState(false)
/** /**
* @type {[ConversationItemData[], (conversationItemData: ConversationItemData[]) => void]} * @type {[ConversationItemData[], (conversationItemData: ConversationItemData[]) => void]}
*/ */
@@ -73,6 +75,10 @@ function ConversationCard(props) {
) )
const config = useConfig() const config = useConfig()
useEffect(() => {
setCompleteDraggable(!isSafari() && !isFirefox() && !isMobile())
}, [])
useEffect(() => { useEffect(() => {
if (props.onUpdate) props.onUpdate(port, session, conversationItemData) if (props.onUpdate) props.onUpdate(port, session, conversationItemData)
}, [session, conversationItemData]) }, [session, conversationItemData])
@@ -218,10 +224,18 @@ function ConversationCard(props) {
return ( return (
<div className="gpt-inner"> <div className="gpt-inner">
<div <div
className={props.draggable ? 'gpt-header draggable' : 'gpt-header'} className={
style="padding:15px;user-select:none;" props.draggable ? `gpt-header${completeDraggable ? ' draggable' : ''}` : 'gpt-header'
}
style="user-select:none;"
> >
<span className="gpt-util-group" style={props.notClampSize ? {} : { flexGrow: 1 }}> <span
className="gpt-util-group"
style={{
padding: '15px 0 15px 15px',
...(props.notClampSize ? {} : { flexGrow: 1 }),
}}
>
{props.closeable ? ( {props.closeable ? (
<XLg <XLg
className="gpt-util-icon" className="gpt-util-icon"
@@ -278,7 +292,17 @@ function ConversationCard(props) {
})} })}
</select> </select>
</span> </span>
<span className="gpt-util-group" style={{ flexGrow: 1, justifyContent: 'flex-end' }}> {props.draggable && !completeDraggable && (
<div className="draggable" style={{ flexGrow: 2, cursor: 'move', height: '55px' }} />
)}
<span
className="gpt-util-group"
style={{
padding: '15px 15px 15px 0',
justifyContent: 'flex-end',
flexGrow: props.draggable && !completeDraggable ? 0 : 1,
}}
>
{!config.disableWebModeHistory && session && session.conversationId && ( {!config.disableWebModeHistory && session && session.conversationId && (
<a <a
title={t('Continue on official website')} title={t('Continue on official website')}
+12 -5
View File
@@ -1,6 +1,6 @@
import { useEffect, useRef, useState } from 'react' import { useEffect, useRef, useState } from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import { updateRefHeight } from '../../utils' import { isFirefox, isMobile, isSafari, updateRefHeight } from '../../utils'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { getUserConfig } from '../../config/index.mjs' import { getUserConfig } from '../../config/index.mjs'
@@ -10,8 +10,15 @@ export function InputBox({ onSubmit, enabled, port, reverseResizeDir }) {
const reverseDivRef = useRef(null) const reverseDivRef = useRef(null)
const inputRef = useRef(null) const inputRef = useRef(null)
const resizedRef = useRef(false) const resizedRef = useRef(false)
const [internalReverseResizeDir, setInternalReverseResizeDir] = useState(reverseResizeDir)
const virtualInputRef = reverseResizeDir ? reverseDivRef : inputRef useEffect(() => {
setInternalReverseResizeDir(
!isSafari() && !isFirefox() && !isMobile() ? internalReverseResizeDir : false,
)
}, [])
const virtualInputRef = internalReverseResizeDir ? reverseDivRef : inputRef
useEffect(() => { useEffect(() => {
inputRef.current.focus() inputRef.current.focus()
@@ -31,7 +38,7 @@ export function InputBox({ onSubmit, enabled, port, reverseResizeDir }) {
useEffect(() => { useEffect(() => {
if (!resizedRef.current) { if (!resizedRef.current) {
if (!reverseResizeDir) { if (!internalReverseResizeDir) {
updateRefHeight(inputRef) updateRefHeight(inputRef)
virtualInputRef.current.h = virtualInputRef.current.offsetHeight virtualInputRef.current.h = virtualInputRef.current.offsetHeight
virtualInputRef.current.style.maxHeight = '160px' virtualInputRef.current.style.maxHeight = '160px'
@@ -65,7 +72,7 @@ export function InputBox({ onSubmit, enabled, port, reverseResizeDir }) {
<div <div
ref={reverseDivRef} ref={reverseDivRef}
style={ style={
reverseResizeDir && { internalReverseResizeDir && {
transform: 'rotateX(180deg)', transform: 'rotateX(180deg)',
resize: 'vertical', resize: 'vertical',
overflow: 'hidden', overflow: 'hidden',
@@ -79,7 +86,7 @@ export function InputBox({ onSubmit, enabled, port, reverseResizeDir }) {
disabled={false} disabled={false}
className="interact-input" className="interact-input"
style={ style={
reverseResizeDir internalReverseResizeDir
? { transform: 'rotateX(180deg)', resize: 'none' } ? { transform: 'rotateX(180deg)', resize: 'none' }
: { resize: 'vertical', minHeight: '70px' } : { resize: 'vertical', minHeight: '70px' }
} }