Stylistic fixes, etc

This commit is contained in:
Ryan McGrath 2018-04-16 14:57:28 -04:00
parent c02ad19f2b
commit 2554789f5f
No known key found for this signature in database
GPG key ID: 811674B62B666830
10 changed files with 283 additions and 108 deletions

View file

@ -9,6 +9,7 @@
import moment from 'moment'; import moment from 'moment';
import React from 'react'; import React from 'react';
import {FlatList, View, ActivityIndicator} from 'react-native'; import {FlatList, View, ActivityIndicator} from 'react-native';
import SegmentedControlTab from 'react-native-segmented-control-tab';
import {inject, observer} from 'mobx-react/native'; import {inject, observer} from 'mobx-react/native';
import {SearchBar} from 'react-native-elements'; import {SearchBar} from 'react-native-elements';
@ -20,6 +21,14 @@ import TournamentRow from './components/TournamentRow';
const keyExtractor = (item, index) => item.id; const keyExtractor = (item, index) => item.id;
export default class AttendeesListViewController extends MemeleeViewController { export default class AttendeesListViewController extends MemeleeViewController {
state = {
selectedIndex: 0
};
swapIndex = (index) => this.setState({
selectedIndex: index
});
renderItem = ({item}) => (<View />) renderItem = ({item}) => (<View />)
render() { render() {
@ -28,7 +37,20 @@ export default class AttendeesListViewController extends MemeleeViewController {
keyExtractor: keyExtractor, keyExtractor: keyExtractor,
renderItem: this.renderItem renderItem: this.renderItem
}; };
const segmentedProps = {
values: ['Players', 'Teams'],
borderRadius: 0,
activeTabStyle: styles.tournamentInfoActiveTableStyle,
tabStyle: styles.tournamentInfoTabsStyle,
tabTextStyle: styles.tournamentInfoTabTextStyle,
selectedIndex: this.state.selectedIndex,
onTabPress: this.swapIndex
};
return <FlatList {...props} renderItem={this.renderItem} /> return (<View>
<SegmentedControlTab {...segmentedProps} />
<FlatList {...props} />
</View>);
} }
} }

View file

