From 2554789f5fc500b286172ef34fbc258868f24c3e Mon Sep 17 00:00:00 2001 From: Ryan McGrath Date: Mon, 16 Apr 2018 14:57:28 -0400 Subject: [PATCH] Stylistic fixes, etc --- controllers/AttendeesListViewController.js | 24 ++- controllers/BracketViewController.js | 23 ++- controllers/ContactViewController.js | 55 ++++-- controllers/LocationViewController.js | 41 +++-- controllers/TournamentInfoViewController.js | 170 ++++++++++++------ controllers/components/TournamentRow.js | 2 +- .../UserInterfaceState.xcuserstate | Bin 23796 -> 23918 bytes package.json | 2 + stores/TournamentEventStore.js | 43 +++-- styles/index.js | 31 ++++ 10 files changed, 283 insertions(+), 108 deletions(-) diff --git a/controllers/AttendeesListViewController.js b/controllers/AttendeesListViewController.js index ec1e4e6..a86b7e4 100644 --- a/controllers/AttendeesListViewController.js +++ b/controllers/AttendeesListViewController.js @@ -9,6 +9,7 @@ import moment from 'moment'; import React from 'react'; import {FlatList, View, ActivityIndicator} from 'react-native'; +import SegmentedControlTab from 'react-native-segmented-control-tab'; import {inject, observer} from 'mobx-react/native'; import {SearchBar} from 'react-native-elements'; @@ -20,6 +21,14 @@ import TournamentRow from './components/TournamentRow'; const keyExtractor = (item, index) => item.id; export default class AttendeesListViewController extends MemeleeViewController { + state = { + selectedIndex: 0 + }; + + swapIndex = (index) => this.setState({ + selectedIndex: index + }); + renderItem = ({item}) => () render() { @@ -28,7 +37,20 @@ export default class AttendeesListViewController extends MemeleeViewController { keyExtractor: keyExtractor, 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 + return ( + + + ); } } diff --git a/controllers/BracketViewController.js b/controllers/BracketViewController.js index 9247047..4fabba9 100644 --- a/controllers/BracketViewController.js +++ b/controllers/BracketViewController.js @@ -11,13 +11,21 @@ import React from 'react'; import {ScrollView, Text, View} from 'react-native'; import {inject, observer} from 'mobx-react/native'; +import styles from '../styles'; + import MemeleeViewController from './MemeleeViewController'; const Match = ({set, ...rest}) => ( - - {set.entrant1.name ? set.entrant1.name : ''} {set.entrant1Score} - - {set.entrant2.name ? set.entrant2.name : ''} {set.entrant2Score} + + + {set.entrant1.name ? set.entrant1.name : ''} + {set.entrant1Score} + + + + {set.entrant2.name ? set.entrant2.name : ''} + {set.entrant2Score} + ); @@ -33,8 +41,11 @@ export default class BracketViewController extends MemeleeViewController { {this.props.Events.bracketData[key].map(bracket => ( - {bracket.title} - {bracket.sets.map(set => )} + {bracket.title} + {bracket.sets.map(set => { + if(set.isGF) console.log(JSON.stringify(set, null, 4)); + return ; + })} ))} diff --git a/controllers/ContactViewController.js b/controllers/ContactViewController.js index ec1e4e6..e54b43c 100644 --- a/controllers/ContactViewController.js +++ b/controllers/ContactViewController.js @@ -6,29 +6,54 @@ * @copyright Ryan McGrath 2018. */ -import moment from 'moment'; import React from 'react'; -import {FlatList, View, ActivityIndicator} from 'react-native'; -import {inject, observer} from 'mobx-react/native'; -import {SearchBar} from 'react-native-elements'; +import {ScrollView, View, Text, StyleSheet} from 'react-native'; +import Markdown from 'react-native-markdown-renderer'; +import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; +import SettingsList, {Header, Item} from 'react-native-settings-list'; import styles from '../styles'; -import Constants from '../utils/Constants'; +import {openURL} from '../utils'; import MemeleeViewController from './MemeleeViewController'; -import TournamentRow from './components/TournamentRow'; -const keyExtractor = (item, index) => item.id; - -export default class AttendeesListViewController extends MemeleeViewController { - renderItem = ({item}) => () +export default class ContactViewController extends MemeleeViewController { + email = () => { openURL('mailto:' + this.props.data.email); } + phone = () => { openURL('tel:' + this.props.data.phone); } + twitter = () => { openURL('https://twitter.com/' + this.props.data.twitter); } render() { - const props = { - data: this.props.data, - 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 + return ( + + {this.props.data.email ? + + + } /> : null} + {this.props.data.phone ? + + + } /> : null} + {this.props.data.twitter ? + + + } /> : null} + + + {this.props.data.info ? + + {this.props.data.info} + + : null} + ); } } diff --git a/controllers/LocationViewController.js b/controllers/LocationViewController.js index ec1e4e6..1c8f3e7 100644 --- a/controllers/LocationViewController.js +++ b/controllers/LocationViewController.js @@ -6,29 +6,38 @@ * @copyright Ryan McGrath 2018. */ -import moment from 'moment'; import React from 'react'; -import {FlatList, View, ActivityIndicator} from 'react-native'; -import {inject, observer} from 'mobx-react/native'; -import {SearchBar} from 'react-native-elements'; +import {ScrollView, StyleSheet, Image, Text, View, TouchableOpacity, Dimensions} from 'react-native'; +import Markdown, {PluginContainer} from 'react-native-markdown-renderer'; +import SettingsList, {Header, Item} from 'react-native-settings-list'; +import openMap from 'react-native-open-maps'; import styles from '../styles'; -import Constants from '../utils/Constants'; import MemeleeViewController from './MemeleeViewController'; -import TournamentRow from './components/TournamentRow'; - -const keyExtractor = (item, index) => item.id; - -export default class AttendeesListViewController extends MemeleeViewController { - renderItem = ({item}) => () +export default class LocationViewController extends MemeleeViewController { render() { - const props = { - data: this.props.data, - keyExtractor: keyExtractor, - renderItem: this.renderItem + const addy = '\n' + this.props.data.venue.name + '\n' + this.props.data.venue.address + ' ' + this.props.data.venue.city + + ' ' + this.props.data.venue.state + ' ' + this.props.data.venue.postalCode + '\n' + this.props.data.venue.country + '\n'; + + const s = StyleSheet.flatten(styles.tournamentDetailsEventWrapper); + const ss = { + itemWidth: 50, + backgroundColor: s.backgroundColor, + style: styles.tournamentDetailsEventWrapper, + titleStyle: styles.tournamentDetailsEventItem }; - return + return ( + + openMap({latitude: this.props.data.map.lat, longitude: this.props.data.map.lng})} /> + + + {this.props.data.gettingThere ? + + {this.props.data.gettingThere} + + : null} + ); } } diff --git a/controllers/TournamentInfoViewController.js b/controllers/TournamentInfoViewController.js index 85538bd..c032118 100644 --- a/controllers/TournamentInfoViewController.js +++ b/controllers/TournamentInfoViewController.js @@ -9,6 +9,7 @@ import moment from 'moment'; import React from 'react'; 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 SegmentedControlTab from 'react-native-segmented-control-tab'; import SettingsList, {Header, Item} from 'react-native-settings-list'; @@ -21,16 +22,116 @@ import EventsStore from '../stores/TournamentEventStore'; import MemeleeViewController from './MemeleeViewController'; const w = Dimensions.get('screen').width; -/* - - Register - - - Bookmark - - -*/ +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) => ( + + + +); export default class TournamentInfoViewController extends MemeleeViewController { state = { @@ -39,50 +140,9 @@ export default class TournamentInfoViewController extends MemeleeViewController }; componentWillMount = () => { - const tabs = [ - {slug: 'attendees', name: 'Attendees', screen: Constants.Screens.Attendees, adminOnly: false}, - {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}); + this.setState({ + tabs: determineTabs(this.props.tournament) + }); } onEventTapped = (evt) => { @@ -100,7 +160,7 @@ export default class TournamentInfoViewController extends MemeleeViewController return this.props.navigator.push({ screen: tab.screen, title: tab.name, - passProps: {data: []}, + passProps: {data: tab.data}, navigatorStyle: {tabBarHidden: true} }); @@ -146,7 +206,7 @@ export default class TournamentInfoViewController extends MemeleeViewController - {this.state.tabs.map(tab => this.handleTab(tab)} />)} + {this.state.tabs.map(tab => this.handleTab(tab)} />)} ) : null} diff --git a/controllers/components/TournamentRow.js b/controllers/components/TournamentRow.js index a6c6f70..86af2e1 100644 --- a/controllers/components/TournamentRow.js +++ b/controllers/components/TournamentRow.js @@ -34,7 +34,7 @@ export default class TournamentRow extends React.Component { - {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.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 : '')} {this.props.tournament.memeleeEventsCount} Events diff --git a/ios/memelee.xcodeproj/project.xcworkspace/xcuserdata/laika.xcuserdatad/UserInterfaceState.xcuserstate b/ios/memelee.xcodeproj/project.xcworkspace/xcuserdata/laika.xcuserdatad/UserInterfaceState.xcuserstate index 04176fb9aac6ad7dcb79392a697164e0fa604773..cb36ff7062641d2dcdc38e0900a02068af20b9e7 100644 GIT binary patch delta 6986 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 delta 6925 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 HGd}nqjCMS# diff --git a/package.json b/package.json index 1714b5b..dae0fa1 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,10 @@ "react-native": "0.52.0", "react-native-elements": "^0.19.0", "react-native-hyperlink": "0.0.12", + "react-native-maps": "^0.21.0", "react-native-markdown-renderer": "^3.1.0", "react-native-navigation": "^1.1.426", + "react-native-open-maps": "^0.1.4", "react-native-segmented-control-tab": "^3.2.2", "react-native-settings-list": "^1.8.0", "react-native-svg": "^6.3.1", diff --git a/stores/TournamentEventStore.js b/stores/TournamentEventStore.js index e44618b..d52dfd9 100644 --- a/stores/TournamentEventStore.js +++ b/stores/TournamentEventStore.js @@ -139,6 +139,10 @@ class Store { * * @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) => { this.bracketData = {winners: [], losers: []}; this.bracketID = bracketID; @@ -157,10 +161,15 @@ class Store { }; const url = api + Object.keys(args).map(key => `${key}=${args[key]}`).join(';') + '?returnMeta=true' - console.log(url); + //console.log(url); fetch( url ).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 brackets = { winners: [], @@ -176,13 +185,14 @@ class Store { result.entrant1 = {}; result.entrant2 = {}; - data.items.entities.entrants.forEach(function(entrant) { - if(entrant.id === result.entrant1Id) - result.entrant1 = entrant; + if(data.items.entities.entrants) + data.items.entities.entrants.forEach(function(entrant) { + if(entrant.id === result.entrant1Id) + result.entrant1 = entrant; - if(entrant.id === result.entrant2Id) - result.entrant2 = entrant; - }); + if(entrant.id === result.entrant2Id) + result.entrant2 = entrant; + }); if(result.isGF) { grands.push(result); @@ -208,13 +218,11 @@ class Store { // GFs are technically in the winners bracket, but for presentation purposes they're shoved // in after to be like how smash.gg presents them. if(grands.length > 0) { - grands.forEach(grandFinal => { - brackets.winners.push({ - title: 'Grand Finals', - sets: [grandFinal], - key: v4() - }); - }); + grands.forEach(grandFinal => brackets.winners.push({ + title: 'Grand Finals', + sets: [grandFinal], + key: v4() + })); } runInAction('Set Bracket Data', () => { @@ -222,6 +230,13 @@ class Store { }); }); } + + parseAndStoreGroups = (data) => { + console.warn('Groups!'); + runInAction('Set Groups Data', () => { + + }); + } }; export default new Store(); diff --git a/styles/index.js b/styles/index.js index 461503c..7a7c294 100644 --- a/styles/index.js +++ b/styles/index.js @@ -121,6 +121,37 @@ const stylesheet = StyleSheet.create({ textAlign: 'center', marginTop: 5, 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' } });