import Constants from 'expo-constants'; import React from 'react'; import { SectionList, Image, StyleSheet, Text, View } from 'react-native'; export default class ExpoConfigView extends React.Component { render() { const { manifest = {} } = Constants; const sections = [ { data: [{ value: manifest.sdkVersion }], title: 'sdkVersion' }, { data: [{ value: manifest.privacy }], title: 'privacy' }, { data: [{ value: manifest.version }], title: 'version' }, { data: [{ value: manifest.orientation }], title: 'orientation' }, { data: [{ value: manifest.primaryColor, type: 'color' }], title: 'primaryColor', }, { data: [{ value: manifest.splash && manifest.splash.image }], title: 'splash.image', }, { data: [ { value: manifest.splash && manifest.splash.backgroundColor, type: 'color', }, ], title: 'splash.backgroundColor', }, { data: [ { value: manifest.splash && manifest.splash.resizeMode, }, ], title: 'splash.resizeMode', }, { data: [ { value: manifest.ios && manifest.ios.supportsTablet ? 'true' : 'false', }, ], title: 'ios.supportsTablet', }, ]; return ( <SectionList style={styles.container} renderItem={this._renderItem} renderSectionHeader={this._renderSectionHeader} stickySectionHeadersEnabled={true} keyExtractor={(item, index) => index} ListHeaderComponent={ListHeader} sections={sections} /> ); } _renderSectionHeader = ({ section }) => { return <SectionHeader title={section.title} />; }; _renderItem = ({ item }) => { if (item.type === 'color') { return <SectionContent>{item.value && <Color value={item.value} />}</SectionContent>; } else { return ( <SectionContent> <Text style={styles.sectionContentText}>{item.value}</Text> </SectionContent> ); } }; } const ListHeader = () => { const { manifest } = Constants; return ( <View style={styles.titleContainer}> <View style={styles.titleIconContainer}> <AppIconPreview iconUrl={manifest.iconUrl} /> </View> <View style={styles.titleTextContainer}> <Text style={styles.nameText} numberOfLines={1}> {manifest.name} </Text> <Text style={styles.slugText} numberOfLines={1}> {manifest.slug} </Text> <Text style={styles.descriptionText}>{manifest.description}</Text> </View> </View> ); }; const SectionHeader = ({ title }) => { return ( <View style={styles.sectionHeaderContainer}> <Text style={styles.sectionHeaderText}>{title}</Text> </View> ); }; const SectionContent = props => { return <View style={styles.sectionContentContainer}>{props.children}</View>; }; const AppIconPreview = ({ iconUrl }) => { if (!iconUrl) { iconUrl = 'https://s3.amazonaws.com/exp-brand-assets/ExponentEmptyManifest_192.png'; } return <Image source={{ uri: iconUrl }} style={{ width: 64, height: 64 }} resizeMode="cover" />; }; const Color = ({ value }) => { if (!value) { return <View />; } else { return ( <View style={styles.colorContainer}> <View style={[styles.colorPreview, { backgroundColor: value }]} /> <View style={styles.colorTextContainer}> <Text style={styles.sectionContentText}>{value}</Text> </View> </View> ); } }; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', }, titleContainer: { paddingHorizontal: 15, paddingTop: 15, paddingBottom: 15, flexDirection: 'row', }, titleIconContainer: { marginRight: 15, paddingTop: 2, }, sectionHeaderContainer: { backgroundColor: '#fbfbfb', paddingVertical: 8, paddingHorizontal: 15, borderWidth: StyleSheet.hairlineWidth, borderColor: '#ededed', }, sectionHeaderText: { fontSize: 14, }, sectionContentContainer: { paddingTop: 8, paddingBottom: 12, paddingHorizontal: 15, }, sectionContentText: { color: '#808080', fontSize: 14, }, nameText: { fontWeight: '600', fontSize: 18, }, slugText: { color: '#a39f9f', fontSize: 14, backgroundColor: 'transparent', }, descriptionText: { fontSize: 14, marginTop: 6, color: '#4d4d4d', }, colorContainer: { flexDirection: 'row', alignItems: 'center', }, colorPreview: { width: 17, height: 17, borderRadius: 2, marginRight: 6, borderWidth: StyleSheet.hairlineWidth, borderColor: '#ccc', }, colorTextContainer: { flex: 1, }, });