1
+ import interactionResponse from "await-interaction-response" ;
1
2
import {
2
- type ComponentPropsWithoutRef ,
3
3
type ReactNode ,
4
+ type ComponentProps ,
4
5
forwardRef ,
5
6
Children ,
6
- type ComponentProps ,
7
7
useEffect ,
8
8
useRef ,
9
9
useContext ,
10
10
useCallback ,
11
+ useState ,
11
12
} from "react" ;
12
13
import * as DialogPrimitive from "@radix-ui/react-dialog" ;
13
14
import {
14
15
ReactSdkContext ,
15
16
getClosestInstance ,
16
17
type Hook ,
17
18
} from "@webstudio-is/react-sdk/runtime" ;
18
- import { useControllableState } from "@radix-ui/react-use-controllable-state" ;
19
- import interactionResponse from "await-interaction-response" ;
20
19
21
20
/**
22
21
* Naive heuristic to determine if a click event will cause navigate
@@ -50,23 +49,19 @@ const willNavigate = (event: MouseEvent) => {
50
49
// wrap in forwardRef because Root is functional component without ref
51
50
export const Dialog = forwardRef <
52
51
HTMLDivElement ,
53
- Omit < ComponentPropsWithoutRef < typeof DialogPrimitive . Root > , "defaultOpen" >
52
+ Omit < ComponentProps < typeof DialogPrimitive . Root > , "defaultOpen" >
54
53
> ( ( props , _ref ) => {
55
54
const { renderer } = useContext ( ReactSdkContext ) ;
56
55
57
- const [ open , onOpenChange ] = useControllableState ( {
58
- prop : props . open ,
59
- defaultProp : false ,
60
- onChange : props . onOpenChange ,
61
- } ) ;
62
-
63
- const onOpenChangeHandler = useCallback (
64
- async ( open : boolean ) => {
65
- await interactionResponse ( ) ;
66
- onOpenChange ( open ) ;
67
- } ,
68
- [ onOpenChange ]
69
- ) ;
56
+ const currentOpen = props . open ?? false ;
57
+ const [ open , setOpen ] = useState ( currentOpen ) ;
58
+ // synchronize external value with local one when changed
59
+ useEffect ( ( ) => setOpen ( currentOpen ) , [ currentOpen ] ) ;
60
+
61
+ const onOpenChangeHandler = useCallback ( async ( open : boolean ) => {
62
+ await interactionResponse ( ) ;
63
+ setOpen ( open ) ;
64
+ } , [ ] ) ;
70
65
71
66
/**
72
67
* Close the dialog when a navigable link within it is clicked.
@@ -130,7 +125,7 @@ export const DialogTrigger = forwardRef<
130
125
131
126
export const DialogOverlay = forwardRef <
132
127
HTMLDivElement ,
133
- ComponentPropsWithoutRef < typeof DialogPrimitive . Overlay >
128
+ ComponentProps < typeof DialogPrimitive . Overlay >
134
129
> ( ( props , ref ) => {
135
130
return (
136
131
< DialogPrimitive . DialogPortal >
@@ -141,7 +136,7 @@ export const DialogOverlay = forwardRef<
141
136
142
137
export const DialogContent = forwardRef <
143
138
HTMLDivElement ,
144
- ComponentPropsWithoutRef < typeof DialogPrimitive . Content >
139
+ ComponentProps < typeof DialogPrimitive . Content >
145
140
> ( ( props , ref ) => {
146
141
const preventAutoFocusOnClose = useRef ( false ) ;
147
142
const { renderer } = useContext ( ReactSdkContext ) ;
0 commit comments