Achievements are loading.

This commit is contained in:
John Shaver 2017-07-11 11:09:16 -07:00
parent aa8953ca1a
commit 079cf41e43
11 changed files with 179 additions and 6 deletions

View file

@ -1,12 +1,12 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { getQueryParamByName } from './utils.js'; import { getQueryParamByName } from './utils.js';
import ScoutOverviewCont from './containers/ScoutOverview.js'; import ScoutOverviewCont from './containers/GetScoutData.js';
import ScoutOverview from './components/ScoutOverview.js'; import ScoutOverview from './components/ScoutOverview.js';
class App extends Component { class App extends Component {
render() { render() {
const scoutID = getQueryParamByName("id", this.props.slug); const scoutID = getQueryParamByName("id", this.props.slug);
var MainView = ScoutOverviewCont(ScoutOverview); const MainView = ScoutOverviewCont(ScoutOverview);
return ( return (
<div className="App"> <div className="App">

View file

@ -0,0 +1,5 @@
import React from 'react';
export default({id, number, description, additionalText}) => {
return <div>{number}</div>;
};

View file

@ -0,0 +1,22 @@
import React from 'react'
import Achievement from "./Achievement.js";
export default ({achievements, id, completed}) => {
console.log("completed: ", completed);
if(!achievements) {
return <div>Loading...</div>
}
const list = achievements.sort((a, b) => {
if (a.number === b.number)
return a.letter > b.letter;
return a.number > b.number;
}).map(achievement => (
<Achievement key={achievement.id} {...achievement} />
));
return <div>
{list}
</div>
}

View file

@ -0,0 +1,15 @@
import React from 'react'
import GetAchievements from "../containers/GetAchievementsForAdventure.js";
import AchievementList from "./AchievementList.js";
export default ({id, name, number, isRequired, achievements,
completedAdventures, completedAchievements}) => {
const AchievementListComp = GetAchievements(AchievementList);
return <div>
<div>{name}</div>
<AchievementListComp adventureID={id} completed={completedAchievements}/>
</div>
}

View file

@ -0,0 +1,39 @@
import React from "react"
import { splitFilter } from '../utils.js';
import Adventure from './Adventure.js';
export default ({
allAdventures,
completedAdventures
}) => {
if(!allAdventures) {
return <div> Loading... </div>
}
const sortedAdventures = allAdventures.sort((a,b) => (a.number > b.number));
const [
requiredAdventures,
optionalAdventures
] = splitFilter(sortedAdventures, a => a.required);
const requiredAdventureList = requiredAdventures.map(adventure => {
return <Adventure key={adventure.id} {...adventure} />;
});
const optionalAdventureList = optionalAdventures.map(adventure => {
return <Adventure key={adventure.id} {...adventure} />;
});
return <div>
<div>
{requiredAdventureList}
</div>
<div>
{
//optionalAdventureList
}
</div>
</div>;
}

View file

@ -1,4 +1,6 @@
import React from "react"; import React from "react";
import AllAdventures from '../containers/GetAllAdventures.js'
import AdventureList from './AdventureList.js';
export default ({ export default ({
scoutID, scoutID,
@ -7,10 +9,14 @@ export default ({
completedAdventures, completedAdventures,
completedAchievements completedAchievements
}) => { }) => {
const AdventureListComp = AllAdventures(AdventureList);
console.log(displayName) console.log(displayName)
return ( return (
<div> <div>
{displayName} {displayName}
<AdventureListComp
{...{scoutID, completedAdventures, completedAchievements}}
/>
</div> </div>
); );
} }

View file

@ -0,0 +1,35 @@
import { gql, graphql } from 'react-apollo';
import { stripEdges } from '../utils.js';
export default graphql(gql`
query GetAchievementsForAdventure($adventureID:ID!){
getAdventure(id:$adventureID) {
achievements {
edges {
node {
id,
number,
letter,
description,
additionalText
}
}
}
}
}
`,{
options: ({adventureID}) => {
return {
variables: {
adventureID
}
};
},
props: ({ownProps, data}) => {
return data.getAdventure ? {
achievements: stripEdges(data.getAdventure.achievements),
...ownProps
} : {...ownProps}
}
});

View file

@ -0,0 +1,30 @@
import { gql, graphql } from 'react-apollo';
import { stripEdges } from '../utils.js';
export default graphql(gql`
query GetAllAdventuresForRank{
viewer {
allAdventures {
edges {
node {
name,
number,
required,
id
}
}
}
}
}
`,{
props: ({ownProps, data}) => (
data.viewer ? {
allAdventures: stripEdges(data.viewer.allAdventures),
...ownProps
} : {...ownProps})
});

View file

@ -1,4 +1,3 @@
import React from "react";
import { gql, graphql } from 'react-apollo'; import { gql, graphql } from 'react-apollo';
export default graphql(gql` export default graphql(gql`
@ -16,7 +15,8 @@ export default graphql(gql`
achievements { achievements {
edges { edges {
node { node {
name number,
letter
} }
} }
} }

View file

@ -2,7 +2,14 @@ import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import './index.css'; import './index.css';
import App from './App'; import App from './App';
import registerServiceWorker from './registerServiceWorker'; //import registerServiceWorker from './registerServiceWorker';
import injectTapEventPlugin from 'react-tap-event-plugin';
// Needed for onTouchTap
// http://stackoverflow.com/a/34015469/988941
injectTapEventPlugin();
import { import {
ApolloClient, ApolloClient,
createNetworkInterface, createNetworkInterface,

View file

@ -1,8 +1,22 @@
export function getQueryParamByName(name, url) { export function getQueryParamByName(name, url) {
name = name.replace(/[\[\]]/g, "\\$&"); name = name.replace(/[[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url); results = regex.exec(url);
if (!results) return null; if (!results) return null;
if (!results[2]) return ''; if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " ")); return decodeURIComponent(results[2].replace(/\+/g, " "));
} }
export function stripEdges({edges}) {
return edges.map(stripEdge);
}
export function stripEdge({node}) {
return node;
}
export function splitFilter(array, check) {
return array.reduce((result, item) => {
check(item) ? result[0].push(item) : result[1].push(item);
return result;
}, [[],[]]);
}