mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 21:45:31 +09:00
fix(app): gate single-source message hover behind an experiment (#2761)
This commit is contained in:
1 parent
69c42cff90
commit
1281045648
30 files changed
+2107
-360
No files matched your search
@@ -2,12 +2,11 @@
|
||||
|
||||
import ContextMenu, {isContextMenuNodeTarget} from '@app/features/ui/state/ContextMenu';
|
||||
import {autorun} from 'mobx';
|
||||
import {type RefObject, useEffect, useState} from 'react';
|
||||
import {type RefObject, useEffect, useRef, useState} from 'react';
|
||||
|
||||
interface ContextMenuHoverSubscriber {
|
||||
readonly elementRef: RefObject<HTMLElement | null>;
|
||||
readonly setContextMenuOpen: (contextMenuOpen: boolean) => void;
|
||||
contextMenuOpen: boolean;
|
||||
}
|
||||
|
||||
const contextMenuHoverSubscribers = new Set<ContextMenuHoverSubscriber>();
|
||||
@@ -28,10 +27,7 @@ function syncContextMenuHoverSubscribers(): void {
|
||||
const chain = resolveContextMenuTargetChain();
|
||||
for (const subscriber of Array.from(contextMenuHoverSubscribers)) {
|
||||
const element = subscriber.elementRef.current;
|
||||
const contextMenuOpen = chain != null && element != null && chain.has(element);
|
||||
if (subscriber.contextMenuOpen === contextMenuOpen) continue;
|
||||
subscriber.contextMenuOpen = contextMenuOpen;
|
||||
subscriber.setContextMenuOpen(contextMenuOpen);
|
||||
subscriber.setContextMenuOpen(chain != null && element != null && chain.has(element));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,12 +48,22 @@ function subscribeContextMenuHover(subscriber: ContextMenuHoverSubscriber): () =
|
||||
|
||||
export function useContextMenuHoverState(elementRef: RefObject<HTMLElement | null>, enabled: boolean = true): boolean {
|
||||
const [contextMenuOpen, setContextMenuOpen] = useState(false);
|
||||
const publishedContextMenuOpenRef = useRef(false);
|
||||
useEffect(() => {
|
||||
const publishContextMenuOpen = (nextContextMenuOpen: boolean) => {
|
||||
if (publishedContextMenuOpenRef.current === nextContextMenuOpen) return;
|
||||
publishedContextMenuOpenRef.current = nextContextMenuOpen;
|
||||
setContextMenuOpen(nextContextMenuOpen);
|
||||
};
|
||||
if (!enabled) {
|
||||
setContextMenuOpen(false);
|
||||
publishContextMenuOpen(false);
|
||||
return;
|
||||
}
|
||||
return subscribeContextMenuHover({elementRef, setContextMenuOpen, contextMenuOpen: false});
|
||||
const unsubscribe = subscribeContextMenuHover({elementRef, setContextMenuOpen: publishContextMenuOpen});
|
||||
return () => {
|
||||
unsubscribe();
|
||||
publishContextMenuOpen(false);
|
||||
};
|
||||
}, [elementRef, enabled]);
|
||||
return contextMenuOpen;
|
||||
}
|
||||
Reference in new issue
Block a user