forked from Alex/Pterodactyl-Panel
yarn and composer updates
This commit is contained in:
parent
d167ef1f89
commit
e4fc0f5ac3
632
.yarn/releases/yarn-3.1.0-rc.1.cjs
vendored
Normal file
632
.yarn/releases/yarn-3.1.0-rc.1.cjs
vendored
Normal file
File diff suppressed because one or more lines are too long
55
.yarn/releases/yarn-berry.cjs
vendored
55
.yarn/releases/yarn-berry.cjs
vendored
File diff suppressed because one or more lines are too long
@ -1,4 +1,6 @@
|
||||
nodeLinker: 'node-modules'
|
||||
nodeLinker: node-modules
|
||||
|
||||
pnpIgnorePatterns:
|
||||
- './public/**/*'
|
||||
yarnPath: '.yarn/releases/yarn-berry.cjs'
|
||||
- ./public/**/*
|
||||
|
||||
yarnPath: .yarn/releases/yarn-3.1.0-rc.1.cjs
|
||||
|
@ -18,13 +18,13 @@
|
||||
"ext-pdo_mysql": "*",
|
||||
"ext-zip": "*",
|
||||
"asbiin/laravel-webauthn": "^1.1",
|
||||
"aws/aws-sdk-php": "^3.186",
|
||||
"aws/aws-sdk-php": "^3.192",
|
||||
"doctrine/dbal": "^3.1",
|
||||
"fideloper/proxy": "^4.4",
|
||||
"guzzlehttp/guzzle": "^7.3",
|
||||
"hashids/hashids": "^4.1",
|
||||
"laracasts/utilities": "^3.2",
|
||||
"laravel/framework": "^8.52",
|
||||
"laravel/framework": "^8.58",
|
||||
"laravel/helpers": "^1.4",
|
||||
"laravel/sanctum": "^2.11",
|
||||
"laravel/tinker": "^2.6",
|
||||
@ -47,12 +47,12 @@
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-debugbar": "^3.6",
|
||||
"barryvdh/laravel-ide-helper": "^2.10",
|
||||
"facade/ignition": "^2.11",
|
||||
"facade/ignition": "^2.12",
|
||||
"fakerphp/faker": "^1.15",
|
||||
"friendsofphp/php-cs-fixer": "^3.0",
|
||||
"laravel/dusk": "^6.15",
|
||||
"friendsofphp/php-cs-fixer": "^3.1",
|
||||
"laravel/dusk": "^6.18",
|
||||
"mockery/mockery": "^1.4",
|
||||
"nunomaduro/collision": "^5.6",
|
||||
"nunomaduro/collision": "^5.9",
|
||||
"php-mock/php-mock-phpunit": "^2.6",
|
||||
"phpunit/phpunit": "^9.5"
|
||||
},
|
||||
|
700
composer.lock
generated
700
composer.lock
generated
File diff suppressed because it is too large
Load Diff
105
package.json
105
package.json
@ -11,40 +11,40 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@": "link:./resources/scripts",
|
||||
"@codemirror/autocomplete": "^0.18.8",
|
||||
"@codemirror/closebrackets": "^0.18.0",
|
||||
"@codemirror/commands": "^0.18.3",
|
||||
"@codemirror/comment": "^0.18.1",
|
||||
"@codemirror/fold": "^0.18.1",
|
||||
"@codemirror/gutter": "^0.18.4",
|
||||
"@codemirror/highlight": "^0.18.4",
|
||||
"@codemirror/history": "^0.18.1",
|
||||
"@codemirror/lang-cpp": "^0.18.0",
|
||||
"@codemirror/lang-css": "^0.18.0",
|
||||
"@codemirror/lang-html": "^0.18.1",
|
||||
"@codemirror/lang-java": "^0.18.0",
|
||||
"@codemirror/lang-javascript": "^0.18.0",
|
||||
"@codemirror/lang-json": "^0.18.0",
|
||||
"@codemirror/lang-markdown": "^0.18.4",
|
||||
"@codemirror/lang-rust": "^0.18.0",
|
||||
"@codemirror/lang-sql": "^0.18.0",
|
||||
"@codemirror/lang-xml": "^0.18.0",
|
||||
"@codemirror/language": "^0.18.2",
|
||||
"@codemirror/legacy-modes": "^0.18.1",
|
||||
"@codemirror/lint": "^0.18.4",
|
||||
"@codemirror/matchbrackets": "^0.18.0",
|
||||
"@codemirror/rectangular-selection": "^0.18.0",
|
||||
"@codemirror/search": "^0.18.4",
|
||||
"@codemirror/state": "^0.18.7",
|
||||
"@codemirror/stream-parser": "^0.18.2",
|
||||
"@codemirror/theme-one-dark": "^0.18.1",
|
||||
"@codemirror/view": "^0.18.19",
|
||||
"@fortawesome/fontawesome-svg-core": "^1.2.35",
|
||||
"@fortawesome/free-solid-svg-icons": "^5.15.3",
|
||||
"@fortawesome/react-fontawesome": "^0.1.14",
|
||||
"@codemirror/autocomplete": "^0.19.3",
|
||||
"@codemirror/closebrackets": "^0.19.0",
|
||||
"@codemirror/commands": "^0.19.2",
|
||||
"@codemirror/comment": "^0.19.0",
|
||||
"@codemirror/fold": "^0.19.0",
|
||||
"@codemirror/gutter": "^0.19.1",
|
||||
"@codemirror/highlight": "^0.19.4",
|
||||
"@codemirror/history": "^0.19.0",
|
||||
"@codemirror/lang-cpp": "^0.19.1",
|
||||
"@codemirror/lang-css": "^0.19.1",
|
||||
"@codemirror/lang-html": "^0.19.1",
|
||||
"@codemirror/lang-java": "^0.19.1",
|
||||
"@codemirror/lang-javascript": "^0.19.1",
|
||||
"@codemirror/lang-json": "^0.19.1",
|
||||
"@codemirror/lang-markdown": "^0.19.1",
|
||||
"@codemirror/lang-rust": "^0.19.1",
|
||||
"@codemirror/lang-sql": "^0.19.3",
|
||||
"@codemirror/lang-xml": "^0.19.1",
|
||||
"@codemirror/language": "^0.19.2",
|
||||
"@codemirror/legacy-modes": "^0.19.0",
|
||||
"@codemirror/lint": "^0.19.0",
|
||||
"@codemirror/matchbrackets": "^0.19.1",
|
||||
"@codemirror/rectangular-selection": "^0.19.0",
|
||||
"@codemirror/search": "^0.19.0",
|
||||
"@codemirror/state": "^0.19.1",
|
||||
"@codemirror/stream-parser": "^0.19.1",
|
||||
"@codemirror/theme-one-dark": "^0.19.0",
|
||||
"@codemirror/view": "^0.19.4",
|
||||
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
||||
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
||||
"@fortawesome/react-fontawesome": "^0.1.15",
|
||||
"@hot-loader/react-dom": "^16.14.0",
|
||||
"axios": "^0.21.1",
|
||||
"chart.js": "^2.9.3",
|
||||
"axios": "^0.21.3",
|
||||
"chart.js": "^2.9.4",
|
||||
"date-fns": "^2.23.0",
|
||||
"debounce": "^1.2.1",
|
||||
"deepmerge": "^4.2.2",
|
||||
@ -53,30 +53,30 @@
|
||||
"feature": "link:./resources/scripts/components/server/features",
|
||||
"formik": "^2.2.9",
|
||||
"history": "^4.10.1",
|
||||
"i18next": "^20.3.5",
|
||||
"i18next": "^20.6.0",
|
||||
"i18next-chained-backend": "^3.0.2",
|
||||
"i18next-localstorage-backend": "^3.1.3",
|
||||
"i18next-xhr-backend": "^3.2.2",
|
||||
"qrcode.react": "^1.0.1",
|
||||
"query-string": "^7.0.1",
|
||||
"react": "^16.14.0",
|
||||
"react-copy-to-clipboard": "^5.0.3",
|
||||
"react-copy-to-clipboard": "^5.0.4",
|
||||
"react-dom": "^16.14.0",
|
||||
"react-fast-compare": "^3.2.0",
|
||||
"react-ga": "^3.3.0",
|
||||
"react-google-recaptcha": "^2.1.0",
|
||||
"react-hot-loader": "^4.13.0",
|
||||
"react-i18next": "^11.11.4",
|
||||
"react-router": "^5.2.0",
|
||||
"react-router-dom": "^5.2.0",
|
||||
"react-router": "^5.2.1",
|
||||
"react-router-dom": "^5.2.1",
|
||||
"react-select": "^4.3.1",
|
||||
"react-transition-group": "^4.4.2",
|
||||
"reaptcha": "^1.7.2",
|
||||
"reaptcha": "^1.7.3",
|
||||
"sockette": "^2.0.6",
|
||||
"styled-components": "^5.3.0",
|
||||
"styled-components": "^5.3.1",
|
||||
"styled-components-breakpoint": "^3.0.0-preview.20",
|
||||
"swr": "^0.5.6",
|
||||
"uuid": "^3.3.2",
|
||||
"swr": "^1.0.0",
|
||||
"uuid": "^3.4.0",
|
||||
"xterm": "^4.13.0",
|
||||
"xterm-addon-attach": "^0.6.0",
|
||||
"xterm-addon-fit": "^0.5.0",
|
||||
@ -100,14 +100,13 @@
|
||||
"@babel/runtime": "^7.14.5",
|
||||
"@tailwindcss/forms": "^0.3.3",
|
||||
"@types/chart.js": "^2.9.34",
|
||||
"@types/codemirror": "^5.60.2",
|
||||
"@types/debounce": "^1.2.0",
|
||||
"@types/events": "^3.0.0",
|
||||
"@types/history": "^4.7.9",
|
||||
"@types/node": "^16.4.10",
|
||||
"@types/node": "^16.7.10",
|
||||
"@types/qrcode.react": "^1.0.2",
|
||||
"@types/query-string": "^6.3.0",
|
||||
"@types/react": "^16.14.11",
|
||||
"@types/react": "^16.14.15",
|
||||
"@types/react-copy-to-clipboard": "^5.0.1",
|
||||
"@types/react-dom": "^16.9.14",
|
||||
"@types/react-redux": "^7.1.18",
|
||||
@ -115,20 +114,20 @@
|
||||
"@types/react-router-dom": "^5.1.8",
|
||||
"@types/react-select": "^4.0.17",
|
||||
"@types/react-transition-group": "^4.4.2",
|
||||
"@types/styled-components": "^5.1.11",
|
||||
"@types/uuid": "^3.4.5",
|
||||
"@types/styled-components": "^5.1.14",
|
||||
"@types/uuid": "^3.4.10",
|
||||
"@types/webappsec-credential-management": "^0.6.1",
|
||||
"@types/webpack-env": "^1.16.2",
|
||||
"@types/yup": "^0.29.13",
|
||||
"@typescript-eslint/eslint-plugin": "^4.29.0",
|
||||
"@typescript-eslint/parser": "^4.29.0",
|
||||
"autoprefixer": "^10.3.1",
|
||||
"@typescript-eslint/eslint-plugin": "^4.30.0",
|
||||
"@typescript-eslint/parser": "^4.30.0",
|
||||
"autoprefixer": "^10.3.4",
|
||||
"babel-loader": "^8.2.2",
|
||||
"babel-plugin-macros": "^3.1.0",
|
||||
"babel-plugin-styled-components": "^1.13.2",
|
||||
"browserslist": "^4.16.6",
|
||||
"browserslist": "^4.17.0",
|
||||
"cross-env": "^7.0.3",
|
||||
"css-loader": "^5.2.6",
|
||||
"css-loader": "^5.2.7",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-standard": "^16.0.3",
|
||||
"eslint-plugin-import": "^2.23.4",
|
||||
@ -136,7 +135,7 @@
|
||||
"eslint-plugin-promise": "^5.1.0",
|
||||
"eslint-plugin-react": "^7.24.0",
|
||||
"eslint-plugin-react-hooks": "^4.2.0",
|
||||
"fork-ts-checker-webpack-plugin": "^6.3.1",
|
||||
"fork-ts-checker-webpack-plugin": "^6.3.3",
|
||||
"postcss": "^8.3.6",
|
||||
"redux-devtools-extension": "^2.13.9",
|
||||
"source-map-loader": "^1.1.3",
|
||||
@ -144,7 +143,7 @@
|
||||
"svg-url-loader": "^7.1.1",
|
||||
"tailwindcss": "^2.2.7",
|
||||
"terser-webpack-plugin": "^4.2.3",
|
||||
"twin.macro": "^2.6.2",
|
||||
"twin.macro": "^2.7.0",
|
||||
"typescript": "^4.3.5",
|
||||
"webpack": "^4.46.0",
|
||||
"webpack-assets-manifest": "^4.0.6",
|
||||
|
@ -15,4 +15,4 @@ export default (uuid: string, initialData?: Response) => useSWR([ uuid, '/startu
|
||||
const variables = ((data as FractalResponseList).data || []).map(rawDataToServerEggVariable);
|
||||
|
||||
return { invocation: data.meta.startup_command, variables, dockerImages: data.meta.docker_images || [] };
|
||||
}, { initialData, errorRetryCount: 3 });
|
||||
}, { fallbackData: initialData, errorRetryCount: 3 });
|
||||
|
@ -33,8 +33,8 @@ export default () => {
|
||||
setSubmitting(true);
|
||||
|
||||
createLocation(short, long)
|
||||
.then(location => {
|
||||
mutate(data => ({ ...data!, items: data!.items.concat(location) }), false);
|
||||
.then(async (location) => {
|
||||
await mutate(data => ({ ...data!, items: data!.items.concat(location) }), false);
|
||||
setVisible(false);
|
||||
})
|
||||
.catch(error => {
|
||||
|
@ -33,8 +33,8 @@ export default () => {
|
||||
setSubmitting(true);
|
||||
|
||||
createNest(name, description)
|
||||
.then(nest => {
|
||||
mutate(data => ({ ...data!, items: data!.items.concat(nest) }), false);
|
||||
.then(async (nest) => {
|
||||
await mutate(data => ({ ...data!, items: data!.items.concat(nest) }), false);
|
||||
setVisible(false);
|
||||
})
|
||||
.catch(error => {
|
||||
|
@ -33,8 +33,8 @@ export default () => {
|
||||
setSubmitting(true);
|
||||
|
||||
createRole(name, description)
|
||||
.then(role => {
|
||||
mutate(data => ({ ...data!, items: data!.items.concat(role) }), false);
|
||||
.then(async (role) => {
|
||||
await mutate(data => ({ ...data!, items: data!.items.concat(role) }), false);
|
||||
setVisible(false);
|
||||
})
|
||||
.catch(error => {
|
||||
|
@ -1,12 +1,12 @@
|
||||
import { autocompletion, completionKeymap } from '@codemirror/autocomplete';
|
||||
import { closeBrackets, closeBracketsKeymap } from '@codemirror/closebrackets';
|
||||
import { defaultKeymap, defaultTabBinding } from '@codemirror/commands';
|
||||
import { defaultKeymap, indentWithTab } from '@codemirror/commands';
|
||||
import { commentKeymap } from '@codemirror/comment';
|
||||
import { foldGutter, foldKeymap } from '@codemirror/fold';
|
||||
import { lineNumbers, highlightActiveLineGutter } from '@codemirror/gutter';
|
||||
import { defaultHighlightStyle } from '@codemirror/highlight';
|
||||
import { history, historyKeymap } from '@codemirror/history';
|
||||
import { indentOnInput, LanguageSupport, LezerLanguage } from '@codemirror/language';
|
||||
import { indentOnInput, LanguageSupport, LRLanguage } from '@codemirror/language';
|
||||
import { lintKeymap } from '@codemirror/lint';
|
||||
import { bracketMatching } from '@codemirror/matchbrackets';
|
||||
import { rectangularSelection } from '@codemirror/rectangular-selection';
|
||||
@ -39,7 +39,7 @@ import React, { useCallback, useEffect, useState } from 'react';
|
||||
import tw, { styled, TwStyle } from 'twin.macro';
|
||||
import { ayuMirage } from '@/components/elements/EditorTheme';
|
||||
|
||||
type EditorMode = LanguageSupport | LezerLanguage | StreamParser<any>;
|
||||
type EditorMode = LanguageSupport | LRLanguage | StreamParser<any>;
|
||||
|
||||
export interface Mode {
|
||||
name: string,
|
||||
@ -92,7 +92,7 @@ export const modeToExtension = (m: EditorMode): Extension => {
|
||||
return m;
|
||||
}
|
||||
|
||||
if (m instanceof LezerLanguage) {
|
||||
if (m instanceof LRLanguage) {
|
||||
return m;
|
||||
}
|
||||
|
||||
@ -165,7 +165,7 @@ const defaultExtensions: Extension = [
|
||||
...commentKeymap,
|
||||
...completionKeymap,
|
||||
...lintKeymap,
|
||||
defaultTabBinding,
|
||||
indentWithTab,
|
||||
]),
|
||||
|
||||
EditorState.tabSize.of(4),
|
||||
|
@ -9,8 +9,8 @@ const InstallListener = () => {
|
||||
const { mutate } = useFileManagerSwr();
|
||||
const setServerFromState = ServerContext.useStoreActions(actions => actions.server.setServerFromState);
|
||||
|
||||
useWebsocketEvent(SocketEvent.BACKUP_RESTORE_COMPLETED, () => {
|
||||
mutate(undefined);
|
||||
useWebsocketEvent(SocketEvent.BACKUP_RESTORE_COMPLETED, async () => {
|
||||
await mutate(undefined);
|
||||
setServerFromState(s => ({ ...s, status: null }));
|
||||
});
|
||||
|
||||
|
@ -48,7 +48,7 @@ export default ({ backup }: Props) => {
|
||||
setLoading(true);
|
||||
clearFlashes('backups');
|
||||
deleteBackup(uuid, backup.uuid)
|
||||
.then(() => mutate(data => ({
|
||||
.then(async () => await mutate(data => ({
|
||||
...data!,
|
||||
items: data!.items.filter(b => b.uuid !== backup.uuid),
|
||||
backupCount: data!.backupCount - 1,
|
||||
@ -83,7 +83,7 @@ export default ({ backup }: Props) => {
|
||||
}
|
||||
|
||||
http.post(`/api/client/servers/${uuid}/backups/${backup.uuid}/lock`)
|
||||
.then(() => mutate(data => ({
|
||||
.then(async () => await mutate(data => ({
|
||||
...data!,
|
||||
items: data!.items.map(b => b.uuid !== backup.uuid ? b : {
|
||||
...b,
|
||||
|
@ -21,11 +21,11 @@ interface Props {
|
||||
export default ({ backup, className }: Props) => {
|
||||
const { mutate } = getServerBackups();
|
||||
|
||||
useWebsocketEvent(`${SocketEvent.BACKUP_COMPLETED}:${backup.uuid}` as SocketEvent, data => {
|
||||
useWebsocketEvent(`${SocketEvent.BACKUP_COMPLETED}:${backup.uuid}` as SocketEvent, async (data) => {
|
||||
try {
|
||||
const parsed = JSON.parse(data);
|
||||
|
||||
mutate(data => ({
|
||||
await mutate(data => ({
|
||||
...data!,
|
||||
items: data!.items.map(b => b.uuid !== backup.uuid ? b : ({
|
||||
...b,
|
||||
|
@ -80,8 +80,8 @@ export default () => {
|
||||
const submit = (values: Values, { setSubmitting }: FormikHelpers<Values>) => {
|
||||
clearFlashes('backups:create');
|
||||
createServerBackup(uuid, values)
|
||||
.then(backup => {
|
||||
mutate(data => ({ ...data!, items: data!.items.concat(backup), backupCount: data!.backupCount + 1 }), false);
|
||||
.then(async (backup) => {
|
||||
await mutate(data => ({ ...data!, items: data!.items.concat(backup), backupCount: data!.backupCount + 1 }), false);
|
||||
setVisible(false);
|
||||
})
|
||||
.catch(error => {
|
||||
|
@ -28,18 +28,18 @@ const ChmodFileModal = ({ files, ...props }: OwnProps) => {
|
||||
const directory = ServerContext.useStoreState(state => state.files.directory);
|
||||
const setSelectedFiles = ServerContext.useStoreActions(actions => actions.files.setSelectedFiles);
|
||||
|
||||
const submit = ({ mode }: FormikValues, { setSubmitting }: FormikHelpers<FormikValues>) => {
|
||||
const submit = async ({ mode }: FormikValues, { setSubmitting }: FormikHelpers<FormikValues>) => {
|
||||
clearFlashes('files');
|
||||
|
||||
mutate(data => data!.map(f => f.name === files[0].file ? { ...f, mode: fileBitsToString(mode, !f.isFile), modeBits: mode } : f), false);
|
||||
await mutate(data => data!.map(f => f.name === files[0].file ? { ...f, mode: fileBitsToString(mode, !f.isFile), modeBits: mode } : f), false);
|
||||
|
||||
const data = files.map(f => ({ file: f.file, mode: mode }));
|
||||
|
||||
chmodFiles(uuid, directory, data)
|
||||
.then((): Promise<any> => files.length > 0 ? mutate() : Promise.resolve())
|
||||
.then(async (): Promise<any> => files.length > 0 ? await mutate() : Promise.resolve())
|
||||
.then(() => setSelectedFiles([]))
|
||||
.catch(error => {
|
||||
mutate();
|
||||
.catch(async (error) => {
|
||||
await mutate();
|
||||
setSubmitting(false);
|
||||
clearAndAddHttpError({ key: 'files', error });
|
||||
})
|
||||
|
@ -58,15 +58,15 @@ const FileDropdownMenu = ({ file }: { file: FileObject }) => {
|
||||
}
|
||||
});
|
||||
|
||||
const doDeletion = () => {
|
||||
const doDeletion = async () => {
|
||||
clearFlashes('files');
|
||||
|
||||
// For UI speed, immediately remove the file from the listing before calling the deletion function.
|
||||
// If the delete actually fails, we'll fetch the current directory contents again automatically.
|
||||
mutate(files => files!.filter(f => f.key !== file.key), false);
|
||||
await mutate(files => files!.filter(f => f.key !== file.key), false);
|
||||
|
||||
deleteFiles(uuid, directory, [ file.name ]).catch(error => {
|
||||
mutate();
|
||||
deleteFiles(uuid, directory, [ file.name ]).catch(async (error) => {
|
||||
await mutate();
|
||||
clearAndAddHttpError({ key: 'files', error });
|
||||
});
|
||||
};
|
||||
@ -76,7 +76,7 @@ const FileDropdownMenu = ({ file }: { file: FileObject }) => {
|
||||
clearFlashes('files');
|
||||
|
||||
copyFile(uuid, join(directory, file.name))
|
||||
.then(() => mutate())
|
||||
.then(async () => await mutate())
|
||||
.catch(error => clearAndAddHttpError({ key: 'files', error }))
|
||||
.then(() => setShowSpinner(false));
|
||||
};
|
||||
@ -99,7 +99,7 @@ const FileDropdownMenu = ({ file }: { file: FileObject }) => {
|
||||
clearFlashes('files');
|
||||
|
||||
compressFiles(uuid, directory, [ file.name ])
|
||||
.then(() => mutate())
|
||||
.then(async () => await mutate())
|
||||
.catch(error => clearAndAddHttpError({ key: 'files', error }))
|
||||
.then(() => setShowSpinner(false));
|
||||
};
|
||||
@ -109,7 +109,7 @@ const FileDropdownMenu = ({ file }: { file: FileObject }) => {
|
||||
clearFlashes('files');
|
||||
|
||||
decompressFiles(uuid, directory, file.name)
|
||||
.then(() => mutate())
|
||||
.then(async () => await mutate())
|
||||
.catch(error => clearAndAddHttpError({ key: 'files', error }))
|
||||
.then(() => setShowSpinner(false));
|
||||
};
|
||||
|
@ -50,12 +50,12 @@ const MassActionsBar = () => {
|
||||
setLoadingMessage('Deleting files...');
|
||||
|
||||
deleteFiles(uuid, directory, selectedFiles)
|
||||
.then(() => {
|
||||
mutate(files => files!.filter(f => selectedFiles.indexOf(f.name) < 0), false);
|
||||
.then(async () => {
|
||||
await mutate(files => files!.filter(f => selectedFiles.indexOf(f.name) < 0), false);
|
||||
setSelectedFiles([]);
|
||||
})
|
||||
.catch(error => {
|
||||
mutate();
|
||||
.catch(async (error) => {
|
||||
await mutate();
|
||||
clearAndAddHttpError({ key: 'files', error });
|
||||
})
|
||||
.then(() => setLoading(false));
|
||||
|
Loading…
Reference in New Issue
Block a user