frontend first version

This commit is contained in:
Sendou
2019-05-05 02:10:10 +03:00
parent 30b5b23c6c
commit d7f437ace4
22 changed files with 4825 additions and 59 deletions

50
.eslintrc.js Normal file
View File

@@ -0,0 +1,50 @@
module.exports = {
"env": {
"browser": true,
"es6": true,
"jest/globals": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"parserOptions": {
"ecmaFeatures": {
"jsx": true,
"modules": true
},
"ecmaVersion": 2018,
"sourceType": "module"
},
"plugins": [
"react", "jest"
],
"rules": {
"indent": [
"error",
2
],
"linebreak-style": [
"error",
"windows"
],
"quotes": [
"error",
"single"
],
"semi": [
"error",
"never"
],
"eqeqeq": "error",
"no-trailing-spaces": "error",
"object-curly-spacing": [
"error", "always"
],
"arrow-spacing": [
"error", { "before": true, "after": true }
],
"no-console": 0,
"react/prop-types": 0
}
}

196
index.js
View File

@@ -11,7 +11,7 @@ mongoose.set('useCreateIndex', true)
console.log('connecting to MongoDB')
mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true })
mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, dbName: "production" })
.then(() => {
console.log('connected to MongoDB')
})
@@ -25,6 +25,7 @@ const typeDefs = gql`
username: String!
passwordHash: String!
}
type Player {
id: ID!
name: String!
@@ -33,41 +34,54 @@ const typeDefs = gql`
twitter: String
weapons: [String!]!
topTotal: [Placement!]!
topTotalScore: Int
topTotalScore: Float
topShooter: [Placement]
topShooterScore: Int
topShooterScore: Float
topBlaster: [Placement]
topBlasterScore: Int
topBlasterScore: Float
topRoller: [Placement]
topRollerScore: Int
topRollerScore: Float
topCharger: [Placement]
topChargerScore: Int
topChargerScore: Float
topSlosher: [Placement]
topSlosherScore: Int
topSlosherScore: Float
topSplatling: [Placement]
topSplatlingScore: Int
topSplatlingScore: Float
topDualies: [Placement]
topDualiesScore: Int
topDualiesScore: Float
topBrella: [Placement]
topBrellaScore: Int
topBrellaScore: Float
}
type Placement {
id: ID!
name: String!
weapon: String!
rank: Int!
mode: Int!
x_power: Int!
x_power: Float!
unique_id: Int!
month: Int!
year: Int!
}
type Token {
value: String!
}
type Query {
playerCount: Int!
topTotalPlayers (amount: Int): [Player!]!
topShooterPlayers (amount: Int): [Player!]!
topBlasterPlayers (amount: Int): [Player!]!
topRollerPlayers (amount: Int): [Player!]!
topChargerPlayers (amount: Int): [Player!]!
topSlosherPlayers (amount: Int): [Player!]!
topSplatlingPlayers (amount: Int): [Player!]!
topDualiesPlayers (amount: Int): [Player!]!
topBrellaPlayers (amount: Int): [Player!]!
}
type Mutation {
createUser(
username: String!
@@ -82,7 +96,165 @@ const typeDefs = gql`
const resolvers = {
Query: {
playerCount: () => Placement.collection.countDocuments()
playerCount: () => Player.collection.countDocuments(),
topTotalPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topTotalScore: { $ne: null} })
.sort({ "topTotalScore": "desc" })
.limit(args.amount)
.populate("topTotal", {"unique_id": 0})
.catch(e => {
throw new UserInputError(e.message, {
invalidArgs: args,
})
})
},
topShooterPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topShooterScore: { $ne: null} })
.sort({ "topShooterScore": "desc" })
.limit(args.amount)
.populate("topShooter", {"unique_id": 0})
},
topBlasterPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topBlasterScore: { $ne: null} })
.sort({ "topBlasterScore": "desc" })
.limit(args.amount)
.populate("topBlaster", {"unique_id": 0})
},
topRollerPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topRollerScore: { $ne: null} })
.sort({ "topRollerScore": "desc" })
.limit(args.amount)
.populate("topRoller", {"unique_id": 0})
},
topChargerPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topChargerScore: { $ne: null} })
.sort({ "topChargerScore": "desc" })
.limit(args.amount)
.populate("topCharger", {"unique_id": 0})
},
topSlosherPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topSlosherScore: { $ne: null} })
.sort({ "topSlosherScore": "desc" })
.limit(args.amount)
.populate("topSlosher", {"unique_id": 0})
},
topSplatlingPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topSplatlingScore: { $ne: null} })
.sort({ "topSplatlingScore": "desc" })
.limit(args.amount)
.populate("topSplatling", {"unique_id": 0})
},
topDualiesPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topDualiesScore: { $ne: null} })
.sort({ "topDualiesScore": "desc" })
.limit(args.amount)
.populate("topDualies", {"unique_id": 0})
},
topBrellaPlayers: (root, args) => {
if (!args.amount) {
args.amount = 50
}
if (args.amount < 1 || args.amount > 50) {
throw new UserInputError('amount requested has to be between 1 and 50', {
invalidArgs: args,
})
}
return Player
.find({ topBrellaScore: { $ne: null} })
.sort({ "topBrellaScore": "desc" })
.limit(args.amount)
.populate("topBrella", {"unique_id": 0})
}
}
}

3819
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,13 +4,20 @@
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"test": "echo \"Error: no test specified\" && exit 1",
"watch": "nodemon index.js"
},
"author": "Sendou",
"license": "ISC",
"dependencies": {
"apollo-server": "^2.4.8",
"dotenv": "^7.0.0",
"graphql": "^14.2.1",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.5.5",
"mongoose-unique-validator": "^2.0.3"
},
"devDependencies": {
"nodemon": "^1.19.0"
}
}

View File

@@ -1120,6 +1120,15 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
},
"@semantic-ui-react/event-stack": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.0.tgz",
"integrity": "sha512-WHtU9wutZByZtFZxzj4BVEk+rvWldZpZhRcyv6d84+XLSolm83zLHYJLTACGuSl6Xa/xpgVXquvm9GyMudkJYg==",
"requires": {
"exenv": "^1.2.2",
"prop-types": "^15.6.2"
}
},
"@svgr/babel-plugin-add-jsx-attribute": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
@@ -1317,6 +1326,11 @@
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz",
"integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw=="
},
"@types/zen-observable": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz",
"integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg=="
},
"@typescript-eslint/eslint-plugin": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz",
@@ -1633,6 +1647,188 @@
"normalize-path": "^2.1.1"
}
},
"apollo-boost": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/apollo-boost/-/apollo-boost-0.3.1.tgz",
"integrity": "sha512-VdXcTMxLBeNvANW/FtiarEkrRr/cepYKG6wTAURdy8CS33WYpEHtIg9S8tAjxwVzIECpE4lWyDKyPLoESJ072Q==",
"requires": {
"apollo-cache": "^1.2.1",
"apollo-cache-inmemory": "^1.5.1",
"apollo-client": "^2.5.1",
"apollo-link": "^1.0.6",
"apollo-link-error": "^1.0.3",
"apollo-link-http": "^1.3.1",
"graphql-tag": "^2.4.2",
"ts-invariant": "^0.2.1",
"tslib": "^1.9.3"
},
"dependencies": {
"ts-invariant": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.2.1.tgz",
"integrity": "sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg==",
"requires": {
"tslib": "^1.9.3"
}
}
}
},
"apollo-cache": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.2.1.tgz",
"integrity": "sha512-nzFmep/oKlbzUuDyz6fS6aYhRmfpcHWqNkkA9Bbxwk18RD6LXC4eZkuE0gXRX0IibVBHNjYVK+Szi0Yied4SpQ==",
"requires": {
"apollo-utilities": "^1.2.1",
"tslib": "^1.9.3"
}
},
"apollo-cache-inmemory": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.5.1.tgz",
"integrity": "sha512-D3bdpPmWfaKQkWy8lfwUg+K8OBITo3sx0BHLs1B/9vIdOIZ7JNCKq3EUcAgAfInomJUdN0QG1yOfi8M8hxkN1g==",
"requires": {
"apollo-cache": "^1.2.1",
"apollo-utilities": "^1.2.1",
"optimism": "^0.6.9",
"ts-invariant": "^0.2.1",
"tslib": "^1.9.3"
},
"dependencies": {
"ts-invariant": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.2.1.tgz",
"integrity": "sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg==",
"requires": {
"tslib": "^1.9.3"
}
}
}
},
"apollo-client": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.5.1.tgz",
"integrity": "sha512-MNcQKiqLHdGmNJ0rZ0NXaHrToXapJgS/5kPk0FygXt+/FmDCdzqcujI7OPxEC6e9Yw5S/8dIvOXcRNuOMElHkA==",
"requires": {
"@types/zen-observable": "^0.8.0",
"apollo-cache": "1.2.1",
"apollo-link": "^1.0.0",
"apollo-link-dedup": "^1.0.0",
"apollo-utilities": "1.2.1",
"symbol-observable": "^1.0.2",
"ts-invariant": "^0.2.1",
"tslib": "^1.9.3",
"zen-observable": "^0.8.0"
},
"dependencies": {
"ts-invariant": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.2.1.tgz",
"integrity": "sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg==",
"requires": {
"tslib": "^1.9.3"
}
}
}
},
"apollo-link": {
"version": "1.2.11",
"resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.11.tgz",
"integrity": "sha512-PQvRCg13VduLy3X/0L79M6uOpTh5iHdxnxYuo8yL7sJlWybKRJwsv4IcRBJpMFbChOOaHY7Og9wgPo6DLKDKDA==",
"requires": {
"apollo-utilities": "^1.2.1",
"ts-invariant": "^0.3.2",
"tslib": "^1.9.3",
"zen-observable-ts": "^0.8.18"
},
"dependencies": {
"ts-invariant": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.3.3.tgz",
"integrity": "sha512-UReOKsrJFGC9tUblgSRWo+BsVNbEd77Cl6WiV/XpMlkifXwNIJbknViCucHvVZkXSC/mcWeRnIGdY7uprcwvdQ==",
"requires": {
"tslib": "^1.9.3"
}
}
}
},
"apollo-link-context": {
"version": "1.0.17",
"resolved": "https://registry.npmjs.org/apollo-link-context/-/apollo-link-context-1.0.17.tgz",
"integrity": "sha512-W5UUfHcrrlP5uqJs5X1zbf84AMXhPZGAqX/7AQDgR6wY/7//sMGfJvm36KDkpIeSOElztGtM9z6zdPN1NbT41Q==",
"requires": {
"apollo-link": "^1.2.11",
"tslib": "^1.9.3"
}
},
"apollo-link-dedup": {
"version": "1.0.18",
"resolved": "https://registry.npmjs.org/apollo-link-dedup/-/apollo-link-dedup-1.0.18.tgz",
"integrity": "sha512-1rr54wyMTuqUmbWvcXbwduIcaCDcuIgU6MqQ599nAMuTrbSOXthGfoAD8BDTxBGQ9roVlM7ABP0VZVEWRoHWSg==",
"requires": {
"apollo-link": "^1.2.11",
"tslib": "^1.9.3"
}
},
"apollo-link-error": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.10.tgz",
"integrity": "sha512-itG5UV7mQqaalmRkuRsF0cUS4zW2ja8XCbxkMZnIEeN24X3yoJi5hpJeAaEkXf0KgYNsR0+rmtCQNruWyxDnZQ==",
"requires": {
"apollo-link": "^1.2.11",
"apollo-link-http-common": "^0.2.13",
"tslib": "^1.9.3"
}
},
"apollo-link-http": {
"version": "1.5.14",
"resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.14.tgz",
"integrity": "sha512-XEoPXmGpxFG3wioovgAlPXIarWaW4oWzt8YzjTYZ87R4R7d1A3wKR/KcvkdMV1m5G7YSAHcNkDLe/8hF2nH6cg==",
"requires": {
"apollo-link": "^1.2.11",
"apollo-link-http-common": "^0.2.13",
"tslib": "^1.9.3"
}
},
"apollo-link-http-common": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.13.tgz",
"integrity": "sha512-Uyg1ECQpTTA691Fwx5e6Rc/6CPSu4TB4pQRTGIpwZ4l5JDOQ+812Wvi/e3IInmzOZpwx5YrrOfXrtN8BrsDXoA==",
"requires": {
"apollo-link": "^1.2.11",
"ts-invariant": "^0.3.2",
"tslib": "^1.9.3"
},
"dependencies": {
"ts-invariant": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.3.3.tgz",
"integrity": "sha512-UReOKsrJFGC9tUblgSRWo+BsVNbEd77Cl6WiV/XpMlkifXwNIJbknViCucHvVZkXSC/mcWeRnIGdY7uprcwvdQ==",
"requires": {
"tslib": "^1.9.3"
}
}
}
},
"apollo-utilities": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.2.1.tgz",
"integrity": "sha512-Zv8Udp9XTSFiN8oyXOjf6PMHepD4yxxReLsl6dPUy5Ths7jti3nmlBzZUOxuTWRwZn0MoclqL7RQ5UEJN8MAxg==",
"requires": {
"fast-json-stable-stringify": "^2.0.0",
"ts-invariant": "^0.2.1",
"tslib": "^1.9.3"
},
"dependencies": {
"ts-invariant": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.2.1.tgz",
"integrity": "sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg==",
"requires": {
"tslib": "^1.9.3"
}
}
}
},
"append-transform": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
@@ -2690,7 +2886,8 @@
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true
"bundled": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
@@ -2708,11 +2905,13 @@
},
"balanced-match": {
"version": "1.0.0",
"bundled": true
"bundled": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -2725,15 +2924,18 @@
},
"code-point-at": {
"version": "1.1.0",
"bundled": true
"bundled": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true
"bundled": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
@@ -2836,7 +3038,8 @@
},
"inherits": {
"version": "2.0.3",
"bundled": true
"bundled": true,
"optional": true
},
"ini": {
"version": "1.3.5",
@@ -2846,6 +3049,7 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -2858,17 +3062,20 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"bundled": true
"bundled": true,
"optional": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -2885,6 +3092,7 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -2957,7 +3165,8 @@
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -2967,6 +3176,7 @@
"once": {
"version": "1.4.0",
"bundled": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@@ -3042,7 +3252,8 @@
},
"safe-buffer": {
"version": "5.1.2",
"bundled": true
"bundled": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -3072,6 +3283,7 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -3089,6 +3301,7 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -3127,11 +3340,13 @@
},
"wrappy": {
"version": "1.0.2",
"bundled": true
"bundled": true,
"optional": true
},
"yallist": {
"version": "3.0.3",
"bundled": true
"bundled": true,
"optional": true
}
}
},
@@ -3190,6 +3405,11 @@
}
}
},
"classnames": {
"version": "2.2.6",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
"integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
},
"clean-css": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
@@ -3536,6 +3756,15 @@
"sha.js": "^2.4.8"
}
},
"create-react-context": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz",
"integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==",
"requires": {
"fbjs": "^0.8.0",
"gud": "^1.0.0"
}
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -4227,6 +4456,14 @@
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"encoding": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
"requires": {
"iconv-lite": "~0.4.13"
}
},
"end-of-stream": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
@@ -4795,6 +5032,11 @@
"strip-eof": "^1.0.0"
}
},
"exenv": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz",
"integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50="
},
"exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -5062,6 +5304,35 @@
"bser": "^2.0.0"
}
},
"fbjs": {
"version": "0.8.17",
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
"integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
"requires": {
"core-js": "^1.0.0",
"isomorphic-fetch": "^2.1.1",
"loose-envify": "^1.0.0",
"object-assign": "^4.1.0",
"promise": "^7.1.1",
"setimmediate": "^1.0.5",
"ua-parser-js": "^0.7.18"
},
"dependencies": {
"core-js": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
"integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
},
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"requires": {
"asap": "~2.0.3"
}
}
}
},
"figgy-pudding": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
@@ -5468,11 +5739,29 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
},
"graphql": {
"version": "14.2.1",
"resolved": "https://registry.npmjs.org/graphql/-/graphql-14.2.1.tgz",
"integrity": "sha512-2PL1UbvKeSjy/lUeJqHk+eR9CvuErXoCNwJI4jm3oNFEeY+9ELqHNKO1ZuSxAkasPkpWbmT/iMRMFxd3cEL3tQ==",
"requires": {
"iterall": "^1.2.2"
}
},
"graphql-tag": {
"version": "2.10.1",
"resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz",
"integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg=="
},
"growly": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
},
"gud": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
"integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw=="
},
"gzip-size": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz",
@@ -5647,6 +5936,19 @@
"resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
"integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
},
"history": {
"version": "4.9.0",
"resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz",
"integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==",
"requires": {
"@babel/runtime": "^7.1.2",
"loose-envify": "^1.2.0",
"resolve-pathname": "^2.2.0",
"tiny-invariant": "^1.0.2",
"tiny-warning": "^1.0.0",
"value-equal": "^0.4.0"
}
},
"hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@@ -5662,6 +5964,14 @@
"resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
"integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ=="
},
"hoist-non-react-statics": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz",
"integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==",
"requires": {
"react-is": "^16.7.0"
}
},
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
@@ -5871,6 +6181,11 @@
"resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz",
"integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg=="
},
"immutable-tuple": {
"version": "0.4.10",
"resolved": "https://registry.npmjs.org/immutable-tuple/-/immutable-tuple-0.4.10.tgz",
"integrity": "sha512-45jheDbc3Kr5Cw8EtDD+4woGRUV0utIrJBZT8XH0TPZRfm8tzT0/sLGGzyyCCFqFMG5Pv5Igf3WY/arn6+8V9Q=="
},
"import-cwd": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
@@ -6265,6 +6580,15 @@
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
"isomorphic-fetch": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
"integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
"requires": {
"node-fetch": "^1.0.1",
"whatwg-fetch": ">=0.10.0"
}
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -6364,6 +6688,11 @@
"handlebars": "^4.1.0"
}
},
"iterall": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz",
"integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA=="
},
"jest": {
"version": "24.7.1",
"resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz",
@@ -6607,11 +6936,13 @@
},
"balanced-match": {
"version": "1.0.0",
"bundled": true
"bundled": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -6628,7 +6959,8 @@
},
"concat-map": {
"version": "0.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
@@ -6757,6 +7089,7 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -7487,6 +7820,11 @@
"array-includes": "^3.0.3"
}
},
"keyboard-key": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.0.4.tgz",
"integrity": "sha512-my04dE6BCwPpwoe4KYKfPxWiwgDYQOHrVmtzn1CfzmoEsGG/ef4oZGaXCzi1+iFhG7CN5JkOuxmei5OABY8/ag=="
},
"killable": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@@ -7654,6 +7992,11 @@
"resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
"integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
},
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
},
"lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -8111,6 +8454,15 @@
"lower-case": "^1.1.1"
}
},
"node-fetch": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
"integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
"requires": {
"encoding": "^0.1.11",
"is-stream": "^1.0.1"
}
},
"node-forge": {
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
@@ -8404,6 +8756,14 @@
"is-wsl": "^1.1.0"
}
},
"optimism": {
"version": "0.6.9",
"resolved": "https://registry.npmjs.org/optimism/-/optimism-0.6.9.tgz",
"integrity": "sha512-xoQm2lvXbCA9Kd7SCx6y713Y7sZ6fUc5R6VYpoL5M6svKJbTuvtNopexK8sO8K4s0EOUYHuPN2+yAEsNyRggkQ==",
"requires": {
"immutable-tuple": "^0.4.9"
}
},
"optimist": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
@@ -9885,6 +10245,27 @@
"scheduler": "^0.13.6"
}
},
"react-apollo": {
"version": "2.5.5",
"resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.5.5.tgz",
"integrity": "sha512-zoJYlkI3i7+f1ejCbFtWU2GLCxjrmB3Es6RANyEZcbl0yetf5TI6ofMjBzILTvwoqp6tiQHH/8q66vQF0KcLmQ==",
"requires": {
"apollo-utilities": "^1.2.1",
"hoist-non-react-statics": "^3.3.0",
"lodash.isequal": "^4.5.0",
"prop-types": "^15.7.2",
"ts-invariant": "^0.4.0",
"tslib": "^1.9.3"
}
},
"react-apollo-hooks": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/react-apollo-hooks/-/react-apollo-hooks-0.4.5.tgz",
"integrity": "sha512-fq04h88hg4ONtlzxYInmv7Okqqstzk3UCp55jHWOlIO2lFKoZPhQrtCz7A+TrcRu8GGwtG1SsioRKN8kIQaAOQ==",
"requires": {
"lodash": "^4.17.11"
}
},
"react-app-polyfill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.0.tgz",
@@ -9996,6 +10377,52 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
"integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA=="
},
"react-router": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.0.tgz",
"integrity": "sha512-6EQDakGdLG/it2x9EaCt9ZpEEPxnd0OCLBHQ1AcITAAx7nCnyvnzf76jKWG1s2/oJ7SSviUgfWHofdYljFexsA==",
"requires": {
"@babel/runtime": "^7.1.2",
"create-react-context": "^0.2.2",
"history": "^4.9.0",
"hoist-non-react-statics": "^3.1.0",
"loose-envify": "^1.3.1",
"path-to-regexp": "^1.7.0",
"prop-types": "^15.6.2",
"react-is": "^16.6.0",
"tiny-invariant": "^1.0.2",
"tiny-warning": "^1.0.0"
},
"dependencies": {
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"path-to-regexp": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
"integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
"requires": {
"isarray": "0.0.1"
}
}
}
},
"react-router-dom": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.0.0.tgz",
"integrity": "sha512-wSpja5g9kh5dIteZT3tUoggjnsa+TPFHSMrpHXMpFsaHhQkm/JNVGh2jiF9Dkh4+duj4MKCkwO6H08u6inZYgQ==",
"requires": {
"@babel/runtime": "^7.1.2",
"history": "^4.9.0",
"loose-envify": "^1.3.1",
"prop-types": "^15.6.2",
"react-router": "5.0.0",
"tiny-invariant": "^1.0.2",
"tiny-warning": "^1.0.0"
}
},
"react-scripts": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.0.0.tgz",
@@ -10380,6 +10807,11 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
"integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
},
"resolve-pathname": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz",
"integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg=="
},
"resolve-url": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
@@ -10595,6 +11027,21 @@
"node-forge": "0.7.5"
}
},
"semantic-ui-react": {
"version": "0.86.0",
"resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.86.0.tgz",
"integrity": "sha512-t/psK15zX9bEaezpRDwoXAZovp+I083SgsicAnMig/mxqaRI2FHZpr/G+lfzizrTpmYjgi4/Th6/QAol8pa7JQ==",
"requires": {
"@babel/runtime": "^7.1.2",
"@semantic-ui-react/event-stack": "^3.1.0",
"classnames": "^2.2.6",
"keyboard-key": "^1.0.4",
"lodash": "^4.17.11",
"prop-types": "^15.6.2",
"react-is": "^16.7.0",
"shallowequal": "^1.1.0"
}
},
"semver": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz",
@@ -10761,6 +11208,11 @@
}
}
},
"shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
},
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -11329,6 +11781,11 @@
"util.promisify": "~1.0.0"
}
},
"symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
},
"symbol-tree": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
@@ -11467,6 +11924,16 @@
"resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
"integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
},
"tiny-invariant": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.4.tgz",
"integrity": "sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g=="
},
"tiny-warning": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz",
"integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q=="
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -11553,6 +12020,14 @@
"resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz",
"integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw=="
},
"ts-invariant": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.1.tgz",
"integrity": "sha512-fdL8AZinDiVKMsOI0cOWHLprS85LWy2p/eVSctVe6fpZF9BAvO59sQYMEWQ37yybBtlKU2zkmILYmy1jrOf6+g==",
"requires": {
"tslib": "^1.9.3"
}
},
"ts-pnp": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz",
@@ -11611,6 +12086,11 @@
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"ua-parser-js": {
"version": "0.7.19",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz",
"integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ=="
},
"uglify-js": {
"version": "3.4.10",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
@@ -11907,6 +12387,11 @@
"spdx-expression-parse": "^3.0.0"
}
},
"value-equal": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz",
"integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw=="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -12593,6 +13078,20 @@
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
},
"zen-observable": {
"version": "0.8.14",
"resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.14.tgz",
"integrity": "sha512-kQz39uonEjEESwh+qCi83kcC3rZJGh4mrZW7xjkSQYXkq//JZHTtKo+6yuVloTgMtzsIWOJrjIrKvk/dqm0L5g=="
},
"zen-observable-ts": {
"version": "0.8.18",
"resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.18.tgz",
"integrity": "sha512-q7d05s75Rn1j39U5Oapg3HI2wzriVwERVo4N7uFGpIYuHB9ff02P/E92P9B8T7QVC93jCMHpbXH7X0eVR5LA7A==",
"requires": {
"tslib": "^1.9.3",
"zen-observable": "^0.8.0"
}
}
}
}

View File

@@ -3,9 +3,18 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"apollo-boost": "^0.3.1",
"apollo-link": "^1.2.11",
"apollo-link-context": "^1.0.17",
"graphql": "^14.2.1",
"react": "^16.8.6",
"react-apollo": "^2.5.5",
"react-apollo-hooks": "^0.4.5",
"react-dom": "^16.8.6",
"react-scripts": "3.0.0"
"react-router": "^5.0.0",
"react-router-dom": "^5.0.0",
"react-scripts": "3.0.0",
"semantic-ui-react": "^0.86.0"
},
"scripts": {
"start": "react-scripts start",

View File

@@ -3,6 +3,10 @@
<head>
<meta charset="utf-8" />
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
<link
rel="stylesheet"
href="//cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css"
/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<!--

34
react-ui/src/App.js vendored
View File

@@ -1,26 +1,16 @@
import React from 'react';
import logo from './logo.svg';
import './App.css';
import React from 'react'
import { Container } from 'semantic-ui-react'
function App() {
import WeaponLeaderboardSelector from './components/WeaponLeaderboardSelector'
const App = () => {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
<Container>
<div>
<WeaponLeaderboardSelector />
</div>
</Container>
)
}
export default App;
export default App

View File

@@ -0,0 +1,41 @@
import React from 'react'
import { Table, Icon } from 'semantic-ui-react'
import { useQuery } from 'react-apollo-hooks'
import { Loader } from 'semantic-ui-react'
const WeaponLeaderboard = ({ query, queryName, scoreField }) => {
const result = useQuery(query)
if (result.loading) {
return <Loader active inline='centered' />
}
const leaderboard = result.data[queryName]
return (
<Table basic='very'>
<Table.Header>
<Table.Row>
<Table.HeaderCell></Table.HeaderCell>
<Table.HeaderCell>Name</Table.HeaderCell>
<Table.HeaderCell>Splatling Power ?</Table.HeaderCell>
<Table.HeaderCell>Weapons</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{leaderboard.map((player, index) =>
<Table.Row>
<Table.Cell>{index + 1}</Table.Cell>
<Table.Cell>{player.alias ? player.alias : player.name}
{player.twitter ? <Icon name="twitter"/> : null}</Table.Cell>
<Table.Cell>{player[scoreField]}</Table.Cell>
<Table.Cell>weapons</Table.Cell>
</Table.Row>
)}
</Table.Body>
</Table>
)
}
export default WeaponLeaderboard

View File

@@ -0,0 +1,130 @@
import React, { useState } from 'react'
import { Menu } from 'semantic-ui-react'
import WeaponLeaderboard from './WeaponLeaderboard'
import { topTotalPlayers } from '../graphql/queries/topPlayers'
import allIcon from './wpnIcons/all.png'
import blasterIcon from './wpnIcons/blasters.png'
import brellaIcon from './wpnIcons/brellas.png'
import chargerIcon from './wpnIcons/chargers.png'
import dualieIcon from './wpnIcons/dualies.png'
import flexIcon from './wpnIcons/flex.png'
import rollerIcon from './wpnIcons/rollers.png'
import shooterIcon from './wpnIcons/shooters.png'
import slosherIcon from './wpnIcons/sloshers.png'
import splatlingIcon from './wpnIcons/splatlings.png'
const WeaponLeaderboardSelector = () => {
const [activeItem, setActiveItem] = useState('all')
const wpnIcon = {
paddingBottom: "5px"
}
return (
<div>
<div className="ui centered grid">
<div className="center aligned column">
<Menu compact icon='labeled'>
<Menu.Item
name='all'
active={activeItem === 'all'}
onClick={() => setActiveItem('all')}
>
<img style={wpnIcon} src={allIcon} alt="All Icon"/>
All
</Menu.Item>
<Menu.Item
name='flex'
active={activeItem === 'flex'}
onClick={() => setActiveItem('flex')}
>
<img style={wpnIcon} src={flexIcon} alt="Flex Icon"/>
Flex
</Menu.Item>
<Menu.Item
name='shooters'
active={activeItem === 'shooters'}
onClick={() => setActiveItem('shooters')}
>
<img style={wpnIcon} src={shooterIcon} alt="Shooter Icon"/>
Shooters
</Menu.Item>
<Menu.Item
name='blasters'
active={activeItem === 'blasters'}
onClick={() => setActiveItem('blasters')}
>
<img style={wpnIcon} src={blasterIcon} alt="Blaster Icon"/>
Blasters
</Menu.Item>
<Menu.Item
name='rollers'
active={activeItem === 'rollers'}
onClick={() => setActiveItem('rollers')}
>
<img style={wpnIcon} src={rollerIcon} alt="Roller Icon"/>
Rollers
</Menu.Item>
<Menu.Item
name='chargers'
active={activeItem === 'chargers'}
onClick={() => setActiveItem('chargers')}
>
<img style={wpnIcon} src={chargerIcon} alt="Charger Icon"/>
Chargers
</Menu.Item>
<Menu.Item
name='splatlings'
active={activeItem === 'splatlings'}
onClick={() => setActiveItem('splatlings')}
>
<img style={wpnIcon} src={splatlingIcon} alt="Splatling Icon"/>
Splatlings
</Menu.Item>
<Menu.Item
name='sloshers'
active={activeItem === 'sloshers'}
onClick={() => setActiveItem('sloshers')}
>
<img style={wpnIcon} src={slosherIcon} alt="Slosher Icon"/>
Sloshers
</Menu.Item>
<Menu.Item
name='dualies'
active={activeItem === 'dualies'}
onClick={() => setActiveItem('dualies')}
>
<img style={wpnIcon} src={dualieIcon} alt="Dualie Icon"/>
Dualies
</Menu.Item>
<Menu.Item
name='brella'
active={activeItem === 'brella'}
onClick={() => setActiveItem('brella')}
>
<img style={wpnIcon} src={brellaIcon} alt="Brella Icon"/>
Brellas
</Menu.Item>
</Menu>
</div>
</div>
<WeaponLeaderboard
query={topTotalPlayers}
queryName="topTotalPlayers"
scoreField="topTotalScore"
/>
</div>
)
}
export default WeaponLeaderboardSelector

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,22 @@
import { gql } from 'apollo-boost'
export const topTotalPlayers = gql`
{
topTotalPlayers {
id
name
alias
twitter
topTotalScore
topTotal {
name
weapon
mode
x_power
rank
month
year
}
}
}
`

43
react-ui/src/index.js vendored
View File

@@ -1,12 +1,35 @@
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import { ApolloProvider } from 'react-apollo-hooks'
import { ApolloClient } from 'apollo-client'
import { createHttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { setContext } from 'apollo-link-context'
ReactDOM.render(<App />, document.getElementById('root'));
const httpLink = createHttpLink({
uri: 'http://localhost:4000/graphql',
})
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();
const authLink = setContext((_, { headers }) => {
const token = localStorage.getItem('user-token')
return {
headers: {
...headers,
authorization: token ? `bearer ${token}` : null,
}
}
})
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache()
})
ReactDOM.render(
<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById('root')
)