From 92497978a3e5c1837eb0b27cee2d527cd792b4a6 Mon Sep 17 00:00:00 2001 From: Michal Osadnik Date: Tue, 16 Jul 2019 00:27:45 +0100 Subject: [PATCH 1/4] feat: add createNavigator and not export Screen directly --- example/index.tsx | 13 +++---------- src/createNavigator.tsx | 14 ++++++++++++++ src/index.tsx | 2 +- 3 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 src/createNavigator.tsx diff --git a/example/index.tsx b/example/index.tsx index 58a89f26..1d38c85a 100644 --- a/example/index.tsx +++ b/example/index.tsx @@ -2,11 +2,10 @@ import * as React from 'react'; import { render } from 'react-dom'; import { NavigationContainer, - Screen, CompositeNavigationProp, - TypedNavigator, NavigationHelpers, PartialState, + createNavigator, } from '../src'; import StackNavigator, { StackNavigationProp } from './StackNavigator'; import TabNavigator, { TabNavigationProp } from './TabNavigator'; @@ -22,15 +21,9 @@ type TabParamList = { fifth: undefined; }; -const Stack: TypedNavigator = { - Navigator: StackNavigator, - Screen, -}; +const Stack = createNavigator(StackNavigator); -const Tab: TypedNavigator = { - Navigator: TabNavigator, - Screen, -}; +const Tab = createNavigator(TabNavigator); const First = ({ navigation, diff --git a/src/createNavigator.tsx b/src/createNavigator.tsx new file mode 100644 index 00000000..936414a4 --- /dev/null +++ b/src/createNavigator.tsx @@ -0,0 +1,14 @@ +import * as React from 'react'; +import { ParamListBase, ScreenProps, TypedNavigator } from './types'; +import Screen from './Screen'; + +export default function createNavigator( + Navigator: React.ComponentType +): TypedNavigator { + return { + Navigator, + Screen: Screen as React.ComponentType< + ScreenProps + >, + }; +} diff --git a/src/index.tsx b/src/index.tsx index 2722a356..706e6615 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,5 +1,5 @@ export { default as NavigationContainer } from './NavigationContainer'; -export { default as Screen } from './Screen'; +export { default as createNavigator } from './createNavigator'; export { default as useNavigationBuilder } from './useNavigationBuilder'; From 8ed646b2f03013ac8d7b51c926dc40eedb6d43c4 Mon Sep 17 00:00:00 2001 From: Michal Osadnik Date: Tue, 16 Jul 2019 22:24:10 +0100 Subject: [PATCH 2/4] fix: more createNavigator inside navigator --- example/StackNavigator.tsx | 6 +++--- example/TabNavigator.tsx | 5 +++-- example/index.tsx | 9 ++------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/example/StackNavigator.tsx b/example/StackNavigator.tsx index 2610f66d..8d1fb107 100644 --- a/example/StackNavigator.tsx +++ b/example/StackNavigator.tsx @@ -7,7 +7,7 @@ import { NavigationProp, CommonAction, ParamListBase, - Router, + Router, createNavigator, } from '../src/index'; type Props = { @@ -224,7 +224,7 @@ const StackRouter: Router = { }, }; -export default function StackNavigator(props: Props) { +export default createNavigator((props: Props) => { const { navigation, descriptors } = useNavigationBuilder(StackRouter, props); return ( @@ -267,4 +267,4 @@ export default function StackNavigator(props: Props) { ); -} +}) diff --git a/example/TabNavigator.tsx b/example/TabNavigator.tsx index 5e8b069e..a46f1d81 100644 --- a/example/TabNavigator.tsx +++ b/example/TabNavigator.tsx @@ -8,6 +8,7 @@ import { CommonAction, ParamListBase, Router, + createNavigator } from '../src/index'; type Props = { @@ -143,7 +144,7 @@ const TabRouter: Router = { }, }; -export default function TabNavigator(props: Props) { +export default createNavigator((props: Props) => { const { navigation, descriptors } = useNavigationBuilder(TabRouter, props); return ( @@ -163,4 +164,4 @@ export default function TabNavigator(props: Props) { ))} ); -} +}) diff --git a/example/index.tsx b/example/index.tsx index 1d38c85a..942bdb63 100644 --- a/example/index.tsx +++ b/example/index.tsx @@ -5,10 +5,9 @@ import { CompositeNavigationProp, NavigationHelpers, PartialState, - createNavigator, } from '../src'; -import StackNavigator, { StackNavigationProp } from './StackNavigator'; -import TabNavigator, { TabNavigationProp } from './TabNavigator'; +import Stack, { StackNavigationProp } from './StackNavigator'; +import Tab, { TabNavigationProp } from './TabNavigator'; type StackParamList = { first: { author: string }; @@ -21,10 +20,6 @@ type TabParamList = { fifth: undefined; }; -const Stack = createNavigator(StackNavigator); - -const Tab = createNavigator(TabNavigator); - const First = ({ navigation, }: { From 168b31d62a78034e518f3a75e3200e52ecf20bb7 Mon Sep 17 00:00:00 2001 From: Michal Osadnik Date: Tue, 16 Jul 2019 23:17:42 +0100 Subject: [PATCH 3/4] fix: address codereview --- example/StackNavigator.tsx | 9 ++++++--- example/TabNavigator.tsx | 9 +++++---- src/createNavigator.tsx | 7 ++++--- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/example/StackNavigator.tsx b/example/StackNavigator.tsx index 8d1fb107..42f4914c 100644 --- a/example/StackNavigator.tsx +++ b/example/StackNavigator.tsx @@ -7,7 +7,8 @@ import { NavigationProp, CommonAction, ParamListBase, - Router, createNavigator, + Router, + createNavigator, } from '../src/index'; type Props = { @@ -224,7 +225,7 @@ const StackRouter: Router = { }, }; -export default createNavigator((props: Props) => { +export function StackNavigator(props: Props) { const { navigation, descriptors } = useNavigationBuilder(StackRouter, props); return ( @@ -267,4 +268,6 @@ export default createNavigator((props: Props) => { ); -}) +} + +export default createNavigator(StackNavigator); diff --git a/example/TabNavigator.tsx b/example/TabNavigator.tsx index a46f1d81..047db296 100644 --- a/example/TabNavigator.tsx +++ b/example/TabNavigator.tsx @@ -8,7 +8,7 @@ import { CommonAction, ParamListBase, Router, - createNavigator + createNavigator, } from '../src/index'; type Props = { @@ -144,9 +144,8 @@ const TabRouter: Router = { }, }; -export default createNavigator((props: Props) => { +export function TabNavigator(props: Props) { const { navigation, descriptors } = useNavigationBuilder(TabRouter, props); - return (
{navigation.state.routes.map((route, i, self) => ( @@ -164,4 +163,6 @@ export default createNavigator((props: Props) => { ))}
); -}) +} + +export default createNavigator(TabNavigator); diff --git a/src/createNavigator.tsx b/src/createNavigator.tsx index 936414a4..ef545314 100644 --- a/src/createNavigator.tsx +++ b/src/createNavigator.tsx @@ -2,9 +2,10 @@ import * as React from 'react'; import { ParamListBase, ScreenProps, TypedNavigator } from './types'; import Screen from './Screen'; -export default function createNavigator( - Navigator: React.ComponentType -): TypedNavigator { +export default function createNavigator< + ParamList extends ParamListBase, + N extends React.ComponentType +>(Navigator: N): TypedNavigator { return { Navigator, Screen: Screen as React.ComponentType< From 785a2cbc4ed9fd37a1a82de71dc6fe9d78161110 Mon Sep 17 00:00:00 2001 From: Michal Osadnik Date: Wed, 17 Jul 2019 00:04:38 +0100 Subject: [PATCH 4/4] feat: make createNavigator return function --- example/StackNavigator.tsx | 1 - example/TabNavigator.tsx | 2 +- example/index.tsx | 24 ++++++++++++++---------- src/createNavigator.tsx | 22 +++++++++++++--------- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/example/StackNavigator.tsx b/example/StackNavigator.tsx index 42f4914c..10b365a2 100644 --- a/example/StackNavigator.tsx +++ b/example/StackNavigator.tsx @@ -168,7 +168,6 @@ const StackRouter: Router = { ], }; } - return null; case 'REPLACE': { diff --git a/example/TabNavigator.tsx b/example/TabNavigator.tsx index 047db296..6cde9e7d 100644 --- a/example/TabNavigator.tsx +++ b/example/TabNavigator.tsx @@ -165,4 +165,4 @@ export function TabNavigator(props: Props) { ); } -export default createNavigator(TabNavigator); +export default createNavigator(TabNavigator); \ No newline at end of file diff --git a/example/index.tsx b/example/index.tsx index 942bdb63..68218589 100644 --- a/example/index.tsx +++ b/example/index.tsx @@ -20,6 +20,10 @@ type TabParamList = { fifth: undefined; }; +const MyStack = Stack(); + +const MyTab = Tab(); + const First = ({ navigation, }: { @@ -138,27 +142,27 @@ function App() { localStorage.setItem(PERSISTENCE_KEY, JSON.stringify(state)) } > - - + - - + {() => ( - - - - + + + + )} - - + + ); } diff --git a/src/createNavigator.tsx b/src/createNavigator.tsx index ef545314..3c274581 100644 --- a/src/createNavigator.tsx +++ b/src/createNavigator.tsx @@ -2,14 +2,18 @@ import * as React from 'react'; import { ParamListBase, ScreenProps, TypedNavigator } from './types'; import Screen from './Screen'; -export default function createNavigator< - ParamList extends ParamListBase, - N extends React.ComponentType ->(Navigator: N): TypedNavigator { - return { - Navigator, - Screen: Screen as React.ComponentType< - ScreenProps - >, +export default function createNavigator>( + RawNavigator: N +) { + return function Navigator(): TypedNavigator< + ParamList, + typeof RawNavigator + > { + return { + Navigator: RawNavigator, + Screen: Screen as React.ComponentType< + ScreenProps + >, + }; }; }