Skip to content
This repository was archived by the owner on Feb 25, 2020. It is now read-only.

Commit 44a2442

Browse files
committed
wip
1 parent 1e02578 commit 44a2442

7 files changed

Lines changed: 49 additions & 93 deletions

File tree

src/index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ export const Assets = Platform.select({
2121
/**
2222
* Views
2323
*/
24-
export { default as HeaderFloating } from './views/Header/HeaderFloating';
25-
export { default as HeaderScreen } from './views/Header/HeaderScreen';
24+
export { default as Header } from './views/Header/Header';
2625
export { default as HeaderTitle } from './views/Header/HeaderTitle';
2726
export { default as HeaderBackButton } from './views/Header/HeaderBackButton';
2827

src/types.tsx

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,6 @@ export type HeaderScene<T> = {
6262
focused: boolean;
6363
};
6464

65-
export type HeaderSceneProps<T extends 'float' | 'screen'> = T extends 'float'
66-
? {
67-
scenes: HeaderScene<Route>[];
68-
}
69-
: {
70-
scene: HeaderScene<Route>;
71-
previous?: HeaderScene<Route>;
72-
next?: HeaderScene<Route>;
73-
};
74-
7565
export type HeaderOptions = {
7666
headerTitle?: string;
7767
headerTitleStyle?: StyleProp<TextStyle>;
@@ -92,13 +82,13 @@ export type HeaderOptions = {
9282
headerForceInset?: React.ComponentProps<typeof SafeAreaView>['forceInset'];
9383
};
9484

95-
export type HeaderProps<
96-
T extends 'float' | 'screen' = 'float' | 'screen'
97-
> = HeaderSceneProps<T> & {
98-
mode: T;
85+
export type HeaderProps = {
86+
mode: 'float' | 'screen';
9987
layout: Layout;
88+
scenes: HeaderScene<Route>[];
10089
onGoBack?: (props: { route: Route }) => void;
10190
getTitle: (props: { route: Route }) => string | undefined;
91+
getBackTitle: (props: { route: Route }) => string | undefined;
10292
styleInterpolator: HeaderStyleInterpolator;
10393
style?: StyleProp<ViewStyle>;
10494
};
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import HeaderBar from './HeaderBar';
44
import HeaderSegment from './HeaderSegment';
55
import { HeaderProps } from '../../types';
66

7-
type Props = HeaderProps<'float'>;
7+
type Props = HeaderProps;
88

99
export default function HeaderFloating({
1010
scenes,
1111
layout,
1212
onGoBack,
1313
getTitle,
14+
getBackTitle,
1415
styleInterpolator,
1516
style,
1617
}: Props) {
@@ -26,6 +27,8 @@ export default function HeaderFloating({
2627
style={[style, headerStyle]}
2728
>
2829
{scenes.map((scene, i, self) => {
30+
const previous = self[i - 1];
31+
2932
const {
3033
// eslint-disable-next-line @typescript-eslint/no-unused-vars
3134
headerForceInset,
@@ -40,11 +43,12 @@ export default function HeaderFloating({
4043
layout={layout}
4144
scene={scene}
4245
onGoBack={
43-
self[i - 1] && onGoBack
46+
previous && onGoBack
4447
? () => onGoBack({ route: scene.route })
4548
: undefined
4649
}
4750
getTitle={getTitle}
51+
getBackTitle={getBackTitle}
4852
styleInterpolator={styleInterpolator}
4953
style={[StyleSheet.absoluteFill]}
5054
{...options}

src/views/Header/HeaderScreen.tsx

Lines changed: 0 additions & 45 deletions
This file was deleted.

src/views/Header/HeaderSegment.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ type Props = HeaderOptions & {
2929
layout: Layout;
3030
onGoBack?: () => void;
3131
getTitle: (props: { route: Route }) => string | undefined;
32+
getBackTitle: (props: { route: Route }) => string | undefined;
3233
scene: HeaderScene<Route>;
3334
previous?: HeaderScene<Route>;
34-
next?: HeaderScene<Route>;
3535
styleInterpolator: HeaderStyleInterpolator;
3636
style?: StyleProp<ViewStyle>;
3737
};
@@ -81,11 +81,10 @@ export default class HeaderSegment extends React.Component<Props, State> {
8181
render() {
8282
const {
8383
scene,
84-
previous,
85-
next,
8684
layout,
8785
onGoBack,
8886
getTitle,
87+
getBackTitle,
8988
headerLeft: left = (props: HeaderBackButtonProps) => (
9089
<HeaderBackButton {...props} />
9190
),
@@ -107,9 +106,7 @@ export default class HeaderSegment extends React.Component<Props, State> {
107106

108107
const { backTitleLayout, titleLayout } = this.state;
109108
const currentTitle = getTitle({ route: scene.route });
110-
const previousTitle = previous
111-
? getTitle({ route: previous.route })
112-
: undefined;
109+
const previousTitle = getBackTitle({ route: scene.route });
113110

114111
const {
115112
titleStyle,

src/views/Stack/Stack.tsx

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,18 @@ export default class Stack extends React.Component<Props, State> {
8686
this.setState({ layout: { width, height } });
8787
};
8888

89+
private getBackTitle = ({ route }: { route: Route }) => {
90+
const { routes, getTitle } = this.props;
91+
92+
const i = routes.findIndex(r => r.key === route.key);
93+
94+
if (routes[i - 1]) {
95+
return getTitle({ route: routes[i - 1] });
96+
}
97+
98+
return undefined;
99+
};
100+
89101
render() {
90102
const {
91103
routes,
@@ -143,6 +155,7 @@ export default class Stack extends React.Component<Props, State> {
143155
}),
144156
onGoBack,
145157
getTitle,
158+
getBackTitle: this.getBackTitle,
146159
styleInterpolator: headerStyleInterpolator,
147160
})
148161
: null}
@@ -152,14 +165,15 @@ export default class Stack extends React.Component<Props, State> {
152165
pointerEvents={layout.height && layout.width ? 'box-none' : 'none'}
153166
>
154167
{routes.map((route, index, self) => {
168+
const previousRoute = self[index - 1];
169+
const nextRoute = self[index - 1];
170+
155171
const focused = focusedRoute.key === route.key;
156172
const current = progress[route.key];
157-
const previous = self[index - 1]
158-
? progress[self[index - 1].key]
159-
: undefined;
160-
const next = self[index + 1]
161-
? progress[self[index + 1].key]
173+
const previous = previousRoute
174+
? progress[previousRoute.key]
162175
: undefined;
176+
const next = nextRoute ? progress[nextRoute.key] : undefined;
163177

164178
return (
165179
<Card
@@ -199,18 +213,21 @@ export default class Stack extends React.Component<Props, State> {
199213
? renderHeader({
200214
mode: 'screen',
201215
layout,
202-
scene: {
203-
route,
204-
progress: {
205-
current,
206-
next,
207-
previous,
216+
scenes: [
217+
{
218+
route,
219+
progress: {
220+
current,
221+
next,
222+
previous,
223+
},
224+
focused,
225+
descriptor: getDescriptor({ route }),
208226
},
209-
focused,
210-
descriptor: getDescriptor({ route }),
211-
},
227+
],
212228
onGoBack,
213229
getTitle,
230+
getBackTitle: this.getBackTitle,
214231
styleInterpolator: headerStyleInterpolator,
215232
})
216233
: null}

src/views/Stack/StackView.tsx

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ import {
1313
HeaderProps,
1414
} from '../../types';
1515
import { Platform } from 'react-native';
16-
import HeaderScreen from '../Header/HeaderScreen';
17-
import HeaderFlotaing from '../Header/HeaderFloating';
16+
import Header from '../Header/Header';
1817

1918
type Props = {
2019
navigation: NavigationProp;
@@ -140,21 +139,16 @@ class StackView extends React.Component<Props, State> {
140139
private renderHeader = (props: HeaderProps) => {
141140
const scene =
142141
props.mode === 'screen'
143-
? (props as HeaderProps<'screen'>).scene
144-
: (props as HeaderProps<'float'>).scenes.find(scene => scene.focused);
142+
? props.scenes[0]
143+
: props.scenes.find(scene => scene.focused);
145144

146145
const header = scene ? scene.descriptor.options.header : undefined;
147146

148147
if (header !== undefined) {
149148
return header == null ? null : header(props);
150149
}
151150

152-
switch (props.mode) {
153-
case 'screen':
154-
return <HeaderScreen {...props as HeaderProps<'screen'>} />;
155-
case 'float':
156-
return <HeaderFlotaing {...props as HeaderProps<'float'>} />;
157-
}
151+
return <Header {...props} />;
158152
};
159153

160154
private handleGoBack = ({ route }: { route: Route }) =>

0 commit comments

Comments
 (0)