Skip to content

Commit a588b13

Browse files
refactor(select): attempt at refactoring up duplicate code
1 parent 0ec57f1 commit a588b13

File tree

8 files changed

+15
-26
lines changed

8 files changed

+15
-26
lines changed

apps/website/src/routes/docs/headless/select/examples/wrong-value.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default component$(() => {
1414
<>
1515
<Select value="Jessi" class="relative min-w-40">
1616
<SelectTrigger class="w-full border-2 border-dashed border-red-400">
17-
<SelectValue placeholder="Select an option" />
17+
<SelectValue placeholder="wrong value placeholder" />
1818
</SelectTrigger>
1919
<SelectListbox class="absolute w-full border-2 border-dashed border-green-400 bg-slate-900 p-2">
2020
{usersSig.value.map((user) => (

apps/website/src/routes/docs/headless/select/select.driver.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ export function createTestDriver<T extends DriverLocator>(locator: T) {
2323
// annoyingly, it seems we need to check if the listbox is hidden in playwright, or else the value does not update
2424
await expect(getListbox()).toBeHidden();
2525

26-
return await getTrigger()
27-
.locator('[data-value]', { includeHidden: true })
28-
.textContent();
26+
return await getTrigger().locator('[data-value]').textContent();
2927
};
3028

3129
const openListbox = async (key: OpenKeys | 'click') => {

apps/website/src/routes/docs/headless/select/select.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ test.describe('Keyboard Behavior', () => {
383383
await getTrigger().press('Enter');
384384

385385
const value = await getValue();
386+
console.log(value);
386387
expect(optStr).toEqual(value);
387388
});
388389

packages/kit-headless/src/components/select/select-context.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ export type SelectContext = {
1212
triggerRef: Signal<HTMLButtonElement | undefined>;
1313
popoverRef: Signal<HTMLElement | undefined>;
1414
listboxRef: Signal<HTMLUListElement | undefined>;
15-
optionRefsArray: Signal<Array<Signal<HTMLLIElement | undefined>>>;
16-
selectedOptionRef: Signal<HTMLLIElement | null>;
1715

1816
// core state
1917
options: Opt[] | undefined;

packages/kit-headless/src/components/select/select-inline.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ export const Select: FunctionComponent<SelectProps> = (props) => {
8383
}
8484
}
8585

86+
// const isMatch = opts[valuePropIndex].value === props.value;
87+
88+
// if (!isMatch && props.value) {
89+
// const obj = opts[valuePropIndex];
90+
// obj.value = '';
91+
// opts[valuePropIndex] = obj;
92+
// }
8693
return (
8794
<SelectImpl {...rest} _valuePropIndex={valuePropIndex} _options={opts}>
8895
{props.children}

packages/kit-headless/src/components/select/select-option.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ export const SelectOption = component$<SelectOptionProps>((props) => {
3535
throw Error('Qwik UI: Select component option cannot find its proper index.');
3636

3737
localIndexSig.value = index;
38-
39-
context.optionRefsArray.value[index] = optionRef;
4038
});
4139

4240
const handleClick$ = $(() => {

packages/kit-headless/src/components/select/select-value.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import { component$, useContext, type PropsOf } from '@builder.io/qwik';
33
import SelectContextId from './select-context';
44

55
type SelectValueProps = PropsOf<'span'> & {
6-
placeholder: string;
6+
placeholder?: string;
77
};
88

99
export const SelectValue = component$((props: SelectValueProps) => {
1010
const context = useContext(SelectContextId);
11-
const selectedOptStr = context.selectedOptionRef.value?.textContent;
11+
if (!context.options) return;
1212

13+
const selectedOptStr = context.options[context.selectedIndexSig.value!].value;
1314
return (
1415
<span data-value {...props}>
1516
{selectedOptStr ?? context.value ?? props.placeholder}

packages/kit-headless/src/components/select/select.tsx

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import {
44
type PropsOf,
55
useSignal,
66
useContextProvider,
7-
type Signal,
8-
useTask$,
97
} from '@builder.io/qwik';
108
import { type SelectContext } from './select-context';
119
import SelectContextId from './select-context';
@@ -18,7 +16,7 @@ export type SelectProps = PropsOf<'div'> & {
1816
_options?: Opt[];
1917

2018
// when a value is passed, we check if it's an actual option value, and get its index at pre-render time.
21-
_valuePropIndex?: number;
19+
_valuePropIndex?: number | null;
2220
};
2321

2422
/* root component in select-inline.tsx */
@@ -28,30 +26,18 @@ export const SelectImpl = component$<SelectProps>((props) => {
2826
const triggerRef = useSignal<HTMLButtonElement>();
2927
const popoverRef = useSignal<HTMLElement>();
3028
const listboxRef = useSignal<HTMLUListElement>();
31-
const optionRefsArray = useSignal<Signal<HTMLLIElement>[]>([]);
3229
const value = props.value;
3330
const options = props._options;
3431

3532
// core state
36-
const selectedIndexSig = useSignal<number | null>(null);
37-
const selectedOptionRef = useSignal<HTMLLIElement | null>(null);
33+
const selectedIndexSig = useSignal<number | null>(props._valuePropIndex ?? null);
3834
const isListboxOpenSig = useSignal<boolean>(false);
3935
const highlightedIndexSig = useSignal<number | null>(props._valuePropIndex ?? null);
4036

41-
useTask$(function deriveSelectedRef({ track }) {
42-
track(() => selectedIndexSig.value);
43-
44-
if (selectedIndexSig.value !== null) {
45-
selectedOptionRef.value = optionRefsArray.value[selectedIndexSig.value].value;
46-
}
47-
});
48-
4937
const context: SelectContext = {
5038
triggerRef,
5139
popoverRef,
5240
listboxRef,
53-
selectedOptionRef,
54-
optionRefsArray,
5541
options,
5642
highlightedIndexSig,
5743
isListboxOpenSig,

0 commit comments

Comments
 (0)