diff --git a/.github/workflows/publish-api.yaml b/.github/workflows/publish-api.yaml
index 96af847..fafd254 100644
--- a/.github/workflows/publish-api.yaml
+++ b/.github/workflows/publish-api.yaml
@@ -4,7 +4,9 @@ name: Create and publish docker images for the API
# Configures this workflow to run every time a change is pushed to the branch called `release`.
on:
push:
- branches: ['main']
+ branches:
+ - main
+ - dev
tags:
- v*
paths:
@@ -73,4 +75,28 @@ jobs:
context: api
push: true
tags: ${{ steps.meta.outputs.tags }}
- labels: ${{ steps.meta.outputs.labels }}
\ No newline at end of file
+ labels: ${{ steps.meta.outputs.labels }}
+
+ eks-deployment-restart:
+ runs-on: ubuntu-latest
+ needs: build-and-push-image
+ permissions:
+ id-token: write # Required for the OIDC, see https://github.com/aws-actions/configure-aws-credentials?tab=readme-ov-file#OIDC
+ contents: read
+ steps:
+ - name: configure aws credentials
+ uses: aws-actions/configure-aws-credentials@v4.0.0
+ with:
+ audience: sts.amazonaws.com
+ role-to-assume: ${{ secrets.DEV_AWS_EKS_ROLE }}
+ role-session-name: GitHub_to_AWS_via_FederatedOIDC
+ aws-region: ${{ secrets.DEV_AWS_REGION }}
+
+ - name: Configure kubectl for EKS
+ run: aws eks update-kubeconfig --name ${{ secrets.DEV_AWS_EKS_CLUSTER }} --region ${{ secrets.DEV_AWS_REGION }}
+
+ - name: Restart Bridge Explorer Deployment
+ if: github.ref == 'refs/heads/dev'
+ run: |
+ kubectl config use-context arn:aws:eks:${{ secrets.DEV_AWS_REGION }}:${{ secrets.DEV_AWS_ACCOUNT_ID }}:cluster/${{ secrets.DEV_AWS_EKS_CLUSTER }}
+ kubectl rollout restart deploy/${{ secrets.DEV_AWS_EKS_DEPLOYMENT_API }} -n ${{ secrets.DEV_AWS_EKS_NAMESPACE }}
\ No newline at end of file
diff --git a/.github/workflows/publish-ui.yaml b/.github/workflows/publish-ui.yaml
index 8c8e997..e5e4402 100644
--- a/.github/workflows/publish-ui.yaml
+++ b/.github/workflows/publish-ui.yaml
@@ -4,7 +4,9 @@ name: Create and publish docker images for the UI
# Configures this workflow to run every time a change is pushed to the branch called `release`.
on:
push:
- branches: ['main']
+ branches:
+ - main
+ - dev
tags:
- v*
paths:
@@ -44,7 +46,8 @@ jobs:
# This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
# It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository.
# It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
- - name: Build and push Docker image
+ - name: Dev branch - Build and push Docker image
+ if: github.ref == 'refs/heads/dev'
uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56
with:
context: app
@@ -52,6 +55,41 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
- "REACT_APP_HCAPTCHA_SITE_KEY=${{ secrets.REACT_APP_HCAPTCHA_SITE_KEY }}"
- "REACT_APP_FAUCET_API_URL=${{ secrets.REACT_APP_FAUCET_API_URL}}"
-
\ No newline at end of file
+ "REACT_APP_HCAPTCHA_SITE_KEY=${{ secrets.DEV_REACT_APP_HCAPTCHA_SITE_KEY }}"
+ "REACT_APP_FAUCET_API_URL=${{ secrets.DEV_REACT_APP_FAUCET_API_URL}}"
+
+ - name: Main branch / tags - Build and push Docker image
+ if: ( github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') )
+ uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56
+ with:
+ context: app
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ build-args: |
+ "REACT_APP_HCAPTCHA_SITE_KEY=${{ secrets.PROD_REACT_APP_HCAPTCHA_SITE_KEY }}"
+ "REACT_APP_FAUCET_API_URL=${{ secrets.PROD_REACT_APP_FAUCET_API_URL}}"
+
+ eks-deployment-restart:
+ runs-on: ubuntu-latest
+ needs: build-and-push-image
+ permissions:
+ id-token: write # Required for the OIDC, see https://github.com/aws-actions/configure-aws-credentials?tab=readme-ov-file#OIDC
+ contents: read
+ steps:
+ - name: configure aws credentials
+ uses: aws-actions/configure-aws-credentials@v4.0.0
+ with:
+ audience: sts.amazonaws.com
+ role-to-assume: ${{ secrets.DEV_AWS_EKS_ROLE }}
+ role-session-name: GitHub_to_AWS_via_FederatedOIDC
+ aws-region: ${{ secrets.DEV_AWS_REGION }}
+
+ - name: Configure kubectl for EKS
+ run: aws eks update-kubeconfig --name ${{ secrets.DEV_AWS_EKS_CLUSTER }} --region ${{ secrets.DEV_AWS_REGION }}
+
+ - name: Restart Bridge Explorer Deployment
+ if: github.ref == 'refs/heads/dev'
+ run: |
+ kubectl config use-context arn:aws:eks:${{ secrets.DEV_AWS_REGION }}:${{ secrets.DEV_AWS_ACCOUNT_ID }}:cluster/${{ secrets.DEV_AWS_EKS_CLUSTER }}
+ kubectl rollout restart deploy/${{ secrets.DEV_AWS_EKS_DEPLOYMENT_UI }} -n ${{ secrets.DEV_AWS_EKS_NAMESPACE }}
\ No newline at end of file
diff --git a/app/.env.example b/app/.env.example
new file mode 100644
index 0000000..8d828ba
--- /dev/null
+++ b/app/.env.example
@@ -0,0 +1,2 @@
+REACT_APP_HCAPTCHA_SITE_KEY=
+REACT_APP_FAUCET_API_URL=http://localhost:8000/api/v1
\ No newline at end of file
diff --git a/app/.eslintrc.js b/app/.eslintrc.js
index 168ad2c..85c74d7 100644
--- a/app/.eslintrc.js
+++ b/app/.eslintrc.js
@@ -4,7 +4,9 @@ module.exports = {
es2021: true,
node: true,
},
- extends: ["eslint:recommended", "plugin:react/recommended"],
+ parser: "@typescript-eslint/parser",
+ plugins: ["react", "@typescript-eslint"],
+ extends: ["eslint:recommended", "plugin:react/recommended", "plugin:@typescript-eslint/recommended"],
overrides: [
{
env: {
@@ -20,7 +22,6 @@ module.exports = {
ecmaVersion: "latest",
sourceType: "module",
},
- plugins: ["react"],
rules: {
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
diff --git a/app/package.json b/app/package.json
index 40c5f1b..44d4991 100644
--- a/app/package.json
+++ b/app/package.json
@@ -3,18 +3,21 @@
"version": "0.1.0",
"private": true,
"dependencies": {
- "@emotion/react": "^11.11.1",
- "@emotion/styled": "^11.11.0",
"@hcaptcha/react-hcaptcha": "^1.9.1",
- "@mui/material": "^5.14.18",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1",
+ "@types/jest": "^29.5.12",
+ "@types/node": "^20.11.21",
+ "@types/react": "^18.2.60",
+ "@types/react-dom": "^18.2.19",
"axios": "^1.6.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
+ "react-select": "^5.8.0",
"react-toastify": "^9.1.3",
+ "typescript": "^5.3.3",
"web-vitals": "^2.1.0"
},
"scripts": {
@@ -44,6 +47,9 @@
]
},
"devDependencies": {
+ "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
+ "@typescript-eslint/eslint-plugin": "^7.1.0",
+ "@typescript-eslint/parser": "^7.1.0",
"eslint": "^8.54.0",
"eslint-plugin-react": "^7.33.2",
"prettier": "3.1.0"
diff --git a/app/public/favicon.ico b/app/public/favicon.ico
index a11777c..a57199c 100644
Binary files a/app/public/favicon.ico and b/app/public/favicon.ico differ
diff --git a/app/public/index.html b/app/public/index.html
index e65acb3..4e9c9c8 100644
--- a/app/public/index.html
+++ b/app/public/index.html
@@ -7,7 +7,7 @@
-
React App
+ Gnosis Faucet
diff --git a/app/public/logo192.png b/app/public/logo192.png
deleted file mode 100644
index fc44b0a..0000000
Binary files a/app/public/logo192.png and /dev/null differ
diff --git a/app/public/logo512.png b/app/public/logo512.png
deleted file mode 100644
index a4e47a6..0000000
Binary files a/app/public/logo512.png and /dev/null differ
diff --git a/app/public/manifest.json b/app/public/manifest.json
index 080d6c7..d477fcf 100644
--- a/app/public/manifest.json
+++ b/app/public/manifest.json
@@ -1,6 +1,6 @@
{
- "short_name": "React App",
- "name": "Create React App Sample",
+ "short_name": "Gnosis Faucet",
+ "name": "Faucet for Gnosis chain",
"icons": [
{
"src": "favicon.ico",
diff --git a/app/src/App.js b/app/src/App.js
deleted file mode 100644
index fd9508d..0000000
--- a/app/src/App.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import logo from "./images/logo.svg";
-import "./css/App.css";
-import { HCaptchaForm } from "./components/hcaptcha/hcaptcha";
-
-import { Fragment } from "react";
-import { Container } from "@mui/system";
-import { ToastContainer } from "react-toastify";
-import "react-toastify/dist/ReactToastify.css";
-
-function App() {
- return (
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default App;
diff --git a/app/src/App.tsx b/app/src/App.tsx
new file mode 100644
index 0000000..b304c06
--- /dev/null
+++ b/app/src/App.tsx
@@ -0,0 +1,77 @@
+import { useEffect, useState } from "react"
+import { ToastContainer, toast } from "react-toastify"
+import "react-toastify/dist/ReactToastify.css"
+import axios from "axios"
+import logo from "./images/logo.svg"
+import "./css/App.css"
+import Loading from "./components/Loading/Loading"
+import Faucet from "./components/FaucetForm/Faucet"
+
+const chainName:{ [key: string]: string }= {
+ "100": "Gnosis",
+ "10200": "Chiado"
+}
+
+function App(): JSX.Element {
+ const [chainId, setChainId] = useState("10200")
+ const [loading, setLoading] = useState(true)
+ const [enabledTokens, setEnabledTokens] = useState([])
+ const [faucetLoading, setFaucetLoading] = useState(true)
+
+ const getFaucetInfo = async () => {
+ return axios.get(`${process.env.REACT_APP_FAUCET_API_URL}/info`)
+ }
+
+ useEffect(() => {
+ getFaucetInfo()
+ .then((response) => {
+ setChainId(response.data.chainId)
+ setEnabledTokens(response.data.enabledTokens)
+
+ const chain = chainName[response.data.chainId]
+ document.title = `${chain} Faucet`
+ document.querySelector('meta[name="description"]')?.setAttribute("content", `Faucet for ${chain} chain`)
+ })
+ .catch(() => {
+ toast.error("Network error")
+ })
+ .finally(() => {
+ setFaucetLoading(false)
+ setLoading(false)
+ })
+ }, [])
+
+ const title = faucetLoading ? "FAUCET" : `${chainName[chainId]} CHAIN`
+ const subtitle = faucetLoading
+ ? "Loading..."
+ : (chainId === "100" ? "Faucet" : "Testnet Faucet")
+
+ return (
+ <>
+
+
+
+
+
{title}
+ {subtitle}
+
+
+
+ {loading && }
+ >
+ )
+}
+
+export default App
diff --git a/app/src/components/Captcha/Captcha.tsx b/app/src/components/Captcha/Captcha.tsx
new file mode 100644
index 0000000..2b6adad
--- /dev/null
+++ b/app/src/components/Captcha/Captcha.tsx
@@ -0,0 +1,28 @@
+import React, { RefObject } from "react"
+import HCaptcha from "@hcaptcha/react-hcaptcha"
+
+const siteKey = process.env.REACT_APP_HCAPTCHA_SITE_KEY || "10000000-ffff-ffff-ffff-000000000001"
+
+interface CaptchaProps {
+ setCaptchaToken: (token: string) => void,
+ windowWidth: number,
+ captchaRef: RefObject
+}
+
+const Captcha: React.FC = ({ setCaptchaToken, windowWidth, captchaRef }) => {
+
+ const onVerifyCaptcha = (token: string) => {
+ setCaptchaToken(token)
+ }
+
+ return (
+ 500 ? "normal" : "compact"}
+ sitekey={siteKey}
+ onVerify={onVerifyCaptcha}
+ ref={captchaRef}
+ />
+ )
+}
+
+export default Captcha
diff --git a/app/src/components/FaucetForm/Faucet.css b/app/src/components/FaucetForm/Faucet.css
new file mode 100644
index 0000000..cb3ad92
--- /dev/null
+++ b/app/src/components/FaucetForm/Faucet.css
@@ -0,0 +1,131 @@
+.faucet-container {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ max-width: 500px;
+ background: rgba(62, 105, 87, 0.7);
+ border-radius: 10px;
+ padding: 40px;
+ color: white;
+ font-size: 1rem;
+}
+
+.faucet-container p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ line-height: 1.5rem;
+}
+
+.flex-row {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+ align-items: center;
+ flex-wrap: wrap;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.flex-row.flex-row-captcha {
+ justify-content: end;
+}
+
+.flex-row label {
+ flex: 1;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.flex-row input {
+ padding-left: 12px;
+ padding-right: 12px;
+ font-size: 1rem;
+ font-family: "GT Planar", sans-serif;
+ box-sizing: border-box;
+ height: 100%;
+}
+
+.flex-row input,
+.flex-row .token-select {
+ height: 100%;
+ border-radius: 4px;
+ border: none;
+ color: #212121;
+}
+
+.flex-row div input {
+ width: 100%;
+}
+
+.flex-row .input-field {
+ height: 56px;
+ min-width: 200px;
+}
+
+.token-info {
+ display: flex;
+ align-items: center;
+}
+
+strong {
+ margin-right: 0.6rem;
+}
+
+@media (min-width: 521px) {
+ .flex-row .input-field,
+ .flex-row .token-select {
+ width: 303px;
+ }
+}
+
+@media (max-width: 520px) {
+ .flex-row .input-field,
+ .flex-row .token-select {
+ width: 100%;
+ }
+
+ .faucet-container {
+ padding: 40px 10px;
+ }
+
+ .flex-row.flex-row-captcha {
+ justify-content: center;
+ padding-top: 1rem;
+ padding-bottom: 0;
+ }
+}
+
+.faucet-container button {
+ height: 56px;
+ border-radius: 10px;
+ border: none;
+ background-color: #DD7143;
+ color: white;
+ font-size: 1.3rem;
+ font-family: "GT Planar", sans-serif;
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ width: 100%;
+}
+
+.faucet-container button:hover {
+ background-color: #f0713b;
+}
+
+.faucet-container button:disabled {
+ background-color: #dd71439e;
+}
+
+.success {
+ margin-top: 2rem;
+}
+
+.success div {
+ color: #f0ebde;
+ margin: 0.2rem 0;
+ word-break: break-all;
+}
+
+.success a {
+ color: #f0ebde;
+}
diff --git a/app/src/components/FaucetForm/Faucet.tsx b/app/src/components/FaucetForm/Faucet.tsx
new file mode 100644
index 0000000..447a39f
--- /dev/null
+++ b/app/src/components/FaucetForm/Faucet.tsx
@@ -0,0 +1,169 @@
+import { useState, useRef, ChangeEvent, FormEvent, useEffect, Dispatch, SetStateAction } from "react"
+import "./Faucet.css"
+import { toast } from "react-toastify"
+import axios from "axios"
+import Captcha from "../Captcha/Captcha"
+import TokenSelect, { Token } from "../TokenSelect/TokenSelect"
+import HCaptcha from "@hcaptcha/react-hcaptcha"
+
+interface FaucetProps {
+ enabledTokens: Token[],
+ chainId: string,
+ setLoading: Dispatch>
+}
+
+function Faucet({ enabledTokens, chainId, setLoading }: FaucetProps): JSX.Element {
+ const [walletAddress, setWalletAddress] = useState("")
+ const [token, setToken] = useState(null)
+ const [captchaToken, setCaptchaToken] = useState(null)
+ const [txHash, setTxHash] = useState(null)
+ const [windowWidth, setWindowWidth] = useState(window.innerWidth)
+
+ const captchaRef = useRef(null)
+
+ useEffect(() => {
+ const handleResize = () => setWindowWidth(window.innerWidth)
+ window.addEventListener("resize", handleResize)
+ return () => window.removeEventListener("resize", handleResize)
+ }, [])
+
+
+ useEffect(() => {
+ if (enabledTokens.length === 1) {
+ setToken({
+ address: enabledTokens[0].address,
+ name: enabledTokens[0].name,
+ maximumAmount: Number(enabledTokens[0].maximumAmount)
+ })
+ }
+ }, [enabledTokens.length])
+
+ function formatErrors(errors: string[]) {
+ return (
+
+ { errors.map((item, index) =>
{item}
)}
+
+ )
+ }
+
+ const handleChangeAddress = (event: ChangeEvent) => {
+ setWalletAddress(event.target.value)
+ }
+
+ const handleSubmit = (event: FormEvent) => {
+ event.preventDefault()
+
+ if (walletAddress.length <= 0) {
+ toast.error("Please provide a wallet address.")
+ return
+ }
+
+ const apiURL = `${process.env.REACT_APP_FAUCET_API_URL}/ask`
+
+ if (token) {
+ setLoading(true)
+ try {
+ const req = {
+ recipient: walletAddress,
+ captcha: captchaToken,
+ tokenAddress: token.address,
+ chainId: chainId,
+ amount: token.maximumAmount
+ }
+
+ axios
+ .post(apiURL, req)
+ .then((response) => {
+ setWalletAddress("")
+
+ if (enabledTokens.length > 1 ) {
+ setToken(null)
+ }
+
+ // Reset captcha
+ setCaptchaToken("")
+ captchaRef.current?.resetCaptcha()
+
+ toast.success("Token sent to your wallet address")
+ setTxHash(`${response.data.transactionHash}`)
+ })
+ .catch((error) => {
+ toast.error(formatErrors(error.response.data.errors))
+ })
+ } catch (error) {
+ if (error instanceof Error) {
+ toast.error(error.message)
+ }
+ } finally {
+ setLoading(false)
+ }
+ }
+ }
+
+ return (
+
+ )
+}
+
+export default Faucet
diff --git a/app/src/components/Loading/Loading.css b/app/src/components/Loading/Loading.css
new file mode 100644
index 0000000..bff7b40
--- /dev/null
+++ b/app/src/components/Loading/Loading.css
@@ -0,0 +1,27 @@
+.loading-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ min-height: 100vh;
+ background-color: rgba(240, 235, 222, 0.7);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ overflow: hidden;
+}
+
+.loading-spinner {
+ border: 4px solid #dd7143;
+ border-top: 4px solid transparent;
+ border-radius: 50%;
+ width: 70px;
+ height: 70px;
+ animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
diff --git a/app/src/components/Loading/Loading.tsx b/app/src/components/Loading/Loading.tsx
new file mode 100644
index 0000000..1cb7a09
--- /dev/null
+++ b/app/src/components/Loading/Loading.tsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import './Loading.css'
+
+const Loading: React.FC = () => (
+
+)
+
+export default Loading
diff --git a/app/src/components/TokenSelect/TokenSelect.tsx b/app/src/components/TokenSelect/TokenSelect.tsx
new file mode 100644
index 0000000..c4ce424
--- /dev/null
+++ b/app/src/components/TokenSelect/TokenSelect.tsx
@@ -0,0 +1,70 @@
+import { Dispatch, SetStateAction } from "react"
+import Select, { StylesConfig } from "react-select"
+
+export interface Token {
+ address: string
+ name: string
+ maximumAmount: number
+}
+
+interface TokenSelectProps {
+ enabledTokens: Token[],
+ token: Token | null,
+ setToken: Dispatch>
+ windowWidth: number
+}
+
+const formatOptionLabel = ({ name, maximumAmount }: Token) => {
+ return (
+
+ {name} {maximumAmount} / day
+
+ )
+}
+
+const getOptionValue = (option: Token) => option.address
+
+function TokenSelect ({ enabledTokens, token, setToken, windowWidth }: TokenSelectProps): JSX.Element {
+
+ const handleChangeToken = (option: Token | null) => {
+ if (option) {
+ for (const idx in enabledTokens) {
+ if (enabledTokens[idx].address.toLowerCase() == option.address.toLowerCase()) {
+ setToken({
+ address: option.address,
+ name: option.name,
+ maximumAmount: Number(enabledTokens[idx].maximumAmount)
+ })
+ break
+ }
+ }
+ } else {
+ setToken(null)
+ }
+ }
+
+ const customStyles: StylesConfig = {
+ control: (provided) => ({
+ ...provided,
+ height: "56px",
+ width: windowWidth > 520 ? "303px" : "auto",
+ border: "none"
+ })
+ }
+
+ return (
+
+ )
+}
+
+export default TokenSelect
diff --git a/app/src/components/hcaptcha/hcaptcha.css b/app/src/components/hcaptcha/hcaptcha.css
deleted file mode 100644
index ee81fb5..0000000
--- a/app/src/components/hcaptcha/hcaptcha.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.MuiContainer-root {
- margin-top: 20px;
-}
diff --git a/app/src/components/hcaptcha/hcaptcha.js b/app/src/components/hcaptcha/hcaptcha.js
deleted file mode 100644
index dce38ae..0000000
--- a/app/src/components/hcaptcha/hcaptcha.js
+++ /dev/null
@@ -1,230 +0,0 @@
-import { useEffect, useState, useRef, Fragment } from "react";
-import HCaptcha from "@hcaptcha/react-hcaptcha";
-
-import { Container } from "@mui/system";
-import {
- Button,
- Grid,
- TextField,
- Typography,
- Select,
- MenuItem,
- useMediaQuery,
- FormControl,
- FormLabel
-} from "@mui/material";
-import Card from "@mui/material/Card";
-import CardContent from "@mui/material/CardContent";
-
-import axios from "axios";
-import { toast } from "react-toastify";
-import Loading from "../loading/loading";
-
-import "./hcaptcha.css";
-
-const siteKey = process.env.REACT_APP_HCAPTCHA_SITE_KEY;
-
-export const HCaptchaForm = function () {
- const captchaRef = useRef(null);
- const [captchaVerified, setCaptchaVerified] = useState(false);
- const [captchaToken, setCaptchaToken] = useState("");
- const [chainId, setChainId] = useState(null);
- const [chainName, setChainName] = useState("");
- const [walletAddress, setWalletAddress] = useState("");
- const [tokenAddress, setTokenAddress] = useState("");
- const [enabledTokens, setEnabledTokens] = useState([]);
- const [tokenAmount, setTokenAmount] = useState(0);
- const [showLoading, setShowLoading] = useState(false);
-
- const getFaucetInfo = async () => {
- return axios.get(`${process.env.REACT_APP_FAUCET_API_URL}/info`);
- };
-
- useEffect(() => {
- getFaucetInfo()
- .then((response) => {
- setChainId(response.data.chainId);
- setChainName(response.data.chainName);
- setEnabledTokens(response.data.enabledTokens);
- })
- .catch((error) => {
- toast.error(error);
- });
- }, []);
-
- const handleWalletAddressChange = (event) => {
- setWalletAddress(event.target.value);
- };
-
- const handleTokenChange = (event) => {
- setTokenAddress(event.target.value);
-
- // Set token amount
- for (let idx in enabledTokens) {
- if (enabledTokens[idx].address.toLowerCase() == event.target.value.toLowerCase()) {
- setTokenAmount(enabledTokens[idx].maximumAmount)
- break;
- }
- }
- };
-
- const isTabletOrMobile = useMediaQuery("(max-width:960px)");
-
- const onVerifyCaptcha = (_token) => {
- setCaptchaVerified(true);
- setCaptchaToken(_token);
- };
-
- function formatErrors(errors) {
- const divs = []
-
- for(let idx in errors) {
- divs.push({errors[idx]}
)
- }
-
- return (
- {divs}
- )
- }
-
- const ToastTxSuccessful = (txHash) => (
-
- Tokens sent to your wallet address. Hash: {txHash}
-
- );
-
- const sendRequest = async () => {
- if (walletAddress.length <= 0) {
- toast.error("Please provide a wallet address.");
- return;
- }
-
- const apiURL = `${process.env.REACT_APP_FAUCET_API_URL}/ask`;
- try {
- setShowLoading(true);
- const req = {
- recipient: walletAddress,
- captcha: captchaToken,
- tokenAddress: tokenAddress,
- chainId: chainId,
- amount: tokenAmount,
- };
-
- axios
- .post(apiURL, req)
- .then((response) => {
- setShowLoading(false);
- setWalletAddress("");
- // Reset captcha
- setCaptchaVerified(true);
- captchaRef.current?.resetCaptcha();
- // Show info on UI
- toast(ToastTxSuccessful(response.data.transactionHash));
- })
- .catch((error) => {
- setShowLoading(false);
- toast.error(formatErrors(error.response.data.errors));
- });
- } catch (error) {
- setShowLoading(false);
- if (error instanceof Error) {
- toast.error(error.message);
- }
- }
- };
-
- const showCaptcha = () => {
- return (
-
-
-
- Verify
-
-
-
-
-
-
- );
- };
-
-
- return (
-
-
-
- {chainName} Faucet
-
-
-
- Paste your account address in the field below and choose if you want to receive either a portion of the native token or any of the enabled ERC20 tokens.
-
-
-
-
-
-
-
- Wallet address
-
-
-
-
-
- Choose token
-
-
-
-
-
-
-
-
-
- {showCaptcha()}
-
-
-
-
-
-
- );
-};
diff --git a/app/src/components/loading/loading.js b/app/src/components/loading/loading.js
deleted file mode 100644
index b1c9e0c..0000000
--- a/app/src/components/loading/loading.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import Backdrop from "@mui/material/Backdrop";
-import { Box, CircularProgress } from "@mui/material";
-
-export default function Loading(props) {
- const { open } = props;
-
- return (
- theme.zIndex.drawer + 1 }}
- open={open}
- >
-
-
-
-
- );
-}
diff --git a/app/src/css/App.css b/app/src/css/App.css
index 889040f..4b54bcb 100644
--- a/app/src/css/App.css
+++ b/app/src/css/App.css
@@ -1,13 +1,96 @@
-.App-logo {
- max-height: 20px;
+@font-face {
+ font-family: "GT Planar";
+ src: url("../fonts/GT-Planar-Regular.woff2") format("woff2"),
+ url("../fonts/GT-Planar-Regular.woff") format("woff")
+ url("../fonts/GT-Planar-Regular.ttf") format("true-type");
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: "Maxi Round";
+ src: url("../fonts/ABCMaxiRound-Regular.otf") format("opentype");
+}
+
+
+.app-logo {
+ max-height: 30px;
pointer-events: none;
- position: absolute;
- left: 10px;
- top: 15px;
+ margin: 15px 10px;
+ align-self: flex-start;
}
+@media (max-width: 520px) {
+ .app-logo {
+ max-height: 20px;
+ }
+}
.Toastify__toast {
font-size: 16px;
- font-family: Roboto, Helvetica, Arial, sans-serif;
+ font-family: "GT Planar", Helvetica, Arial, sans-serif !important;
+}
+
+.Toastify__close-button {
+ align-self: center !important;
+}
+
+.app-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ font-family: "GT Planar", sans-serif;
+ background-image: url("../images/Faucet_BG.jpg");
+ background-position: center;
+ background-size: cover;
+ background-repeat: no-repeat;
+ backdrop-filter: contrast(0.5);
+ padding: 10px;
+ min-height: 100vh;
+ box-sizing: border-box;
+}
+
+.app-container::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: #00000080;
+ z-index: -1;
+}
+
+.title {
+ padding-top: 3rem;
+ padding-bottom: 3rem;
+}
+
+.title h1,
+.title h2 {
+ margin-top: 0;
+ margin-bottom: 0;
+ color: #F0EBDE;
+ text-align: center;
+ font-weight: normal;
+}
+
+.title h1 {
+ font-family: "Maxi Round", sans-serif;
+ font-size: 4.5rem;
+ text-transform: uppercase;
+}
+
+.title h2 {
+ font-size: 2.5rem;
+}
+
+@media (max-width: 900px) {
+ .title h1 {
+ font-size: 3rem;
+ }
+
+ .title h2 {
+ font-size: 2rem;
+ }
}
\ No newline at end of file
diff --git a/app/src/css/index.css b/app/src/css/index.css
index 8e2dc23..f313c02 100644
--- a/app/src/css/index.css
+++ b/app/src/css/index.css
@@ -6,9 +6,8 @@ body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
- background-color: rgb(236, 230, 214);
- color: rgb(33, 65, 50);
font-size: calc(10px + 2vmin);
+ min-height: 100vh;
}
code {
diff --git a/app/src/fonts/ABCMaxiRound-Regular.otf b/app/src/fonts/ABCMaxiRound-Regular.otf
new file mode 100644
index 0000000..7c86f23
Binary files /dev/null and b/app/src/fonts/ABCMaxiRound-Regular.otf differ
diff --git a/app/src/fonts/GT-Planar-Regular.ttf b/app/src/fonts/GT-Planar-Regular.ttf
new file mode 100644
index 0000000..d7975bf
Binary files /dev/null and b/app/src/fonts/GT-Planar-Regular.ttf differ
diff --git a/app/src/fonts/GT-Planar-Regular.woff b/app/src/fonts/GT-Planar-Regular.woff
new file mode 100644
index 0000000..992ab25
Binary files /dev/null and b/app/src/fonts/GT-Planar-Regular.woff differ
diff --git a/app/src/fonts/GT-Planar-Regular.woff2 b/app/src/fonts/GT-Planar-Regular.woff2
new file mode 100644
index 0000000..29ad899
Binary files /dev/null and b/app/src/fonts/GT-Planar-Regular.woff2 differ
diff --git a/app/src/images/Faucet_BG.jpg b/app/src/images/Faucet_BG.jpg
new file mode 100644
index 0000000..f8d693d
Binary files /dev/null and b/app/src/images/Faucet_BG.jpg differ
diff --git a/app/src/images/logo.svg b/app/src/images/logo.svg
index 4f21219..e5c2bfa 100644
--- a/app/src/images/logo.svg
+++ b/app/src/images/logo.svg
@@ -4,11 +4,11 @@
viewBox="0 0 1911 200.03" style="enable-background:new 0 0 1911 200.03;" xml:space="preserve">
diff --git a/app/tsconfig.json b/app/tsconfig.json
new file mode 100644
index 0000000..cf260c6
--- /dev/null
+++ b/app/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": [
+ "src",
+ "types.d.ts"
+ ]
+}
diff --git a/app/types.d.ts b/app/types.d.ts
new file mode 100644
index 0000000..091d25e
--- /dev/null
+++ b/app/types.d.ts
@@ -0,0 +1,4 @@
+declare module '*.svg' {
+ const content: any;
+ export default content;
+}
diff --git a/app/yarn.lock b/app/yarn.lock
index d75e925..0aa14b6 100644
--- a/app/yarn.lock
+++ b/app/yarn.lock
@@ -87,7 +87,7 @@
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
-"@babel/helper-annotate-as-pure@^7.22.5":
+"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
@@ -127,6 +127,21 @@
"@babel/helper-split-export-declaration" "^7.22.6"
semver "^6.3.1"
+"@babel/helper-create-class-features-plugin@^7.21.0":
+ version "7.24.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz#fc7554141bdbfa2d17f7b4b80153b9b090e5d158"
+ integrity sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-member-expression-to-functions" "^7.23.0"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.20"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ semver "^6.3.1"
+
"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1"
@@ -167,7 +182,7 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-member-expression-to-functions@^7.22.15":
+"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366"
integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==
@@ -371,6 +386,16 @@
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
+"@babel/plugin-proposal-private-property-in-object@^7.21.11":
+ version "7.21.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz#69d597086b6760c4126525cfa154f34631ff272c"
+ integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-create-class-features-plugin" "^7.21.0"
+ "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
@@ -1121,6 +1146,13 @@
dependencies:
regenerator-runtime "^0.14.0"
+"@babel/runtime@^7.12.0":
+ version "7.24.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e"
+ integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
"@babel/template@^7.22.15", "@babel/template@^7.3.3":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
@@ -1288,7 +1320,7 @@
source-map "^0.5.7"
stylis "4.2.0"
-"@emotion/cache@^11.11.0":
+"@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0":
version "11.11.0"
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff"
integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
@@ -1304,27 +1336,20 @@
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43"
integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
-"@emotion/is-prop-valid@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc"
- integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==
- dependencies:
- "@emotion/memoize" "^0.8.1"
-
"@emotion/memoize@^0.8.1":
version "0.8.1"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
-"@emotion/react@^11.11.1":
- version "11.11.1"
- resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157"
- integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==
+"@emotion/react@^11.8.1":
+ version "11.11.4"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.4.tgz#3a829cac25c1f00e126408fab7f891f00ecc3c1d"
+ integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==
dependencies:
"@babel/runtime" "^7.18.3"
"@emotion/babel-plugin" "^11.11.0"
"@emotion/cache" "^11.11.0"
- "@emotion/serialize" "^1.1.2"
+ "@emotion/serialize" "^1.1.3"
"@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
"@emotion/utils" "^1.2.1"
"@emotion/weak-memoize" "^0.3.1"
@@ -1341,23 +1366,22 @@
"@emotion/utils" "^1.2.1"
csstype "^3.0.2"
+"@emotion/serialize@^1.1.3":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.3.tgz#84b77bfcfe3b7bb47d326602f640ccfcacd5ffb0"
+ integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==
+ dependencies:
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/unitless" "^0.8.1"
+ "@emotion/utils" "^1.2.1"
+ csstype "^3.0.2"
+
"@emotion/sheet@^1.2.2":
version "1.2.2"
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec"
integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
-"@emotion/styled@^11.11.0":
- version "11.11.0"
- resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346"
- integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==
- dependencies:
- "@babel/runtime" "^7.18.3"
- "@emotion/babel-plugin" "^11.11.0"
- "@emotion/is-prop-valid" "^1.2.1"
- "@emotion/serialize" "^1.1.2"
- "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
- "@emotion/utils" "^1.2.1"
-
"@emotion/unitless@^0.8.1":
version "0.8.1"
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
@@ -1378,14 +1402,14 @@
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6"
integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
-"@eslint-community/eslint-utils@^4.2.0":
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
dependencies:
eslint-visitor-keys "^3.3.0"
-"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1":
+"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
@@ -1410,32 +1434,25 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.54.0.tgz#4fab9a2ff7860082c304f750e94acd644cf984cf"
integrity sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==
-"@floating-ui/core@^1.4.2":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c"
- integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==
- dependencies:
- "@floating-ui/utils" "^0.1.3"
-
-"@floating-ui/dom@^1.5.1":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa"
- integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==
+"@floating-ui/core@^1.0.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1"
+ integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==
dependencies:
- "@floating-ui/core" "^1.4.2"
- "@floating-ui/utils" "^0.1.3"
+ "@floating-ui/utils" "^0.2.1"
-"@floating-ui/react-dom@^2.0.4":
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.4.tgz#b076fafbdfeb881e1d86ae748b7ff95150e9f3ec"
- integrity sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==
+"@floating-ui/dom@^1.0.1":
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef"
+ integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==
dependencies:
- "@floating-ui/dom" "^1.5.1"
+ "@floating-ui/core" "^1.0.0"
+ "@floating-ui/utils" "^0.2.0"
-"@floating-ui/utils@^0.1.3":
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9"
- integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==
+"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2"
+ integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
"@hcaptcha/loader@^1.0.9":
version "1.0.9"
@@ -1766,90 +1783,6 @@
resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b"
integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==
-"@mui/base@5.0.0-beta.24":
- version "5.0.0-beta.24"
- resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.24.tgz#1a0638388291828dacf9547b466bc21fbaad3a2a"
- integrity sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==
- dependencies:
- "@babel/runtime" "^7.23.2"
- "@floating-ui/react-dom" "^2.0.4"
- "@mui/types" "^7.2.9"
- "@mui/utils" "^5.14.18"
- "@popperjs/core" "^2.11.8"
- clsx "^2.0.0"
- prop-types "^15.8.1"
-
-"@mui/core-downloads-tracker@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz#f8b187dc89756fa5c0b7d15aea537a6f73f0c2d8"
- integrity sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==
-
-"@mui/material@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.18.tgz#d0a89be3e27afe90135d542ddbf160b3f34e869c"
- integrity sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==
- dependencies:
- "@babel/runtime" "^7.23.2"
- "@mui/base" "5.0.0-beta.24"
- "@mui/core-downloads-tracker" "^5.14.18"
- "@mui/system" "^5.14.18"
- "@mui/types" "^7.2.9"
- "@mui/utils" "^5.14.18"
- "@types/react-transition-group" "^4.4.8"
- clsx "^2.0.0"
- csstype "^3.1.2"
- prop-types "^15.8.1"
- react-is "^18.2.0"
- react-transition-group "^4.4.5"
-
-"@mui/private-theming@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.18.tgz#98f97139ea21570493391ab377c1deb47fc6d1a2"
- integrity sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==
- dependencies:
- "@babel/runtime" "^7.23.2"
- "@mui/utils" "^5.14.18"
- prop-types "^15.8.1"
-
-"@mui/styled-engine@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.18.tgz#82d427bc975b85cecdbab2fd9353ed6c2df7eae1"
- integrity sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==
- dependencies:
- "@babel/runtime" "^7.23.2"
- "@emotion/cache" "^11.11.0"
- csstype "^3.1.2"
- prop-types "^15.8.1"
-
-"@mui/system@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.18.tgz#0f671e8f0a5e8e965b79235d77c50098f54195b5"
- integrity sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==
- dependencies:
- "@babel/runtime" "^7.23.2"
- "@mui/private-theming" "^5.14.18"
- "@mui/styled-engine" "^5.14.18"
- "@mui/types" "^7.2.9"
- "@mui/utils" "^5.14.18"
- clsx "^2.0.0"
- csstype "^3.1.2"
- prop-types "^15.8.1"
-
-"@mui/types@^7.2.9":
- version "7.2.9"
- resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.9.tgz#730ee83a37af292a5973962f78ce5c95f31213a7"
- integrity sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==
-
-"@mui/utils@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.18.tgz#d2a46df9b06230423ba6b6317748b27185a56ac3"
- integrity sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==
- dependencies:
- "@babel/runtime" "^7.23.2"
- "@types/prop-types" "^15.7.10"
- prop-types "^15.8.1"
- react-is "^18.2.0"
-
"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
version "5.1.1-v1"
resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129"
@@ -1893,11 +1826,6 @@
schema-utils "^3.0.0"
source-map "^0.7.3"
-"@popperjs/core@^2.11.8":
- version "2.11.8"
- resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
- integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
-
"@rollup/plugin-babel@^5.2.0":
version "5.3.1"
resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283"
@@ -2297,7 +2225,15 @@
expect "^29.0.0"
pretty-format "^29.0.0"
-"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+"@types/jest@^29.5.12":
+ version "29.5.12"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544"
+ integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==
+ dependencies:
+ expect "^29.0.0"
+ pretty-format "^29.0.0"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.15"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
@@ -2331,6 +2267,13 @@
dependencies:
undici-types "~5.26.4"
+"@types/node@^20.11.21":
+ version "20.11.21"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.21.tgz#ad67e65652f7be15686e2df87a38076a81c5e9c5"
+ integrity sha512-/ySDLGscFPNasfqStUuWWPfL78jompfIoVzLJPVVAHBh6rpG68+pI2Gk+fNLeI8/f1yPYL4s46EleVIc20F1Ow==
+ dependencies:
+ undici-types "~5.26.4"
+
"@types/parse-json@^4.0.0":
version "4.0.2"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
@@ -2341,7 +2284,7 @@
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f"
integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
-"@types/prop-types@*", "@types/prop-types@^15.7.10":
+"@types/prop-types@*":
version "15.7.10"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a"
integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==
@@ -2368,10 +2311,17 @@
dependencies:
"@types/react" "*"
-"@types/react-transition-group@^4.4.8":
- version "4.4.9"
- resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.9.tgz#12a1a1b5b8791067198149867b0823fbace31579"
- integrity sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==
+"@types/react-dom@^18.2.19":
+ version "18.2.19"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.19.tgz#b84b7c30c635a6c26c6a6dfbb599b2da9788be58"
+ integrity sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react-transition-group@^4.4.0":
+ version "4.4.10"
+ resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac"
+ integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==
dependencies:
"@types/react" "*"
@@ -2384,6 +2334,15 @@
"@types/scheduler" "*"
csstype "^3.0.2"
+"@types/react@^18.2.60":
+ version "18.2.60"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.60.tgz#df026eaef1100b6dafe420f36fecb1d209a8cee1"
+ integrity sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A==
+ dependencies:
+ "@types/prop-types" "*"
+ "@types/scheduler" "*"
+ csstype "^3.0.2"
+
"@types/resolve@1.17.1":
version "1.17.1"
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
@@ -2406,6 +2365,11 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35"
integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==
+"@types/semver@^7.5.0":
+ version "7.5.8"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
+ integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
+
"@types/send@*":
version "0.17.4"
resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a"
@@ -2496,6 +2460,23 @@
semver "^7.3.7"
tsutils "^3.21.0"
+"@typescript-eslint/eslint-plugin@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz#22bb999a8d59893c0ea07923e8a21f9d985ad740"
+ integrity sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==
+ dependencies:
+ "@eslint-community/regexpp" "^4.5.1"
+ "@typescript-eslint/scope-manager" "7.1.0"
+ "@typescript-eslint/type-utils" "7.1.0"
+ "@typescript-eslint/utils" "7.1.0"
+ "@typescript-eslint/visitor-keys" "7.1.0"
+ debug "^4.3.4"
+ graphemer "^1.4.0"
+ ignore "^5.2.4"
+ natural-compare "^1.4.0"
+ semver "^7.5.4"
+ ts-api-utils "^1.0.1"
+
"@typescript-eslint/experimental-utils@^5.0.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741"
@@ -2513,6 +2494,17 @@
"@typescript-eslint/typescript-estree" "5.62.0"
debug "^4.3.4"
+"@typescript-eslint/parser@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.1.0.tgz#b89dab90840f7d2a926bf4c23b519576e8c31970"
+ integrity sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==
+ dependencies:
+ "@typescript-eslint/scope-manager" "7.1.0"
+ "@typescript-eslint/types" "7.1.0"
+ "@typescript-eslint/typescript-estree" "7.1.0"
+ "@typescript-eslint/visitor-keys" "7.1.0"
+ debug "^4.3.4"
+
"@typescript-eslint/scope-manager@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c"
@@ -2521,6 +2513,14 @@
"@typescript-eslint/types" "5.62.0"
"@typescript-eslint/visitor-keys" "5.62.0"
+"@typescript-eslint/scope-manager@7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz#e4babaa39a3d612eff0e3559f3e99c720a2b4a54"
+ integrity sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==
+ dependencies:
+ "@typescript-eslint/types" "7.1.0"
+ "@typescript-eslint/visitor-keys" "7.1.0"
+
"@typescript-eslint/type-utils@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a"
@@ -2531,11 +2531,26 @@
debug "^4.3.4"
tsutils "^3.21.0"
+"@typescript-eslint/type-utils@7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz#372dfa470df181bcee0072db464dc778b75ed722"
+ integrity sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "7.1.0"
+ "@typescript-eslint/utils" "7.1.0"
+ debug "^4.3.4"
+ ts-api-utils "^1.0.1"
+
"@typescript-eslint/types@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
+"@typescript-eslint/types@7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.1.0.tgz#52a86d6236fda646e7e5fe61154991dc0dc433ef"
+ integrity sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==
+
"@typescript-eslint/typescript-estree@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b"
@@ -2549,6 +2564,20 @@
semver "^7.3.7"
tsutils "^3.21.0"
+"@typescript-eslint/typescript-estree@7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz#419b1310f061feee6df676c5bed460537310c593"
+ integrity sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==
+ dependencies:
+ "@typescript-eslint/types" "7.1.0"
+ "@typescript-eslint/visitor-keys" "7.1.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ minimatch "9.0.3"
+ semver "^7.5.4"
+ ts-api-utils "^1.0.1"
+
"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86"
@@ -2563,6 +2592,19 @@
eslint-scope "^5.1.1"
semver "^7.3.7"
+"@typescript-eslint/utils@7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.1.0.tgz#710ecda62aff4a3c8140edabf3c5292d31111ddd"
+ integrity sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@types/json-schema" "^7.0.12"
+ "@types/semver" "^7.5.0"
+ "@typescript-eslint/scope-manager" "7.1.0"
+ "@typescript-eslint/types" "7.1.0"
+ "@typescript-eslint/typescript-estree" "7.1.0"
+ semver "^7.5.4"
+
"@typescript-eslint/visitor-keys@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e"
@@ -2571,6 +2613,14 @@
"@typescript-eslint/types" "5.62.0"
eslint-visitor-keys "^3.3.0"
+"@typescript-eslint/visitor-keys@7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz#576c4ad462ca1378135a55e2857d7aced96ce0a0"
+ integrity sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==
+ dependencies:
+ "@typescript-eslint/types" "7.1.0"
+ eslint-visitor-keys "^3.4.1"
+
"@ungap/structured-clone@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
@@ -3484,11 +3534,6 @@ clsx@^1.1.1:
resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12"
integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==
-clsx@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b"
- integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==
-
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -3899,7 +3944,7 @@ cssstyle@^2.3.0:
dependencies:
cssom "~0.3.6"
-csstype@^3.0.2, csstype@^3.1.2:
+csstype@^3.0.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
@@ -5467,6 +5512,11 @@ ignore@^5.2.0:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78"
integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==
+ignore@^5.2.4:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
+ integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
+
immer@^9.0.7:
version "9.0.21"
resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
@@ -6768,6 +6818,11 @@ memfs@^3.1.2, memfs@^3.4.3:
dependencies:
fs-monkey "^1.0.4"
+memoize-one@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
+ integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
+
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
@@ -6835,6 +6890,13 @@ minimalistic-assert@^1.0.0:
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+minimatch@9.0.3:
+ version "9.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
+ integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
+ dependencies:
+ brace-expansion "^2.0.1"
+
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@@ -7938,7 +8000,7 @@ prompts@^2.0.1, prompts@^2.4.2:
kleur "^3.0.3"
sisteransi "^1.0.5"
-prop-types@^15.6.2, prop-types@^15.8.1:
+prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -8086,7 +8148,7 @@ react-is@^17.0.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
-react-is@^18.0.0, react-is@^18.2.0:
+react-is@^18.0.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
@@ -8151,6 +8213,21 @@ react-scripts@5.0.1:
optionalDependencies:
fsevents "^2.3.2"
+react-select@^5.8.0:
+ version "5.8.0"
+ resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.8.0.tgz#bd5c467a4df223f079dd720be9498076a3f085b5"
+ integrity sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==
+ dependencies:
+ "@babel/runtime" "^7.12.0"
+ "@emotion/cache" "^11.4.0"
+ "@emotion/react" "^11.8.1"
+ "@floating-ui/dom" "^1.0.1"
+ "@types/react-transition-group" "^4.4.0"
+ memoize-one "^6.0.0"
+ prop-types "^15.6.0"
+ react-transition-group "^4.3.0"
+ use-isomorphic-layout-effect "^1.1.2"
+
react-toastify@^9.1.3:
version "9.1.3"
resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.1.3.tgz#1e798d260d606f50e0fab5ee31daaae1d628c5ff"
@@ -8158,7 +8235,7 @@ react-toastify@^9.1.3:
dependencies:
clsx "^1.1.1"
-react-transition-group@^4.4.5:
+react-transition-group@^4.3.0:
version "4.4.5"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
@@ -8551,6 +8628,13 @@ semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3:
dependencies:
lru-cache "^6.0.0"
+semver@^7.5.4:
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
+ integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+ dependencies:
+ lru-cache "^6.0.0"
+
send@0.18.0:
version "0.18.0"
resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
@@ -9233,6 +9317,11 @@ tryer@^1.0.1:
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
+ts-api-utils@^1.0.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.2.1.tgz#f716c7e027494629485b21c0df6180f4d08f5e8b"
+ integrity sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==
+
ts-interface-checker@^0.1.9:
version "0.1.13"
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
@@ -9353,6 +9442,11 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
+typescript@^5.3.3:
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37"
+ integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
+
unbox-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
@@ -9451,6 +9545,11 @@ url-parse@^1.5.3:
querystringify "^2.1.1"
requires-port "^1.0.0"
+use-isomorphic-layout-effect@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb"
+ integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==
+
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"