From f06256d97e777f1ffe60ad02e3af812ab1c7751b Mon Sep 17 00:00:00 2001
From: MeowcaTheoRange
Date: Sun, 24 Sep 2023 19:32:20 -0500
Subject: [PATCH] Optimize for Vercel, do some changes, entire site
---
package-lock.json | 877 ++++++++++
package.json | 2 +
src/components/Ads/Ads.tsx | 17 +-
src/components/Box/Box.module.css | 4 +
src/components/Box/Box.tsx | 6 +-
src/components/Box/types.tsx | 17 +-
src/components/Nav/Nav.module.css | 2 +
src/components/Nav/Nav.tsx | 32 +-
.../cards/ClanCard/ClanCard.module.css | 8 +-
src/components/cards/ClanCard/ClanCard.tsx | 26 +-
.../cards/ClanCard/ClanSkeleton.tsx | 15 +-
.../cards/FlairCard/FlairCard.module.css | 4 +
src/components/cards/FlairCard/FlairCard.tsx | 27 +-
.../cards/SignCard/SignCard.module.css | 11 +
.../cards/SignCard/SignSkeleton.tsx | 12 +-
src/components/cards/TrollCard/TrollCard.tsx | 104 +-
.../cards/TrollCard/TrollSkeleton.tsx | 35 +-
.../form/ErrorHandler/ErrorHandler.tsx | 49 +
src/components/form/template/.prettierrc | 18 +
src/components/form/template/clan.tsx | 730 +++++++++
src/components/form/template/troll.tsx | 1453 +++++++++++++++++
src/components/template/credits.tsx | 90 +
.../template/not-signed-in-clan.tsx | 18 +
src/components/template/not-signed-in.tsx | 24 +
src/components/template/too-signed-in.tsx | 18 +
src/lib/db/mongodb.ts | 2 +
src/lib/trollcall/api/clan.ts | 13 +-
src/lib/trollcall/api/troll.ts | 13 +-
src/lib/trollcall/convert/clan.ts | 7 +
src/lib/trollcall/convert/troll.ts | 23 +-
src/pages/_app.tsx | 112 +-
src/pages/add/clan/index.tsx | 36 +
src/pages/add/troll/index.tsx | 39 +
src/pages/api/clan/.../[[...page]]/index.ts | 15 +-
src/pages/api/clan/[clan]/index.ts | 13 +-
src/pages/api/clan/index.ts | 19 +-
src/pages/api/convert/index.ts | 143 ++
src/pages/api/test/signin/index.ts | 46 +
src/pages/api/troll/.../[[...page]]/index.ts | 13 +-
.../api/troll/[clan]/.../[[...page]]/index.ts | 13 +-
src/pages/api/troll/[clan]/[troll]/index.ts | 1 +
src/pages/clan/[clan]/index.tsx | 61 +-
src/pages/clan/s/index.tsx | 76 +
src/pages/edit/clan/[clan]/index.tsx | 65 +
src/pages/edit/troll/[clan]/[troll]/index.tsx | 77 +
src/pages/help/credits/index.tsx | 76 +-
src/pages/hiveswap/aspects/[name]/index.tsx | 4 +-
src/pages/hiveswap/aspects/index.tsx | 2 +-
src/pages/hiveswap/colors/[name]/index.tsx | 4 +-
src/pages/hiveswap/colors/index.tsx | 2 +-
src/pages/hiveswap/index.tsx | 4 +-
src/pages/hiveswap/sway/[name]/index.tsx | 4 +-
src/pages/hiveswap/sway/index.tsx | 2 +-
src/pages/hiveswap/truesigns/[name]/index.tsx | 4 +-
src/pages/hiveswap/truesigns/index.tsx | 2 +-
src/pages/index.tsx | 40 +-
src/pages/manage/index.module.css | 9 +
src/pages/manage/index.tsx | 145 ++
src/pages/test/index.tsx | 99 +-
.../troll/[clan]/[troll]/gallery/index.tsx | 15 +
src/pages/troll/[clan]/[troll]/index.tsx | 125 +-
.../troll/[clan]/[troll]/quirk/index.tsx | 15 +
src/pages/troll/s/[clan]/index.tsx | 110 ++
src/pages/troll/s/index.tsx | 76 +
src/styles/_app.css | 2 +
src/styles/global.module.css | 42 +-
src/styles/global_form.module.css | 152 ++
src/styles/global_skeleton.module.css | 271 ++-
src/types/client/clan.ts | 9 +-
src/types/client/quirks.ts | 8 +-
src/types/client/troll.ts | 132 +-
src/types/generics.ts | 9 +-
src/utility/language.ts | 67 +-
src/utility/react/Themer.tsx | 12 +-
74 files changed, 5243 insertions(+), 585 deletions(-)
create mode 100644 src/components/form/ErrorHandler/ErrorHandler.tsx
create mode 100644 src/components/form/template/.prettierrc
create mode 100644 src/components/form/template/clan.tsx
create mode 100644 src/components/form/template/troll.tsx
create mode 100644 src/components/template/credits.tsx
create mode 100644 src/components/template/not-signed-in-clan.tsx
create mode 100644 src/components/template/not-signed-in.tsx
create mode 100644 src/components/template/too-signed-in.tsx
create mode 100644 src/pages/add/clan/index.tsx
create mode 100644 src/pages/add/troll/index.tsx
create mode 100644 src/pages/api/convert/index.ts
create mode 100644 src/pages/api/test/signin/index.ts
create mode 100644 src/pages/clan/s/index.tsx
create mode 100644 src/pages/edit/clan/[clan]/index.tsx
create mode 100644 src/pages/edit/troll/[clan]/[troll]/index.tsx
create mode 100644 src/pages/manage/index.module.css
create mode 100644 src/pages/manage/index.tsx
create mode 100644 src/pages/troll/[clan]/[troll]/gallery/index.tsx
create mode 100644 src/pages/troll/[clan]/[troll]/quirk/index.tsx
create mode 100644 src/pages/troll/s/[clan]/index.tsx
create mode 100644 src/pages/troll/s/index.tsx
create mode 100644 src/styles/global_form.module.css
diff --git a/package-lock.json b/package-lock.json
index 3c3e234..4d3e033 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,6 +20,7 @@
"crypto-js": "^4.1.1",
"dotenv": "^16.3.0",
"express": "^4.18.2",
+ "formik": "^2.4.4",
"lodash": "^4.17.21",
"mongodb": "^5.6.0",
"nanoid": "^3.3.6",
@@ -35,11 +36,21 @@
"@types/lodash": "^4.14.195",
"@types/node": "^20.3.1",
"concurrently": "^8.2.0",
+ "eslint": "^8.49.0",
"nodemon": "^2.0.22",
"tsc-alias": "^1.8.6",
"typescript": "^5.1.3"
}
},
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/@babel/runtime": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz",
@@ -52,6 +63,141 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz",
+ "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
+ "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.49.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz",
+ "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.11",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
+ "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
"node_modules/@mapbox/node-pre-gyp": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
@@ -443,6 +589,27 @@
"node": ">= 0.6"
}
},
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -475,6 +642,22 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -542,6 +725,12 @@
"node": ">=14.0.0"
}
},
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -666,6 +855,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/caniuse-lite": {
"version": "1.0.30001508",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz",
@@ -919,6 +1117,20 @@
"node": ">= 0.6"
}
},
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/crypto-js": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
@@ -954,6 +1166,20 @@
"ms": "^2.1.1"
}
},
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -996,6 +1222,18 @@
"node": ">=8"
}
},
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/dotenv": {
"version": "16.3.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.0.tgz",
@@ -1039,6 +1277,194 @@
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.49.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz",
+ "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.2",
+ "@eslint/js": "8.49.0",
+ "@humanwhocodes/config-array": "^0.11.11",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -1138,6 +1564,12 @@
"node": ">= 0.8"
}
},
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
"node_modules/fast-glob": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@@ -1154,6 +1586,18 @@
"node": ">=8.6.0"
}
},
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
"node_modules/fastq": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
@@ -1163,6 +1607,18 @@
"reusify": "^1.0.4"
}
},
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -1205,6 +1661,65 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz",
+ "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.7",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "node_modules/formik": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.4.tgz",
+ "integrity": "sha512-MV99upag7fCC3JfsI60WcxhymwNZnJUcMcnGuoz6mDf78SUfBbKjmfcA9LzHx4lEmjzmOflhP7oqz+ZQv5eStg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://opencollective.com/formik"
+ }
+ ],
+ "dependencies": {
+ "deepmerge": "^2.1.1",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "react-fast-compare": "^2.0.1",
+ "tiny-warning": "^1.0.2",
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -1345,6 +1860,33 @@
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
},
+ "node_modules/globals": {
+ "version": "13.21.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
+ "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globals/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
@@ -1370,6 +1912,12 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -1417,6 +1965,14 @@
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
},
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -1491,6 +2047,31 @@
"integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
"dev": true
},
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -1568,11 +2149,56 @@
"node": ">=0.12.0"
}
},
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -1584,11 +2210,59 @@
"node": ">=6"
}
},
+ "node_modules/keyv": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
+ "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -1849,6 +2523,12 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -2069,6 +2749,65 @@
"wrappy": "1"
}
},
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -2077,6 +2816,15 @@
"node": ">= 0.8"
}
},
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -2085,6 +2833,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -2148,6 +2905,15 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/property-expr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
@@ -2264,6 +3030,16 @@
"react": "^18.2.0"
}
},
+ "node_modules/react-fast-compare": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
+ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -2304,6 +3080,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -2473,6 +3258,27 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/shell-quote": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
@@ -2631,6 +3437,18 @@
"node": ">=4"
}
},
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/styled-jsx": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
@@ -2684,11 +3502,22 @@
"node": ">=10"
}
},
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
"node_modules/tiny-case": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
"integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="
},
+ "node_modules/tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2781,6 +3610,18 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz",
"integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w=="
},
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/type-fest": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
@@ -2831,6 +3672,15 @@
"node": ">= 0.8"
}
},
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -2884,6 +3734,21 @@
"node": ">=12"
}
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/wide-align": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
@@ -2955,6 +3820,18 @@
"node": ">=12"
}
},
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/yup": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/yup/-/yup-1.2.0.tgz",
diff --git a/package.json b/package.json
index c516b66..2238852 100644
--- a/package.json
+++ b/package.json
@@ -5,6 +5,7 @@
"@types/lodash": "^4.14.195",
"@types/node": "^20.3.1",
"concurrently": "^8.2.0",
+ "eslint": "^8.49.0",
"nodemon": "^2.0.22",
"tsc-alias": "^1.8.6",
"typescript": "^5.1.3"
@@ -34,6 +35,7 @@
"crypto-js": "^4.1.1",
"dotenv": "^16.3.0",
"express": "^4.18.2",
+ "formik": "^2.4.4",
"lodash": "^4.17.21",
"mongodb": "^5.6.0",
"nanoid": "^3.3.6",
diff --git a/src/components/Ads/Ads.tsx b/src/components/Ads/Ads.tsx
index 490f7df..22934e9 100644
--- a/src/components/Ads/Ads.tsx
+++ b/src/components/Ads/Ads.tsx
@@ -1,28 +1,31 @@
import globals from "@/styles/global.module.css";
import Link from "next/link";
-import { useEffect, useState } from "react";
+import { useEffect, useRef, useState } from "react";
import styles from "./Ads.module.css";
export default function Ads() {
const [hide, setHide] = useState(false);
const [adService, setAdService] = useState(0);
+ const int = useRef();
useEffect(() => {
setHide(window.localStorage.getItem("hideAds") === "true");
setAdService(Math.random());
- setInterval(() => setAdService(Math.random()), 60000);
+ clearInterval(int.current);
+ int.current = setInterval(() => setAdService(Math.random()), 60000);
}, []);
+ // Fix "partitioned storage access" on Firefox
return !hide ? (
{adService < 0.2 ? (
) : adService < 0.4 ? (
) : adService < 0.8 ? (
)}
diff --git a/src/components/Box/Box.module.css b/src/components/Box/Box.module.css
index 13e4c52..b546c4b 100644
--- a/src/components/Box/Box.module.css
+++ b/src/components/Box/Box.module.css
@@ -23,6 +23,10 @@
max-width: 100%;
}
+.Box.ltr {
+ direction: ltr;
+}
+
.Box .innerContent {
padding: 6px 4px;
display: inline-flex;
diff --git a/src/components/Box/Box.tsx b/src/components/Box/Box.tsx
index 7c3c318..3100faa 100644
--- a/src/components/Box/Box.tsx
+++ b/src/components/Box/Box.tsx
@@ -29,7 +29,11 @@ export default function Box({
) as React.CSSProperties;
return (
diff --git a/src/components/Box/types.tsx b/src/components/Box/types.tsx
index 79b6cd5..327fcfd 100644
--- a/src/components/Box/types.tsx
+++ b/src/components/Box/types.tsx
@@ -1,12 +1,13 @@
import { Color3 } from "@/types/assist/color";
export type BoxConfig = {
- title?: {
- text: string;
- link?: string;
- small?: boolean;
- };
- theme?: Color3;
- nfw?: boolean;
- class?: string;
+ title?: {
+ text: string;
+ link?: string;
+ small?: boolean;
+ };
+ theme?: Color3;
+ nfw?: boolean;
+ ltr?: boolean;
+ class?: string;
};
diff --git a/src/components/Nav/Nav.module.css b/src/components/Nav/Nav.module.css
index 92b19e1..9e3bc61 100644
--- a/src/components/Nav/Nav.module.css
+++ b/src/components/Nav/Nav.module.css
@@ -27,6 +27,7 @@
text-align: center;
width: 100%;
gap: 16px;
+ flex: 2 1;
}
.Nav .right {
@@ -37,6 +38,7 @@
text-align: center;
width: 100%;
gap: 16px;
+ flex: 0.5 1;
}
.Nav .titlePath {
diff --git a/src/components/Nav/Nav.tsx b/src/components/Nav/Nav.tsx
index 8c46bce..7bfbb3f 100644
--- a/src/components/Nav/Nav.tsx
+++ b/src/components/Nav/Nav.tsx
@@ -23,6 +23,7 @@ export default function Nav(elementProps: AnyObject) {
href="/"
>
TrollCall
+ r4 Beta
@@ -30,10 +31,18 @@ export default function Nav(elementProps: AnyObject) {
className={globals.link}
href="/"
>
- TC
+ TC Beta
+
+
+ bug_report
+
+
logout
@@ -90,7 +99,24 @@ export default function Nav(elementProps: AnyObject) {
>
) : (
- <>>
+ <>
+
+
+ group_add
+
+
+
+
+ login
+
+
+ >
)}
diff --git a/src/components/cards/ClanCard/ClanCard.module.css b/src/components/cards/ClanCard/ClanCard.module.css
index 9bb0230..150ab97 100644
--- a/src/components/cards/ClanCard/ClanCard.module.css
+++ b/src/components/cards/ClanCard/ClanCard.module.css
@@ -28,9 +28,9 @@
.ClanCard .horizontal {
display: grid;
grid-template-columns: auto auto;
- justify-content: center;
+ justify-content: start;
gap: 16px;
- padding: 8px;
+ padding: 8px 8px;
box-sizing: border-box;
}
@@ -58,12 +58,12 @@
display: flex;
flex-direction: column;
gap: 4px;
- overflow: hidden;
+ /* overflow: hidden; */
width: 100%;
}
.ClanCard .horizontal .horizontalRight > * {
width: 100%;
text-overflow: ellipsis;
- overflow: hidden;
+ /* overflow: hidden; */
}
diff --git a/src/components/cards/ClanCard/ClanCard.tsx b/src/components/cards/ClanCard/ClanCard.tsx
index f9e49bc..4f70070 100644
--- a/src/components/cards/ClanCard/ClanCard.tsx
+++ b/src/components/cards/ClanCard/ClanCard.tsx
@@ -61,11 +61,13 @@ export default function ClanCard({
{clan.displayName ?? clan.name}
-
- {clan.flairs.map(flair => (
-
- ))}
-
+
+
+ {clan.flairs?.map(flair => (
+
+ ))}
+
+
group
@@ -93,10 +95,16 @@ export default function ClanCard({
-
- description
- {clan.description}
-
+ 0}>
+
+
+ description
+
+
+ {clan.description}
+
+
+
diff --git a/src/components/cards/ClanCard/ClanSkeleton.tsx b/src/components/cards/ClanCard/ClanSkeleton.tsx
index 8cf6092..469b0f6 100644
--- a/src/components/cards/ClanCard/ClanSkeleton.tsx
+++ b/src/components/cards/ClanCard/ClanSkeleton.tsx
@@ -14,29 +14,22 @@ export default function ClanSkeleton() {
-
- fjfjfjf fjf fjfjfjfjfjfj fj fj fjfjfj
-
+
Epic Megagames
group
- jjffjf j f fjfjfjfjjjjff jffff
+ Tim Sweeney (88/12)
link
- https://fjfjfjfjfjfjfjfjfjfjf.fjf/fjfjfjfj
+ https://trollcall.xyz/
description
-
- ffffffffffffffffffjjjfjf fj j jjffjf
- jfjfjfjfjfjjfffjffjjjjfjfjffjfjj ffjfjf fj j fj
- fjfjjfjfj jjffjjjfjfjfjfjfjjfj fj fj jf jf jf jf
- fjjfjffjfjfj fjffjf fjfj
-
+ Tim Sweeney
diff --git a/src/components/cards/FlairCard/FlairCard.module.css b/src/components/cards/FlairCard/FlairCard.module.css
index 988a65e..5833f9a 100644
--- a/src/components/cards/FlairCard/FlairCard.module.css
+++ b/src/components/cards/FlairCard/FlairCard.module.css
@@ -1,3 +1,7 @@
+.FlairLink {
+ text-decoration: none;
+}
+
.FlairCard {
background-color: var(--pri-bg);
color: var(--pri-fg);
diff --git a/src/components/cards/FlairCard/FlairCard.tsx b/src/components/cards/FlairCard/FlairCard.tsx
index 1174573..61fccac 100644
--- a/src/components/cards/FlairCard/FlairCard.tsx
+++ b/src/components/cards/FlairCard/FlairCard.tsx
@@ -1,7 +1,9 @@
/* eslint-disable @next/next/no-img-element */
import { Color3 } from "@/types/assist/color";
import { ClientFlair } from "@/types/flair";
+import { ConditionalParent } from "@/utility/react/Conditional";
import { ThemeModeContext } from "@/utility/react/Themer";
+import Link from "next/link";
import { useContext } from "react";
import styles from "./FlairCard.module.css";
@@ -20,12 +22,25 @@ export default function FlairCard({ flair }: { flair: ClientFlair }) {
}
) as React.CSSProperties;
return (
- (
+
+ {children}
+
+ )}
>
- {flair.name}
-
+
+ {flair.name}
+
+
);
}
diff --git a/src/components/cards/SignCard/SignCard.module.css b/src/components/cards/SignCard/SignCard.module.css
index 54bf4fb..726fd2a 100644
--- a/src/components/cards/SignCard/SignCard.module.css
+++ b/src/components/cards/SignCard/SignCard.module.css
@@ -31,3 +31,14 @@
drop-shadow(1px -1px 0 currentcolor)
drop-shadow(-1px 1px 0 currentcolor);
}
+.SignCard.Skeleton .topImagePlaceholder {
+ font-family: "Renogare", "Poppins", "Space Grotesk", "Fira Code",
+ "Courier New", monospace;
+ font-size: 52px;
+ width: 52px;
+ color: var(--pri-bg);
+ filter: drop-shadow(1px 1px 0 var(--pri-fg))
+ drop-shadow(-1px -1px 0 var(--pri-fg))
+ drop-shadow(1px -1px 0 var(--pri-fg))
+ drop-shadow(-1px 1px 0 var(--pri-fg));
+}
diff --git a/src/components/cards/SignCard/SignSkeleton.tsx b/src/components/cards/SignCard/SignSkeleton.tsx
index 19a5814..83d3a34 100644
--- a/src/components/cards/SignCard/SignSkeleton.tsx
+++ b/src/components/cards/SignCard/SignSkeleton.tsx
@@ -12,18 +12,12 @@ export default function SignSkeleton() {
}}
>
-
+
λ
-
jjjjfjfjffjfjjffj
+
half-life
- jjjfjfj
- +
- jjjfjfj
+ born.
diff --git a/src/components/cards/TrollCard/TrollCard.tsx b/src/components/cards/TrollCard/TrollCard.tsx
index 93e2866..8868a26 100644
--- a/src/components/cards/TrollCard/TrollCard.tsx
+++ b/src/components/cards/TrollCard/TrollCard.tsx
@@ -82,46 +82,69 @@ export default function TrollCard({
({troll.pronunciation.join(" ")})
-
- Also known as {troll.username} online.
-
-
- {troll.flairs.map(flair => (
-
- ))}
-
+
+
+ Also known as {troll.username} online.
+
+
+
+
+ {troll.flairs?.map(flair => (
+
+ ))}
+
+
-
-
-
- {troll.class?.name} of{" "}
- {troll.trueSign?.aspect.name}
-
- -
-
- {troll.gender}
- -
-
- {PronounGrouper(troll.pronouns)}
-
-
+
+
+
+
+ {troll.class?.name} of{" "}
+ {troll.trueSign?.aspect.name}
+
+ -
+
+
+
+ {troll.gender}
+
+
+
+ -
+
+
+
+ {troll.species}
+
+
+
+
- {AgeConverter(troll.age, true)}
+ {AgeConverter(troll.age)} old
-
{HeightConverter(troll.height)}
-
- -
-
- {troll.species}
-
-
+ -
+
+ {PronounGrouper(troll.pronouns)}
+
{" "}
-
+
{troll.facts?.map((fact, index) => (
{" "}
-
+
-
+
@@ -179,10 +209,12 @@ export default function TrollCard({
format_quote
- {parseQuirk(
- randomQuote,
- troll.quirks["default"]
- )}
+ {troll.quirks != null
+ ? parseQuirk(
+ randomQuote,
+ troll.quirks["default"]
+ )
+ : randomQuote}
diff --git a/src/components/cards/TrollCard/TrollSkeleton.tsx b/src/components/cards/TrollCard/TrollSkeleton.tsx
index 7a61e02..fc497f3 100644
--- a/src/components/cards/TrollCard/TrollSkeleton.tsx
+++ b/src/components/cards/TrollCard/TrollSkeleton.tsx
@@ -19,33 +19,30 @@ export default function TrollSkeleton() {
>
-
ffjfjf fjfjjj
-
(fjjjf-jjfj fjjfjf-fjffj)
+
GABBEN NEWELL
+
(gay-ben new-wul)
- Also known as ffjfjjfjjfjfjjjjjfjjf online.
+ Also known as gaben@valvesoftware.com online.
- fj
+ Lord of Sales
-
- ffjfj
+ Software
-
- fj/fjj/fjjjf
+ de/ck
- fj
+ All Time
-
- ffjfj
+ 30%
-
- fj/fjj/fjjjf
+ Steam
- fjjfjjfjffj
- fjjjjfjffjjfffjfj
-
- fjjjjffjjjfjjjfjjffjfjfj
-
+ Steam Summer Sale
+ Dota
@@ -56,20 +53,16 @@ export default function TrollSkeleton() {
thumb_up
-
- ffjj fjf jjffffjfjfj fjfjjfjfjjj
-
+ n < 3
thumb_down
-
- ffjjj fjjfjjf jf jj jjfjjjffj j fff
-
+ n >= 3
format_quote
- jjj fjjf jfjjjf f j ffff j f jjfj jf fj fjjjfj jfj
+ Hopefully, it would have been worth the wait.
diff --git a/src/components/form/ErrorHandler/ErrorHandler.tsx b/src/components/form/ErrorHandler/ErrorHandler.tsx
new file mode 100644
index 0000000..f695cd0
--- /dev/null
+++ b/src/components/form/ErrorHandler/ErrorHandler.tsx
@@ -0,0 +1,49 @@
+import globals from "@/styles/global.module.css";
+import form_globals from "@/styles/global_form.module.css";
+export default function ErrorHandler(error: any) {
+ console.log(error);
+ if (Array.isArray(error) && error.map)
+ return (
+
+ {error.map((errorChild, index) => (
+
+ ))}
+
+ );
+ else if (typeof error === "string")
+ return (
+
+ error Error:{" "}
+ {error.replace(
+ /\["?(\d+)"?\]/g,
+ (_: string, s1: string, __: any, ___: string) =>
+ " field #" + (+s1 + 1)
+ )}
+
+ );
+ else if (Array.isArray(error.error) && error.error.map)
+ return (
+
+ {error.error.map((errorChild: string, index: number) => (
+
+ ))}
+
+ );
+ else if (typeof error.error === "string")
+ return (
+
+ error Error:{" "}
+ {error.error.replace(
+ /\["?(\d+)"?\]/g,
+ (_: string, s1: string, __: any, ___: string) =>
+ " field #" + (+s1 + 1)
+ )}
+
+ );
+}
diff --git a/src/components/form/template/.prettierrc b/src/components/form/template/.prettierrc
new file mode 100644
index 0000000..0f21dee
--- /dev/null
+++ b/src/components/form/template/.prettierrc
@@ -0,0 +1,18 @@
+{
+ "_comment": "A custom .prettierrc file is here because Formik gets pretty intense.",
+ "trailingComma": "none",
+ "tabWidth": 4,
+ "useTabs": false,
+ "printWidth": 160,
+ "semi": true,
+ "singleQuote": false,
+ "quoteProps": "preserve",
+ "jsxSingleQuote": false,
+ "bracketSpacing": true,
+ "bracketSameLine": false,
+ "arrowParens": "avoid",
+ "proseWrap": "never",
+ "endOfLine": "lf",
+ "embeddedLanguageFormatting": "auto",
+ "singleAttributePerLine": true
+}
diff --git a/src/components/form/template/clan.tsx b/src/components/form/template/clan.tsx
new file mode 100644
index 0000000..1f4f32b
--- /dev/null
+++ b/src/components/form/template/clan.tsx
@@ -0,0 +1,730 @@
+import Box from "@/components/Box/Box";
+import ErrorHandler from "@/components/form/ErrorHandler/ErrorHandler";
+import globals from "@/styles/global.module.css";
+import form_globals from "@/styles/global_form.module.css";
+import { Color3 } from "@/types/assist/color";
+import { SubmitClan, SubmitClanSchema } from "@/types/client/clan";
+import { ArrayHelpers, ErrorMessage, Field, FieldArray, Form, Formik } from "formik";
+import { NextRouter } from "next/router";
+import { useState } from "react";
+
+export default function ClanFormTemplate({
+ router,
+ onSubmitURI,
+ on200URI,
+ initialValues,
+ method
+}: {
+ router: NextRouter;
+ initialValues?: SubmitClan;
+ onSubmitURI?: string;
+ on200URI?: string;
+ method?: string;
+}) {
+ const [submitError, setSubmitError] = useState("");
+ return (
+
{
+ fetch(onSubmitURI ?? "/api/clan", {
+ method: method ?? "POST",
+ body: JSON.stringify(values),
+ headers: {
+ "Accept": "application/json",
+ "Content-Type": "application/json"
+ }
+ }).then(res => {
+ if (res.status === 200) router.push(on200URI ?? `/clan/${values.name}`);
+ else setSubmitError(res.status.toString());
+ });
+ }}
+ >
+ {({ values, setFieldValue, errors, initialValues, isSubmitting, resetForm, submitForm }) => (
+
+ )}
+
+ );
+}
diff --git a/src/components/form/template/troll.tsx b/src/components/form/template/troll.tsx
new file mode 100644
index 0000000..a49358c
--- /dev/null
+++ b/src/components/form/template/troll.tsx
@@ -0,0 +1,1453 @@
+import Box from "@/components/Box/Box";
+import SignCard from "@/components/cards/SignCard/SignCard";
+import ErrorHandler from "@/components/form/ErrorHandler/ErrorHandler";
+import globals from "@/styles/global.module.css";
+import form_globals from "@/styles/global_form.module.css";
+import { Color3 } from "@/types/assist/color";
+import { ClassKeys, TrueSign, TrueSignKeys } from "@/types/assist/extended_zodiac";
+import { SubmitTroll, SubmitTrollSchema } from "@/types/client/troll";
+import { AgeConverter, HeightConverterImperial, HeightConverterMetric, PronounGrouper } from "@/utility/language";
+import { ArrayHelpers, ErrorMessage, Field, FieldArray, Form, Formik } from "formik";
+import { NextRouter } from "next/router";
+import { useState } from "react";
+
+export default function TrollFormTemplate({
+ router,
+ user,
+ onSubmitURI,
+ on200URI,
+ initialValues,
+ method
+}: {
+ router: NextRouter;
+ user: {
+ TROLLCALL_NAME: string;
+ TROLLCALL_CODE: string;
+ };
+ initialValues?: SubmitTroll;
+ onSubmitURI?: string;
+ on200URI?: string;
+ method?: string;
+}) {
+ const [submitError, setSubmitError] = useState("");
+ return (
+
{
+ fetch(onSubmitURI ?? "/api/troll", {
+ method: method ?? "POST",
+ body: JSON.stringify(values),
+ headers: {
+ "Accept": "application/json",
+ "Content-Type": "application/json"
+ }
+ }).then(res => {
+ if (res.status === 200) router.push(on200URI ?? `/troll/${user.TROLLCALL_NAME}/${values.name[0].toLowerCase()}`);
+ else setSubmitError(res.status.toString());
+ });
+ }}
+ >
+ {({ values, setFieldValue, errors, initialValues, isSubmitting, resetForm, submitForm }) => (
+
+ )}
+
+ );
+}
diff --git a/src/components/template/credits.tsx b/src/components/template/credits.tsx
new file mode 100644
index 0000000..b4aea73
--- /dev/null
+++ b/src/components/template/credits.tsx
@@ -0,0 +1,90 @@
+import globals from "@/styles/global.module.css";
+import Link from "next/link";
+
+export default function Credits() {
+ return (
+ <>
+
+ TrollCall rev. 4 created with ❤️ by MeowcaTheoRange using{" "}
+
+ Next.js
+ {" "}
+ (Pages Router).
+
+
+ trollcall.xyz domain owned by [person who is not me].
+
+
+ The TrollCall name is derived from the original Hiveswap Troll
+ Call. The name may be used in an entity context or a project
+ context.
+
+
+ The textboxes found in the [INSERT PAGE HERE] are inspired by
+ those from the game Celeste .
+
+
+
+
+ TrollCall Display
+ {" "}
+ font by MeowcaTheoRange.
+
+
+
+ Space Grotesk
+ {" "}
+ font by Florian Karsten.
+
+
+
+ Space Mono
+ {" "}
+ font by Colophon Foundry.
+
+
+
+ Poppins
+ {" "}
+ font by Indian Type Foundry.
+
+
+
+ Flow Circular
+ {" "}
+ font by Dan Ross.
+
+
+
+ Renogare
+ {" "}
+ font by Deepak Dogra.
+
+
+
+ Homestuck and HIVESWAP © Homestuck Inc.
+
+ >
+ );
+}
diff --git a/src/components/template/not-signed-in-clan.tsx b/src/components/template/not-signed-in-clan.tsx
new file mode 100644
index 0000000..bcd22eb
--- /dev/null
+++ b/src/components/template/not-signed-in-clan.tsx
@@ -0,0 +1,18 @@
+import globals from "@/styles/global.module.css";
+import Box from "../Box/Box";
+
+export default function NotSignedInClan({ clan }: { clan: string }) {
+ return (
+
+
+ You need to part of the {clan} clan to perform this action!
+
+
+ Join the {clan} clan
+
+
+ );
+}
diff --git a/src/components/template/not-signed-in.tsx b/src/components/template/not-signed-in.tsx
new file mode 100644
index 0000000..4837280
--- /dev/null
+++ b/src/components/template/not-signed-in.tsx
@@ -0,0 +1,24 @@
+import globals from "@/styles/global.module.css";
+import Box from "../Box/Box";
+
+export default function NotSignedIn() {
+ return (
+
+
+ You need to part a clan to perform this action!
+
+
+ Join a clan
+
+
+ Create a clan
+
+
+ );
+}
diff --git a/src/components/template/too-signed-in.tsx b/src/components/template/too-signed-in.tsx
new file mode 100644
index 0000000..772d141
--- /dev/null
+++ b/src/components/template/too-signed-in.tsx
@@ -0,0 +1,18 @@
+import globals from "@/styles/global.module.css";
+import Box from "../Box/Box";
+
+export default function TooSignedIn() {
+ return (
+
+
+ You can't be part a clan to perform this action!
+
+
+ Log out
+
+
+ );
+}
diff --git a/src/lib/db/mongodb.ts b/src/lib/db/mongodb.ts
index 75001f4..c052ca1 100644
--- a/src/lib/db/mongodb.ts
+++ b/src/lib/db/mongodb.ts
@@ -26,3 +26,5 @@ if (process.env.NODE_ENV === "development") {
}
export const mainDB = client.db(process.env.MONGODB_DATABASE_NAME);
+
+export const firstDB = client.db("trollcall");
diff --git a/src/lib/trollcall/api/clan.ts b/src/lib/trollcall/api/clan.ts
index 99f0c94..04e1112 100644
--- a/src/lib/trollcall/api/clan.ts
+++ b/src/lib/trollcall/api/clan.ts
@@ -17,11 +17,12 @@ export async function ClanGET(
: await getSingleClan(query);
if (clan == null) return null;
const serverClan = await ServerClanToClientClan({ ...clan });
- serverClan.flairs = cutArray(
- await getManyFlairs(
- { _id: { $in: clan.flairs } },
- ServerFlairToClientFlair
- )
- );
+ if (clan.flairs != null)
+ serverClan.flairs = cutArray(
+ await getManyFlairs(
+ { _id: { $in: clan.flairs } },
+ ServerFlairToClientFlair
+ )
+ );
return serverClan as ClientClan;
}
diff --git a/src/lib/trollcall/api/troll.ts b/src/lib/trollcall/api/troll.ts
index 99c1f45..42c7463 100644
--- a/src/lib/trollcall/api/troll.ts
+++ b/src/lib/trollcall/api/troll.ts
@@ -30,12 +30,13 @@ export async function TrollGET(
});
if (troll == null) return null;
const serverTroll = await ServerTrollToClientTroll(troll);
- serverTroll.flairs = cutArray(
- await getManyFlairs(
- { _id: { $in: troll.flairs } },
- ServerFlairToClientFlair
- )
- );
+ if (troll.flairs != null)
+ serverTroll.flairs = cutArray(
+ await getManyFlairs(
+ { _id: { $in: troll.flairs } },
+ ServerFlairToClientFlair
+ )
+ );
// we know this is not null, as we passed in our own clan
serverTroll.owner = (await ClanGET(null, clan)) as ClientClan;
return serverTroll as ClientTroll;
diff --git a/src/lib/trollcall/convert/clan.ts b/src/lib/trollcall/convert/clan.ts
index 61ef1b9..5739822 100644
--- a/src/lib/trollcall/convert/clan.ts
+++ b/src/lib/trollcall/convert/clan.ts
@@ -14,6 +14,13 @@ export async function ServerClanToClientClan(
return clientClan;
}
+export function ClientClanToSubmitClan(clientClan: ClientClan): SubmitClan {
+ let serverClan: SubmitClan = {
+ ...clientClan
+ };
+ return serverClan;
+}
+
export function SubmitClanToServerClan(
submitClan: Partial
): Omit, "_id"> {
diff --git a/src/lib/trollcall/convert/troll.ts b/src/lib/trollcall/convert/troll.ts
index f0d92fb..a953fb7 100644
--- a/src/lib/trollcall/convert/troll.ts
+++ b/src/lib/trollcall/convert/troll.ts
@@ -10,7 +10,10 @@ export async function ServerTrollToClientTroll(
let clientTroll: Partial = {
...sanitizedTroll,
- trueSign: TrueSign[serverTroll.trueSign],
+ trueSign:
+ serverTroll.trueSign != null
+ ? TrueSign[serverTroll.trueSign]
+ : null,
falseSign:
serverTroll.falseSign != null
? TrueSign[serverTroll.falseSign]
@@ -24,6 +27,24 @@ export async function ServerTrollToClientTroll(
return clientTroll;
}
+export function ClientTrollToSubmitTroll(
+ clientTroll: ClientTroll
+): SubmitTroll {
+ let submitTroll: SubmitTroll = {
+ ...clientTroll,
+ quirks: clientTroll.quirks
+ ? Object.entries(clientTroll.quirks)
+ : undefined,
+ trueSign: clientTroll.trueSign ? clientTroll.trueSign.name : undefined,
+ falseSign: clientTroll.falseSign
+ ? clientTroll.falseSign.name
+ : undefined,
+ class: clientTroll.class ? clientTroll.class.name : undefined
+ };
+
+ return submitTroll;
+}
+
export function SubmitTrollToServerTroll(
submitTroll: Partial
): Omit, "_id"> {
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index 1c40a5e..87b928e 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,48 +1,56 @@
import Ads from "@/components/Ads/Ads";
import Box from "@/components/Box/Box";
import Nav from "@/components/Nav/Nav";
+import Credits from "@/components/template/credits";
import "@/styles/_app.css";
import "@/styles/global.module.css";
import globals from "@/styles/global.module.css";
-import { Color3 } from "@/types/assist/color";
+import { ThemeGet, ThemeGetOpt } from "@/types/generics";
import AuthContext from "@/utility/react/AuthContext";
-import Themer, { ThemeModeContext } from "@/utility/react/Themer";
+import Themer, { ThemeModeContext, defaultTheme } from "@/utility/react/Themer";
import { getCookies } from "cookies-next";
import type { AppProps } from "next/app";
import Link from "next/link";
+import { useRouter } from "next/router";
import { useState } from "react";
export default function App({ Component, pageProps }: AppProps) {
- const [theme, setTheme] = useState([
- new Color3(0.9, 0.9, 0.8),
- new Color3(0.7, 0.7, 0.6),
- false
- ] as [Color3, Color3, boolean?]);
- const [width, setWidth] = useState(768);
+ const router = useRouter();
+ const [theme, setTheme] = useState(defaultTheme as ThemeGet);
+ function themeSetWrapper(themeSetter: ThemeGetOpt) {
+ setTheme([
+ themeSetter[0] ?? theme[0],
+ themeSetter[1] ?? theme[1],
+ themeSetter[2] ?? theme[2],
+ themeSetter[3] ?? theme[3]
+ ] as ThemeGet);
+ }
const cookies = getCookies() as {
TROLLCALL_NAME: string;
TROLLCALL_CODE: string;
};
+ // useEffect(() => {
+ // setTheme(defaultTheme);
+ // }, [router.asPath]);
return (
-
+
-
+
-
- TrollCall rev. 4 created by MeowcaTheoRange.
-
-
- trollcall.xyz domain owned by Redact.
-
-
- The TrollCall name is derived from the original
- Hiveswap Troll Call. The name may be used in an
- entity context or a project context.
-
-
- The textboxes found in the [INSERT PAGE HERE]
- are inspired by those from the game{" "}
- Celeste .
-
-
-
-
- TrollCall Display
- {" "}
- font by MeowcaTheoRange.
-
-
-
- Space Grotesk
- {" "}
- font by Florian Karsten.
-
-
-
- Space Mono
- {" "}
- font by Colophon Foundry.
-
-
-
- Poppins
- {" "}
- font by Indian Type Foundry.
-
-
-
- Flow Circular
- {" "}
- font by Dan Ross.
-
-
-
- Renogare
- {" "}
- font by Deepak Dogra.
-
-
-
- Homestuck and HIVESWAP © Homestuck Inc.
-
+
diff --git a/src/pages/add/clan/index.tsx b/src/pages/add/clan/index.tsx
new file mode 100644
index 0000000..26ec782
--- /dev/null
+++ b/src/pages/add/clan/index.tsx
@@ -0,0 +1,36 @@
+import Box from "@/components/Box/Box";
+import ClanFormTemplate from "@/components/form/template/clan";
+import TooSignedIn from "@/components/template/too-signed-in";
+import globals from "@/styles/global.module.css";
+import { ThemerGetSet } from "@/types/generics";
+import AuthContext from "@/utility/react/AuthContext";
+import { defaultTheme } from "@/utility/react/Themer";
+import { useRouter } from "next/router";
+import { useContext, useEffect, useState } from "react";
+
+export default function AddClan({
+ themerVars: [theme, setTheme]
+}: {
+ themerVars: ThemerGetSet;
+}) {
+ const userCredentials = useContext(AuthContext);
+ const router = useRouter();
+ // Prevent hydration error. Nav Auth section is a client-rendered element.
+ const [isClient, setIsClient] = useState(false);
+ useEffect(() => {
+ setIsClient(true);
+ setTheme(defaultTheme);
+ }, []);
+ return isClient && userCredentials.TROLLCALL_NAME == null ? (
+ <>
+
+
+ Create a clan to contribute to the site!
+
+
+
+ >
+ ) : (
+
+ );
+}
diff --git a/src/pages/add/troll/index.tsx b/src/pages/add/troll/index.tsx
new file mode 100644
index 0000000..8f523db
--- /dev/null
+++ b/src/pages/add/troll/index.tsx
@@ -0,0 +1,39 @@
+import Box from "@/components/Box/Box";
+import TrollFormTemplate from "@/components/form/template/troll";
+import NotSignedIn from "@/components/template/not-signed-in";
+import globals from "@/styles/global.module.css";
+import { ThemerGetSet } from "@/types/generics";
+import AuthContext from "@/utility/react/AuthContext";
+import { defaultTheme } from "@/utility/react/Themer";
+import { useRouter } from "next/router";
+import { useContext, useEffect, useState } from "react";
+
+export default function AddTroll({
+ themerVars: [theme, setTheme]
+}: {
+ themerVars: ThemerGetSet;
+}) {
+ const userCredentials = useContext(AuthContext);
+ const router = useRouter();
+ // Prevent hydration error. Nav Auth section is a client-rendered element.
+ const [isClient, setIsClient] = useState(false);
+ useEffect(() => {
+ setIsClient(true);
+ setTheme(defaultTheme);
+ }, []);
+ return isClient && userCredentials.TROLLCALL_NAME != null ? (
+ <>
+
+
+ Add one of your own to TrollCall.
+
+
+
+ >
+ ) : (
+
+ );
+}
diff --git a/src/pages/api/clan/.../[[...page]]/index.ts b/src/pages/api/clan/.../[[...page]]/index.ts
index f0eb7c4..1a590b9 100644
--- a/src/pages/api/clan/.../[[...page]]/index.ts
+++ b/src/pages/api/clan/.../[[...page]]/index.ts
@@ -1,9 +1,6 @@
import { ClanGET } from "@/lib/trollcall/api/clan";
import { getManyPagedClans } from "@/lib/trollcall/clan";
import { ServerClanToClientClan } from "@/lib/trollcall/convert/clan";
-import { ServerFlairToClientFlair } from "@/lib/trollcall/convert/flair";
-import { getManyFlairs } from "@/lib/trollcall/flair";
-import { cutArray } from "@/lib/trollcall/utility/merge";
import { ClientClan } from "@/types/clan";
import { NextApiRequest, NextApiResponse } from "next";
@@ -19,12 +16,12 @@ export default async function handler(
async (clan: any) => {
let thisClan = await ServerClanToClientClan(clan);
thisClan = (await ClanGET(null, clan)) as ClientClan;
- thisClan.flairs = cutArray(
- await getManyFlairs(
- { _id: { $in: clan.flairs } },
- ServerFlairToClientFlair
- )
- );
+ // if(thisClan.flairs != null) thisClan.flairs = cutArray(
+ // await getManyFlairs(
+ // { _id: { $in: clan.flairs } },
+ // ServerFlairToClientFlair
+ // )
+ // );
return thisClan;
},
5,
diff --git a/src/pages/api/clan/[clan]/index.ts b/src/pages/api/clan/[clan]/index.ts
index da05840..05ba11f 100644
--- a/src/pages/api/clan/[clan]/index.ts
+++ b/src/pages/api/clan/[clan]/index.ts
@@ -55,10 +55,15 @@ export default async function handler(
if (serverClan.code == null)
serverClan.code = checkExistingClan.code || nanoid(16);
+ const currentcode = serverClan.code;
+
// Encrypt code lole
serverClan.code = await hash(serverClan.code);
- if (!compareLevels(getLevel(checkExistingClan), "SUPPORTER")) {
+ if (
+ serverClan.flairs != null &&
+ !compareLevels(getLevel(checkExistingClan), "SUPPORTER")
+ ) {
serverClan.bgimage = null;
serverClan.css = null;
}
@@ -73,11 +78,7 @@ export default async function handler(
path: "/",
maxAge: 31540000
}),
- serialize("TROLLCALL_CODE", newClan.code, {
- path: "/",
- maxAge: 31540000
- }),
- serialize("TROLLCALL_PFP", newClan.pfp ?? "", {
+ serialize("TROLLCALL_CODE", currentcode, {
path: "/",
maxAge: 31540000
})
diff --git a/src/pages/api/clan/index.ts b/src/pages/api/clan/index.ts
index a60e4ab..2f46e2f 100644
--- a/src/pages/api/clan/index.ts
+++ b/src/pages/api/clan/index.ts
@@ -33,11 +33,18 @@ export default async function handler(
>;
if (serverClan.code == null) serverClan.code = nanoid(16);
- // Encrypt code lole
- serverClan.code = hash(serverClan.code).toString();
+ const currentcode = serverClan.code;
- if (!compareLevels(getLevel(serverClan), "SUPPORTER"))
+ // Encrypt code lole
+ serverClan.code = await hash(serverClan.code).toString();
+
+ if (
+ serverClan.flairs != null &&
+ !compareLevels(getLevel(serverClan), "SUPPORTER")
+ ) {
serverClan.bgimage = null;
+ serverClan.css = null;
+ }
const newClan = await createClan(serverClan);
if (newClan == null) return res.status(503).end();
// Give cookies
@@ -46,11 +53,7 @@ export default async function handler(
path: "/",
maxAge: 31540000
}),
- serialize("TROLLCALL_CODE", newClan.code, {
- path: "/",
- maxAge: 31540000
- }),
- serialize("TROLLCALL_PFP", newClan.pfp ?? "", {
+ serialize("TROLLCALL_CODE", currentcode, {
path: "/",
maxAge: 31540000
})
diff --git a/src/pages/api/convert/index.ts b/src/pages/api/convert/index.ts
new file mode 100644
index 0000000..c295daa
--- /dev/null
+++ b/src/pages/api/convert/index.ts
@@ -0,0 +1,143 @@
+// import { Filter, cursorToArray } from "@/lib/db/crud";
+// import { firstDB, mainDB } from "@/lib/db/mongodb";
+// import { ServerClan } from "@/types/clan";
+// import { ServerTroll } from "@/types/troll";
+// import { AdaptivePossessive } from "@/utility/language";
+// import { hash } from "argon2";
+// import { Sort } from "mongodb";
+// import { NextApiRequest, NextApiResponse } from "next";
+
+// export function readMany(
+// collection: string,
+// find: Filter,
+// sort: Sort
+// ) {
+// const selectedCollection = firstDB.collection(collection);
+// return selectedCollection.find(find).sort(sort);
+// }
+
+// export async function addMany(
+// collection: string,
+// items: { [key: string]: any }[]
+// ) {
+// const selectedCollection = mainDB.collection(collection);
+// return await selectedCollection.insertMany(items, { ordered: true });
+// }
+
+// export default async function handler(
+// req: NextApiRequest,
+// res: NextApiResponse
+// ) {
+// const { body, cookies, query, method } = req;
+// if (method === "GET") {
+// const allUsers: ServerClan[] = await cursorToArray(
+// readMany("users", {}, { "name": 1 }),
+// async x => {
+// const sc: ServerClan = {
+// _id: x._id,
+// updatedDate: new Date(x.updatedDate),
+// displayName: AdaptivePossessive(x.name, "Clan"),
+// url: x.url,
+// color: x.color,
+// pfp: x.pfp,
+// bgimage: null,
+// css: null,
+// name: x.name,
+// members: [
+// {
+// name: x.name,
+// pronouns: [["they", "them", "theirs"]]
+// }
+// ],
+// description: x.description,
+// policies: {
+// fanart: "no",
+// fanartOthers: "no",
+// kinning: "no",
+// shipping: "no",
+// fanfiction: "no"
+// },
+// code: await hash(x.code),
+// flairs: []
+// };
+// return sc;
+// }
+// );
+// let allTrolls: ServerTroll[] = await cursorToArray(
+// readMany("trolls", {}, { "name.0": 1 }),
+// async x => {
+// const st: ServerTroll = {
+// _id: x._id,
+// policies: x.policies,
+// updatedDate: x.updatedDate,
+// gender: x.gender,
+// facts: x.facts,
+// trueSign: x.trueSign,
+// falseSign: x.falseSign,
+// class: x.class,
+// username: x.username,
+// textColor: x.textColor,
+// pageColor: null,
+// quotes: [],
+// species: x.species,
+// name: x.name,
+// pronouns: x.pronouns,
+// description: x.description,
+// flairs: [],
+// pronunciation: x.pronunciation,
+// preferences: x.preferences,
+// quirks: x.quirks,
+// height: x.height,
+// age: Math.floor(x.age * 2.1666 * 10) / 10,
+// images: [x.image],
+// owner: x.owners[0]
+// };
+// return st;
+// }
+// );
+// const resultClans = await addMany("clans", allUsers);
+// const resultTrolls = await addMany("trolls", allTrolls);
+// return res
+// .status(200)
+// .json({ "users": resultClans, "trolls": resultTrolls });
+// } else return res.status(405).end();
+// }
+
+// /*
+// type ServerTroll = Omit<{
+// policies?: {
+// fanart: "yes" | "ask" | "no" | null;
+// fanartOthers: "yes" | "ask" | "no" | null;
+// kinning: "yes" | "ask" | "no" | null;
+// shipping: "yes" | "ask" | "no" | null;
+// fanfiction: "yes" | "ask" | "no" | null;
+// } | null | undefined;
+// updatedDate?: Date | undefined;
+// gender?: string | undefined;
+// facts?: string[] | undefined;
+// trueSign?: string | null | undefined;
+// falseSign?: string | null | undefined;
+// class?: string | null | undefined;
+// username?: string | undefined;
+// textColor?: yup.Maybe<[number, number, number] | undefined>;
+// pageColor?: yup.Maybe<[number, number, number] | undefined>;
+// quotes?: string[] | undefined;
+// species?: yup.Maybe;
+// name: [string, string];
+// pronouns: [string, string, string][];
+// description: string;
+// flairs: ObjectId[];
+// pronunciation: [string, string];
+// preferences: {
+// love?: string[] | undefined;
+// hate?: string[] | undefined;
+// };
+// quirks: AnyPresentValue;
+// height: number;
+// age: number;
+// images: string[];
+// owner: ObjectId;
+// }, "_id"> & {
+// _id: ObjectId;
+// }
+// */
diff --git a/src/pages/api/test/signin/index.ts b/src/pages/api/test/signin/index.ts
new file mode 100644
index 0000000..63517e7
--- /dev/null
+++ b/src/pages/api/test/signin/index.ts
@@ -0,0 +1,46 @@
+import { getSingleClan } from "@/lib/trollcall/clan";
+import { compareCredentials } from "@/lib/trollcall/perms";
+import { NextApiRequest, NextApiResponse } from "next";
+
+export default async function handler(
+ req: NextApiRequest,
+ res: NextApiResponse
+) {
+ const { body, cookies, query, method } = req;
+ if (method === "GET") {
+ if (cookies.TROLLCALL_NAME == null)
+ return res
+ .status(403)
+ .send("Can't authenticate (name is null, are you signed out?)");
+ if (cookies.TROLLCALL_CODE == null)
+ return res
+ .status(403)
+ .send("Can't authenticate (code is null, are you signed out?)");
+ const checkClan = await getSingleClan({
+ name: cookies.TROLLCALL_NAME
+ });
+ if (checkClan == null)
+ return res
+ .status(404)
+ .send(
+ "Can't authenticate (can't find clan \"" +
+ cookies.TROLLCALL_NAME +
+ '")'
+ );
+ if (await compareCredentials(checkClan, cookies))
+ return res
+ .status(200)
+ .send(
+ "Authenticated as " + checkClan.displayName ??
+ checkClan.name
+ );
+ else
+ return res
+ .status(403)
+ .send(
+ "Can't authenticate (trying as " +
+ (checkClan.displayName ?? checkClan.name) +
+ ", check code?)"
+ );
+ } else return res.status(405).end();
+}
diff --git a/src/pages/api/troll/.../[[...page]]/index.ts b/src/pages/api/troll/.../[[...page]]/index.ts
index d3bdbb9..341b1c5 100644
--- a/src/pages/api/troll/.../[[...page]]/index.ts
+++ b/src/pages/api/troll/.../[[...page]]/index.ts
@@ -21,12 +21,13 @@ export default async function handler(
thisTroll.owner = (await ClanGET({
_id: troll.owner
})) as ClientClan;
- thisTroll.flairs = cutArray(
- await getManyFlairs(
- { _id: { $in: troll.flairs } },
- ServerFlairToClientFlair
- )
- );
+ if (troll.flairs != null)
+ thisTroll.flairs = cutArray(
+ await getManyFlairs(
+ { _id: { $in: troll.flairs } },
+ ServerFlairToClientFlair
+ )
+ );
return thisTroll;
},
diff --git a/src/pages/api/troll/[clan]/.../[[...page]]/index.ts b/src/pages/api/troll/[clan]/.../[[...page]]/index.ts
index 31a1a6a..e7ce8d2 100644
--- a/src/pages/api/troll/[clan]/.../[[...page]]/index.ts
+++ b/src/pages/api/troll/[clan]/.../[[...page]]/index.ts
@@ -27,12 +27,13 @@ export default async function handler(
async (troll: any) => {
const thisTroll = await ServerTrollToClientTroll(troll);
thisTroll.owner = clientClan;
- thisTroll.flairs = cutArray(
- await getManyFlairs(
- { _id: { $in: troll.flairs } },
- ServerFlairToClientFlair
- )
- );
+ if (troll.flairs != null)
+ thisTroll.flairs = cutArray(
+ await getManyFlairs(
+ { _id: { $in: troll.flairs } },
+ ServerFlairToClientFlair
+ )
+ );
return thisTroll;
},
diff --git a/src/pages/api/troll/[clan]/[troll]/index.ts b/src/pages/api/troll/[clan]/[troll]/index.ts
index a313985..f4eafc5 100644
--- a/src/pages/api/troll/[clan]/[troll]/index.ts
+++ b/src/pages/api/troll/[clan]/[troll]/index.ts
@@ -34,6 +34,7 @@ export default async function handler(
stripUnknown: true
})) as Partial;
} catch (err) {
+ console.log(err);
return res.status(400).send(err);
}
const checkClan = await getSingleClan({
diff --git a/src/pages/clan/[clan]/index.tsx b/src/pages/clan/[clan]/index.tsx
index 53bad5f..5f6c526 100644
--- a/src/pages/clan/[clan]/index.tsx
+++ b/src/pages/clan/[clan]/index.tsx
@@ -3,13 +3,17 @@ import ClanCard from "@/components/cards/ClanCard/ClanCard";
import TrollCard from "@/components/cards/TrollCard/TrollCard";
import TrollSkeleton from "@/components/cards/TrollCard/TrollSkeleton";
import { ClanGET } from "@/lib/trollcall/api/clan";
+import { cutObject } from "@/lib/trollcall/utility/merge";
+import globals from "@/styles/global.module.css";
import { Color3 } from "@/types/assist/color";
import { ClientClan } from "@/types/clan";
import { ThemerGetSet } from "@/types/generics";
import { ClientTroll } from "@/types/troll";
+import AuthContext from "@/utility/react/AuthContext";
import Conditional from "@/utility/react/Conditional";
import { GetServerSideProps, GetStaticPropsContext } from "next";
-import { useEffect, useState } from "react";
+import Link from "next/link";
+import { useContext, useEffect, useState } from "react";
export default function Index({
themerVars: [theme, setTheme],
@@ -18,26 +22,39 @@ export default function Index({
themerVars: ThemerGetSet;
clan: ClientClan;
}) {
+ // Get user creds
+ const userCredentials = useContext(AuthContext);
+ const [isClient, setIsClient] = useState(false);
+ useEffect(() => setIsClient(true), []);
+
+ // Get user trolls
const [fetchedTrolls, setFetchedTrolls] = useState(
null
);
+
+ async function getTroll(page?: number) {
+ const res = await fetch(
+ page ? "/api/troll/.../" + page : "/api/troll/..."
+ );
+ const json = await res.json();
+ setFetchedTrolls(json);
+ }
useEffect(() => {
- async function getTroll() {
- const res = await fetch("/api/troll/" + clan.name + "/...");
- const json = await res.json();
- setFetchedTrolls(json);
- }
- getTroll();
+ getTroll(0);
const color = clan.color?.map(x => x / 255) as [number, number, number];
if (color != null)
- setTheme([new Color3(...color), new Color3(...color).darken(50)]);
+ setTheme([
+ new Color3(...color),
+ new Color3(...color).darken(50),
+ 768
+ ]);
}, []);
return (
<>