1
1
import { useFetcher } from "@remix-run/react" ;
2
- import {
3
- forwardRef ,
4
- useEffect ,
5
- useLayoutEffect ,
6
- useRef ,
7
- useState ,
8
- } from "react" ;
2
+ import { forwardRef , useRef , useState } from "react" ;
3
+ import { flushSync } from "react-dom" ;
9
4
10
5
export let SaveButton = forwardRef <
11
6
HTMLButtonElement ,
@@ -55,34 +50,20 @@ export function EditableText({
55
50
let [ edit , setEdit ] = useState ( false ) ;
56
51
let inputRef = useRef < HTMLInputElement > ( null ) ;
57
52
let buttonRef = useRef < HTMLButtonElement > ( null ) ;
58
- let lastAction = useRef < "click" | "escape" | "submit" | "none" > ( "none" ) ;
59
53
60
54
// optimistic update
61
55
if ( fetcher . formData ?. has ( fieldName ) ) {
62
56
value = String ( fetcher . formData . get ( "name" ) ) ;
63
57
}
64
58
65
- useLayoutEffect ( ( ) => {
66
- switch ( lastAction . current ) {
67
- case "submit" :
68
- case "escape" : {
69
- buttonRef . current ?. focus ( ) ;
70
- break ;
71
- }
72
- case "click" : {
73
- inputRef . current ?. select ( ) ;
74
- break ;
75
- }
76
- }
77
- lastAction . current = "none" ;
78
- } , [ edit ] ) ;
79
-
80
59
return edit ? (
81
60
< fetcher . Form
82
61
method = "post"
83
62
onSubmit = { ( ) => {
84
- lastAction . current = "submit" ;
85
- setEdit ( false ) ;
63
+ flushSync ( ( ) => {
64
+ setEdit ( false ) ;
65
+ } ) ;
66
+ buttonRef . current ?. focus ( ) ;
86
67
} }
87
68
>
88
69
{ children }
@@ -95,8 +76,10 @@ export function EditableText({
95
76
className = { inputClassName }
96
77
onKeyDown = { ( event ) => {
97
78
if ( event . key === "Escape" ) {
98
- lastAction . current = "escape" ;
99
- setEdit ( false ) ;
79
+ flushSync ( ( ) => {
80
+ setEdit ( false ) ;
81
+ } ) ;
82
+ buttonRef . current ?. focus ( ) ;
100
83
}
101
84
} }
102
85
onBlur = { ( event ) => {
@@ -113,8 +96,10 @@ export function EditableText({
113
96
type = "button"
114
97
ref = { buttonRef }
115
98
onClick = { ( ) => {
116
- lastAction . current = "click" ;
117
- setEdit ( true ) ;
99
+ flushSync ( ( ) => {
100
+ setEdit ( true ) ;
101
+ } ) ;
102
+ inputRef . current ?. select ( ) ;
118
103
} }
119
104
className = { buttonClassName }
120
105
>
0 commit comments