free agent feature done

This commit is contained in:
Sendou
2019-12-14 23:19:39 +02:00
parent 37c2039ca9
commit 2067b44610
13 changed files with 603 additions and 151 deletions

View File

@@ -95,6 +95,14 @@ const server = new ApolloServer({
twitch_name: "sendou",
twitter_name: "sendouc",
username: "Sendou",
weapons: [
"Tenta Brella",
"Range Blaster",
"Kensa Sloshing Machine",
"Custom Blaster",
],
country: "fi",
top500: true,
},
}
}

31
package-lock.json generated
View File

@@ -1556,9 +1556,9 @@
}
},
"mongoose": {
"version": "5.7.14",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.14.tgz",
"integrity": "sha512-fF+7+7Xl856VQRwRl1/pc/sL3eblWnaYO1K0Yp3d7v+53e5dMJDg3b1Iz61Fk1PBbJF2Z39yGyxakj59lLoj0w==",
"version": "5.8.1",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.8.1.tgz",
"integrity": "sha512-8Cffl52cMK2iBlpLipoRKW/RdrhkxvVzXsy+xVsfbKHQBCWkFiS0T0jU4smYzomTMP4gW0sReJoRA7Gu/7VVgQ==",
"requires": {
"bson": "~1.1.1",
"kareem": "2.3.1",
@@ -1647,9 +1647,9 @@
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
},
"nodemon": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.1.tgz",
"integrity": "sha512-UC6FVhNLXjbbV4UzaXA3wUdbEkUZzLGgMGzmxvWAex5nzib/jhcSHVFlQODdbuUHq8SnnZ4/EABBAbC3RplvPg==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz",
"integrity": "sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw==",
"dev": true,
"requires": {
"chokidar": "^3.2.2",
@@ -1776,9 +1776,9 @@
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"passport": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz",
"integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=",
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz",
"integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==",
"requires": {
"passport-strategy": "1.x.x",
"pause": "0.0.1"
@@ -2095,6 +2095,11 @@
"resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
"integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
},
"snekfetch": {
"version": "3.6.4",
"resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.6.4.tgz",
"integrity": "sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw=="
},
"sparse-bitfield": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
@@ -2352,6 +2357,14 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"webhook-discord": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/webhook-discord/-/webhook-discord-3.5.1.tgz",
"integrity": "sha512-kktwGzj9e/v7aBhtb9rN1ZZY0EADxQFX7a1p2v9tatrBBS21oh/xiKzDd3fk/NdxdSQ0eIErrL2bHbMfunJspA==",
"requires": {
"snekfetch": "^3.6.4"
}
},
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",

View File

@@ -22,13 +22,14 @@
"express-session": "^1.17.0",
"graphql": "^14.5.8",
"lodash": "^4.17.15",
"mongoose": "^5.7.14",
"mongoose": "^5.8.1",
"mongoose-unique-validator": "^2.0.3",
"node-fetch": "^2.6.0",
"passport": "^0.4.0",
"passport-discord": "^0.1.3"
"passport": "^0.4.1",
"passport-discord": "^0.1.3",
"webhook-discord": "^3.5.1"
},
"devDependencies": {
"nodemon": "^2.0.0"
"nodemon": "^2.0.2"
}
}

View File

