Skip to content

Commit 3f91a95

Browse files
authored
Merge pull request #102 from nfcampos/system-item
Add iOS-only systemItem prop for buttons in Navigator.Config
2 parents 7bc0841 + e8b8b77 commit 3f91a95

File tree

5 files changed

+136
-13
lines changed

5 files changed

+136
-13
lines changed

docs/api/navigator-config.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ type Button = {
180180

181181
// ios-only
182182
style: 'plain' | 'default';
183-
183+
systemItem: 'done' | 'cancel' | 'edit' | 'save' | 'add' | 'flexibleSpace' | 'compose' | 'reply' | 'action' | 'organize' | 'bookmarks' | 'search' | 'refresh' | 'stop' | 'camera' | 'trash' | 'play' | 'pause' | 'rewind' | 'fastForward' | 'undo' | 'redo' | 'pageCurl';
184+
184185
// android-only
185186
};
186187

example/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ Navigator.registerScreen(
88
'SharedElementFromScreen',
99
() => require('./screens/SharedElementFromScreen')
1010
);
11+
Navigator.registerScreen('NavigationBar', () =>
12+
require('./screens/NavigationBar')
13+
);
1114
Navigator.registerScreen(
1215
'ScreenOne',
1316
() => require('./screens/NavigationExampleScreen'),

example/screens/NavigationBar.js

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import React, { Component, PropTypes } from 'react';
2+
import { Dimensions } from 'react-native';
3+
4+
import Navigator from 'native-navigation';
5+
6+
import LoremImage from '../components/LoremImage';
7+
import Screen from '../components/Screen';
8+
import Row from '../components/Row';
9+
10+
const propTypes = {};
11+
const defaultProps = {};
12+
const contextTypes = {
13+
nativeNavigationInstanceId: PropTypes.string,
14+
};
15+
16+
const { width } = Dimensions.get('window');
17+
18+
export default class NavigationExampleScreen extends Component {
19+
state = {};
20+
21+
render() {
22+
return (
23+
<Screen>
24+
<Navigator.Config {...this.state} />
25+
<LoremImage width={width} height={width / 1.6} />
26+
<Row
27+
title="Title"
28+
onPress={() => this.setState({
29+
title: 'A title',
30+
subtitle: undefined,
31+
rightButtons: undefined,
32+
})}
33+
/>
34+
<Row
35+
title="Title and subtitle"
36+
onPress={() => this.setState({
37+
title: 'A title',
38+
subtitle: 'A subtitle',
39+
rightButtons: undefined,
40+
})}
41+
/>
42+
<Row
43+
title="Right button with title"
44+
onPress={() => this.setState({
45+
title: 'A title',
46+
subtitle: undefined,
47+
rightButtons: [{ title: 'Hello' }],
48+
})}
49+
/>
50+
<Row
51+
title="Right button with system item"
52+
onPress={() => this.setState({
53+
title: 'A title',
54+
subtitle: undefined,
55+
rightButtons: [{ systemItem: 'add' }],
56+
})}
57+
/>
58+
<Row
59+
title="Several right buttons"
60+
onPress={() => this.setState({
61+
title: 'A title',
62+
subtitle: undefined,
63+
rightButtons: [{ systemItem: 'add' }, { systemItem: 'edit' }],
64+
})}
65+
/>
66+
</Screen>
67+
);
68+
}
69+
}
70+
71+
NavigationExampleScreen.defaultProps = defaultProps;
72+
NavigationExampleScreen.propTypes = propTypes;
73+
NavigationExampleScreen.contextTypes = contextTypes;

example/screens/NavigationExampleScreen.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,13 @@ export default class NavigationExampleScreen extends Component {
4949
onPress={() => Navigator.dismiss()}
5050
/>
5151
<Row
52-
title="Title"
52+
title="Shared elements"
5353
onPress={() => Navigator.push('SharedElementFromScreen')}
5454
/>
55+
<Row
56+
title="Navigation bar customisation"
57+
onPress={() => Navigator.push('NavigationBar')}
58+
/>
5559
</Screen>
5660
);
5761
}

lib/ios/native-navigation/ReactNavigationImplementation.swift

+53-11
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,23 @@ class BlockBarButtonItem: UIBarButtonItem {
5151
self.target = self
5252
}
5353

