import type { Dispatch, ReactElement, SetStateAction } from 'react' import type { StyleProp, ViewStyle } from 'react-native' import type { SharedValue } from 'react-native-reanimated' export type TransitionType = 'slide' | 'fade' | 'none' export type ScreenRenderer = () => ReactElement | null export type NavigationMethodType< ParamList extends Record = Record, > = (input: { name: ScreenName params: ParamList[ScreenName] }) => void // MARK: Context export type EmbeddedStackNavigationApi< ParamList extends Record = Record, > = { navigate: NavigationMethodType push: NavigationMethodType pop: () => void replace: NavigationMethodType reset: NavigationMethodType // Special method to force push a screen before the current one + pop the current one afterwards pushBefore: NavigationMethodType } export type EmbeddedStackRoute< ParamList extends Record = Record, ScreenName extends keyof ParamList = keyof ParamList, > = { key: string name: ScreenName params: ParamList[ScreenName] isFocused: boolean canGoBack: boolean } // MARK: EmbeddedStackNavigator export type EmbeddedStackNavigatorProps< Screens extends Record, ParamList extends Record, InitialRouteName extends keyof Screens = keyof Screens, > = { initialRouteName: InitialRouteName initialParams: ParamList[InitialRouteName] screens: Screens transitionType?: TransitionType animateDynamicHeight?: boolean fill?: boolean styles?: { root?: StyleProp } } // MARK: EmbeddedScreenContainer export type EmbeddedScreenContainerProps = { // Props from EmbeddedStackNavigator screens: Record transitionType: TransitionType animateDynamicHeight: boolean fill: boolean // Routing stack: EmbeddedStackRoute[] // Navigator sizing navigatorWidth: number // Slide slideTranslateX: SharedValue // Fade removingFadeScreenName: string | null onFadeComplete: () => void // Dynamic height dynamicRouteHeights: Record setDynamicRouteHeights: Dispatch>> currentDynamicRouteHeight: SharedValue } // MARK: EmbeddedStackScreen export type EmbeddedStackScreenProps = { // Props from EmbeddedStackNavigator screens: Record transitionType: TransitionType fill: boolean // Routing route: EmbeddedStackRoute idx: number stackLength: number // Navigator sizing navigatorWidth: number // Fade removingFadeScreenName: string | null onFadeComplete: () => void // Dynamic height onHeightChange: (route: EmbeddedStackRoute, height: number) => void }