Skip to content

Commit c766358

Browse files
fix(popoveer): refactored implementation detail initPopover$
1 parent b498fb0 commit c766358

File tree

3 files changed

+48
-24
lines changed

3 files changed

+48
-24
lines changed

apps/website/src/routes/docs/headless/popover/examples/anchor-ref.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { usePopover } from '@qwik-ui/headless';
44

55
export default component$(() => {
66
const buttonRef = useSignal<HTMLButtonElement>();
7-
const { initPopover$ } = usePopover(`anchor-ref-id`);
7+
const { showPopover, hidePopover } = usePopover(`anchor-ref-id`);
88
const myPopoverRef = useSignal<HTMLElement>();
99

1010
return (
@@ -15,11 +15,11 @@ export default component$(() => {
1515
ref={buttonRef}
1616
disableClickInitPopover
1717
onPointerEnter$={() => {
18-
initPopover$();
19-
myPopoverRef.value?.showPopover();
18+
showPopover();
19+
console.log('in pointer!');
2020
}}
2121
onPointerLeave$={() => {
22-
myPopoverRef.value?.hidePopover();
22+
hidePopover();
2323
}}
2424
popoverTargetAction="show"
2525
popovertarget="anchor-ref-id"

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,25 @@ import { Popover, usePopover } from '../popover';
44
import ComboboxContextId from './combobox-context-id';
55
import { FloatingProps } from '../popover/floating';
66
import { PopoverImplProps } from '../popover/popover-impl';
7+
import { isServer } from '@builder.io/qwik/build';
78

89
export const ComboboxPopover = component$(
910
(props: Partial<FloatingProps & PopoverImplProps>) => {
1011
const context = useContext(ComboboxContextId);
1112
const customPopoverId = useId();
1213
console.log('customPopoverId:', customPopoverId);
13-
const { initPopover$ } = usePopover(customPopoverId);
14+
const { showPopover, hidePopover } = usePopover(customPopoverId);
1415

1516
/* REMEMBER, whenever an option is selected or onMouseDown$ the listbox is closed, and the popover should sync to that */
1617
useTask$(async ({ track }) => {
1718
track(() => context.isListboxOpenSig.value);
1819

19-
console.log('LISTBOX OPEN?: ', context.isListboxOpenSig.value);
20+
if (isServer) return;
2021

2122
if (context.isListboxOpenSig.value) {
22-
await initPopover$();
23-
context.popoverRef.value?.showPopover();
23+
showPopover();
2424
} else {
25-
context.popoverRef.value?.hidePopover();
25+
hidePopover();
2626
}
2727
});
2828

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

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
import { QwikIntrinsicElements, useOnDocument, useTask$ } from '@builder.io/qwik';
2-
import { Slot, component$, useSignal, $ } from '@builder.io/qwik';
1+
import {
2+
QwikIntrinsicElements,
3+
useOnDocument,
4+
useTask$,
5+
Slot,
6+
component$,
7+
useSignal,
8+
$,
9+
} from '@builder.io/qwik';
310
import { isBrowser } from '@builder.io/qwik/build';
411

512
type PopoverTriggerProps = {
@@ -47,13 +54,11 @@ export function usePopover(popovertarget: string) {
4754

4855
// so it only runs once on click for supported browsers
4956
if (isSupportedSig.value) {
50-
const popover = popoverSig.value;
57+
if (!popoverSig.value) return;
5158

52-
if (!popover) return;
53-
54-
if (popover && popover.hasAttribute('popover')) {
59+
if (popoverSig.value && popoverSig.value.hasAttribute('popover')) {
5560
/* opens manual on any event */
56-
popover.showPopover();
61+
popoverSig.value.showPopover();
5762
}
5863
}
5964
});
@@ -64,20 +69,39 @@ export function usePopover(popovertarget: string) {
6469
$(() => {
6570
if (!didInteractSig.value) return;
6671

67-
const popover = popoverSig.value;
68-
69-
if (!popover) return;
72+
if (!popoverSig.value) return;
7073

7174
// calls code in here twice for some reason, we think it's because of the client re-render, but it still works
7275

7376
// so it only runs once on first click
74-
if (!popover.classList.contains(':popover-open')) {
75-
popover.showPopover();
77+
if (!popoverSig.value.classList.contains(':popover-open')) {
78+
popoverSig.value.showPopover();
7679
}
7780
}),
7881
);
7982

80-
return { initPopover$ };
83+
const showPopover = $(async () => {
84+
if (!didInteractSig.value) {
85+
await initPopover$();
86+
}
87+
popoverSig.value?.showPopover();
88+
});
89+
90+
const togglePopover = $(async () => {
91+
if (!didInteractSig.value) {
92+
await initPopover$();
93+
}
94+
popoverSig.value?.togglePopover();
95+
});
96+
97+
const hidePopover = $(async () => {
98+
if (!didInteractSig.value) {
99+
await initPopover$();
100+
}
101+
popoverSig.value?.hidePopover();
102+
});
103+
104+
return { showPopover, togglePopover, hidePopover, initPopover$ };
81105
}
82106

83107
export const PopoverTrigger = component$<PopoverTriggerProps>(
@@ -92,8 +116,8 @@ export const PopoverTrigger = component$<PopoverTriggerProps>(
92116
onClick$={[
93117
rest.onClick$,
94118
!disableClickInitPopover
95-
? $(() => {
96-
initPopover$();
119+
? $(async () => {
120+
await initPopover$();
97121
})
98122
: undefined,
99123
]}

0 commit comments

Comments
 (0)