diff --git a/packages/@headlessui-react/CHANGELOG.md b/packages/@headlessui-react/CHANGELOG.md index 55e8fc2..3d0cc86 100644 --- a/packages/@headlessui-react/CHANGELOG.md +++ b/packages/@headlessui-react/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump `@tanstack/react-virtual` to fix warnings in React 19 projects ([#3588](https://github.com/tailwindlabs/headlessui/pull/3588)) - Fix `aria-invalid` attributes to have a valid `'true'` value ([#3639](https://github.com/tailwindlabs/headlessui/pull/3639)) - Add missing `invalid` prop to `Combobox` component ([#3677](https://github.com/tailwindlabs/headlessui/pull/3677)) +- Fix `Unexpected undefined` crash in `Combobox` component with `virtual` mode ([#3678](https://github.com/tailwindlabs/headlessui/pull/3678)) ## [2.2.0] - 2024-10-25 diff --git a/packages/@headlessui-react/src/components/combobox/combobox.tsx b/packages/@headlessui-react/src/components/combobox/combobox.tsx index d0dce90..fd364bc 100644 --- a/packages/@headlessui-react/src/components/combobox/combobox.tsx +++ b/packages/@headlessui-react/src/components/combobox/combobox.tsx @@ -479,6 +479,7 @@ function VirtualProvider(props: { children: (data: { option: unknown; open: boolean }) => React.ReactElement }) { let data = useData('VirtualProvider') + let d = useDisposables() let { options } = data.virtual! let [paddingStart, paddingEnd] = useMemo(() => { @@ -528,6 +529,7 @@ function VirtualProvider(props: { }} ref={(el) => { if (!el) { + d.dispose() return } @@ -537,9 +539,13 @@ function VirtualProvider(props: { } // Scroll to the active index - if (data.activeOptionIndex !== null && options.length > data.activeOptionIndex) { - virtualizer.scrollToIndex(data.activeOptionIndex) - } + // + // Workaround for: https://github.com/TanStack/virtual/issues/879 + d.nextFrame(() => { + if (data.activeOptionIndex !== null && options.length > data.activeOptionIndex) { + virtualizer.scrollToIndex(data.activeOptionIndex) + } + }) }} > {items.map((item) => { diff --git a/playgrounds/react/pages/combobox/combobox-virtualized.tsx b/playgrounds/react/pages/combobox/combobox-virtualized.tsx index 9873ff5..e8307ac 100644 --- a/playgrounds/react/pages/combobox/combobox-virtualized.tsx +++ b/playgrounds/react/pages/combobox/combobox-virtualized.tsx @@ -108,7 +108,7 @@ function Example({ virtual = true, data, initial }: { virtual?: boolean; data; i {({ option }) => { return ( @@ -157,7 +157,7 @@ function Example({ virtual = true, data, initial }: { virtual?: boolean; data; i {timezones.map((timezone, idx) => { return (