diff --git a/adapters/api.ts b/adapters/api.ts index 0ef5a684a..673f9c724 100644 --- a/adapters/api.ts +++ b/adapters/api.ts @@ -29,7 +29,7 @@ export default function APIAdapter(): Adapter { name: '', username: '', address: '', - network: NetworkIdEnum.MYRIADOCTOPUS, + network: NetworkIdEnum.MYRIAD, }); return user as AdapterUser; diff --git a/docs/B1frL9ZP6.png b/docs/B1frL9ZP6.png deleted file mode 100644 index f61144835..000000000 Binary files a/docs/B1frL9ZP6.png and /dev/null differ diff --git a/docs/BJTrDqbvp.png b/docs/BJTrDqbvp.png deleted file mode 100644 index f54b83d61..000000000 Binary files a/docs/BJTrDqbvp.png and /dev/null differ diff --git a/docs/BkLc5qbDT.png b/docs/BkLc5qbDT.png deleted file mode 100644 index d8d67f7a1..000000000 Binary files a/docs/BkLc5qbDT.png and /dev/null differ diff --git a/docs/Bka9c9-w6.png b/docs/Bka9c9-w6.png deleted file mode 100644 index 8fa516300..000000000 Binary files a/docs/Bka9c9-w6.png and /dev/null differ diff --git a/docs/Byb2F5Wwa.png b/docs/Byb2F5Wwa.png deleted file mode 100644 index 588366270..000000000 Binary files a/docs/Byb2F5Wwa.png and /dev/null differ diff --git a/docs/HJfaF9bPa.png b/docs/HJfaF9bPa.png deleted file mode 100644 index 662ac6525..000000000 Binary files a/docs/HJfaF9bPa.png and /dev/null differ diff --git a/docs/Hk3G19-vp.png b/docs/Hk3G19-vp.png deleted file mode 100644 index d58b0a358..000000000 Binary files a/docs/Hk3G19-vp.png and /dev/null differ diff --git a/docs/HkjujcWD6.png b/docs/HkjujcWD6.png deleted file mode 100644 index 94981f66d..000000000 Binary files a/docs/HkjujcWD6.png and /dev/null differ diff --git a/docs/S1CCRYbva.png b/docs/S1CCRYbva.png deleted file mode 100644 index 662ac6525..000000000 Binary files a/docs/S1CCRYbva.png and /dev/null differ diff --git a/docs/SkpBK5bwT.png b/docs/SkpBK5bwT.png deleted file mode 100644 index db82ba988..000000000 Binary files a/docs/SkpBK5bwT.png and /dev/null differ diff --git a/docs/Sy8jqcZDp.png b/docs/Sy8jqcZDp.png deleted file mode 100644 index 09e9532e6..000000000 Binary files a/docs/Sy8jqcZDp.png and /dev/null differ diff --git a/docs/exclusive-content-escrow.png b/docs/exclusive-content-escrow.png deleted file mode 100644 index f5dae0cb5..000000000 Binary files a/docs/exclusive-content-escrow.png and /dev/null differ diff --git a/docs/milestone-2-documentation.md b/docs/milestone-2-documentation.md deleted file mode 100644 index 90cb4f848..000000000 --- a/docs/milestone-2-documentation.md +++ /dev/null @@ -1,27 +0,0 @@ -# Documentation - -Myriad Social is a Web3 Social Media that functions as a layer on top of regular social media. Until very recently, Myriad Social was built on top of Octopus Network relying on the underlying infrastructure of its blockchain technology. Myriad Social was always a multichain application, but it's limited to both Octopus Network and NEAR blockchain. - -We've released a new version of Myriad Social, which is now built on the Polkadot Test network, Rococo. The transition to Rococo, represents a significant advancement for Myriad Social, as it allows for greater scalability and interoperability. - -## 1. Adding New Wallet Integrations for Rococo - -With the transition to Rococo, Myriad Social is adding new wallet integrations to enhance user experience and broaden accessibility. Users can now do Crypto Wallet authentication from the Myriad Social Rococo Substrate blockchain. - -![image](./S1CCRYbva.png) - -This enables users to have a seamless and secure experience within the Myriad Social platform, as they can easily make transactions, and engage with other users via tipping without leaving the platform. - -## 2. Allow Tipping and Exclusive Content Pricing Using $MYRIA on Rococo Testnet - -With the addition of a Myriad Social Rococo wallet integration it is easier to integrate the new chain to the already existing content tipping and exclusive content already available in the platform. - -Exclusive content can now be priced in $MYRIAr a currency that is native to the new Myriad Social Rococo blockchain. - -![image](./Hk3G19-vp.png) - -Tipping is also available in this new native currency, users can follow the existing tipping flow and they will see a new currency to tip with if they connect using the new Rococo wallet integration. - -![image](./B1frL9ZP6.png) - -This upgrade will not only enhance the user experience but also open up new possibilities for developing for a broader multi-chain ecosystem integrated social media platform. diff --git a/docs/milestone-2-testing-guide.md b/docs/milestone-2-testing-guide.md deleted file mode 100644 index cfc9b15a3..000000000 --- a/docs/milestone-2-testing-guide.md +++ /dev/null @@ -1,81 +0,0 @@ -# Testing Guide - -To test the current additions in the second milestone you would need to access the current [Myriad Social Testnet](https://app.testnet.myriad.social). - -![image](./BJTrDqbvp.png) - -## Prerequisites - -If you've haven't used Myriad Social before to test the new features you would need to: - -1. Install Polkadot.js in your browser. -2. Generate a new seed-phrase specifically to make a new Myriad Social Account. -3. Open the [Myriad Social Testnet login page](https://app.testnet.myriad.social/login?instance=https%3A%2F%2Fapi.testnet.myriad.social) and authenticate with the Myriad Social Devnet using the Crypto Wallet feature. - -> Because of unforeseen circumstances you are unable to test in the Rococo testnet just yet, the Myriad Social team is still working on releasing the Myriad Social Rococo blockchain as a Rococo Parachain. - -## 1. Testing Myriad Social Wallet Integration - -The wallet integration focuses on two functionalities authentication and moving chains. In a multi-chain ecosystem users will need to be able to change the chain they are on seamlessly. - -### 1.1. Login Using Myriad Social Rococo - -To test the login feature, create a new seed-phrase and open the [Myriad Social Testnet login page](https://app.testnet.myriad.social/login?instance=https%3A%2F%2Fapi.testnet.myriad.social). - -![image](./HJfaF9bPa.png) - -Choose the **"Rococo"** option and click, **Connect**. - -If all is well, you will be redirected to the homepage. - -### 1.2. Moving Chains to Myriad Social Rococo - -In Myriad Social, moving from chain-to-chain will be seamless. You can move from Substrate chains such as Myriad Social on Octopus, Debio network, Kusama, and now Rococo. You can also choose to move to a non-Substrate chain like NEAR Protocol. - -Assuming that you have a Myriad Social Octopus connection move to Rococo by clicking the icon on the top-right. - -![image](./Byb2F5Wwa.png) - -Click on the **"Rococo"** option and choose the wallet you want to use. - -![image](./SkpBK5bwT.png) - -> If you're already on Rococo testnet then try moving around in different chains. That way you can test if you can seamlessly move in-and-out of the Rococo testnet. - -## 2. Testing Myriad Social Tipping and Exclusive Content Integration - -Tipping and exclusive content is an essential feature in Myriad Social. - -### 2.1. Testing Tipping - -Out of the two features, tipping in Myriad Social is the most important, because with tipping you can tip users who are not even on Myriad Social yet! - -In this example, we're going to tip Elon Musk. Someone imported an Elon Musk tweet and all we need to do is to click on the **Send Tip** button. - -![image](./rkGtjq-wa.png) - -Afterward, select your currency and enter the amount, before sending. - -![image](./HkjujcWD6.png) - -> If you didn't find the MYRIAr token (Myriad Social Rococo native token) then you need to switch to the Rococo chain first. - -### 2.2. Testing Exclusive Content - -Exclusive content will only be shown to people who pay to view. The pricing of each content can be set using specific currencies. - -To test this out create a new post. - -![image](./Sy8jqcZDp.png) - -Click on the **Add Exclusive Content** button on the bottom-left of the modal. - -![image](./Bka9c9-w6.png) - -And you will receive a new modal to set the amount and choose the exact currency you want to use. - -![image](./BkLc5qbDT.png) - -# Automated Tests - -All the features connect directly to the blockchain including tipping and adding exclusive content. To run automated tests on these features please refer to the [testing guidelines inside the Myriad Parachain](https://github.com/myriadsocial/myriad-node-parachain?tab=readme-ov-file#guide-to-testing-the-project-using-docker) repository. diff --git a/docs/rkGtjq-wa.png b/docs/rkGtjq-wa.png deleted file mode 100644 index 2180543c1..000000000 Binary files a/docs/rkGtjq-wa.png and /dev/null differ diff --git a/docs/send-tip-myriar.png b/docs/send-tip-myriar.png deleted file mode 100644 index 42057cdb1..000000000 Binary files a/docs/send-tip-myriar.png and /dev/null differ diff --git a/docs/wallet-integration-selection-2.png b/docs/wallet-integration-selection-2.png deleted file mode 100644 index 0206a2822..000000000 Binary files a/docs/wallet-integration-selection-2.png and /dev/null differ diff --git a/docs/wallet-integration-selection.png b/docs/wallet-integration-selection.png deleted file mode 100644 index d4933acf7..000000000 Binary files a/docs/wallet-integration-selection.png and /dev/null differ diff --git a/next.config.js b/next.config.js index 4a8fe2058..b8055b971 100644 --- a/next.config.js +++ b/next.config.js @@ -4,14 +4,10 @@ const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true', }); -const CompressionPlugin = require('compression-webpack-plugin'); -const zlib = require('zlib'); - const { version } = require('./package.json'); /** @type {import('next').NextConfig} */ const moduleExports = { - compress: true, reactStrictMode: false, experimental: { styledComponent: true, @@ -76,31 +72,6 @@ const moduleExports = { use: ['@svgr/webpack'], }); - config.plugins.push( - new CompressionPlugin({ - filename: '[path][base].gz', - algorithm: 'gzip', - test: /\.js$|\.css$|\.html$/, - threshold: 10240, - minRatio: 0.8, - }), - ); - - config.plugins.push( - new CompressionPlugin({ - filename: '[path][base].br', - algorithm: 'brotliCompress', - test: /\.(js|css|html|svg)$/, - compressionOptions: { - params: { - [zlib.constants.BROTLI_PARAM_QUALITY]: 11, - }, - }, - threshold: 10240, - minRatio: 0.8, - }), - ); - return config; }, }; diff --git a/package.json b/package.json index 89005484c..a1bfedf97 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,6 @@ "@material-ui/core": "^4.12.3", "@material-ui/icons": "^4.11.2", "@material-ui/lab": "^4.0.0-alpha.60", - "@myriadsocial/ckeditor5-custom-build": "^0.0.1", "@next/bundle-analyzer": "^12.1.0", "@polkadot/api": "^9.14.2", "@polkadot/extension-dapp": "^0.37.2", @@ -56,22 +55,18 @@ "@udecode/plate": "^14.2.0", "@udecode/plate-common": "^7.0.2", "axios": "^0.26.1", - "compression-webpack-plugin": "10.0.0", "date-fns": "^2.28.0", "detect-browser": "^5.3.0", "dotenv": "^16.0.1", "emoji-picker-react": "^3.5.1", "express": "^4.17.3", - "express-static-gzip": "^2.1.7", "firebase": "^8.6.2", "global": "^4.4.0", "html-react-parser": "^3.0.8", - "html-to-text": "^9.0.5", "http-proxy-middleware": "^2.0.4", "i18next": "^21.6.7", "i18next-browser-languagedetector": "^6.1.2", "immutability-helper": "^3.1.1", - "js-sha256": "^0.11.0", "lodash": "^4.17.21", "millify": "^4.0.0", "mux.js": "^6.0.1", @@ -92,7 +87,6 @@ "react-dom": "^17.0.2", "react-dropzone": "^11.3.4", "react-i18next": "^11.15.3", - "react-icons": "^4.12.0", "react-infinite-scroll-component": "^6.1.0", "react-is": "^16.8.0", "react-joyride": "^2.4.0", @@ -111,7 +105,7 @@ "remark-gfm": "^3.0.1", "remark-html": "^15.0.1", "serve-index": "^1.9.1", - "sharp": "^0.32.6", + "sharp": "^0.30.7", "slate": "^0.81.1", "slate-history": "^0.66.0", "slate-hyperscript": "^0.77.0", @@ -119,7 +113,7 @@ "styled-components": "^5.3.5", "ua-parser-js": "^1.0.33", "unique-names-generator": "^4.7.1", - "uuid": "^9.0.1", + "uuid": "^8.3.2", "validator": "^13.7.0", "yarn-deduplicate": "^5.0.0" }, @@ -156,8 +150,7 @@ "nodemon": "^2.0.15", "prettier-plugin-sh": "^0.12.8", "prop-types": "^15.7.2", - "typescript": "latest", - "zlib": "^1.0.5" + "typescript": "latest" }, "resolutions": { "@polkadot/api": "^9.14.2", diff --git a/pages/_app.tsx b/pages/_app.tsx index 0a10057d6..1a234ede9 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -10,8 +10,6 @@ import Head from 'next/head'; import CssBaseline from '@material-ui/core/CssBaseline'; import { ThemeProvider } from '@material-ui/core/styles'; -import '../ckeditor.css'; - import { SnackbarProvider } from 'notistack'; import { I18nextProvider } from 'react-i18next'; import { AppContextProvider } from 'src/context/AppContextProvider'; diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index cafdf9731..c0076e9dc 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -119,52 +119,6 @@ const createOptions = (req: NextApiRequest) => ({ } }, }), - CredentialsProvider({ - id: 'tokenCredentials', - // The name to display on the sign in form (e.g. 'Sign in with...') - name: 'Token Credential', - // The credentials is used to generate a suitable form on the sign in page. - // You can specify whatever fields you are expecting to be submitted. - // e.g. domain, username, password, 2FA token, etc. - credentials: { - token: { label: 'Token', type: 'text' }, - rpcUrl: { label: 'rpc url', type: 'text' }, - instanceURL: { label: 'Instance url', type: 'text' }, - }, - async authorize(credentials) { - if (!credentials?.token) throw Error('no token!'); - - // Initialize instance api url - initialize({ apiURL: credentials.instanceURL }); - - const data = await AuthLinkAPI.loginWithAccessToken( - credentials.token, - credentials.rpcUrl, - ); - - if (!data?.token?.accessToken) throw Error('Failed to authorize user!'); - - try { - const user = data.user; - const accessToken = data.token.accessToken; - const payload = encryptMessage(accessToken, user.username); - const signInCredential = parseCredential( - user, - credentials, - LoginType.WALLET, - ); - - // Any object returned will be saved in `user` property of the JWT - return credentialToSession(signInCredential, payload); - } catch (error) { - // If failed, use instance url from session - initialize({ cookie: req.headers.cookie }); - - console.log('[api][Auth]', error); - return null; - } - }, - }), CredentialsProvider({ id: 'updateSession', // The name to display on the sign in form (e.g. 'Sign in with...') diff --git a/public/images/login-background.png b/public/images/login-background.png new file mode 100644 index 000000000..640bb006d Binary files /dev/null and b/public/images/login-background.png differ diff --git a/public/images/profile-default-bg.png b/public/images/profile-default-bg.png index 0375f67d5..87f61d12a 100644 Binary files a/public/images/profile-default-bg.png and b/public/images/profile-default-bg.png differ diff --git a/public/sw.js.br b/public/sw.js.br deleted file mode 100644 index 8ea637415..000000000 Binary files a/public/sw.js.br and /dev/null differ diff --git a/public/sw.js.gz b/public/sw.js.gz deleted file mode 100644 index 70057ed2a..000000000 Binary files a/public/sw.js.gz and /dev/null differ diff --git a/public/workbox-21ea936c.js.br b/public/workbox-21ea936c.js.br deleted file mode 100644 index 4e286cd29..000000000 Binary files a/public/workbox-21ea936c.js.br and /dev/null differ diff --git a/public/workbox-21ea936c.js.gz b/public/workbox-21ea936c.js.gz deleted file mode 100644 index 7a0be00e1..000000000 Binary files a/public/workbox-21ea936c.js.gz and /dev/null differ diff --git a/server/index.ts b/server/index.ts index b38ecabf4..ec0988801 100644 --- a/server/index.ts +++ b/server/index.ts @@ -2,7 +2,6 @@ import next from 'next'; import * as dotenv from 'dotenv'; import express from 'express'; -import expressStaticGzip from 'express-static-gzip'; import path from 'path'; import serveIndex from 'serve-index'; @@ -26,14 +25,6 @@ app.prepare().then(() => { serveIndex(path.join(__dirname, '../docs')), ); - server.use( - '/_next/static', - expressStaticGzip('/_next/static', { - enableBrotli: true, - orderPreference: ['br', 'gz'], - }), - ); - server.all('*', (req, res) => { return handle(req, res); }); diff --git a/src/components/AddSocialMedia/AddSocialMedia.tsx b/src/components/AddSocialMedia/AddSocialMedia.tsx index 029f78751..fcd720d48 100644 --- a/src/components/AddSocialMedia/AddSocialMedia.tsx +++ b/src/components/AddSocialMedia/AddSocialMedia.tsx @@ -51,7 +51,6 @@ const prefix: Record = { [SocialsEnum.VK]: '', [SocialsEnum.WECHAT]: '', [SocialsEnum.WEIBO]: '', - [SocialsEnum.X]: '', }; export const AddSocialMedia: React.FC = props => { diff --git a/src/components/ExclusiveContentCreate/CurrencyOption.tsx b/src/components/ExclusiveContentCreate/CurrencyOption.tsx index 9e1a2edf8..11f57072c 100644 --- a/src/components/ExclusiveContentCreate/CurrencyOption.tsx +++ b/src/components/ExclusiveContentCreate/CurrencyOption.tsx @@ -44,11 +44,7 @@ export const CurrencyOption: React.FC = ({ }; const filterCurrency = balances.filter(balance => { - if ( - balance.networkId === 'myriad' || - balance.networkId === 'debio' || - balance.networkId === 'rococo' - ) + if (balance.networkId === 'myriad' || balance.networkId === 'debio') return balance; }); diff --git a/src/components/ExperienceEditor/BasicExperienceEditor.tsx b/src/components/ExperienceEditor/BasicExperienceEditor.tsx deleted file mode 100644 index e3255ae95..000000000 --- a/src/components/ExperienceEditor/BasicExperienceEditor.tsx +++ /dev/null @@ -1,443 +0,0 @@ -import { - SearchIcon, - XCircleIcon, - PlusCircleIcon, - ChevronDownIcon, -} from '@heroicons/react/solid'; - -import React, { useState, useRef } from 'react'; - -import { - Button, - FormControl, - FormHelperText, - IconButton, - InputLabel, - OutlinedInput, - SvgIcon, - TextField, - Typography, -} from '@material-ui/core'; -import CircularProgress from '@material-ui/core/CircularProgress'; -import { - Autocomplete, - AutocompleteChangeReason, - AutocompleteRenderOptionState, -} from '@material-ui/lab'; - -import { ExperienceProps, VisibilityItem } from '../../interfaces/experience'; -import { Dropzone } from '../atoms/Dropzone'; -import { ListItemPeopleComponent } from '../atoms/ListItem/ListItemPeople'; -import { Loading } from '../atoms/Loading'; -import ShowIf from '../common/show-if.component'; -import { useStyles } from './Experience.styles'; - -import { debounce, isEmpty } from 'lodash'; -import { useSearchHook } from 'src/hooks/use-search.hooks'; -import { User } from 'src/interfaces/user'; -import i18n from 'src/locale'; - -type BasicExperienceEditorProps = { - experience?: ExperienceProps; - handleImageUpload: (files: File[]) => Promise; - onStage: (value: number) => void; - onExperience: (value: any) => void; - onSearchUser?: (query: string) => void; - users?: User[]; - quick?: boolean; - experienceVisibility?: VisibilityItem; - newExperience: ExperienceProps; - onVisibility: (value: any) => void; - image: string; - selectedVisibility: VisibilityItem; - selectedUserIds: User[]; - onSelectedUserIds: (value: any) => void; -}; - -const DEFAULT_EXPERIENCE: ExperienceProps = { - name: '', - allowedTags: [], - people: [], - prohibitedTags: [], - visibility: '', - selectedUserIds: [], -}; - -export const BasicExperienceEditor: React.FC = - props => { - const { - experience = DEFAULT_EXPERIENCE, - handleImageUpload, - onSearchUser, - onStage, - onExperience, - users, - quick = false, - newExperience, - image, - onVisibility, - selectedVisibility, - selectedUserIds, - onSelectedUserIds, - } = props; - const styles = useStyles({ quick }); - const { clearUsers } = useSearchHook(); - - const ref = useRef(null); - const [, setDetailChanged] = useState(false); - const [isLoading] = useState(false); - const [isLoadingSelectedUser] = useState(false); - const [errors] = useState({ - name: false, - picture: false, - tags: false, - people: false, - visibility: false, - selectedUserId: false, - }); - - const handleChange = - (field: keyof ExperienceProps) => - (event: React.ChangeEvent) => { - const value = event.target.value.trimStart(); - - onExperience(prevExperience => ({ - ...prevExperience, - [field]: value, - })); - - setDetailChanged(experience[field] !== value); - }; - - const handleNext = () => { - const number = 2; - onStage(number); - }; - - const visibilityList: VisibilityItem[] = [ - { - id: 'public', - name: i18n.t('Experience.Editor.Visibility.Public'), - }, - { - id: 'private', - name: i18n.t('Experience.Editor.Visibility.OnlyMe'), - }, - { - id: 'selected_user', - name: i18n.t('Experience.Editor.Visibility.Custom'), - }, - { - id: 'friend', - name: i18n.t('Experience.Editor.Visibility.Friend_Only'), - }, - ]; - - const handleVisibilityChange = ( - // eslint-disable-next-line @typescript-eslint/ban-types - event: React.ChangeEvent<{}>, - value: VisibilityItem, - reason: AutocompleteChangeReason, - ) => { - onVisibility(value); - onExperience(prevExperience => ({ - ...prevExperience, - visibility: value?.id, - })); - - setDetailChanged(true); - }; - - const handleSearchUser = (event: React.ChangeEvent) => { - const debounceSubmit = debounce(() => { - onSearchUser(event.target.value); - }, 300); - - debounceSubmit(); - }; - - const clearSearchedUser = () => { - const debounceSubmit = debounce(() => { - onSearchUser(''); - }, 300); - - debounceSubmit(); - }; - - const handleVisibilityPeopleChange = ( - // eslint-disable-next-line @typescript-eslint/ban-types - event: React.ChangeEvent<{}>, - value: User[], - reason: AutocompleteChangeReason, - ) => { - const people = selectedUserIds ? selectedUserIds : []; - console.log({ value }); - if (reason === 'select-option') { - onSelectedUserIds([ - ...people, - ...value.filter(option => people.indexOf(option) === -1), - ]); - clearSearchedUser(); - clearUsers(); - } - - setDetailChanged(true); - }; - - const removeVisibilityPeople = (selected: User) => () => { - onSelectedUserIds( - selectedUserIds - ? selectedUserIds.filter(people => people.id != selected.id) - : [], - ); - - setDetailChanged(true); - }; - - return ( -
- -
-
- - {i18n.t(`Experience.Editor.Header`)} - - - {i18n.t(`Experience.Editor.Sub_Header`)} - -
- - - -
-
- -
-
- - - -
- -
-
-
-
-
- - - {i18n.t('Experience.Editor.Subtitle_1')} - - - - {i18n.t('Experience.Editor.Helper.Name')} - - - {newExperience?.name.length ?? 0}/50 - - - - option.name} - getOptionSelected={(option, value) => option?.id === value.id} - autoHighlight={false} - disableClearable - onChange={handleVisibilityChange} - value={selectedVisibility || null} - popupIcon={ - - } - renderInput={({ inputProps, ...rest }) => ( - - )} - /> - - {selectedVisibility?.id === 'selected_user' && ( - <> - option.id === value.id} - filterSelectedOptions={true} - getOptionLabel={option => `${option.username} ${option.name}`} - disableClearable - autoHighlight={false} - popupIcon={ - - } - onChange={handleVisibilityPeopleChange} - renderTags={() => null} - renderInput={params => ( - - {params.InputProps.endAdornment} - - ), - }} - helperText={i18n.t('Experience.Editor.Helper.People')} - /> - )} - renderOption={( - option, - state: AutocompleteRenderOptionState, - ) => { - if (option.id === '') return null; - return ( -
- - @{option.username} - - } - avatar={option.profilePictureURL} - platform={'myriad'} - action={ - - {state.selected ? ( - - ) : ( - - )} - - } - /> -
- ); - }} - /> - -
-
- - - - {selectedUserIds - .filter(people => !isEmpty(people.id)) - .map(people => ( - - @{people.username} - - } - avatar={people.profilePictureURL} - platform={'myriad'} - action={ - - - - } - /> - ))} -
-
- - )} - - - - {i18n.t('Experience.Editor.Subtitle_2')} - - - -   - - - {newExperience?.description?.length ?? 0}/280 - - -
-
-
- ); - }; diff --git a/src/components/ExperienceEditor/ExperienceAdditionalEditor.tsx b/src/components/ExperienceEditor/ExperienceAdditionalEditor.tsx deleted file mode 100644 index 01bc1a99d..000000000 --- a/src/components/ExperienceEditor/ExperienceAdditionalEditor.tsx +++ /dev/null @@ -1,427 +0,0 @@ -import { - SearchIcon, - XCircleIcon, - PlusCircleIcon, -} from '@heroicons/react/solid'; - -import React, { useState, useRef } from 'react'; - -import { - Button, - FormControl, - IconButton, - SvgIcon, - TextField, - Typography, -} from '@material-ui/core'; -import { - Autocomplete, - AutocompleteChangeReason, - AutocompleteRenderOptionState, -} from '@material-ui/lab'; - -import { ExperienceProps, Tag } from '../../interfaces/experience'; -import { People } from '../../interfaces/people'; -import { ListItemPeopleComponent } from '../atoms/ListItem/ListItemPeople'; -import ShowIf from '../common/show-if.component'; -import { useStyles } from './Experience.styles'; - -import { debounce } from 'lodash'; -import i18n from 'src/locale'; - -type ExperienceAdditionalEditorProps = { - type?: 'Clone' | 'Edit' | 'Create'; - isEdit?: boolean; - experience?: ExperienceProps; - tags: Tag[]; - people: People[]; - onSearchTags: (query: string) => void; - onSearchPeople: (query: string) => void; - onExperience: (value: any) => void; - onStage: (value: number) => void; - quick?: boolean; - showAdvance?: boolean; - newExperience: ExperienceProps; - saveExperience: () => void; -}; - -enum TagsProps { - ALLOWED = 'allowed', - PROHIBITED = 'prohibited', -} - -const DEFAULT_EXPERIENCE: ExperienceProps = { - name: '', - allowedTags: [], - people: [], - prohibitedTags: [], - visibility: '', - selectedUserIds: [], -}; - -export const ExperienceAdditionalEditor: React.FC = - props => { - const { - type = 'Create', - experience = DEFAULT_EXPERIENCE, - people, - tags, - onSearchTags, - onSearchPeople, - quick = false, - onStage, - onExperience, - newExperience, - saveExperience, - } = props; - const styles = useStyles({ quick }); - const ref = useRef(null); - const [, setDetailChanged] = useState(false); - const [errors] = useState({ - name: false, - picture: false, - tags: false, - people: false, - visibility: false, - selectedUserId: false, - }); - - const handleSearchTags = (event: React.ChangeEvent) => { - const debounceSubmit = debounce(() => { - onSearchTags(event.target.value); - }, 300); - - debounceSubmit(); - }; - - const handleSearchPeople = (event: React.ChangeEvent) => { - const debounceSubmit = debounce(() => { - onSearchPeople(event.target.value); - }, 300); - - debounceSubmit(); - }; - - const clearSearchedPeople = () => { - const debounceSubmit = debounce(() => { - onSearchPeople(''); - }, 300); - - debounceSubmit(); - }; - - const handleTagsInputChange = ( - // eslint-disable-next-line @typescript-eslint/ban-types - event: React.ChangeEvent<{}>, - newValue: string, - type: TagsProps, - ) => { - const options = newValue.split(/[ ,]+/); - - let tmpTags: string[] = []; - if (type === TagsProps.ALLOWED) { - tmpTags = newExperience.allowedTags; - } else if (type === TagsProps.PROHIBITED) { - tmpTags = newExperience.prohibitedTags ?? []; - } - - const fieldValue = tmpTags - .concat(options) - .map(x => x.trim()) - .filter(x => x); - - if (options.length > 1) { - handleTagsChange(event, fieldValue, 'create-option', type); - } - }; - - const handleTagsChange = ( - // eslint-disable-next-line @typescript-eslint/ban-types - event: React.ChangeEvent<{}>, - value: string[], - reason: AutocompleteChangeReason, - type: TagsProps, - ) => { - const data = [...new Set(value.map(tag => tag.replace('#', '')))]; - - const prohibitedTagsChanged = - type === TagsProps.PROHIBITED && - (data.filter( - tag => - !experience?.prohibitedTags || - !experience.prohibitedTags.includes(tag), - ).length > 0 || - experience?.prohibitedTags?.length !== data.length); - const allowedTagsChanged = - type === TagsProps.ALLOWED && - (data.filter(tag => !experience.allowedTags.includes(tag)).length > 0 || - data.length !== experience.allowedTags.length); - - setDetailChanged(prohibitedTagsChanged || allowedTagsChanged); - - if (reason === 'remove-option') { - if (type === TagsProps.ALLOWED) { - onExperience(prevExperience => ({ - ...prevExperience, - allowedTags: data, - })); - } else if (type === TagsProps.PROHIBITED) { - onExperience(prevExperience => ({ - ...prevExperience, - prohibitedTags: data, - })); - } - } - - if (reason === 'create-option') { - if (type === TagsProps.ALLOWED) { - onExperience(prevExperience => ({ - ...prevExperience, - allowedTags: data, - })); - } else if (type === TagsProps.PROHIBITED) { - onExperience(prevExperience => ({ - ...prevExperience, - prohibitedTags: data, - })); - } - } - - if (reason === 'select-option') { - if (type === TagsProps.ALLOWED) { - onExperience(prevExperience => ({ - ...prevExperience, - allowedTags: data, - })); - } else if (type === TagsProps.PROHIBITED) { - onExperience(prevExperience => ({ - ...prevExperience, - prohibitedTags: data, - })); - } - } - }; - - const handlePeopleChange = ( - // eslint-disable-next-line @typescript-eslint/ban-types - event: React.ChangeEvent<{}>, - value: People[], - reason: AutocompleteChangeReason, - ) => { - const people = newExperience?.people ? newExperience.people : []; - if (reason === 'select-option') { - onExperience(prevExperience => ({ - ...prevExperience, - people: [ - ...people, - ...value.filter(option => people.indexOf(option) === -1), - ], - })); - clearSearchedPeople(); - } - - setDetailChanged(true); - }; - - const handleBack = () => { - onStage(2); - }; - - return ( -
- -
- - - -
- - {i18n.t(`Experience.Editor.Header`)} - - - {i18n.t(`Experience.Editor.Sub_Header`)} - -
- - - -
-
- -
-
- - className={styles.fill} - id="experience-tags-include" - freeSolo - multiple - value={newExperience.allowedTags ?? []} - options={tags - .map(tag => tag.id) - .filter(tag => !newExperience.allowedTags.includes(tag))} - disableClearable - onChange={(event, value, reason) => { - handleTagsChange(event, value, reason, TagsProps.ALLOWED); - }} - onInputChange={(event, value) => { - handleTagsInputChange(event, value, TagsProps.ALLOWED); - }} - getOptionLabel={option => `#${option}`} - renderInput={params => ( - - {params.InputProps.endAdornment} - - ), - }} - /> - )} - /> - - tag.id) - .filter(tag => !newExperience.prohibitedTags?.includes(tag))} - disableClearable - onChange={(event, value, reason) => { - handleTagsChange(event, value, reason, TagsProps.PROHIBITED); - }} - onInputChange={(event, value) => { - handleTagsInputChange(event, value, TagsProps.PROHIBITED); - }} - getOptionLabel={option => `#${option}`} - renderInput={params => ( - - {params.InputProps.endAdornment} - - ), - }} - /> - )} - /> - - option.id === value.id} - filterSelectedOptions={true} - getOptionLabel={option => `${option.username} ${option.name}`} - disableClearable - autoHighlight={false} - popupIcon={ - - } - onChange={handlePeopleChange} - renderTags={() => null} - renderInput={params => ( - - {params.InputProps.endAdornment} - - ), - }} - helperText={''} - /> - )} - renderOption={(option, state: AutocompleteRenderOptionState) => { - if (option.id === '') return null; - return ( -
- - @{option.username} - - } - avatar={option.profilePictureURL} - platform={option.platform} - action={ - - {state.selected ? ( - - ) : ( - - )} - - } - /> -
- ); - }} - /> -
-
-
- ); - }; diff --git a/src/components/ExperienceEditor/ExperienceAdminEditor.tsx b/src/components/ExperienceEditor/ExperienceAdminEditor.tsx deleted file mode 100644 index 1a0156b65..000000000 --- a/src/components/ExperienceEditor/ExperienceAdminEditor.tsx +++ /dev/null @@ -1,289 +0,0 @@ -import { - SearchIcon, - XCircleIcon, - PlusCircleIcon, -} from '@heroicons/react/solid'; - -import React, { useState, useRef } from 'react'; - -import { - Button, - FormControl, - IconButton, - SvgIcon, - TextField, - Typography, -} from '@material-ui/core'; -import { - Autocomplete, - AutocompleteChangeReason, - AutocompleteRenderOptionState, -} from '@material-ui/lab'; - -import { ExperienceProps } from '../../interfaces/experience'; -import { ListItemPeopleComponent } from '../atoms/ListItem/ListItemPeople'; -import { Loading } from '../atoms/Loading'; -import ShowIf from '../common/show-if.component'; -import { useStyles } from './Experience.styles'; - -import { debounce, isEmpty } from 'lodash'; -import { useSearchHook } from 'src/hooks/use-search.hooks'; -import { User } from 'src/interfaces/user'; -import i18n from 'src/locale'; - -type AdminExperienceEditorProps = { - type?: 'Clone' | 'Edit' | 'Create'; - isEdit?: boolean; - experience?: ExperienceProps; - onStage: (value: number) => void; - onSearchUser?: (query: string) => void; - users?: User[]; - quick?: boolean; - showAdvance?: boolean; - editors: User[]; - setEditors: (editors: User[]) => void; - onExperience: (value: any) => void; -}; - -export const AdminExperienceEditor: React.FC = - props => { - const { - onSearchUser, - users, - quick = false, - onStage, - editors, - setEditors, - onExperience, - } = props; - const styles = useStyles({ quick }); - const { clearUsers } = useSearchHook(); - - const ref = useRef(null); - const [, setDetailChanged] = useState(false); - const [isLoadingSelectedUser] = useState(false); - const [errors] = useState({ - name: false, - picture: false, - tags: false, - people: false, - visibility: false, - selectedUserId: false, - }); - - const handleBack = () => { - onExperience(prevExperience => ({ - ...prevExperience, - editorsId: editors.map(user => user.id), - })); - onStage(1); - }; - - const handleNext = () => { - onExperience(prevExperience => ({ - ...prevExperience, - editorsId: editors.map(user => user.id), - })); - onStage(3); - }; - - const handleSearchUser = (event: React.ChangeEvent) => { - const debounceSubmit = debounce(() => { - onSearchUser(event.target.value); - }, 300); - - debounceSubmit(); - }; - - const clearSearchedUser = () => { - const debounceSubmit = debounce(() => { - onSearchUser(''); - }, 300); - - debounceSubmit(); - }; - - const handleEditorsPeopleChange = ( - // eslint-disable-next-line @typescript-eslint/ban-types - event: React.ChangeEvent<{}>, - value: User[], - reason: AutocompleteChangeReason, - ) => { - const people = editors ? editors : []; - console.log({ value }); - if (reason === 'select-option') { - setEditors([ - ...people, - ...value.filter(option => people.indexOf(option) === -1), - ]); - clearSearchedUser(); - clearUsers(); - } - - // setDetailChanged(true); - }; - - const removeEditorsPeople = (selected: User) => () => { - setEditors( - editors ? editors.filter(people => people.id != selected.id) : [], - ); - - setDetailChanged(true); - }; - - return ( -
- -
- - - -
- - {i18n.t(`Experience.Editor.Header`)} - - - {i18n.t(`Experience.Editor.Sub_Header`)} - -
- - - -
-
- -
-
- <> - option.id === value.id} - filterSelectedOptions={true} - getOptionLabel={option => `${option.username} ${option.name}`} - disableClearable - autoHighlight={false} - popupIcon={ - - } - onChange={handleEditorsPeopleChange} - renderTags={() => null} - renderInput={params => ( - - {params.InputProps.endAdornment} - - ), - }} - helperText={i18n.t('Experience.Editor.Helper.People')} - /> - )} - renderOption={( - option, - state: AutocompleteRenderOptionState, - ) => { - if (option.id === '') return null; - return ( -
- - @{option.username} - - } - avatar={option.profilePictureURL} - platform={'myriad'} - action={ - - {state.selected ? ( - - ) : ( - - )} - - } - /> -
- ); - }} - /> - -
-
- - - - {editors - .filter(people => !isEmpty(people.id)) - .map(people => ( - - @{people.username} - - } - avatar={people.profilePictureURL} - platform={'myriad'} - action={ - - - - } - /> - ))} -
-
- -
-
-
- ); - }; diff --git a/src/components/ExperienceEditor/ExperienceEditor.tsx b/src/components/ExperienceEditor/ExperienceEditor.tsx index a6b72508e..1e0d5d81d 100644 --- a/src/components/ExperienceEditor/ExperienceEditor.tsx +++ b/src/components/ExperienceEditor/ExperienceEditor.tsx @@ -1,8 +1,35 @@ +import { + SearchIcon, + XCircleIcon, + PlusCircleIcon, + ChevronDownIcon, + CogIcon, + ChevronUpIcon, +} from '@heroicons/react/solid'; + import React, { useState, useEffect, useRef } from 'react'; +import InfiniteScroll from 'react-infinite-scroll-component'; +import { useSelector } from 'react-redux'; import { useRouter } from 'next/router'; -import { Button } from '@material-ui/core'; +import { + Button, + FormControl, + FormHelperText, + IconButton, + InputLabel, + OutlinedInput, + SvgIcon, + TextField, + Typography, +} from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import { + Autocomplete, + AutocompleteChangeReason, + AutocompleteRenderOptionState, +} from '@material-ui/lab'; import { ExperienceProps, @@ -11,17 +38,22 @@ import { SelectedUserIds, } from '../../interfaces/experience'; import { People } from '../../interfaces/people'; +import { PostDetailExperience } from '../PostDetailExperience/PostDetailExperience'; +import { Dropzone } from '../atoms/Dropzone'; +import { ListItemPeopleComponent } from '../atoms/ListItem/ListItemPeople'; +import { Loading } from '../atoms/Loading'; import ShowIf from '../common/show-if.component'; -import { BasicExperienceEditor } from './BasicExperienceEditor'; import { useStyles } from './Experience.styles'; -import { ExperienceAdditionalEditor } from './ExperienceAdditionalEditor'; -import { AdminExperienceEditor } from './ExperienceAdminEditor'; -import { isEmpty } from 'lodash'; +import { debounce, isEmpty } from 'lodash'; import { useExperienceHook } from 'src/hooks/use-experience-hook'; +import { useSearchHook } from 'src/hooks/use-search.hooks'; +import { Post } from 'src/interfaces/post'; import { User } from 'src/interfaces/user'; import * as UserAPI from 'src/lib/api/user'; import i18n from 'src/locale'; +import { RootState } from 'src/reducers'; +import { UserState } from 'src/reducers/user/reducer'; type ExperienceEditorProps = { type?: 'Clone' | 'Edit' | 'Create'; @@ -40,6 +72,11 @@ type ExperienceEditorProps = { experienceVisibility?: VisibilityItem; }; +enum TagsProps { + ALLOWED = 'allowed', + PROHIBITED = 'prohibited', +} + const DEFAULT_EXPERIENCE: ExperienceProps = { name: '', allowedTags: [], @@ -67,27 +104,37 @@ export const ExperienceEditor: React.FC = props => { } = props; const styles = useStyles({ quick }); - const { loadPostExperience } = useExperienceHook(); + const { + experiencePosts, + hasMore, + loadPostExperience, + loadNextPostExperience, + loadExperiencePostList, + addPostsToExperience, + } = useExperienceHook(); const router = useRouter(); + const { clearUsers } = useSearchHook(); const ref = useRef(null); - const [, setExperienceId] = useState(); + const { anonymous, user } = useSelector( + state => state.userState, + ); + const [experienceId, setExperienceId] = useState(); const [newExperience, setNewExperience] = useState(experience); const [image, setImage] = useState( experience?.experienceImageURL, ); const [, setDetailChanged] = useState(false); - const [stage, setStage] = useState(1); - const [, setIsloading] = useState(false); + const [isLoading, setIsloading] = useState(false); const [isSubmitted, setIsSubmitted] = useState(false); const [selectedVisibility, setSelectedVisibility] = useState(experienceVisibility); const [selectedUserIds, setSelectedUserIds] = useState([]); - const [editors, setEditors] = useState([]); const [pageUserIds, setPageUserIds] = React.useState(1); - const [, setIsLoadingSelectedUser] = useState(false); - const [, setErrors] = useState({ + const [isLoadingSelectedUser, setIsLoadingSelectedUser] = + useState(false); + const [errors, setErrors] = useState({ name: false, picture: false, tags: false, @@ -112,6 +159,30 @@ export const ExperienceEditor: React.FC = props => { } }, [isSubmitted, newExperience]); + const handleSearchTags = (event: React.ChangeEvent) => { + const debounceSubmit = debounce(() => { + onSearchTags(event.target.value); + }, 300); + + debounceSubmit(); + }; + + const handleSearchPeople = (event: React.ChangeEvent) => { + const debounceSubmit = debounce(() => { + onSearchPeople(event.target.value); + }, 300); + + debounceSubmit(); + }; + + const clearSearchedPeople = () => { + const debounceSubmit = debounce(() => { + onSearchPeople(''); + }, 300); + + debounceSubmit(); + }; + const handleImageUpload = async (files: File[]) => { if (files.length > 0) { setIsloading(true); @@ -127,8 +198,141 @@ export const ExperienceEditor: React.FC = props => { setDetailChanged(true); }; - const onStage = (value: number) => { - setStage(value); + const handleChange = + (field: keyof ExperienceProps) => + (event: React.ChangeEvent) => { + const value = event.target.value.trimStart(); + + setNewExperience(prevExperience => ({ + ...prevExperience, + [field]: value, + })); + + setDetailChanged(experience[field] !== value); + }; + + const handleTagsInputChange = ( + // eslint-disable-next-line @typescript-eslint/ban-types + event: React.ChangeEvent<{}>, + newValue: string, + type: TagsProps, + ) => { + const options = newValue.split(/[ ,]+/); + + let tmpTags: string[] = []; + if (type === TagsProps.ALLOWED) { + tmpTags = newExperience.allowedTags; + } else if (type === TagsProps.PROHIBITED) { + tmpTags = newExperience.prohibitedTags ?? []; + } + + const fieldValue = tmpTags + .concat(options) + .map(x => x.trim()) + .filter(x => x); + + if (options.length > 1) { + handleTagsChange(event, fieldValue, 'create-option', type); + } + }; + + const handleTagsChange = ( + // eslint-disable-next-line @typescript-eslint/ban-types + event: React.ChangeEvent<{}>, + value: string[], + reason: AutocompleteChangeReason, + type: TagsProps, + ) => { + const data = [...new Set(value.map(tag => tag.replace('#', '')))]; + + const prohibitedTagsChanged = + type === TagsProps.PROHIBITED && + (data.filter( + tag => + !experience?.prohibitedTags || + !experience.prohibitedTags.includes(tag), + ).length > 0 || + experience?.prohibitedTags?.length !== data.length); + const allowedTagsChanged = + type === TagsProps.ALLOWED && + (data.filter(tag => !experience.allowedTags.includes(tag)).length > 0 || + data.length !== experience.allowedTags.length); + + setDetailChanged(prohibitedTagsChanged || allowedTagsChanged); + + if (reason === 'remove-option') { + if (type === TagsProps.ALLOWED) { + setNewExperience(prevExperience => ({ + ...prevExperience, + allowedTags: data, + })); + } else if (type === TagsProps.PROHIBITED) { + setNewExperience(prevExperience => ({ + ...prevExperience, + prohibitedTags: data, + })); + } + } + + if (reason === 'create-option') { + if (type === TagsProps.ALLOWED) { + setNewExperience(prevExperience => ({ + ...prevExperience, + allowedTags: data, + })); + } else if (type === TagsProps.PROHIBITED) { + setNewExperience(prevExperience => ({ + ...prevExperience, + prohibitedTags: data, + })); + } + } + + if (reason === 'select-option') { + if (type === TagsProps.ALLOWED) { + setNewExperience(prevExperience => ({ + ...prevExperience, + allowedTags: data, + })); + } else if (type === TagsProps.PROHIBITED) { + setNewExperience(prevExperience => ({ + ...prevExperience, + prohibitedTags: data, + })); + } + } + }; + + const handlePeopleChange = ( + // eslint-disable-next-line @typescript-eslint/ban-types + event: React.ChangeEvent<{}>, + value: People[], + reason: AutocompleteChangeReason, + ) => { + const people = newExperience?.people ? newExperience.people : []; + if (reason === 'select-option') { + setNewExperience(prevExperience => ({ + ...prevExperience, + people: [ + ...people, + ...value.filter(option => people.indexOf(option) === -1), + ], + })); + clearSearchedPeople(); + } + + setDetailChanged(true); + }; + + const removeSelectedPeople = (selected: People) => () => { + setNewExperience(prevExperience => ({ + ...prevExperience, + people: prevExperience?.people + ? prevExperience?.people.filter(people => people.id != selected.id) + : [], + })); + + setDetailChanged(true); }; const validateExperience = (): boolean => { @@ -138,10 +342,10 @@ export const ExperienceEditor: React.FC = props => { const validPeople = newExperience.people.filter(people => !isEmpty(people.id)).length >= 0; const validSelectedUserIds = - newExperience.visibility === 'selected_user' + selectedVisibility && selectedVisibility?.id === 'selected_user' ? selectedUserIds.length > 0 - : !isEmpty(newExperience.visibility); - const validVisibility = !isEmpty(newExperience.visibility); + : !isEmpty(selectedVisibility?.id); + const validVisibility = !isEmpty(selectedVisibility?.id); setErrors({ name: !validName, @@ -167,7 +371,6 @@ export const ExperienceEditor: React.FC = props => { const valid = validateExperience(); if (valid) { - console.log(newExperience); onSave(newExperience); } else { ref.current?.scrollIntoView({ @@ -177,6 +380,32 @@ export const ExperienceEditor: React.FC = props => { } }; + const handleNextPagePosts = () => { + if (experienceId) { + loadNextPostExperience(experienceId); + } + }; + + const handleRemoveFromExperience = (post: Post) => { + loadExperiencePostList(post.id, postsExperiences => { + const tmpListExperience: string[] = []; + postsExperiences.map(item => { + if (item.posts) { + tmpListExperience.push(item.id); + } + }); + if (experienceId) { + const indexExperience = tmpListExperience.indexOf(experienceId); + if (indexExperience > -1) { + tmpListExperience.splice(indexExperience, 1); + } + addPostsToExperience(post.id, tmpListExperience, () => { + loadPostExperience(experienceId); + }); + } + }); + }; + const visibilityList: VisibilityItem[] = [ { id: 'public', @@ -196,6 +425,67 @@ export const ExperienceEditor: React.FC = props => { }, ]; + const handleVisibilityChange = ( + // eslint-disable-next-line @typescript-eslint/ban-types + event: React.ChangeEvent<{}>, + value: VisibilityItem, + reason: AutocompleteChangeReason, + ) => { + setSelectedVisibility(value); + setNewExperience(prevExperience => ({ + ...prevExperience, + visibility: value?.id, + })); + + setDetailChanged(true); + }; + + const handleSearchUser = (event: React.ChangeEvent) => { + const debounceSubmit = debounce(() => { + onSearchUser(event.target.value); + }, 300); + + debounceSubmit(); + }; + + const clearSearchedUser = () => { + const debounceSubmit = debounce(() => { + onSearchUser(''); + }, 300); + + debounceSubmit(); + }; + + const handleVisibilityPeopleChange = ( + // eslint-disable-next-line @typescript-eslint/ban-types + event: React.ChangeEvent<{}>, + value: User[], + reason: AutocompleteChangeReason, + ) => { + const people = selectedUserIds ? selectedUserIds : []; + console.log({ value }); + if (reason === 'select-option') { + setSelectedUserIds([ + ...people, + ...value.filter(option => people.indexOf(option) === -1), + ]); + clearSearchedUser(); + clearUsers(); + } + + setDetailChanged(true); + }; + + const removeVisibilityPeople = (selected: User) => () => { + setSelectedUserIds( + selectedUserIds + ? selectedUserIds.filter(people => people.id != selected.id) + : [], + ); + + setDetailChanged(true); + }; + const mappingUserIds = () => { console.log({ selectedVisibility }); if (selectedVisibility?.id === 'selected_user') { @@ -220,14 +510,6 @@ export const ExperienceEditor: React.FC = props => { } }; - const onExperience = value => { - setNewExperience(value); - }; - - const onVisibility = value => { - setSelectedVisibility(value); - }; - useEffect(() => { mappingUserIds(); setDetailChanged(true); @@ -266,54 +548,500 @@ export const ExperienceEditor: React.FC = props => { setShowAdvanceSetting(!showAdvanceSetting); }; - if (stage === 1) { - return ( - - ); - } + return ( +
+ +
+
+ + {i18n.t(`Experience.Editor.Header`)} + + + {i18n.t(`Experience.Editor.Sub_Header`)} + +
+ + + +
+
- if (stage === 2) { - return ( - - ); - } +
+
+ + + +
+ +
+
+
+
+
+ + + {i18n.t('Experience.Editor.Subtitle_1')} + + + + {i18n.t('Experience.Editor.Helper.Name')} + + + {newExperience?.name.length ?? 0}/50 + + - if (stage === 3) { - return ( - - ); - } + option.name} + getOptionSelected={(option, value) => option?.id === value.id} + autoHighlight={false} + disableClearable + onChange={handleVisibilityChange} + value={selectedVisibility || null} + popupIcon={ + + } + renderInput={({ inputProps, ...rest }) => ( + + )} + /> + + {selectedVisibility?.id === 'selected_user' && ( + <> + option.id === value.id} + filterSelectedOptions={true} + getOptionLabel={option => `${option.username} ${option.name}`} + disableClearable + autoHighlight={false} + popupIcon={ + + } + onChange={handleVisibilityPeopleChange} + renderTags={() => null} + renderInput={params => ( + + {params.InputProps.endAdornment} + + ), + }} + helperText={i18n.t('Experience.Editor.Helper.People')} + /> + )} + renderOption={( + option, + state: AutocompleteRenderOptionState, + ) => { + if (option.id === '') return null; + return ( +
+ + @{option.username} + + } + avatar={option.profilePictureURL} + platform={'myriad'} + action={ + + {state.selected ? ( + + ) : ( + + )} + + } + /> +
+ ); + }} + /> + +
+
+ + + + {selectedUserIds + .filter(people => !isEmpty(people.id)) + .map(people => ( + + @{people.username} + + } + avatar={people.profilePictureURL} + platform={'myriad'} + action={ + + + + } + /> + ))} +
+
+ + )} + + + + {i18n.t('Experience.Editor.Subtitle_2')} + + + +   + + + {newExperience?.description?.length ?? 0}/280 + + + + + + + + + + className={styles.fill} + id="experience-tags-include" + freeSolo + multiple + value={newExperience.allowedTags ?? []} + options={tags + .map(tag => tag.id) + .filter(tag => !newExperience.allowedTags.includes(tag))} + disableClearable + onChange={(event, value, reason) => { + handleTagsChange(event, value, reason, TagsProps.ALLOWED); + }} + onInputChange={(event, value) => { + handleTagsInputChange(event, value, TagsProps.ALLOWED); + }} + getOptionLabel={option => `#${option}`} + renderInput={params => ( + + {params.InputProps.endAdornment} + + ), + }} + /> + )} + /> + + tag.id) + .filter(tag => !newExperience.prohibitedTags?.includes(tag))} + disableClearable + onChange={(event, value, reason) => { + handleTagsChange(event, value, reason, TagsProps.PROHIBITED); + }} + onInputChange={(event, value) => { + handleTagsInputChange(event, value, TagsProps.PROHIBITED); + }} + getOptionLabel={option => `#${option}`} + renderInput={params => ( + + {params.InputProps.endAdornment} + + ), + }} + /> + )} + /> + + option.id === value.id} + filterSelectedOptions={true} + getOptionLabel={option => `${option.username} ${option.name}`} + disableClearable + autoHighlight={false} + popupIcon={ + + } + onChange={handlePeopleChange} + renderTags={() => null} + renderInput={params => ( + + {params.InputProps.endAdornment} + + ), + }} + helperText={''} + /> + )} + renderOption={(option, state: AutocompleteRenderOptionState) => { + if (option.id === '') return null; + return ( +
+ + @{option.username} + + } + avatar={option.profilePictureURL} + platform={option.platform} + action={ + + {state.selected ? ( + + ) : ( + + )} + + } + /> +
+ ); + }} + /> + +
+ {newExperience.people + .filter(people => !isEmpty(people.id)) + .map(people => ( + + @{people.username} + + } + avatar={people.profilePictureURL} + platform={people.platform} + action={ + + + + } + /> + ))} +
+ + }> + {experiencePosts.length === 0 ? ( +
+ + {i18n.t('Experience.Editor.Post.Title')} + + + {i18n.t('Experience.Editor.Post.Desc')} + +
+ ) : ( + <> + + {i18n.t('Experience.Editor.Post.Title')} + + {experiencePosts.map(post => ( + null} + type={'default'} + onRemoveFromExperience={() => + handleRemoveFromExperience(post) + } + /> + ))} + + )} +
+
+
+
- return ( - <>
@@ -334,6 +1062,6 @@ export const ExperienceEditor: React.FC = props => {
- +
); }; diff --git a/src/components/ExperienceList/ExperienceListRightBar.tsx b/src/components/ExperienceList/ExperienceListRightBar.tsx index a0e00f1c1..210f0542d 100644 --- a/src/components/ExperienceList/ExperienceListRightBar.tsx +++ b/src/components/ExperienceList/ExperienceListRightBar.tsx @@ -93,7 +93,7 @@ export const ExperienceListRightBar: React.FC = props => { onSubscribe={onSubscribe} onClone={onClone} menuDrawer={menuDrawer} - postCount={false} + postCount={item.newPostCount !== 0} /> ))} diff --git a/src/components/Login/Login.tsx b/src/components/Login/Login.tsx index 6c1d53a2d..f3da341c9 100644 --- a/src/components/Login/Login.tsx +++ b/src/components/Login/Login.tsx @@ -20,7 +20,6 @@ import LoginByEmail from './render/Email/LoginByEmail'; import { Options } from './render/Options'; import { Profile } from './render/Profile'; import SigninMethod from './render/SignInMethod/SigninMethod'; -import LoginByToken from './render/Token/LoginByToken'; import { COOKIE_INSTANCE_URL } from 'components/SelectServer'; import { MyriadFullIcon } from 'components/atoms/Icons'; @@ -346,12 +345,6 @@ export const Login: React.FC = props => { element={} /> - } - /> - = props => { polkadot: , kusama: , near: , - myriad: , - rococo: , + myriad: , debio: , }), [], @@ -547,13 +545,7 @@ export const Options: React.FC = props => { {network.id === NetworkIdEnum.POLKADOT ? ( <> - +
{icons['polkadot']} diff --git a/src/components/Login/render/SignInMethod/SigninMethod.tsx b/src/components/Login/render/SignInMethod/SigninMethod.tsx index 9a94ca284..bae4d3b73 100644 --- a/src/components/Login/render/SignInMethod/SigninMethod.tsx +++ b/src/components/Login/render/SignInMethod/SigninMethod.tsx @@ -18,9 +18,7 @@ export default function SigninMethod({ const styles = useStyles(detect.isMobile())(); const handleSelected = ({ method }: { method: string }) => { - if (method === 'token') { - navigate('/token'); - } else if (method === 'web2') { + if (method === 'web2') { navigate('/email'); } else { navigate('/options'); @@ -89,15 +87,6 @@ export default function SigninMethod({ disabled={disableSignIn} tooltip={i18n.t('Sign_In.Email.tooltip')} /> -
or
- } - onClick={() => handleSelected({ method: 'token' })} - disabled={disableSignIn} - tooltip={i18n.t('Sign_In.Email.tooltip')} - />
diff --git a/src/components/Login/render/Token/LoginByToken.style.ts b/src/components/Login/render/Token/LoginByToken.style.ts deleted file mode 100644 index 5ec9e676b..000000000 --- a/src/components/Login/render/Token/LoginByToken.style.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; - -export const useStyles = makeStyles((theme: Theme) => - createStyles({ - root: { - position: 'relative', - maxHeight: 'fit-content', - maxWidth: 508, - background: '#FFFFFF', - borderRadius: 10, - padding: 40, - boxShadow: '0px 2px 10px rgba(0, 0, 0, 0.05)', - display: 'flex', - flexDirection: 'column', - gap: 24, - '& .MuiFormControl-root': { - marginBottom: 0, - }, - }, - title: { - fontSize: 18, - fontWeight: 'bold', - color: 'black', - textAlign: 'center', - }, - icon: { - width: 80, - fontSize: 32, - marginBottom: 8, - [theme.breakpoints.down('md')]: { - width: 60, - fontSize: 26, - }, - }, - list: { - display: 'flex', - boxSizing: 'border-box', - - '& .MuiListItem-root': { - display: 'block', - boxSizing: 'border-box', - paddingLeft: 2, - paddingRight: 2, - }, - '& .Mui-selected': { - border: '1px solid #6E3FC3', - borderRadius: 10, - backgroundColor: 'inherit', - paddingTop: 7, - paddingBottom: 7, - paddingLeft: 1, - paddingRight: 1, - [theme.breakpoints.down('md')]: { - paddingTop: 5, - paddingBottom: 5, - }, - }, - }, - card: { - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - padding: 10, - cursor: 'pointer', - [theme.breakpoints.down('md')]: { - padding: 5, - }, - }, - subtitle: { - fontSize: 14, - fontWeight: 'normal', - color: 'black', - textAlign: 'center', - }, - actionWrapper: { - display: 'flex', - flexDirection: 'row', - gap: 24, - }, - }), -); diff --git a/src/components/Login/render/Token/LoginByToken.tsx b/src/components/Login/render/Token/LoginByToken.tsx deleted file mode 100644 index 6e152bd96..000000000 --- a/src/components/Login/render/Token/LoginByToken.tsx +++ /dev/null @@ -1,254 +0,0 @@ -import { useState, useEffect, useMemo } from 'react'; -import { useCookies } from 'react-cookie'; -import { useSelector } from 'react-redux'; -import { useNavigate } from 'react-router'; - -import { signIn } from 'next-auth/react'; -import getConfig from 'next/config'; -import { useRouter } from 'next/router'; - -import { - Button, - TextField, - Typography, - Grid, - ListItem, - Tooltip, -} from '@material-ui/core'; - -import { useStyles } from './LoginByToken.style'; - -import { COOKIE_INSTANCE_URL } from 'components/SelectServer'; -import SelectServer from 'src/components/SelectServer'; -import { - EthereumNetworkIcon, - KusamaNetworkIcon, - DebioNetworkIcon, - MyriadOctopusIcon, - MyriadRococoIcon, - NearNetworkIcon, - PolkadotNetworkIcon, - PolygonNetworkDisabledIcon, -} from 'src/components/atoms/Icons'; -import { formatNetworkTitle } from 'src/helpers/wallet'; -import { useAlertHook } from 'src/hooks/use-alert.hook'; -import { NetworkIdEnum } from 'src/interfaces/network'; -import { ServerListProps } from 'src/interfaces/server-list'; -import { BlockchainPlatform } from 'src/interfaces/wallet'; -import i18n from 'src/locale'; -import { RootState } from 'src/reducers'; -import { UserState } from 'src/reducers/user/reducer'; - -type LoginByTokenProps = { - onNext: ( - successCallback: () => void, - failedCallback: () => void, - token: string, - ) => Promise; -}; - -const LoginByToken = ({ onNext }: LoginByTokenProps) => { - const styles = useStyles(); - const router = useRouter(); - const getMobileIconStyles = styles.icon; - const { networks } = useSelector( - state => state.userState, - ); - const [cookies] = useCookies([COOKIE_INSTANCE_URL]); - const { publicRuntimeConfig } = getConfig(); - const { showAlert } = useAlertHook(); - - const [token, setToken] = useState(''); - const [networkId, setNetworkId] = useState(null); - const [rpcUrl, setRpcUrl] = useState(null); - const [error, setError] = useState({ - isError: false, - message: '', - }); - const icons = useMemo( - () => ({ - polkadot: , - kusama: , - near: , - myriad: , - rococo: , - debio: , - }), - [], - ); - const [, setBlockchainPlatform] = useState(null); - - useEffect(() => { - const token = router?.query?.token?.toString() ?? ''; - tokenValidation(token); - }, [router.query.token]); - - const handleChange = (event: React.ChangeEvent) => { - const input = event.target.value; - tokenValidation(input); - }; - - const tokenValidation = (token: string) => { - if (!token.length) { - setError({ isError: false, message: '' }); - } else { - setError({ - isError: false, - message: '', - }); - } - setToken(token); - }; - - const navigate = useNavigate(); - - const handleNext = () => { - onNext( - () => { - signIn('tokenCredentials', { - token, - rpcUrl, - instanceURL: cookies[COOKIE_INSTANCE_URL], - redirect: false, - callbackUrl: publicRuntimeConfig.appAuthURL, - }).then(response => { - if (response.ok) { - router.reload(); - router.push('/'); - } - - if (response.error) { - showAlert({ - message: token - ? i18n.t('Login.Alert.Invalid_OTP') - : i18n.t('Login.Alert.Message'), - severity: 'error', - title: i18n.t('Login.Alert.Title'), - }); - } - }); - }, - () => { - navigate('/login'); - }, - token, - ); - }; - - const handleBack = () => { - navigate('/'); - }; - - const setSelectedNetwork = - ( - networkId: NetworkIdEnum, - blockchainPlatform: BlockchainPlatform, - rpcUrl: string, - ) => - () => { - setNetworkId(networkId); - setBlockchainPlatform(blockchainPlatform); - setRpcUrl(rpcUrl); - }; - - const handleSwitchInstance = ( - server: ServerListProps, - callback?: () => void, - ) => { - callback && callback(); - }; - - return ( -
-
- - {i18n.t('Login.Token.LoginByToken.Title')} - - - {i18n.t('Login.Token.LoginByToken.Subtitle')} - -
- - {networks.map(network => ( - - -
- {icons[network.id as keyof typeof icons]} - {formatNetworkTitle(network)} -
-
-
- ))} - - - {i18n.t('Login.Options.Tooltip_Wallet')} - - } - arrow> - -
- - Ethereum -
-
-
-
- - - {i18n.t('Login.Options.Tooltip_Wallet')} - - } - arrow> - -
- - Polygon -
-
-
-
-
- - -
- - -
-
- ); -}; - -export default LoginByToken; diff --git a/src/components/Login/render/Token/index.ts b/src/components/Login/render/Token/index.ts deleted file mode 100644 index ab84f61a2..000000000 --- a/src/components/Login/render/Token/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './LoginByToken'; diff --git a/src/components/Menu/Menu.tsx b/src/components/Menu/Menu.tsx index 8363423cf..319d39c77 100644 --- a/src/components/Menu/Menu.tsx +++ b/src/components/Menu/Menu.tsx @@ -142,10 +142,8 @@ export const Menu: React.FC = props => { ); const gotoHome = () => { - if (router.pathname !== '/') router.push('/', undefined, { shallow: true }); - if (router.query?.type === 'all') - router.push('/', undefined, { shallow: true }); - return; + if (router.pathname === '/') return; + router.push('/', undefined, { shallow: true }); }; const openMenu = useCallback( diff --git a/src/components/Mobile/Bottombar/Bottombar.tsx b/src/components/Mobile/Bottombar/Bottombar.tsx index 2c0e0d8d3..d0dd408ed 100644 --- a/src/components/Mobile/Bottombar/Bottombar.tsx +++ b/src/components/Mobile/Bottombar/Bottombar.tsx @@ -13,14 +13,7 @@ import { useDispatch } from 'react-redux'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/router'; -import { - SvgIcon, - Grid, - IconButton, - Modal, - useMediaQuery, -} from '@material-ui/core'; -import { useTheme } from '@material-ui/core/styles'; +import { SvgIcon, Grid, IconButton } from '@material-ui/core'; import { CustomFolderIcon } from 'components/Menu'; import { Avatar, AvatarSize } from 'components/atoms/Avatar'; @@ -70,46 +63,26 @@ type SearchBoxContainerProps = { export const BottombarComponent: React.FC = props => { const { searched = false } = props; - const theme = useTheme(); const { query, replace } = useQueryParams(); - const isMobile = useMediaQuery(theme.breakpoints.down('xs')); const dispatch = useDispatch(); const style = useStyles(); const router = useRouter(); const { user, anonymous } = useUserHook(); - const [popOpen, setPopOpen] = React.useState(false); const { instance } = useInstances(); const [createPostOpened, setCreatePostOpened] = React.useState(false); - const [imported, setImported] = React.useState(false); const [actived, setActived] = React.useState(); const handleOpenCreatePost = () => { - setPopOpen(false); setCreatePostOpened(true); }; - const handleOpenImportPost = () => { - setPopOpen(false); - setImported(true); - setCreatePostOpened(true); - }; - - const handleOpenPopover = () => { - setPopOpen(true); - }; - - const handleClose = event => { - setPopOpen(false); - }; - const handleCloseCreatePost = () => { setCreatePostOpened(false); - setImported(false); }; const openMenu = useCallback( @@ -154,7 +127,6 @@ export const BottombarComponent: React.FC = props => { = props => { +
+ + + +
openMenu(TimelineType.ALL)} @@ -213,36 +192,6 @@ export const BottombarComponent: React.FC = props => { />
- {isMobile && ( -
- - - - -
- - - - - - -
-
-
- )} ); }; diff --git a/src/components/Mobile/Bottombar/bottombar.style.ts b/src/components/Mobile/Bottombar/bottombar.style.ts index c4cd255bc..d31542ad3 100644 --- a/src/components/Mobile/Bottombar/bottombar.style.ts +++ b/src/components/Mobile/Bottombar/bottombar.style.ts @@ -19,11 +19,9 @@ export const useStyles = makeStyles((theme: Theme) => }, }, buttonCreate: { - position: 'fixed', cursor: 'pointer', zIndex: 99, - bottom: 59, - right: 7, + marginTop: -50, }, iconbuttonCreate: { backgroundColor: '#862AE9', @@ -34,34 +32,6 @@ export const useStyles = makeStyles((theme: Theme) => opacity: 0.8, }, }, - popoverbuttonCreate: { - backgroundColor: '#862AE9', - position: 'absolute', - bottom: 100, - right: 7, - width: '40px', - height: '40px', - '&:hover': { - backgroundColor: '#862AE9', - opacity: 0.8, - }, - }, - popoverbuttonImport: { - backgroundColor: '#862AE9', - position: 'absolute', - bottom: 142, - right: 7, - width: '40px', - height: '40px', - '&:hover': { - backgroundColor: '#862AE9', - opacity: 0.8, - }, - }, - popover: { - position: 'relative', - top: -40, - }, fillButtonCreate: { color: '#fff', }, diff --git a/src/components/Notifications/hooks/use-notification-list.hook.tsx b/src/components/Notifications/hooks/use-notification-list.hook.tsx index f8907f3a4..a3d0eedaf 100644 --- a/src/components/Notifications/hooks/use-notification-list.hook.tsx +++ b/src/components/Notifications/hooks/use-notification-list.hook.tsx @@ -67,16 +67,6 @@ const parseTipAmountContainingENumber = (message: string) => { return resultInString; }; -const parseText = (message: string) => { - try { - const newMessage = JSON.parse(message); - const text = newMessage[0].children[0].text; - return text ? text : ''; - } catch { - return ''; - } -}; - export const useNotificationList = ( notifications: Notification[], infinite = true, @@ -166,11 +156,7 @@ export const useNotificationList = ( userId: notification.fromUserId.id, user: notification.fromUserId.name, avatar: notification.fromUserId.profilePictureURL, - description: - i18n.t('Notification.Description.Post_Comment') + - ' :\n"' + - parseText(notification.message) + - '"', + description: i18n.t('Notification.Description.Post_Comment'), badge: (
void; - onRemove: (url: string) => void; - onVideo: (url: string[]) => void; -}; - -export const MobileEmbed: React.FC = props => { - const { - imageUrl, - videoUrl, - onImage, - uploadImageFieldRef, - uploadVideoFieldRef, - onRemove, - onVideo, - } = props; - - const handleRemove: (url: string) => () => void = (url: string) => { - return () => onRemove(url); - }; - - const handleRemoveVideo = () => { - onVideo([]); - }; - const handleImageChange = async ( - event: React.ChangeEvent, - ) => { - if (event.target.files && event.target.files.length > 0) { - const { files } = await UploadAPI.image(event.target.files[0], { - onUploadProgress: (event: ProgressEvent) => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const fileProgress = Math.round((100 * event.loaded) / event.total); - }, - }); - const urls = files.map(file => file.url); - onImage([...imageUrl, ...urls]); - - if (uploadImageFieldRef && uploadImageFieldRef.current) { - uploadImageFieldRef.current.value = ''; - } - } - }; - const handleVideoChange = async ( - event: React.ChangeEvent, - ) => { - if (event.target.files && event.target.files.length > 0) { - const { files } = await UploadAPI.image(event.target.files[0], { - onUploadProgress: (event: ProgressEvent) => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const fileProgress = Math.round((100 * event.loaded) / event.total); - }, - }); - const urls = files.map(file => file.url); - onVideo(urls); - - if (uploadVideoFieldRef && uploadVideoFieldRef.current) { - uploadVideoFieldRef.current.value = ''; - } - } - }; - - const selectImage = (): void => { - const uploadField: any = uploadImageFieldRef?.current; - - if (!uploadField) return; - - uploadField.click(); - }; - const selectVideo = (): void => { - const uploadField: any = uploadVideoFieldRef?.current; - - if (!uploadField) return; - - uploadField.click(); - }; - - if (imageUrl.length > 0) - return ( - <> - - - {imageUrl.map(url => ( - - - - - - - ))} - {imageUrl.length < 4 && ( - - - - - - )} - - - ); - - if (videoUrl.length > 0) - return ( - <> - - - - - - - - - - ); - - return ( - <> - - - - - - - - - - - - - - - - ); -}; diff --git a/src/components/PostCreate/MobilePostCreate.styles.tsx b/src/components/PostCreate/MobilePostCreate.styles.tsx deleted file mode 100644 index 5f7bce364..000000000 --- a/src/components/PostCreate/MobilePostCreate.styles.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; - -export const useStyles = makeStyles((theme: Theme) => - createStyles({ - root: {}, - postbutton: { - position: 'absolute', - width: 79, - height: 24.35, - right: 20, - top: 16, - }, - timelinePaper: { - position: 'relative', - height: 55, - top: 6, - }, - option: { - display: 'flex', - alignItems: 'center', - columnGap: 4, - - [theme.breakpoints.down('xs')]: { - marginLeft: 20, - }, - }, - giftIcon: { - width: 16, - marginRight: '10px !important', - color: '#7342CC', - }, - avatar: { - position: 'relative', - top: 4.5, - left: 5, - }, - arrowLeftIcon: { - width: 24, - color: '#7342CC', - }, - cardUserName: { - position: 'relative', - top: -37, - left: 56, - }, - editor: { - position: 'relative', - top: 20, - }, - grid: { - position: 'relative', - top: 8, - }, - privacySettingsButton: { - position: 'relative', - top: 12, - }, - privacyPaper: { - position: 'relative', - top: 15, - }, - }), -); diff --git a/src/components/PostCreate/MobilePostCreate.tsx b/src/components/PostCreate/MobilePostCreate.tsx deleted file mode 100644 index da4f64853..000000000 --- a/src/components/PostCreate/MobilePostCreate.tsx +++ /dev/null @@ -1,430 +0,0 @@ -import { ArrowLeftIcon, GiftIcon, TrashIcon } from '@heroicons/react/outline'; - -import React, { useEffect, useRef, useState } from 'react'; -import { useDispatch } from 'react-redux'; - -import dynamic from 'next/dynamic'; - -import { - Paper, - Typography, - Menu, - MenuItem, - IconButton, - SvgIcon, -} from '@material-ui/core'; - -import { Modal } from '../atoms/Modal'; -import { MobileEmbed } from './MobileEmbed'; -import { useStyles } from './MobilePostCreate.styles'; -import { handleFormatCKEditor } from './formatter'; - -import ExclusiveCreate from 'components/ExclusiveContentCreate/ExclusiveCreate'; -import { SocialAvatar } from 'components/atoms/SocialAvatar'; -import useConfirm from 'components/common/Confirm/use-confirm.hook'; -import { ExclusiveContent } from 'components/common/Tipping/Tipping.interface'; -import { convert } from 'html-to-text'; -import { FaChevronDown } from 'react-icons/fa'; -import ShowIf from 'src/components/common/show-if.component'; -import { ExclusiveContentPost } from 'src/interfaces/exclusive'; -import { Experience, UserExperience } from 'src/interfaces/experience'; -import { Post, PostVisibility } from 'src/interfaces/post'; -import { User } from 'src/interfaces/user'; -import * as ExperienceAPI from 'src/lib/api/experience'; -import i18n from 'src/locale'; -import { createExclusiveContent } from 'src/reducers/timeline/actions'; - -const CKEditor = dynamic(() => import('../common/CKEditor/Editor'), { - ssr: false, -}); - -type MobilePostCreateProps = { - user: User; - open: boolean; - isMobile?: boolean; - onClose: () => void; - onSearchPeople: (query: string) => void; - onSubmit: ( - post: Partial | string, - attributes?: Pick, - ) => void; -}; - -type PostCreateType = 'create' | 'import'; - -const initialPost = { - visibility: PostVisibility.PUBLIC, - isNSFW: false, -}; - -export const MobilePostCreate: React.FC = props => { - const { open, user, isMobile, onClose, onSubmit, onSearchPeople } = props; - const dispatch = useDispatch(); - const confirm = useConfirm(); - const styles = useStyles(); - const [post, setPost] = useState>(initialPost); - const [, setEditorValue] = useState(''); - const content = useRef(''); - const [exclusiveContent, setExclusiveContent] = - useState(null); - const [showExclusive, setShowExclusive] = useState(false); - const [, setShowTimelineCreate] = useState(false); - const [, setTimelineId] = useState([]); - const [, setExperienceVisibility] = useState([]); - const [, setCommonUser] = useState([]); - const [userExperiences, setUserExperiences] = useState([]); - const [page, setPage] = useState(1); - const [imageUrl, setImageUrl] = useState([]); - const [selectedTimeline, setSelectedTimeline] = useState(); - const [videoUrl, setVideoUrl] = useState([]); - const [anchorEl, setAnchorEl] = React.useState(null); - - const Editor = CKEditor; - - const uploadImageFieldRef = useRef(null); - const uploadVideoFieldRef = useRef(null); - - const header: Record = { - create: { - title: i18n.t('Post_Create.Title'), - subtitle: i18n.t('Post_Create.Subtitle'), - }, - import: { - title: i18n.t('Post_Import.Title'), - subtitle: i18n.t('Post_Import.Subtitle'), - }, - }; - - const handleOpenMenu = (event: React.MouseEvent) => { - setAnchorEl(event.currentTarget); - }; - - const handleshowExclusive = () => { - setShowExclusive(!showExclusive); - // getPlateEditorRef(`exclusive-${user.id}`); - }; - - const handleMenuClose = () => { - setAnchorEl(null); - }; - - const handleRemoveExclusiveContent = () => { - setExclusiveContent(null); - }; - - const handleSubmitExclusiveContent = (content: ExclusiveContentPost) => { - setExclusiveContent(content); - handleshowExclusive(); - }; - - const handleExperienceChange = (item: UserExperience) => { - return () => { - setSelectedTimeline(item.experience); - }; - }; - - const handleRemoveImage = (url: string) => { - const images = imageUrl; - console.log(images); - const index = images.indexOf(url); - if (index > -1) { - images.splice(index, 1); - console.log(images); - setImageUrl(images); - } - }; - - const handleImagePaste = event => { - if (event.clipboardData.getData('image') != '') { - event.preventDefault(); - } - }; - - const handleSubmit = async () => { - if (isMobile) { - if (exclusiveContent) { - const rawtext = convert(content.current); // convert ck editor html value into raw text - const data = await handleFormatCKEditor( - rawtext, - imageUrl, - videoUrl, - ).then(output => { - return { - text: JSON.stringify([output.format]), - rawText: rawtext, - selectedUserIds: post.selectedUserIds, - NSFWTag: post.NSFWTag, - visibility: post.visibility ?? PostVisibility.PUBLIC, - tags: output.hashtags, - mentions: output.mentions, - selectedTimelineIds: [selectedTimeline?.id], - }; - }); - dispatch( - createExclusiveContent( - exclusiveContent, - [], - (resp: ExclusiveContent) => { - if (resp?.id) { - Object.assign(data, { - asset: { exclusiveContents: [resp.id] }, - }); - } - - onSubmit(data); - }, - () => { - confirm({ - title: i18n.t('LiteVersion.LimitTitlePost', { count: 0 }), - description: i18n.t('LiteVersion.LimitDescPost'), - icon: 'warning', - confirmationText: i18n.t('General.Got_It'), - cancellationText: i18n.t('LiteVersion.MaybeLater'), - onConfirm: () => { - undefined; - }, - onCancel: () => { - undefined; - }, - hideCancel: true, - }); - }, - ), - ); - setExclusiveContent(null); - } else { - const rawtext = convert(content.current); // convert ck editor html value into raw text - await handleFormatCKEditor(rawtext, imageUrl, videoUrl) - .then(output => { - onSubmit({ - text: JSON.stringify([output.format]), - rawText: rawtext, - selectedUserIds: post.selectedUserIds, - NSFWTag: post.NSFWTag, - visibility: post.visibility ?? PostVisibility.PUBLIC, - tags: output.hashtags, - mentions: output.mentions, - selectedTimelineIds: [selectedTimeline?.id], - }); - }) - .then(() => handleClose()); - } - } - }; - - const handleClose = () => { - setImageUrl([]); - setVideoUrl([]); - setPost(initialPost); - setShowExclusive(false); - setExclusiveContent(null); - setShowTimelineCreate(false); - setEditorValue(''); - setTimelineId([]); - setExperienceVisibility([]); - setCommonUser([]); - onClose(); - }; - - const handleContentChange = data => { - if (!isMobile) { - if (data[0].children[0].text !== '' || data[0].children.length > 1) { - setEditorValue('not empty'); - } - } - if (data.length > 0 && isMobile) { - setEditorValue(data); - } - content.current = data; - }; - - const handleTitleModal: () => { title: string; subtitle: string } = () => { - const title = !showExclusive - ? header['create'].title - : i18n.t('ExclusiveContent.Add'); - const subtitle = !showExclusive ? header['create'].subtitle : ''; - - return { - title, - subtitle, - }; - }; - - const fetchUserExperiences = async () => { - const { meta, data: experiences } = await ExperienceAPI.getUserExperiences( - user.id, - 'personal', - page, - ); - - setUserExperiences([...experiences]); - if (experiences.length !== 0) - setSelectedTimeline(experiences[0].experience); - - if (meta.currentPage < meta.totalPageCount) setPage(page + 1); - }; - - const resetExperiences = () => { - setPage(1); - setUserExperiences([]); - }; - - useEffect(() => { - if (open) fetchUserExperiences(); - else resetExperiences(); - }, [open, page]); - return ( - -
- -
-
- -
- { - console.log; - }} - name="avatar" - /> -
- {selectedTimeline && ( -
- Timeline - {selectedTimeline.name} -
- )} - - - {userExperiences.map(item => ( - - {item.experience.name} - - ))} - -
-
-
- - - - -
- {!showExclusive && ( -
- -
- -
-
-
- - {!exclusiveContent ? ( - <> - - - - {i18n.t('ExclusiveContent.Add')} - - - - ) : ( - <> - handleRemoveExclusiveContent()}> - - - {i18n.t('ExclusiveContent.Remove')} - - - - )} - -
-
-
- -
- Everyone can see this posts -
-
-
-
- )} - - {/* Select Timeline */} - {/* Timeline list */} -
- ); -}; - -export default MobilePostCreate; diff --git a/src/components/PostCreate/MobilePostImport.tsx b/src/components/PostCreate/MobilePostImport.tsx deleted file mode 100644 index eb9268d7e..000000000 --- a/src/components/PostCreate/MobilePostImport.tsx +++ /dev/null @@ -1,213 +0,0 @@ -import React, { useEffect, useState } from 'react'; - -import { Paper, Typography, Menu, MenuItem } from '@material-ui/core'; - -import { Modal } from '../atoms/Modal'; -import { useStyles } from './MobilePostCreate.styles'; - -import { PostImport } from 'components/PostImport'; -import { SocialAvatar } from 'components/atoms/SocialAvatar'; -import { FaChevronDown } from 'react-icons/fa'; -import { Experience, UserExperience } from 'src/interfaces/experience'; -import { Post, PostVisibility } from 'src/interfaces/post'; -import { User } from 'src/interfaces/user'; -import * as ExperienceAPI from 'src/lib/api/experience'; -import i18n from 'src/locale'; - -type MobilePostImportProps = { - user: User; - open: boolean; - isMobile?: boolean; - onClose: () => void; - onSearchPeople: (query: string) => void; - onSubmit: ( - post: Partial | string, - attributes?: Pick, - ) => void; -}; - -type PostCreateType = 'create' | 'import'; - -const initialPost = { - visibility: PostVisibility.PUBLIC, - isNSFW: false, -}; - -export const MobilePostImport: React.FC = props => { - const { open, user, isMobile, onClose, onSubmit } = props; - const styles = useStyles(); - const [post, setPost] = useState>(initialPost); - const [, setEditorValue] = useState(''); - const [showExclusive, setShowExclusive] = useState(false); - const [, setShowTimelineCreate] = useState(false); - const [, setTimelineId] = useState([]); - const [, setExperienceVisibility] = useState([]); - const [, setCommonUser] = useState([]); - const [userExperiences, setUserExperiences] = useState([]); - const [page, setPage] = useState(1); - const [selectedTimeline, setSelectedTimeline] = useState(); - const [anchorEl, setAnchorEl] = React.useState(null); - const [importUrl, setImport] = useState(); - - const header: Record = { - create: { - title: i18n.t('Post_Create.Title'), - subtitle: i18n.t('Post_Create.Subtitle'), - }, - import: { - title: i18n.t('Post_Import.Title'), - subtitle: i18n.t('Post_Import.Subtitle'), - }, - }; - - const handleOpenMenu = (event: React.MouseEvent) => { - setAnchorEl(event.currentTarget); - }; - - const handlePostUrlChange = (url: string | null) => { - setImport(url); - setEditorValue(url); - }; - - const handleErrorImport = () => { - setImport(undefined); - }; - - const handleMenuClose = () => { - setAnchorEl(null); - }; - - const handleExperienceChange = (item: UserExperience) => { - return () => { - setSelectedTimeline(item.experience); - }; - }; - - const handleImagePaste = event => { - if (event.clipboardData.getData('image') != '') { - event.preventDefault(); - } - }; - - const handleSubmit = async () => { - onSubmit(importUrl, { - NSFWTag: post.NSFWTag, - visibility: post.visibility ?? PostVisibility.PUBLIC, - selectedTimelineIds: [selectedTimeline?.id], - }); - }; - - const handleClose = () => { - setPost(initialPost); - setShowExclusive(false); - setShowTimelineCreate(false); - setEditorValue(''); - setTimelineId([]); - setExperienceVisibility([]); - setCommonUser([]); - onClose(); - }; - - const handleTitleModal: () => { title: string; subtitle: string } = () => { - const title = !showExclusive - ? header['create'].title - : i18n.t('ExclusiveContent.Add'); - const subtitle = !showExclusive ? header['create'].subtitle : ''; - - return { - title, - subtitle, - }; - }; - - const fetchUserExperiences = async () => { - const { meta, data: experiences } = await ExperienceAPI.getUserExperiences( - user.id, - 'personal', - page, - ); - - setUserExperiences([...experiences]); - if (experiences.length !== 0) - setSelectedTimeline(experiences[0].experience); - - if (meta.currentPage < meta.totalPageCount) setPage(page + 1); - }; - - const resetExperiences = () => { - setPage(1); - setUserExperiences([]); - }; - - useEffect(() => { - if (open) fetchUserExperiences(); - else resetExperiences(); - }, [open, page]); - return ( - -
- -
-
- -
- { - console.log; - }} - name="avatar" - /> -
- {selectedTimeline && ( -
- {selectedTimeline.name} -
- )} - - - {userExperiences.map(item => ( - - {item.experience.name} - - ))} - - -
-
- - {/* Select Timeline */} - {/* Timeline list */} -
- ); -}; - -export default MobilePostImport; diff --git a/src/components/PostCreate/PostCreate.container.tsx b/src/components/PostCreate/PostCreate.container.tsx index 04d96685d..6b52e384b 100644 --- a/src/components/PostCreate/PostCreate.container.tsx +++ b/src/components/PostCreate/PostCreate.container.tsx @@ -8,8 +8,6 @@ import { Button, useMediaQuery } from '@material-ui/core'; import { useTheme } from '@material-ui/core/styles'; import { PromptComponent } from '../atoms/Prompt/prompt.component'; -import MobilePostCreate from './MobilePostCreate'; -import MobilePostImport from './MobilePostImport'; import useConfirm from 'components/common/Confirm/use-confirm.hook'; import { useEnqueueSnackbar } from 'components/common/Snackbar/useEnqueueSnackbar.hook'; @@ -24,14 +22,13 @@ import { createPost, importPost } from 'src/reducers/timeline/actions'; type PostCreateContainerType = { open: boolean; - imported?: boolean; onClose: () => void; }; const PostCreate = dynamic(() => import('./PostCreate'), { ssr: false }); export const PostCreateContainer: React.FC = props => { - const { open, onClose, imported } = props; + const { open, onClose } = props; const confirm = useConfirm(); const router = useRouter(); const dispatch = useDispatch(); @@ -181,106 +178,6 @@ export const PostCreateContainer: React.FC = props => { // eslint-disable-next-line react-hooks/exhaustive-deps [], ); - if (!redirect && isMobile && !imported) { - return ( - <> - - - setDialogFailedImport({ ...dialogFailedImport, open: false }) - }> -
- - {/* TODO: Added translation */} - -
-
- - ); - } - if (!redirect && isMobile && imported) { - return ( - <> - - - setDialogFailedImport({ ...dialogFailedImport, open: false }) - }> -
- - {/* TODO: Added translation */} - -
-
- - ); - } if (!user) return null; if (!redirect) { diff --git a/src/components/PostCreate/PostCreate.styles.ts b/src/components/PostCreate/PostCreate.styles.ts index 54e4d8618..93db2733c 100644 --- a/src/components/PostCreate/PostCreate.styles.ts +++ b/src/components/PostCreate/PostCreate.styles.ts @@ -166,19 +166,5 @@ export const useStyles = makeStyles((theme: Theme) => marginRight: '10px !important', color: '#C2C2C2', }, - buttongroup: { - position: 'absolute', - width: 455, - height: 24.4, - left: 13, - top: 3, - }, - editor: { - position: 'absolute', - left: 13, - right: 14, - top: 109, - bottom: 182, - }, }), ); diff --git a/src/components/PostCreate/PostCreate.tsx b/src/components/PostCreate/PostCreate.tsx index 088cf4c12..7665e7a11 100644 --- a/src/components/PostCreate/PostCreate.tsx +++ b/src/components/PostCreate/PostCreate.tsx @@ -174,7 +174,7 @@ export const PostCreate: React.FC = props => { selectedUserIds: post.selectedUserIds, NSFWTag: post.NSFWTag, visibility: post.visibility ?? PostVisibility.PUBLIC, - selectedTimelineIds: post.selectedTimelineIds ?? timelineId, + selectedTimelineIds: post.selectedTimelineIds, }; if (resp?.id) { @@ -228,7 +228,7 @@ export const PostCreate: React.FC = props => { selectedUserIds: post.selectedUserIds, NSFWTag: post.NSFWTag, visibility: post.visibility ?? PostVisibility.PUBLIC, - selectedTimelineIds: post.selectedTimelineIds ?? timelineId, + selectedTimelineIds: post.selectedTimelineIds, }; if (resp?.id) { @@ -617,7 +617,7 @@ export const PostCreate: React.FC = props => {
diff --git a/src/components/Settings/SharingSettings.tsx b/src/components/Settings/SharingSettings.tsx deleted file mode 100644 index 509aeeb64..000000000 --- a/src/components/Settings/SharingSettings.tsx +++ /dev/null @@ -1,128 +0,0 @@ -/* eslint-disable jsx-a11y/interactive-supports-focus */ - -/* eslint-disable jsx-a11y/click-events-have-key-events */ -import { useState } from 'react'; -import { useSelector } from 'react-redux'; - -import { - Button, - TextField, - Paper, - Grid, - CircularProgress, - Typography, -} from '@material-ui/core'; - -import { Modal } from '../atoms/Modal'; -import { useStyles } from './Settings.styles'; - -import { sha256 } from 'js-sha256'; -import i18n from 'src/locale'; -import { RootState } from 'src/reducers'; -import { v4 as uuidv4 } from 'uuid'; - -const SharingSetting = () => { - const styles = useStyles(); - const loading = useSelector( - ({ configState: { loading } }) => loading, - ); - const [tokenValue, setToken] = useState(''); - const [modalOpen, setModalOpen] = useState(false); - const [error, setError] = useState({ - isError: false, - message: '', - }); - - const onChangeToken = (event: React.ChangeEvent) => { - const input = event.target.value; - - if (!input.length) { - setError({ isError: false, message: '' }); - } - setToken(event.target.value); - }; - - const onClickAddToken = () => { - const token = uuidv4(); - const tokenHash = sha256(token); - const first = token.slice(0, 4); - const second = token.slice(-4); - const replacement = 'xxxx-xxxx-xxxx-xxxx-xxxxxxxx'; - const disguise = first + replacement + second; - console.log(tokenHash, disguise); - setModalOpen(true); - - // TODO create access token on blockchain - // await createAccessToken(hash, wallet) - // await APILink.store(disguise, hash) - setToken(token); - }; - - const handleClose = () => { - setModalOpen(false); - }; - - if (loading) - return ( - - - - ); - - return ( - - - - Token is {tokenValue} - - - Input Code Here -
- <> - - - -
-
- -
-
- ); -}; - -export default SharingSetting; diff --git a/src/components/Settings/hooks/use-setting-list.hook.tsx b/src/components/Settings/hooks/use-setting-list.hook.tsx index dd1bd73f4..d9bd5e6cf 100644 --- a/src/components/Settings/hooks/use-setting-list.hook.tsx +++ b/src/components/Settings/hooks/use-setting-list.hook.tsx @@ -7,7 +7,6 @@ import { AccountSettingsContainer } from '../AccountSettingsContainer'; import EmailSettings from '../EmailSettings'; import { LanguageSettingsContainer } from '../LanguageSettingsContainer'; import { NotificationSettingsContainer } from '../NotificationSettings.container'; -import SharingSetting from '../SharingSettings'; import { BlockListContainer } from '../render/BlockList'; import { HelpComponent } from '../render/Help'; @@ -21,7 +20,6 @@ export type SettingsType = | 'account' | 'notification' | 'email' - | 'sharing' | 'block' | 'language' | 'about' @@ -92,12 +90,6 @@ export const useSettingList = (): SettingsOption[] => { subtitle: i18n.t('Setting.List_Menu.Notification_Subtitle'), component: , }, - { - id: 'sharing', - title: i18n.t('Setting.List_Menu.Sharing_Title'), - subtitle: i18n.t('Setting.List_Menu.Sharing_Subtitle'), - component: , - }, { id: 'block', title: i18n.t('Setting.List_Menu.Blocked_Title'), diff --git a/src/components/Tip/Tip.container.tsx b/src/components/Tip/Tip.container.tsx index 7fa9e1277..4c3a78faf 100644 --- a/src/components/Tip/Tip.container.tsx +++ b/src/components/Tip/Tip.container.tsx @@ -117,7 +117,7 @@ export const TipContainer: React.FC = () => { const serverId = currentWallet.networkId === NetworkIdEnum.NEAR ? server?.accountId?.[currentWallet.networkId] - : server?.accountId?.[NetworkIdEnum.MYRIADOCTOPUS]; + : server?.accountId?.[NetworkIdEnum.MYRIAD]; if (!serverId) throw new Error('Server not exists'); @@ -139,7 +139,7 @@ export const TipContainer: React.FC = () => { } case NetworkIdEnum.DEBIO: - case NetworkIdEnum.MYRIADOCTOPUS: { + case NetworkIdEnum.MYRIAD: { checkExtensionInstalled(); setTipsBalanceInfo(tipsBalanceInfo); break; @@ -231,7 +231,7 @@ export const TipContainer: React.FC = () => { switch (network.id) { case NetworkIdEnum.DEBIO: - case NetworkIdEnum.MYRIADOCTOPUS: + case NetworkIdEnum.MYRIAD: case NetworkIdEnum.NEAR: return (
diff --git a/src/components/Tip/Tip.tsx b/src/components/Tip/Tip.tsx index 6825974e8..05f732c0f 100644 --- a/src/components/Tip/Tip.tsx +++ b/src/components/Tip/Tip.tsx @@ -16,11 +16,10 @@ import { useStyles } from './tip.style'; import { MenuOptions } from 'src/components/atoms/DropdownMenu'; import { NearNetworkIcon24, - MyriadOctopusIcon, + MyriadCircleIcon, PolkadotNetworkIcon, KusamaNetworkIcon, DebioNetworkIcon, - MyriadRococoIcon, } from 'src/components/atoms/Icons'; import ShowIf from 'src/components/common/show-if.component'; import { TipsResult } from 'src/interfaces/blockchain-interface'; @@ -57,13 +56,9 @@ const networkOptions: MenuOptions[] = [ id: 'near', title: 'NEAR', }, - { - id: 'rococo', - title: 'Myriad Rococo', - }, { id: 'myriad', - title: 'Myriad Octopus', + title: 'Myriad', }, { id: 'debio', @@ -92,8 +87,7 @@ export const Tip: React.FC = props => { polkadot: , kusama: , near: , - myriad: , - rococo: , + myriad: , debio: , }), [], diff --git a/src/components/UserMenu/UserMenu.tsx b/src/components/UserMenu/UserMenu.tsx index 295e2be7d..c0eb3621e 100644 --- a/src/components/UserMenu/UserMenu.tsx +++ b/src/components/UserMenu/UserMenu.tsx @@ -59,7 +59,7 @@ export const UserMenu: React.FC = props => { tabs={tabs} selected={activeTab} - scrollButtons="on" + scrollButtons="auto" variant="scrollable" onChangeTab={setActiveTab} size="small" diff --git a/src/components/atoms/Icons/Core.tsx b/src/components/atoms/Icons/Core.tsx index f567e9a97..6e0ef95b9 100644 --- a/src/components/atoms/Icons/Core.tsx +++ b/src/components/atoms/Icons/Core.tsx @@ -12,8 +12,6 @@ import MyriadCircle from 'src/images/Icons/myriad-circle.svg'; import MyriadFullBlack from 'src/images/Icons/myriad-full-black.svg'; import MyriadGrey from 'src/images/Icons/myriad-grey.svg'; import MyriadFull from 'src/images/Icons/myriad-logo-full.svg'; -import MyriadOctopus from 'src/images/Icons/myriad-octopus.svg'; -import MyriadRococo from 'src/images/Icons/myriad-rococo.svg'; import Notification from 'src/images/Icons/notif-default.svg'; import OfficialBadge from 'src/images/Icons/official-badge.svg'; @@ -28,24 +26,6 @@ export const MyriadCircleIcon: React.FC = props => ( /> ); -export const MyriadOctopusIcon: React.FC = props => ( - -); - -export const MyriadRococoIcon: React.FC = props => ( - -); - export const MyriadFullIcon: React.FC = props => { const { width = 221, height = 48 } = props; return ( diff --git a/src/components/atoms/Icons/Socials.tsx b/src/components/atoms/Icons/Socials.tsx index 972883c9f..a73290156 100644 --- a/src/components/atoms/Icons/Socials.tsx +++ b/src/components/atoms/Icons/Socials.tsx @@ -44,5 +44,4 @@ export const socials: Record = { [SocialsEnum.FOURCHAN]: , [SocialsEnum.VK]: , [SocialsEnum.WEIBO]: , - [SocialsEnum.X]: , }; diff --git a/src/components/common/CKEditor/Editor.style.ts b/src/components/common/CKEditor/Editor.style.ts index 0f7c88156..c865e3652 100644 --- a/src/components/common/CKEditor/Editor.style.ts +++ b/src/components/common/CKEditor/Editor.style.ts @@ -37,7 +37,6 @@ export const useStyles = makeStyles(theme => }, large: { width: props => (props.mobile ? '100%' : 820), - bottom: 50, }, toolbar: { padding: '12px 12px!important', diff --git a/src/components/common/CKEditor/Editor.tsx b/src/components/common/CKEditor/Editor.tsx index 633822f5c..39104efd6 100644 --- a/src/components/common/CKEditor/Editor.tsx +++ b/src/components/common/CKEditor/Editor.tsx @@ -1,18 +1,45 @@ +import ClassicEditor from '@ckeditor/ckeditor5-build-classic'; import { CKEditor } from '@ckeditor/ckeditor5-react'; -import customEditor from '@myriadsocial/ckeditor5-custom-build'; import React, { useState } from 'react'; +import { Button } from '@material-ui/core'; + import { EditorProps } from './Editor.interface'; import { useStyles } from './Editor.style'; +import { MediaEmbedToolbarButton } from './MediaEmbedButton'; +import { CustomAdapterPlugin } from './adapters'; import * as UserAPI from 'src/lib/api/user'; +type File = { + originalname: string; + mimeType: string; + size: number; + url: string; +}; +const VideoPreview = ({ videoURL }) => { + return ( +
+ +
+ ); +}; + export const Editor: React.FC = props => { - const { mobile, onChange, isErrorEditor, placeholder } = props; + const { userId, mobile, onChange, isErrorEditor, placeholder } = props; const styles = useStyles({ mobile, counter: true }); - const [, setEditorData] = useState(''); + const [modalOpen, setModalOpen] = useState(false); + const [uploadedVideos, setUploadedVideos] = useState([]); + const handleUploadButtonClick = () => { + setModalOpen(true); + }; const handleSearch = async (query: string) => { const { data } = await UserAPI.searchUsers(1, query); @@ -21,7 +48,7 @@ export const Editor: React.FC = props => { return { id: '@' + item.username, userId: item.id, - name: item.username, + name: item.name, }; }); }; @@ -29,21 +56,25 @@ export const Editor: React.FC = props => { const config = { licenseKey: '', placeholder: placeholder ?? 'Type...', - // toolbar: { - // items: [ - // 'bold', - // 'italic', - // 'blockQuote', - // 'alignment', - // '|', - // 'bulletedList', - // 'numberedList', - // 'indent', - // 'outdent', - // 'link', - // 'imageUpload', - // ], - // }, + extraPlugins: [CustomAdapterPlugin], + toolbar: { + items: [ + 'bold', + 'italic', + 'blockQuote', + 'alignment', + '|', + 'bulletedList', + 'numberedList', + 'indent', + 'outdent', + 'link', + 'imageUpload', + ], + }, + alignment: { + options: ['left', 'right', 'center', 'justify'], + }, mention: { feeds: [ { @@ -52,6 +83,19 @@ export const Editor: React.FC = props => { }, ], }, + image: { + upload: { + types: ['png', 'jpeg', 'webp', 'gif', 'mp4'], + }, + toolbar: [], + }, + }; + + const handleFileSelected = (uploadedVideosData: File[]) => { + const videoURL = uploadedVideosData[0].url; // Assuming you only upload one video at a time + + setUploadedVideos([...uploadedVideos, videoURL]); + setModalOpen(false); }; return ( @@ -59,14 +103,20 @@ export const Editor: React.FC = props => { className={`${styles.root} ${styles.large}`} style={{ borderColor: isErrorEditor ? '#FE3333' : '#E0E0E0' }}> { - console.log('Editor is ready'); + editor.plugins + .get('FileRepository') + .on('change:uploadTotal', (e, n, value) => { + if (value === 0) { + const data = editor.getData(); + onChange(data, true); + } + }); }} onChange={(event, editor) => { const data = editor.getData(); - setEditorData(data); onChange(data, false); }} @@ -74,6 +124,36 @@ export const Editor: React.FC = props => { console.error({ event, editor }); }} /> + + + +
+ {uploadedVideos.map((videoURL, index) => ( + + ))} +
+ + {modalOpen && ( + setModalOpen(false)} + /> + )}
); }; diff --git a/src/components/template/Default/DefaultLayout.tsx b/src/components/template/Default/DefaultLayout.tsx index e1c97dfb7..7b3f9f9ef 100644 --- a/src/components/template/Default/DefaultLayout.tsx +++ b/src/components/template/Default/DefaultLayout.tsx @@ -251,7 +251,10 @@ const Default: React.FC = props => { - + + + + diff --git a/src/helpers/extension.ts b/src/helpers/extension.ts index d07257abe..a97361614 100644 --- a/src/helpers/extension.ts +++ b/src/helpers/extension.ts @@ -52,11 +52,7 @@ export const convertToPolkadotAddress = ( ): string => { if (isHex(address)) { switch (currentWallet.networkId) { - case NetworkIdEnum.MYRIADROCOCO: { - return encodeAddress(hexToU8a(address), 42); - } - - case NetworkIdEnum.MYRIADOCTOPUS: { + case NetworkIdEnum.MYRIAD: { return encodeAddress(hexToU8a(address), 42); } diff --git a/src/helpers/string.ts b/src/helpers/string.ts index dba12618a..f2057d4c4 100644 --- a/src/helpers/string.ts +++ b/src/helpers/string.ts @@ -96,7 +96,7 @@ export const htmlToJson = (html: any) => { img.push(imgs); } } else { - if (Array.isArray(item.props?.children)) { + if (Array.isArray(item.props.children)) { item.props.children.map(child => { if (child.type === 'img') { const imgs = child.props.src; diff --git a/src/helpers/wallet.ts b/src/helpers/wallet.ts index c33ccf418..ca806b63d 100644 --- a/src/helpers/wallet.ts +++ b/src/helpers/wallet.ts @@ -60,8 +60,7 @@ export const formatWalletTitle = ( if (networkId) { switch (networkId) { - case NetworkIdEnum.MYRIADROCOCO: - case NetworkIdEnum.MYRIADOCTOPUS: + case NetworkIdEnum.MYRIAD: case NetworkIdEnum.DEBIO: case NetworkIdEnum.KUSAMA: case NetworkIdEnum.POLKADOT: diff --git a/src/hooks/use-claim-tip.hook.ts b/src/hooks/use-claim-tip.hook.ts index d54c76725..682e3d4d7 100644 --- a/src/hooks/use-claim-tip.hook.ts +++ b/src/hooks/use-claim-tip.hook.ts @@ -136,7 +136,7 @@ export const useClaimTip = () => { const networkCallback = async (network: Network) => { switch (network.id) { case NetworkIdEnum.DEBIO: - case NetworkIdEnum.MYRIADOCTOPUS: { + case NetworkIdEnum.MYRIAD: { const result = await getClaimTipSubstrate( server, user.id, @@ -221,7 +221,7 @@ export const useClaimTip = () => { try { const serverId = selectedNetwork.blockchainPlatform === BlockchainPlatform.SUBSTRATE - ? server?.accountId?.[NetworkIdEnum.MYRIADOCTOPUS] + ? server?.accountId?.[NetworkIdEnum.MYRIAD] : server?.accountId?.[selectedNetwork.id]; if (!serverId) { @@ -276,7 +276,7 @@ export const useClaimTip = () => { const selectedNetwork = networks.find(network => network.id == networkId); const serverId = selectedNetwork.blockchainPlatform === BlockchainPlatform.SUBSTRATE - ? server?.accountId?.[NetworkIdEnum.MYRIADOCTOPUS] + ? server?.accountId?.[NetworkIdEnum.MYRIAD] : server?.accountId?.[selectedNetwork.id]; if (!serverId) return; diff --git a/src/hooks/use-polkadot-api.hook.ts b/src/hooks/use-polkadot-api.hook.ts index 3b45c1179..1153db9bb 100644 --- a/src/hooks/use-polkadot-api.hook.ts +++ b/src/hooks/use-polkadot-api.hook.ts @@ -20,7 +20,7 @@ export const usePolkadotApi = () => { socials: SocialMedia[], network: Network, ): Promise => { - const serverId = server.accountId[NetworkIdEnum.MYRIADOCTOPUS]; + const serverId = server.accountId[NetworkIdEnum.MYRIAD]; const accountId = wallet?.id ?? null; const peopleIds: string[] = []; const data: TipsBalanceData = { diff --git a/src/hooks/use-wallet-hook.ts b/src/hooks/use-wallet-hook.ts index 3d46fdd34..2ba0b2c4d 100644 --- a/src/hooks/use-wallet-hook.ts +++ b/src/hooks/use-wallet-hook.ts @@ -210,26 +210,6 @@ export const useWallet = () => { } }; - // const createAccessToken = async () : Promise => { - // try { - // await provider.createAccessToken() - - // } - // catch (error) { - // const variant = error.message === 'Cancelled' ? 'warning' : 'error'; - // const message = - // variant === 'warning' - // ? i18n.t('Tipping.Toaster.Cancelled') - // : error.message; - // enqueueSnackbar({ variant, message }); - - // } finally { - // setLoading(false); - // setSignerLoading(false); - // } - - // } - return { loading, isSignerLoading, diff --git a/src/images/Icons/myriad-octopus.svg b/src/images/Icons/myriad-octopus.svg deleted file mode 100644 index 6cdb9c869..000000000 --- a/src/images/Icons/myriad-octopus.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/images/Icons/myriad-rococo.svg b/src/images/Icons/myriad-rococo.svg deleted file mode 100644 index 675196d87..000000000 --- a/src/images/Icons/myriad-rococo.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/interfaces/experience.ts b/src/interfaces/experience.ts index ab76afd99..5d81e5818 100644 --- a/src/interfaces/experience.ts +++ b/src/interfaces/experience.ts @@ -43,7 +43,6 @@ export interface ExperienceProps extends Searchable { people: People[]; visibility: string; selectedUserIds: SelectedUserIds[]; - editorsId?: string[]; } export interface Experience extends ExperienceProps, BaseModel { diff --git a/src/interfaces/network.ts b/src/interfaces/network.ts index f434639ae..46f766b18 100644 --- a/src/interfaces/network.ts +++ b/src/interfaces/network.ts @@ -10,8 +10,7 @@ export enum NetworkIdEnum { BINANCE = 'binance', POLYGON = 'polygon', NEAR = 'near', - MYRIADOCTOPUS = 'myriad', - MYRIADROCOCO = 'rococo', + MYRIAD = 'myriad', KUSAMA = 'kusama', DEBIO = 'debio', } diff --git a/src/interfaces/social.ts b/src/interfaces/social.ts index ba342d906..373a5c0bb 100644 --- a/src/interfaces/social.ts +++ b/src/interfaces/social.ts @@ -11,7 +11,6 @@ export enum SocialsEnum { TELEGRAM = 'telegram', VK = 'vk', WEIBO = 'weibo', - X = 'x', } export type SocialMediaProps = { diff --git a/src/lib/api/auth-link.ts b/src/lib/api/auth-link.ts index ea8a29728..9aa640f4b 100644 --- a/src/lib/api/auth-link.ts +++ b/src/lib/api/auth-link.ts @@ -70,26 +70,6 @@ export const loginWithLink = async ( return data; }; -export const loginWithAccessToken = async ( - token: string, - rpcUrl: string, -): Promise => { - const { data } = await MyriadAPI().request({ - url: '/authentication/login/pat', - method: 'POST', - data: { - token, - rpcUrl, - }, - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - }); - - return data; -}; - export const signUpWithEmail = async (values: SignupWithEmailProps) => { const { data } = await MyriadAPI().request({ url: '/authentication/signup/email', diff --git a/src/lib/api/post.ts b/src/lib/api/post.ts index 227b72e24..d24733ef4 100644 --- a/src/lib/api/post.ts +++ b/src/lib/api/post.ts @@ -151,16 +151,6 @@ export const getPost = async ( return post.createdBy === fields.owner; }); } - if (data.data.length === 0 && params.experienceId) { - const { data } = await MyriadAPI().request({ - url: `/experience/${params.experienceId}/posts`, - method: 'GET', - params: { - filter: filterParams, - }, - }); - return data; - } return data; }; diff --git a/src/lib/api/user.ts b/src/lib/api/user.ts index 8db3711c5..78a73b66d 100644 --- a/src/lib/api/user.ts +++ b/src/lib/api/user.ts @@ -175,19 +175,3 @@ export const getUserByIds = async ( return data; }; - -export const getUserByUserName = async (userName: string): Promise => { - const params: Record = { - filter: { - where: { - username: userName, - }, - }, - }; - const { data } = await MyriadAPI().request({ - url: `/users`, - method: 'GET', - params, - }); - return data.data; -}; diff --git a/src/lib/api/wallet.ts b/src/lib/api/wallet.ts index 68bc7ac48..b0fdbd046 100644 --- a/src/lib/api/wallet.ts +++ b/src/lib/api/wallet.ts @@ -179,7 +179,6 @@ export const getNetworks = async (): Promise => { url: `/networks`, method: 'GET', params: { - pageLimit: 10, filter: { include: [ { diff --git a/src/locale/en.json b/src/locale/en.json index 1ff6c8cd8..73b1710a8 100644 --- a/src/locale/en.json +++ b/src/locale/en.json @@ -111,7 +111,6 @@ "Placeholder_3": "Search people here", "Placeholder_4": "Select Type of Privacy", "Placeholder_5": "Custom People Who Can View", - "Placeholder_6": "Who can edit timeline", "Post": { "Title": "Post", "Desc": "Manually added posts will appear here. You can manually add a post to an Timeline by selecting 'add post to Timeline' on the top-right menu of each post." @@ -280,15 +279,6 @@ "Next": "Next" } }, - "Token": { - "LoginByToken": { - "Title": "Sign-in with Token", - "Subtitle": "You need to input token.", - "Email_Placeholder": "Add your email", - "Back": "Back", - "Next": "Next" - } - }, "Options": { "Network": "Select Network", "Wallet": "Select Wallet", @@ -1026,8 +1016,6 @@ }, "Notification_Title": "Notification Settings", "Notification_Subtitle": "Manage your notification", - "Sharing_Title": "Account Sharing Setting", - "Sharing_Subtitle": "TBA", "Notification_Setting": { "Comments": "Comments", "Mention": "Mention", @@ -1063,8 +1051,7 @@ "Email_Title": "Email Configuration", "Email_Subtitle": "Set email address for another method of login", "Email_Address": "Email Address", - "Email_Placeholder": "Add Email Address", - "Token_Code": "Add Token Code" + "Email_Placeholder": "Add Email Address" } }, "SocialMedia": { @@ -1368,18 +1355,7 @@ "title": "Email", "desc": "Sign in via Web 2.0", "tooltip": "Sign-in via email lets you use many of Myriad’s features. You can get the real deal later by adding a crypto wallet address in your wallet settings. We will not use your email for commercial purposes." - }, - "Token": { - "title": "Token", - "desc": "Sign in via Token", - "tooltip": "Sign-in with token." } }, - "TrendingHashtag": "Top Weekly Hashtags", - "Token": { - "Modal": { - "Title": "Token Generated", - "Subtitle": "Your access token has been generated" - } - } + "TrendingHashtag": "Top Weekly Hashtags" } diff --git a/src/locale/fra.json b/src/locale/fra.json index 9c38ce8d5..ac10771e5 100644 --- a/src/locale/fra.json +++ b/src/locale/fra.json @@ -111,7 +111,6 @@ "Placeholder_3": "Rechercher des personnes ici", "Placeholder_4": "Select Type of Privacy", "Placeholder_5": "Custom People Who Can View", - "Placeholder_6": "Who can edit timeline", "Post": { "Title": "Publier", "Desc": "Les messages ajoutés manuellement apparaîtront ici. Vous pouvez ajouter manuellement une publication à une Timeline en sélectionnant 'Ajouter une publication à la Timeline' dans le menu en haut à droite de chaque publication." @@ -280,15 +279,6 @@ "Next": "Suivant" } }, - "Token": { - "LoginByToken": { - "Title": "Connectez-vous avec e-mail", - "Subtitle": "Vous recevrez un lien de connexion dans votre boîte de réception.", - "Email_Placeholder": "Ajoutez votre e-mail", - "Back": "Retour", - "Next": "Suivant" - } - }, "Options": { "Network": "Sélectionnez réseau", "Wallet": "Sélectionnez Portefeuille", @@ -1026,8 +1016,6 @@ }, "Notification_Title": "Paramètres de notification", "Notification_Subtitle": "Gérer votre notification", - "Sharing_Title": "Account Sharing Setting", - "Sharing_Subtitle": "TBA", "Notification_Setting": { "Comments": "Commentaires", "Mention": "Mention", @@ -1059,8 +1047,7 @@ "About_Subtitle": "En savoir plus sur Myriad", "Feedback_Title": "Soumettre des commentaires", "Feedback_Subtitle": "N'hésitez pas à nous faire part de vos commentaires en nous envoyant un e-mail.", - "Version_Title": "Version Myriad", - "Token_Code": "Add Token Code" + "Version_Title": "Version Myriad" } }, "SocialMedia": { @@ -1364,18 +1351,7 @@ "title": "Email", "desc": "Sign in via Web 2.0", "tooltip": "Sign-in via email lets you use many of Myriad’s features. You can get the real deal later by adding a crypto wallet address in your wallet settings. We will not use your email for commercial purposes." - }, - "Token": { - "title": "Token", - "desc": "Sign in via Token", - "tooltip": "Sign-in with token." } }, - "TrendingHashtag": "Top Weekly Hashtags", - "Token": { - "Modal": { - "Title": "Token Generated", - "Subtitle": "Your access token has been generated" - } - } + "TrendingHashtag": "Top Weekly Hashtags" } diff --git a/src/locale/id.json b/src/locale/id.json index 3521f7404..9ae5e560e 100644 --- a/src/locale/id.json +++ b/src/locale/id.json @@ -1011,8 +1011,6 @@ }, "Notification_Title": "Notifikasi", "Notification_Subtitle": "Pengaturan notifikasi", - "Sharing_Title": "Account Sharing Setting", - "Sharing_Subtitle": "TBA", "Notification_Setting": { "Comments": "Komentar", "Mention": "Sebutan", @@ -1048,8 +1046,7 @@ "Email_Title": "Pengaturan Email", "Email_Subtitle": "Atur alamat email sebagai metode lain untuk login", "Email_Address": "Alamat Email", - "Email_Placeholder": "Tambah Alamat Email", - "Token_Code": "Add Token Code" + "Email_Placeholder": "Tambah Alamat Email" } }, "SocialMedia": { @@ -1355,11 +1352,5 @@ "tooltip": "Sign-in melalui email untuk mendapatkan banyak fitur dari myriad. Anda dapat mendapatkan seluruhnya nanti dengan menambahkan dompet pada pengaturan dompet. Kami tidak akan menggunakan email anda demi kepentingan komersial." } }, - "TrendingHashtag": "Hashtag Trending Mingguan", - "Token": { - "Modal": { - "Title": "Token Generated", - "Subtitle": "Your access token has been generated" - } - } + "TrendingHashtag": "Hashtag Trending Mingguan" } diff --git a/src/locale/ru.json b/src/locale/ru.json index 7dfa3c794..c6902d71d 100644 --- a/src/locale/ru.json +++ b/src/locale/ru.json @@ -272,24 +272,6 @@ "Btn_Signin": "Войти", "Btn_Demo": "демо" }, - "Email": { - "LoginByEmail": { - "Title": "Sign-in with email", - "Subtitle": "You will receive a sign-in link in your inbox.", - "Email_Placeholder": "Add your email", - "Back": "Back", - "Next": "Next" - } - }, - "Token": { - "LoginByToken": { - "Title": "Sign-in with email", - "Subtitle": "You will receive a sign-in link in your inbox.", - "Email_Placeholder": "Add your email", - "Back": "Back", - "Next": "Next" - } - }, "Options": { "Network": "Выберете Соц. сеть", "Wallet": "Выберете Кошелек", @@ -1016,8 +998,6 @@ }, "Notification_Title": "Настройка уведомлений", "Notification_Subtitle": "Управление уведомлениями", - "Sharing_Title": "Account Sharing Setting", - "Sharing_Subtitle": "TBA", "Notification_Setting": { "Comments": "Комментарии", "Mention": "Упоминания", @@ -1053,8 +1033,7 @@ "Email_Title": "Email Configuration", "Email_Subtitle": "Set email address for another method of login", "Email_Address": "Email Address", - "Email_Placeholder": "Add Email Address", - "Token_Code": "Add Token Code" + "Email_Placeholder": "Add Email Address" } }, "SocialMedia": { @@ -1357,18 +1336,7 @@ "title": "Email", "desc": "Sign in via Web 2.0", "tooltip": "Sign-in via email lets you use many of Myriad’s features. You can get the real deal later by adding a crypto wallet address in your wallet settings. We will not use your email for commercial purposes." - }, - "Token": { - "title": "Token", - "desc": "Sign in via Token", - "tooltip": "Sign-in with token." } }, - "TrendingHashtag": "Top Weekly Hashtags", - "Token": { - "Modal": { - "Title": "Token Generated", - "Subtitle": "Your access token has been generated" - } - } + "TrendingHashtag": "Top Weekly Hashtags" } diff --git a/src/reducers/config/actions.ts b/src/reducers/config/actions.ts index 9d6ce2d5f..9a23b8ba8 100644 --- a/src/reducers/config/actions.ts +++ b/src/reducers/config/actions.ts @@ -186,11 +186,7 @@ export const fetchFilteredToken: ThunkActionCreator = try { const filter = { where: { - or: [ - { networkId: 'myriad' }, - { networkId: 'debio' }, - { networkId: 'rococo' }, - ], + or: [{ networkId: 'myriad' }, { networkId: 'debio' }], }, }; const { data: currencies } = await TokenAPI.getFilteredTokens( diff --git a/src/reducers/user/actions.ts b/src/reducers/user/actions.ts index de3ed3fc8..9b8f7316e 100644 --- a/src/reducers/user/actions.ts +++ b/src/reducers/user/actions.ts @@ -528,7 +528,7 @@ export const fetchNetwork: ThunkActionCreator = tips: [], }; - if (network.id === NetworkIdEnum.MYRIADOCTOPUS) { + if (network.id === NetworkIdEnum.MYRIAD) { filterNetwork.unshift(networkWithTips); } else { filterNetwork.push(networkWithTips); diff --git a/src/stories/something.tsx b/src/stories/something.tsx new file mode 100644 index 000000000..92f5cf1e2 --- /dev/null +++ b/src/stories/something.tsx @@ -0,0 +1,3 @@ +export const DefaultAvatar = { + src: 'https://res.cloudinary.com/dsget80gs/w_150,h_150,c_thumb/e6bvyvm8xtewfzafmgto.jpg', +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 146aeb572..d8e4ed5ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2180,18 +2180,6 @@ dependencies: ckeditor5 "^35.4.0" -"@ckeditor/ckeditor5-clipboard@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-40.1.0.tgz#a0a395a7f8f745a9f5dd8dc2fb39ac00b72f409b" - integrity sha512-Zk1wCJbxhFygfEE8QHFiF4IRO9Ufl5lKaYtCq31dniex4XGyQ4x9LJz6YLhMzfhWKIrfBwpUiStXQ3GxgVgP1w== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-engine" "40.1.0" - "@ckeditor/ckeditor5-ui" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - "@ckeditor/ckeditor5-widget" "40.1.0" - lodash-es "4.17.21" - "@ckeditor/ckeditor5-clipboard@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-35.4.0.tgz#8529fd45d06a7edea0f73cd0b5b3052f2272335c" @@ -2210,15 +2198,6 @@ dependencies: ckeditor5 "^35.4.0" -"@ckeditor/ckeditor5-core@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-core/-/ckeditor5-core-40.1.0.tgz#049e72d4f4e7f886a037560025f69528c5c43aac" - integrity sha512-VTPANdgrPvCshACLElgHF+ELLpoMvNoa/Y+dfnI5tNuX8hbALpmFm/rNzDIYGzNWBOjBq9WLWcvYLSrIgb3f8A== - dependencies: - "@ckeditor/ckeditor5-engine" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - lodash-es "4.17.21" - "@ckeditor/ckeditor5-core@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-core/-/ckeditor5-core-35.4.0.tgz#39390445c8363a80d4ce0e45d93efa13b8523f6e" @@ -2236,14 +2215,6 @@ dependencies: ckeditor5 "^35.4.0" -"@ckeditor/ckeditor5-editor-classic@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-40.1.0.tgz#34a57ad6b4d505104b44c39082dcb9eabc2f8a68" - integrity sha512-A1nJE+bGNcfWIw9O0JHNjXe5T3zwqE42wb7vZFznGEIc9OoG6yHmkpo5wV/DZVy9zia7Y5f6EdLdEaHLx3VzUg== - dependencies: - ckeditor5 "40.1.0" - lodash-es "4.17.21" - "@ckeditor/ckeditor5-editor-classic@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-35.4.0.tgz#6fa7e05fc7282ba9f7f31060d0b71e3cc73784a9" @@ -2252,14 +2223,6 @@ ckeditor5 "^35.4.0" lodash-es "^4.17.15" -"@ckeditor/ckeditor5-engine@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-40.1.0.tgz#daf83af92e46a181c3beee2e912ab055dddf0d0b" - integrity sha512-z4UD6ncjgtpqlcCzfSaAX5uro6TNiJVuW0hUv2WH4WGt1cBWjvNZ9kkcaJAANJhDXxNDA+jgRAeRkowaxUGXIg== - dependencies: - "@ckeditor/ckeditor5-utils" "40.1.0" - lodash-es "4.17.21" - "@ckeditor/ckeditor5-engine@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-35.4.0.tgz#cb0ed9f0c5a9ef00b24ffbd8d2100fff1e0e90cb" @@ -2268,15 +2231,6 @@ "@ckeditor/ckeditor5-utils" "^35.4.0" lodash-es "^4.17.15" -"@ckeditor/ckeditor5-enter@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-40.1.0.tgz#f363bac7f7140f75891ccfcf004956e4ff6297fd" - integrity sha512-8X9+Lsc9pDUfmXjcZCQfEvp5YTs22x3FsOPAi8JEE/9aO2n0dB/zSNn2O8oJ1u5hf/9N8EYkyYiowI9cYEl9ww== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-engine" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - "@ckeditor/ckeditor5-enter@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-35.4.0.tgz#c0f967dc3f48faeb07d839ac0426227e118ade56" @@ -2285,13 +2239,6 @@ "@ckeditor/ckeditor5-core" "^35.4.0" "@ckeditor/ckeditor5-engine" "^35.4.0" -"@ckeditor/ckeditor5-essentials@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-40.1.0.tgz#47b59449e815698aa8c1bfee8a49ab3b1a9897c6" - integrity sha512-buTY8ATSM42EWMkwrsvpHyntfzvtn+2DvbrRIYm0w50GDchlmVRczR4axv7snLRKLsSB3yjGbodaVvtl9MFTXA== - dependencies: - ckeditor5 "40.1.0" - "@ckeditor/ckeditor5-essentials@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-35.4.0.tgz#4d56655886206b912e2178cb9440ce933ca96100" @@ -2347,23 +2294,6 @@ "@ckeditor/ckeditor5-ui" "^35.4.0" ckeditor5 "^35.4.0" -"@ckeditor/ckeditor5-mention@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-mention/-/ckeditor5-mention-40.1.0.tgz#71aea20e4d052d086746d4557588ee3e6e06851a" - integrity sha512-1MWNAlABbalFbAO2cvaI0erIs+qjpsELdvnHgJClsp6AIKZPRd9KS7h+UDtcG43OoQFCwNTmZZ6e0m9VEz/dQg== - dependencies: - ckeditor5 "40.1.0" - lodash-es "4.17.21" - -"@ckeditor/ckeditor5-paragraph@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-40.1.0.tgz#f26074f19c30a2abb27797493bafd9e521bde5f9" - integrity sha512-R1bGbLF4tiA4SQtDHVBqqgrmAOyA9bj0q9ssVtQpn4/dew5sffnvQIDhgc+GlIT3Z1HQT3rH4JLEJE9sOid0VA== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-ui" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - "@ckeditor/ckeditor5-paragraph@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-35.4.0.tgz#db6babd19eb37c66771b7355d0cd0880cb9b599c" @@ -2387,15 +2317,6 @@ dependencies: prop-types "^15.7.2" -"@ckeditor/ckeditor5-select-all@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-40.1.0.tgz#32e2e6d827db4d9e7cfcad1f65ba09de32052ae5" - integrity sha512-6EA36HT9ZDFU9cInVo512lUkE6AMWKp2p7zCWTyHCtvA3vATAendxw0lgyY2EX+LIwD/gisWsyWts6OMFk/PmQ== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-ui" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - "@ckeditor/ckeditor5-select-all@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-35.4.0.tgz#b7c20e9f686e59497e84825c4786dd874e22d4e2" @@ -2413,16 +2334,6 @@ ckeditor5 "^35.4.0" lodash-es "^4.17.15" -"@ckeditor/ckeditor5-typing@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-40.1.0.tgz#3c8e6f8e247217bfef23bef021e5f327f3b64edc" - integrity sha512-Ro7+vGQPqZm38n2v6r5azliZrkos+8nA1tTDgXdNgmzpr53CdLB8rX/DQRTNY+xAwujgKy9y3P+uVmV5HigqnQ== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-engine" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - lodash-es "4.17.21" - "@ckeditor/ckeditor5-typing@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-35.4.0.tgz#b786032a541cfd102562eb07c21c62e0b6d502c6" @@ -2433,18 +2344,6 @@ "@ckeditor/ckeditor5-utils" "^35.4.0" lodash-es "^4.17.15" -"@ckeditor/ckeditor5-ui@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-40.1.0.tgz#6a4feb2eec9db1a75030700233e4dd9ffc3be8b3" - integrity sha512-ROq/as1YnlfwPtqqWU8u+bw8pCFbqUhOU4Xq1VuFqN4dhrecz2NIkSHU8ht+vD4YmPqXTDa8GOwaBKnCjX7pZA== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - color-convert "2.0.1" - color-parse "1.4.2" - lodash-es "4.17.21" - vanilla-colorful "0.7.2" - "@ckeditor/ckeditor5-ui@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-35.4.0.tgz#76e59032aee6652c6bd717f30fc330a064b3451e" @@ -2454,15 +2353,6 @@ "@ckeditor/ckeditor5-utils" "^35.4.0" lodash-es "^4.17.15" -"@ckeditor/ckeditor5-undo@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-40.1.0.tgz#87c34576de72cae78e884df8531633f828d8b556" - integrity sha512-j07Zs4NHWSEcBHcye28InssE8S3ryMcwEWTYDr0/L3LYnBs5b1fCyGCJYchH3yLlrQTL88yX+SQKmwZE0f0wYw== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-engine" "40.1.0" - "@ckeditor/ckeditor5-ui" "40.1.0" - "@ckeditor/ckeditor5-undo@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-35.4.0.tgz#f79b19be69b8b9ab57592cfe4ec4645b3728b773" @@ -2472,15 +2362,6 @@ "@ckeditor/ckeditor5-engine" "^35.4.0" "@ckeditor/ckeditor5-ui" "^35.4.0" -"@ckeditor/ckeditor5-upload@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-40.1.0.tgz#4053236da461dd145474f1680a428f8df4456ac5" - integrity sha512-uTaP36PskRdBn2XvWTWPUm+D9xlXvzuD2OvbxLP2kAiU10c43KKPXdukf0N2ujStYcj/hwdPc6ZLt1otImazKw== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-ui" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - "@ckeditor/ckeditor5-upload@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-35.4.0.tgz#57944a4e824cdee37bb53d795dbe98055e11d748" @@ -2490,13 +2371,6 @@ "@ckeditor/ckeditor5-ui" "^35.4.0" "@ckeditor/ckeditor5-utils" "^35.4.0" -"@ckeditor/ckeditor5-utils@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-40.1.0.tgz#d4aea02ea1540c5bf31859780545182e5cac7be1" - integrity sha512-QTpgbuPbQa88AMCOlDdlgK8fPg/IpPuxSU5QDVGR1rmuZRgC7fWCN027aLsJ2t1ppLfKjA/O49dhydm6mKgO9w== - dependencies: - lodash-es "4.17.21" - "@ckeditor/ckeditor5-utils@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-35.4.0.tgz#c5c296a2c1883684e674b1a710fcc41b745e156b" @@ -2504,26 +2378,6 @@ dependencies: lodash-es "^4.17.15" -"@ckeditor/ckeditor5-watchdog@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-40.1.0.tgz#ac940c24e869b1a8d6f80a3b30dfc4b0512f11b0" - integrity sha512-E8+1zC6dnDR0wQnZD88ligKY7pxBcxz953eUdijHmBcVrbECMKJ4VrORIT37LVgstDUYJhHYgxMOQ0TwO/uSKQ== - dependencies: - lodash-es "4.17.21" - -"@ckeditor/ckeditor5-widget@40.1.0": - version "40.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-40.1.0.tgz#a995d419e52e4592da4737c29cf56606110eee14" - integrity sha512-3nmDx6cQzDmuc7F0s1c967GK5cSHzsOAnBFlCkz/Om00It5wHFz2VASXA0LHo1gsma2XoO9MJtZjgUkHQUag3g== - dependencies: - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-engine" "40.1.0" - "@ckeditor/ckeditor5-enter" "40.1.0" - "@ckeditor/ckeditor5-typing" "40.1.0" - "@ckeditor/ckeditor5-ui" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - lodash-es "4.17.21" - "@ckeditor/ckeditor5-widget@^35.4.0": version "35.4.0" resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-35.4.0.tgz#a80ed4c4f57a1198b47c4e93090f8ebe62f70ecb" @@ -3242,14 +3096,14 @@ integrity sha512-SjSBspHXlclODLtSoPIQwBhfeBjncC05NlNoFELJ6xZQkyYDJsVCcs7+f+etHR2cYPbHLjnh1C06lQlCbMEWEA== "@grpc/grpc-js@^1.3.2": - version "1.8.17" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.17.tgz#a3a2f826fc033eae7d2f5ee41e0ab39cee948838" - integrity sha512-DGuSbtMFbaRsyffMf+VEkVu8HkSXEUfO3UyGJNtqxW9ABdtTIA+2UXAJpwbJS+xfQxuwqLUeELmL6FuZkOqPxw== + version "1.5.10" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.5.10.tgz#12f0b33b338fad5a0e48ee1d5999b5b08da60bcc" + integrity sha512-++oAubX/7rJzlqH0ShyzDENNNDHYrlttdc3NM40KlaVQDcgGqQknuPoavmyTC+oNUDyxPCX5dHceKhfcgN3tiw== dependencies: - "@grpc/proto-loader" "^0.7.0" + "@grpc/proto-loader" "^0.6.4" "@types/node" ">=12.12.47" -"@grpc/proto-loader@^0.6.0": +"@grpc/proto-loader@^0.6.0", "@grpc/proto-loader@^0.6.4": version "0.6.9" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.9.tgz#4014eef366da733f8e04a9ddd7376fe8a58547b7" integrity sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg== @@ -3260,17 +3114,6 @@ protobufjs "^6.10.0" yargs "^16.2.0" -"@grpc/proto-loader@^0.7.0": - version "0.7.7" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.7.tgz#d33677a77eea8407f7c66e2abd97589b60eb4b21" - integrity sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^7.0.0" - yargs "^17.7.2" - "@heroicons/react@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-1.0.6.tgz#35dd26987228b39ef2316db3b1245c42eb19e324" @@ -3739,16 +3582,6 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@myriadsocial/ckeditor5-custom-build@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@myriadsocial/ckeditor5-custom-build/-/ckeditor5-custom-build-0.0.1.tgz#187810aec8b31df16ef6c68e4d0cf005a485053b" - integrity sha512-oUxVcFeAhOIw5ynQsNyQ8LMY8/HECSuJrogmbKXtte2mnwdZyUDj7eWtRfl8CWXlm5r+ROKIMxummYKyzas8aQ== - dependencies: - "@ckeditor/ckeditor5-editor-classic" "40.1.0" - "@ckeditor/ckeditor5-essentials" "40.1.0" - "@ckeditor/ckeditor5-mention" "40.1.0" - "@ckeditor/ckeditor5-paragraph" "40.1.0" - "@next/bundle-analyzer@^12.1.0": version "12.1.1" resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-12.1.1.tgz#87798e7b50cc6655fcf7df0da05f91dfd1573587" @@ -4474,14 +4307,6 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== -"@selderee/plugin-htmlparser2@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" - integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== - dependencies: - domhandler "^5.0.3" - selderee "^0.11.0" - "@sentry/browser@6.19.2": version "6.19.2" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.19.2.tgz#c0f6df07584f3b36fa037067aea20b2c8c2095a3" @@ -7235,25 +7060,11 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -7264,7 +7075,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.11.0, ajv@^8.9.0: +ajv@^8.11.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -7635,11 +7446,6 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -b4a@^1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" - integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== - babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" @@ -7960,7 +7766,7 @@ bluebird@^3.3.5, bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@5.2.0, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9, bn.js@^5.0.0, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@5.2.0, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9, bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -8088,7 +7894,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== @@ -8097,19 +7903,19 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" - integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" + bn.js "^5.1.1" + browserify-rsa "^4.0.1" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.4" + elliptic "^6.5.3" inherits "^2.0.4" - parse-asn1 "^5.1.6" - readable-stream "^3.6.2" - safe-buffer "^5.2.1" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -8542,25 +8348,6 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -ckeditor5@40.1.0: - version "40.1.0" - resolved "https://registry.yarnpkg.com/ckeditor5/-/ckeditor5-40.1.0.tgz#eefdbdaf1901884286646ac0dcd61036e498ddb2" - integrity sha512-AMWr8dPWowaj1EvT8pFrkDZ7FioBG96gEP85RrDQm0f8aF8ifJN9vwbX4iAxvX/uL5R90ye2as9+mflm8D+1wQ== - dependencies: - "@ckeditor/ckeditor5-clipboard" "40.1.0" - "@ckeditor/ckeditor5-core" "40.1.0" - "@ckeditor/ckeditor5-engine" "40.1.0" - "@ckeditor/ckeditor5-enter" "40.1.0" - "@ckeditor/ckeditor5-paragraph" "40.1.0" - "@ckeditor/ckeditor5-select-all" "40.1.0" - "@ckeditor/ckeditor5-typing" "40.1.0" - "@ckeditor/ckeditor5-ui" "40.1.0" - "@ckeditor/ckeditor5-undo" "40.1.0" - "@ckeditor/ckeditor5-upload" "40.1.0" - "@ckeditor/ckeditor5-utils" "40.1.0" - "@ckeditor/ckeditor5-watchdog" "40.1.0" - "@ckeditor/ckeditor5-widget" "40.1.0" - ckeditor5@^35.4.0: version "35.4.0" resolved "https://registry.yarnpkg.com/ckeditor5/-/ckeditor5-35.4.0.tgz#0ce67af211551b96856b780e3729481cadbb34df" @@ -8717,13 +8504,6 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@2.0.1, color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -8731,6 +8511,13 @@ color-convert@^1.9.0, color-convert@^1.9.3: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" @@ -8741,13 +8528,6 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-parse@1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.2.tgz#78651f5d34df1a57f997643d86f7f87268ad4eb5" - integrity sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA== - dependencies: - color-name "^1.0.0" - color-string@^1.6.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" @@ -8897,14 +8677,6 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.43.0 < 2" -compression-webpack-plugin@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-10.0.0.tgz#3496af1b0dc792e13efc474498838dbff915c823" - integrity sha512-wLXLIBwpul/ALcm7Aj+69X0pYT3BYt6DdPn3qrgBIh9YejV9Bju9ShhlAsjujLyWMo6SAweFIWaUoFmXZNuNrg== - dependencies: - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" @@ -9504,11 +9276,6 @@ deepmerge@^4.0.0, deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" @@ -9571,7 +9338,7 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@2.0.0, depd@^2.0.0: +depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -9599,11 +9366,6 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -9621,10 +9383,10 @@ detect-browser@^5.3.0: resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== -detect-libc@^2.0.0, detect-libc@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" - integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== +detect-libc@^2.0.0, detect-libc@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== detect-newline@^3.0.0: version "3.1.0" @@ -9780,7 +9542,7 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -domhandler@5.0.3, domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: +domhandler@5.0.3, domhandler@^5.0.1, domhandler@^5.0.2: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== @@ -9926,7 +9688,7 @@ element-resize-detector@^1.2.2: dependencies: batch-processor "1.0.0" -elliptic@^6.5.3, elliptic@^6.5.4: +elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -10018,11 +9780,6 @@ entities@^4.2.0, entities@^4.3.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - errno@^0.1.3, errno@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -10571,13 +10328,6 @@ expect@^28.1.3: jest-message-util "^28.1.3" jest-util "^28.1.3" -express-static-gzip@^2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/express-static-gzip/-/express-static-gzip-2.1.7.tgz#5904824a07950ba741ec3a23a21839dd04c63506" - integrity sha512-QOCZUC+lhPPCjIJKpQGu1Oa61Axg9Mq09Qvit8Of7kzpMuwDeMSqjjQteQS3OVw/GkENBoSBheuQDWPlngImvw== - dependencies: - serve-static "^1.14.1" - express@^4.17.1, express@^4.17.3: version "4.17.3" resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" @@ -10660,11 +10410,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.1.0, fast-fifo@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" @@ -11772,17 +11517,6 @@ html-tags@^3.1.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== -html-to-text@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" - integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== - dependencies: - "@selderee/plugin-htmlparser2" "^0.11.0" - deepmerge "^4.3.1" - dom-serializer "^2.0.0" - htmlparser2 "^8.0.2" - selderee "^0.11.0" - html-tokenize@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/html-tokenize/-/html-tokenize-2.0.1.tgz#c3b2ea6e2837d4f8c06693393e9d2a12c960be5f" @@ -11839,16 +11573,6 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -htmlparser2@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - http-cache-semantics@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -11865,17 +11589,6 @@ http-errors@1.8.1, http-errors@^1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -13215,11 +12928,6 @@ js-cookie@^2.2.1: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== -js-sha256@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.11.0.tgz#256a921d9292f7fe98905face82e367abaca9576" - integrity sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q== - js-sha256@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" @@ -13549,11 +13257,6 @@ lazy-universal-dotenv@^3.0.1: dotenv "^8.0.0" dotenv-expand "^5.1.0" -leac@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" - integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -13699,7 +13402,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@4.17.21, lodash-es@^4.17.11, lodash-es@^4.17.15: +lodash-es@^4.17.11, lodash-es@^4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== @@ -13784,11 +13487,6 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - longest-streak@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.0.1.tgz#c97315b7afa0e7d9525db9a5a2953651432bdc5d" @@ -14967,10 +14665,10 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-addon-api@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" - integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== +node-addon-api@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" + integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== node-dir@^0.1.10: version "0.1.17" @@ -15314,13 +15012,6 @@ oidc-token-hash@^5.0.1: resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6" integrity sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ== -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -15590,7 +15281,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.6: +parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== @@ -15628,14 +15319,6 @@ parse5@6.0.1, parse5@^6.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parseley@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" - integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== - dependencies: - leac "^0.6.0" - peberminta "^0.9.0" - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -15732,11 +15415,6 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -peberminta@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" - integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== - picocolors@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" @@ -16112,9 +15790,9 @@ property-information@^6.0.0: integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w== protobufjs@^6.10.0: - version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + version "6.11.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" + integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -16130,24 +15808,6 @@ protobufjs@^6.10.0: "@types/node" ">=13.7.0" long "^4.0.0" -protobufjs@^7.0.0: - version "7.2.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" - integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -16277,21 +15937,11 @@ querystring@^0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -16520,11 +16170,6 @@ react-i18next@^11.15.3: html-escaper "^2.0.2" html-parse-stringify "^3.0.1" -react-icons@^4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" - integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== - react-infinite-scroll-component@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz#7e511e7aa0f728ac3e51f64a38a6079ac522407f" @@ -16837,15 +16482,6 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@~1.0.17, readable-stream@~1.0.27-1: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -17400,7 +17036,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -17483,16 +17119,6 @@ schema-utils@^3.0.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - screenfull@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" @@ -17515,13 +17141,6 @@ scrollparent@^2.0.1: resolved "https://registry.yarnpkg.com/scrollparent/-/scrollparent-2.0.1.tgz#715d5b9cc57760fb22bdccc3befb5bfe06b1a317" integrity sha1-cV1bnMV3YPsivczDvvtb/gaxoxc= -selderee@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" - integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== - dependencies: - parseley "^0.12.0" - semver-diff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" @@ -17530,9 +17149,9 @@ semver-diff@^3.1.1: semver "^6.3.0" "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@7.0.0: version "7.0.0" @@ -17547,14 +17166,21 @@ semver@7.3.8: lru-cache "^6.0.0" semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" @@ -17577,25 +17203,6 @@ send@0.17.2: range-parser "~1.2.1" statuses "~1.5.0" -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -17651,16 +17258,6 @@ serve-static@1.14.2: parseurl "~1.3.3" send "0.17.2" -serve-static@^1.14.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -17723,18 +17320,18 @@ shallowequal@^1.1.0: resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== -sharp@^0.32.6: - version "0.32.6" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" - integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== +sharp@^0.30.7: + version "0.30.7" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.30.7.tgz#7862bda98804fdd1f0d5659c85e3324b90d94c7c" + integrity sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig== dependencies: color "^4.2.3" - detect-libc "^2.0.2" - node-addon-api "^6.1.0" + detect-libc "^2.0.1" + node-addon-api "^5.0.0" prebuild-install "^7.1.1" - semver "^7.5.4" + semver "^7.3.7" simple-get "^4.0.1" - tar-fs "^3.0.4" + tar-fs "^2.1.1" tunnel-agent "^0.6.0" shebang-command@^1.2.0: @@ -18123,11 +17720,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -18175,14 +17767,6 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -streamx@^2.15.0: - version "2.15.5" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.5.tgz#87bcef4dc7f0b883f9359671203344a4e004c7f1" - integrity sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg== - dependencies: - fast-fifo "^1.1.0" - queue-tick "^1.0.1" - string-argv@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" @@ -18520,7 +18104,7 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar-fs@^2.0.0: +tar-fs@^2.0.0, tar-fs@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== @@ -18530,15 +18114,6 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" -tar-fs@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.4.tgz#a21dc60a2d5d9f55e0089ccd78124f1d3771dbbf" - integrity sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w== - dependencies: - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^3.1.5" - tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -18550,15 +18125,6 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar-stream@^3.1.5: - version "3.1.6" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" - integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - tar@^6.0.2: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -18852,14 +18418,13 @@ touch@^3.1.0: nopt "~1.0.10" tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" + universalify "^0.1.2" tr46@^1.0.1: version "1.0.1" @@ -19373,10 +18938,10 @@ universal-cookie@^4.0.0: "@types/cookie" "^0.3.3" cookie "^0.4.0" -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" @@ -19465,14 +19030,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -19603,11 +19160,6 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - uvu@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.3.tgz#3d83c5bc1230f153451877bfc7f4aea2392219ae" @@ -19659,11 +19211,6 @@ validator@^13.7.0: resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== -vanilla-colorful@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz#3fb1f4b9f15b797e20fd1ce8e0364f33b073f4a2" - integrity sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg== - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -20008,9 +19555,9 @@ widest-line@^3.1.0: string-width "^4.0.0" word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@^1.0.0: version "1.0.0" @@ -20390,19 +19937,6 @@ yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yarn-deduplicate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-5.0.0.tgz#8977b9a4b1a2fd905568c3a23507b1021fa381eb" @@ -20423,11 +19957,6 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zlib@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zlib/-/zlib-1.0.5.tgz#6e7c972fc371c645a6afb03ab14769def114fcc0" - integrity sha512-40fpE2II+Cd3k8HWTWONfeKE2jL+P42iWJ1zzps5W51qcTsOUKM5Q5m2PFb0CLxlmFAaUuUdJGc3OfZy947v0w== - zustand@^3.4.2, zustand@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d"