@ -11,13 +11,21 @@ import React from 'react';
import {ScrollView, Text, View} from 'react-native'; import {ScrollView, Text, View} from 'react-native';
import {inject, observer} from 'mobx-react/native'; import {inject, observer} from 'mobx-react/native';
import styles from '../styles';
import MemeleeViewController from './MemeleeViewController'; import MemeleeViewController from './MemeleeViewController';
const Match = ({set, ...rest}) => ( const Match = ({set, ...rest}) => (
<View style={{backgroundColor: '#3b3b48', borderColor: '#0e0e12', borderWidth: 0.5, borderRadius: 4, marginBottom: 20}}> <View style={styles.matchWrapper}>
<Text style={{padding: 5, color: '#dbdbde'}}>{set.entrant1.name ? set.entrant1.name : ''} <Text>{set.entrant1Score}</Text></Text> <View style={styles.matchEntrant}>
<View style={{borderTopWidth: 0.5, borderTopColor: '#2a2a33'}} /> <Text style={styles.matchEntrantText}>{set.entrant1.name ? set.entrant1.name : ''}</Text>
<Text style={{padding: 5, color: '#dbdbde'}}>{set.entrant2.name ? set.entrant2.name : ''} <Text>{set.entrant2Score}</Text></Text> <Text style={[{padding: 5, color: '#fff', borderTopRightRadius: 4}, set.entrant1.id === set.winnerId ? {backgroundColor: '#1bc382'} : {}]}>{set.entrant1Score}</Text>
</View>
<View style={styles.matchSeparator} />
<View style={styles.matchEntrant}>
<Text style={styles.matchEntrantText}>{set.entrant2.name ? set.entrant2.name : ''}</Text>
<Text style={[{padding: 5, color: '#fff', borderBottomRightRadius: 4}, set.entrant2.id === set.winnerId ? {backgroundColor: '#1bc382'} : {}]}>{set.entrant2Score}</Text>
</View>
</View> </View>
); );
@ -33,8 +41,11 @@ export default class BracketViewController extends MemeleeViewController {
<View key={key} style={{backgroundColor: '#21212d', flexDirection: 'row', paddingTop: 20, paddingBottom: 20, paddingLeft: 20}}> <View key={key} style={{backgroundColor: '#21212d', flexDirection: 'row', paddingTop: 20, paddingBottom: 20, paddingLeft: 20}}>
{this.props.Events.bracketData[key].map(bracket => ( {this.props.Events.bracketData[key].map(bracket => (
<View key={bracket.key} style={{backgroundColor: '#21212d', marginRight: 20, width: 200, flexDirection: 'column'}}> <View key={bracket.key} style={{backgroundColor: '#21212d', marginRight: 20, width: 200, flexDirection: 'column'}}>
<Text>{bracket.title}</Text> <Text style={styles.bracketTitle}>{bracket.title}</Text>
{bracket.sets.map(set => <Match key={set.id} set={set} />)} {bracket.sets.map(set => {
if(set.isGF) console.log(JSON.stringify(set, null, 4));
return <Match key={set.id} set={set} />;
})}
</View> </View>
))} ))}
</View> </View>

View file

@ -6,29 +6,54 @@
* @copyright Ryan McGrath 2018. * @copyright Ryan McGrath 2018.
*/ */
import moment from 'moment';
import React from 'react'; import React from 'react';
import {FlatList, View, ActivityIndicator} from 'react-native'; import {ScrollView, View, Text, StyleSheet} from 'react-native';
import {inject, observer} from 'mobx-react/native'; import Markdown from 'react-native-markdown-renderer';
import {SearchBar} from 'react-native-elements'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import SettingsList, {Header, Item} from 'react-native-settings-list';
import styles from '../styles'; import styles from '../styles';
import Constants from '../utils/Constants'; import {openURL} from '../utils';
import MemeleeViewController from './MemeleeViewController'; import MemeleeViewController from './MemeleeViewController';
import TournamentRow from './components/TournamentRow';
const keyExtractor = (item, index) => item.id; export default class ContactViewController extends MemeleeViewController {
email = () => { openURL('mailto:' + this.props.data.email); }
export default class AttendeesListViewController extends MemeleeViewController { phone = () => { openURL('tel:' + this.props.data.phone); }
renderItem = ({item}) => (<View />) twitter = () => { openURL('https://twitter.com/' + this.props.data.twitter); }
render() { render() {
const props = { const s = StyleSheet.flatten(styles.tournamentDetailsEventWrapper);
data: this.props.data, const ss = {
keyExtractor: keyExtractor, itemWidth: 50,
renderItem: this.renderItem backgroundColor: s.backgroundColor,
style: styles.tournamentDetailsEventWrapper,
titleStyle: styles.tournamentDetailsEventItem
}; };
return <FlatList {...props} renderItem={this.renderItem} /> return (<ScrollView>
<SettingsList>
{this.props.data.email ? <Item {...ss} title={this.props.data.email} onPress={this.email} icon={
<View style={{height:30, marginLeft:10, alignSelf:'center'}}>
<Icon name="email" size={26} color={styles.tournamentPromoIconColors.eventsCount} />
</View>
} /> : null}
{this.props.data.phone ? <Item {...ss} title={this.props.data.phone} onPress={this.phone} icon={
<View style={{height:30, marginLeft:10, alignSelf:'center'}}>
<Icon name="phone" size={26} color={styles.tournamentPromoIconColors.eventsCount} />
</View>
} /> : null}
{this.props.data.twitter ? <Item {...ss} title={this.props.data.twitter} onPress={this.twitter} icon={
<View style={{height:30, marginLeft:10, alignSelf:'center'}}>
<Icon name="twitter" size={26} color={styles.tournamentPromoIconColors.eventsCount} />
</View>
} /> : null}
</SettingsList>
{this.props.data.info ? <View style={styles.tournamentDetailsTextWrapper}>
<Markdown style={styles.tournamentDetailsText}>
{this.props.data.info}
</Markdown>
</View> : null}
</ScrollView>);
} }
} }

View file

@ -6,29 +6,38 @@
* @copyright Ryan McGrath 2018. * @copyright Ryan McGrath 2018.
*/ */
import moment from 'moment';
import React from 'react'; import React from 'react';
import {FlatList, View, ActivityIndicator} from 'react-native'; import {ScrollView, StyleSheet, Image, Text, View, TouchableOpacity, Dimensions} from 'react-native';
import {inject, observer} from 'mobx-react/native'; import Markdown, {PluginContainer} from 'react-native-markdown-renderer';
import {SearchBar} from 'react-native-elements'; import SettingsList, {Header, Item} from 'react-native-settings-list';
import openMap from 'react-native-open-maps';
import styles from '../styles'; import styles from '../styles';
import Constants from '../utils/Constants';
import MemeleeViewController from './MemeleeViewController'; import MemeleeViewController from './MemeleeViewController';
import TournamentRow from './components/TournamentRow';
const keyExtractor = (item, index) => item.id;
export default class AttendeesListViewController extends MemeleeViewController {
renderItem = ({item}) => (<View />)
export default class LocationViewController extends MemeleeViewController {
render() { render() {
const props = { const addy = '\n' + this.props.data.venue.name + '\n' + this.props.data.venue.address + ' ' + this.props.data.venue.city +
data: this.props.data, ' ' + this.props.data.venue.state + ' ' + this.props.data.venue.postalCode + '\n' + this.props.data.venue.country + '\n';
keyExtractor: keyExtractor,
renderItem: this.renderItem const s = StyleSheet.flatten(styles.tournamentDetailsEventWrapper);
const ss = {
itemWidth: 50,
backgroundColor: s.backgroundColor,
style: styles.tournamentDetailsEventWrapper,
titleStyle: styles.tournamentDetailsEventItem
}; };
return <FlatList {...props} renderItem={this.renderItem} /> return (<ScrollView>
<SettingsList style={styles.tournamentEventsWrapper} borderWidth={s.borderBottomWidth} borderColor={s.borderBottomColor}>
<Item {...ss} title={addy} onPress={() => openMap({latitude: this.props.data.map.lat, longitude: this.props.data.map.lng})} />
</SettingsList>
{this.props.data.gettingThere ? <View style={styles.tournamentDetailsTextWrapper}>
<Markdown style={styles.tournamentDetailsText}>
{this.props.data.gettingThere}
</Markdown>
</View> : null}
</ScrollView>);
} }
} }

View file

@ -9,6 +9,7 @@
import moment from 'moment'; import moment from 'moment';
import React from 'react'; import React from 'react';
import {ScrollView, StyleSheet, Image, Text, View, TouchableOpacity, Dimensions} from 'react-native'; import {ScrollView, StyleSheet, Image, Text, View, TouchableOpacity, Dimensions} from 'react-native';
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import Markdown, {PluginContainer} from 'react-native-markdown-renderer'; import Markdown, {PluginContainer} from 'react-native-markdown-renderer';
import SegmentedControlTab from 'react-native-segmented-control-tab'; import SegmentedControlTab from 'react-native-segmented-control-tab';
import SettingsList, {Header, Item} from 'react-native-settings-list'; import SettingsList, {Header, Item} from 'react-native-settings-list';
@ -21,16 +22,116 @@ import EventsStore from '../stores/TournamentEventStore';
import MemeleeViewController from './MemeleeViewController'; import MemeleeViewController from './MemeleeViewController';
const w = Dimensions.get('screen').width; const w = Dimensions.get('screen').width;
/* <View style={styles.tournamentInfoButtonsRow}>
<TouchableOpacity style={styles.tournamentRegistrationButton} onPress={this.registerForTournament}>
<Text style={styles.tournamentRegistrationButtonText}>Register</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.tournamentBookmarkButton} onPress={this.registerForTournament}>
<Text style={styles.tournamentRegistrationButtonText}>Bookmark</Text>
</TouchableOpacity>
</View>
*/
const determineTabs = (tournament) => {
const slugs = parseSlugs(tournament, null);
const tabs = [
// Actually can't do this without using what's pretty clearly a private API. :(
// {slug: 'attendees', name: 'Attendees', screen: Constants.Screens.Attendees, adminOnly: false, data: []}
{slug: 'attendees', icon: 'link', name: 'Attendees', url: 'https://smash.gg/tournament/' + slugs.tournament + '/attendees/players', adminOnly: false}
];
if(
tournament.gettingThere || tournament.lat || tournament.lng || tournament.mapsPlaceId || tournament.venueName ||
tournament.venueAddress || tournament.city || tournament.addrState || tournament.countryCode || tournament.postalCode
) tabs.push({
slug: 'location',
name: 'Location',
icon: 'map-marker',
screen: Constants.Screens.Location,
adminOnly: false,
data: {
gettingThere: tournament.gettingThere,
map: {
lat: tournament.lat,
lng: tournament.lng,
mapsPlaceId: tournament.mapsPlaceId,
},
venue: {
name: tournament.venueName,
address: tournament.venueAddress,
city: tournament.city,
state: tournament.addrState,
country: tournament.countryCode,
postalCode: tournament.postalCode
}
}
});
tabs.push({
slug: 'contact',
name: 'Contact',
icon: 'email',
screen: Constants.Screens.Contact,
adminOnly: false,
data: {
email: tournament.contactEmail,
info: tournament.contactInfo,
phone: tournament.contactPhone,
twitter: tournament.contactTwitter
}
});
if(tournament.rules && tournament.rules !== '') {
if(tournament.rules.startsWith('http://') || tournament.rules.startsWith('https://')) {
tabs.push({slug: 'rules', icon: 'link', name: 'Rules', url: tournament.rules, adminOnly: false});
} else {
tabs.push({slug: 'rules', name: 'Rules', icon: 'file-document-box', info: tournament.rules, adminOnly: false});
}
}
if(tournament.prizes && tournament.prizes !== '') {
if(tournament.prizes.startsWith('http://') || tournament.prizes.startsWith('https://')) {
tabs.push({slug: 'prizes', name: 'Prizes', icon: 'trophy', url: tournament.prizes, adminOnly: false});
} else {
tabs.push({slug: 'prizes', name: 'Prizes', icon: 'trophy', info: tournament.prizes, adminOnly: false});
}
}
if(tournament.publishing && tournament.publishing.fantasy)
tabs.push({
slug: 'fantasy',
name: 'Fantasy',
icon: 'chart-timeline',
url: 'https://smash.gg/tournament/' + slugs.tournament + '/fantasy/',
adminOnly: false
});
const generatedTabs = tournament.generatedTabs;
if(generatedTabs) {
const objs = Object.keys(generatedTabs).map(key => generatedTabs[key]);
objs.forEach(tab => {
Object.keys(tab).map(key => ({
slug: key,
name: tab[key].name,
adminOnly: tab[key].adminOnly,
icon: 'link',
url: 'https://smash.gg/tournament/' + slugs.tournament + '/' + key
})).filter(tab => !tab.adminOnly || tab.adminOnly === false).forEach(tab => tabs.push(tab));
});
}
const links = tournament.links;
if(links) {
Object.keys(tournament.links).forEach(key => {
tabs.push({
slug: key,
icon: 'link',
name: key[0].toUpperCase() + key.substring(1),
url: links[key]
});
});
}
return tabs;
}
const SIcon = (icon) => (
<View style={{height:30, marginLeft:10, alignSelf:'center'}}>
<Icon name={icon} size={26} color={styles.tournamentPromoIconColors.eventsCount} />
</View>
);
export default class TournamentInfoViewController extends MemeleeViewController { export default class TournamentInfoViewController extends MemeleeViewController {
state = { state = {
@ -39,50 +140,9 @@ export default class TournamentInfoViewController extends MemeleeViewController
}; };
componentWillMount = () => { componentWillMount = () => {
const tabs = [ this.setState({
{slug: 'attendees', name: 'Attendees', screen: Constants.Screens.Attendees, adminOnly: false}, tabs: determineTabs(this.props.tournament)
{slug: 'location', name: 'Location', screen: Constants.Screens.Location, adminOnly: false}, });
{slug: 'contact', name: 'Contact', screen: Constants.Screens.Contact, adminOnly: false}
];
if(this.props.tournament.rules && this.props.tournament.rules !== '') {
if(this.props.tournament.rules.startsWith('http://') || this.props.tournament.rules.startsWith('https://')) {
tabs.push({slug: 'rules', name: 'Rules', url: this.props.tournament.rules, adminOnly: false});
} else {
tabs.push({slug: 'rules', name: 'Rules', info: this.props.tournament.rules, adminOnly: false});
}
}
if(this.props.tournament.prizes && this.props.tournament.prizes !== '') {
if(this.props.tournament.prizes.startsWith('http://') || this.props.tournament.prizes.startsWith('https://')) {
tabs.push({slug: 'prizes', name: 'Prizes', url: this.props.tournament.prizes, adminOnly: false});
} else {
tabs.push({slug: 'prizes', name: 'Prizes', info: this.props.tournament.prizes, adminOnly: false});
}
}
if(this.props.tournament.publishing && this.props.tournament.publishing.fantasy)
tabs.push({
slug: 'fantasy',
name: 'Fantasy',
url: 'https://smash.gg/tournament/' + parseSlugs(this.props.tournament, null).tournament + '/fantasy/',
adminOnly: false
});
const generatedTabs = this.props.tournament.generatedTabs;
if(generatedTabs) {
const objs = Object.keys(generatedTabs).map(key => generatedTabs[key]);
objs.forEach(tab => {
Object.keys(tab).map(key => ({
slug: key,
name: tab[key].name,
adminOnly: tab[key].adminOnly
})).filter(tab => !tab.adminOnly || tab.adminOnly === false).forEach(tab => tabs.push(tab));
});
}
this.setState({tabs: tabs});
} }
onEventTapped = (evt) => { onEventTapped = (evt) => {
@ -100,7 +160,7 @@ export default class TournamentInfoViewController extends MemeleeViewController
return this.props.navigator.push({ return this.props.navigator.push({
screen: tab.screen, screen: tab.screen,
title: tab.name, title: tab.name,
passProps: {data: []}, passProps: {data: tab.data},
navigatorStyle: {tabBarHidden: true} navigatorStyle: {tabBarHidden: true}
}); });
@ -146,7 +206,7 @@ export default class TournamentInfoViewController extends MemeleeViewController
</View> </View>
<SettingsList style={styles.tournamentEventsWrapper} borderWidth={s.borderBottomWidth} borderColor={s.borderBottomColor}> <SettingsList style={styles.tournamentEventsWrapper} borderWidth={s.borderBottomWidth} borderColor={s.borderBottomColor}>
{this.state.tabs.map(tab => <Item key={tab.slug} {...ss} title={tab.name} onPress={() => this.handleTab(tab)} />)} {this.state.tabs.map(tab => <Item icon={SIcon(tab.icon)} key={tab.slug} {...ss} title={tab.name} onPress={() => this.handleTab(tab)} />)}
</SettingsList> </SettingsList>
</View> </View>
) : null} ) : null}

View file

@ -34,7 +34,7 @@ export default class TournamentRow extends React.Component {
</Text> </Text>
<Text style={styles.tournamentRowLocation}> <Text style={styles.tournamentRowLocation}>
<Icon name="map-marker" size={16} color={styles.tournamentPromoIconColors.mapMarker} /> {this.props.tournament.hasOnlineEvents && (!this.props.tournament.city || this.props.tournament.city === '') ? 'Online' : (this.props.tournament.city ? this.props.tournament.city + ', ' : '') + this.props.tournament.addrState}</Text> <Icon name="map-marker" size={16} color={styles.tournamentPromoIconColors.mapMarker} /> {this.props.tournament.hasOnlineEvents && (!this.props.tournament.city || this.props.tournament.city === '') ? 'Online' : (this.props.tournament.city ? this.props.tournament.city + ', ' : '') + (this.props.tournament.addrState ? this.props.tournament.addrState : '')}</Text>
<View style={{flexDirection: 'row'}}> <View style={{flexDirection: 'row'}}>
<Text style={styles.tournamentRowEventsCount}> <Text style={styles.tournamentRowEventsCount}>
<Icon name="trophy-variant" size={16} color={styles.tournamentPromoIconColors.eventsCount} /> {this.props.tournament.memeleeEventsCount} Events <Icon name="trophy-variant" size={16} color={styles.tournamentPromoIconColors.eventsCount} /> {this.props.tournament.memeleeEventsCount} Events

View file

@ -31,8 +31,10 @@
"react-native": "0.52.0", "react-native": "0.52.0",
"react-native-elements": "^0.19.0", "react-native-elements": "^0.19.0",
"react-native-hyperlink": "0.0.12", "react-native-hyperlink": "0.0.12",
"react-native-maps": "^0.21.0",
"react-native-markdown-renderer": "^3.1.0", "react-native-markdown-renderer": "^3.1.0",
"react-native-navigation": "^1.1.426", "react-native-navigation": "^1.1.426",
"react-native-open-maps": "^0.1.4",
"react-native-segmented-control-tab": "^3.2.2", "react-native-segmented-control-tab": "^3.2.2",
"react-native-settings-list": "^1.8.0", "react-native-settings-list": "^1.8.0",
"react-native-svg": "^6.3.1", "react-native-svg": "^6.3.1",

View file

@ -139,6 +139,10 @@ class Store {
* *
* @arg bracketID {String or Number} ID for the bracket - SmashGG calls this a phase. Go fig. * @arg bracketID {String or Number} ID for the bracket - SmashGG calls this a phase. Go fig.
*/ */
//https://smash.gg/api/-/gg_api./tournament/fighter-s-spirit-2018-1;eventSlug=street-fighter-v-arcade-edition-singles;expand=["event","phase","wave","station","stream","entrantCounts","tagsByEntity","ruleset"];mutations=["playerData","profileTaskNotifs"];phaseId=246410;reset=false;slug=fighter-s-spirit-2018-1?returnMeta=true
fetchBracketData = (bracketID) => { fetchBracketData = (bracketID) => {
this.bracketData = {winners: [], losers: []}; this.bracketData = {winners: [], losers: []};
this.bracketID = bracketID; this.bracketID = bracketID;
@ -157,10 +161,15 @@ class Store {
}; };
const url = api + Object.keys(args).map(key => `${key}=${args[key]}`).join(';') + '?returnMeta=true' const url = api + Object.keys(args).map(key => `${key}=${args[key]}`).join(';') + '?returnMeta=true'
console.log(url); //console.log(url);
fetch( fetch(
url url
).then(response => response.json()).then(data => { ).then(response => response.json()).then(data => {
if(data.items.resultEntity && data.items.resultEntity === 'groups' && typeof data.items.entities.sets === 'undefined') {
this.parseAndStoreGroups(data);
return;
}
const grands = []; const grands = [];
const brackets = { const brackets = {
winners: [], winners: [],
@ -176,13 +185,14 @@ class Store {
result.entrant1 = {}; result.entrant1 = {};
result.entrant2 = {}; result.entrant2 = {};
data.items.entities.entrants.forEach(function(entrant) { if(data.items.entities.entrants)
if(entrant.id === result.entrant1Id) data.items.entities.entrants.forEach(function(entrant) {
result.entrant1 = entrant; if(entrant.id === result.entrant1Id)
result.entrant1 = entrant;
if(entrant.id === result.entrant2Id) if(entrant.id === result.entrant2Id)
result.entrant2 = entrant; result.entrant2 = entrant;
}); });
if(result.isGF) { if(result.isGF) {
grands.push(result); grands.push(result);
@ -208,13 +218,11 @@ class Store {
// GFs are technically in the winners bracket, but for presentation purposes they're shoved // GFs are technically in the winners bracket, but for presentation purposes they're shoved
// in after to be like how smash.gg presents them. // in after to be like how smash.gg presents them.
if(grands.length > 0) { if(grands.length > 0) {
grands.forEach(grandFinal => { grands.forEach(grandFinal => brackets.winners.push({
brackets.winners.push({ title: 'Grand Finals',
title: 'Grand Finals', sets: [grandFinal],
sets: [grandFinal], key: v4()
key: v4() }));
});
});
} }
runInAction('Set Bracket Data', () => { runInAction('Set Bracket Data', () => {
@ -222,6 +230,13 @@ class Store {
}); });
}); });
} }
parseAndStoreGroups = (data) => {
console.warn('Groups!');
runInAction('Set Groups Data', () => {
});
}
}; };
export default new Store(); export default new Store();

View file

@ -121,6 +121,37 @@ const stylesheet = StyleSheet.create({
textAlign: 'center', textAlign: 'center',
marginTop: 5, marginTop: 5,
color: textColor color: textColor
},
bracketTitle: {
fontWeight: 'bold',
padding: 5,
textAlign: 'center',
color: textColor
},
matchWrapper: {
backgroundColor: '#3b3b48',
borderColor: '#0e0e12',
borderWidth: 0.5,
borderRadius: 4,
marginBottom: 20,
overflow: 'hidden'
},
matchEntrant: {
flexDirection: 'row',
justifyContent: 'space-between'
},
matchEntrantText: {
color: '#dbdbde',
padding: 5
},
matchSeparator: {
borderTopWidth: 0.5,
borderTopColor: '#2a2a33'
} }
}); });