From 9788d204ee8498d92d274bb9cfed7d4dc89f7253 Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Thu, 1 Jul 2021 22:02:56 +0800 Subject: [PATCH] chore: login view --- shared/hooks/useAsync.ts | 20 +++ shared/hooks/useAsyncFn.ts | 69 ++++++++++ shared/hooks/useMountedState.ts | 18 +++ shared/index.tsx | 5 + shared/manager/storage.ts | 2 +- shared/types.ts | 5 + web/assets/images/login-pattern.svg | 114 ++++++++++++++++ web/package.json | 1 - web/src/App.tsx | 5 +- web/src/components/LoadingSpinner.tsx | 5 +- web/src/components/Spinner.tsx | 7 + web/src/dark.less | 10 ++ web/src/routes/Entry/LoginView.tsx | 89 ++++++++++--- web/src/routes/Entry/index.tsx | 6 +- web/types/index.d.ts | 1 + yarn.lock | 183 +------------------------- 16 files changed, 333 insertions(+), 207 deletions(-) create mode 100644 shared/hooks/useAsync.ts create mode 100644 shared/hooks/useAsyncFn.ts create mode 100644 shared/hooks/useMountedState.ts create mode 100644 shared/types.ts create mode 100644 web/assets/images/login-pattern.svg create mode 100644 web/src/components/Spinner.tsx create mode 100644 web/src/dark.less diff --git a/shared/hooks/useAsync.ts b/shared/hooks/useAsync.ts new file mode 100644 index 00000000..2944c530 --- /dev/null +++ b/shared/hooks/useAsync.ts @@ -0,0 +1,20 @@ +import { DependencyList, useEffect } from 'react'; +import { FunctionReturningPromise } from '../types'; +import { useAsyncFn } from './useAsyncFn'; + +// Reference: https://github.com/streamich/react-use/blob/master/src/useAsync.ts + +export function useAsync( + fn: T, + deps: DependencyList = [] +) { + const [state, callback] = useAsyncFn(fn, deps, { + loading: true, + }); + + useEffect(() => { + callback(); + }, [callback]); + + return state; +} diff --git a/shared/hooks/useAsyncFn.ts b/shared/hooks/useAsyncFn.ts new file mode 100644 index 00000000..6abda2ed --- /dev/null +++ b/shared/hooks/useAsyncFn.ts @@ -0,0 +1,69 @@ +import { DependencyList, useCallback, useRef, useState } from 'react'; +import { FunctionReturningPromise, PromiseType } from '../types'; +import { useMountedState } from './useMountedState'; + +// Reference: https://github.com/streamich/react-use/blob/master/src/useAsyncFn.ts + +export type AsyncState = + | { + loading: boolean; + error?: undefined; + value?: undefined; + } + | { + loading: true; + error?: Error | undefined; + value?: T; + } + | { + loading: false; + error: Error; + value?: undefined; + } + | { + loading: false; + error?: undefined; + value: T; + }; + +type StateFromFunctionReturningPromise = + AsyncState>>; + +export type AsyncFnReturn< + T extends FunctionReturningPromise = FunctionReturningPromise +> = [StateFromFunctionReturningPromise, T]; + +export function useAsyncFn( + fn: T, + deps: DependencyList = [], + initialState: StateFromFunctionReturningPromise = { loading: false } +): AsyncFnReturn { + const lastCallId = useRef(0); + const isMounted = useMountedState(); + const [state, set] = + useState>(initialState); + + const callback = useCallback((...args: Parameters): ReturnType => { + const callId = ++lastCallId.current; + set((prevState) => ({ ...prevState, loading: true })); + + return fn(...args).then( + (value) => { + isMounted() && + callId === lastCallId.current && + set({ value, loading: false }); + + return value; + }, + (error) => { + isMounted() && + callId === lastCallId.current && + set({ error, loading: false }); + + return error; + } + ) as ReturnType; + }, deps); + + return [state, callback as unknown as T]; +} diff --git a/shared/hooks/useMountedState.ts b/shared/hooks/useMountedState.ts new file mode 100644 index 00000000..2c4e9fc8 --- /dev/null +++ b/shared/hooks/useMountedState.ts @@ -0,0 +1,18 @@ +import { useCallback, useEffect, useRef } from 'react'; + +// Reference: https://github.com/streamich/react-use/blob/master/src/useMountedState.ts + +export function useMountedState(): () => boolean { + const mountedRef = useRef(false); + const get = useCallback(() => mountedRef.current, []); + + useEffect(() => { + mountedRef.current = true; + + return () => { + mountedRef.current = false; + }; + }, []); + + return get; +} diff --git a/shared/index.tsx b/shared/index.tsx index 054e512c..a603f9f9 100644 --- a/shared/index.tsx +++ b/shared/index.tsx @@ -13,5 +13,10 @@ export { regField } from './components/FastForm/field'; export { regFormContainer } from './components/FastForm/container'; export type { FastFormContainerComponent } from './components/FastForm/container'; +// hooks +export { useAsync } from './hooks/useAsync'; +export { useAsyncFn } from './hooks/useAsyncFn'; +export { useMountedState } from './hooks/useMountedState'; + // manager export { getStorage, setStorage, useStorage } from './manager/storage'; diff --git a/shared/manager/storage.ts b/shared/manager/storage.ts index cafc163e..41c33c10 100644 --- a/shared/manager/storage.ts +++ b/shared/manager/storage.ts @@ -32,7 +32,7 @@ export function useStorage( getStorage() .get(key) .then((data: T) => { - setValue(data); + setValue(data ?? defaultValue); }); }, [key]); diff --git a/shared/types.ts b/shared/types.ts new file mode 100644 index 00000000..c4162f79 --- /dev/null +++ b/shared/types.ts @@ -0,0 +1,5 @@ +export type PromiseType

