11import { createContext , useCallback , useContext , useState } from 'react' ;
2+ import { Animated } from 'react-native' ;
23import { ActionSheetRef } from './../index' ;
34export type Route = {
45 /**
@@ -56,23 +57,39 @@ export const useRouter = ({
5657 initialRoute,
5758 routes,
5859 getRef,
60+ routeOpacity,
5961} : {
6062 initialRoute ?: string ;
6163 routes ?: Route [ ] ;
6264 getRef ?: ( ) => ActionSheetRef ;
6365 onNavigate ?: ( route : string ) => void ;
6466 onNavigateBack ?: ( route : string ) => void ;
67+ routeOpacity : Animated . Value ;
6568} ) : Router => {
6669 const [ stack , setStack ] = useState < Route [ ] > ( [ ] ) ;
6770 const currentRoute : Route | undefined = stack ?. [ stack . length - 1 ] ;
6871
72+ const animate = useCallback (
73+ ( snap = 0 , opacity = 0 , delay = 0 ) => {
74+ getRef ?.( ) . snapToRelativeOffset ( snap ) ;
75+ Animated . timing ( routeOpacity , {
76+ toValue : opacity ,
77+ duration : 150 ,
78+ useNativeDriver : true ,
79+ delay : delay ,
80+ } ) . start ( ) ;
81+ } ,
82+ [ getRef , routeOpacity ] ,
83+ ) ;
84+
6985 const navigate = useCallback (
7086 ( name : string , params ?: any , snap ?: number ) => {
71- getRef ?. ( ) . snapToRelativeOffset ( snap || 20 ) ;
87+ animate ( snap || 20 , 0 ) ;
7288 setTimeout ( ( ) => {
7389 setStack ( state => {
7490 const next = routes ?. find ( route => route . name === name ) ;
7591 if ( ! next ) {
92+ animate ( 0 , 1 ) ;
7693 return state ;
7794 }
7895 const currentIndex = state . findIndex (
@@ -84,14 +101,12 @@ export const useRouter = ({
84101 return [ ...nextStack , { ...next , params : params || next . params } ] ;
85102 }
86103 onNavigate ?.( next . name ) ;
87- setTimeout ( ( ) => {
88- getRef ?.( ) . snapToRelativeOffset ( 0 ) ;
89- } , 1 ) ;
104+ animate ( 0 , 1 , 150 ) ;
90105 return [ ...state , next ] ;
91106 } ) ;
92- } , 300 ) ;
107+ } , 100 ) ;
93108 } ,
94- [ getRef , onNavigate , routes ] ,
109+ [ animate , routes , onNavigate ] ,
95110 ) ;
96111
97112 const initialNavigation = ( ) => {
@@ -104,37 +119,47 @@ export const useRouter = ({
104119 } else {
105120 setStack ( [ routes [ 0 ] ] ) ;
106121 }
122+ Animated . timing ( routeOpacity , {
123+ toValue : 1 ,
124+ duration : 150 ,
125+ useNativeDriver : true ,
126+ } ) . start ( ) ;
107127 } ;
108128
109129 const goBack = ( name ?: string , snap ?: number ) => {
110130 getRef ?.( ) . snapToRelativeOffset ( snap || - 10 ) ;
131+ animate ( snap || - 10 , 0 ) ;
111132 setTimeout ( ( ) => {
112133 setStack ( state => {
113134 const next = routes ?. find ( route => route . name === name ) ;
114135 if ( state . length === 1 ) {
115136 close ( ) ;
137+ animate ( 0 , 1 ) ;
116138 return state ;
117139 }
118140
119141 if ( ! next ) {
120142 const nextStack = [ ...state ] ;
121143 nextStack . pop ( ) ;
122144 if ( currentRoute ) {
123- getRef ?.( ) ?. snapToRelativeOffset ( 0 ) ;
124145 onNavigateBack ?.( nextStack [ nextStack . length - 1 ] ?. name ) ;
146+ animate ( 0 , 1 , 150 ) ;
125147 }
126148 return nextStack ;
127149 }
128150 const currentIndex = stack . findIndex ( route => route . name === next . name ) ;
129151 if ( currentIndex > - 1 ) {
130152 const nextStack = [ ...state ] ;
131153 nextStack . splice ( currentIndex ) ;
154+ onNavigateBack ?.( nextStack [ nextStack . length - 1 ] ?. name ) ;
155+ animate ( 0 , 1 , 150 ) ;
132156 return [ ...nextStack , next ] ;
133157 }
158+ animate ( 0 , 1 , 150 ) ;
134159 onNavigateBack ?.( next . name ) ;
135160 return [ ...stack , next ] ;
136161 } ) ;
137- } , 150 ) ;
162+ } , 100 ) ;
138163 } ;
139164
140165 const close = ( ) => {
0 commit comments