Skip to content

Commit db63d0b

Browse files
committed
fix: stale closures in setOpen
1 parent a1b9584 commit db63d0b

File tree

14 files changed

+47
-13
lines changed

14 files changed

+47
-13
lines changed

.changeset/five-oranges-rhyme.md

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
"@zag-js/floating-panel": patch
3+
"@zag-js/color-picker": patch
4+
"@zag-js/collapsible": patch
5+
"@zag-js/date-picker": patch
6+
"@zag-js/time-picker": patch
7+
"@zag-js/hover-card": patch
8+
"@zag-js/combobox": patch
9+
"@zag-js/popover": patch
10+
"@zag-js/tooltip": patch
11+
"@zag-js/dialog": patch
12+
"@zag-js/select": patch
13+
"@zag-js/menu": patch
14+
---
15+
16+
Prevent stale closure in `api.setOpen(...)` methods

packages/machines/collapsible/src/collapsible.connect.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ export function connect<T extends PropTypes>(
2727
send({ type: "size.measure" })
2828
},
2929
setOpen(nextOpen) {
30-
if (nextOpen === open) return
31-
send(nextOpen ? { type: "open" } : { type: "close" })
30+
const open = state.matches("open")
31+
if (open === nextOpen) return
32+
send({ type: nextOpen ? "open" : "close" })
3233
},
3334

3435
getRootProps() {

packages/machines/color-picker/src/color-picker.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ export function connect<T extends PropTypes>(
6666
valueAsString,
6767
value,
6868
setOpen(nextOpen) {
69-
if (nextOpen === open) return
69+
const open = state.hasTag("open")
70+
if (open === nextOpen) return
7071
send({ type: nextOpen ? "OPEN" : "CLOSE" })
7172
},
7273
setValue(value) {

packages/machines/combobox/src/combobox.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ export function connect<T extends PropTypes, V extends CollectionItem>(
9494
dom.getInputEl(scope)?.focus()
9595
},
9696
setOpen(nextOpen) {
97-
if (nextOpen === open) return
97+
const open = state.hasTag("open")
98+
if (open === nextOpen) return
9899
send({ type: nextOpen ? "OPEN" : "CLOSE" })
99100
},
100101

packages/machines/date-picker/src/date-picker.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@ export function connect<T extends PropTypes>(
234234
send({ type: "FOCUS.SET", value })
235235
},
236236
setOpen(nextOpen) {
237-
if (nextOpen === open) return
237+
const open = state.matches("open")
238+
if (open === nextOpen) return
238239
send({ type: nextOpen ? "OPEN" : "CLOSE" })
239240
},
240241
focusMonth,

packages/machines/dialog/src/dialog.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ export function connect<T extends PropTypes>(
1515
return {
1616
open,
1717
setOpen(nextOpen) {
18-
if (nextOpen === open) return
18+
const open = state.matches("open")
19+
if (open === nextOpen) return
1920
send({ type: nextOpen ? "OPEN" : "CLOSE" })
2021
},
2122

packages/machines/floating-panel/src/floating-panel.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ export function connect<T extends PropTypes>(
2424
return {
2525
open: open,
2626
setOpen(nextOpen) {
27-
if (nextOpen === open) return
27+
const open = state.hasTag("open")
28+
if (open === nextOpen) return
2829
send({ type: nextOpen ? "OPEN" : "CLOSE" })
2930
},
3031
dragging: dragging,

packages/machines/hover-card/src/hover-card.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ export function connect<T extends PropTypes>(service: HoverCardService, normaliz
1717
return {
1818
open: open,
1919
setOpen(nextOpen) {
20-
if (nextOpen === open) return
20+
const open = state.hasTag("open")
21+
if (open === nextOpen) return
2122
send({ type: nextOpen ? "OPEN" : "CLOSE" })
2223
},
2324
reposition(options = {}) {

packages/machines/menu/src/menu.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ export function connect<T extends PropTypes>(service: Service<MenuSchema>, norma
112112
highlightedValue,
113113
open,
114114
setOpen(nextOpen) {
115-
if (nextOpen === open) return
115+
const open = state.hasTag("open")
116+
if (open === nextOpen) return
116117
send({ type: nextOpen ? "OPEN" : "CLOSE" })
117118
},
118119
setHighlightedValue(value) {

packages/machines/popover/src/popover.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ export function connect<T extends PropTypes>(service: PopoverService, normalize:
2222
portalled,
2323
open: open,
2424
setOpen(nextOpen) {
25-
if (nextOpen === open) return
25+
const open = state.matches("open")
26+
if (open === nextOpen) return
2627
send({ type: nextOpen ? "OPEN" : "CLOSE" })
2728
},
2829
reposition(options = {}) {

packages/machines/select/src/select.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ export function connect<T extends PropTypes, V extends CollectionItem = Collecti
7979
dom.getTriggerEl(scope)?.focus({ preventScroll: true })
8080
},
8181
setOpen(nextOpen) {
82-
if (nextOpen === open) return
82+
const open = state.hasTag("open")
83+
if (open === nextOpen) return
8384
send({ type: nextOpen ? "OPEN" : "CLOSE" })
8485
},
8586
selectValue(value) {

packages/machines/time-picker/src/time-picker.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ export function connect<T extends PropTypes>(
5252
send({ type: "POSITIONING.SET", options })
5353
},
5454
setOpen(nextOpen) {
55-
if (nextOpen === open) return
55+
const open = state.hasTag("open")
56+
if (open === nextOpen) return
5657
send({ type: nextOpen ? "OPEN" : "CLOSE" })
5758
},
5859
setUnitValue(unit, value) {

packages/machines/tooltip/src/tooltip.connect.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ export function connect<P extends PropTypes>(
3131
return {
3232
open: open,
3333
setOpen(nextOpen) {
34-
if (nextOpen === open) return
34+
const open = state.matches("open", "closing")
35+
if (open === nextOpen) return
3536
send({ type: nextOpen ? "open" : "close" })
3637
},
3738
reposition(options = {}) {

website/lib/use-search.ts

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as combobox from "@zag-js/combobox"
22
import * as dialog from "@zag-js/dialog"
33
import { normalizeProps, useMachine } from "@zag-js/react"
44
import { matchSorter } from "match-sorter"
5+
import { useRouter } from "next/router"
56
import { useEffect, useId, useMemo, useState } from "react"
67
import {
78
searchData,
@@ -39,6 +40,8 @@ export function useSearch(): UseSearchReturn {
3940
[results],
4041
)
4142

43+
const router = useRouter()
44+
4245
const combobox_service = useMachine(combobox.machine, {
4346
id: useId(),
4447
placeholder: "Search the docs",
@@ -48,6 +51,9 @@ export function useSearch(): UseSearchReturn {
4851
openOnChange({ inputValue }) {
4952
return inputValue.length > 2
5053
},
54+
navigate({ value }) {
55+
if (value) router.push(value)
56+
},
5157
onValueChange() {
5258
dialog_api.setOpen(false)
5359
},

0 commit comments

Comments
 (0)