@@ -16,6 +16,7 @@ let act;
16
16
let use ;
17
17
let useDebugValue ;
18
18
let useState ;
19
+ let useTransition ;
19
20
let useMemo ;
20
21
let useEffect ;
21
22
let Suspense ;
@@ -38,6 +39,7 @@ describe('ReactUse', () => {
38
39
use = React . use ;
39
40
useDebugValue = React . useDebugValue ;
40
41
useState = React . useState ;
42
+ useTransition = React . useTransition ;
41
43
useMemo = React . useMemo ;
42
44
useEffect = React . useEffect ;
43
45
Suspense = React . Suspense ;
@@ -1915,4 +1917,62 @@ describe('ReactUse', () => {
1915
1917
assertLog ( [ 'Hi' , 'World' ] ) ;
1916
1918
expect ( root ) . toMatchRenderedOutput ( < div > Hi World</ div > ) ;
1917
1919
} ) ;
1920
+
1921
+ it ( 'does not get stuck in pending statewith usable values in state' , async ( ) => {
1922
+ const initial = new Promise ( resolve => {
1923
+ setTimeout ( ( ) => {
1924
+ resolve ( 'initial' ) ;
1925
+ } , 1000 ) ;
1926
+ } ) ;
1927
+ let click ;
1928
+ function Reader ( { promise, setPromise} ) {
1929
+ const value = use ( promise ) ;
1930
+ const [ isPending , startLocalTransition ] = useTransition ( ) ;
1931
+ click = ( ) => {
1932
+ startLocalTransition ( ( ) => {
1933
+ setPromise (
1934
+ new Promise ( resolve => {
1935
+ setTimeout ( ( ) => {
1936
+ resolve ( 'updated' ) ;
1937
+ } , 1000 ) ;
1938
+ } ) ,
1939
+ ) ;
1940
+ } ) ;
1941
+ } ;
1942
+
1943
+ Scheduler . log ( `Value: ${ value } , Pending: ${ String ( isPending ) } ` ) ;
1944
+
1945
+ return (
1946
+ < >
1947
+ Value: { value } , Pending: { String ( isPending ) }
1948
+ </ >
1949
+ ) ;
1950
+ }
1951
+ function App ( ) {
1952
+ const [ promise , setPromise ] = useState ( initial ) ;
1953
+
1954
+ return (
1955
+ < Suspense fallback = "Loading" >
1956
+ < Reader promise = { promise } setPromise = { setPromise } />
1957
+ </ Suspense >
1958
+ ) ;
1959
+ }
1960
+
1961
+ const root = ReactNoop . createRoot ( ) ;
1962
+ await act ( ( ) => {
1963
+ root . render ( < App /> ) ;
1964
+ } ) ;
1965
+ assertLog ( [ 'Value: initial, Pending: false' ] ) ;
1966
+ expect ( root ) . toMatchRenderedOutput ( 'Value: initial, Pending: false' ) ;
1967
+
1968
+ await act ( ( ) => {
1969
+ click ( ) ;
1970
+ } ) ;
1971
+
1972
+ assertLog ( [
1973
+ 'Value: initial, Pending: true' ,
1974
+ 'Value: updated, Pending: true' ,
1975
+ ] ) ;
1976
+ expect ( root ) . toMatchRenderedOutput ( 'Value: updated, Pending: true' ) ;
1977
+ } ) ;
1918
1978
} ) ;
0 commit comments