> = P extends Promise + ? T + : never; + +export type FunctionReturningPromise = (...args: any[]) => Promise; diff --git a/web/assets/images/login-pattern.svg b/web/assets/images/login-pattern.svg new file mode 100644 index 00000000..48519afd --- /dev/null +++ b/web/assets/images/login-pattern.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/package.json b/web/package.json index c3b4bac1..45dfc3a8 100644 --- a/web/package.json +++ b/web/package.json @@ -22,7 +22,6 @@ "react-dom": "^17.0.2", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", - "react-use": "^17.2.4", "socket.io-client": "^4.1.2", "tailwindcss": "^2.2.4" }, diff --git a/web/src/App.tsx b/web/src/App.tsx index ced9c866..ef519f0e 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -4,6 +4,8 @@ import { useStorage } from 'pawchat-shared'; import clsx from 'clsx'; import { Loadable } from './components/Loadable'; +import './dark.less'; + const MainRoute = Loadable(() => import('./routes/Main').then((module) => module.MainRoute) ); @@ -22,7 +24,7 @@ export const App: React.FC = React.memo(() => { return (

@@ -36,3 +38,4 @@ export const App: React.FC = React.memo(() => {
); }); +App.displayName = 'App'; diff --git a/web/src/components/LoadingSpinner.tsx b/web/src/components/LoadingSpinner.tsx index 9c2a65cb..3c1352ea 100644 --- a/web/src/components/LoadingSpinner.tsx +++ b/web/src/components/LoadingSpinner.tsx @@ -1,5 +1,5 @@ -import { Icon } from '@iconify/react'; import React from 'react'; +import { Spinner } from './Spinner'; interface LoadingSpinnerProps { tip?: string; @@ -8,9 +8,10 @@ export const LoadingSpinner: React.FC = React.memo( (props) => { return (
- + {props.tip ?? 'Processing'}
); } ); +LoadingSpinner.displayName = 'LoadingSpinner'; diff --git a/web/src/components/Spinner.tsx b/web/src/components/Spinner.tsx new file mode 100644 index 00000000..1a5e2899 --- /dev/null +++ b/web/src/components/Spinner.tsx @@ -0,0 +1,7 @@ +import { Icon } from '@iconify/react'; +import React from 'react'; + +export const Spinner: React.FC = React.memo(() => { + return ; +}); +Spinner.displayName = 'Spinner'; diff --git a/web/src/dark.less b/web/src/dark.less new file mode 100644 index 00000000..92c26e5a --- /dev/null +++ b/web/src/dark.less @@ -0,0 +1,10 @@ +.dark { + .ant-form-item-label > label { + color: white; + } + + .ant-divider-horizontal.ant-divider-with-text { + border-top-color: rgba(255,255,255,0.12); + color: rgba(255,255,255,0.85); + } +} diff --git a/web/src/routes/Entry/LoginView.tsx b/web/src/routes/Entry/LoginView.tsx index 8418969a..93379588 100644 --- a/web/src/routes/Entry/LoginView.tsx +++ b/web/src/routes/Entry/LoginView.tsx @@ -1,31 +1,78 @@ -import React from 'react'; -import { FastFormFieldMeta } from 'pawchat-shared'; -import { WebFastForm } from '../../components/WebFastForm'; -import { useCallback } from 'react'; +import { Icon } from '@iconify/react'; +import { Divider } from 'antd'; +import { useAsyncFn } from 'pawchat-shared'; +import React, { useState } from 'react'; +import { Spinner } from '../../components/Spinner'; -const fields: FastFormFieldMeta[] = [ - { - type: 'text', - name: 'email', - label: '邮箱', - }, - { - type: 'password', - name: 'password', - label: '密码', - }, -]; +/** + * 第三方登录 + */ +const OAuthLoginView: React.FC = React.memo(() => { + // TODO + return ( + <> + + +
+ +
+ + ); +}); +OAuthLoginView.displayName = 'OAuthLoginView'; +/** + * 登录视图 + */ export const LoginView: React.FC = React.memo(() => { - const handleLogin = useCallback((values) => { - console.log('values', values); - }, []); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + + const [{ value, loading }, handleLogin] = useAsyncFn(async () => { + await new Promise((resolve) => { + setTimeout(() => { + resolve(''); + }, 2000); + }); + console.log({ username, password }); + }, [username, password]); return (
-
登录 Paw Chat
+
登录 Paw Chat
+ +
+
+
邮箱
+ setUsername(e.target.value)} + /> +
+
+
密码
+ setPassword(e.target.value)} + /> +
- + +
); }); diff --git a/web/src/routes/Entry/index.tsx b/web/src/routes/Entry/index.tsx index f114d189..df3f2ef1 100644 --- a/web/src/routes/Entry/index.tsx +++ b/web/src/routes/Entry/index.tsx @@ -4,6 +4,7 @@ import { LoginView } from './LoginView'; import bgImage from '../../../assets/images/bg.jpg'; import clsx from 'clsx'; import styles from './index.module.less'; +import loginPatternUrl from '../../../assets/images/login-pattern.svg'; export const EntryRoute = React.memo(() => { return ( @@ -11,8 +12,9 @@ export const EntryRoute = React.memo(() => {
@@ -21,7 +23,7 @@ export const EntryRoute = React.memo(() => {
); diff --git a/web/types/index.d.ts b/web/types/index.d.ts index 01fdb0c6..09e3c2e8 100644 --- a/web/types/index.d.ts +++ b/web/types/index.d.ts @@ -1,2 +1,3 @@ declare module '*.jpg'; +declare module '*.svg'; declare module '*.module.less'; diff --git a/yarn.lock b/yarn.lock index a3fb0b83..c55841f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -797,11 +797,6 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/js-cookie@^2.2.6": - version "2.2.6" - resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" - integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== - "@types/json-schema@*", "@types/json-schema@^7.0.6": version "7.0.7" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" @@ -1132,11 +1127,6 @@ resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.1.tgz#b5fde2f0f79c1e120307c415a4c1d5eb15a6f278" integrity sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw== -"@xobotyi/scrollbar-width@^1.9.5": - version "1.9.5" - resolved "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" - integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== - "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2082,7 +2072,7 @@ copy-descriptor@^0.1.0: resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.1: +copy-to-clipboard@^3.2.0: version "3.3.1" resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== @@ -2149,14 +2139,6 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-in-js-utils@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" - integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== - dependencies: - hyphenate-style-name "^1.0.2" - isobject "^3.0.1" - css-loader@^5.2.6: version "5.2.6" resolved "https://registry.npmjs.org/css-loader/-/css-loader-5.2.6.tgz#c3c82ab77fea1f360e587d871a6811f4450cc8d1" @@ -2184,14 +2166,6 @@ css-select@^4.1.3: domutils "^2.6.0" nth-check "^2.0.0" -css-tree@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - css-unit-converter@^1.1.1: version "1.1.2" resolved "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" @@ -2224,7 +2198,7 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.2, csstype@^3.0.6: +csstype@^3.0.2: version "3.0.8" resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== @@ -2605,13 +2579,6 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -error-stack-parser@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== - dependencies: - stackframe "^1.1.1" - es-module-lexer@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.6.0.tgz#e72ab05b7412e62b9be37c37a09bdb6000d706f0" @@ -2856,7 +2823,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -2882,21 +2849,11 @@ fast-levenshtein@~2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-shallow-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" - integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== - fastest-levenshtein@^1.0.12: version "1.0.12" resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== -fastest-stable-stringify@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz#3757a6774f6ec8de40c4e86ec28ea02417214c76" - integrity sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q== - fastq@^1.6.0: version "1.11.0" resolved "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" @@ -3424,11 +3381,6 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -hyphenate-style-name@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3514,13 +3466,6 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -inline-style-prefixer@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.0.tgz#f73d5dbf2855733d6b153a4d24b7b47a73e9770b" - integrity sha512-XTHvRUS4ZJNzC1GixJRmOlWSS45fSt+DJoyQC9ytj0WxQfcgofQtDtyKKYxHUqEsWCs+LIWftPF1ie7+i012Fg== - dependencies: - css-in-js-utils "^2.0.0" - inquirer@3.0.6: version "3.0.6" resolved "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" @@ -4303,11 +4248,6 @@ joycon@^3.0.1: resolved "https://registry.npmjs.org/joycon/-/joycon-3.0.1.tgz#9074c9b08ccf37a6726ff74a18485f85efcaddaf" integrity sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA== -js-cookie@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4609,11 +4549,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -4813,20 +4748,6 @@ nan@^2.12.1: resolved "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== -nano-css@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/nano-css/-/nano-css-5.3.1.tgz#b709383e07ad3be61f64edffacb9d98250b87a1f" - integrity sha512-ENPIyNzANQRyYVvb62ajDd7PAyIgS2LIUnT9ewih4yrXSZX4hKoUwssy8WjUH++kEOA5wUTMgNnV7ko5n34kUA== - dependencies: - css-tree "^1.1.2" - csstype "^3.0.6" - fastest-stable-stringify "^2.0.2" - inline-style-prefixer "^6.0.0" - rtl-css-js "^1.14.0" - sourcemap-codec "^1.4.8" - stacktrace-js "^2.0.2" - stylis "^4.0.6" - nanoclone@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" @@ -6007,31 +5928,6 @@ react-router@5.2.0, react-router@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-universal-interface@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz#5e8d438a01729a4dbbcbeeceb0b86be146fe2b3b" - integrity sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw== - -react-use@^17.2.4: - version "17.2.4" - resolved "https://registry.npmjs.org/react-use/-/react-use-17.2.4.tgz#1f89be3db0a8237c79253db0a15e12bbe3cfeff1" - integrity sha512-vQGpsAM0F5UIlshw5UI8ULGPS4yn5rm7/qvn3T1Gnkrz7YRMEEMh+ynKcmRloOyiIeLvKWiQjMiwRGtdbgs5qQ== - dependencies: - "@types/js-cookie" "^2.2.6" - "@xobotyi/scrollbar-width" "^1.9.5" - copy-to-clipboard "^3.3.1" - fast-deep-equal "^3.1.3" - fast-shallow-equal "^1.0.0" - js-cookie "^2.2.1" - nano-css "^5.3.1" - react-universal-interface "^0.6.2" - resize-observer-polyfill "^1.5.1" - screenfull "^5.1.0" - set-harmonic-interval "^1.0.1" - throttle-debounce "^3.0.1" - ts-easing "^0.2.0" - tslib "^2.1.0" - react@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -6259,13 +6155,6 @@ rimraf@^3.0.0: dependencies: glob "^7.1.3" -rtl-css-js@^1.14.0: - version "1.14.1" - resolved "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.14.1.tgz#f79781d6a0c510abe73fde60aa3cbe9dfd134a45" - integrity sha512-G9N1s/6329FpJr8k9e1U/Lg0IDWThv99sb7k0IrXHjSnubxe01h52/ajsPRafJK1/2Vqrhz3VKLe3E1dx6jS9Q== - dependencies: - "@babel/runtime" "^7.1.2" - run-async@^2.2.0: version "2.4.1" resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -6343,11 +6232,6 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -screenfull@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/screenfull/-/screenfull-5.1.0.tgz#85c13c70f4ead4c1b8a935c70010dfdcd2c0e5c8" - integrity sha512-dYaNuOdzr+kc6J6CFcBrzkLCfyGcMg+gWkJ8us93IQ7y1cevhQAugFsaCdMHb6lw8KV3xPzSxzH7zM1dQap9mA== - scroll-into-view-if-needed@^2.2.25: version "2.2.28" resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" @@ -6438,11 +6322,6 @@ set-blocking@^2.0.0: resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-harmonic-interval@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" - integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== - set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -6628,11 +6507,6 @@ source-map-url@^0.4.0: resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= - source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -6648,11 +6522,6 @@ source-map@^0.7.3, source-map@~0.7.2: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -6688,13 +6557,6 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -stack-generator@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36" - integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q== - dependencies: - stackframe "^1.1.1" - stack-utils@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" @@ -6702,28 +6564,6 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== - -stacktrace-gps@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a" - integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg== - dependencies: - source-map "0.5.6" - stackframe "^1.1.1" - -stacktrace-js@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" - integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== - dependencies: - error-stack-parser "^2.0.6" - stack-generator "^2.0.5" - stacktrace-gps "^3.0.4" - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -6843,11 +6683,6 @@ style-loader@^3.0.0: resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.0.0.tgz#2eafcd0dbe70b07438e0256a9714ea94dd63cbe0" integrity sha512-pqJTDiCtLr8D2eyVWXPiwNkLsAMDuvPHnu+Z/Edo9hu+DzdJwdO5eZv9zUBF6tWI8GJGhAkenWJaVjXI+sHnuQ== -stylis@^4.0.6: - version "4.0.10" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240" - integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg== - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -6988,11 +6823,6 @@ throat@^6.0.1: resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -throttle-debounce@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" - integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== - through@^2.3.6: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7100,11 +6930,6 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -ts-easing@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" - integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== - ts-node@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz#05f10b9a716b0b624129ad44f0ea05dac84ba3be" @@ -7136,7 +6961,7 @@ tslib@^1.10.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.0.3: version "2.3.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==