diff --git a/package.json b/package.json index 6c9d02828..3650bdf8a 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "@internxt/internxtui": "^0.0.6", "@internxt/inxt-js": "=1.2.21", "@internxt/lib": "^1.2.0", - "@internxt/sdk": "=1.5.24", + "@internxt/sdk": "=1.8.0", "@phosphor-icons/react": "^2.1.7", "@popperjs/core": "^2.11.6", "@reduxjs/toolkit": "^1.6.0", @@ -71,13 +71,13 @@ "react-router-dom": "^5.3.4", "react-scripts": "5.0.1", "react-tooltip": "^5.8.3", - "socket.io-client": "4.4.1", + "socket.io-client": "4.8.1", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "streamsaver": "^2.0.5", "url": "^0.11.3", "util": "^0.12.5", - "uuid": "^8.3.2", + "uuid": "=8.3.2", "web-vitals": "^0.2.4", "xlsx-preview": "^1.0.4" }, @@ -120,7 +120,6 @@ ] }, "devDependencies": { - "asmcrypto.js": "git+https://github.com/asmcrypto/asmcrypto.js.git", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@craco/craco": "^7.1.0", "@internxt/eslint-config-internxt": "^1.0.3", @@ -144,6 +143,7 @@ "@types/wicg-file-system-access": "^2020.9.4", "@vitejs/plugin-react": "^4.3.3", "@vitest/coverage-istanbul": "^2.1.6", + "asmcrypto.js": "git+https://github.com/asmcrypto/asmcrypto.js.git", "autoprefixer": "^10.4.16", "buffer": "^6.0.3", "cross-env": "^7.0.3", diff --git a/src/App.tsx b/src/App.tsx index 52daf6a27..fc839f619 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,8 +6,11 @@ import { Redirect, Route, Router, Switch } from 'react-router-dom'; import { Portal } from '@headlessui/react'; import { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings'; +import { ActionDialog } from 'app/contexts/dialog-manager/ActionDialogManager.context'; +import { useActionDialog } from 'app/contexts/dialog-manager/useActionDialog'; import { AppView } from 'app/core/types'; import { FolderPath } from 'app/drive/types'; +import { ModifyStorageModal } from 'app/newSettings/Sections/Workspace/Members/components/ModifyStorageModal'; import { useAppSelector } from 'app/store/hooks'; import workspacesSelectors from 'app/store/slices/workspaces/workspaces.selectors'; import i18next, { t } from 'i18next'; @@ -38,12 +41,8 @@ import { sessionActions } from './app/store/slices/session'; import { uiActions } from './app/store/slices/ui'; import { initializeUserThunk } from './app/store/slices/user'; import { workspaceThunks } from './app/store/slices/workspaces/workspacesStore'; -import SurveyDialog from './app/survey/components/SurveyDialog/SurveyDialog'; import { manager } from './app/utils/dnd-utils'; import useBeforeUnload from './hooks/useBeforeUnload'; -import { ModifyStorageModal } from 'app/newSettings/Sections/Workspace/Members/components/ModifyStorageModal'; -import { ActionDialog } from 'app/contexts/dialog-manager/ActionDialogManager.context'; -import { useActionDialog } from 'app/contexts/dialog-manager/useActionDialog'; pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`; interface AppProps { @@ -51,7 +50,6 @@ interface AppProps { isInitialized: boolean; isFileViewerOpen: boolean; isNewsletterDialogOpen: boolean; - isSurveyDialogOpen: boolean; isPreferencesDialogOpen: boolean; fileViewerItem: PreviewFileItem | null; user: UserSettings | undefined; @@ -65,7 +63,6 @@ const App = (props: AppProps): JSX.Element => { isAuthenticated, isFileViewerOpen, isNewsletterDialogOpen, - isSurveyDialogOpen, isPreferencesDialogOpen, fileViewerItem, dispatch, @@ -220,7 +217,6 @@ const App = (props: AppProps): JSX.Element => { {isOpen && } - {isSurveyDialogOpen && } {isFileViewerOpen && fileViewerItem && ( )} @@ -237,7 +233,6 @@ export default connect((state: RootState) => ({ isInitialized: state.user.isInitialized, isFileViewerOpen: state.ui.isFileViewerOpen, isNewsletterDialogOpen: state.ui.isNewsletterDialogOpen, - isSurveyDialogOpen: state.ui.isSurveyDialogOpen, isPreferencesDialogOpen: state.ui.isPreferencesDialogOpen, fileViewerItem: state.ui.fileViewerItem, user: state.user.user, diff --git a/src/app/analytics/impact.service.ts b/src/app/analytics/impact.service.ts index bb614eef4..49e01369c 100644 --- a/src/app/analytics/impact.service.ts +++ b/src/app/analytics/impact.service.ts @@ -1,12 +1,10 @@ import axios from 'axios'; -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidV4 } from 'uuid'; import dayjs from 'dayjs'; import { getCookie } from './utils'; import errorService from 'app/core/services/error.service'; -import httpService from 'app/core/services/http.service'; import localStorageService from 'app/core/services/local-storage.service'; import { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings'; -import { AnalyticsTrackNames } from './types'; const IMPACT_API = process.env.REACT_APP_IMPACT_API as string; @@ -23,7 +21,7 @@ export async function trackSignUp(uuid, email) { await axios.post(IMPACT_API, { anonymousId: anonymousID, timestamp: dayjs().format('YYYY-MM-DDTHH:mm:ss.sssZ'), - messageId: uuidv4(), + messageId: uuidV4(), userId: uuid, type: 'track', event: 'User Signup', @@ -37,74 +35,24 @@ export async function trackSignUp(uuid, email) { export async function trackPaymentConversion() { try { - const checkoutSessionId = localStorage.getItem('sessionId'); + const { uuid } = localStorageService.getUser() as UserSettings; - const { username, uuid } = localStorageService.getUser() as UserSettings; - let metadata, amount_total, currency, customer, subscription, paymentIntent; - try { - const { - metadata: metadataRetrived, - amount_total: totalAmountRetrieved, - currency: currencyRetrieved, - customer: customerRetrieved, - subscription: subscriptionId, - payment_intent: paymentIntentRetrieved, - } = (await httpService.get(`${process.env.REACT_APP_API_URL}/stripe/session`, { - params: { - sessionId: checkoutSessionId, - }, - headers: httpService.getHeaders(true, false), - })) as any; - metadata = metadataRetrived; - amount_total = totalAmountRetrieved; - currency = currencyRetrieved; - customer = customerRetrieved; - paymentIntent = paymentIntentRetrieved; - subscription = subscriptionId; - } catch (error) { - // - } - - subscription = subscription ?? localStorageService.get('subscriptionId'); - paymentIntent = paymentIntent ?? localStorageService.get('paymentIntentId'); - // TO MANTAIN OLD BEHAVIOR - const amount = amount_total ? amount_total * 0.01 : parseFloat(localStorageService.get('amountPaid') ?? '0'); - amount_total = amount_total ?? parseFloat(localStorageService.get('amountPaid') ?? '0'); + const subscription = localStorageService.get('subscriptionId'); + const paymentIntent = localStorageService.get('paymentIntentId'); + const productName = localStorageService.get('productName'); + const priceId = localStorageService.get('priceId'); + const currency = localStorageService.get('currency'); + const amount = parseFloat(localStorageService.get('amountPaid') ?? '0'); try { - window.rudderanalytics.identify(uuid, { - email: username, - plan: metadata.priceId, - customer_id: customer, - storage_limit: metadata.maxSpaceBytes, - plan_name: metadata.name, - subscription_id: subscription, - payment_intent: paymentIntent, - }); - window.rudderanalytics.track(AnalyticsTrackNames.PaymentConversionEvent, { - price_id: metadata.priceId, - product: metadata.product, - email: username, - customer_id: customer, - currency: currency.toUpperCase(), - value: amount, - revenue: amount, - quantity: 1, - type: metadata.type, - plan_name: metadata.name, - impact_value: amount_total === 0 ? 0.01 : amount, - subscription_id: subscription, - payment_intent: paymentIntent, - }); - window.gtag('event', 'purchase', { - transaction_id: uuidv4(), + transaction_id: uuidV4(), value: amount, - currency: currency.toUpperCase(), + currency: currency?.toUpperCase() ?? '€', items: [ { - item_id: metadata.priceId, - item_name: metadata.name, + item_id: priceId, + item_name: productName, quantity: 1, price: amount, }, @@ -120,7 +68,7 @@ export async function trackPaymentConversion() { anonymousId: anonymousID, timestamp: dayjs().format('YYYY-MM-DDTHH:mm:ss.sssZ'), properties: { - impact_value: amount_total === 0 ? 0.01 : amount, + impact_value: amount === 0 ? 0.01 : amount, subscription_id: subscription, payment_intent: paymentIntent, }, @@ -134,9 +82,6 @@ export async function trackPaymentConversion() { }); } } catch (err) { - const castedError = errorService.castError(err); - window.rudderanalytics.track('Error Signup After Payment Conversion', { - message: castedError.message || '', - }); + // } } diff --git a/src/app/core/config/views.ts b/src/app/core/config/views.ts index e35e5e4f5..1dd0ddf4b 100644 --- a/src/app/core/config/views.ts +++ b/src/app/core/config/views.ts @@ -39,7 +39,7 @@ const views: Array<{ componentProps?: Record; }> = [ { id: AppView.Signup, component: SignUpView, componentProps: { isNewUser: true } }, - { id: AppView.AppSumo, component: SignUpView, componentProps: { isNewUser: false } }, + { id: AppView.AppSumo, component: SignInView }, { id: AppView.BlockedAccount, component: BlockedAccountView }, { id: AppView.Login, component: SignInView }, { id: AppView.SignupBlog, component: SignupBlog }, diff --git a/src/app/core/services/socket.service.ts b/src/app/core/services/socket.service.ts index 4d9e23864..b3afa8056 100644 --- a/src/app/core/services/socket.service.ts +++ b/src/app/core/services/socket.service.ts @@ -49,7 +49,7 @@ export default class RealtimeService { }); } - getClientId(): string { + getClientId(): string | undefined { if (!this.socket) { throw new Error('Realtime service is not connected'); } diff --git a/src/app/drive/components/DriveExplorer/DriveExplorerList/DriveExplorerList.tsx b/src/app/drive/components/DriveExplorer/DriveExplorerList/DriveExplorerList.tsx index 2990793e8..64be3ccbf 100644 --- a/src/app/drive/components/DriveExplorer/DriveExplorerList/DriveExplorerList.tsx +++ b/src/app/drive/components/DriveExplorer/DriveExplorerList/DriveExplorerList.tsx @@ -7,6 +7,7 @@ import { connect, useSelector } from 'react-redux'; import { ListShareLinksItem, Role } from '@internxt/sdk/dist/drive/share/types'; import navigationService from 'app/core/services/navigation.service'; import { useTranslationContext } from 'app/i18n/provider/TranslationProvider'; +import { skinSkeleton } from 'app/shared/Skeleton'; import moveItemsToTrash from '../../../../../use_cases/trash/move-items-to-trash'; import { OrderDirection, OrderSettings } from '../../../../core/types'; import shareService from '../../../../share/services/share.service'; @@ -19,6 +20,7 @@ import { uiActions } from '../../../../store/slices/ui'; import workspacesSelectors from '../../../../store/slices/workspaces/workspaces.selectors'; import { DriveItemData, DriveItemDetails } from '../../../types'; import EditItemNameDialog from '../../EditItemNameDialog/EditItemNameDialog'; +import ShareWithTeamDialog from '../../ShareWithTeamDialog/ShareWithTeamDialog'; import DriveExplorerListItem from '../DriveExplorerItem/DriveExplorerListItem/DriveExplorerListItem'; import { contextMenuDriveFolderNotSharedLink, @@ -32,8 +34,6 @@ import { contextMenuWorkspaceFile, contextMenuWorkspaceFolder, } from './DriveItemContextMenu'; -import { skinSkeleton } from 'app/shared/Skeleton'; -import ShareWithTeamDialog from '../../ShareWithTeamDialog/ShareWithTeamDialog'; interface DriveExplorerListProps { folderId: string; @@ -526,7 +526,6 @@ export default connect((state: RootState) => ({ roles: state.shared.roles, disableKeyboardShortcuts: state.ui.isShareDialogOpen || - state.ui.isSurveyDialogOpen || state.ui.isEditFolderNameDialog || state.ui.isFileViewerOpen || state.ui.isMoveItemsDialogOpen || diff --git a/src/app/i18n/locales/de.json b/src/app/i18n/locales/de.json index a0394077d..5ad719111 100644 --- a/src/app/i18n/locales/de.json +++ b/src/app/i18n/locales/de.json @@ -1243,6 +1243,7 @@ "linkUpdated": "Link aktualisiert", "itemsMovedToTrash": "{{item}} in den Papierkorb verschoben", "storageModified": "Speicher erfolgreich geändert", + "membersUpdatedSuccessfully": "Mitglieder erfolgreich aktualisiert", "errorModifyingStorage": "Der neue Speicherplatz ist für dieses Mitglied ungültig.", "generalErrorWhileModifyingStorage": "Beim Ändern des Speicherplatzes ist ein Fehler aufgetreten.", "restoreItems": "{{itemsToRecover}} verschoben nach {{destination}}", @@ -1264,7 +1265,10 @@ "errorWhileLoadingWorkspace": "Fehler beim Laden des Arbeitsbereichs {{error}}", "errorFetchingWorkspaceCredentials": "Fehler beim Abrufen der Anmeldeinformationen für den Arbeitsbereich {{error}}", "invalidWorkspaceInvitationError": "Arbeitsbereich voll. Kontaktieren Sie den Eigentümer.", - "errorAcceptingWorkspaceInvitation": "Beim Annehmen der Einladung ist ein Fehler aufgetreten" + "errorAcceptingWorkspaceInvitation": "Beim Annehmen der Einladung ist ein Fehler aufgetreten", + "errorWhileUpdatingWorkspaceMembers": "Beim Aktualisieren der Mitglieder ist ein Fehler aufgetreten", + "errorWhileFetchingCurrentWorkspaceMembers": "Beim Abrufen der Mitglieder des Arbeitsbereichs ist ein Fehler aufgetreten", + "newMembersCannotBeLessThanTheExistentOnesError": "Die ausgewählten Mitglieder dürfen nicht weniger sein als die aktuellen Mitglieder des Arbeitsbereichs" }, "actions": { "undo": "Rückgängig machen", @@ -1296,6 +1300,7 @@ "moreInfo": "Mehr Info", "dismiss": "Zurückweisen", "save": "Sichern", + "saveChanges": "Änderungen speichern", "back": "Zurück", "edit": "Bearbeite", "submit": "Einreichen", @@ -1313,7 +1318,10 @@ "report": "Missbrauch melden", "yes": "Ja", "no": "Nein", - "more": "Mehr" + "more": "Mehr", + "continue": "Fortsetzen", + "keepCurrent": "Aktuell behalten", + "logOut": "Abmelden" }, "drive": { "usage": "Verwendung", @@ -1409,8 +1417,7 @@ "subscribe-to-newsletter": "Abonniere unseren Newsletter", "install-desktop-app": "Installiere die Desktop-App und lade eine Datei hoch", "invite-friends": "Lade {{completedSteps}}/{{steps}} Freunde ein", - "invite-2-friends": "Lade {{completedSteps}}/{{steps}} Freunde ein", - "complete-survey": "Komplettiere Umfrage" + "invite-2-friends": "Lade {{completedSteps}}/{{steps}} Freunde ein" }, "rewards": { "title": "Erhalte {{creditSum}} kostenlos", @@ -1646,6 +1653,32 @@ "nextBillingDate": "Nächstes Abrechnungsdatum", "planLimit": "Abgerechnet für {{planLimit}} plan", "subscription": "Abonnement", + "membersLabel": "Mitglieder", + "perUser": "pro Benutzer", + "members": { + "title": "Mitglieder", + "editMembers": "Mitglieder bearbeiten", + "numberOfMembers": "Anzahl der Mitglieder", + "expandNumber": "Die Anzahl der Mitglieder erweitern.", + "confirmUpdateModal": { + "title": "Plan ändern", + "confirmToProceed": { + "text1": "Sie sind dabei, Ihren Internxt-Mitgliederplan von ", + "to": "auf ", + "text2": " zu ändern. Bitte bestätigen Sie Ihre Auswahl, um fortzufahren." + }, + "current": "Aktuell", + "new": "Neu", + "decreaseStorage": { + "text": "Dadurch wird auch Ihr gesamter Geschäftsspeicher von ", + "to": " auf " + }, + "increaseStorage": { + "text": "Dadurch wird auch Ihr gesamter Geschäftsspeicher von ", + "to": " auf " + } + } + }, "lifetimeSubscription": { "planType": "Lebenslang", "text": "Keine kommenden Rechnungen" diff --git a/src/app/i18n/locales/en.json b/src/app/i18n/locales/en.json index 0f176faf3..c897c8366 100644 --- a/src/app/i18n/locales/en.json +++ b/src/app/i18n/locales/en.json @@ -1297,6 +1297,7 @@ "restoreItems": "{{itemsToRecover}} restored successfully", "moveItems": "{{itemsToMove}} moved successfully", "storageModified": "Storage modified successfully", + "membersUpdatedSuccessfully": "Members updated successfully", "errorModifyingStorage": "The new storage is not valid for this member.", "generalErrorWhileModifyingStorage": "Something went wrong while modifying storage", "itemDeleted": "{{item}} deleted", @@ -1320,7 +1321,10 @@ "errorWhileLoadingWorkspace": "Error while loading the workspace {{error}}", "errorFetchingWorkspaceCredentials": "Error while fetching workspace credentials {{error}}", "invalidWorkspaceInvitationError": "Workspace full. Contact the owner.", - "errorAcceptingWorkspaceInvitation": "Something went wrong while accepting the invitation" + "errorAcceptingWorkspaceInvitation": "Something went wrong while accepting the invitation", + "errorWhileUpdatingWorkspaceMembers": "Something went wrong while updating the members", + "errorWhileFetchingCurrentWorkspaceMembers": "Something went wrong while fetching workspace members", + "newMembersCannotBeLessThanTheExistentOnesError": "Selected members cannot be fewer than current workspace members" }, "actions": { "undo": "Undo", @@ -1351,6 +1355,7 @@ "moreInfo": "More info", "dismiss": "Dismiss", "save": "Save", + "saveChanges": "Save changes", "saving": "Saving", "share": "Share", "back": "Back", @@ -1370,7 +1375,10 @@ "report": "Report abuse", "yes": "Yes", "no": "No", - "more": "More" + "more": "More", + "continue": "Continue", + "keepCurrent": "Keep current", + "logOut": "Log out" }, "drive": { "usage": "Usage", @@ -1467,8 +1475,7 @@ "subscribe-to-newsletter": "Subscribe to newsletter", "install-desktop-app": "Install desktop app and upload a file", "invite-friends": "Invite {{completedSteps}}/{{steps}} friends", - "invite-2-friends": "Invite {{completedSteps}}/{{steps}} friends", - "complete-survey": "Complete survey" + "invite-2-friends": "Invite {{completedSteps}}/{{steps}} friends" }, "rewards": { "title": "Get {{creditSum}} for free", @@ -1704,7 +1711,9 @@ "title": "Billing", "nextBillingDate": "Next billing date", "planLimit": "Billed for {{planLimit}} plan", + "membersLabel": "members", "subscription": "Subscription", + "perUser": "per user", "lifetimeSubscription": { "planType": "Lifetime", "text": "No upcoming billings" @@ -1714,6 +1723,30 @@ "action": "Upgrade", "actionDescription": "Increase your storage space and get more features" }, + "members": { + "title": "Members", + "editMembers": "Edit members", + "numberOfMembers": "Number of members", + "expandNumber": "Expand the number of members.", + "confirmUpdateModal": { + "title": "Change plan", + "confirmToProceed": { + "text1": "You are about to change your Internxt member plan from ", + "to": "to ", + "text2": ". Confirm your choice to proceed, please." + }, + "current": "Current", + "new": "New", + "decreaseStorage": { + "text": "This will also decrease your total business storage from ", + "to": " to " + }, + "increaseStorage": { + "text": "This will also increase your total business storage from ", + "to": " to " + } + } + }, "paymentMethod": { "title": "Payment Method", "editButton": "Edit payment method", diff --git a/src/app/i18n/locales/es.json b/src/app/i18n/locales/es.json index 7f0044ae6..290ca30f2 100644 --- a/src/app/i18n/locales/es.json +++ b/src/app/i18n/locales/es.json @@ -1260,6 +1260,7 @@ "itemsMovedToTrash": "{{item}} movid{{s}} a la papelera", "restoreItems": "{{itemsToRecover}} restaurad{{s}} con éxito", "storageModified": "Almacenamiento modificado con éxito", + "membersUpdatedSuccessfully": "Miembros actualizados con éxito", "errorModifyingStorage": "El nuevo almacenamiento no es válido para este miembro.", "generalErrorWhileModifyingStorage": "Algo salió mal al modificar el almacenamiento.", "moveItems": "{{itemsToMove}} movid{{s}} con éxito", @@ -1284,7 +1285,10 @@ "errorWhileLoadingWorkspace": "Error al cargar el espacio de trabajo {{error}}", "errorFetchingWorkspaceCredentials": "Error al obtener las credenciales del espacio de trabajo {{error}}", "invalidWorkspaceInvitationError": "Espacio de trabajo lleno. Contacta al propietario.", - "errorAcceptingWorkspaceInvitation": "Ocurrió un error al aceptar la invitación" + "errorAcceptingWorkspaceInvitation": "Ocurrió un error al aceptar la invitación", + "errorWhileUpdatingWorkspaceMembers": "Ocurrió un error al actualizar los miembros", + "errorWhileFetchingCurrentWorkspaceMembers": "Ocurrió un error al obtener los miembros del espacio de trabajo", + "newMembersCannotBeLessThanTheExistentOnesError": "Los miembros seleccionados no pueden ser menos que los miembros actuales del espacio de trabajo" }, "success": { "passwordChanged": "Contraseña actualizada correctamente", @@ -1330,6 +1334,7 @@ "moreInfo": "Más info", "dismiss": "Dismiss", "save": "Guardar", + "saveChanges": "Guardar cambios", "saving": "Guardando", "share": "Compartir", "back": "Atrás", @@ -1349,7 +1354,10 @@ "report": "Reportar abuso", "yes": "Si", "no": "No", - "more": "Más" + "more": "Más", + "continue": "Continuar", + "keepCurrent": "Mantener actual", + "logOut": "Cerrar sesión" }, "drive": { "usage": "Uso", @@ -1445,8 +1453,7 @@ "subscribe-to-newsletter": "Subscríbete al newsletter", "install-desktop-app": "Instala la app de escritorio y sube un archivo", "invite-friends": "Invita {{completedSteps}}/{{steps}} amigos", - "invite-2-friends": "Invita {{completedSteps}}/{{steps}} amigos", - "complete-survey": "Completar encuesta" + "invite-2-friends": "Invita {{completedSteps}}/{{steps}} amigos" }, "rewards": { "title": "¡Obtén {{creditSum}} gratis!", @@ -1682,6 +1689,32 @@ "nextBillingDate": "Próxima fecha de facturación", "planLimit": "Facturado por plan de {{planLimit}}", "subscription": "Suscripción", + "membersLabel": "miembros", + "perUser": "por usuario", + "members": { + "title": "Miembros", + "editMembers": "Editar miembros", + "numberOfMembers": "Número de miembros", + "expandNumber": "Ampliar el número de miembros.", + "confirmUpdateModal": { + "title": "Cambiar plan", + "confirmToProceed": { + "text1": "Está a punto de cambiar su plan de miembros de Internxt de ", + "to": "a ", + "text2": ". Confirme su elección para continuar, por favor." + }, + "current": "Actual", + "new": "Nuevo", + "decreaseStorage": { + "text": "Esto también reducirá su almacenamiento total para negocios de ", + "to": " a " + }, + "increaseStorage": { + "text": "Esto también aumentará su almacenamiento total para negocios de ", + "to": " a " + } + } + }, "lifetimeSubscription": { "planType": "De por vida", "text": "Sin facturas pendientes" diff --git a/src/app/i18n/locales/fr.json b/src/app/i18n/locales/fr.json index 151ba5452..532ab68db 100644 --- a/src/app/i18n/locales/fr.json +++ b/src/app/i18n/locales/fr.json @@ -1228,6 +1228,7 @@ "itemsMovedToTrash": "{{item}} déplacé vers la corbeille", "restoreItems": "{{itemsToRecover}} restauré avec succès", "storageModified": "Stockage modifié avec succès", + "membersUpdatedSuccessfully": "Membres mis à jour avec succès", "errorModifyingStorage": "Le nouvel espace de stockage n'est pas valide pour ce membre.", "generalErrorWhileModifyingStorage": "Une erreur s'est produite lors de la modification du stockage.", "itemDeleted": "{{itemsToDelete}} supprimé", @@ -1248,7 +1249,10 @@ "errorWhileLoadingWorkspace": "Erreur lors du chargement de l'espace de travail {{error}}", "errorFetchingWorkspaceCredentials": "Erreur lors de la récupération des identifiants de l'espace de travail {{error}}", "invalidWorkspaceInvitationError": "Espace de travail plein. Contactez le propriétaire.", - "errorAcceptingWorkspaceInvitation": "Une erreur s'est produite lors de l'acceptation de l'invitation" + "errorAcceptingWorkspaceInvitation": "Une erreur s'est produite lors de l'acceptation de l'invitation", + "errorWhileUpdatingWorkspaceMembers": "Une erreur s'est produite lors de la mise à jour des membres", + "errorWhileFetchingCurrentWorkspaceMembers": "Une erreur s'est produite lors de la récupération des membres de l'espace de travail", + "newMembersCannotBeLessThanTheExistentOnesError": "Les membres sélectionnés ne peuvent pas être inférieurs au nombre de membres actuels de l'espace de travail" }, "actions": { "undo": "Annuler", @@ -1280,6 +1284,7 @@ "moreInfo": "Plus d'informations", "dismiss": "Rejeter", "save": "Enregistrer", + "saveChanges": "Enregistrer les modifications", "saving": "Sauvagarde en cours", "back": "Retourner", "edit": "Éditer", @@ -1298,7 +1303,10 @@ "report": "Signaler un abus", "yes": "Oui", "no": "Non", - "more": "Plus" + "more": "Plus", + "continue": "Continuer", + "keepCurrent": "Garder actuel", + "logOut": "Se déconnecter" }, "drive": { "usage": "Usage", @@ -1394,8 +1402,7 @@ "subscribe-to-newsletter": "S'abonner à la lettre d'information", "install-desktop-app": "Installer l'app de bureau et télécharger un fichier", "invite-friends": "Inviter {{completedSteps}}/{{steps}} amis", - "invite-2-friends": "Inviter {{completedSteps}}/{{steps}} amis", - "complete-survey": "Répondre à une enquête" + "invite-2-friends": "Inviter {{completedSteps}}/{{steps}} amis" }, "rewards": { "title": "Obtenez {{creditSum}} gratuitement !", @@ -1631,6 +1638,32 @@ "nextBillingDate": "Prochaine date de facturation", "planLimit": "Facturé pour un forfait de {{planLimit}}", "subscription": "Abonnement", + "membersLabel": "membres", + "perUser": "par utilisateur", + "members": { + "title": "Membres", + "editMembers": "Modifier les membres", + "numberOfMembers": "Nombre de membres", + "expandNumber": "Augmenter le nombre de membres.", + "confirmUpdateModal": { + "title": "Changer de plan", + "confirmToProceed": { + "text1": "Vous êtes sur le point de changer votre plan de membres Internxt de ", + "to": "à ", + "text2": ". Veuillez confirmer votre choix pour continuer." + }, + "current": "Actuel", + "new": "Nouveau", + "decreaseStorage": { + "text": "Cela réduira également votre stockage total pour entreprise de ", + "to": " à " + }, + "increaseStorage": { + "text": "Cela augmentera également votre stockage total pour entreprise de ", + "to": " à " + } + } + }, "lifetimeSubscription": { "planType": "Durée de vie", "text": "Pas de facturation à venir" diff --git a/src/app/i18n/locales/it.json b/src/app/i18n/locales/it.json index a9c39ce46..8bcdfe51c 100644 --- a/src/app/i18n/locales/it.json +++ b/src/app/i18n/locales/it.json @@ -1288,6 +1288,7 @@ "itemsMovedToTrash": "{{item}} spostati nel cestino", "restoreItems": "{{itemsToRecover}} ripristinato correttamente", "storageModified": "Archiviazione modificata con successo", + "membersUpdatedSuccessfully": "Membri aggiornati con successo", "errorModifyingStorage": "Il nuovo spazio di archiviazione non è valido per questo membro.", "generalErrorWhileModifyingStorage": "Si è verificato un errore durante la modifica dello spazio di archiviazione.", "itemDeleted": "{{item}} eliminate", @@ -1308,7 +1309,10 @@ "errorWhileLoadingWorkspace": "Errore durante il caricamento dell'area di lavoro {{error}}", "errorFetchingWorkspaceCredentials": "Errore durante il recupero delle credenziali dell'area di lavoro {{error}}", "invalidWorkspaceInvitationError": "Spazio di lavoro pieno. Contatta il proprietario.", - "errorAcceptingWorkspaceInvitation": "Si è verificato un errore durante l'accettazione dell'invito" + "errorAcceptingWorkspaceInvitation": "Si è verificato un errore durante l'accettazione dell'invito", + "errorWhileUpdatingWorkspaceMembers": "Si è verificato un errore durante l'aggiornamento dei membri", + "errorWhileFetchingCurrentWorkspaceMembers": "Si è verificato un errore durante il recupero dei membri dello spazio di lavoro", + "newMembersCannotBeLessThanTheExistentOnesError": "I membri selezionati non possono essere meno dei membri attuali dello spazio di lavoro" }, "actions": { "undo": "Annulla", @@ -1340,6 +1344,7 @@ "moreInfo": "Maggiori informazioni", "dismiss": "Licenziare", "save": "Salva", + "saveChanges": "Salva modifiche", "saving": "Salvare", "back": "Indietro", "edit": "Modifica", @@ -1358,7 +1363,10 @@ "report": "Segnala abuso", "yes": "Sì", "no": "No", - "more": "Di più" + "more": "Di più", + "continue": "Continua", + "keepCurrent": "Mantieni attuale", + "logOut": "Disconnettersi" }, "drive": { "usage": "Utilizzo", @@ -1454,8 +1462,7 @@ "subscribe-to-newsletter": "Iscriviti alla newsletter", "install-desktop-app": "Installa l’app desktop e carica un file", "invite-friends": "Invita {{completedSteps}}/{{steps}} amici", - "invite-2-friends": "Invita {{completedSteps}}/{{steps}} amici", - "complete-survey": "Completa il sondaggio" + "invite-2-friends": "Invita {{completedSteps}}/{{steps}} amici" }, "rewards": { "title": "Ottieni {{creditSum}} gratis", @@ -1691,6 +1698,32 @@ "nextBillingDate": "Prossima data di fatturazione", "planLimit": "Fatturato per un piano da {{planLimit}}", "subscription": "Abbonamento", + "membersLabel": "membri", + "perUser": "per utente", + "members": { + "title": "Membri", + "editMembers": "Modifica membri", + "numberOfMembers": "Numero di membri", + "expandNumber": "Espandi il numero di membri.", + "confirmUpdateModal": { + "title": "Cambia piano", + "confirmToProceed": { + "text1": "Stai per cambiare il tuo piano membri Internxt da ", + "to": "a ", + "text2": ". Conferma la tua scelta per procedere, per favore." + }, + "current": "Attuale", + "new": "Nuovo", + "decreaseStorage": { + "text": "Questo ridurrà anche lo spazio di archiviazione totale aziendale da ", + "to": " a " + }, + "increaseStorage": { + "text": "Questo aumenterà anche lo spazio di archiviazione totale aziendale da ", + "to": " a " + } + } + }, "lifetimeSubscription": { "planType": "Durata della vita", "text": "Nessuna fatturazione imminente" diff --git a/src/app/i18n/locales/ru.json b/src/app/i18n/locales/ru.json index 36b37c72f..f3fd2ae96 100644 --- a/src/app/i18n/locales/ru.json +++ b/src/app/i18n/locales/ru.json @@ -1267,6 +1267,7 @@ "linkUpdated": "Ссылка обновлена", "itemsMovedToTrash": "{{item}} перемещен в корзину", "storageModified": "Хранилище успешно изменено", + "membersUpdatedSuccessfully": "Участники успешно обновлены", "errorModifyingStorage": "Новый объём хранения недоступен для этого участника.", "generalErrorWhileModifyingStorage": "Произошла ошибка при изменении объёма хранения.", "restoreItems": "{{itemsToRecover}} успешно восстановлено", @@ -1288,7 +1289,10 @@ "errorWhileLoadingWorkspace": "Ошибка при загрузке рабочего пространства {{error}}", "errorFetchingWorkspaceCredentials": "Ошибка при получении учетных данных рабочего пространства {{error}}", "invalidWorkspaceInvitationError": "Рабочее пространство заполнено. Свяжитесь с владельцем.", - "errorAcceptingWorkspaceInvitation": "Произошла ошибка при принятии приглашения" + "errorAcceptingWorkspaceInvitation": "Произошла ошибка при принятии приглашения", + "errorWhileUpdatingWorkspaceMembers": "Произошла ошибка при обновлении участников", + "errorWhileFetchingCurrentWorkspaceMembers": "Произошла ошибка при получении участников рабочего пространства", + "newMembersCannotBeLessThanTheExistentOnesError": "Выбранных участников не может быть меньше, чем текущих участников рабочего пространства" }, "actions": { "undo": "Отменить", @@ -1320,6 +1324,7 @@ "moreInfo": "Больше информации", "dismiss": "Пропустить", "save": "Сохранить", + "saveChanges": "Сохранить изменения", "saving": "Экономия", "back": "Назад", "edit": "Редактировать", @@ -1338,7 +1343,10 @@ "report": "Сообщить о нарушении", "yes": "Да", "no": "Нет", - "more": "Больше" + "more": "Больше", + "continue": "Продолжить", + "keepCurrent": "Сохранить текущее", + "logOut": "Выйти" }, "drive": { "usage": "Использование", @@ -1434,8 +1442,7 @@ "subscribe-to-newsletter": "Подписаться на рассылку", "install-desktop-app": "Установить приложение для рабочего стола и загрузить файл", "invite-friends": "Пригласить {{completedSteps}}/{{steps}} друзей", - "invite-2-friends": "Пригласить {{completedSteps}}/{{steps}} друзей", - "complete-survey": "Полный опрос" + "invite-2-friends": "Пригласить {{completedSteps}}/{{steps}} друзей" }, "rewards": { "title": "Получить {{creditSum}} бесплатно", @@ -1671,6 +1678,32 @@ "nextBillingDate": "Следующая дата выставления счета", "planLimit": "Выставлен счет за план {{planLimit}}", "subscription": "Подписка", + "membersLabel": "участники", + "perUser": "на пользователя", + "members": { + "title": "Участники", + "editMembers": "Редактировать участников", + "numberOfMembers": "Количество участников", + "expandNumber": "Увеличить количество участников.", + "confirmUpdateModal": { + "title": "Изменить план", + "confirmToProceed": { + "text1": "Вы собираетесь изменить ваш план участников Internxt с ", + "to": "на ", + "text2": ". Подтвердите свой выбор, чтобы продолжить." + }, + "current": "Текущий", + "new": "Новый", + "decreaseStorage": { + "text": "Это также уменьшит общий объем хранилища для бизнеса с ", + "to": " до " + }, + "increaseStorage": { + "text": "Это также увеличит общий объем хранилища для бизнеса с ", + "to": " до " + } + } + }, "lifetimeSubscription": { "planType": "Пожизненная", "text": "Никаких предстоящих счетов" diff --git a/src/app/i18n/locales/tw.json b/src/app/i18n/locales/tw.json index 99f6e252f..29bfb4358 100644 --- a/src/app/i18n/locales/tw.json +++ b/src/app/i18n/locales/tw.json @@ -1258,6 +1258,7 @@ "itemsMovedToTrash": "{{item}} 已移到垃圾桶", "restoreItems": "{{itemsToRecover}} 成功還原", "storageModified": "儲存空間修改成功", + "membersUpdatedSuccessfully": "成員更新成功", "errorModifyingStorage": "新存儲空間對此成員無效。", "generalErrorWhileModifyingStorage": "修改存儲時出錯。", "moveItems": "{{itemsToMove}} 成功移動", @@ -1282,7 +1283,10 @@ "errorWhileLoadingWorkspace": "加載工作區時出錯 {{error}}", "errorFetchingWorkspaceCredentials": "獲取工作區憑證時出錯 {{error}}", "invalidWorkspaceInvitationError": "工作區已滿。請聯絡擁有者。", - "errorAcceptingWorkspaceInvitation": "接受邀請時出錯" + "errorAcceptingWorkspaceInvitation": "接受邀請時出錯", + "errorWhileUpdatingWorkspaceMembers": "更新成員時出了點問題", + "errorWhileFetchingCurrentWorkspaceMembers": "獲取工作區成員時出了點問題", + "newMembersCannotBeLessThanTheExistentOnesError": "選擇的成員數量不能少於當前工作區的成員數量。" }, "actions": { "undo": "撤銷", @@ -1313,6 +1317,7 @@ "moreInfo": "更多信息", "dismiss": "忽略", "save": "保存", + "saveChanges": "儲存更改", "saving": "正在保存", "share": "分享", "back": "返回", @@ -1332,7 +1337,10 @@ "report": "檢舉濫用", "yes": "是", "no": "否", - "more": "更多" + "more": "更多", + "continue": "繼續", + "keepCurrent": "保持目前", + "logOut": "登出" }, "drive": { "usage": "使用量", @@ -1429,8 +1437,7 @@ "subscribe-to-newsletter": "訂閱通訊", "install-desktop-app": "安裝桌面應用程序並上傳文件", "invite-friends": "邀請 {{completedSteps}}/{{steps}} 位朋友", - "invite-2-friends": "邀請 {{completedSteps}}/{{steps}} 位朋友", - "complete-survey": "完成調查" + "invite-2-friends": "邀請 {{completedSteps}}/{{steps}} 位朋友" }, "rewards": { "title": "免費獲得 {{creditSum}}", @@ -1666,6 +1673,32 @@ "nextBillingDate": "下次計費日期", "planLimit": "計費計劃:{{planLimit}}", "subscription": "訂閱", + "membersLabel": "成員", + "perUser": "每位使用者", + "members": { + "title": "成員", + "editMembers": "編輯成員", + "numberOfMembers": "成員數量", + "expandNumber": "擴大成員數量。", + "confirmUpdateModal": { + "title": "更改方案", + "confirmToProceed": { + "text1": "您即將把 Internxt 成員方案從 ", + "to": "更改為 ", + "text2": "。請確認您的選擇以繼續。" + }, + "current": "目前", + "new": "新", + "decreaseStorage": { + "text": "這也會減少您的總商業儲存空間,從 ", + "to": " 到 " + }, + "increaseStorage": { + "text": "這也會增加您的總商業儲存空間,從 ", + "to": " 到 " + } + } + }, "lifetimeSubscription": { "planType": "終身", "text": "沒有即將到來的賬單" diff --git a/src/app/i18n/locales/zh.json b/src/app/i18n/locales/zh.json index d91c68941..32150f96a 100644 --- a/src/app/i18n/locales/zh.json +++ b/src/app/i18n/locales/zh.json @@ -1294,6 +1294,7 @@ "linkUpdated": "链接已更新", "itemsMovedToTrash": "{{item}} 已被移至回收站", "storageModified": "存储修改成功", + "membersUpdatedSuccessfully": "成员更新成功", "errorModifyingStorage": "新存储空间对该成员无效。", "generalErrorWhileModifyingStorage": "修改存储时出错。", "moveItems": "{{itemsToMove}} 成功移动", @@ -1319,7 +1320,10 @@ "errorWhileLoadingWorkspace": "加载工作区时出错 {{error}}", "errorFetchingWorkspaceCredentials": "获取工作区凭据时出错 {{error}}", "invalidWorkspaceInvitationError": "工作区已满。请联系所有者。", - "errorAcceptingWorkspaceInvitation": "接受邀请时出错" + "errorAcceptingWorkspaceInvitation": "接受邀请时出错", + "errorWhileUpdatingWorkspaceMembers": "更新成员时出了点问题", + "errorWhileFetchingCurrentWorkspaceMembers": "获取工作区成员时出了点问题", + "newMembersCannotBeLessThanTheExistentOnesError": "选择的成员数量不能少于当前工作区的成员数量。" }, "actions": { "undo": "撤销", @@ -1351,6 +1355,7 @@ "moreInfo": "更多信息", "dismiss": "解散", "save": "保存", + "saveChanges": "保存更改", "saving": "保存", "back": "返回", "edit": "编辑", @@ -1369,7 +1374,10 @@ "report": "举报滥用", "yes": "是", "no": "否", - "more": "更多信息" + "more": "更多信息", + "continue": "继续", + "keepCurrent": "保持当前", + "logOut": "登出" }, "drive": { "usage": "使用情况", @@ -1467,8 +1475,7 @@ "subscribe-to-newsletter": "订阅新闻", "install-desktop-app": "安装桌面应用程序,并上传一个文件", "invite-friends": "邀请{{completedSteps}}/{{steps}}个朋友 ", - "invite-2-friends": "邀请{{completedSteps}}/{{steps}}个朋友 ", - "complete-survey": "完成调查" + "invite-2-friends": "邀请{{completedSteps}}/{{steps}}个朋友 " }, "rewards": { "title": "免费获得 {{creditSum}}的容量!", @@ -1704,6 +1711,32 @@ "nextBillingDate": "下一次账单日期", "planLimit": "以 {{planLimit}} 计划计费", "subscription": "订阅", + "membersLabel": "成员", + "perUser": "每位用户", + "members": { + "title": "成员", + "editMembers": "编辑成员", + "numberOfMembers": "成员数量", + "expandNumber": "扩大成员数量。", + "confirmUpdateModal": { + "title": "更改计划", + "confirmToProceed": { + "text1": "您即将把 Internxt 成员计划从 ", + "to": "更改为 ", + "text2": "。请确认您的选择以继续。" + }, + "current": "当前", + "new": "新", + "decreaseStorage": { + "text": "这也将减少您的业务总存储空间,从 ", + "to": " 到 " + }, + "increaseStorage": { + "text": "这也将增加您的业务总存储空间,从 ", + "to": " 到 " + } + } + }, "lifetimeSubscription": { "planType": "终生", "text": "无预定账单" diff --git a/src/app/i18n/provider/TranslationProvider.tsx b/src/app/i18n/provider/TranslationProvider.tsx index 4b833e77d..962d41eac 100644 --- a/src/app/i18n/provider/TranslationProvider.tsx +++ b/src/app/i18n/provider/TranslationProvider.tsx @@ -1,9 +1,10 @@ import React, { createContext, useContext, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; +import { Translate, TranslateArray } from '../types'; interface TranslationContextProps { - translate: (key: string, props?: Record) => string; - translateList: (key: string, props?: Record) => string[]; + translate: Translate; + translateList: TranslateArray; } const TranslationContext = createContext({ translate: () => '', translateList: () => [] }); diff --git a/src/app/i18n/types.ts b/src/app/i18n/types.ts index 3c49ee275..843a09a01 100644 --- a/src/app/i18n/types.ts +++ b/src/app/i18n/types.ts @@ -1,10 +1,13 @@ +export type Translate = (key: string, props?: Record) => string; +export type TranslateArray = (key: string, props?: Record) => string[]; + export enum Locale { + German = 'de', English = 'en', Spanish = 'es', French = 'fr', Italian = 'it', - Chinese = 'zh', Russian = 'ru', - German = 'de', + Chinese = 'zh', Taiwanese = 'zh-tw', } diff --git a/src/app/newSettings/Sections/Workspace/Billing/BillingDetailsCard.tsx b/src/app/newSettings/Sections/Workspace/Billing/BillingDetailsCard.tsx index 498cfa3dd..19a2a26c3 100644 --- a/src/app/newSettings/Sections/Workspace/Billing/BillingDetailsCard.tsx +++ b/src/app/newSettings/Sections/Workspace/Billing/BillingDetailsCard.tsx @@ -10,7 +10,7 @@ const BillingDetailsCard = ({ address, phone, isOwner, onEditButtonClick }: Bill return (
-
+
{t('views.preferences.workspace.billing.billingDetails')} +
+ {areFetchingCurrentMembers ? ( + + ) : ( + +

+ {translate('preferences.workspace.billing.members.numberOfMembers')} +

+

+ {totalWorkspaceSeats + ' ' + translate('preferences.workspace.billing.membersLabel')} +

+
+ )} +
+ ); +}; diff --git a/src/app/newSettings/Sections/Workspace/Billing/components/EditBillingDetailsModal.tsx b/src/app/newSettings/Sections/Workspace/Billing/components/EditBillingDetailsModal.tsx index e30ca1109..702c45fc3 100644 --- a/src/app/newSettings/Sections/Workspace/Billing/components/EditBillingDetailsModal.tsx +++ b/src/app/newSettings/Sections/Workspace/Billing/components/EditBillingDetailsModal.tsx @@ -22,7 +22,7 @@ const EditBillingDetailsModal = ({ onSave: (billinDetails: CustomerBillingInfo) => void; isLoading?: boolean; }) => { - const MAX_INPUT_LENGHT = 50; + const MAX_INPUT_LENGTH = 50; const { address, phoneNumber } = billingDetails; const [editedAddress, setEditedAddress] = useState(address || ''); @@ -37,9 +37,8 @@ const EditBillingDetailsModal = ({ label="Address" textValue={editedAddress} onChangeTextValue={setEditedAddress} - maxLength={MAX_INPUT_LENGHT} + maxLength={MAX_INPUT_LENGTH} disabled={isLoading} - hideMaxLength />
Phone diff --git a/src/app/newSettings/Sections/Workspace/Billing/components/UpdateMembers/ConfirmUpdatedMembersModal.tsx b/src/app/newSettings/Sections/Workspace/Billing/components/UpdateMembers/ConfirmUpdatedMembersModal.tsx new file mode 100644 index 000000000..6e4b16eaa --- /dev/null +++ b/src/app/newSettings/Sections/Workspace/Billing/components/UpdateMembers/ConfirmUpdatedMembersModal.tsx @@ -0,0 +1,108 @@ +import { Button } from '@internxt/internxtui'; +import { StoragePlan } from '@internxt/sdk/dist/drive/payments/types'; +import { ArrowRight } from '@phosphor-icons/react'; +import { bytesToString } from 'app/drive/services/size.service'; +import { Translate } from 'app/i18n/types'; +import Modal from 'app/shared/components/Modal'; + +interface ConfirmUpdateMembersModalProps { + isOpen: boolean; + plan: StoragePlan; + updatedAmountOfSeats: number; + isConfirmingMembersWorkspace: boolean; + translate: Translate; + onConfirmUpdate: () => void; + onClose: () => void; +} + +export const ConfirmUpdatedMembersModal = ({ + isOpen, + plan, + updatedAmountOfSeats, + isConfirmingMembersWorkspace, + translate, + onConfirmUpdate, + onClose, +}: ConfirmUpdateMembersModalProps): JSX.Element => { + const currentAmountOfSeats = plan.amountOfSeats; + const storagePerUser = plan.storageLimit; + const monthlyPrice = plan.monthlyPrice; + const warnMessageKey = + currentAmountOfSeats && currentAmountOfSeats < updatedAmountOfSeats ? 'increaseStorage' : 'decreaseStorage'; + const currentTotalStorage = currentAmountOfSeats && bytesToString(storagePerUser * currentAmountOfSeats); + const updatedTotalStorage = bytesToString(storagePerUser * updatedAmountOfSeats); + + return ( + +
+

+ {translate('preferences.workspace.billing.members.confirmUpdateModal.title')} +

+

+ {translate('preferences.workspace.billing.members.confirmUpdateModal.confirmToProceed.text1')} + {currentAmountOfSeats}{' '} + {translate('preferences.workspace.billing.members.confirmUpdateModal.confirmToProceed.to')} + {updatedAmountOfSeats}{' '} + {translate('preferences.workspace.billing.members.confirmUpdateModal.confirmToProceed.text2')} +

+
+ + + +
+
+ { +

+ {translate(`preferences.workspace.billing.members.confirmUpdateModal.${warnMessageKey}.text`)} + {currentTotalStorage} + {translate(`preferences.workspace.billing.members.confirmUpdateModal.${warnMessageKey}.to`)} + {updatedTotalStorage} +

+ } +
+
+ + +
+
+
+ ); +}; + +const MembersCard = ({ + members, + price, + label, + translate, +}: { + members: number; + price: string; + label: string; + translate: Translate; +}): JSX.Element => { + return ( +
+
+

{label}

+
+

+ {members} {translate('preferences.workspace.billing.membersLabel')} +

+

€{price}/year

+
+ ); +}; diff --git a/src/app/newSettings/Sections/Workspace/Billing/components/UpdateMembers/SelectNewMembersModal.tsx b/src/app/newSettings/Sections/Workspace/Billing/components/UpdateMembers/SelectNewMembersModal.tsx new file mode 100644 index 000000000..7ce5a9e30 --- /dev/null +++ b/src/app/newSettings/Sections/Workspace/Billing/components/UpdateMembers/SelectNewMembersModal.tsx @@ -0,0 +1,107 @@ +import { Button, RangeSlider } from '@internxt/internxtui'; +import { X } from '@phosphor-icons/react'; +import { Translate } from '../../../../../../i18n/types'; +import Modal from '../../../../../../shared/components/Modal'; +import { StoragePlan } from '@internxt/sdk/dist/drive/payments/types'; + +interface SeatsProps { + minimumAllowedSeats: number; + maximumAllowedSeats?: number; + currentAmountOfSeats?: number; + updatedAmountOfSeats: number; + actualMembersInWorkspace: number; +} + +interface UpdateMembersModalProps { + isOpen: boolean; + plan: StoragePlan; + joinedUsers?: number; + updatedAmountOfSeats?: number; + onSaveChanges: () => void; + handleUpdateMembers: (value: number) => void; + onClose: () => void; + translate: Translate; +} + +export const SelectNewMembersModal = ({ + isOpen, + plan, + joinedUsers, + updatedAmountOfSeats, + onSaveChanges, + handleUpdateMembers, + translate, + onClose, +}: UpdateMembersModalProps): JSX.Element => { + const seats: SeatsProps = { + currentAmountOfSeats: plan.amountOfSeats, + actualMembersInWorkspace: joinedUsers as number, + minimumAllowedSeats: Math.max(joinedUsers as number, plan.seats?.minimumSeats as number) ?? 3, + maximumAllowedSeats: plan.seats?.maximumSeats, + updatedAmountOfSeats: updatedAmountOfSeats as number, + }; + + return ( + +
+ + {translate('preferences.workspace.members.actions.modifyStorage')} + +
+ +
+
+
+ +
+ + +
+
+
+ ); +}; + +const UpdateMembersCard = ({ + translate, + seats, + handleUpdateMembers, +}: Pick & { + seats: SeatsProps; +}): JSX.Element => { + return ( + <> +

{translate('preferences.workspace.billing.members.expandNumber')}

+
+
+
+

{seats.currentAmountOfSeats}

+

{translate('preferences.workspace.billing.membersLabel')}

+
+
+
+

{seats.updatedAmountOfSeats}

+

{translate('preferences.workspace.billing.membersLabel')}

+
+
+ + +
+ + ); +}; diff --git a/src/app/newSettings/Sections/Workspace/Billing/containers/BillingWorkspaceOverview.tsx b/src/app/newSettings/Sections/Workspace/Billing/containers/BillingWorkspaceOverview.tsx index 6d73bfb71..0bc49bfef 100644 --- a/src/app/newSettings/Sections/Workspace/Billing/containers/BillingWorkspaceOverview.tsx +++ b/src/app/newSettings/Sections/Workspace/Billing/containers/BillingWorkspaceOverview.tsx @@ -15,21 +15,26 @@ interface BillingWorkspaceOverviewProps { const BillingWorkspaceOverview = ({ plan }: BillingWorkspaceOverviewProps) => { const local = localStorageService.get('i18nextLng') ?? navigator.language.split('-')[0]; - const isFreeSuscription = plan.businessSubscription?.type === 'free'; + const isFreeSubscription = plan.businessSubscription?.type === 'free'; const subscriptionData: { amountInterval: string; interval: 'monthly' | 'yearly'; renewDate: string } | undefined = getSubscriptionData({ userSubscription: plan.businessSubscription, plan, local, userType: UserType.Business }); const nextBillingDate = getNextBillingDate(plan.businessSubscription); const [integerPart, decimalPart] = subscriptionData?.amountInterval?.split('.') ?? []; + const totalStorageInBytes = + plan.businessPlan && bytesToString(plan.businessPlan?.storageLimit * plan.businessPlan?.amountOfSeats); + const totalMembersPerPlan = plan.businessPlan?.amountOfSeats; + const storagePerUserInBytes = plan.businessPlan && bytesToString(plan.businessPlan?.storageLimit); + return (
- {!isFreeSuscription ? ( + {!isFreeSubscription ? ( nextBillingDate && integerPart && decimalPart && ( - <> - +
+

{subscriptionData?.renewDate}

@@ -37,17 +42,31 @@ const BillingWorkspaceOverview = ({ plan }: BillingWorkspaceOverviewProps) => {

- +

{integerPart}.{decimalPart}

- {t('preferences.workspace.billing.planLimit', { planLimit: bytesToString(plan.businessPlanLimit) })} + {t('preferences.workspace.billing.planLimit', { + planLimit: totalStorageInBytes, + })} +

+
+
+ +
+

+ {totalMembersPerPlan}{' '} + {t('preferences.workspace.billing.membersLabel')} +

+

{plan.businessPlan?.name}

+

+ {storagePerUserInBytes + ' ' + t('preferences.workspace.billing.perUser')}

- +
) ) : ( diff --git a/src/app/newSettings/Sections/Workspace/Overview/OverviewSection.tsx b/src/app/newSettings/Sections/Workspace/Overview/OverviewSection.tsx index 093b32b92..c40eaa465 100644 --- a/src/app/newSettings/Sections/Workspace/Overview/OverviewSection.tsx +++ b/src/app/newSettings/Sections/Workspace/Overview/OverviewSection.tsx @@ -423,7 +423,7 @@ const WorkspaceProfileCard: React.FC = ({
- + {companyName} diff --git a/src/app/newSettings/components/DetailsInput.tsx b/src/app/newSettings/components/DetailsInput.tsx index 9577b7008..a90f84b03 100644 --- a/src/app/newSettings/components/DetailsInput.tsx +++ b/src/app/newSettings/components/DetailsInput.tsx @@ -6,13 +6,11 @@ const DetailsInput = ({ onChangeTextValue, maxLength, disabled, - hideMaxLength, }: { label: string; textValue: string; onChangeTextValue: (text: string) => void; maxLength?: number; - hideMaxLength?: boolean; disabled?: boolean; }) => { return ( @@ -26,13 +24,6 @@ const DetailsInput = ({ onChange={onChangeTextValue} maxLength={maxLength} /> - {!hideMaxLength && maxLength && ( - - - {textValue.length}/{maxLength} - - - )}
); }; diff --git a/src/app/newSettings/utils/suscriptionUtils.ts b/src/app/newSettings/utils/suscriptionUtils.ts index 1ce7f833c..dd9d63fb7 100644 --- a/src/app/newSettings/utils/suscriptionUtils.ts +++ b/src/app/newSettings/utils/suscriptionUtils.ts @@ -7,9 +7,9 @@ import { PlanState } from '../../store/slices/plan'; const formatPlanPaymentInterval = (storagePlan: StoragePlan | null) => { if (storagePlan) { - const isAnuallyPaymentInterval = storagePlan.paymentInterval === RenewalPeriod.Annually; - const price = isAnuallyPaymentInterval ? storagePlan.price : storagePlan.monthlyPrice; - const renewalPeriod = isAnuallyPaymentInterval ? 'year' : 'month'; + const isAnnuallyPaymentInterval = storagePlan.paymentInterval === RenewalPeriod.Annually; + const price = isAnnuallyPaymentInterval ? storagePlan.price : storagePlan.monthlyPrice; + const renewalPeriod = isAnnuallyPaymentInterval ? 'year' : 'month'; const priceTruncated = Math.trunc(price * 100) / 100; return ( diff --git a/src/app/payment/components/checkout/CheckoutUserAuth.tsx b/src/app/payment/components/checkout/CheckoutUserAuth.tsx index 5c96f2870..8805ac5a5 100644 --- a/src/app/payment/components/checkout/CheckoutUserAuth.tsx +++ b/src/app/payment/components/checkout/CheckoutUserAuth.tsx @@ -69,7 +69,7 @@ export const CheckoutUserAuth = ({ />

{userData.name}

{userData?.email}

- +
) : ( diff --git a/src/app/payment/services/payment.service.ts b/src/app/payment/services/payment.service.ts index 5eb421b43..0f99f6a83 100644 --- a/src/app/payment/services/payment.service.ts +++ b/src/app/payment/services/payment.service.ts @@ -157,6 +157,11 @@ const paymentService = { return paymentsClient.updateSubscriptionPrice({ priceId, couponCode: coupon, userType }); }, + async updateWorkspaceMembers(workspaceId: string, subscriptionId: string, updatedMembers: number) { + const paymentsClient = await SdkFactory.getInstance().createPaymentsClient(); + return paymentsClient.updateWorkspaceMembers(workspaceId, subscriptionId, updatedMembers); + }, + async cancelSubscription(userType?: UserType): Promise { const paymentsClient = await SdkFactory.getInstance().createPaymentsClient(); diff --git a/src/app/payment/views/CheckoutSuccessView/CheckoutSuccessView.tsx b/src/app/payment/views/CheckoutSuccessView/CheckoutSuccessView.tsx index 0f63efe3e..fc0e4fce9 100644 --- a/src/app/payment/views/CheckoutSuccessView/CheckoutSuccessView.tsx +++ b/src/app/payment/views/CheckoutSuccessView/CheckoutSuccessView.tsx @@ -5,18 +5,21 @@ import { useAppDispatch } from 'app/store/hooks'; import { planThunks } from 'app/store/slices/plan'; import { userThunks } from 'app/store/slices/user'; import { useCallback } from 'react'; -import { useSelector } from 'react-redux'; import localStorageService from '../../../core/services/local-storage.service'; -import { RootState } from '../../../store'; -import { useThemeContext } from '../../../theme/ThemeProvider'; -import { isStarWarsThemeAvailable } from '../../utils/checkStarWarsCode'; import { workspaceThunks } from 'app/store/slices/workspaces/workspacesStore'; import { trackPaymentConversion } from 'app/analytics/impact.service'; +function removePaymentsStorage() { + localStorageService.removeItem('subscriptionId'); + localStorageService.removeItem('paymentIntentId'); + localStorageService.removeItem('amountPaid'); + localStorageService.removeItem('productName'); + localStorageService.removeItem('priceId'); + localStorageService.removeItem('currency'); +} + const CheckoutSuccessView = (): JSX.Element => { const dispatch = useAppDispatch(); - const { toggleTheme } = useThemeContext(); - const plan = useSelector((state: RootState) => state.plan); const onCheckoutSuccess = useCallback(async () => { setTimeout(async () => { @@ -27,13 +30,10 @@ const CheckoutSuccessView = (): JSX.Element => { try { await trackPaymentConversion(); - localStorageService.removeItem('subscriptionId'); - localStorageService.removeItem('paymentIntentId'); - localStorageService.removeItem('amountPaid'); + removePaymentsStorage(); } catch (err) { console.log('Analytics error: ', err); } - isStarWarsThemeAvailable(plan, () => toggleTheme('starwars')); navigationService.push(AppView.Drive); }, [dispatch]); diff --git a/src/app/payment/views/IntegratedCheckoutView/CheckoutView.tsx b/src/app/payment/views/IntegratedCheckoutView/CheckoutView.tsx index c06f5c537..f9e75c09e 100644 --- a/src/app/payment/views/IntegratedCheckoutView/CheckoutView.tsx +++ b/src/app/payment/views/IntegratedCheckoutView/CheckoutView.tsx @@ -50,7 +50,8 @@ const CheckoutView = ({ checkoutViewManager, }: CheckoutViewProps) => { const { translate } = useTranslationContext(); - // Those custom hooks should be here. They cannot be moved to the Parent, because it must be wrapped by component. + // Those custom hooks should be here. + // They cannot be moved to the Parent, because it must be wrapped by component. const stripeSDK = useStripe(); const elements = useElements(); diff --git a/src/app/payment/views/IntegratedCheckoutView/CheckoutViewWrapper.tsx b/src/app/payment/views/IntegratedCheckoutView/CheckoutViewWrapper.tsx index 104070d93..65c319290 100644 --- a/src/app/payment/views/IntegratedCheckoutView/CheckoutViewWrapper.tsx +++ b/src/app/payment/views/IntegratedCheckoutView/CheckoutViewWrapper.tsx @@ -29,6 +29,7 @@ import { AuthMethodTypes, CouponCodeData, RequestedPlanData } from '../../types' import CheckoutView from './CheckoutView'; import ChangePlanDialog from '../../../newSettings/Sections/Account/Plans/components/ChangePlanDialog'; import { getProductAmount } from 'app/payment/utils/getProductAmount'; +import { bytesToString } from 'app/drive/services/size.service'; export const THEME_STYLES = { dark: { @@ -97,8 +98,13 @@ function savePaymentDataInLocalStorage( if (subscriptionId) localStorageService.set('subscriptionId', subscriptionId); if (paymentIntentId) localStorageService.set('paymentIntentId', paymentIntentId); if (selectedPlan) { + const planName = bytesToString(selectedPlan.bytes) + selectedPlan.interval; const amountToPay = getProductAmount(selectedPlan.decimalAmount, users, couponCodeData); + + localStorageService.set('productName', planName); localStorageService.set('amountPaid', amountToPay); + localStorageService.set('priceId', selectedPlan.id); + localStorageService.set('currency', selectedPlan.currency); } } @@ -158,6 +164,7 @@ const CheckoutViewWrapper = () => { isUpsellSwitchActivated, prices, } = state; + const canChangePlanDialogBeOpened = prices && currentSelectedPlan && isUpdateSubscriptionDialogOpen; const userInfo: UserInfoProps = { @@ -376,7 +383,6 @@ const CheckoutViewWrapper = () => { seatsForBusinessSubscription, }); - // TEMPORARY HOT FIX // Store subscriptionId, paymentIntendId, and amountPaid to send to IMPACT API savePaymentDataInLocalStorage( subscriptionId, diff --git a/src/app/routes/hooks/Login/useLoginRedirections.tsx b/src/app/routes/hooks/Login/useLoginRedirections.tsx index 26d1ebaf7..1694e65f2 100644 --- a/src/app/routes/hooks/Login/useLoginRedirections.tsx +++ b/src/app/routes/hooks/Login/useLoginRedirections.tsx @@ -1,6 +1,5 @@ import { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings'; import { t } from 'i18next'; -import { useHistory } from 'react-router-dom'; import { AppView } from '../../../core/types'; import workspacesService from 'app/core/services/workspace.service'; @@ -16,7 +15,7 @@ const useLoginRedirections = ({ showNotification: ({ text, isError }: { text: string; isError: boolean }) => void; }) => { const urlParams = new URLSearchParams(window.location.search); - const history = useHistory(); + const sharingId = urlParams.get('sharingId'); const folderuuidToRedirect = urlParams.get('folderuuid'); const workspaceInvitationId = urlParams.get('invitationId'); @@ -85,7 +84,7 @@ const useLoginRedirections = ({ } if (user.registerCompleted === false) { - return history.push('/appsumo/' + user.email); + return navigateTo(AppView.Login); } if (user?.registerCompleted && mnemonic && options?.isSharingInvitation) { diff --git a/src/app/share/views/SharedLinksView/SharedView.tsx b/src/app/share/views/SharedLinksView/SharedView.tsx index ad85c4637..e3b2ac19e 100644 --- a/src/app/share/views/SharedLinksView/SharedView.tsx +++ b/src/app/share/views/SharedLinksView/SharedView.tsx @@ -633,7 +633,6 @@ export default connect((state: RootState) => ({ currentUserRole: state.shared.currentSharingRole, disableKeyboardShortcuts: state.ui.isShareDialogOpen || - state.ui.isSurveyDialogOpen || state.ui.isEditFolderNameDialog || state.ui.isFileViewerOpen || state.ui.isMoveItemsDialogOpen || diff --git a/src/app/store/slices/referrals/index.ts b/src/app/store/slices/referrals/index.ts index dfa721908..5601af56e 100644 --- a/src/app/store/slices/referrals/index.ts +++ b/src/app/store/slices/referrals/index.ts @@ -93,10 +93,6 @@ const executeUserReferralActionThunk = createAsyncThunk) => { state.isNewsletterDialogOpen = action.payload; }, - setIsSurveyDialogOpen: (state: UISliceState, action: PayloadAction) => { - state.isSurveyDialogOpen = action.payload; - }, setIsPreferencesDialogOpen: (state: UISliceState, action: PayloadAction) => { state.isPreferencesDialogOpen = action.payload; }, @@ -195,7 +190,6 @@ export const { setIsDeleteItemsDialogOpen, setIsMoveItemsDialogOpen, setIsNewsletterDialogOpen, - setIsSurveyDialogOpen, setIsPreferencesDialogOpen, setIsFileLoggerOpen, setIsFileInfoMenuOpen, diff --git a/src/app/survey/components/SurveyDialog/SurveyDialog.tsx b/src/app/survey/components/SurveyDialog/SurveyDialog.tsx deleted file mode 100644 index 45f9c3c7c..000000000 --- a/src/app/survey/components/SurveyDialog/SurveyDialog.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { Widget } from '@typeform/embed-react'; -import { useSelector } from 'react-redux'; -import { RootState } from 'app/store'; -import { useEffect } from 'react'; - -import { useAppDispatch } from 'app/store/hooks'; -import { uiActions } from 'app/store/slices/ui'; -import BaseDialog from 'app/shared/components/BaseDialog/BaseDialog'; -import { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings'; -import RealtimeService from 'app/core/services/socket.service'; -import { referralsThunks } from 'app/store/slices/referrals'; - -const SurveyDialog = (props: { isOpen: boolean }): JSX.Element => { - const clientId = RealtimeService.getInstance().getClientId(); - const dispatch = useAppDispatch(); - const user = useSelector((state: RootState) => state.user.user) as UserSettings; - - const onClose = (): void => { - dispatch(uiActions.setIsSurveyDialogOpen(false)); - }; - - useEffect(() => { - RealtimeService.getInstance().onEvent((data) => { - if (data.event === 'USER_STORAGE_UPDATED') { - dispatch(referralsThunks.refreshUserReferrals()); - } - }); - }, []); - - return ( - - {user && ( -
-
- )} -
- ); -}; - -export default SurveyDialog; diff --git a/yarn.lock b/yarn.lock index 53f18aa15..f441a68a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2009,10 +2009,10 @@ resolved "https://npm.pkg.github.com/download/@internxt/prettier-config/1.0.2/5bd220b8de76734448db5475b3e0c01f9d22c19b#5bd220b8de76734448db5475b3e0c01f9d22c19b" integrity sha512-t4HiqvCbC7XgQepwWlIaFJe3iwW7HCf6xOSU9nKTV0tiGqOPz7xMtIgLEloQrDA34Cx4PkOYBXrvFPV6RxSFAA== -"@internxt/sdk@=1.5.24": - version "1.5.24" - resolved "https://npm.pkg.github.com/download/@internxt/sdk/1.5.24/0ce073c43be74fc41615d68678ff8c39a111d515#0ce073c43be74fc41615d68678ff8c39a111d515" - integrity sha512-UbStncZsm+xY6RBOdfHwoIATQS8bKAaw0d2ZUAhDZZ3l4WMy1CSV5GFbWeYAuSFzhjOMncEKD5K58nwZd4mZvw== +"@internxt/sdk@=1.8.0": + version "1.8.0" + resolved "https://npm.pkg.github.com/download/@internxt/sdk/1.8.0/a35e4d4b882b1fc003bf14a3779296d021d2e8d8#a35e4d4b882b1fc003bf14a3779296d021d2e8d8" + integrity sha512-8pJTLqk6hubGex1sdGfVuarQ6NtLwXs2zRgEFk2isrPddUf8c64+FGrYAipGm/RdRnlkZMPpkt2yRXUbwOnHtg== dependencies: axios "^0.24.0" query-string "^7.1.0" @@ -2334,7 +2334,7 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -3346,10 +3346,10 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@socket.io/component-emitter@~3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz#8863915676f837d9dad7b76f50cb500c1e9422e9" - integrity sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q== +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== "@stripe/react-stripe-js@^2.7.1": version "2.7.1" @@ -3680,15 +3680,7 @@ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== -"@types/eslint-scope@^3.7.3": - version "3.7.5" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" - integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": +"@types/eslint@^7.29.0 || ^8.4.1": version "8.44.4" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.4.tgz#28eaff82e1ca0a96554ec5bb0188f10ae1a74c2f" integrity sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA== @@ -3696,7 +3688,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.0": +"@types/estree@*": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== @@ -3706,7 +3698,7 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/estree@1.0.6": +"@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.5": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== @@ -4265,28 +4257,46 @@ loupe "^3.1.2" tinyrainbow "^1.2.0" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@webassemblyjs/ast@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" +"@webassemblyjs/ast@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" @@ -4297,20 +4307,34 @@ "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" + "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" @@ -4331,59 +4355,59 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -4422,10 +4446,10 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" @@ -5069,11 +5093,6 @@ babel-preset-react-app@^10.0.1: babel-plugin-macros "^3.1.0" babel-plugin-transform-react-remove-prop-types "^0.4.24" -backo2@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -5290,7 +5309,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: +browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: version "4.22.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== @@ -6001,9 +6020,9 @@ cross-env@^7.0.3: cross-spawn "^7.0.1" cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -6743,30 +6762,26 @@ end-of-stream@^1.4.1: dependencies: once "^1.4.0" -engine.io-client@~6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.1.1.tgz#800d4b9db5487d169686729e5bd887afa78d36b0" - integrity sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g== +engine.io-client@~6.6.1: + version "6.6.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.2.tgz#e0a09e1c90effe5d6264da1c56d7281998f1e50b" + integrity sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw== dependencies: - "@socket.io/component-emitter" "~3.0.0" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" - engine.io-parser "~5.0.0" - has-cors "1.1.0" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~8.2.3" - xmlhttprequest-ssl "~2.0.0" - yeast "0.1.2" - -engine.io-parser@~5.0.0: - version "5.0.7" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.7.tgz#ed5eae76c71f398284c578ab6deafd3ba7e4e4f6" - integrity sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ== - -enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + engine.io-parser "~5.2.1" + ws "~8.17.1" + xmlhttprequest-ssl "~2.1.1" + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + +enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -7689,11 +7704,16 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.0.0, follow-redirects@^1.14.4, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.4: version "1.15.5" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== +follow-redirects@^1.15.0: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -7738,9 +7758,9 @@ form-data@^3.0.0: mime-types "^2.1.12" form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -8045,7 +8065,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -8082,11 +8102,6 @@ has-bigints@^1.0.1, has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -10744,16 +10759,6 @@ parse5@6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -12922,24 +12927,22 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -socket.io-client@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.4.1.tgz#b6aa9448149d09b8d0b2bbf3d2fac310631fdec9" - integrity sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ== +socket.io-client@4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb" + integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== dependencies: - "@socket.io/component-emitter" "~3.0.0" - backo2 "~1.0.2" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.1.1" - parseuri "0.0.6" - socket.io-parser "~4.1.1" + engine.io-client "~6.6.1" + socket.io-parser "~4.2.4" -socket.io-parser@~4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.1.2.tgz#0a97d4fb8e67022158a568450a6e41887e42035e" - integrity sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog== +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: - "@socket.io/component-emitter" "~3.0.0" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" sockjs@^0.3.24: @@ -13661,7 +13664,7 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: +terser-webpack-plugin@^5.2.5: version "5.3.9" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== @@ -13672,6 +13675,17 @@ terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: version "5.21.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" @@ -13682,6 +13696,16 @@ terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.26.0: + version "5.31.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" + integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -14237,7 +14261,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.0, uuid@^8.3.2: +uuid@=8.3.2, uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -14352,10 +14376,10 @@ warning@^4.0.0, warning@^4.0.2, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -14500,33 +14524,32 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.88.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" + version "5.94.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + dependencies: + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" + enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -14934,7 +14957,7 @@ ws@^7.3.1, ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.13.0: +ws@^8.13.0, ws@~8.17.1: version "8.17.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== @@ -14944,11 +14967,6 @@ ws@^8.18.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== - xlsx-preview@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/xlsx-preview/-/xlsx-preview-1.0.4.tgz#bb0a5ff43202f3da892521a5f406a0a9de8335b6" @@ -14966,10 +14984,10 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== +xmlhttprequest-ssl@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" + integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== xtend@^4.0.2: version "4.0.2" @@ -15047,11 +15065,6 @@ yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg== - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"