Revert "Fix popover behavior when open and clicking on trigger"

This reverts commit 935ac36467.
This commit is contained in:
Andrew Prifer 2022-06-10 21:27:02 +02:00
parent 935ac36467
commit 8ef99aef1b
13 changed files with 52 additions and 88 deletions

View file

@ -55,7 +55,7 @@ const ProjectDetails: React.FC<{
}, 40000) }, 40000)
}, []) }, [])
const {node: tooltip, open: openExportTooltip} = usePopover( const [tooltip, openExportTooltip] = usePopover(
{debugName: 'ProjectDetails', pointerDistanceThreshold: 50}, {debugName: 'ProjectDetails', pointerDistanceThreshold: 50},
() => ( () => (
<ExportTooltip> <ExportTooltip>

View file

@ -55,11 +55,7 @@ export const AggregateKeyframeConnector: React.VFC<IAggregateKeyframeConnectorPr
const [contextMenu] = useConnectorContextMenu(props, node) const [contextMenu] = useConnectorContextMenu(props, node)
const [isDragging] = useDragKeyframe(node, props.editorProps) const [isDragging] = useDragKeyframe(node, props.editorProps)
const { const [popoverNode, openPopover, closePopover] = usePopover(
node: popoverNode,
toggle: togglePopover,
close: closePopover,
} = usePopover(
() => { () => {
const rightDims = val(editorProps.layoutP.rightDims) const rightDims = val(editorProps.layoutP.rightDims)
@ -93,7 +89,7 @@ export const AggregateKeyframeConnector: React.VFC<IAggregateKeyframeConnectorPr
isSelected={connected ? connected.selected : false} isSelected={connected ? connected.selected : false}
isPopoverOpen={isAggregateEditingInCurvePopover} isPopoverOpen={isAggregateEditingInCurvePopover}
openPopover={(e) => { openPopover={(e) => {
if (node) togglePopover(e, node) if (node) openPopover(e, node)
}} }}
/> />
{popoverNode} {popoverNode}

View file

@ -41,11 +41,7 @@ const BasicKeyframeConnector: React.VFC<IBasicKeyframeConnectorProps> = (
const [nodeRef, node] = useRefAndState<HTMLDivElement | null>(null) const [nodeRef, node] = useRefAndState<HTMLDivElement | null>(null)
const { const [popoverNode, openPopover, closePopover, isPopoverOpen] = usePopover(
node: popoverNode,
toggle: togglePopover,
close: closePopover,
} = usePopover(
() => { () => {
const rightDims = val(props.layoutP.rightDims) const rightDims = val(props.layoutP.rightDims)
return { return {
@ -87,7 +83,7 @@ const BasicKeyframeConnector: React.VFC<IBasicKeyframeConnectorProps> = (
connectorLengthInUnitSpace={connectorLengthInUnitSpace} connectorLengthInUnitSpace={connectorLengthInUnitSpace}
{...themeValues} {...themeValues}
openPopover={(e) => { openPopover={(e) => {
if (node) togglePopover(e, node) if (node) openPopover(e, node)
}} }}
> >
{popoverNode} {popoverNode}

View file

@ -94,14 +94,11 @@ const SingleKeyframeDot: React.VFC<ISingleKeyframeDotProps> = (props) => {
const [ref, node] = useRefAndState<HTMLDivElement | null>(null) const [ref, node] = useRefAndState<HTMLDivElement | null>(null)
const [contextMenu] = useSingleKeyframeContextMenu(node, logger, props) const [contextMenu] = useSingleKeyframeContextMenu(node, logger, props)
const { const [inlineEditorPopover, openEditor, _, isInlineEditorPopoverOpen] =
node: inlineEditorPopover, useSingleKeyframeInlineEditorPopover(props)
toggle: toggleEditor,
isOpen: isInlineEditorPopoverOpen,
} = useSingleKeyframeInlineEditorPopover(props)
const [isDragging] = useDragForSingleKeyframeDot(node, props, { const [isDragging] = useDragForSingleKeyframeDot(node, props, {
onClickFromDrag(dragStartEvent) { onClickFromDrag(dragStartEvent) {
toggleEditor(dragStartEvent, ref.current!) openEditor(dragStartEvent, ref.current!)
}, },
}) })
@ -230,8 +227,6 @@ function useDragForSingleKeyframeDot(
const propsRef = useRef(props) const propsRef = useRef(props)
propsRef.current = props propsRef.current = props
const {onClickFromDrag} = options
const useDragOpts = useMemo<UseDragOpts>(() => { const useDragOpts = useMemo<UseDragOpts>(() => {
return { return {
debugName: 'KeyframeDot/useDragKeyframe', debugName: 'KeyframeDot/useDragKeyframe',
@ -287,7 +282,7 @@ function useDragForSingleKeyframeDot(
return ( return (
handlers && { handlers && {
...handlers, ...handlers,
onClick: onClickFromDrag, onClick: options.onClickFromDrag,
onDragEnd: (...args) => { onDragEnd: (...args) => {
handlers.onDragEnd?.(...args) handlers.onDragEnd?.(...args)
snapToNone() snapToNone()
@ -343,12 +338,12 @@ function useDragForSingleKeyframeDot(
snapToNone() snapToNone()
}, },
onClick(ev) { onClick(ev) {
onClickFromDrag(ev) options.onClickFromDrag(ev)
}, },
} }
}, },
} }
}, [onClickFromDrag]) }, [])
const [isDragging] = useDrag(node, useDragOpts) const [isDragging] = useDrag(node, useDragOpts)

View file

@ -32,7 +32,7 @@ const LengthEditorPopover: React.FC<{
* Called when user hits enter/escape * Called when user hits enter/escape
*/ */
onRequestClose: (reason: string) => void onRequestClose: (reason: string) => void
}> = ({layoutP}) => { }> = ({layoutP, onRequestClose}) => {
const sheet = useVal(layoutP.sheet) const sheet = useVal(layoutP.sheet)
const fns = useMemo(() => { const fns = useMemo(() => {
@ -89,6 +89,7 @@ const LengthEditorPopover: React.FC<{
{...fns} {...fns}
isValid={greaterThanZero} isValid={greaterThanZero}
inputRef={inputRef} inputRef={inputRef}
onBlur={onRequestClose.bind(null, 'length editor number input blur')}
nudge={nudge} nudge={nudge}
/> />
</Container> </Container>

View file

@ -138,17 +138,19 @@ const RENDER_OUT_OF_VIEW_X = -10000
const LengthIndicator: React.FC<IProps> = ({layoutP}) => { const LengthIndicator: React.FC<IProps> = ({layoutP}) => {
const [nodeRef, node] = useRefAndState<HTMLDivElement | null>(null) const [nodeRef, node] = useRefAndState<HTMLDivElement | null>(null)
const [isDragging] = useDragBulge(node, {layoutP}) const [isDragging] = useDragBulge(node, {layoutP})
const { const [popoverNode, openPopover, closePopover, isPopoverOpen] = usePopover(
node: popoverNode, {debugName: 'LengthIndicator'},
toggle: togglePopover, () => {
close: closePopover, return (
} = usePopover({debugName: 'LengthIndicator'}, () => { <BasicPopover>
return ( <LengthEditorPopover
<BasicPopover> layoutP={layoutP}
<LengthEditorPopover layoutP={layoutP} onRequestClose={closePopover} /> onRequestClose={closePopover}
</BasicPopover> />
) </BasicPopover>
}) )
},
)
return usePrism(() => { return usePrism(() => {
const sheet = val(layoutP.sheet) const sheet = val(layoutP.sheet)
@ -189,7 +191,7 @@ const LengthIndicator: React.FC<IProps> = ({layoutP}) => {
ref={nodeRef} ref={nodeRef}
// title="Length of the sequence. Drag or click to change." // title="Length of the sequence. Drag or click to change."
onClick={(e) => { onClick={(e) => {
togglePopover(e, node!) openPopover(e, node!)
}} }}
{...includeLockFrameStampAttrs('hide')} {...includeLockFrameStampAttrs('hide')}
> >

View file

@ -193,20 +193,19 @@ const Playhead: React.FC<{layoutP: Pointer<SequenceEditorPanelLayout>}> = ({
}) => { }) => {
const [thumbRef, thumbNode] = useRefAndState<HTMLElement | null>(null) const [thumbRef, thumbNode] = useRefAndState<HTMLElement | null>(null)
const { const [popoverNode, openPopover, closePopover, isPopoverOpen] = usePopover(
node: popoverNode, {debugName: 'Playhead'},
toggle: togglePopover, () => {
close: closePopover, return (
} = usePopover({debugName: 'Playhead'}, () => { <BasicPopover>
return ( <PlayheadPositionPopover
<BasicPopover> layoutP={layoutP}
<PlayheadPositionPopover onRequestClose={closePopover}
layoutP={layoutP} />
onRequestClose={closePopover} </BasicPopover>
/> )
</BasicPopover> },
) )
})
const gestureHandlers = useMemo((): Parameters<typeof useDrag>[1] => { const gestureHandlers = useMemo((): Parameters<typeof useDrag>[1] => {
return { return {
@ -237,7 +236,7 @@ const Playhead: React.FC<{layoutP: Pointer<SequenceEditorPanelLayout>}> = ({
snapToNone() snapToNone()
}, },
onClick(e) { onClick(e) {
togglePopover(e, thumbRef.current!) openPopover(e, thumbRef.current!)
}, },
} }
}, },

View file

@ -33,7 +33,7 @@ const PlayheadPositionPopover: React.FC<{
* Called when user hits enter/escape * Called when user hits enter/escape
*/ */
onRequestClose: (reason: string) => void onRequestClose: (reason: string) => void
}> = ({layoutP}) => { }> = ({layoutP, onRequestClose}) => {
const sheet = val(layoutP.sheet) const sheet = val(layoutP.sheet)
const sequence = sheet.getSequence() const sequence = sheet.getSequence()
@ -80,6 +80,7 @@ const PlayheadPositionPopover: React.FC<{
{...fns} {...fns}
isValid={greaterThanZero} isValid={greaterThanZero}
inputRef={inputRef} inputRef={inputRef}
onBlur={onRequestClose.bind(null, 'number input blur')}
nudge={nudge} nudge={nudge}
/> />
</Container> </Container>

View file

@ -74,7 +74,7 @@ function RgbaPropEditor({
[editingTools], [editingTools],
) )
const {node: popoverNode, toggle: togglePopover} = usePopover( const [popoverNode, openPopover] = usePopover(
{debugName: 'RgbaPropEditor'}, {debugName: 'RgbaPropEditor'},
() => ( () => (
<RgbaPopover> <RgbaPopover>
@ -107,7 +107,7 @@ function RgbaPropEditor({
rgbaColor={value} rgbaColor={value}
ref={containerRef} ref={containerRef}
onClick={(e) => { onClick={(e) => {
togglePopover(e, containerRef.current) openPopover(e, containerRef.current)
}} }}
/> />
<HexInput <HexInput

View file

@ -88,7 +88,7 @@ const GlobalToolbar: React.FC = () => {
const hasUpdates = const hasUpdates =
useVal(getStudio().atomP.ahistoric.updateChecker.result.hasUpdates) === true useVal(getStudio().atomP.ahistoric.updateChecker.result.hasUpdates) === true
const {node: moreMenu, toggle: toggleMenu} = usePopover( const [moreMenu, openMoreMenu] = usePopover(
() => { () => {
const triggerBounds = moreMenuTriggerRef.current!.getBoundingClientRect() const triggerBounds = moreMenuTriggerRef.current!.getBoundingClientRect()
return { return {
@ -138,7 +138,7 @@ const GlobalToolbar: React.FC = () => {
<ToolbarIconButton <ToolbarIconButton
ref={moreMenuTriggerRef} ref={moreMenuTriggerRef}
onClick={(e) => { onClick={(e) => {
toggleMenu(e, moreMenuTriggerRef.current!) openMoreMenu(e, moreMenuTriggerRef.current!)
}} }}
> >
<Ellipsis /> <Ellipsis />

View file

@ -138,10 +138,7 @@ const TooltipWrapper: React.FC<{
props.onPointerOutside, props.onPointerOutside,
]) ])
useOnClickOutside( useOnClickOutside(container, props.onClickOutside ?? noop)
[container, props.target ?? null],
props.onClickOutside ?? noop,
)
return ( return (
<ArrowContext.Provider value={arrowContextValue}> <ArrowContext.Provider value={arrowContextValue}>

View file

@ -51,13 +51,7 @@ type Opts = {
export default function usePopover( export default function usePopover(
opts: Opts | (() => Opts), opts: Opts | (() => Opts),
render: () => React.ReactElement, render: () => React.ReactElement,
): { ): [node: React.ReactNode, open: OpenFn, close: CloseFn, isOpen: boolean] {
node: React.ReactNode
open: OpenFn
close: CloseFn
toggle: OpenFn
isOpen: boolean
} {
const _debug = (...args: any) => {} const _debug = (...args: any) => {}
// want to make sure that we don't close a popover when dragging something (like a curve editor handle) // want to make sure that we don't close a popover when dragging something (like a curve editor handle)
@ -110,14 +104,6 @@ export default function usePopover(
} }
}, []) }, [])
const toggle = useCallback<OpenFn>((...args) => {
if (stateRef.current.isOpen) {
close('toggled')
} else {
open(...args)
}
}, [])
/** /**
* See doc comment on {@link useAutoCloseLockState}. * See doc comment on {@link useAutoCloseLockState}.
* Used to ensure that moving far away from a parent popover doesn't * Used to ensure that moving far away from a parent popover doesn't
@ -160,7 +146,7 @@ export default function usePopover(
<></> <></>
) )
return {node, open, close, toggle, isOpen: state.isOpen} return [node, open, close, state.isOpen]
} }
/** /**

View file

@ -2,24 +2,15 @@ import type {$IntentionalAny} from '@theatre/shared/utils/types'
import {useEffect} from 'react' import {useEffect} from 'react'
export default function useOnClickOutside( export default function useOnClickOutside(
container: Element | null | (Element | null)[], container: Element | null,
onOutside: (e: MouseEvent) => void, onOutside: (e: MouseEvent) => void,
enabled?: boolean, enabled?: boolean,
// Can be used e.g. to prevent unexpected closing-reopening when clicking on a
// popover's trigger.
) { ) {
useEffect(() => { useEffect(() => {
if (!container || enabled === false) return if (!container || enabled === false) return
const containers = Array.isArray(container)
? (container.filter((container) => container) as Element[])
: [container]
const onMouseDown = (e: MouseEvent) => { const onMouseDown = (e: MouseEvent) => {
if ( if (!e.composedPath().includes(container)) {
containers.every((container) => !e.composedPath().includes(container))
) {
console.log('outside')
onOutside(e) onOutside(e)
} }
} }