diff --git a/src/BottomTabs.res b/src/BottomTabs.res index e6ca1bc..4f15520 100644 --- a/src/BottomTabs.res +++ b/src/BottomTabs.res @@ -96,10 +96,19 @@ and headerParams = { layout: layout, } +type listeners = { + ...Core.eventListeners, + tabPress?: navigationEvent => unit, + tabLongPress?: navigationEvent => unit, + transitionStart?: navigationEvent => unit, + transitionEnd?: navigationEvent => unit, +} + type navigatorProps = { id?: string, initialRouteName?: string, screenOptions?: screenOptionsParams => options, + screenListeners?: screenOptionsParams => listeners, backBehavior?: backBehavior, detachInactiveScreens?: bool, tabBar?: unit => React.element, @@ -111,6 +120,7 @@ type screenProps<'params> = { name: string, navigationKey?: string, options?: screenOptionsParams => options, + listeners?: screenOptionsParams => listeners, initialParams?: 'params, getId?: getIdOptions => option, component?: React.component, @@ -167,6 +177,9 @@ module Navigation = { @string [ | #tabPress(navigationEvent => unit) + | #tabLongPress(navigationEvent => unit) + | #transitionStart(navigationEvent => unit) + | #transitionEnd(navigationEvent => unit) ], ) => unsubscribe = "addListener" } diff --git a/src/Core.res b/src/Core.res index ea3117c..1ebf697 100644 --- a/src/Core.res +++ b/src/Core.res @@ -54,6 +54,15 @@ type stateEventData = {state: navigationState} type action +type beforeRemoveEventData = {action: action} + +type eventListeners = { + focus?: navigationEvent => unit, + blur?: navigationEvent => unit, + state?: navigationEvent => unit, + beforeRemove?: navigationEvent => unit, +} + type layoutNavigatorParams = { state: navigationState, navigation: navigation, @@ -100,6 +109,7 @@ module Navigation = { | #focus(navigationEvent => unit) | #blur(navigationEvent => unit) | #state(navigationEvent => unit) + | #beforeRemove(navigationEvent => unit) ], ) => unsubscribe = "addListener" } diff --git a/src/Drawer.res b/src/Drawer.res index fdd40c5..0a32fc6 100644 --- a/src/Drawer.res +++ b/src/Drawer.res @@ -90,12 +90,18 @@ type contentComponentProps = { descriptors: descriptors, } +type listeners = { + ...Core.eventListeners, + drawerItemPress?: navigationEvent => unit, +} + type drawerStatus = [#"open" | #closed] type navigatorProps = { id?: string, initialRouteName?: string, screenOptions?: screenOptionsParams => options, + screenListeners?: screenOptionsParams => listeners, backBehavior?: backBehavior, defaultStatus?: drawerStatus, detachInactiveScreens?: bool, @@ -109,6 +115,7 @@ type screenProps<'params> = { name: string, navigationKey?: string, options?: screenOptionsParams => options, + listeners?: screenOptionsParams => listeners, initialParams?: 'params, getId?: getIdOptions => option, component?: React.component, diff --git a/src/MaterialBottomTabs.res b/src/MaterialBottomTabs.res index 485833f..c578c53 100644 --- a/src/MaterialBottomTabs.res +++ b/src/MaterialBottomTabs.res @@ -35,10 +35,17 @@ type options = { tabBarTestID?: string, } +type listeners = { + ...Core.eventListeners, + tabPress?: navigationEvent => unit, + tabLongPress?: navigationEvent => unit, +} + type navigatorProps = { id?: string, initialRouteName?: string, screenOptions?: screenOptionsParams => options, + screenListeners?: screenOptionsParams => listeners, backBehavior?: backBehavior, shifting?: bool, labeled?: bool, @@ -53,6 +60,7 @@ type screenProps<'params> = { name: string, navigationKey?: string, options?: screenOptionsParams => options, + listeners?: screenOptionsParams => listeners, initialParams?: 'params, getId?: getIdOptions => option, component?: React.component, @@ -112,6 +120,7 @@ module Navigation = { @string [ | #tabPress(navigationEvent => unit) + | #tabLongPress(navigationEvent => unit) ], ) => unsubscribe = "addListener" } diff --git a/src/MaterialTopTabs.res b/src/MaterialTopTabs.res index 4d27296..04b4afd 100644 --- a/src/MaterialTopTabs.res +++ b/src/MaterialTopTabs.res @@ -76,10 +76,17 @@ type tabBarProps = { jumpTo: string => unit, } +type listeners = { + ...Core.eventListeners, + tabPress?: navigationEvent => unit, + tabLongPress?: navigationEvent => unit, +} + type navigatorProps = { id?: string, initialRouteName?: string, screenOptions?: screenOptionsParams => options, + screenListeners?: screenOptionsParams => listeners, backBehavior?: backBehavior, tabBarPosition?: tabBarPosition, keyboardDismissMode?: keyboardDismissMode, @@ -95,6 +102,7 @@ type screenProps<'params> = { name: string, navigationKey?: string, options?: screenOptionsParams => options, + listeners?: screenOptionsParams => listeners, initialParams?: 'params, getId?: getIdOptions => option, component?: React.component, @@ -154,6 +162,7 @@ module Navigation = { @string [ | #tabPress(navigationEvent => unit) + | #tabLongPress(navigationEvent => unit) ], ) => unsubscribe = "addListener" } diff --git a/src/NativeStack.res b/src/NativeStack.res index 61a0734..31a0844 100644 --- a/src/NativeStack.res +++ b/src/NativeStack.res @@ -171,10 +171,20 @@ and headerParams = { back: backOptions, } +type screenEventData = {closing: bool} + +type listeners = { + ...Core.eventListeners, + transitionStart?: navigationEvent => unit, + transitionEnd?: navigationEvent => unit, + gestureCancel?: navigationEvent => unit, +} + type navigatorProps = { id?: string, initialRouteName?: string, screenOptions?: screenOptionsParams => options, + screenListeners?: screenOptionsParams => listeners, layout?: layoutNavigatorParams => React.element, children?: React.element, } @@ -183,6 +193,7 @@ type screenProps<'params> = { name: string, navigationKey?: string, options?: screenOptionsParams => options, + listeners?: screenOptionsParams => listeners, initialParams?: 'params, getId?: getIdOptions => option, component?: React.component, @@ -228,8 +239,6 @@ module Make = (): NavigatorModule => { } } -type screenEventData = {closing: int} - module Navigation = { @send external setOptions: (navigation, options) => unit = "setOptions" @@ -255,6 +264,7 @@ module Navigation = { [ | #transitionStart(navigationEvent => unit) | #transitionEnd(navigationEvent => unit) + | #gestureCancel(navigationEvent => unit) ], ) => unsubscribe = "addListener" } diff --git a/src/Stack.res b/src/Stack.res index cd37b06..333eb6d 100644 --- a/src/Stack.res +++ b/src/Stack.res @@ -154,10 +154,22 @@ and headerParams = { styleInterpolator: headerStyleInterpolator, } +type screenEventData = {closing: bool} + +type listeners = { + ...Core.eventListeners, + transitionStart?: navigationEvent => unit, + transitionEnd?: navigationEvent => unit, + gestureStart?: navigationEvent => unit, + gestureEnd?: navigationEvent => unit, + gestureCancel?: navigationEvent => unit, +} + type navigatorProps = { id?: string, initialRouteName?: string, screenOptions?: screenOptionsParams => options, + screenListeners?: screenOptionsParams => listeners, detachInactiveScreens?: bool, layout?: layoutNavigatorParams => React.element, children?: React.element, @@ -167,6 +179,7 @@ type screenProps<'params> = { name: string, navigationKey?: string, options?: screenOptionsParams => options, + listeners?: screenOptionsParams => listeners, initialParams?: 'params, getId?: getIdOptions => option, component?: React.component, @@ -212,8 +225,6 @@ module Make = (): NavigatorModule => { } } -type screenEventData = {closing: int} - module Navigation = { @send external setOptions: (navigation, options) => unit = "setOptions"