54+
convenience init(barButtonSystemItem: UIBarButtonSystemItem) {
55+
self.init(barButtonSystemItem: barButtonSystemItem, target: nil, action: #selector(barButtonItemPressed))
56+
self.target = self
57+
}
58+
5459
convenience init(
5560
title: String?,
5661
image: UIImage?,
62+
barButtonSystemItem: UIBarButtonSystemItem?,
5763
style: UIBarButtonItemStyle,
5864
enabled: Bool?,
5965
tintColor: UIColor?,
6066
titleTextAttributes: [String: Any]?
6167
) {
62-
if let title = title {
68+
if let barButtonSystemItem = barButtonSystemItem {
69+
self.init(barButtonSystemItem: barButtonSystemItem)
70+
} else if let title = title {
6371
self.init(title: title, style: style)
6472
} else {
6573
self.init(image: image, style: style)
@@ -192,6 +200,36 @@ func barButtonStyleFromString(_ string: String?) -> UIBarButtonItemStyle {
192200
}
193201
}
194202

203+
func barButtonSystemItemFromString(_ string: String?) -> UIBarButtonSystemItem? {
204+
switch string {
205+
case .some("done"): return .done
206+
case .some("cancel"): return .cancel
207+
case .some("edit"): return .edit
208+
case .some("save"): return .save
209+
case .some("add"): return .add
210+
case .some("flexibleSpace"): return .flexibleSpace
211+
// case .some("fixedSpace"): return .fixedSpace
212+
case .some("compose"): return .compose
213+
case .some("reply"): return .reply
214+
case .some("action"): return .action
215+
case .some("organize"): return .organize
216+
case .some("bookmarks"): return .bookmarks
217+
case .some("search"): return .search
218+
case .some("refresh"): return .refresh
219+
case .some("stop"): return .stop
220+
case .some("camera"): return .camera
221+
case .some("trash"): return .trash
222+
case .some("play"): return .play
223+
case .some("pause"): return .pause
224+
case .some("rewind"): return .rewind
225+
case .some("fastForward"): return .fastForward
226+
case .some("undo"): return .undo
227+
case .some("redo"): return .redo
228+
case .some("pageCurl"): return .pageCurl
229+
default: return nil
230+
}
231+
}
232+
195233
func statusBarStyleFromString(_ string: String?) -> UIStatusBarStyle {
196234
switch(string) {
197235
case .some("light"): return .lightContent
@@ -233,7 +271,7 @@ func lower(_ key: String) -> String {
233271
return key.substring(to: i).lowercased() + key.substring(from: i)
234272
}
235273

236-
func configurebarButtonItemFromPrefix(
274+
func configureBarButtonItemFromPrefix(
237275
_ prefix: String,
238276
_ props: [String: AnyObject],
239277
_ passedItem: UIBarButtonItem?
@@ -246,6 +284,8 @@ func configurebarButtonItemFromPrefix(
246284

247285
let title = stringForKey(lower("\(prefix)Title"), props)
248286
let image = imageForKey(lower("\(prefix)Image"), props)
287+
let systemItem = stringForKey(lower("\(prefix)SystemItem"), props)
288+
let barButtonSystemItem = barButtonSystemItemFromString(systemItem)
249289
let enabled = boolForKey(lower("\(prefix)Enabled"), props)
250290
let tintColor = colorForKey(lower("\(prefix)TintColor"), props)
251291
let style = stringForKey(lower("\(prefix)Style"), props)
@@ -262,30 +302,32 @@ func configurebarButtonItemFromPrefix(
262302
let barButton = BlockBarButtonItem(
263303
title: title ?? prev.title,
264304
image: image ?? prev.image,
305+
barButtonSystemItem: barButtonSystemItem,
265306
style: barButtonStyleFromString(style),
266307
enabled: enabled,
267308
tintColor: tintColor,
268309
titleTextAttributes: titleTextAttributes
269310
)
270-
311+
271312
barButton.accessibilityLabel = accessibilityLabel
272313
barButton.accessibilityIdentifier = testID
273-
314+
274315
return barButton
275316
} else {
276317
return nil
277318
}
278319
} else {
279-
if (title != nil || image != nil) {
320+
if (title != nil || image != nil || barButtonSystemItem != nil) {
280321
let barButton = BlockBarButtonItem(
281322
title: title,
282323
image: image,
324+
barButtonSystemItem: barButtonSystemItem,
283325
style: barButtonStyleFromString(style),
284326
enabled: enabled,
285327
tintColor: tintColor,
286328
titleTextAttributes: titleTextAttributes
287329
)
288-
330+
289331
barButton.accessibilityLabel = accessibilityLabel
290332
barButton.accessibilityIdentifier = testID
291333

@@ -301,7 +343,7 @@ func configureBarButtonArrayForKey(_ key: String, _ props: [String: AnyObject])
301343
var result = [BlockBarButtonItem]()
302344
for item in buttons {
303345
if let buttonProps = item as? [String: AnyObject] {
304-
if let button = configurebarButtonItemFromPrefix("", buttonProps, nil) {
346+
if let button = configureBarButtonItemFromPrefix("", buttonProps, nil) {
305347
result.append(button)
306348
}
307349
}
@@ -387,7 +429,7 @@ open class DefaultReactNavigationImplementation: ReactNavigationImplementation {
387429
tabBar.isTranslucent = false
388430
}
389431
}
390-
432+
391433
if numberHasChanged("tintColor", prev, next) {
392434
if let tintColor = colorForKey("tintColor", next) {
393435
tabBar.tintColor = tintColor
@@ -406,7 +448,7 @@ open class DefaultReactNavigationImplementation: ReactNavigationImplementation {
406448

407449
}
408450
}
409-
451+
410452
if mapHasChanged("backgroundImage", prev, next) {
411453
tabBar.backgroundImage = imageForKey("backgroundImage", next)
412454
}
@@ -487,7 +529,7 @@ open class DefaultReactNavigationImplementation: ReactNavigationImplementation {
487529
}
488530
}
489531
navItem.setRightBarButtonItems(rightBarButtonItems, animated: true)
490-
} else if let rightBarButtonItem = configurebarButtonItemFromPrefix("right", next, navItem.rightBarButtonItem) {
532+
} else if let rightBarButtonItem = configureBarButtonItemFromPrefix("right", next, navItem.rightBarButtonItem) {
491533
rightBarButtonItem.actionHandler = { [weak viewController] in
492534
viewController?.emitEvent("onRightPress", body: nil)
493535
}
@@ -502,7 +544,7 @@ open class DefaultReactNavigationImplementation: ReactNavigationImplementation {
502544
}
503545
}
504546
navItem.setLeftBarButtonItems(leftBarButtonItems, animated: true)
505-
} else if let leftBarButtonItem = configurebarButtonItemFromPrefix("left", next, navItem.leftBarButtonItem) {
547+
} else if let leftBarButtonItem = configureBarButtonItemFromPrefix("left", next, navItem.leftBarButtonItem) {
506548
leftBarButtonItem.actionHandler = { [weak viewController] in
507549
// TODO(lmr): we want to dismiss here...
508550
viewController?.emitEvent("onLeftPress", body: nil)

0 commit comments

Comments
 (0)