Refine mobile dropdown close behavior
This commit is contained in:
@@ -35,6 +35,7 @@ type BannerApiResponse = {
|
||||
|
||||
const AUTOPLAY_MS = 3000;
|
||||
const RESUME_AFTER_INTERACTION_MS = 8000;
|
||||
const publicMenuOpenChangeEvent = "ark:public-menu-open-change";
|
||||
|
||||
function bannerLangParam(lang: Lang): string {
|
||||
return langQuery(lang).toLowerCase();
|
||||
@@ -62,6 +63,7 @@ export function FigmaBanner() {
|
||||
const scrollerRef = useRef<HTMLDivElement>(null);
|
||||
const [activeIndex, setActiveIndex] = useState(0);
|
||||
const [autoplayPaused, setAutoplayPaused] = useState(false);
|
||||
const [publicMenuOpen, setPublicMenuOpen] = useState(false);
|
||||
const resumeTimerRef = useRef<number | null>(null);
|
||||
const dragStateRef = useRef<{
|
||||
pointerId: number;
|
||||
@@ -115,6 +117,23 @@ export function FigmaBanner() {
|
||||
[],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const handlePublicMenuOpenChange = (event: Event) => {
|
||||
setPublicMenuOpen(Boolean((event as CustomEvent<boolean>).detail));
|
||||
};
|
||||
|
||||
window.addEventListener(
|
||||
publicMenuOpenChangeEvent,
|
||||
handlePublicMenuOpenChange,
|
||||
);
|
||||
return () => {
|
||||
window.removeEventListener(
|
||||
publicMenuOpenChangeEvent,
|
||||
handlePublicMenuOpenChange,
|
||||
);
|
||||
};
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const scroller = scrollerRef.current;
|
||||
if (!scroller) return;
|
||||
@@ -132,7 +151,7 @@ export function FigmaBanner() {
|
||||
}, [slides.length]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!hasMultiple || autoplayPaused) return;
|
||||
if (!hasMultiple || autoplayPaused || publicMenuOpen) return;
|
||||
const timer = window.setInterval(() => {
|
||||
setActiveIndex((prev) => {
|
||||
const next = (prev + 1) % slides.length;
|
||||
@@ -141,7 +160,7 @@ export function FigmaBanner() {
|
||||
});
|
||||
}, AUTOPLAY_MS);
|
||||
return () => window.clearInterval(timer);
|
||||
}, [hasMultiple, autoplayPaused, slides.length, goTo]);
|
||||
}, [hasMultiple, autoplayPaused, publicMenuOpen, slides.length, goTo]);
|
||||
|
||||
const handlePointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {
|
||||
if (event.pointerType !== "mouse") return;
|
||||
|
||||
Reference in New Issue
Block a user