Skip to content

Commit e71beca

Browse files
committed
Create an Image example screen to show case the Image capabilities better
1 parent 1455443 commit e71beca

File tree

4 files changed

+120
-0
lines changed

4 files changed

+120
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import React from 'react';
2+
import {View, Text, Checkbox, RadioGroup, RadioButton, ColorPalette, Colors} from 'react-native-ui-lib';
3+
import _ from 'lodash';
4+
5+
export function renderBooleanOption(title, key) {
6+
const value = this.state[key];
7+
return (
8+
<View row centerV spread marginB-s4>
9+
<Text text70M style={{flex: 1}}>
10+
{title}
11+
</Text>
12+
<Checkbox useCustomTheme textID={key} value={value} onValueChange={value => this.setState({[key]: value})}/>
13+
</View>
14+
);
15+
}
16+
17+
export function renderRadioGroup(title, key, options) {
18+
const value = this.state[key];
19+
return (
20+
<View marginB-s2>
21+
<Text text70M marginB-s2>
22+
{title}
23+
</Text>
24+
<RadioGroup initialValue={value} onValueChange={value => this.setState({[key]: value})}>
25+
{_.map(options, (value, key) => {
26+
return <RadioButton useCustomTheme testID={key} key={key} marginB-s2 label={value} value={options[key]}/>;
27+
})}
28+
</RadioGroup>
29+
</View>
30+
);
31+
}
32+
33+
export function renderColorOption(title,
34+
key,
35+
colors = ['transparent', Colors.blue30, Colors.grey10, Colors.yellow30, Colors.green30, Colors.purple30]) {
36+
const value = this.state[key];
37+
return (
38+
<View marginV-s2>
39+
<Text text70M>{title}</Text>
40+
<ColorPalette
41+
value={value}
42+
colors={colors}
43+
onValueChange={value => this.setState({[key]: value === 'transparent' ? undefined : value})}
44+
/>
45+
</View>
46+
);
47+
}

demo/src/screens/MenuStructure.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export const navigationData = {
3333
{title: 'Floating Button', tags: 'floating button', screen: 'unicorn.components.FloatingButtonScreen'},
3434
{title: 'Feature Highlight', tags: 'feature overlay', screen: 'unicorn.components.FeatureHighlightScreen'},
3535
{title: 'Hint', tags: 'hints tooltip', screen: 'unicorn.components.HintsScreen'},
36+
{title: 'Image', tags: 'image cover overlay', screen: 'unicorn.components.ImageScreen'},
3637
{title: 'Overlays', tags: 'overlay image', screen: 'unicorn.components.OverlaysScreen'},
3738
{title: 'Page Control', tags: 'page', screen: 'unicorn.components.PageControlScreen'},
3839
{title: 'Pan Dismissible', tags: 'pan swipe drag dismiss', screen: 'unicorn.components.PanDismissibleScreen'},
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import React, {Component} from 'react';
2+
import {View, Text, Image, Colors} from 'react-native-ui-lib';
3+
import {renderBooleanOption, renderRadioGroup} from '../ExampleScreenPresenter';
4+
5+
import cameraIcon from '../../assets/icons/cameraSelected.png';
6+
7+
const IMAGE_URL =
8+
'https://images.pexels.com/photos/748837/pexels-photo-748837.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260';
9+
10+
const DEFAULT_SIZE = 100;
11+
class ImageScreen extends Component {
12+
state = {
13+
cover: true,
14+
showOverlayContent: false,
15+
overlayType: 'none'
16+
};
17+
18+
renderOverlayContent() {
19+
const {cover, overlayType, showOverlayContent} = this.state;
20+
if (showOverlayContent) {
21+
if (cover) {
22+
return (
23+
<View padding-20 flex bottom={overlayType === Image.overlayTypes.BOTTOM}>
24+
<View row centerV>
25+
<Image
26+
style={{margin: 5, marginRight: 10}}
27+
source={cameraIcon}
28+
tintColor={overlayType !== 'none' ? Colors.white : undefined}
29+
/>
30+
<Text text30 white={overlayType !== 'none'}>
31+
Overlay Content
32+
</Text>
33+
</View>
34+
</View>
35+
);
36+
} else {
37+
return <Image style={{margin: 5}} source={cameraIcon}/>;
38+
}
39+
}
40+
}
41+
render() {
42+
const {cover, overlayType} = this.state;
43+
44+
return (
45+
<View flex>
46+
<View centerH height={250}>
47+
<Image
48+
source={{uri: IMAGE_URL}}
49+
cover={cover}
50+
overlayType={overlayType !== 'none' ? overlayType : undefined}
51+
style={!cover && {width: DEFAULT_SIZE, height: DEFAULT_SIZE}}
52+
customOverlayContent={this.renderOverlayContent()}
53+
/>
54+
</View>
55+
<View height={2} bg-grey60/>
56+
<View useSafeArea flex>
57+
<View padding-20 bottom flex>
58+
<View flex>
59+
{renderBooleanOption.call(this, 'Show as Cover Image', 'cover')}
60+
{renderBooleanOption.call(this, 'Show Overlay Content', 'showOverlayContent')}
61+
{renderRadioGroup.call(this, 'Overlay Type', 'overlayType', {none: 'none', ...Image.overlayTypes})}
62+
</View>
63+
<Text text40>Image Screen</Text>
64+
</View>
65+
</View>
66+
</View>
67+
);
68+
}
69+
}
70+
71+
export default ImageScreen;

demo/src/screens/componentScreens/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Navigation.registerComponent('unicorn.components.DialogScreen', () => require('.
1414
Navigation.registerComponent('unicorn.components.DrawerScreen', () => require('./DrawerScreen').default);
1515
Navigation.registerComponent('unicorn.components.TagsInputScreen', () => require('./TagsInputScreen').default);
1616
Navigation.registerComponent('unicorn.components.HintsScreen', () => require('./HintsScreen').default);
17+
Navigation.registerComponent('unicorn.components.ImageScreen', () => require('./ImageScreen').default);
1718
Navigation.registerComponent('unicorn.components.MaskedInputScreen', () => require('./MaskedInputScreen').default);
1819
Navigation.registerComponent('unicorn.components.OverlaysScreen', () => require('./OverlaysScreen').default);
1920
Navigation.registerComponent('unicorn.components.PageControlScreen', () => require('./PageControlScreen').default);

0 commit comments

Comments
 (0)