Skip to content

Commit c6caf56

Browse files
committed
feat: dynamic max-height and width (#1)
1 parent 705b960 commit c6caf56

File tree

6 files changed

+33
-7
lines changed

6 files changed

+33
-7
lines changed

src/components/ConversationCard/index.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { WindowDesktop, XLg } from 'react-bootstrap-icons'
99
import FileSaver from 'file-saver'
1010
import { render } from 'preact'
1111
import FloatingToolbar from '../FloatingToolbar'
12+
import { useClampWindowSize } from '../../hooks/use-clamp-window-size'
1213

1314
const logo = Browser.runtime.getURL('logo.png')
1415

@@ -32,6 +33,7 @@ function ConversationCard(props) {
3233
const [isReady, setIsReady] = useState(!props.question)
3334
const [port, setPort] = useState(() => Browser.runtime.connect())
3435
const [session, setSession] = useState(props.session)
36+
const windowSize = useClampWindowSize([0, Infinity], [250, 1100])
3537
/**
3638
* @type {[ConversationItemData[], (conversationItemData: ConversationItemData[]) => void]}
3739
*/
@@ -213,7 +215,7 @@ function ConversationCard(props) {
213215
</span>
214216
</div>
215217
<hr />
216-
<div className="markdown-body">
218+
<div className="markdown-body" style={{ maxHeight: windowSize[1] * 0.75 + 'px' }}>
217219
{conversationItemData.map((data, idx) => (
218220
<ConversationItem
219221
content={data.content}

src/components/FloatingToolbar/index.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { defaultConfig, getUserConfig } from '../../config.mjs'
66
import { config as toolsConfig } from '../../content-script/selection-tools'
77
import { setElementPositionInViewport } from '../../utils'
88
import Draggable from 'react-draggable'
9+
import { useClampWindowSize } from '../../hooks/use-clamp-window-size'
910

1011
const logo = Browser.runtime.getURL('logo.png')
1112

@@ -16,6 +17,7 @@ function FloatingToolbar(props) {
1617
const [render, setRender] = useState(false)
1718
const [position, setPosition] = useState(props.position)
1819
const [virtualPosition, setVirtualPosition] = useState({ x: 0, y: 0 })
20+
const windowSize = useClampWindowSize([750, 1500], [0, Infinity])
1921

2022
useEffect(() => {
2123
getUserConfig()
@@ -68,7 +70,7 @@ function FloatingToolbar(props) {
6870
onStop={dragEvent.onStop}
6971
position={virtualPosition}
7072
>
71-
<div className="gpt-selection-window">
73+
<div className="gpt-selection-window" style={{ width: windowSize[0] * 0.4 + 'px' }}>
7274
<div className="chat-gpt-container">
7375
<ConversationCard
7476
session={props.session}

src/content-script/styles.scss

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
padding: 5px 15px 10px;
6666
background-color: var(--theme-color);
6767
color: var(--font-color);
68-
max-height: 800px;
6968
resize: vertical;
7069
overflow-y: auto;
7170

@@ -188,7 +187,7 @@
188187

189188
.dragbar {
190189
cursor: move;
191-
width: 250px;
190+
width: 42%;
192191
height: 12px;
193192
border-radius: 10px;
194193
background-color: var(--dragbar-color);
@@ -229,7 +228,6 @@
229228
}
230229

231230
.gpt-selection-window {
232-
width: 600px;
233231
height: auto;
234232
border-radius: 8px;
235233
background-color: var(--theme-color);

src/hooks/use-clamp-window-size.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { useWindowSize } from './use-window-size.mjs'
2+
3+
export function useClampWindowSize(widthRange = [0, Infinity], heightRange = [0, Infinity]) {
4+
const windowSize = useWindowSize()
5+
windowSize[0] = Math.min(widthRange[1], Math.max(windowSize[0], widthRange[0]))
6+
windowSize[1] = Math.min(heightRange[1], Math.max(windowSize[1], heightRange[0]))
7+
return windowSize
8+
}

src/hooks/use-window-size.mjs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// https://stackoverflow.com/questions/19014250/rerender-view-on-browser-resize-with-react
2+
3+
import { useLayoutEffect, useState } from 'react'
4+
5+
export function useWindowSize() {
6+
const [size, setSize] = useState([0, 0])
7+
useLayoutEffect(() => {
8+
function updateSize() {
9+
setSize([window.innerWidth, window.innerHeight])
10+
}
11+
window.addEventListener('resize', updateSize)
12+
updateSize()
13+
return () => window.removeEventListener('resize', updateSize)
14+
}, [])
15+
return size
16+
}

src/utils/set-element-position-in-viewport.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export function setElementPositionInViewport(element, x = 0, y = 0) {
2-
const retX = Math.min(window.innerWidth - element.offsetWidth, Math.max(0, x))
3-
const retY = Math.min(window.innerHeight - element.offsetHeight, Math.max(0, y))
2+
const retX = Math.min(Math.max(0, window.innerWidth - element.offsetWidth), Math.max(0, x))
3+
const retY = Math.min(Math.max(0, window.innerHeight - element.offsetHeight), Math.max(0, y))
44
element.style.left = retX + 'px'
55
element.style.top = retY + 'px'
66
return { x: retX, y: retY }

0 commit comments

Comments
 (0)