@@ -1915,54 +1915,54 @@
}
},
"apollo-boost": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/apollo-boost/-/apollo-boost-0.4.4.tgz",
"integrity": "sha512-ASngBvazmp9xNxXfJ2InAzfDwz65o4lswlEPrWoN35scXmCz8Nz4k3CboUXbrcN/G0IExkRf/W7o9Rg0cjEBqg==",
"version": "0.4.7",
"resolved": "https://registry.npmjs.org/apollo-boost/-/apollo-boost-0.4.7.tgz",
"integrity": "sha512-jfc3aqO0vpCV+W662EOG5gq4AH94yIsvSgAUuDvS3o/Z+8Joqn4zGC9CgLCDHusK30mFgtsEgwEe0pZoedohsQ==",
"requires": {
"apollo-cache": "^1.3.2",
"apollo-cache-inmemory": "^1.6.3",
"apollo-client": "^2.6.4",
"apollo-cache": "^1.3.4",
"apollo-cache-inmemory": "^1.6.5",
"apollo-client": "^2.6.7",
"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.4.0",
"tslib": "^1.9.3"
"tslib": "^1.10.0"
}
},
"apollo-cache": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.2.tgz",
"integrity": "sha512-+KA685AV5ETEJfjZuviRTEImGA11uNBp/MJGnaCvkgr+BYRrGLruVKBv6WvyFod27WEB2sp7SsG8cNBKANhGLg==",
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.4.tgz",
"integrity": "sha512-7X5aGbqaOWYG+SSkCzJNHTz2ZKDcyRwtmvW4mGVLRqdQs+HxfXS4dUS2CcwrAj449se6tZ6NLUMnjko4KMt3KA==",
"requires": {
"apollo-utilities": "^1.3.2",
"tslib": "^1.9.3"
"apollo-utilities": "^1.3.3",
"tslib": "^1.10.0"
}
},
"apollo-cache-inmemory": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.3.tgz",
"integrity": "sha512-S4B/zQNSuYc0M/1Wq8dJDTIO9yRgU0ZwDGnmlqxGGmFombOZb9mLjylewSfQKmjNpciZ7iUIBbJ0mHlPJTzdXg==",
"version": "1.6.5",
"resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.5.tgz",
"integrity": "sha512-koB76JUDJaycfejHmrXBbWIN9pRKM0Z9CJGQcBzIOtmte1JhEBSuzsOUu7NQgiXKYI4iGoMREcnaWffsosZynA==",
"requires": {
"apollo-cache": "^1.3.2",
"apollo-utilities": "^1.3.2",
"apollo-cache": "^1.3.4",
"apollo-utilities": "^1.3.3",
"optimism": "^0.10.0",
"ts-invariant": "^0.4.0",
"tslib": "^1.9.3"
"tslib": "^1.10.0"
}
},
"apollo-client": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.4.tgz",
"integrity": "sha512-oWOwEOxQ9neHHVZrQhHDbI6bIibp9SHgxaLRVPoGvOFy7OH5XUykZE7hBQAVxq99tQjBzgytaZffQkeWo1B4VQ==",
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.8.tgz",
"integrity": "sha512-0zvJtAcONiozpa5z5zgou83iEKkBaXhhSSXJebFHRXs100SecDojyUWKjwTtBPn9HbM6o5xrvC5mo9VQ5fgAjw==",
"requires": {
"@types/zen-observable": "^0.8.0",
"apollo-cache": "1.3.2",
"apollo-cache": "1.3.4",
"apollo-link": "^1.0.0",
"apollo-utilities": "1.3.2",
"apollo-utilities": "1.3.3",
"symbol-observable": "^1.0.2",
"ts-invariant": "^0.4.0",
"tslib": "^1.9.3",
"tslib": "^1.10.0",
"zen-observable": "^0.8.0"
}
},
@@ -2008,14 +2008,14 @@
}
},
"apollo-utilities": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.2.tgz",
"integrity": "sha512-JWNHj8XChz7S4OZghV6yc9FNnzEXj285QYp/nLNh943iObycI5GTDO3NGR9Dth12LRrSFMeDOConPfPln+WGfg==",
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.3.tgz",
"integrity": "sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw==",
"requires": {
"@wry/equality": "^0.1.2",
"fast-json-stable-stringify": "^2.0.0",
"ts-invariant": "^0.4.0",
"tslib": "^1.9.3"
"tslib": "^1.10.0"
}
},
"aproba": {
@@ -2601,11 +2601,6 @@
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
"integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
},
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"bn.js": {
"version": "4.11.8",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
@@ -8837,23 +8832,6 @@
"minipass": "^3.0.0"
}
},
"mississippi": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
"integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
"requires": {
"concat-stream": "^1.5.0",
"duplexify": "^3.4.2",
"end-of-stream": "^1.1.0",
"flush-write-stream": "^1.0.0",
"from2": "^2.1.0",
"parallel-transform": "^1.1.0",
"pump": "^3.0.0",
"pumpify": "^1.3.3",
"stream-each": "^1.1.0",
"through2": "^2.0.0"
}
},
"mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
@@ -12763,9 +12741,9 @@
}
},
"stream-shift": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
"integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
},
"strict-uri-encode": {
"version": "1.1.0",
@@ -13755,6 +13733,30 @@
"ssri": "^6.0.1",
"unique-filename": "^1.1.1",
"y18n": "^4.0.0"
},
"dependencies": {
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"mississippi": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
"integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
"requires": {
"concat-stream": "^1.5.0",
"duplexify": "^3.4.2",
"end-of-stream": "^1.1.0",
"flush-write-stream": "^1.0.0",
"from2": "^2.1.0",
"parallel-transform": "^1.1.0",
"pump": "^3.0.0",
"pumpify": "^1.3.3",
"stream-each": "^1.1.0",
"through2": "^2.0.0"
}
}
}
},
"eslint-scope": {
@@ -13777,9 +13779,9 @@
}
},
"serialize-javascript": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
"integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A=="
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
"integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ=="
},
"source-map": {
"version": "0.6.1",
@@ -13795,19 +13797,29 @@
}
},
"terser-webpack-plugin": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz",
"integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==",
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz",
"integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==",
"requires": {
"cacache": "^12.0.2",
"find-cache-dir": "^2.1.0",
"is-wsl": "^1.1.0",
"schema-utils": "^1.0.0",
"serialize-javascript": "^1.7.0",
"serialize-javascript": "^2.1.2",
"source-map": "^0.6.1",
"terser": "^4.1.2",
"webpack-sources": "^1.4.0",
"worker-farm": "^1.7.0"
},
"dependencies": {
"worker-farm": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
"integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
"requires": {
"errno": "~0.1.7"
}
}
}
}
}
@@ -14306,14 +14318,6 @@
"workbox-core": "^4.3.1"
}
},
"worker-farm": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
"integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
"requires": {
"errno": "~0.1.7"
}
},
"worker-rpc": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz",
@@ -14477,9 +14481,9 @@
}
},
"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=="
"version": "0.8.15",
"resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
"integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
},
"zen-observable-ts": {
"version": "0.8.20",

View File

@@ -5,7 +5,7 @@
"dependencies": {
"@apollo/react-hooks": "^3.1.3",
"@sendou/react-sketch": "^0.5.2",
"apollo-boost": "^0.4.4",
"apollo-boost": "^0.4.7",
"graphql": "^14.5.8",
"jstz": "^2.1.1",
"react": "^16.12.0",

View File

@@ -2,17 +2,18 @@ import React from "react"
import { TextArea } from "semantic-ui-react"
const TextAreaWithLimit = ({ value, setValue, limit, style = {} }) => {
const inputLength = value ? value.length : 0
return (
<>
<TextArea
value={value}
value={value ?? ""}
onChange={e =>
e.target.value.length <= limit && setValue(e.target.value)
}
rows={5}
style={style}
/>
{value.length}/{limit}
{inputLength}/{limit}
</>
)
}

View File

@@ -9,16 +9,18 @@ const WeaponDropdown = ({
value,
onChange,
multiple = false,
clearable = false,
showImages = true,
nonMultiplePlaceholder = "Choose a weapon",
nonMultiplePlaceholder = "Choose weapon",
style = {},
}) => {
return (
<Dropdown
placeholder={multiple ? "Choose a comp" : nonMultiplePlaceholder}
placeholder={multiple ? "Choose comp" : nonMultiplePlaceholder}
search
selection
closeOnEscape
clearable={clearable}
multiple={multiple}
onChange={onChange}
value={value}

View File

@@ -188,7 +188,12 @@ const FAPostForm = ({
/>
</Form.Field>
<Form.Field>
<Button type="submit">Submit</Button>
<Button
type="submit"
disabled={!form.can_vc || form.playstyles.length === 0}
>
Submit
</Button>
<span style={{ marginLeft: "0.3em" }}>
<Button type="button" negative onClick={hideForm}>
Cancel

View File

@@ -1,19 +1,37 @@
import React, { useState } from "react"
import { useQuery, useMutation } from "@apollo/react-hooks"
import { Message, Button, Modal, Header, Dropdown } from "semantic-ui-react"
import {
Message,
Button,
Modal,
Header,
Dropdown,
Form,
Grid,
} from "semantic-ui-react"
import Loading from "../common/Loading"
import Error from "../common/Error"
import FreeAgentTable from "./FreeAgentTable"
import FAPostForm from "./FAPostForm"
import WeaponDropdown from "../common/WeaponDropdown"
import { continents } from "../../utils/lists"
import { freeAgentPosts } from "../../graphql/queries/freeAgentPosts"
import { userLean } from "../../graphql/queries/userLean"
import { hideFreeAgentPost } from "../../graphql/mutations/hideFreeAgentPost"
import useWindowDimensions from "../../hooks/useWindowDimensions"
const FreeAgentBrowser = () => {
const [successMsg, setSuccessMsg] = useState(null)
const [errorMsg, setErrorMsg] = useState(null)
const [showForm, setShowForm] = useState(false)
const [filter, setFilter] = useState({
weapon: "",
playstyle: "",
region: "",
})
const { containerWidth } = useWindowDimensions()
const {
data: postsData,
@@ -62,12 +80,7 @@ const FreeAgentBrowser = () => {
const millisecondsToHours = milliseconds =>
Math.ceil(milliseconds / (1000 * 60 * 60))
const freeAgentPostArray = postsData.freeAgentPosts.filter(
post => !post.hidden
)
const ButtonHeader = () => {
if (showForm) return null
if (!userData.user)
return <Message>Please log in to submit your own free agent post</Message>
@@ -93,91 +106,188 @@ const FreeAgentBrowser = () => {
: "New free agent post"
return (
<div style={{ float: "right" }}>
<Button.Group widths="1">
<Button onClick={() => setShowForm(true)}>{buttonText}</Button>
{ownFAPost && (
<span style={{ marginLeft: "0.3em" }}>
<Modal
basic
size="small"
closeIcon
trigger={<Button negative>Delete your post</Button>}
>
<Header
icon="trash alternate"
content="Delete your free agent post?"
/>
<Modal.Content>
<p>
Please note you can't submit a new one before a week has
passed.
</p>
</Modal.Content>
<Modal.Actions>
<Button
inverted
color="red"
onClick={() => hideFreeAgentPostMutation()}
>
Yes
</Button>
</Modal.Actions>
</Modal>
</span>
<Modal
basic
size="small"
closeIcon
trigger={<Button negative>Delete your post</Button>}
>
<Header
icon="trash alternate"
content="Delete your free agent post?"
/>
<Modal.Content>
<p>
Please note you can't submit a new one before a week has passed.
</p>
</Modal.Content>
<Modal.Actions>
<Button
inverted
color="red"
onClick={() => hideFreeAgentPostMutation()}
>
Yes
</Button>
</Modal.Actions>
</Modal>
)}
</div>
</Button.Group>
)
}
const FilterDropdowns = () => {
const playstyleOptions = [
{ key: "ALL", text: "all", value: "ALL" },
{ key: "FRONTLINE", text: "Frontline/Slayer", value: "FRONTLINE" },
{ key: "MIDLINE", text: "Midline/Support", value: "MIDLINE" },
{ key: "BACKLINE", text: "Backline/Anchor", value: "BACKLINE" },
]
const regionOptions = [
{ key: "EUROPE", text: "Europe", value: "EUROPE" },
{ key: "AMERICAS", text: "The Americas", value: "AMERICAS" },
{ key: "AU/NZ", text: "Oceania", value: "AU/NZ" },
{ key: "OTHER", text: "Other", value: "OTHER" },
]
return (
<>
Show posts by{" "}
<Dropdown
upward
floating
inline
options={playstyleOptions}
defaultValue="ALL"
/>{" "}
roles.
<Header>Filter free agents</Header>
<Form>
<Form.Field>
<label>Weapon</label>
<WeaponDropdown
clearable
value={filter.weapon}
onChange={(e, { value }) =>
setFilter({ ...filter, weapon: value })
}
/>
</Form.Field>
<Form.Field>
<label>Playstyle</label>
<Dropdown
options={playstyleOptions}
placeholder="Choose playstyle"
selection
closeOnEscape
clearable
value={filter.playstyle}
onChange={(e, { value }) =>
setFilter({ ...filter, playstyle: value })
}
style={{ width: "270px" }}
/>
</Form.Field>
<Form.Field>
<label>Region</label>
<Dropdown
options={regionOptions}
placeholder="Choose region"
selection
closeOnEscape
clearable
value={filter.region}
onChange={(e, { value }) =>
setFilter({ ...filter, region: value })
}
style={{ width: "270px" }}
/>
</Form.Field>
</Form>
</>
)
}
const NoPostsText = () => {
if (showForm) return null
if (
filter.weapon === "" &&
filter.playstyle === "" &&
filter.region === ""
) {
return <>No free agents at the moment. Be the first one!</>
}
return <>No free agents found matching the criteria.</>
}
const freeAgentPostArray = postsData.freeAgentPosts.filter(post => {
if (post.hidden) return false
if (filter.weapon) {
if (post.discord_user.weapons.indexOf(filter.weapon) === -1) return false
}
if (filter.playstyle) {
if (post.playstyles.indexOf(filter.playstyle) === -1) return false
}
if (filter.region) {
if (!post.discord_user.country) {
if (filter.region === "OTHER") return true
return false
}
const continentCode = continents[post.discord_user.country]
if (filter.region === "EUROPE" && continentCode !== "EU") return false
else if (
filter.region === "AMERICAS" &&
continentCode !== "NA" &&
continentCode !== "SA"
)
return false
else if (filter.region === "AU/NZ" && continentCode !== "OC") return false
else if (
filter.region === "OTHER" &&
continentCode !== "AF" &&
continentCode !== "AN" &&
continentCode !== "AS" &&
continentCode !== "OC"
)
return false
}
return true
})
return (
<>
{successMsg && <Message success>{successMsg}</Message>}
{errorMsg && <Message error>{errorMsg}</Message>}
<ButtonHeader />
{showForm && (
{showForm ? (
<FAPostForm
handleSuccess={handleSuccess}
handleError={handleError}
hideForm={() => setShowForm(false)}
existingFAPost={ownFAPost}
/>
) : (
<Grid stackable>
<Grid.Column floated={"left"} width={8}>
{!showForm && <FilterDropdowns />}
</Grid.Column>
<Grid.Column
floated={containerWidth < 723 ? null : "right"}
width={8}
>
<ButtonHeader />
</Grid.Column>
</Grid>
)}
<>
{freeAgentPostArray.length > 0 ? (
<>
<FilterDropdowns />
{/*<FreeAgentTable FAArray={freeAgentPostArray} />*/}
<div style={{ marginTop: "1em" }}>
<FreeAgentTable
FAArray={Array(100).fill(freeAgentPostArray[0])}
/>
</div>
</>
) : (
<>No free agents at the moment. Be the first one!</>
)}
<div style={{ marginTop: "2em" }}>
{freeAgentPostArray.length > 0 ? (
<FreeAgentTable FAArray={freeAgentPostArray} />
) : (
<NoPostsText />
)}
</div>
</>
</>
)

View File

@@ -240,6 +240,248 @@ export const countries = [
{ code: "zw", name: "Zimbabwe" },
]
export const continents = {
af: "AS",
ax: "EU",
al: "EU",
dz: "AF",
as: "OC",
ad: "EU",
ao: "AF",
ai: "NA",
ag: "NA",
ar: "SA",
am: "AS",
aw: "NA",
au: "OC",
at: "EU",
az: "AS",
bs: "NA",
bh: "AS",
bd: "AS",
bb: "NA",
by: "EU",
be: "EU",
bz: "NA",
bj: "AF",
bm: "NA",
bt: "AS",
bo: "SA",
ba: "EU",
bw: "AF",
bv: "AN",
br: "SA",
io: "AS",
bn: "AS",
bg: "EU",
bf: "AF",
bi: "AF",
kh: "AS",
cm: "AF",
ca: "NA",
cv: "AF",
ky: "NA",
cf: "AF",
td: "AF",
cl: "SA",
cn: "AS",
cx: "AS",
cc: "AS",
co: "SA",
km: "AF",
cg: "AF",
cd: "AF",
ck: "OC",
cr: "NA",
ci: "AF",
hr: "EU",
cu: "NA",
cy: "EU",
cz: "EU",
dk: "EU",
dj: "AF",
dm: "NA",
do: "NA",
ec: "SA",
eg: "AF",
sv: "NA",
gq: "AF",
er: "AF",
ee: "EU",
et: "AF",
fk: "SA",
fo: "EU",
fj: "OC",
fi: "EU",
fr: "EU",
gf: "SA",
pf: "OC",
tf: "AN",
ga: "AF",
gm: "AF",
ge: "AS",
de: "EU",
gh: "AF",
gi: "EU",
gr: "EU",
gl: "NA",
gd: "NA",
gp: "NA",
gu: "OC",
gt: "NA",
gn: "AF",
gw: "AF",
gy: "SA",
ht: "NA",
hm: "AN",
va: "EU",
hn: "NA",
hk: "AS",
hu: "EU",
is: "EU",
in: "AS",
id: "AS",
ir: "AS",
iq: "AS",
ie: "EU",
il: "AS",
it: "EU",
jm: "NA",
jp: "AS",
jo: "AS",
kz: "AS",
ke: "AF",
ki: "OC",
kp: "AS",
kr: "AS",
kw: "AS",
kg: "AS",
la: "AS",
lv: "EU",
lb: "AS",
ls: "AF",
lr: "AF",
ly: "AF",
li: "EU",
lt: "EU",
lu: "EU",
mo: "AS",
mk: "EU",
mg: "AF",
mw: "AF",
my: "AS",
mv: "AS",
ml: "AF",
mt: "EU",
mh: "OC",
mq: "NA",
mr: "AF",
mu: "AF",
yt: "AF",
mx: "NA",
fm: "OC",
md: "EU",
mc: "EU",
mn: "AS",
me: "EU",
ms: "NA",
ma: "AF",
mz: "AF",
mm: "AS",
na: "AF",
nr: "OC",
np: "AS",
nl: "EU",
nc: "OC",
nz: "OC",
ni: "NA",
ne: "AF",
ng: "AF",
nu: "OC",
nf: "OC",
mp: "OC",
no: "EU",
om: "AS",
pk: "AS",
pw: "OC",
ps: "AS",
pa: "NA",
pg: "OC",
py: "SA",
pe: "SA",
ph: "AS",
pn: "OC",
pl: "EU",
pt: "EU",
pr: "NA",
qa: "AS",
re: "AF",
ro: "EU",
ru: "EU",
rw: "AF",
sh: "AF",
kn: "NA",
lc: "NA",
pm: "NA",
vc: "NA",
ws: "OC",
sm: "EU",
st: "AF",
sa: "AS",
sn: "AF",
rs: "EU",
sc: "AF",
sl: "AF",
sg: "AS",
sk: "EU",
si: "EU",
sb: "OC",
so: "AF",
za: "AF",
gs: "AN",
es: "EU",
lk: "AS",
sd: "AF",
sr: "SA",
sj: "EU",
sz: "AF",
se: "EU",
ch: "EU",
sy: "AS",
tw: "AS",
tj: "AS",
tz: "AF",
th: "AS",
tl: "OC",
tg: "AF",
tk: "OC",
to: "OC",
tt: "NA",
tn: "AF",
tr: "AS",
tm: "AS",
tc: "NA",
tv: "OC",
ug: "AF",
ua: "EU",
ae: "AS",
gb: "EU",
us: "NA",
um: "OC",
uy: "SA",
uz: "AS",
vu: "OC",
ve: "SA",
vn: "AS",
vg: "NA",
vi: "NA",
wf: "OC",
eh: "AF",
ye: "AS",
zm: "AF",
zw: "AF",
}
export const modes = [
"",
"Splat Zones",

View File

@@ -1,5 +1,6 @@
const { UserInputError, gql } = require("apollo-server-express")
const FAPost = require("../models/fapost")
const sendFAPostToDiscord = require("../utils/webhook")
const canVCValues = ["YES", "USUALLY", "SOMETIMES", "NO"]
const playstyleValues = ["FRONTLINE", "MIDLINE", "BACKLINE"]
@@ -149,6 +150,13 @@ const resolvers = {
})
})
args.user = ctx.user
try {
await sendFAPostToDiscord(args)
} catch (error) {
throw new UserInputError(error.error)
}
return true
},
updateFreeAgentPost: async (root, args, ctx) => {

View File

@@ -177,6 +177,7 @@ maps = [
abilities = {
"": None,
"-": None,
"Last-Ditch Effort": "LDE",
"Last Ditch Effort": "LDE",
"Ink Saver (Sub)": "ISS",

57
utils/webhook.js Normal file
View File

@@ -0,0 +1,57 @@
const webhook = require("webhook-discord")
function sendFAPostToDiscord(args) {
const Hook = new webhook.Webhook(process.env.FA_WEBHOOK_URL)
const msg = new webhook.MessageBuilder()
.setName(args.user.username)
.setColor("#2c5364")
.addField("", `<@${args.user.discord_id}>`)
if (args.can_vc) {
const can_vc = args.can_vc.toLowerCase()
msg.addField("Voice Chat", can_vc[0].toUpperCase() + can_vc.slice(1))
}
if (args.playstyles) {
msg.addField(
"Playstyle",
args.playstyles.map(playstyle => playstyle.toLowerCase()).join(", ")
)
}
if (args.user.weapons) {
msg.addField("Weapons", args.user.weapons.join(", "))
}
if (args.past_experience) {
msg.addField("Past experience", args.past_experience)
}
if (args.activity) {
msg.addField("Activity", args.activity)
}
if (args.looking_for) {
msg.addField("Looking for", args.looking_for)
}
if (args.description) {
msg.addField("Description", args.description)
}
if (args.user.twitter_name) {
msg.setAvatar(`https://avatars.io/twitter/${args.user.twitter_name}`)
}
if (args.user.country) {
msg.setText(
`:flag_${args.user.country}:${args.user.top500 &&
" <:top500:594551830764191763>"}`
)
}
return Hook.send(msg)
}
module.exports = sendFAPostToDiscord