From b052aba0244d3b7f309d68ce734c55d07d471448 Mon Sep 17 00:00:00 2001 From: MedzikUser Date: Tue, 24 May 2022 15:27:35 +0200 Subject: [PATCH] feat(website): add file upload --- website/api_utils/index.ts | 3 +- website/api_utils/list.ts | 2 +- website/api_utils/login.ts | 2 +- website/api_utils/register.ts | 2 +- website/api_utils/upload.ts | 32 ++++++++ website/components/user/modals/style.tsx | 14 ++++ website/components/user/modals/upload.tsx | 93 +++++++++++++++++++++++ website/package.json | 1 + website/pages/_app.tsx | 4 + website/pages/login.tsx | 6 +- website/pages/register.tsx | 6 +- website/pages/user/files.tsx | 22 +++++- website/pnpm-lock.yaml | 82 ++++++++++++++++++++ 13 files changed, 258 insertions(+), 11 deletions(-) create mode 100644 website/api_utils/upload.ts create mode 100644 website/components/user/modals/style.tsx create mode 100644 website/components/user/modals/upload.tsx diff --git a/website/api_utils/index.ts b/website/api_utils/index.ts index b36f792..016c43a 100644 --- a/website/api_utils/index.ts +++ b/website/api_utils/index.ts @@ -1,7 +1,8 @@ import list from "./list" import login from "./login" import register from "./register" +import upload from "./upload" -const api = { list, login, register } +const api = { list, login, register, upload } export default api diff --git a/website/api_utils/list.ts b/website/api_utils/list.ts index aa5f216..8f7de65 100644 --- a/website/api_utils/list.ts +++ b/website/api_utils/list.ts @@ -30,5 +30,5 @@ export default async function list(path: string, token: string): Promise { throw new Error(err) }) - return response + return response } diff --git a/website/api_utils/login.ts b/website/api_utils/login.ts index be4e356..a751116 100644 --- a/website/api_utils/login.ts +++ b/website/api_utils/login.ts @@ -28,5 +28,5 @@ export default async function login(username: string, password: string): Promise throw new Error(err) }) - return response + return response } diff --git a/website/api_utils/register.ts b/website/api_utils/register.ts index 59fdb92..e37dd0d 100644 --- a/website/api_utils/register.ts +++ b/website/api_utils/register.ts @@ -28,5 +28,5 @@ export default async function register(username: string, password: string): Prom throw new Error(err) }) - return response + return response } diff --git a/website/api_utils/upload.ts b/website/api_utils/upload.ts new file mode 100644 index 0000000..0b9a744 --- /dev/null +++ b/website/api_utils/upload.ts @@ -0,0 +1,32 @@ +import axios from './axios' + +export default async function list(path: string, formData: FormData, token: string): Promise { + const request = axios.post(`/fs/upload?path=${path}`, formData, { + headers: { + Authorization: `Bearer ${token}`, + } + }) + + const response = request + .then(response => { + const { data } = response + return data + }) + .catch(err => { + if (err.response?.data?.error_message) { + const error = err.response.data.error_message + + if (error.toString() == "[object Object]") { + Object.keys(error).forEach(key => { + throw new Error(key) + }) + } + + throw new Error(error) + } + + throw new Error(err) + }) + + return response +} diff --git a/website/components/user/modals/style.tsx b/website/components/user/modals/style.tsx new file mode 100644 index 0000000..8ca4c1d --- /dev/null +++ b/website/components/user/modals/style.tsx @@ -0,0 +1,14 @@ +const style = { + position: 'absolute' as 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 400, + bgcolor: 'background.paper', + color: 'primary.main', + border: '2px solid #fff', + boxShadow: 24, + p: 4 +} + +export default style diff --git a/website/components/user/modals/upload.tsx b/website/components/user/modals/upload.tsx new file mode 100644 index 0000000..5ca5ba8 --- /dev/null +++ b/website/components/user/modals/upload.tsx @@ -0,0 +1,93 @@ +import React, { useState } from 'react' +import { Backdrop, Box, Button, Fade, Link, Modal } from "@mui/material" +import { useCookies } from "react-cookie" +import { toast } from 'react-toastify' +import api from '../../../api_utils' +import style from './style' + +function UploadModal({ open, setOpen, path, refresh }: Props) { + const [file, setFile]: [FileList | null | undefined, React.Dispatch>] = useState() + + const [cookies] = useCookies(["token"]) + + const onFileChange: React.ChangeEventHandler = event => { + setFile(event.target.files) + console.log(file) + } + + const handleUpload = () => { + const formData = new FormData() + + if (file == null || typeof file == "undefined") { + return + } + + formData.append( + "file", + file[0] + ) + + const filePath = `${path}/${file[0].name}` + + const request = api.upload(filePath, formData, cookies.token) + + toast.promise( + request, + { + pending: 'Uploading file...', + success: { + delay: 500, + render() { + refresh() + setOpen(false) + + return "File uploaded!" + } + }, + error: { + delay: 500, + render(err) { + if (err.data.response?.data?.error_message) { + return err.data.response.data.error_message.toString() + } else { + return err.data.toString() + } + } + } + } + ) + } + + return ( + setOpen(false)} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + + + + + + + + + + + ) +} + +export type Props = { + open: boolean, + setOpen: React.Dispatch>, + path: string, + refresh: () => void, +} + +export default UploadModal diff --git a/website/package.json b/website/package.json index d791908..aaaa8e8 100644 --- a/website/package.json +++ b/website/package.json @@ -27,6 +27,7 @@ "react-cookie": "4.1.1", "react-dom": "18.1.0", "react-is": "18.1.0", + "react-toastify": "9.0.1", "styled-components": "5.3.5" }, "devDependencies": { diff --git a/website/pages/_app.tsx b/website/pages/_app.tsx index 4d1b103..aa3e47e 100644 --- a/website/pages/_app.tsx +++ b/website/pages/_app.tsx @@ -1,11 +1,13 @@ import { ThemeProvider as MuiThemeProvider, createTheme as muiCreateTheme, PaletteMode } from '@mui/material' import { useEffect, useState } from 'react' import { useCookies } from 'react-cookie' +import { ToastContainer } from 'react-toastify' import { createGlobalStyle, ThemeProvider } from 'styled-components' import Container from '../components/container' import Footer from '../components/footer' import Header from '../components/header' import Main from '../components/main' +import "react-toastify/dist/ReactToastify.css" const GlobalStyle = createGlobalStyle` html, @@ -114,6 +116,8 @@ export default function App({ Component, pageProps }) { <> + + diff --git a/website/pages/login.tsx b/website/pages/login.tsx index 9061de2..0254024 100644 --- a/website/pages/login.tsx +++ b/website/pages/login.tsx @@ -10,10 +10,10 @@ import ErrorComponent from '../components/auth/error' import SubmitButton from '../components/auth/button' export default function Login() { - const [cookie, setCookie] = useCookies(["token"]) + const [cookies, setCookies] = useCookies(["token"]) useEffect(() => { - if (cookie.token) { + if (cookies.token) { Router.push('/user/files') } }) @@ -44,7 +44,7 @@ export default function Login() { request .then(token => { - setCookie("token", token) + setCookies("token", token) setError("") }) .catch(err => setError(err.toString())) diff --git a/website/pages/register.tsx b/website/pages/register.tsx index 9c1e5a8..9594644 100644 --- a/website/pages/register.tsx +++ b/website/pages/register.tsx @@ -10,10 +10,10 @@ import Title from '../components/auth/title' import SubmitButton from '../components/auth/button' export default function Login() { - const [cookie, setCookie] = useCookies(["token"]) + const [cookies, setCookies] = useCookies(["token"]) useEffect(() => { - if (cookie.token) { + if (cookies.token) { Router.push('/user/files') } }) @@ -44,7 +44,7 @@ export default function Login() { request .then(token => { - setCookie("token", token) + setCookies("token", token) setError("") }) .catch(err => setError(err.toString())) diff --git a/website/pages/user/files.tsx b/website/pages/user/files.tsx index 5ac713d..ebe37d8 100644 --- a/website/pages/user/files.tsx +++ b/website/pages/user/files.tsx @@ -1,5 +1,6 @@ import { faFile, faFolder } from "@fortawesome/free-solid-svg-icons" -import { Link as MuiLink } from "@mui/material" +import { CloudUpload } from "@mui/icons-material" +import { IconButton, Link as MuiLink } from "@mui/material" import Head from 'next/head' import Link from 'next/link' import { useEffect, useState } from 'react' @@ -8,6 +9,7 @@ import { resolve as pathResolve } from 'path' import api from '../../api_utils' import Icon from "../../components/other/icon" import Table from "../../components/user/table" +import UploadModal from "../../components/user/modals/upload" export default function Files() { const [cookies] = useCookies(["token"]) @@ -26,6 +28,8 @@ export default function Files() { .catch(err => console.error(err)) } + const refreshFolder = () => refresh(path) + useEffect(() => { const params = new URLSearchParams(window.location.search) const path = params.get("path") || "" @@ -39,12 +43,28 @@ export default function Files() { .catch(err => console.error(err)) }, [cookies]) + // modals + const [uploadModal, setUploadModal] = useState(false) + return ( <> Files - HomeDisk + setUploadModal(true)}> + + + + + + + diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 26a64f9..6ac3901 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -21,6 +21,7 @@ specifiers: react-cookie: 4.1.1 react-dom: 18.1.0 react-is: 18.1.0 + react-toastify: 9.0.1 styled-components: 5.3.5 typescript: 4.6.4 @@ -40,6 +41,7 @@ dependencies: react-cookie: 4.1.1_react@18.1.0 react-dom: 18.1.0_react@18.1.0 react-is: 18.1.0 + react-toastify: 9.0.1_ef5jwxihqo6n7gxfmzogljlgcm styled-components: 5.3.5_4klixn56hmiqf6hh5nx3jyckvq devDependencies: @@ -58,16 +60,19 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.10 + dev: false /@babel/code-frame/7.16.7: resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.17.9 + dev: false /@babel/compat-data/7.17.10: resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==} engines: {node: '>=6.9.0'} + dev: false /@babel/core/7.18.0: resolution: {integrity: sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==} @@ -90,6 +95,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /@babel/generator/7.18.0: resolution: {integrity: sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==} @@ -98,6 +104,7 @@ packages: '@babel/types': 7.18.0 '@jridgewell/gen-mapping': 0.3.1 jsesc: 2.5.2 + dev: false /@babel/helper-annotate-as-pure/7.16.7: resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} @@ -117,12 +124,14 @@ packages: '@babel/helper-validator-option': 7.16.7 browserslist: 4.20.3 semver: 6.3.0 + dev: false /@babel/helper-environment-visitor/7.16.7: resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.0 + dev: false /@babel/helper-function-name/7.17.9: resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} @@ -130,18 +139,21 @@ packages: dependencies: '@babel/template': 7.16.7 '@babel/types': 7.18.0 + dev: false /@babel/helper-hoist-variables/7.16.7: resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.0 + dev: false /@babel/helper-module-imports/7.16.7: resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.0 + dev: false /@babel/helper-module-transforms/7.18.0: resolution: {integrity: sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==} @@ -157,6 +169,7 @@ packages: '@babel/types': 7.18.0 transitivePeerDependencies: - supports-color + dev: false /@babel/helper-plugin-utils/7.16.7: resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} @@ -168,20 +181,24 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.0 + dev: false /@babel/helper-split-export-declaration/7.16.7: resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.0 + dev: false /@babel/helper-validator-identifier/7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} engines: {node: '>=6.9.0'} + dev: false /@babel/helper-validator-option/7.16.7: resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} engines: {node: '>=6.9.0'} + dev: false /@babel/helpers/7.18.0: resolution: {integrity: sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==} @@ -192,6 +209,7 @@ packages: '@babel/types': 7.18.0 transitivePeerDependencies: - supports-color + dev: false /@babel/highlight/7.17.9: resolution: {integrity: sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==} @@ -200,6 +218,7 @@ packages: '@babel/helper-validator-identifier': 7.16.7 chalk: 2.4.2 js-tokens: 4.0.0 + dev: false /@babel/parser/7.18.0: resolution: {integrity: sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==} @@ -207,6 +226,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.18.0 + dev: false /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.18.0: resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} @@ -239,6 +259,7 @@ packages: '@babel/code-frame': 7.16.7 '@babel/parser': 7.18.0 '@babel/types': 7.18.0 + dev: false /@babel/traverse/7.17.10_supports-color@5.5.0: resolution: {integrity: sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==} @@ -274,6 +295,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: false /@babel/types/7.18.0: resolution: {integrity: sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==} @@ -281,6 +303,7 @@ packages: dependencies: '@babel/helper-validator-identifier': 7.16.7 to-fast-properties: 2.0.0 + dev: false /@emotion/babel-plugin/11.9.2_@babel+core@7.18.0: resolution: {integrity: sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==} @@ -475,6 +498,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.1 '@jridgewell/sourcemap-codec': 1.4.13 + dev: false /@jridgewell/gen-mapping/0.3.1: resolution: {integrity: sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==} @@ -483,23 +507,28 @@ packages: '@jridgewell/set-array': 1.1.1 '@jridgewell/sourcemap-codec': 1.4.13 '@jridgewell/trace-mapping': 0.3.10 + dev: false /@jridgewell/resolve-uri/3.0.7: resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} engines: {node: '>=6.0.0'} + dev: false /@jridgewell/set-array/1.1.1: resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==} engines: {node: '>=6.0.0'} + dev: false /@jridgewell/sourcemap-codec/1.4.13: resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} + dev: false /@jridgewell/trace-mapping/0.3.10: resolution: {integrity: sha512-Q0YbBd6OTsXm8Y21+YUSDXupHnodNC2M4O18jtd3iwJ3+vMZNdKGols0a9G6JOK0dcJ3IdUUHoh908ZI6qhk8Q==} dependencies: '@jridgewell/resolve-uri': 3.0.7 '@jridgewell/sourcemap-codec': 1.4.13 + dev: false /@mui/base/5.0.0-alpha.82_ohobp6rpsmerwlq5ipwfh5yigy: resolution: {integrity: sha512-WUVDjCGnLXzmGxrmfW31blhucg0sRX4YddK2Falq7FlVzwdJaPgWn/xzPZmdLL0+WXon0gQVnDrq2qvggE/GMg==} @@ -688,6 +717,7 @@ packages: /@next/env/12.1.6: resolution: {integrity: sha512-Te/OBDXFSodPU6jlXYPAXpmZr/AkG6DCATAxttQxqOWaq6eDFX25Db3dK0120GZrSZmv4QCe9KsZmJKDbWs4OA==} + dev: false /@next/eslint-plugin-next/12.1.6: resolution: {integrity: sha512-yNUtJ90NEiYFT6TJnNyofKMPYqirKDwpahcbxBgSIuABwYOdkGwzos1ZkYD51Qf0diYwpQZBeVqElTk7Q2WNqw==} @@ -701,6 +731,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: false optional: true /@next/swc-android-arm64/12.1.6: @@ -709,6 +740,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: false optional: true /@next/swc-darwin-arm64/12.1.6: @@ -717,6 +749,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: false optional: true /@next/swc-darwin-x64/12.1.6: @@ -725,6 +758,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm-gnueabihf/12.1.6: @@ -733,6 +767,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm64-gnu/12.1.6: @@ -741,6 +776,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm64-musl/12.1.6: @@ -749,6 +785,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-x64-gnu/12.1.6: @@ -757,6 +794,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-x64-musl/12.1.6: @@ -765,6 +803,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-win32-arm64-msvc/12.1.6: @@ -773,6 +812,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: false optional: true /@next/swc-win32-ia32-msvc/12.1.6: @@ -781,6 +821,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: false optional: true /@next/swc-win32-x64-msvc/12.1.6: @@ -789,6 +830,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: false optional: true /@nodelib/fs.scandir/2.1.5: @@ -873,6 +915,7 @@ packages: '@types/hoist-non-react-statics': 3.3.1 '@types/react': 18.0.9 csstype: 3.0.11 + dev: true /@typescript-eslint/parser/5.22.0_utdtartgf6fqqgkivzeynh76la: resolution: {integrity: sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==} @@ -969,6 +1012,7 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: false /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -1104,6 +1148,7 @@ packages: escalade: 3.1.1 node-releases: 2.0.4 picocolors: 1.0.0 + dev: false /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} @@ -1122,6 +1167,7 @@ packages: /caniuse-lite/1.0.30001338: resolution: {integrity: sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ==} + dev: false /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1130,6 +1176,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: false /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1148,6 +1195,7 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: false /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -1158,6 +1206,7 @@ packages: /color-name/1.1.3: resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + dev: false /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1178,6 +1227,7 @@ packages: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 + dev: false /cookie/0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} @@ -1322,6 +1372,7 @@ packages: /electron-to-chromium/1.4.137: resolution: {integrity: sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==} + dev: false /emoji-regex/9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -1380,10 +1431,12 @@ packages: /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + dev: false /escape-string-regexp/1.0.5: resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} engines: {node: '>=0.8.0'} + dev: false /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -1772,6 +1825,7 @@ packages: /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + dev: false /get-intrinsic/1.1.1: resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} @@ -1828,6 +1882,7 @@ packages: /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: false /globals/13.15.0: resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} @@ -1855,6 +1910,7 @@ packages: /has-flag/3.0.0: resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} engines: {node: '>=4'} + dev: false /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -2043,6 +2099,7 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + dev: false /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -2067,6 +2124,7 @@ packages: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true + dev: false /jsx-ast-utils/3.3.0: resolution: {integrity: sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==} @@ -2173,6 +2231,7 @@ packages: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: false /natural-compare/1.4.0: resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} @@ -2218,9 +2277,11 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + dev: false /node-releases/2.0.4: resolution: {integrity: sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==} + dev: false /object-assign/4.1.1: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} @@ -2356,6 +2417,7 @@ packages: /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -2372,6 +2434,7 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: false /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -2413,6 +2476,7 @@ packages: loose-envify: 1.4.0 react: 18.1.0 scheduler: 0.22.0 + dev: false /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -2425,6 +2489,17 @@ packages: resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} dev: false + /react-toastify/9.0.1_ef5jwxihqo6n7gxfmzogljlgcm: + resolution: {integrity: sha512-c2zeZHkCX+WXuItS/JRqQ/8CH8Qm/je+M0rt09xe9fnu5YPJigtNOdD8zX4fwLA093V2am3abkGfOowwpkrwOQ==} + peerDependencies: + react: '>=16' + react-dom: '>=16' + dependencies: + clsx: 1.1.1 + react: 18.1.0 + react-dom: 18.1.0_react@18.1.0 + dev: false + /react-transition-group/4.4.2_ef5jwxihqo6n7gxfmzogljlgcm: resolution: {integrity: sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==} peerDependencies: @@ -2444,6 +2519,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /regenerator-runtime/0.13.9: resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} @@ -2501,11 +2577,13 @@ packages: /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false /scheduler/0.22.0: resolution: {integrity: sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==} dependencies: loose-envify: 1.4.0 + dev: false /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} @@ -2551,6 +2629,7 @@ packages: /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: false /source-map/0.5.7: resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} @@ -2642,6 +2721,7 @@ packages: dependencies: '@babel/core': 7.18.0 react: 18.1.0 + dev: false /stylis/4.0.13: resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==} @@ -2652,6 +2732,7 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: false /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -2671,6 +2752,7 @@ packages: /to-fast-properties/2.0.0: resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} engines: {node: '>=4'} + dev: false /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}