1
1
import React , {
2
2
unstable_ViewTransition as ViewTransition ,
3
3
unstable_Activity as Activity ,
4
+ unstable_useSwipeTransition as useSwipeTransition ,
5
+ useRef ,
6
+ useLayoutEffect ,
4
7
} from 'react' ;
5
8
6
9
import './Page.css' ;
@@ -35,7 +38,8 @@ function Component() {
35
38
}
36
39
37
40
export default function Page ( { url, navigate} ) {
38
- const show = url === '/?b' ;
41
+ const [ renderedUrl , startGesture ] = useSwipeTransition ( '/?a' , url , '/?b' ) ;
42
+ const show = renderedUrl === '/?b' ;
39
43
function onTransition ( viewTransition , types ) {
40
44
const keyframes = [
41
45
{ rotate : '0deg' , transformOrigin : '30px 8px' } ,
@@ -44,6 +48,32 @@ export default function Page({url, navigate}) {
44
48
viewTransition . old . animate ( keyframes , 250 ) ;
45
49
viewTransition . new . animate ( keyframes , 250 ) ;
46
50
}
51
+
52
+ const swipeRecognizer = useRef ( null ) ;
53
+ const activeGesture = useRef ( null ) ;
54
+ function onScroll ( ) {
55
+ if ( activeGesture . current !== null ) {
56
+ return ;
57
+ }
58
+ // eslint-disable-next-line no-undef
59
+ const scrollTimeline = new ScrollTimeline ( {
60
+ source : swipeRecognizer . current ,
61
+ axis : 'x' ,
62
+ } ) ;
63
+ activeGesture . current = startGesture ( scrollTimeline ) ;
64
+ }
65
+ function onScrollEnd ( ) {
66
+ if ( activeGesture . current !== null ) {
67
+ const cancelGesture = activeGesture . current ;
68
+ activeGesture . current = null ;
69
+ cancelGesture ( ) ;
70
+ }
71
+ }
72
+
73
+ useLayoutEffect ( ( ) => {
74
+ swipeRecognizer . current . scrollLeft = show ? 0 : 10000 ;
75
+ } , [ show ] ) ;
76
+
47
77
const exclamation = (
48
78
< ViewTransition name = "exclamation" onShare = { onTransition } >
49
79
< span > !</ span >
@@ -90,6 +120,13 @@ export default function Page({url, navigate}) {
90
120
< p > </ p >
91
121
< p > </ p >
92
122
< p > </ p >
123
+ < div
124
+ className = "swipe-recognizer"
125
+ onScroll = { onScroll }
126
+ onScrollEnd = { onScrollEnd }
127
+ ref = { swipeRecognizer } >
128
+ < div className = "swipe-overscroll" > Swipe me</ div >
129
+ </ div >
93
130
< p > </ p >
94
131
< p > </ p >
95
132
{ show ? null : (
0 commit comments