Skip to content

Commit

Permalink
Merge pull request #717 from thejackshelton/fix-popover
Browse files Browse the repository at this point in the history
Improve popover test suite
  • Loading branch information
thejackshelton authored Apr 23, 2024
2 parents 67b94a4 + b3319a1 commit f4940a0
Show file tree
Hide file tree
Showing 9 changed files with 191 additions and 107 deletions.
5 changes: 5 additions & 0 deletions .changeset/six-cheetahs-bow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik-ui/headless': patch
---

fix: popover opening immediately in CSR
5 changes: 5 additions & 0 deletions .changeset/thirty-carrots-sip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik-ui/headless': patch
---

fix: regression with popover polyfill executing unnecessary code
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { Popover, PopoverTrigger } from '@qwik-ui/headless';
export default component$(() => {
return (
<>
<PopoverTrigger popovertarget="hero-id" class="popover-trigger">
<PopoverTrigger popovertarget="basic-id" class="popover-trigger">
Popover Trigger
</PopoverTrigger>
<Popover id="hero-id" class="popover">
<Popover id="basic-id" class="popover">
My Hero!
</Popover>
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ export default component$(() => {

return (
<>
<PopoverTrigger ref={triggerRef} popovertarget="popover-id" class="popover-trigger">
<PopoverTrigger ref={triggerRef} popovertarget="hero-id" class="popover-trigger">
Click me
</PopoverTrigger>
<Popover
anchorRef={triggerRef}
floating={true}
gutter={4}
id="popover-id"
id="hero-id"
class="popover"
>
I am anchored to the popover trigger!
Expand Down
17 changes: 17 additions & 0 deletions apps/website/src/routes/docs/headless/popover/examples/hide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { component$ } from '@builder.io/qwik';
import { Popover, PopoverTrigger, usePopover } from '@qwik-ui/headless';
export default component$(() => {
const { hidePopover } = usePopover(`hide-id`);

return (
<>
<button onClick$={() => hidePopover()}>hide popover</button>
<PopoverTrigger popovertarget="hide-id" class="popover-trigger">
Click me
</PopoverTrigger>
<Popover id="hide-id" class="popover">
My Hero!
</Popover>
</>
);
});
14 changes: 14 additions & 0 deletions apps/website/src/routes/docs/headless/popover/examples/show.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { component$ } from '@builder.io/qwik';
import { Popover, usePopover } from '@qwik-ui/headless';
export default component$(() => {
const { showPopover } = usePopover(`show-id`);

return (
<>
<button onClick$={() => showPopover()}>show popover</button>
<Popover id="show-id" class="popover">
My Hero!
</Popover>
</>
);
});
14 changes: 14 additions & 0 deletions apps/website/src/routes/docs/headless/popover/examples/toggle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { component$ } from '@builder.io/qwik';
import { Popover, usePopover } from '@qwik-ui/headless';
export default component$(() => {
const { togglePopover } = usePopover(`toggle-id`);

return (
<>
<button onClick$={() => togglePopover()}>toggle popover</button>
<Popover id="toggle-id" class="popover">
My Hero!
</Popover>
</>
);
});
24 changes: 17 additions & 7 deletions packages/kit-headless/src/components/popover/popover-trigger.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export function usePopover(popovertarget: string) {
const didInteractSig = useSignal<boolean>(false);
const popoverSig = useSignal<HTMLElement | null>(null);
const initialClickSig = useSignal<boolean>(false);
const isCSRSig = useSignal<boolean>(false);

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

useTask$(async ({ track }) => {
useTask$(() => {
if (isBrowser) {
isCSRSig.value = true;
}
});

useTask$(({ track }) => {
track(() => didInteractSig.value);

if (!isBrowser) return;

// get popover
if (!popoverSig.value) {
popoverSig.value = document.getElementById(popovertarget);
}

if (!initialClickSig.value) {
popoverSig.value?.showPopover();
// so it only runs once on click for supported browsers
if (isSupportedSig.value) {
if (!popoverSig.value) return;

if (!initialClickSig.value && !isCSRSig.value) {
/* opens manual on any event */
popoverSig.value.showPopover();
}
}
});
Expand All @@ -69,10 +82,7 @@ export function usePopover(popovertarget: string) {
// calls code in here twice for some reason, we think it's because of the client re-render, but it still works

// so it only runs once on first click
if (
!popoverSig.value.classList.contains(':popover-open') &&
!isSupportedSig.value
) {
if (!popoverSig.value.classList.contains(':popover-open')) {
popoverSig.value.showPopover();
}
}),
Expand Down
Loading

0 comments on commit f4940a0

Please sign in to comment.