Skip to content

Commit f4940a0

Browse files
Merge pull request #717 from thejackshelton/fix-popover
Improve popover test suite
2 parents 67b94a4 + b3319a1 commit f4940a0

File tree

9 files changed

+191
-107
lines changed

9 files changed

+191
-107
lines changed

.changeset/six-cheetahs-bow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@qwik-ui/headless': patch
3+
---
4+
5+
fix: popover opening immediately in CSR

.changeset/thirty-carrots-sip.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@qwik-ui/headless': patch
3+
---
4+
5+
fix: regression with popover polyfill executing unnecessary code

apps/website/src/routes/docs/headless/popover/examples/basic.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { Popover, PopoverTrigger } from '@qwik-ui/headless';
33
export default component$(() => {
44
return (
55
<>
6-
<PopoverTrigger popovertarget="hero-id" class="popover-trigger">
6+
<PopoverTrigger popovertarget="basic-id" class="popover-trigger">
77
Popover Trigger
88
</PopoverTrigger>
9-
<Popover id="hero-id" class="popover">
9+
<Popover id="basic-id" class="popover">
1010
My Hero!
1111
</Popover>
1212
</>

apps/website/src/routes/docs/headless/popover/examples/hero.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ export default component$(() => {
66

77
return (
88
<>
9-
<PopoverTrigger ref={triggerRef} popovertarget="popover-id" class="popover-trigger">
9+
<PopoverTrigger ref={triggerRef} popovertarget="hero-id" class="popover-trigger">
1010
Click me
1111
</PopoverTrigger>
1212
<Popover
1313
anchorRef={triggerRef}
1414
floating={true}
1515
gutter={4}
16-
id="popover-id"
16+
id="hero-id"
1717
class="popover"
1818
>
1919
I am anchored to the popover trigger!
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { component$ } from '@builder.io/qwik';
2+
import { Popover, PopoverTrigger, usePopover } from '@qwik-ui/headless';
3+
export default component$(() => {
4+
const { hidePopover } = usePopover(`hide-id`);
5+
6+
return (
7+
<>
8+
<button onClick$={() => hidePopover()}>hide popover</button>
9+
<PopoverTrigger popovertarget="hide-id" class="popover-trigger">
10+
Click me
11+
</PopoverTrigger>
12+
<Popover id="hide-id" class="popover">
13+
My Hero!
14+
</Popover>
15+
</>
16+
);
17+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { component$ } from '@builder.io/qwik';
2+
import { Popover, usePopover } from '@qwik-ui/headless';
3+
export default component$(() => {
4+
const { showPopover } = usePopover(`show-id`);
5+
6+
return (
7+
<>
8+
<button onClick$={() => showPopover()}>show popover</button>
9+
<Popover id="show-id" class="popover">
10+
My Hero!
11+
</Popover>
12+
</>
13+
);
14+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { component$ } from '@builder.io/qwik';
2+
import { Popover, usePopover } from '@qwik-ui/headless';
3+
export default component$(() => {
4+
const { togglePopover } = usePopover(`toggle-id`);
5+
6+
return (
7+
<>
8+
<button onClick$={() => togglePopover()}>toggle popover</button>
9+
<Popover id="toggle-id" class="popover">
10+
My Hero!
11+
</Popover>
12+
</>
13+
);
14+
});

packages/kit-headless/src/components/popover/popover-trigger.tsx

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export function usePopover(popovertarget: string) {
2121
const didInteractSig = useSignal<boolean>(false);
2222
const popoverSig = useSignal<HTMLElement | null>(null);
2323
const initialClickSig = useSignal<boolean>(false);
24+
const isCSRSig = useSignal<boolean>(false);
2425

2526
const loadPolyfill$ = $(async () => {
2627
await import('@oddbird/popover-polyfill');
@@ -43,17 +44,29 @@ export function usePopover(popovertarget: string) {
4344
didInteractSig.value = true;
4445
});
4546

46-
useTask$(async ({ track }) => {
47+
useTask$(() => {
48+
if (isBrowser) {
49+
isCSRSig.value = true;
50+
}
51+
});
52+
53+
useTask$(({ track }) => {
4754
track(() => didInteractSig.value);
4855

4956
if (!isBrowser) return;
5057

5158
// get popover
5259
if (!popoverSig.value) {
5360
popoverSig.value = document.getElementById(popovertarget);
61+
}
5462

55-
if (!initialClickSig.value) {
56-
popoverSig.value?.showPopover();
63+
// so it only runs once on click for supported browsers
64+
if (isSupportedSig.value) {
65+
if (!popoverSig.value) return;
66+
67+
if (!initialClickSig.value && !isCSRSig.value) {
68+
/* opens manual on any event */
69+
popoverSig.value.showPopover();
5770
}
5871
}
5972
});
@@ -69,10 +82,7 @@ export function usePopover(popovertarget: string) {
6982
// calls code in here twice for some reason, we think it's because of the client re-render, but it still works
7083

7184
// so it only runs once on first click
72-
if (
73-
!popoverSig.value.classList.contains(':popover-open') &&
74-
!isSupportedSig.value
75-
) {
85+
if (!popoverSig.value.classList.contains(':popover-open')) {
7686
popoverSig.value.showPopover();
7787
}
7888
}),

0 commit comments

Comments
 (0)