From eb33113912c8b03e8c7e6738f2deef8c07a38dae Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Wed, 3 Nov 2021 21:14:12 +0300 Subject: [PATCH] feat: refactor & added custom async select --- package-lock.json | 72 +++---------------- package.json | 2 +- src/components/AsyncSelect/AsyncSelect.tsx | 25 +++++++ src/components/AsyncSelect/index.ts | 3 + src/components/Nav/Mobile/index.tsx | 2 +- src/components/Select/Select.tsx | 63 ++++++++++++++++ src/components/Select/index.ts | 3 + src/pages/auth/auth.tsx | 18 ++++- .../create/components/CreateCourseForm.tsx | 48 ++++++------- .../components/CreateCourseForm.validator.ts | 2 +- src/pages/main/main.tsx | 20 ++---- src/pages/messages/messages.tsx | 20 ++---- src/pages/profile/profile.tsx | 2 +- 13 files changed, 151 insertions(+), 129 deletions(-) create mode 100644 src/components/AsyncSelect/AsyncSelect.tsx create mode 100644 src/components/AsyncSelect/index.ts create mode 100644 src/components/Select/Select.tsx create mode 100644 src/components/Select/index.ts diff --git a/package-lock.json b/package-lock.json index d1c3347..d7e2a0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -953,18 +953,6 @@ } } }, - "@emotion/cache": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.4.0.tgz", - "integrity": "sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g==", - "requires": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.0.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "^4.0.3" - } - }, "@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", @@ -1028,11 +1016,6 @@ "csstype": "^3.0.2" } }, - "@emotion/sheet": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.2.tgz", - "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw==" - }, "@emotion/styled": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.3.0.tgz", @@ -1206,14 +1189,6 @@ "@types/react-router": "*" } }, - "@types/react-transition-group": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", - "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", - "requires": { - "@types/react": "*" - } - }, "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", @@ -1414,15 +1389,6 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, "electron-to-chromium": { "version": "1.3.870", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.870.tgz", @@ -1870,11 +1836,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, "mini-create-react-context": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", @@ -2207,25 +2168,19 @@ "tiny-warning": "^1.0.0" } }, - "react-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.1.0.tgz", - "integrity": "sha512-SkEBD1AYsSXrIdNj5HBt7+Ehe+jxdiB448J0atJqR6lE3l/GcFlRf4JYB3NlHe/02jrW4AnIQLo1t0IqWrxXOw==", - "requires": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.1.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0" - } - }, "react-side-effect": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==" }, + "react-spinners": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.11.0.tgz", + "integrity": "sha512-rDZc0ABWn/M1OryboGsWVmIPg8uYWl0L35jPUhr40+Yg+syVPjeHwvnB7XWaRpaKus3M0cG9BiJA+ZB0dAwWyw==", + "requires": { + "@emotion/react": "^11.1.4" + } + }, "react-style-singleton": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz", @@ -2243,17 +2198,6 @@ } } }, - "react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", diff --git a/package.json b/package.json index 55cb9ad..1bc4604 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "react-hook-form": "^7.12.2", "react-icons": "^3.11.0", "react-router-dom": "^5.2.0", - "react-select": "^5.1.0", + "react-spinners": "^0.11.0", "validator": "^13.6.0", "yup": "^0.32.9" }, diff --git a/src/components/AsyncSelect/AsyncSelect.tsx b/src/components/AsyncSelect/AsyncSelect.tsx new file mode 100644 index 0000000..22d8b08 --- /dev/null +++ b/src/components/AsyncSelect/AsyncSelect.tsx @@ -0,0 +1,25 @@ +import React, { useEffect, useState } from 'react'; +import Select from '@educt/components/Select'; +import { ISelectPropsType } from '../Select/Select'; +import { OptionType } from '@educt/types'; + +interface IAsyncSelectPropsType extends ISelectPropsType { + loadOptions: () => Promise; +} + +const AsyncSelect: React.FC = props => { + const [options, setOptions] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const { loadOptions, ...selectProps } = props; + + useEffect(() => { + setIsLoading(true); + loadOptions() + .then(options => options && setOptions(options)) + .finally(() => setIsLoading(false)); + }, []); + + return