mirror of
https://github.com/Boof2015/prism.git
synced 2026-08-12 13:20:53 +02:00
66 lines
2.3 KiB
TypeScript
66 lines
2.3 KiB
TypeScript
import { useCallback, useEffect, type JSX, type PointerEvent as ReactPointerEvent } from 'react'
|
|
import { RESIZE_DIRECTIONS, type ResizeDirection } from '../../types/windowResize'
|
|
|
|
const RESIZE_HANDLE_CLASSNAMES: Record<ResizeDirection, string> = {
|
|
n: 'window-resize-overlay__handle window-resize-overlay__handle--n',
|
|
s: 'window-resize-overlay__handle window-resize-overlay__handle--s',
|
|
e: 'window-resize-overlay__handle window-resize-overlay__handle--e',
|
|
w: 'window-resize-overlay__handle window-resize-overlay__handle--w',
|
|
ne: 'window-resize-overlay__handle window-resize-overlay__handle--ne',
|
|
nw: 'window-resize-overlay__handle window-resize-overlay__handle--nw',
|
|
se: 'window-resize-overlay__handle window-resize-overlay__handle--se',
|
|
sw: 'window-resize-overlay__handle window-resize-overlay__handle--sw',
|
|
}
|
|
|
|
export default function WindowResizeOverlay(): JSX.Element | null {
|
|
const isWindows = window.electronAPI.platform === 'win32'
|
|
|
|
const stopResize = useCallback(() => {
|
|
window.electronAPI.stopWindowResize()
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
if (!isWindows) return
|
|
|
|
window.addEventListener('blur', stopResize)
|
|
return () => {
|
|
window.removeEventListener('blur', stopResize)
|
|
stopResize()
|
|
}
|
|
}, [isWindows, stopResize])
|
|
|
|
const handlePointerDown = useCallback((direction: ResizeDirection) => {
|
|
return (event: ReactPointerEvent<HTMLDivElement>): void => {
|
|
if (event.button !== 0) return
|
|
event.preventDefault()
|
|
event.stopPropagation()
|
|
event.currentTarget.setPointerCapture(event.pointerId)
|
|
window.electronAPI.startWindowResize(direction)
|
|
}
|
|
}, [])
|
|
|
|
const handlePointerEnd = useCallback((event: ReactPointerEvent<HTMLDivElement>): void => {
|
|
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
event.currentTarget.releasePointerCapture(event.pointerId)
|
|
}
|
|
stopResize()
|
|
}, [stopResize])
|
|
|
|
if (!isWindows) return null
|
|
|
|
return (
|
|
<div className="window-resize-overlay" aria-hidden="true">
|
|
{RESIZE_DIRECTIONS.map((direction) => (
|
|
<div
|
|
key={direction}
|
|
className={RESIZE_HANDLE_CLASSNAMES[direction]}
|
|
onPointerDown={handlePointerDown(direction)}
|
|
onPointerUp={handlePointerEnd}
|
|
onPointerCancel={handlePointerEnd}
|
|
onLostPointerCapture={handlePointerEnd}
|
|
/>
|
|
))}
|
|
</div>
|
|
)
|
|
}
|