diff --git a/.eslintrc.js b/.eslintrc.js
index f109f1170f..071d62c0e5 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -23,7 +23,7 @@ module.exports = {
'airbnb-base',
'prettier',
'plugin:@typescript-eslint/recommended',
- 'plugin:react/recommended',
+ 'plugin:react/jsx-runtime',
'plugin:react-hooks/recommended',
'plugin:import/recommended',
'plugin:import/typescript',
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 7324c04d2d..2d563d5ec3 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -1,583 +1,590 @@
{
- "copyErrorAndQuit": "Copy error and quit",
- "unknown": "Unknown",
- "databaseError": "Database Error",
- "mainMenuFile": "&File",
- "mainMenuEdit": "&Edit",
- "mainMenuView": "&View",
- "mainMenuWindow": "&Window",
- "mainMenuHelp": "&Help",
+ "about": "About",
+ "accept": "Accept",
+ "accountIDCopy": "Copy Account ID",
+ "accountIdEnter": "Enter Account ID",
+ "accountIdEnterYourFriends": "Enter your friend's Account ID or ONS",
+ "accountIdYours": "Your Account ID",
+ "accountIdErrorInvalid": "This Account ID is invalid. Please check and try again.",
+ "activeMembers": "$count$ active members",
+ "add": "Add",
+ "addACaption": "Add a caption...",
+ "addAsModerator": "Add as Admin",
+ "addingContacts": "Adding contacts to $name$",
+ "addModerator": "Add Admin",
+ "addModerators": "Add Admins",
+ "anonymous": "Anonymous",
+ "answeredACall": "Call with $name$",
+ "appearanceSettingsTitle": "Appearance",
"appMenuHide": "Hide",
"appMenuHideOthers": "Hide Others",
- "appMenuUnhide": "Show All",
"appMenuQuit": "Quit Session",
- "editMenuUndo": "Undo",
- "editMenuRedo": "Redo",
- "editMenuCut": "Cut",
- "editMenuCopy": "Copy",
- "editMenuPaste": "Paste",
- "editMenuDeleteContact": "Delete Contact",
- "editMenuDeleteGroup": "Delete Group",
- "editMenuSelectAll": "Select all",
- "windowMenuClose": "Close Window",
- "windowMenuMinimize": "Minimize",
- "windowMenuZoom": "Zoom",
- "viewMenuResetZoom": "Actual Size",
- "viewMenuZoomIn": "Zoom In",
- "viewMenuZoomOut": "Zoom Out",
- "viewMenuToggleFullScreen": "Toggle Full Screen",
- "viewMenuToggleDevTools": "Toggle Developer Tools",
- "contextMenuNoSuggestions": "No Suggestions",
- "openGroupInvitation": "Community invitation",
- "joinOpenGroupAfterInvitationConfirmationTitle": "Join $roomName$?",
- "joinOpenGroupAfterInvitationConfirmationDesc": "Are you sure you want to join the $roomName$ community?",
- "couldntFindServerMatching": "Couldn't find the corresponding Community server",
- "enterSessionIDOrONSName": "Enter Session ID or ONS name",
- "startNewConversationBy...": "Start a new conversation by entering someone's Session ID or share your Session ID with them.",
- "loading": "Loading...",
- "done": "Done",
- "youLeftTheGroup": "You have left the group.",
- "youGotKickedFromGroup": "You were removed from the group.",
- "unreadMessages": "Unread Messages",
- "debugLogExplanation": "This log will be saved to your desktop.",
- "reportIssue": "Report a Bug",
- "markAllAsRead": "Mark Read",
- "incomingError": "Error handling incoming message",
- "media": "Media",
- "mediaEmptyState": "No media",
- "document": "Document",
- "documents": "Documents",
- "documentsEmptyState": "No documents",
- "today": "Today",
- "yesterday": "Yesterday",
- "thisWeek": "This week",
- "thisMonth": "This Month",
- "voiceMessage": "Voice Message",
- "stagedPreviewThumbnail": "Draft thumbnail link preview for $domain$",
- "previewThumbnail": "Thumbnail link preview for $domain$",
- "stagedImageAttachment": "Draft image attachment: $path$",
- "oneNonImageAtATimeToast": "Sorry, there is a limit of one non-image attachment per message",
- "cannotMixImageAndNonImageAttachments": "Sorry, you cannot mix images with other file types in one message",
- "maximumAttachments": "Maximum number of attachments reached. Please send remaining attachments in a separate message.",
- "fileSizeWarning": "Attachment exceeds size limits for the type of message you're sending.",
- "unableToLoadAttachment": "Sorry, there was an error setting your attachment.",
- "offline": "Offline",
- "debugLog": "Debug Log",
- "showDebugLog": "Export Logs",
- "shareBugDetails": "Export your logs, then upload the file though Session's Help Desk.",
- "goToReleaseNotes": "Go to Release Notes",
- "goToSupportPage": "Go to Support Page",
- "about": "About",
- "show": "Show",
- "sessionMessenger": "Session",
- "noSearchResults": "No results found for \"$searchTerm$\"",
- "conversationsHeader": "Contacts and Groups: $count$",
- "contactsHeader": "Contacts",
- "messagesHeader": "Conversations",
- "searchMessagesHeader": "Messages: $count$",
- "settingsHeader": "Settings",
- "typingAlt": "Typing animation for this conversation",
- "contactAvatarAlt": "Avatar for contact $name$",
- "downloadAttachment": "Download Attachment",
- "replyToMessage": "Reply",
- "replyingToMessage": "Replying to:",
- "originalMessageNotFound": "Original message not found",
- "you": "You",
- "audioPermissionNeededTitle": "Microphone Access Required",
- "audioPermissionNeeded": "You can enable microphone access under: Settings (Gear icon) => Privacy",
- "image": "Image",
+ "appMenuUnhide": "Show All",
+ "areYouSureClearDevice": "Are you sure you want to clear your device?",
+ "areYouSureDeleteDeviceOnly": "Are you sure you want to delete your device data only?",
+ "areYouSureDeleteEntireAccount": "Are you sure you want to delete your data from the network? If you continue, you will not be able to restore your messages or contacts.",
"audio": "Audio",
- "video": "Video",
- "photo": "Photo",
+ "audioMessageAutoplayDescription": "Autoplay consecutive audio messages.",
+ "audioMessageAutoplayTitle": "Autoplay Audio Messages",
+ "audioNotificationsSettingsTitle": "Audio Notifications",
+ "audioPermissionNeeded": "You can enable microphone access under: Settings (Gear icon) => Privacy",
+ "audioPermissionNeededTitle": "Microphone Access Required",
+ "autoUpdateDownloadButtonLabel": "Download",
+ "autoUpdateDownloadedMessage": "Update has been downloaded.",
+ "autoUpdateDownloadInstructions": "Would you like to download the update?",
+ "autoUpdateLaterButtonLabel": "Later",
+ "autoUpdateNewVersionInstructions": "Press Restart Session to apply the updates.",
+ "autoUpdateNewVersionMessage": "There is a new version of Session available.",
+ "autoUpdateNewVersionTitle": "Session update available",
+ "autoUpdateRestartButtonLabel": "Restart Session",
+ "autoUpdateSettingDescription": "Automatically check for updates on startup.",
+ "autoUpdateSettingTitle": "Auto Update",
+ "banUser": "Ban User",
+ "banUserAndDeleteAll": "Ban and Delete All",
+ "blindedMsgReqsSettingDesc": "Allow message requests from Community conversations.",
+ "blindedMsgReqsSettingTitle": "Community Message Requests",
+ "block": "Block",
+ "blocked": "Blocked",
+ "blockedSettingsTitle": "Blocked Contacts",
+ "callMediaPermissionsDescription": "Enables voice and video calls to and from other users.",
+ "callMediaPermissionsDialogContent": "Your IP address is visible to your call partner and an Oxen Foundation server while using beta calls. Are you sure you want to enable Voice and Video Calls?",
+ "callMediaPermissionsDialogTitle": "Voice and Video Calls (Beta)",
+ "callMediaPermissionsTitle": "Voice and Video Calls (Beta)",
+ "callMissed": "Missed call from $name$",
+ "callMissedCausePermission": "Call missed from '$name$' because you need to enable the 'Voice and video calls' permission in the Privacy Settings.",
+ "callMissedNotApproved": "Call missed from '$name$' as you haven't approved this conversation yet. Send a message to them first.",
+ "callMissedTitle": "Call missed",
+ "cameraPermissionNeeded": "You can enable the 'Voice and video calls' permission in the Privacy Settings.",
+ "cameraPermissionNeededTitle": "Voice/Video Call permissions required",
+ "cancel": "Cancel",
+ "cannotMixImageAndNonImageAttachments": "Sorry, you cannot mix images with other file types in one message",
+ "cannotRemoveCreatorFromGroup": "Cannot remove this user",
+ "cannotRemoveCreatorFromGroupDesc": "You cannot remove this user as they are the creator of the group.",
"cannotUpdate": "Cannot Update",
"cannotUpdateDetail": "Session Desktop failed to update, but there is a new version available. Please go to https://getsession.org/ and install the new version manually, then either contact support or file a bug about this problem.",
- "ok": "OK",
- "cancel": "Cancel",
+ "changeAccountPasswordDescription": "Change the password required to unlock Session.",
+ "changeAccountPasswordTitle": "Change Password",
+ "changeNickname": "Change Nickname",
+ "changeNicknameMessage": "Enter a nickname for this user",
+ "changePassword": "Change Password",
+ "changePasswordInvalid": "The old password you entered is incorrect",
+ "changePasswordTitle": "Password Changed",
+ "changePasswordToastDescription": "Your password has been changed. Please keep it safe.",
+ "chooseAnAction": "Choose an action to start a conversation",
+ "classicDarkThemeTitle": "Classic Dark",
+ "classicLightThemeTitle": "Classic Light",
+ "clear": "Clear",
+ "clearAll": "Clear All",
+ "clearAllConfirmationBody": "Are you sure you want to clear all message requests?",
+ "clearAllConfirmationTitle": "Clear All Message Requests",
+ "clearAllData": "Clear All Data",
+ "clearAllReactions": "Are you sure you want to clear all $emoji$ ?",
+ "clearDataSettingsTitle": "Clear Data",
+ "clearDevice": "Clear Device",
+ "clearNickname": "Clear Nickname",
+ "clickToTrustContact": "Click to download media",
"close": "Close",
+ "closedGroupInviteFailMessage": "Unable to successfully invite a group member",
+ "closedGroupInviteFailMessagePlural": "Unable to successfully invite all group members",
+ "closedGroupInviteFailTitle": "Group Invitation Failed",
+ "closedGroupInviteFailTitlePlural": "Group Invitations Failed",
+ "closedGroupInviteOkText": "Retry invitations",
+ "closedGroupInviteSuccessMessage": "Successfully invited group members",
+ "closedGroupInviteSuccessTitle": "Group Invitation Succeeded",
+ "closedGroupInviteSuccessTitlePlural": "Group Invitations Completed",
+ "closedGroupMaxSize": "A group cannot have more than 100 members",
+ "confirm": "Confirm",
+ "confirmNewPassword": "Confirm new password",
+ "confirmPassword": "Confirm password",
+ "connectingToServer": "Connecting...",
+ "connectToServerFail": "Couldn't join community",
+ "connectToServerSuccess": "Successfully connected to community",
+ "contactAvatarAlt": "Avatar for contact $name$",
+ "contactsHeader": "Contacts",
+ "contextMenuNoSuggestions": "No Suggestions",
"continue": "Continue",
- "error": "Error",
+ "conversationsHeader": "Contacts and Groups: $count$",
+ "conversationsNone": "You don't have any conversations yet",
+ "conversationsSettingsTitle": "Conversations",
+ "copiedToClipboard": "Copied",
+ "copyErrorAndQuit": "Copy error and quit",
+ "copyMessage": "Copy message text",
+ "copyOpenGroupURL": "Copy Group URL",
+ "couldntFindServerMatching": "Couldn't find the corresponding Community server",
+ "create": "Create",
+ "createClosedGroupNamePrompt": "Group Name",
+ "createClosedGroupPlaceholder": "Enter a group name",
+ "createConversationNewContact": "Create a conversation with a new contact",
+ "createConversationNewGroup": "Create a group with existing contacts",
+ "createGroup": "Create Group",
+ "createPassword": "Create your password",
+ "databaseError": "Database Error",
+ "debugLog": "Debug Log",
+ "debugLogExplanation": "This log will be saved to your desktop.",
+ "decline": "Decline",
+ "declineRequestMessage": "Are you sure you want to decline this message request?",
"delete": "Delete",
- "hide": "Hide",
- "messageDeletionForbidden": "You don’t have permission to delete others’ messages",
- "deleteJustForMe": "Delete just for me",
- "deleteForEveryone": "Delete for everyone",
- "deleteMessagesQuestion": "Delete $count$ messages?",
- "deleteMessageQuestion": "Delete this message?",
- "deleteMessages": "Delete Messages",
- "deleteMessagesConfirmation": "Permanently delete the messages in this conversation?",
- "hideConversation": "Hide Conversation",
- "hideNoteToSelfConfirmation": "Are you sure you want to hide your Note to Self conversation?",
+ "deleteAccountFromLogin": "Are you sure you want to clear your device?",
+ "deleteAccountWarning": "This will permanently delete your messages and contacts.",
+ "deleteContactConfirmation": "Are you sure you want to delete this conversation?",
"deleteConversation": "Delete Conversation",
"deleteConversationConfirmation": "Are you sure you want to delete your conversation with $name$ ?",
"deleteConversationFailed": "Failed to delete the Conversation!",
"deleteConversationFailedPleaseTryAgain": "Unable to delete the conversation, please try again",
- "leaving": "Leaving...",
"deleted": "$count$ deleted",
- "messageDeletedPlaceholder": "This message has been deleted",
- "from": "From:",
- "to": "To:",
- "sent": "Sent",
- "sending": "Sending",
- "received": "Received",
- "sendMessage": "Message",
- "groupMembers": "Members",
- "moreInformation": "More information",
- "failed": "Failed",
- "failedToSendMessage": "Failed to send message",
- "read": "Read",
- "resend": "Resend",
- "clear": "Clear",
- "clearAllData": "Clear All Data",
- "deleteAccountWarning": "This will permanently delete your messages and contacts.",
- "deleteAccountFromLogin": "Are you sure you want to clear your device?",
- "deleteContactConfirmation": "Are you sure you want to delete this conversation?",
- "quoteThumbnailAlt": "Thumbnail of image from quoted message",
- "imageAttachmentAlt": "Image attached to message",
- "videoAttachmentAlt": "Screenshot of video in message",
- "lightboxImageAlt": "Image sent in conversation",
- "imageCaptionIconAlt": "Icon showing that this image has a caption",
- "addACaption": "Add a caption...",
- "copySessionID": "Copy Session ID",
- "copyOpenGroupURL": "Copy Group URL",
- "save": "Save",
- "saveLogToDesktop": "Save log to desktop",
- "saved": "Saved",
- "tookAScreenshot": "$name$ took a screenshot",
- "savedTheFile": "Media saved by $name$",
- "linkPreviewsTitle": "Send Link Previews",
- "linkPreviewDescription": "Generate link previews for supported URLs.",
- "linkPreviewsConfirmMessage": "You will not have full metadata protection when sending link previews.",
- "mediaPermissionsTitle": "Microphone",
- "mediaPermissionsDescription": "Allow access to microphone.",
- "spellCheckTitle": "Spell Check",
- "spellCheckDescription": "Enable spell check when typing messages.",
- "spellCheckDirty": "You must restart Session to apply your new settings",
- "readReceiptSettingDescription": "Send read receipts in one-to-one chats.",
- "readReceiptSettingTitle": "Read Receipts",
- "typingIndicatorsSettingDescription": "See and share typing indicators in one-to-one chats.",
- "typingIndicatorsSettingTitle": "Typing Indicators",
- "zoomFactorSettingTitle": "Zoom Factor",
- "themesSettingTitle": "Themes",
- "primaryColor": "Primary Colour",
- "primaryColorGreen": "Primary color green",
- "primaryColorBlue": "Primary color blue",
- "primaryColorYellow": "Primary color yellow",
- "primaryColorPink": "Primary color pink",
- "primaryColorPurple": "Primary color purple",
- "primaryColorOrange": "Primary color orange",
- "primaryColorRed": "Primary color red",
- "classicDarkThemeTitle": "Classic Dark",
- "classicLightThemeTitle": "Classic Light",
- "oceanDarkThemeTitle": "Ocean Dark",
- "oceanLightThemeTitle": "Ocean Light",
- "pruneSettingTitle": "Trim Communities",
- "pruneSettingDescription": "Delete messages older than 6 months from Communities that have over 2,000 messages.",
- "enable": "Enable",
- "keepDisabled": "Keep disabled",
- "notificationSettingsDialog": "The information shown in notifications.",
- "nameAndMessage": "Name & Content",
- "noNameOrMessage": "No name or content",
- "nameOnly": "Name Only",
- "newMessage": "New Message",
- "createConversationNewContact": "Create a conversation with a new contact",
- "createConversationNewGroup": "Create a group with existing contacts",
- "joinACommunity": "Join a community",
- "chooseAnAction": "Choose an action to start a conversation",
- "newMessages": "New Messages",
- "notificationMostRecentFrom": "Most recent from: $name$",
- "notificationFrom": "From:",
- "notificationMostRecent": "Most recent:",
- "sendFailed": "Send Failed",
- "mediaMessage": "Media message",
- "messageBodyMissing": "Please enter a message body.",
- "messageBody": "Message body",
- "unblockToSend": "Unblock this contact to send a message.",
- "unblockGroupToSend": "This group is blocked. Unblock it if you would like to send a message.",
- "timer": "Timer",
- "timerModeRead": "read",
- "timerModeSent": "sent",
- "confirm": "Confirm",
- "messageHash": "Message Hash",
- "serverId": "Server ID",
- "expirationType": "Expiration Type",
- "expirationDuration": "Expiration Duration",
- "disappears": "Disappears",
- "messageWillDisappear": "Messages will disappear in $countAndUnit$",
- "followSetting": "Follow Setting",
- "followSettingDisabled": "Messages you send will no longer disappear. Are you sure you want to turn off disappearing messages?",
- "followSettingTimeAndType": "Set your messages to disappear $time$ after they have been $type$ ?",
- "youChangedTheTimer": "You have set messages to disappear $time$ after they have been $mode$ ",
- "youChangedTheTimerLegacy": "You set the disappearing message timer to $time$ ",
- "theyChangedTheTimer": "$name$ has set messages to disappear $time$ after they have been $mode$ ",
- "theyChangedTheTimerLegacy": "$name$ set the disappearing message timer to $time$ ",
- "timerOption_0_seconds": "Off",
- "timerOption_5_seconds": "5 seconds",
- "timerOption_10_seconds": "10 seconds",
- "timerOption_30_seconds": "30 seconds",
- "timerOption_1_minute": "1 minute",
- "timerOption_5_minutes": "5 minutes",
- "timerOption_30_minutes": "30 minutes",
- "timerOption_1_hour": "1 hour",
- "timerOption_6_hours": "6 hours",
- "timerOption_12_hours": "12 hours",
- "timerOption_1_day": "1 day",
- "timerOption_1_week": "1 week",
- "timerOption_2_weeks": "2 weeks",
- "timerOption_0_seconds_abbreviated": "off",
- "timerOption_5_seconds_abbreviated": "5s",
- "timerOption_10_seconds_abbreviated": "10s",
- "timerOption_30_seconds_abbreviated": "30s",
- "timerOption_1_minute_abbreviated": "1m",
- "timerOption_5_minutes_abbreviated": "5m",
- "timerOption_30_minutes_abbreviated": "30m",
- "timerOption_1_hour_abbreviated": "1h",
- "timerOption_6_hours_abbreviated": "6h",
- "timerOption_12_hours_abbreviated": "12h",
- "timerOption_1_day_abbreviated": "1d",
- "timerOption_1_week_abbreviated": "1w",
- "timerOption_2_weeks_abbreviated": "2w",
+ "deleteForEveryone": "Delete for everyone",
+ "deleteJustForMe": "Delete just for me",
+ "deleteMessageQuestion": "Delete this message?",
+ "deleteMessages": "Delete Messages",
+ "deleteMessagesConfirmation": "Permanently delete the messages in this conversation?",
+ "deleteMessagesQuestion": "Delete $count$ messages?",
+ "destination": "Destination",
+ "device": "Device",
+ "deviceOnly": "Clear Device Only",
+ "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?",
+ "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$",
+ "dialogClearAllDataDeletionFailedTitle": "Data not deleted",
+ "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?",
+ "dialogClearAllDataDeletionQuestion": "Would you like to clear this device only, or delete your data from the network as well?",
+ "disabledDisappearingMessages": "$name$ has turned off disappearing messages.",
"disappearingMessages": "Disappearing messages",
- "disappearingMessagesModeOutdated": "$name$ is using an outdated client. Disappearing messages may not work as expected.",
- "disappearingMessagesModeLabel": "Delete Type",
- "disappearingMessagesModeOff": "Off",
+ "disappearingMessagesDisabled": "Disappearing messages disabled",
"disappearingMessagesModeAfterRead": "Disappear After Read",
"disappearingMessagesModeAfterReadSubtitle": "Messages delete after they have been read.",
"disappearingMessagesModeAfterSend": "Disappear After Send",
"disappearingMessagesModeAfterSendSubtitle": "Messages delete after they have been sent.",
+ "disappearingMessagesModeLabel": "Delete Type",
"disappearingMessagesModeLegacy": "Legacy",
"disappearingMessagesModeLegacySubtitle": "Original version of disappearing messages.",
- "disappearingMessagesDisabled": "Disappearing messages disabled",
- "disabledDisappearingMessages": "$name$ has turned off disappearing messages.",
- "youDisabledDisappearingMessages": "You have turned off disappearing messages.",
- "youDisabledYourDisappearingMessages": "You turned off disappearing messages. Messages you send will no longer disappear.",
- "youSetYourDisappearingMessages": "You set your messages to disappear $time$ after they have been $type$ .",
- "theyDisabledTheirDisappearingMessages": "$name$ has turned off disappearing messages. Messages they send will no longer disappear.",
- "theySetTheirDisappearingMessages": "$name$ has set their messages to disappear $time$ after they have been $type$ .",
- "timerSetTo": "Disappearing message time set to $time$",
- "set": "Set",
- "changeNickname": "Change Nickname",
- "clearNickname": "Clear Nickname",
- "nicknamePlaceholder": "New Nickname",
- "changeNicknameMessage": "Enter a nickname for this user",
- "noteToSelf": "Note to Self",
- "savedMessages": "Saved Messages",
- "hideMenuBarTitle": "Hide Menu Bar",
- "hideMenuBarDescription": "Toggle system menu bar visibility.",
- "matchThemeSystemSettingTitle": "Auto dark-mode",
- "matchThemeSystemSettingDescription": "Match system settings",
- "startConversation": "Start New Conversation",
- "invalidNumberError": "Please check the Session ID or ONS name and try again",
+ "disappearingMessagesModeOff": "Off",
+ "disappearingMessagesModeOutdated": "$name$ is using an outdated client. Disappearing messages may not work as expected.",
+ "disappears": "Disappears",
+ "displayName": "Display Name",
+ "displayNameDescription": "It can be your real name, an alias, or anything else you like — and you can change it any time.",
+ "displayNameEmpty": "Please enter a display name",
+ "displayNameErrorDescriptionShorter": "Please pick a shorter display name",
+ "displayNameErrorNew": "We were unable to load your display name. Please enter a new display name to continue.",
+ "displayNameNew": "Pick a new display name",
+ "displayNamePick": "Pick your display name",
+ "displayNameTooLong": "Display name is too long",
+ "document": "Document",
+ "documents": "Documents",
+ "documentsEmptyState": "No documents",
+ "done": "Done",
+ "downloadAttachment": "Download Attachment",
+ "duration": "Duration",
+ "editGroup": "Edit group",
+ "editGroupName": "Edit group name",
+ "editMenuCopy": "Copy",
+ "editMenuCut": "Cut",
+ "editMenuDeleteContact": "Delete Contact",
+ "editMenuDeleteGroup": "Delete Group",
+ "editMenuPaste": "Paste",
+ "editMenuRedo": "Redo",
+ "editMenuSelectAll": "Select all",
+ "editMenuUndo": "Undo",
+ "editProfileModalTitle": "Profile",
+ "emptyGroupNameError": "Please enter a group name",
+ "enable": "Enable",
+ "endCall": "End call",
+ "enterAnOpenGroupURL": "Enter Community URL",
+ "enterDisplayName": "Enter a display name",
+ "enterKeySettingDescription": "Function of the enter key when typing in a conversation.",
+ "enterKeySettingTitle": "Enter Key",
+ "enterNewLineDescription": "SHIFT + ENTER sends a message, ENTER starts a new line",
+ "enterNewPassword": "Please enter your new password",
+ "enterPassword": "Please enter your password",
+ "enterSendNewMessageDescription": "ENTER sends a message, SHIFT + ENTER starts a new line",
+ "entireAccount": "Clear Device and Network",
+ "error": "Error",
+ "establishingConnection": "Establishing connection...",
+ "expandedReactionsText": "Show Less",
+ "expirationDuration": "Expiration Duration",
+ "expirationType": "Expiration Type",
+ "failed": "Failed",
"failedResolveOns": "Failed to resolve ONS name",
- "autoUpdateSettingTitle": "Auto Update",
- "autoUpdateSettingDescription": "Automatically check for updates on startup.",
- "autoUpdateNewVersionTitle": "Session update available",
- "autoUpdateNewVersionMessage": "There is a new version of Session available.",
- "autoUpdateNewVersionInstructions": "Press Restart Session to apply the updates.",
- "autoUpdateRestartButtonLabel": "Restart Session",
- "autoUpdateLaterButtonLabel": "Later",
- "autoUpdateDownloadButtonLabel": "Download",
- "autoUpdateDownloadedMessage": "Update has been downloaded.",
- "autoUpdateDownloadInstructions": "Would you like to download the update?",
- "leftTheGroup": "$name$ has left the group.",
- "multipleLeftTheGroup": "$name$ left the group",
- "updatedTheGroup": "Group updated",
- "titleIsNow": "Group name is now '$name$'.",
+ "failedToAddAsModerator": "Failed to add user as admin",
+ "failedToRemoveFromModerator": "Failed to remove user from the admin list",
+ "failedToSendMessage": "Failed to send message",
+ "faq": "FAQ",
+ "fileId": "File ID",
+ "fileSize": "File Size",
+ "fileSizeWarning": "Attachment exceeds size limits for the type of message you're sending.",
+ "fileType": "File Type",
+ "followSetting": "Follow Setting",
+ "followSettingDisabled": "Messages you send will no longer disappear. Are you sure you want to turn off disappearing messages?",
+ "followSettingTimeAndType": "Set your messages to disappear $time$ after they have been $type$ ?",
+ "from": "From:",
+ "getStarted": "Get started",
+ "goToReleaseNotes": "Go to Release Notes",
+ "goToSupportPage": "Go to Support Page",
+ "groupMembers": "Members",
+ "groupNamePlaceholder": "Group Name",
+ "helpSettingsTitle": "Help",
+ "helpUsTranslateSession": "Translate Session",
+ "hide": "Hide",
+ "hideBanner": "Hide",
+ "hideConversation": "Hide Conversation",
+ "hideMenuBarDescription": "Toggle system menu bar visibility.",
+ "hideMenuBarTitle": "Hide Menu Bar",
+ "hideNoteToSelfConfirmation": "Are you sure you want to hide your Note to Self conversation?",
+ "hideRequestBanner": "Hide Message Request Banner",
+ "hideRequestBannerDescription": "Hide the Message Request banner until you receive a new message request.",
+ "iAmSure": "I am sure",
+ "image": "Image",
+ "imageAttachmentAlt": "Image attached to message",
+ "imageCaptionIconAlt": "Icon showing that this image has a caption",
+ "incomingCallFrom": "Incoming call from '$name$'",
+ "incomingError": "Error handling incoming message",
+ "invalidGroupNameTooLong": "Please enter a shorter group name",
+ "invalidGroupNameTooShort": "Please enter a group name",
+ "invalidOldPassword": "Old password is invalid",
+ "invalidOpenGroupUrl": "Invalid URL",
+ "invalidPassword": "Invalid password",
+ "invalidPubkeyFormat": "Invalid Pubkey Format",
+ "inviteContacts": "Invite Contacts",
+ "join": "Join",
+ "joinACommunity": "Join a community",
"joinedTheGroup": "$name$ joined the group.",
- "multipleJoinedTheGroup": "$name$ joined the group.",
+ "joinOpenGroup": "Join Community",
+ "joinOpenGroupAfterInvitationConfirmationDesc": "Are you sure you want to join the $roomName$ community?",
+ "joinOpenGroupAfterInvitationConfirmationTitle": "Join $roomName$?",
+ "keepDisabled": "Keep disabled",
"kickedFromTheGroup": "$name$ was removed from the group.",
- "multipleKickedFromTheGroup": "$name$ were removed from the group.",
- "block": "Block",
- "unblock": "Unblock",
- "unblocked": "Unblocked",
- "blocked": "Blocked",
- "blockedSettingsTitle": "Blocked Contacts",
- "conversationsSettingsTitle": "Conversations",
- "unbanUser": "Unban User",
- "userUnbanned": "User unbanned successfully",
- "userUnbanFailed": "Unban failed!",
- "banUser": "Ban User",
- "banUserAndDeleteAll": "Ban and Delete All",
- "userBanned": "Banned successfully",
- "userBanFailed": "Ban failed!",
+ "learnMore": "Learn more",
"leave": "Leave",
- "leaveGroup": "Leave Group",
"leaveAndRemoveForEveryone": "Leave Group and Remove for Everyone",
+ "leaveCommunity": "Leave Community",
+ "leaveCommunityFailed": "Failed to leave Community!",
+ "leaveCommunityFailedPleaseTryAgain": "Unable to leave the Community, please try again",
+ "leaveGroup": "Leave Group",
"leaveGroupConfirmation": "Are you sure you want to leave $name$ ?",
"leaveGroupConfirmationAdmin": "As you are the admin of this group, if you leave it it will be removed for every current members. Are you sure you want to leave this group?",
- "leaveGroupConrirmationOnlyAdminLegacy": "Are you sure you want to leave $name$ ? This will deactivate the group for all members.",
"leaveGroupConfirmationOnlyAdmin": "You are the only admin in $name$ ",
"leaveGroupConfirmationOnlyAdminWarning": "Group settings and members cannot be changed without an admin",
+ "leaveGroupConrirmationOnlyAdminLegacy": "Are you sure you want to leave $name$ ? This will deactivate the group for all members.",
"leaveGroupFailed": "Failed to leave Group!",
"leaveGroupFailedPleaseTryAgain": "Unable to leave the Group, please try again",
- "leaveCommunity": "Leave Community",
- "leaveCommunityFailed": "Failed to leave Community!",
- "leaveCommunityFailedPleaseTryAgain": "Unable to leave the Community, please try again",
- "cannotRemoveCreatorFromGroup": "Cannot remove this user",
- "cannotRemoveCreatorFromGroupDesc": "You cannot remove this user as they are the creator of the group.",
- "noContactsForGroup": "You don't have any contacts yet",
- "failedToAddAsModerator": "Failed to add user as admin",
- "failedToRemoveFromModerator": "Failed to remove user from the admin list",
- "copyMessage": "Copy message text",
- "selectMessage": "Select message",
- "editGroup": "Edit group",
- "editGroupName": "Edit group name",
- "updateGroupDialogTitle": "Updating $name$...",
- "showRecoveryPhrase": "Recovery Phrase",
- "yourSessionID": "Your Session ID",
- "setAccountPasswordTitle": "Password",
- "setAccountPasswordDescription": "Require password to unlock Session.",
- "changeAccountPasswordTitle": "Change Password",
- "changeAccountPasswordDescription": "Change the password required to unlock Session.",
- "removeAccountPasswordTitle": "Remove Password",
- "removeAccountPasswordDescription": "Remove the password required to unlock Session.",
- "enterPassword": "Please enter your password",
- "confirmPassword": "Confirm password",
- "enterNewPassword": "Please enter your new password",
- "confirmNewPassword": "Confirm new password",
- "showRecoveryPhrasePasswordRequest": "Please enter your password",
- "recoveryPhraseSavePromptMain": "Your recovery phrase is the master key to your Session ID — you can use it to restore your Session ID if you lose access to your device. Store your recovery phrase in a safe place, and don't give it to anyone.",
- "invalidOpenGroupUrl": "Invalid URL",
- "copiedToClipboard": "Copied",
- "passwordViewTitle": "Enter Password",
- "password": "Password",
- "setPassword": "Set Password",
- "changePassword": "Change Password",
- "createPassword": "Create your password",
- "removePassword": "Remove Password",
+ "leaving": "Leaving...",
+ "leftTheGroup": "$name$ has left the group.",
+ "lightboxImageAlt": "Image sent in conversation",
+ "linkPreviewDescription": "Generate link previews for supported URLs.",
+ "linkPreviewsConfirmMessage": "You will not have full metadata protection when sending link previews.",
+ "linkPreviewsTitle": "Send Link Previews",
+ "linkVisitWarningMessage": "Are you sure you want to open $url$ in your browser?",
+ "linkVisitWarningTitle": "Open this link in your browser?",
+ "loadAccountProgressMessage": "Loading your account",
+ "loading": "Loading...",
+ "lockApp": "Lock App",
+ "mainMenuEdit": "&Edit",
+ "mainMenuFile": "&File",
+ "mainMenuHelp": "&Help",
+ "mainMenuView": "&View",
+ "mainMenuWindow": "&Window",
+ "markAllAsRead": "Mark Read",
+ "markUnread": "Mark Unread",
+ "matchThemeSystemSettingDescription": "Match system settings",
+ "matchThemeSystemSettingTitle": "Auto dark-mode",
+ "maximumAttachments": "Maximum number of attachments reached. Please send remaining attachments in a separate message.",
"maxPasswordAttempts": "Invalid Password. Would you like to reset the database?",
- "typeInOldPassword": "Please enter your current password",
- "invalidOldPassword": "Old password is invalid",
- "invalidPassword": "Invalid password",
- "noGivenPassword": "Please enter your password",
- "passwordsDoNotMatch": "Passwords do not match",
- "setPasswordInvalid": "Passwords do not match",
- "changePasswordInvalid": "The old password you entered is incorrect",
- "removePasswordInvalid": "Incorrect password",
- "setPasswordTitle": "Password Set",
- "changePasswordTitle": "Password Changed",
- "removePasswordTitle": "Password Removed",
- "setPasswordToastDescription": "Your password has been set. Please keep it safe.",
- "changePasswordToastDescription": "Your password has been changed. Please keep it safe.",
- "removePasswordToastDescription": "Your password has been removed.",
- "publicChatExists": "You are already connected to this community",
- "connectToServerFail": "Couldn't join community",
- "connectingToServer": "Connecting...",
- "connectToServerSuccess": "Successfully connected to community",
- "setPasswordFail": "Failed to set password",
- "passwordLengthError": "Password must be between 6 and 64 characters long",
- "passwordTypeError": "Password must be a string",
- "passwordCharacterError": "Password must only contain letters, numbers and symbols",
- "remove": "Remove",
- "invalidSessionId": "Invalid Session ID",
- "invalidPubkeyFormat": "Invalid Pubkey Format",
- "emptyGroupNameError": "Please enter a group name",
- "editProfileModalTitle": "Profile",
- "groupNamePlaceholder": "Group Name",
- "inviteContacts": "Invite Contacts",
- "addModerator": "Add Admin",
- "addModerators": "Add Admins",
- "removeModerators": "Remove Admins",
- "addAsModerator": "Add as Admin",
- "removeFromModerators": "Remove From Admins",
- "add": "Add",
- "addingContacts": "Adding contacts to $name$",
- "noContactsToAdd": "No contacts to add",
- "noMembersInThisGroup": "No other members in this group",
- "noModeratorsToRemove": "no admins to remove",
- "onlyAdminCanRemoveMembers": "You are not the creator",
- "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users",
- "createAccount": "Create account",
- "startInTrayTitle": "Keep in System Tray",
- "startInTrayDescription": "Keep Session running in the background when you close the window.",
- "yourUniqueSessionID": "Say hello to your Session ID",
- "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.",
- "getStarted": "Get started",
- "createSessionID": "Create Session ID",
- "recoveryPhrase": "Recovery Phrase",
- "enterRecoveryPhrase": "Enter your recovery phrase",
- "displayName": "Display Name",
- "anonymous": "Anonymous",
- "removeResidueMembers": "Clicking ok will also remove those members as they left the group.",
- "enterDisplayName": "Enter a display name",
- "continueYourSession": "Continue Your Session",
- "linkDevice": "Link Device",
- "restoreUsingRecoveryPhrase": "Restore your account",
- "or": "or",
- "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy ",
- "beginYourSession": "Begin your Session.",
- "welcomeToYourSession": "Welcome to your Session",
- "searchFor...": "Search conversations and contacts",
- "searchForContactsOnly": "Search for contacts",
- "enterSessionID": "Enter Session ID",
- "enterSessionIDOfRecipient": "Enter your contact's Session ID or ONS",
- "message": "Message",
- "appearanceSettingsTitle": "Appearance",
- "privacySettingsTitle": "Privacy",
- "notificationsSettingsTitle": "Notifications",
- "audioNotificationsSettingsTitle": "Audio Notifications",
- "notificationsSettingsContent": "Notification Content",
- "notificationPreview": "Preview",
- "recoveryPhraseEmpty": "Enter your recovery phrase",
- "displayNameEmpty": "Please enter a display name",
- "displayNameTooLong": "Display name is too long",
+ "media": "Media",
+ "mediaEmptyState": "No media",
+ "mediaMessage": "Media message",
+ "mediaPermissionsDescription": "Allow access to microphone.",
+ "mediaPermissionsTitle": "Microphone",
"members": "$count$ members",
- "activeMembers": "$count$ active members",
- "join": "Join",
- "joinOpenGroup": "Join Community",
- "createGroup": "Create Group",
- "create": "Create",
- "createClosedGroupNamePrompt": "Group Name",
- "createClosedGroupPlaceholder": "Enter a group name",
- "openGroupURL": "Community URL",
- "enterAnOpenGroupURL": "Enter Community URL",
+ "message": "Message",
+ "messageBody": "Message body",
+ "messageBodyMissing": "Please enter a message body.",
+ "messageDeletedPlaceholder": "This message has been deleted",
+ "messageDeletionForbidden": "You don’t have permission to delete others’ messages",
+ "messageHash": "Message Hash",
+ "messageInfo": "Message Info",
+ "messageNewDescription": "Start a new conversation by entering your friend's Account ID or ONS.",
+ "messageRequestAccepted": "Your message request has been accepted",
+ "messageRequestAcceptedOurs": "You have accepted $name$'s message request",
+ "messageRequestAcceptedOursNoName": "You have accepted the message request",
+ "messageRequestPending": "Your message request is currently pending",
+ "messageRequests": "Message Requests",
+ "messageRequestsAcceptDescription": "Sending a message to this user will automatically accept their message request and reveal your Account ID.",
+ "messagesHeader": "Conversations",
+ "messageWillDisappear": "Messages will disappear in $countAndUnit$",
+ "moreInformation": "More information",
+ "multipleJoinedTheGroup": "$name$ joined the group.",
+ "multipleKickedFromTheGroup": "$name$ were removed from the group.",
+ "multipleLeftTheGroup": "$name$ left the group",
+ "mustBeApproved": "This conversation must be accepted to use this feature",
+ "nameAndMessage": "Name & Content",
+ "nameOnly": "Name Only",
+ "newMessage": "New Message",
+ "newMessages": "New Messages",
"next": "Next",
- "invalidGroupNameTooShort": "Please enter a group name",
- "invalidGroupNameTooLong": "Please enter a shorter group name",
- "pickClosedGroupMember": "Please pick at least 1 group member",
- "closedGroupMaxSize": "A group cannot have more than 100 members",
+ "nicknamePlaceholder": "New Nickname",
+ "noAudioInputFound": "No audio input found",
+ "noAudioOutputFound": "No audio output found",
"noBlockedContacts": "You have no blocked contacts.",
- "userAddedToModerators": "User added to admin list",
- "userRemovedFromModerators": "User removed from admin list",
- "orJoinOneOfThese": "Or join one of these...",
- "helpUsTranslateSession": "Translate Session",
- "closedGroupInviteFailTitle": "Group Invitation Failed",
- "closedGroupInviteFailTitlePlural": "Group Invitations Failed",
- "closedGroupInviteFailMessage": "Unable to successfully invite a group member",
- "closedGroupInviteFailMessagePlural": "Unable to successfully invite all group members",
- "closedGroupInviteOkText": "Retry invitations",
- "closedGroupInviteSuccessTitlePlural": "Group Invitations Completed",
- "closedGroupInviteSuccessTitle": "Group Invitation Succeeded",
- "closedGroupInviteSuccessMessage": "Successfully invited group members",
+ "noCameraFound": "No camera found",
+ "noContactsForGroup": "You don't have any contacts yet",
+ "noContactsToAdd": "No contacts to add",
+ "noGivenPassword": "Please enter your password",
+ "noMediaUntilApproved": "You cannot send attachments until the conversation is approved",
+ "noMembersInThisGroup": "No other members in this group",
+ "noMessageRequestsPending": "No pending message requests",
+ "noMessagesInBlindedDisabledMsgRequests": "$name$ has message requests from Community conversations turned off, so you cannot send them a message.",
+ "noMessagesInEverythingElse": "You have no messages from $name$ . Send a message to start the conversation!",
+ "noMessagesInNoteToSelf": "You have no messages in $name$ .",
+ "noMessagesInReadOnly": "There are no messages in $name$ .",
+ "noModeratorsToRemove": "no admins to remove",
+ "noNameOrMessage": "No name or content",
+ "noSearchResults": "No results found for \"$searchTerm$\"",
+ "notApplicable": "N/A",
+ "noteToSelf": "Note to Self",
"notificationForConvo": "Notifications",
"notificationForConvo_all": "All",
"notificationForConvo_disabled": "Disabled",
"notificationForConvo_mentions_only": "Mentions only",
- "onionPathIndicatorTitle": "Path",
+ "notificationFrom": "From:",
+ "notificationMostRecent": "Most recent:",
+ "notificationMostRecentFrom": "Most recent from: $name$",
+ "notificationPreview": "Preview",
+ "notificationSettingsDialog": "The information shown in notifications.",
+ "notificationsSettingsContent": "Notification Content",
+ "notificationsSettingsTitle": "Notifications",
+ "notificationSubtitle": "Notifications - $setting$",
+ "oceanDarkThemeTitle": "Ocean Dark",
+ "oceanLightThemeTitle": "Ocean Light",
+ "offline": "Offline",
+ "ok": "OK",
+ "onboardingAccountCreate": "Create account",
+ "onboardingAccountCreated": "Account Created",
+ "onboardingAccountExists": "I have an account",
+ "onboardingBubbleWelcomeToSession": "Welcome to Session",
+ "onboardingHitThePlusButton": "Hit the plus button to start a chat, create a group, or join an official community!",
+ "onboardingRecoveryPassword": "Enter your recovery password to load your account. If you haven't saved it, you can find it in your app settings.",
+ "onboardingTosPrivacy": "By using this service, you agree to our Terms of Service and Privacy Policy ",
+ "oneNonImageAtATimeToast": "Sorry, there is a limit of one non-image attachment per message",
"onionPathIndicatorDescription": "Session hides your IP by bouncing your messages through several Service Nodes in Session's decentralized network. These are the countries your connection is currently being bounced through:",
- "unknownCountry": "Unknown Country",
- "device": "Device",
- "destination": "Destination",
- "learnMore": "Learn more",
- "linkVisitWarningTitle": "Open this link in your browser?",
- "linkVisitWarningMessage": "Are you sure you want to open $url$ in your browser?",
+ "onionPathIndicatorTitle": "Path",
+ "onlyAdminCanRemoveMembers": "You are not the creator",
+ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users",
+ "onlyGroupAdminsCanChange": "Only group admins can change this setting.",
+ "onsErrorNotRecognised": "We couldn't recognise this ONS. Please check it and try again.",
"open": "Open",
- "audioMessageAutoplayTitle": "Autoplay Audio Messages",
- "audioMessageAutoplayDescription": "Autoplay consecutive audio messages.",
- "enterKeySettingTitle": "Enter Key",
- "enterKeySettingDescription": "Function of the enter key when typing in a conversation.",
- "enterSendNewMessageDescription": "ENTER sends a message, SHIFT + ENTER starts a new line",
- "enterNewLineDescription": "SHIFT + ENTER sends a message, ENTER starts a new line",
- "clickToTrustContact": "Click to download media",
- "trustThisContactDialogTitle": "Trust $name$?",
- "trustThisContactDialogDescription": "Are you sure you want to download media sent by $name$?",
- "pinConversation": "Pin Conversation",
- "unpinConversation": "Unpin Conversation",
- "markUnread": "Mark Unread",
- "showUserDetails": "Show User Details",
- "sendRecoveryPhraseTitle": "Sending Recovery Phrase",
- "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?",
- "dialogClearAllDataDeletionFailedTitle": "Data not deleted",
- "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?",
- "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?",
- "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$",
- "dialogClearAllDataDeletionQuestion": "Would you like to clear this device only, or delete your data from the network as well?",
- "clearDevice": "Clear Device",
- "tryAgain": "Try Again",
- "areYouSureClearDevice": "Are you sure you want to clear your device?",
- "deviceOnly": "Clear Device Only",
- "entireAccount": "Clear Device and Network",
- "areYouSureDeleteDeviceOnly": "Are you sure you want to delete your device data only?",
- "areYouSureDeleteEntireAccount": "Are you sure you want to delete your data from the network? If you continue, you will not be able to restore your messages or contacts.",
- "iAmSure": "I am sure",
- "recoveryPhraseSecureTitle": "You're almost finished!",
- "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.",
- "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase",
- "notificationSubtitle": "Notifications - $setting$",
- "surveyTitle": "We'd Love Your Feedback",
- "faq": "FAQ",
- "support": "Support",
- "clearAll": "Clear All",
- "clearDataSettingsTitle": "Clear Data",
- "messageRequests": "Message Requests",
- "blindedMsgReqsSettingTitle": "Community Message Requests",
- "blindedMsgReqsSettingDesc": "Allow message requests from Community conversations.",
- "requestsSubtitle": "Pending Requests",
- "requestsPlaceholder": "No requests",
- "hideRequestBannerDescription": "Hide the Message Request banner until you receive a new message request.",
- "incomingCallFrom": "Incoming call from '$name$'",
- "ringing": "Ringing...",
- "establishingConnection": "Establishing connection...",
- "accept": "Accept",
- "decline": "Decline",
- "endCall": "End call",
- "permissionsSettingsTitle": "Permissions",
- "helpSettingsTitle": "Help",
- "cameraPermissionNeededTitle": "Voice/Video Call permissions required",
- "cameraPermissionNeeded": "You can enable the 'Voice and video calls' permission in the Privacy Settings.",
- "unableToCall": "Cancel your ongoing call first",
- "unableToCallTitle": "Cannot start new call",
- "callMissed": "Missed call from $name$",
- "callMissedTitle": "Call missed",
- "noCameraFound": "No camera found",
- "noAudioInputFound": "No audio input found",
- "noAudioOutputFound": "No audio output found",
- "callMediaPermissionsTitle": "Voice and Video Calls (Beta)",
- "callMissedCausePermission": "Call missed from '$name$' because you need to enable the 'Voice and video calls' permission in the Privacy Settings.",
- "callMissedNotApproved": "Call missed from '$name$' as you haven't approved this conversation yet. Send a message to them first.",
- "callMediaPermissionsDescription": "Enables voice and video calls to and from other users.",
- "callMediaPermissionsDialogContent": "Your IP address is visible to your call partner and an Oxen Foundation server while using beta calls. Are you sure you want to enable Voice and Video Calls?",
- "callMediaPermissionsDialogTitle": "Voice and Video Calls (Beta)",
- "startedACall": "You called $name$",
- "answeredACall": "Call with $name$",
- "trimDatabase": "Trim Database",
- "trimDatabaseDescription": "Reduces your message database size to your last 10,000 messages.",
- "trimDatabaseConfirmationBody": "Are you sure you want to delete your $deleteAmount$ oldest received messages?",
- "pleaseWaitOpenAndOptimizeDb": "Please wait while your database is opened and optimized...",
- "messageRequestPending": "Your message request is currently pending",
- "messageRequestAccepted": "Your message request has been accepted",
- "messageRequestAcceptedOurs": "You have accepted $name$'s message request",
- "messageRequestAcceptedOursNoName": "You have accepted the message request",
- "declineRequestMessage": "Are you sure you want to decline this message request?",
- "respondingToRequestWarning": "Sending a message to this user will automatically accept their message request and reveal your Session ID.",
- "hideRequestBanner": "Hide Message Request Banner",
+ "openGroupInvitation": "Community invitation",
+ "openGroupURL": "Community URL",
"openMessageRequestInbox": "Message Requests",
- "noMessageRequestsPending": "No pending message requests",
- "noMediaUntilApproved": "You cannot send attachments until the conversation is approved",
- "mustBeApproved": "This conversation must be accepted to use this feature",
- "youHaveANewFriendRequest": "You have a new friend request",
- "clearAllConfirmationTitle": "Clear All Message Requests",
- "clearAllConfirmationBody": "Are you sure you want to clear all message requests?",
- "noMessagesInReadOnly": "There are no messages in $name$ .",
- "noMessagesInBlindedDisabledMsgRequests": "$name$ has message requests from Community conversations turned off, so you cannot send them a message.",
- "noMessagesInNoteToSelf": "You have no messages in $name$ .",
- "noMessagesInEverythingElse": "You have no messages from $name$ . Send a message to start the conversation!",
- "hideBanner": "Hide",
- "someOfYourDeviceUseOutdatedVersion": "Some of your devices are using outdated versions. Syncing may be unreliable until they are updated.",
"openMessageRequestInboxDescription": "View your Message Request inbox",
- "clearAllReactions": "Are you sure you want to clear all $emoji$ ?",
- "expandedReactionsText": "Show Less",
- "reactionNotification": "Reacts to a message with $emoji$",
- "rateLimitReactMessage": "Slow down! You've sent too many emoji reacts. Try again soon",
- "otherSingular": "$number$ other",
+ "or": "or",
+ "originalMessageNotFound": "Original message not found",
+ "orJoinOneOfThese": "Or join one of these...",
"otherPlural": "$number$ others",
+ "otherSingular": "$number$ other",
+ "passwordCharacterError": "Password must only contain letters, numbers and symbols",
+ "passwordCreate": "Create your password",
+ "passwordLengthError": "Password must be between 6 and 64 characters long",
+ "passwordsDoNotMatch": "Passwords do not match",
+ "passwordTypeError": "Password must be a string",
+ "passwordViewTitle": "Enter Password",
+ "permissionsSettingsTitle": "Permissions",
+ "photo": "Photo",
+ "pickClosedGroupMember": "Please pick at least 1 group member",
+ "pinConversation": "Pin Conversation",
+ "pleaseWaitOpenAndOptimizeDb": "Please wait while your database is opened and optimized...",
+ "previewThumbnail": "Thumbnail link preview for $domain$",
+ "primaryColor": "Primary Colour",
+ "primaryColorBlue": "Primary color blue",
+ "primaryColorGreen": "Primary color green",
+ "primaryColorOrange": "Primary color orange",
+ "primaryColorPink": "Primary color pink",
+ "primaryColorPurple": "Primary color purple",
+ "primaryColorRed": "Primary color red",
+ "primaryColorYellow": "Primary color yellow",
+ "privacyPolicy": "Privacy Policy",
+ "privacySettingsTitle": "Privacy",
+ "pruneSettingDescription": "Delete messages older than 6 months from Communities that have over 2,000 messages.",
+ "pruneSettingTitle": "Trim Communities",
+ "publicChatExists": "You are already connected to this community",
+ "quoteThumbnailAlt": "Thumbnail of image from quoted message",
+ "rateLimitReactMessage": "Slow down! You've sent too many emoji reacts. Try again soon",
+ "reactionListCountPlural": "And $otherPlural$ have reacted $emoji$ to this message",
+ "reactionListCountSingular": "And $otherSingular$ has reacted $emoji$ to this message",
+ "reactionNotification": "Reacts to a message with $emoji$",
"reactionPopup": "reacted with",
+ "reactionPopupMany": "$name$, $name2$, $name3$ &",
"reactionPopupOne": "$name$",
- "reactionPopupTwo": "$name$ & $name2$",
"reactionPopupThree": "$name$, $name2$ & $name3$",
- "reactionPopupMany": "$name$, $name2$, $name3$ &",
- "reactionListCountSingular": "And $otherSingular$ has reacted $emoji$ to this message",
- "reactionListCountPlural": "And $otherPlural$ have reacted $emoji$ to this message",
+ "reactionPopupTwo": "$name$ & $name2$",
+ "read": "Read",
+ "readReceiptSettingDescription": "Send read receipts in one-to-one chats.",
+ "readReceiptSettingTitle": "Read Receipts",
+ "received": "Received",
+ "recoveryPasswordEnter": "Enter your recovery password",
+ "recoveryPasswordErrorMessageGeneric": "Please check your recovery password and try again.",
+ "recoveryPasswordErrorMessageIncorrect": "Some of the words in your Recovery Password are incorrect. Please check and try again.",
+ "recoveryPasswordErrorMessageShort": "The Recovery Password you entered is not long enough. Please check and try again.",
+ "recoveryPasswordWarningSendDescription": "This is your recovery password. If you send it to someone they'll have full access to your account.",
+ "recoveryPhraseSavePromptMain": "Your recovery password is the master key to your Account ID — you can use it to restore your Account ID if you lose access to your device. Store your recovery password in a safe place, and don't give it to anyone.",
+ "remove": "Remove",
+ "removeAccountPasswordDescription": "Remove the password required to unlock Session.",
+ "removeAccountPasswordTitle": "Remove Password",
+ "removeFromModerators": "Remove From Admins",
+ "removeModerators": "Remove Admins",
+ "removePassword": "Remove Password",
+ "removePasswordInvalid": "Incorrect password",
+ "removePasswordTitle": "Password Removed",
+ "removePasswordToastDescription": "Your password has been removed.",
+ "removeResidueMembers": "Clicking ok will also remove those members as they left the group.",
+ "replyingToMessage": "Replying to:",
+ "replyToMessage": "Reply",
+ "reportIssue": "Report a Bug",
+ "requestsPlaceholder": "No requests",
+ "requestsSubtitle": "Pending Requests",
+ "resend": "Resend",
+ "resolution": "Resolution",
+ "ringing": "Ringing...",
+ "save": "Save",
+ "saved": "Saved",
+ "savedMessages": "Saved Messages",
+ "savedTheFile": "Media saved by $name$",
+ "saveLogToDesktop": "Save log to desktop",
+ "saveRecoveryPassword": "Save your recovery password",
+ "saveRecoveryPasswordDescription": "Save your recovery password to make sure you don't lose access to your account.",
+ "searchFor...": "Search conversations and contacts",
+ "searchForContactsOnly": "Search for contacts",
+ "searchMessagesHeader": "Messages: $count$",
+ "selectMessage": "Select message",
+ "sendFailed": "Send Failed",
+ "sending": "Sending",
+ "sendMessage": "Message",
+ "sent": "Sent",
+ "serverId": "Server ID",
+ "sessionMessenger": "Session",
+ "sessionRecoveryPassword": "Recovery Password",
+ "set": "Set",
+ "setAccountPasswordDescription": "Require password to unlock Session.",
"setDisplayPicture": "Set Display Picture",
+ "setPassword": "Set Password",
+ "setPasswordFail": "Failed to set password",
+ "setPasswordInvalid": "Passwords do not match",
+ "setPasswordTitle": "Password Set",
+ "setPasswordToastDescription": "Your password has been set. Please keep it safe.",
"settingAppliesToEveryone": "This setting applies to everyone in this conversation.",
"settingAppliesToYourMessages": "This setting applies to messages you send in this conversation.",
- "onlyGroupAdminsCanChange": "Only group admins can change this setting.",
- "messageInfo": "Message Info",
- "fileId": "File ID",
- "fileSize": "File Size",
- "fileType": "File Type",
- "resolution": "Resolution",
- "duration": "Duration",
- "notApplicable": "N/A",
+ "settingsHeader": "Settings",
+ "shareBugDetails": "Export your logs, then upload the file though Session's Help Desk.",
+ "show": "Show",
+ "showDebugLog": "Export Logs",
+ "showUserDetails": "Show User Details",
+ "someOfYourDeviceUseOutdatedVersion": "Some of your devices are using outdated versions. Syncing may be unreliable until they are updated.",
+ "spellCheckDescription": "Enable spell check when typing messages.",
+ "spellCheckDirty": "You must restart Session to apply your new settings",
+ "spellCheckTitle": "Spell Check",
+ "stagedImageAttachment": "Draft image attachment: $path$",
+ "stagedPreviewThumbnail": "Draft thumbnail link preview for $domain$",
+ "startConversation": "Start New Conversation",
+ "startedACall": "You called $name$",
+ "startInTrayDescription": "Keep Session running in the background when you close the window.",
+ "startInTrayTitle": "Keep in System Tray",
+ "support": "Support",
+ "surveyTitle": "We'd Love Your Feedback",
+ "termsOfService": "Terms of Service",
+ "themesSettingTitle": "Themes",
+ "theyChangedTheTimer": "$name$ has set messages to disappear $time$ after they have been $mode$ ",
+ "theyChangedTheTimerLegacy": "$name$ set the disappearing message timer to $time$ ",
+ "theyDisabledTheirDisappearingMessages": "$name$ has turned off disappearing messages. Messages they send will no longer disappear.",
+ "theySetTheirDisappearingMessages": "$name$ has set their messages to disappear $time$ after they have been $type$ .",
+ "thisMonth": "This Month",
+ "thisWeek": "This week",
+ "timer": "Timer",
+ "timerModeRead": "read",
+ "timerModeSent": "sent",
+ "timerOption_0_seconds": "Off",
+ "timerOption_0_seconds_abbreviated": "off",
+ "timerOption_10_seconds": "10 seconds",
+ "timerOption_10_seconds_abbreviated": "10s",
+ "timerOption_12_hours": "12 hours",
+ "timerOption_12_hours_abbreviated": "12h",
+ "timerOption_1_day": "1 day",
+ "timerOption_1_day_abbreviated": "1d",
+ "timerOption_1_hour": "1 hour",
+ "timerOption_1_hour_abbreviated": "1h",
+ "timerOption_1_minute": "1 minute",
+ "timerOption_1_minute_abbreviated": "1m",
+ "timerOption_1_week": "1 week",
+ "timerOption_1_week_abbreviated": "1w",
+ "timerOption_2_weeks": "2 weeks",
+ "timerOption_2_weeks_abbreviated": "2w",
+ "timerOption_30_minutes": "30 minutes",
+ "timerOption_30_minutes_abbreviated": "30m",
+ "timerOption_30_seconds": "30 seconds",
+ "timerOption_30_seconds_abbreviated": "30s",
+ "timerOption_5_minutes": "5 minutes",
+ "timerOption_5_minutes_abbreviated": "5m",
+ "timerOption_5_seconds": "5 seconds",
+ "timerOption_5_seconds_abbreviated": "5s",
+ "timerOption_6_hours": "6 hours",
+ "timerOption_6_hours_abbreviated": "6h",
+ "timerSetTo": "Disappearing message time set to $time$",
+ "titleIsNow": "Group name is now '$name$'.",
+ "to": "To:",
+ "today": "Today",
+ "tookAScreenshot": "$name$ took a screenshot",
+ "trimDatabase": "Trim Database",
+ "trimDatabaseConfirmationBody": "Are you sure you want to delete your $deleteAmount$ oldest received messages?",
+ "trimDatabaseDescription": "Reduces your message database size to your last 10,000 messages.",
+ "trustThisContactDialogDescription": "Are you sure you want to download media sent by $name$?",
+ "trustThisContactDialogTitle": "Trust $name$?",
+ "tryAgain": "Try Again",
+ "typeInOldPassword": "Please enter your current password",
+ "typingAlt": "Typing animation for this conversation",
+ "typingIndicatorsSettingDescription": "See and share typing indicators in one-to-one chats.",
+ "typingIndicatorsSettingTitle": "Typing Indicators",
+ "unableToCall": "Cancel your ongoing call first",
+ "unableToCallTitle": "Cannot start new call",
+ "unableToLoadAttachment": "Sorry, there was an error setting your attachment.",
+ "unbanUser": "Unban User",
+ "unblock": "Unblock",
+ "unblocked": "Unblocked",
+ "unblockGroupToSend": "This group is blocked. Unblock it if you would like to send a message.",
+ "unblockToSend": "Unblock this contact to send a message.",
+ "unknown": "Unknown",
+ "unknownCountry": "Unknown Country",
"unknownError": "Unknown Error",
- "displayNameErrorNew": "We were unable to load your display name. Please enter a new display name to continue."
+ "unpinConversation": "Unpin Conversation",
+ "unreadMessages": "Unread Messages",
+ "updatedTheGroup": "Group updated",
+ "updateGroupDialogTitle": "Updating $name$...",
+ "urlOpen": "Open URL",
+ "urlOpenBrowser": "This will open in your browser.",
+ "userAddedToModerators": "User added to admin list",
+ "userBanFailed": "Ban failed!",
+ "userBanned": "Banned successfully",
+ "userRemovedFromModerators": "User removed from admin list",
+ "userUnbanFailed": "Unban failed!",
+ "userUnbanned": "User unbanned successfully",
+ "video": "Video",
+ "videoAttachmentAlt": "Screenshot of video in message",
+ "viewMenuResetZoom": "Actual Size",
+ "viewMenuToggleDevTools": "Toggle Developer Tools",
+ "viewMenuToggleFullScreen": "Toggle Full Screen",
+ "viewMenuZoomIn": "Zoom In",
+ "viewMenuZoomOut": "Zoom Out",
+ "voiceMessage": "Voice Message",
+ "waitOneMoment": "One moment please...",
+ "warning": "Warning",
+ "welcomeToYourSession": "Welcome to your Session",
+ "windowMenuClose": "Close Window",
+ "windowMenuMinimize": "Minimize",
+ "windowMenuZoom": "Zoom",
+ "yesterday": "Yesterday",
+ "you": "You",
+ "youChangedTheTimer": "You have set messages to disappear $time$ after they have been $mode$ ",
+ "youChangedTheTimerLegacy": "You set the disappearing message timer to $time$ ",
+ "youDisabledDisappearingMessages": "You have turned off disappearing messages.",
+ "youDisabledYourDisappearingMessages": "You turned off disappearing messages. Messages you send will no longer disappear.",
+ "youGotKickedFromGroup": "You were removed from the group.",
+ "youHaveANewFriendRequest": "You have a new friend request",
+ "youLeftTheGroup": "You have left the group.",
+ "youSetYourDisappearingMessages": "You set your messages to disappear $time$ after they have been $type$ .",
+ "zoomFactorSettingTitle": "Zoom Factor"
}
diff --git a/about_preload.js b/about_preload.js
index 27f48d231e..93e2fe5471 100644
--- a/about_preload.js
+++ b/about_preload.js
@@ -9,9 +9,6 @@ const config = url.parse(window.location.toString(), true).query;
const { locale } = config;
const localeMessages = ipcRenderer.sendSync('locale-data');
-window.React = require('react');
-window.ReactDOM = require('react-dom');
-
window.theme = config.theme;
window.i18n = i18n.setupi18n(locale, localeMessages);
diff --git a/background.html b/background.html
index 2c8343a227..69633a779a 100644
--- a/background.html
+++ b/background.html
@@ -31,7 +31,7 @@
-
+
diff --git a/debug_log_preload.js b/debug_log_preload.js
index d5af17afe3..196749151b 100644
--- a/debug_log_preload.js
+++ b/debug_log_preload.js
@@ -14,9 +14,6 @@ const localeMessages = ipcRenderer.sendSync('locale-data');
window._ = require('lodash');
-window.React = require('react');
-window.ReactDOM = require('react-dom');
-
window.getVersion = () => config.version;
window.theme = config.theme;
window.i18n = i18n.setupi18n(locale, localeMessages);
diff --git a/images/hero.png b/images/hero.png
new file mode 100755
index 0000000000..3a71e1a748
Binary files /dev/null and b/images/hero.png differ
diff --git a/images/party-popper.svg b/images/party-popper.svg
new file mode 100644
index 0000000000..6fba0503bd
--- /dev/null
+++ b/images/party-popper.svg
@@ -0,0 +1 @@
+
diff --git a/images/session/session-text.svg b/images/session/session-text.svg
index 030d37b767..eea5ee032a 100644
--- a/images/session/session-text.svg
+++ b/images/session/session-text.svg
@@ -1,42 +1,4 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/images/session/session_shield.svg b/images/session/session_shield.svg
new file mode 100644
index 0000000000..b5b87975c6
--- /dev/null
+++ b/images/session/session_shield.svg
@@ -0,0 +1 @@
+
diff --git a/package.json b/package.json
index 8e754b913b..d6e7e015b5 100644
--- a/package.json
+++ b/package.json
@@ -22,8 +22,8 @@
"lodash": "^4.17.20",
"ini": "^1.3.6",
"ejs": "^3.1.7",
- "react": "17.0.2",
- "@types/react": "17.0.2",
+ "react": "18.2.0",
+ "@types/react": "18.2.55",
"glob-parent": "^6.0.1",
"got": "^11.8.5",
"jpeg-js": "^0.4.4",
@@ -92,10 +92,11 @@
"filesize": "3.6.1",
"firstline": "1.2.1",
"focus-trap-react": "^10.2.3",
+ "framer-motion": "^11.0.3",
"fs-extra": "9.0.0",
"glob": "7.1.2",
"image-type": "^4.1.0",
- "libsession_util_nodejs": "https://github.com/oxen-io/libsession-util-nodejs/releases/download/v0.3.1/libsession_util_nodejs-v0.3.1.tar.gz",
+ "libsession_util_nodejs": "https://github.com/oxen-io/libsession-util-nodejs/releases/download/v0.3.4/libsession_util_nodejs-v0.3.4.tar.gz",
"libsodium-wrappers-sumo": "^0.7.9",
"linkify-it": "^4.0.1",
"lodash": "^4.17.21",
@@ -109,9 +110,9 @@
"pify": "3.0.0",
"protobufjs": "^7.2.4",
"rc-slider": "^10.2.1",
- "react": "^17.0.2",
+ "react": "^18.2.0",
"react-contexify": "^6.0.0",
- "react-dom": "^17.0.2",
+ "react-dom": "^18.2.0",
"react-draggable": "^4.4.4",
"react-h5-audio-player": "^3.2.0",
"react-intersection-observer": "^9.7.0",
@@ -158,8 +159,8 @@
"@types/mocha": "5.0.0",
"@types/node-fetch": "^2.5.7",
"@types/pify": "3.0.2",
- "@types/react": "^17.0.2",
- "@types/react-dom": "^17.0.2",
+ "@types/react": "^18.2.55",
+ "@types/react-dom": "^18.2.19",
"@types/react-redux": "^7.1.24",
"@types/react-virtualized": "9.18.12",
"@types/redux-logger": "3.0.7",
diff --git a/password.html b/password.html
index 40e2312214..1e61f9f4b8 100644
--- a/password.html
+++ b/password.html
@@ -29,7 +29,7 @@
-
+
diff --git a/password_preload.js b/password_preload.js
index ed8262bc39..7c6912dc3f 100644
--- a/password_preload.js
+++ b/password_preload.js
@@ -9,9 +9,6 @@ const config = url.parse(window.location.toString(), true).query;
const { locale } = config;
const localeMessages = ipcRenderer.sendSync('locale-data');
-window.React = require('react');
-window.ReactDOM = require('react-dom');
-
// If the app is locked we can't access the database to check the theme.
window.theme = 'classic-dark';
window.primaryColor = 'green';
diff --git a/preload.js b/preload.js
index 5805bcb493..0ec1831b24 100644
--- a/preload.js
+++ b/preload.js
@@ -243,9 +243,6 @@ setInterval(() => {
window.nodeSetImmediate(() => {});
}, 1000);
-window.React = require('react');
-window.ReactDOM = require('react-dom');
-
window.clipboard = clipboard;
window.getSeedNodeList = () =>
diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss
index 653c1d837c..e78ebbf5ad 100644
--- a/stylesheets/_global.scss
+++ b/stylesheets/_global.scss
@@ -122,6 +122,27 @@ a {
animation: loading 1500ms ease infinite 666ms;
}
}
+
+ .session-full-logo {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin: auto;
+
+ .session-brand-logo {
+ height: 180px;
+ filter: brightness(0) saturate(100%) invert(75%) sepia(84%) saturate(3272%) hue-rotate(103deg)
+ brightness(106%) contrast(103%);
+ }
+
+ .session-text-logo {
+ margin-top: 10px;
+ width: 250px;
+ transition: 0s;
+ filter: var(--session-logo-text-current-filter);
+ }
+ }
+
.session-text-logo {
filter: var(--session-logo-text-current-filter);
}
diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss
index b8278f858c..744417bf10 100644
--- a/stylesheets/_session.scss
+++ b/stylesheets/_session.scss
@@ -444,64 +444,6 @@ label {
}
}
-.session-loader {
- display: inline-block;
- position: relative;
- width: 80px;
- height: 80px;
- flex-shrink: 0;
-
- div {
- position: absolute;
- top: 33px;
- width: 13px;
- height: 13px;
- border-radius: 50%;
- background: var(--primary-color);
- animation-timing-function: cubic-bezier(0, 1, 1, 0);
- }
- div:nth-child(1) {
- left: 8px;
- animation: session-loader1 0.6s infinite;
- }
- div:nth-child(2) {
- left: 8px;
- animation: session-loader2 0.6s infinite;
- }
- div:nth-child(3) {
- left: 32px;
- animation: session-loader2 0.6s infinite;
- }
- div:nth-child(4) {
- left: 56px;
- animation: session-loader3 0.6s infinite;
- }
- @keyframes session-loader1 {
- 0% {
- transform: scale(0);
- }
- 100% {
- transform: scale(1);
- }
- }
- @keyframes session-loader3 {
- 0% {
- transform: scale(1);
- }
- 100% {
- transform: scale(0);
- }
- }
- @keyframes session-loader2 {
- 0% {
- transform: translate(0, 0);
- }
- 100% {
- transform: translate(24px, 0);
- }
- }
-}
-
.session-settings {
width: 100%;
height: 100%;
diff --git a/stylesheets/_session_conversation.scss b/stylesheets/_session_conversation.scss
index d0cf549a3e..869bb0087a 100644
--- a/stylesheets/_session_conversation.scss
+++ b/stylesheets/_session_conversation.scss
@@ -115,28 +115,6 @@
}
}
-.send-message-button {
- animation: fadein var(--default-duration);
-
- &---scale {
- animation: scaling 2s ease-in-out;
-
- @keyframes scaling {
- 0% {
- transform: scale(1);
- }
-
- 80% {
- transform: scale(1.3);
- }
-
- 100% {
- transform: scale(1);
- }
- }
- }
-}
-
.session-recording {
height: var(--composition-container-height);
display: flex;
diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss
index 8ca3e21b27..35997b4e22 100644
--- a/stylesheets/_session_left_pane.scss
+++ b/stylesheets/_session_left_pane.scss
@@ -140,33 +140,3 @@ $session-compose-margin: 20px;
}
}
}
-
-.conversation.placeholder {
- margin: auto;
- height: 100%;
-
- .container {
- display: flex;
- height: 100%;
- }
-}
-
-.session-full-logo {
- display: flex;
- flex-direction: column;
- align-items: center;
- margin: auto;
-
- .session-brand-logo {
- height: 180px;
- filter: brightness(0) saturate(100%) invert(75%) sepia(84%) saturate(3272%) hue-rotate(103deg)
- brightness(106%) contrast(103%);
- }
-
- .session-text-logo {
- margin-top: 10px;
- width: 250px;
- transition: 0s;
- filter: var(--session-logo-text-current-filter);
- }
-}
diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss
index 8a7872f54b..492194a213 100644
--- a/stylesheets/_session_signin.scss
+++ b/stylesheets/_session_signin.scss
@@ -1,57 +1,5 @@
.session {
- &-fullscreen {
- width: 100%;
- height: 100%;
- background-color: var(--background-primary-color);
- color: var(--text-primary-color);
- }
- &-content {
- &-accent {
- &-text {
- font-family: var(--font-accent), var(--font-default);
- text-align: center;
- .title {
- font-size: 90px;
- font-weight: 700;
- line-height: 100px;
- }
- }
- }
-
- &-registration {
- padding-inline-end: 128px;
- }
-
- &-header {
- display: flex;
- flex-direction: row;
- width: 100%;
- justify-content: space-between;
- padding: 17px 20px;
- }
-
- &-body {
- display: flex;
- flex-direction: row;
- flex: 1;
- align-items: center;
- width: 100%;
- padding-bottom: 20px;
- }
- }
-
&-registration {
- &-container {
- display: flex;
- flex-direction: column;
- width: 289px;
-
- .session-button {
- width: 80%;
- margin: auto;
- }
- }
-
&__content {
width: 100%;
padding-top: 20px;
@@ -61,7 +9,7 @@
color: var(--text-primary-color);
font-weight: bold;
- padding: 20px;
+ padding: 0 20px 20px;
}
&__welcome-session {
@@ -77,98 +25,6 @@
@include registration-label-mixin;
text-align: center;
}
-
- &__entry-fields {
- margin: 0px;
- padding-bottom: 30px;
- }
- }
-
- &-input-floating-label-show-hide {
- padding-inline-end: 30px;
- }
-
- &-input-with-label-container {
- height: 46.5px;
- width: 280px;
- font-family: var(--font-default);
- color: var(--text-primary-color);
-
- padding: 2px 0 2px 0;
- transition: opacity var(--default-duration);
- opacity: 1;
- position: relative;
-
- label {
- line-height: 14px;
- opacity: 0;
- color: var(--text-primary-color);
-
- font-size: 10px;
- line-height: 11px;
- position: absolute;
- top: 0px;
- }
-
- &.filled {
- opacity: 1;
- }
-
- &.error {
- color: var(--danger-color);
- }
-
- input {
- border: none;
- outline: 0;
- height: 14px;
- width: 280px;
- background: transparent;
- color: var(--input-text-color);
-
- font-family: var(--font-default);
- font-size: 12px;
- line-height: 14px;
- position: absolute;
- top: 50%;
- transform: translateY(-50%);
-
- &::placeholder {
- color: var(--input-text-placeholder-color);
- }
- }
-
- hr {
- border: 1px solid var(--border-color);
-
- width: 100%;
- position: absolute;
- bottom: 0px;
- }
- }
-
- &-terms-conditions-agreement {
- padding-top: var(--margins-md);
-
- color: var(--text-secondary-color);
- text-align: center;
- font-size: 12px;
-
- a {
- white-space: nowrap;
- font-weight: bold;
- text-decoration: none;
- color: var(--text-secondary-color);
- transition: var(--default-duration);
-
- &:visited &:link {
- color: var(--text-secondary-color);
- }
-
- &:hover {
- color: var(--text-primary-color);
- }
- }
}
&-description-long {
diff --git a/ts/components/AboutView.tsx b/ts/components/AboutView.tsx
index abffacdd11..1b1297c737 100644
--- a/ts/components/AboutView.tsx
+++ b/ts/components/AboutView.tsx
@@ -1,7 +1,7 @@
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
import styled from 'styled-components';
-import { switchThemeTo } from '../themes/switchTheme';
import { SessionTheme } from '../themes/SessionTheme';
+import { switchThemeTo } from '../themes/switchTheme';
const StyledContent = styled.div`
background-color: var(--background-primary-color);
diff --git a/ts/components/CaptionEditor.tsx b/ts/components/CaptionEditor.tsx
index 20e51b2cef..3ae89ddd14 100644
--- a/ts/components/CaptionEditor.tsx
+++ b/ts/components/CaptionEditor.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import * as GoogleChrome from '../util/GoogleChrome';
import { AttachmentType } from '../types/Attachment';
diff --git a/ts/components/DebugLogView.tsx b/ts/components/DebugLogView.tsx
index 5ffd340130..a25f4b4e8e 100644
--- a/ts/components/DebugLogView.tsx
+++ b/ts/components/DebugLogView.tsx
@@ -1,7 +1,7 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import styled from 'styled-components';
-import { switchThemeTo } from '../themes/switchTheme';
import { SessionTheme } from '../themes/SessionTheme';
+import { switchThemeTo } from '../themes/switchTheme';
import { fetchNodeLog } from '../util/logging';
import { SessionButton, SessionButtonType } from './basic/SessionButton';
import { SessionIconButton } from './icon';
diff --git a/ts/components/EmptyMessageView.tsx b/ts/components/EmptyMessageView.tsx
new file mode 100644
index 0000000000..3029f28339
--- /dev/null
+++ b/ts/components/EmptyMessageView.tsx
@@ -0,0 +1,120 @@
+import { useSelector } from 'react-redux';
+import styled from 'styled-components';
+import { getLeftPaneConversationIdsCount } from '../state/selectors/conversations';
+import { getTheme } from '../state/selectors/theme';
+import { isSignWithRecoveryPhrase } from '../util/storage';
+import { Flex } from './basic/Flex';
+import { Spacer2XL, SpacerXS } from './basic/Text';
+
+const StyledPlaceholder = styled(Flex)`
+ background-color: var(--background-secondary-color);
+ height: 100%;
+`;
+
+const StyledSessionFullLogo = styled(Flex)`
+ img:first-child {
+ height: 180px;
+ filter: brightness(0) saturate(100%) invert(75%) sepia(84%) saturate(3272%) hue-rotate(103deg)
+ brightness(106%) contrast(103%);
+ -webkit-user-drag: none;
+ }
+
+ img:nth-child(2) {
+ margin-top: 10px;
+ width: 250px;
+ transition: 0s;
+ filter: var(--session-logo-text-current-filter);
+ -webkit-user-drag: none;
+ }
+`;
+
+const StyledPartyPopper = styled.img`
+ height: 180px;
+ margin: 0 auto;
+ -webkit-user-drag: none;
+`;
+
+const StyledP = styled.p`
+ margin: 0;
+ padding: 0;
+ text-align: center;
+`;
+
+const StyledHeading = styled(StyledP)`
+ margin: 0 0 var(--margins-md);
+ line-height: 1;
+ font-size: 48px;
+ font-weight: 700;
+`;
+
+const StyledSessionWelcome = styled(StyledP)<{ color: string }>`
+ line-height: 1;
+ color: ${props => props.color};
+ font-size: 32px;
+`;
+
+const StyledHR = styled.hr`
+ color: var(--text-secondary-color);
+ opacity: 0.5;
+ width: 300px;
+ border-width: 1px;
+ margin: 40px 0 var(--margins-lg);
+`;
+
+const StyledNoConversations = styled(StyledP)`
+ font-size: 24px;
+ font-weight: 700;
+`;
+
+export const EmptyMessageView = () => {
+ const theme = useSelector(getTheme);
+ const conversationCount = useSelector(getLeftPaneConversationIdsCount);
+ const isSignInWithRecoveryPhrase = isSignWithRecoveryPhrase();
+
+ const launchCount = window.getSettingValue('launch-count');
+ const newAccountCreated = !isSignInWithRecoveryPhrase && (!launchCount || launchCount < 1);
+
+ return (
+
+ {newAccountCreated ? (
+ <>
+
+
+ {window.i18n('onboardingAccountCreated')}
+
+ {window.i18n('onboardingBubbleWelcomeToSession')}
+
+ >
+ ) : (
+
+
+
+
+ )}
+ {!conversationCount ? (
+ <>
+
+ {window.i18n('conversationsNone')}
+
+ {window.i18n('onboardingHitThePlusButton')}
+ >
+ ) : null}
+
+ );
+};
diff --git a/ts/components/MainViewController.tsx b/ts/components/MainViewController.tsx
deleted file mode 100644
index 8a81ce785c..0000000000
--- a/ts/components/MainViewController.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import React from 'react';
-import { CSSProperties } from 'styled-components';
-
-export const MessageView = () => {
- const noDragStyle = { '-webkit-user-drag': 'none' } as CSSProperties;
-
- return (
-
-
-
-
-
-
-
-
-
- );
-};
diff --git a/ts/components/MemberListItem.tsx b/ts/components/MemberListItem.tsx
index 261ffe3a42..3fd6d14ab6 100644
--- a/ts/components/MemberListItem.tsx
+++ b/ts/components/MemberListItem.tsx
@@ -1,8 +1,7 @@
-import React from 'react';
import styled from 'styled-components';
-import { Avatar, AvatarSize, CrownIcon } from './avatar/Avatar';
import { useNicknameOrProfileNameOrShortenedPubkey } from '../hooks/useParamSelector';
+import { Avatar, AvatarSize, CrownIcon } from './avatar/Avatar';
import { SessionRadio } from './basic/SessionRadio';
const AvatarContainer = styled.div`
diff --git a/ts/components/NoticeBanner.tsx b/ts/components/NoticeBanner.tsx
index 255926d829..2bc2408027 100644
--- a/ts/components/NoticeBanner.tsx
+++ b/ts/components/NoticeBanner.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { Flex } from './basic/Flex';
import { SessionIconButton } from './icon';
diff --git a/ts/components/SessionFocusTrap.tsx b/ts/components/SessionFocusTrap.tsx
index 3c33c2f27e..bec1f9471d 100644
--- a/ts/components/SessionFocusTrap.tsx
+++ b/ts/components/SessionFocusTrap.tsx
@@ -1,11 +1,11 @@
import FocusTrap from 'focus-trap-react';
-import React, { useState } from 'react';
+import { ReactNode, useState } from 'react';
import { useMount } from 'react-use';
/**
* Focus trap which activates on mount.
*/
-export function SessionFocusTrap(props: { children: React.ReactNode }) {
+export function SessionFocusTrap(props: { children: ReactNode }) {
const [active, setActive] = useState(false);
// Activate the trap on mount so we **should** have a button to tab through. focus-trap-react will throw if we don't have a button when the trap becomes active.
diff --git a/ts/components/SessionHeaderSearchInput.tsx b/ts/components/SessionHeaderSearchInput.tsx
index 9fbbd2ade3..da7e355af3 100644
--- a/ts/components/SessionHeaderSearchInput.tsx
+++ b/ts/components/SessionHeaderSearchInput.tsx
@@ -19,13 +19,13 @@ export const SessionHeaderSearchInput = styled.input<{ darkMode: boolean }>`
position: relative;
border-radius: '4px';
- ::placeholder {
+ &::placeholder {
color: var(--search-bar-text-control-color);
}
- :focus {
+ &:focus {
border: solid 1px
- var(${props => (props.darkMode ? '--primary-color' : '--search-bar-text-user-color')});
+ ${props => (props.darkMode ? 'var(--primary-color)' : 'var(--search-bar-text-user-color)')};
color: var(--search-bar-text-user-color);
outline: none;
}
diff --git a/ts/components/SessionInboxView.tsx b/ts/components/SessionInboxView.tsx
index b4ff71b007..b29aeb5477 100644
--- a/ts/components/SessionInboxView.tsx
+++ b/ts/components/SessionInboxView.tsx
@@ -1,6 +1,6 @@
import { fromPairs, map } from 'lodash';
import moment from 'moment';
-import React from 'react';
+
import { Provider } from 'react-redux';
import useMount from 'react-use/lib/useMount';
import useUpdate from 'react-use/lib/useUpdate';
diff --git a/ts/components/SessionMainPanel.tsx b/ts/components/SessionMainPanel.tsx
index d5d3833316..44cf87e91c 100644
--- a/ts/components/SessionMainPanel.tsx
+++ b/ts/components/SessionMainPanel.tsx
@@ -1,11 +1,10 @@
-import React from 'react';
import { useSelector } from 'react-redux';
import { useAppIsFocused } from '../hooks/useAppFocused';
import { getFocusedSettingsSection } from '../state/selectors/section';
import { SmartSessionConversation } from '../state/smart/SessionConversation';
-import { SessionSettingsView } from './settings/SessionSettings';
import { useHTMLDirection } from '../util/i18n';
+import { SessionSettingsView } from './settings/SessionSettings';
const FilteredSettingsView = SessionSettingsView as any;
diff --git a/ts/components/SessionPasswordPrompt.tsx b/ts/components/SessionPasswordPrompt.tsx
index 929db35c8a..290a21638b 100644
--- a/ts/components/SessionPasswordPrompt.tsx
+++ b/ts/components/SessionPasswordPrompt.tsx
@@ -1,7 +1,7 @@
import autoBind from 'auto-bind';
import classNames from 'classnames';
import { isString } from 'lodash';
-import React, { useEffect } from 'react';
+import { PureComponent, useEffect } from 'react';
import { toast } from 'react-toastify';
import styled from 'styled-components';
@@ -12,8 +12,8 @@ import { switchPrimaryColorTo } from '../themes/switchPrimaryColor';
import { switchThemeTo } from '../themes/switchTheme';
import { SessionToastContainer } from './SessionToastContainer';
import { SessionWrapperModal } from './SessionWrapperModal';
-import { SessionSpinner } from './basic/SessionSpinner';
import { SessionToast } from './basic/SessionToast';
+import { SessionSpinner } from './loading';
interface State {
errorCount: number;
@@ -45,7 +45,7 @@ function pushToastError(id: string, title: string, description?: string) {
});
}
-class SessionPasswordPromptInner extends React.PureComponent
{
+class SessionPasswordPromptInner extends PureComponent {
private inputRef?: any;
constructor(props: any) {
diff --git a/ts/components/SessionScrollButton.tsx b/ts/components/SessionScrollButton.tsx
index bd5dd9750d..01010dd21e 100644
--- a/ts/components/SessionScrollButton.tsx
+++ b/ts/components/SessionScrollButton.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { getShowScrollButton } from '../state/selectors/conversations';
diff --git a/ts/components/SessionSearchInput.tsx b/ts/components/SessionSearchInput.tsx
index 389644d043..3d1a21f54f 100644
--- a/ts/components/SessionSearchInput.tsx
+++ b/ts/components/SessionSearchInput.tsx
@@ -1,5 +1,6 @@
+import { Dispatch } from '@reduxjs/toolkit';
import { debounce } from 'lodash';
-import React, { Dispatch, useState } from 'react';
+import { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { clearSearch, search, updateSearchTerm } from '../state/ducks/search';
diff --git a/ts/components/SessionToastContainer.tsx b/ts/components/SessionToastContainer.tsx
index 69f36cd428..f058377d5a 100644
--- a/ts/components/SessionToastContainer.tsx
+++ b/ts/components/SessionToastContainer.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { Slide, ToastContainer, ToastContainerProps } from 'react-toastify';
import styled from 'styled-components';
diff --git a/ts/components/SessionWrapperModal.tsx b/ts/components/SessionWrapperModal.tsx
index 8e8f37ac01..775160a8f5 100644
--- a/ts/components/SessionWrapperModal.tsx
+++ b/ts/components/SessionWrapperModal.tsx
@@ -1,5 +1,5 @@
import classNames from 'classnames';
-import React, { useRef } from 'react';
+import { ReactNode, useRef } from 'react';
import useKey from 'react-use/lib/useKey';
import { SessionIconButton } from './icon';
@@ -17,7 +17,7 @@ export type SessionWrapperModalType = {
cancelText?: string;
showExitIcon?: boolean;
headerIconButtons?: Array;
- children: React.ReactNode;
+ children: ReactNode;
headerReverse?: boolean;
additionalClassName?: string;
};
diff --git a/ts/components/SplitViewContainer.tsx b/ts/components/SplitViewContainer.tsx
index c1a001b8fc..94485139d7 100644
--- a/ts/components/SplitViewContainer.tsx
+++ b/ts/components/SplitViewContainer.tsx
@@ -1,9 +1,9 @@
-import React, { useEffect, useRef, useState } from 'react';
+import { ReactElement, ReactNode, useEffect, useRef, useState } from 'react';
import styled from 'styled-components';
type SplitViewProps = {
- top: React.ReactElement;
- bottom: React.ReactElement;
+ top: ReactElement;
+ bottom: ReactElement;
disableTop: boolean;
};
@@ -44,12 +44,12 @@ const TopSplitViewPanel = ({
topHeight,
setTopHeight,
}: {
- children: React.ReactNode;
+ children: ReactNode;
topHeight: number | undefined;
setTopHeight: (value: number) => void;
}) => {
const topRef = useRef(null);
- React.useEffect(() => {
+ useEffect(() => {
if (topRef.current) {
if (!topHeight) {
setTopHeight(Math.max(MIN_HEIGHT_TOP, (topRef.current?.clientHeight || 0) / 2));
diff --git a/ts/components/avatar/Avatar.tsx b/ts/components/avatar/Avatar.tsx
index 5bc51d6c7b..3597254c21 100644
--- a/ts/components/avatar/Avatar.tsx
+++ b/ts/components/avatar/Avatar.tsx
@@ -1,6 +1,6 @@
import classNames from 'classnames';
import { isEqual } from 'lodash';
-import React, { useState } from 'react';
+import { memo, useState } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
@@ -66,7 +66,7 @@ export const CrownIcon = () => {
);
};
-const NoImage = React.memo(
+const NoImage = memo(
(
props: Pick & {
isClosedGroup: boolean;
@@ -178,4 +178,4 @@ const AvatarInner = (props: Props) => {
);
};
-export const Avatar = React.memo(AvatarInner, isEqual);
+export const Avatar = memo(AvatarInner, isEqual);
diff --git a/ts/components/avatar/AvatarPlaceHolder/AvatarPlaceHolder.tsx b/ts/components/avatar/AvatarPlaceHolder/AvatarPlaceHolder.tsx
index eec91e5da3..6c8059fca4 100644
--- a/ts/components/avatar/AvatarPlaceHolder/AvatarPlaceHolder.tsx
+++ b/ts/components/avatar/AvatarPlaceHolder/AvatarPlaceHolder.tsx
@@ -1,7 +1,7 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
+import { allowOnlyOneAtATime } from '../../../session/utils/Promise';
import { COLORS } from '../../../themes/constants/colors';
import { getInitials } from '../../../util/getInitials';
-import { allowOnlyOneAtATime } from '../../../session/utils/Promise';
import { MemberAvatarPlaceHolder } from '../../icon/MemberAvatarPlaceHolder';
type Props = {
diff --git a/ts/components/avatar/AvatarPlaceHolder/ClosedGroupAvatar.tsx b/ts/components/avatar/AvatarPlaceHolder/ClosedGroupAvatar.tsx
index 0ad21d2931..6e8fcb6b75 100644
--- a/ts/components/avatar/AvatarPlaceHolder/ClosedGroupAvatar.tsx
+++ b/ts/components/avatar/AvatarPlaceHolder/ClosedGroupAvatar.tsx
@@ -1,10 +1,9 @@
-import React from 'react';
import { isEmpty } from 'lodash';
-import { assertUnreachable } from '../../../types/sqlSharedTypes';
-import { Avatar, AvatarSize } from '../Avatar';
import { useIsClosedGroup, useSortedGroupMembers } from '../../../hooks/useParamSelector';
import { UserUtils } from '../../../session/utils';
+import { assertUnreachable } from '../../../types/sqlSharedTypes';
+import { Avatar, AvatarSize } from '../Avatar';
function getClosedGroupAvatarsSize(size: AvatarSize): AvatarSize {
// Always use the size directly under the one requested
diff --git a/ts/components/basic/MessageBodyHighlight.tsx b/ts/components/basic/MessageBodyHighlight.tsx
index fdd7bd5e9f..b6cd15dcdd 100644
--- a/ts/components/basic/MessageBodyHighlight.tsx
+++ b/ts/components/basic/MessageBodyHighlight.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { RenderTextCallbackType } from '../../types/Util';
import { SizeClassType } from '../../util/emoji';
diff --git a/ts/components/basic/PillContainer.tsx b/ts/components/basic/PillContainer.tsx
index 3c9e37fcb2..4509351fef 100644
--- a/ts/components/basic/PillContainer.tsx
+++ b/ts/components/basic/PillContainer.tsx
@@ -1,8 +1,8 @@
-import React from 'react';
+import { ReactNode } from 'react';
import styled from 'styled-components';
type PillContainerProps = {
- children: React.ReactNode;
+ children: ReactNode;
margin?: string;
padding?: string;
onClick?: () => void;
diff --git a/ts/components/basic/SessionButton.tsx b/ts/components/basic/SessionButton.tsx
index ca2ae7992b..dfaa20c126 100644
--- a/ts/components/basic/SessionButton.tsx
+++ b/ts/components/basic/SessionButton.tsx
@@ -1,16 +1,18 @@
import classNames from 'classnames';
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import styled from 'styled-components';
export enum SessionButtonType {
Outline = 'outline',
Simple = 'simple',
Solid = 'solid',
+ Ghost = 'ghost',
}
export enum SessionButtonShape {
Round = 'round',
Square = 'square',
+ None = 'none',
}
// NOTE References ts/themes/colors.tsx
@@ -33,7 +35,7 @@ const StyledButton = styled.button<{
buttonType: SessionButtonType;
buttonShape: SessionButtonShape;
}>`
- width: auto;
+ width: ${props => (props.buttonType === SessionButtonType.Ghost ? '100%' : 'auto')};
display: flex;
justify-content: center;
align-items: center;
@@ -45,8 +47,9 @@ const StyledButton = styled.button<{
transition: var(--default-duration);
background-repeat: no-repeat;
overflow: hidden;
- height: 34px;
- padding: 0px 18px;
+ height: ${props => (props.buttonType === SessionButtonType.Ghost ? undefined : '34px')};
+ padding: ${props =>
+ props.buttonType === SessionButtonType.Ghost ? '16px 24px 24px' : '0px 18px'};
background-color: ${props =>
props.buttonType === SessionButtonType.Solid && props.color
? `var(--${props.color}-color)`
@@ -65,7 +68,12 @@ const StyledButton = styled.button<{
${props =>
props.buttonType === SessionButtonType.Solid &&
'box-shadow: 0px 0px 6px var(--button-solid-shadow-color);'}
- border-radius: ${props => (props.buttonShape === SessionButtonShape.Round ? '17px' : '6px')};
+ border-radius: ${props =>
+ props.buttonShape === SessionButtonShape.Round
+ ? '17px'
+ : props.buttonShape === SessionButtonShape.Square
+ ? '6px'
+ : '0px'};
.session-icon {
fill: var(--background-primary-color);
@@ -106,18 +114,28 @@ const StyledButton = styled.button<{
type Props = {
text?: string;
disabled?: boolean;
- buttonType: SessionButtonType;
- buttonShape: SessionButtonShape;
+ buttonType?: SessionButtonType;
+ buttonShape?: SessionButtonShape;
buttonColor?: SessionButtonColor; // will override theme
- onClick: any;
+ onClick?: any;
children?: ReactNode;
margin?: string;
dataTestId?: string;
};
export const SessionButton = (props: Props) => {
- const { buttonType, buttonShape, dataTestId, buttonColor, text, disabled, onClick, margin } =
- props;
+ const {
+ buttonType = SessionButtonType.Outline,
+ buttonShape = buttonType === SessionButtonType.Ghost
+ ? SessionButtonShape.None
+ : SessionButtonShape.Round,
+ dataTestId,
+ buttonColor,
+ text,
+ disabled = false,
+ onClick = null,
+ margin,
+ } = props;
const clickHandler = (e: any) => {
if (onClick) {
@@ -148,10 +166,3 @@ export const SessionButton = (props: Props) => {
);
};
-
-SessionButton.defaultProps = {
- disabled: false,
- buttonShape: SessionButtonShape.Round,
- buttonType: SessionButtonType.Outline,
- onClick: null,
-} as Partial;
diff --git a/ts/components/basic/SessionDropdown.tsx b/ts/components/basic/SessionDropdown.tsx
index eb00a1f42b..b13512e2b2 100644
--- a/ts/components/basic/SessionDropdown.tsx
+++ b/ts/components/basic/SessionDropdown.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { SessionIcon, SessionIconType } from '../icon';
import { SessionDropdownItem, SessionDropDownItemType } from './SessionDropdownItem';
diff --git a/ts/components/basic/SessionDropdownItem.tsx b/ts/components/basic/SessionDropdownItem.tsx
index c6588da410..578ad40a11 100644
--- a/ts/components/basic/SessionDropdownItem.tsx
+++ b/ts/components/basic/SessionDropdownItem.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import classNames from 'classnames';
import { SessionIcon, SessionIconType } from '../icon';
diff --git a/ts/components/basic/SessionHTMLRenderer.tsx b/ts/components/basic/SessionHTMLRenderer.tsx
index 7e5280a0b5..e674127d3b 100644
--- a/ts/components/basic/SessionHTMLRenderer.tsx
+++ b/ts/components/basic/SessionHTMLRenderer.tsx
@@ -1,5 +1,5 @@
-import React from 'react';
import DOMPurify from 'dompurify';
+import { createElement } from 'react';
type ReceivedProps = {
html: string;
@@ -14,7 +14,7 @@ export const SessionHtmlRenderer = ({ tag = 'div', key, html, className }: Recei
FORBID_ATTR: ['script'],
});
- return React.createElement(tag, {
+ return createElement(tag, {
key,
className,
diff --git a/ts/components/basic/SessionIdEditable.tsx b/ts/components/basic/SessionIdEditable.tsx
index bbac3fb8e3..0281c9694d 100644
--- a/ts/components/basic/SessionIdEditable.tsx
+++ b/ts/components/basic/SessionIdEditable.tsx
@@ -1,5 +1,5 @@
-import React, { ChangeEvent, KeyboardEvent, useRef } from 'react';
import classNames from 'classnames';
+import { ChangeEvent, KeyboardEvent, useRef } from 'react';
import { useFocusMount } from '../../hooks/useFocusMount';
type Props = {
diff --git a/ts/components/basic/SessionInput.tsx b/ts/components/basic/SessionInput.tsx
deleted file mode 100644
index a34de03cc8..0000000000
--- a/ts/components/basic/SessionInput.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import React, { useState } from 'react';
-
-import classNames from 'classnames';
-import { SessionIconButton } from '../icon';
-import { useHTMLDirection } from '../../util/i18n';
-
-type Props = {
- label?: string;
- error?: string;
- type?: string;
- value?: string;
- placeholder: string;
- maxLength?: number;
- enableShowHide?: boolean;
- onValueChanged?: (value: string) => any;
- onEnterPressed?: any;
- autoFocus?: boolean;
- ref?: any;
- inputDataTestId?: string;
-};
-
-const LabelItem = (props: { inputValue: string; label?: string }) => {
- return (
-
- {props.label}
-
- );
-};
-
-const ErrorItem = (props: { error: string | undefined }) => {
- return (
-
- {props.error}
-
- );
-};
-
-const ShowHideButton = (props: { toggleForceShow: () => void }) => {
- const htmlDirection = useHTMLDirection();
- const position = htmlDirection === 'ltr' ? { right: '0px' } : { left: '0px' };
-
- return (
-
- );
-};
-
-export const SessionInput = (props: Props) => {
- const {
- autoFocus,
- placeholder,
- type,
- value,
- maxLength,
- enableShowHide,
- error,
- label,
- onValueChanged,
- inputDataTestId,
- } = props;
- const [inputValue, setInputValue] = useState('');
- const [forceShow, setForceShow] = useState(false);
-
- const correctType = forceShow ? 'text' : type;
-
- const updateInputValue = (e: React.ChangeEvent) => {
- e.preventDefault();
- const val = e.target.value;
- setInputValue(val);
- if (onValueChanged) {
- onValueChanged(val);
- }
- };
-
- return (
-
- {error ? (
-
- ) : (
-
- )}
- {
- if (event.key === 'Enter' && props.onEnterPressed) {
- props.onEnterPressed();
- }
- }}
- />
-
- {enableShowHide && (
- {
- setForceShow(!forceShow);
- }}
- />
- )}
-
-
- );
-};
diff --git a/ts/components/basic/SessionRadio.tsx b/ts/components/basic/SessionRadio.tsx
index ca54b7e94f..a932435052 100644
--- a/ts/components/basic/SessionRadio.tsx
+++ b/ts/components/basic/SessionRadio.tsx
@@ -1,4 +1,4 @@
-import React, { ChangeEvent } from 'react';
+import { ChangeEvent, SyntheticEvent } from 'react';
import styled, { CSSProperties } from 'styled-components';
import { Flex } from './Flex';
@@ -75,7 +75,7 @@ export const SessionRadio = (props: SessionRadioProps) => {
style,
} = props;
- const clickHandler = (e: React.SyntheticEvent) => {
+ const clickHandler = (e: SyntheticEvent) => {
if (!disabled && onClick) {
// let something else catch the event if our click handler is not set
e.stopPropagation();
diff --git a/ts/components/basic/SessionRadioGroup.tsx b/ts/components/basic/SessionRadioGroup.tsx
index b0867e3d70..aa4ee6ea29 100644
--- a/ts/components/basic/SessionRadioGroup.tsx
+++ b/ts/components/basic/SessionRadioGroup.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import useMount from 'react-use/lib/useMount';
import styled, { CSSProperties } from 'styled-components';
diff --git a/ts/components/basic/SessionSpinner.tsx b/ts/components/basic/SessionSpinner.tsx
deleted file mode 100644
index 4a5e27a98f..0000000000
--- a/ts/components/basic/SessionSpinner.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react';
-
-type Props = {
- loading: boolean;
-};
-
-export const SessionSpinner = (props: Props) => {
- const { loading } = props;
-
- return loading ? (
-
- ) : null;
-};
diff --git a/ts/components/basic/SessionToast.tsx b/ts/components/basic/SessionToast.tsx
index cc87f8f8b5..3803314197 100644
--- a/ts/components/basic/SessionToast.tsx
+++ b/ts/components/basic/SessionToast.tsx
@@ -1,5 +1,5 @@
import { noop } from 'lodash';
-import React from 'react';
+
import styled from 'styled-components';
import { Flex } from './Flex';
diff --git a/ts/components/basic/SessionToggle.tsx b/ts/components/basic/SessionToggle.tsx
index 3f9ec0cb49..43cc17c65c 100644
--- a/ts/components/basic/SessionToggle.tsx
+++ b/ts/components/basic/SessionToggle.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { MouseEvent } from 'react';
import { useDispatch } from 'react-redux';
import styled from 'styled-components';
import { updateConfirmModal } from '../../state/ducks/modalDialog';
@@ -54,7 +54,7 @@ type Props = {
export const SessionToggle = (props: Props) => {
const dispatch = useDispatch();
- const clickHandler = (event: React.MouseEvent) => {
+ const clickHandler = (event: MouseEvent) => {
const stateManager = (e: any) => {
e.stopPropagation();
props.onClick();
diff --git a/ts/components/basic/Text.tsx b/ts/components/basic/Text.tsx
index a99acf97ad..c455781e54 100644
--- a/ts/components/basic/Text.tsx
+++ b/ts/components/basic/Text.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { ReactNode } from 'react';
import styled, { CSSProperties } from 'styled-components';
type TextProps = {
@@ -26,62 +26,57 @@ export const Text = (props: TextProps) => {
return {props.text} ;
};
-export const TextWithChildren = (
- props: Omit & { children: React.ReactNode }
-) => {
+export const TextWithChildren = (props: Omit & { children: ReactNode }) => {
return {props.children} ;
};
type SpacerProps = {
- size: 'xl' | 'lg' | 'md' | 'sm' | 'xs';
+ size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
style?: CSSProperties;
};
const SpacerStyled = styled.div`
- height: ${props =>
- props.size === 'xl'
- ? 'var(--margins-xl)'
- : props.size === 'lg'
- ? 'var(--margins-lg)'
- : props.size === 'md'
- ? 'var(--margins-md)'
- : props.size === 'sm'
- ? 'var(--margins-sm)'
- : 'var(--margins-xs)'};
-
- width: ${props =>
- props.size === 'xl'
- ? 'var(--margins-xl)'
- : props.size === 'lg'
- ? 'var(--margins-lg)'
- : props.size === 'md'
- ? 'var(--margins-md)'
- : props.size === 'sm'
- ? 'var(--margins-sm)'
- : 'var(--margins-xs)'};
+ width: ${props => `var(--margins-${props.size})`};
+ height: ${props => `var(--margins-${props.size})`};
`;
const Spacer = (props: SpacerProps) => {
return ;
};
-export const SpacerXL = (props: { style?: CSSProperties }) => {
- return ;
+/** --margins-xs 5px */
+export const SpacerXS = (props: { style?: CSSProperties }) => {
+ return ;
};
-export const SpacerLG = (props: { style?: CSSProperties }) => {
- return ;
+/** --margins-sm 10px */
+export const SpacerSM = (props: { style?: CSSProperties }) => {
+ return ;
};
+/** --margins-md 15px */
export const SpacerMD = (props: { style?: CSSProperties }) => {
return ;
};
-export const SpacerSM = (props: { style?: CSSProperties }) => {
- return ;
+
+/** --margins-lg 20px */
+export const SpacerLG = (props: { style?: CSSProperties }) => {
+ return ;
};
-export const SpacerXS = (props: { style?: CSSProperties }) => {
- return ;
+/** --margins-xl 25px */
+export const SpacerXL = (props: { style?: CSSProperties }) => {
+ return ;
+};
+
+/** --margins-2xl 30px */
+export const Spacer2XL = (props: { style?: CSSProperties }) => {
+ return ;
+};
+
+/** --margins-3xl 35px */
+export const Spacer3XL = (props: { style?: CSSProperties }) => {
+ return ;
};
type H3Props = {
diff --git a/ts/components/basic/YourSessionIDPill.tsx b/ts/components/basic/YourSessionIDPill.tsx
index 0d2fdaddbb..89ff334ef7 100644
--- a/ts/components/basic/YourSessionIDPill.tsx
+++ b/ts/components/basic/YourSessionIDPill.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { UserUtils } from '../../session/utils';
@@ -28,7 +27,7 @@ export const YourSessionIDPill = () => {
return (
- {window.i18n('yourSessionID')}
+ {window.i18n('accountIdYours')}
);
diff --git a/ts/components/buttons/MenuButton.tsx b/ts/components/buttons/MenuButton.tsx
index 115748c29f..a2fe56d356 100644
--- a/ts/components/buttons/MenuButton.tsx
+++ b/ts/components/buttons/MenuButton.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { resetLeftOverlayMode, setLeftOverlayMode } from '../../state/ducks/section';
@@ -14,7 +13,8 @@ const StyledMenuButton = styled.button`
align-items: center;
background: var(--menu-button-background-color);
- border-radius: 2px;
+ border: 1.5px solid var(--menu-button-border-color);
+ border-radius: 7px;
width: 51px;
height: 33px;
cursor: pointer;
@@ -23,6 +23,10 @@ const StyledMenuButton = styled.button`
:hover {
background: var(--menu-button-background-hover-color);
+ border-color: var(--menu-button-border-hover-color);
+ svg path {
+ fill: var(--menu-button-icon-hover-color);
+ }
}
`;
@@ -42,10 +46,11 @@ export const MenuButton = () => {
return (
diff --git a/ts/components/buttons/PanelButton.tsx b/ts/components/buttons/PanelButton.tsx
index 868bf9bbda..1bf658eb85 100644
--- a/ts/components/buttons/PanelButton.tsx
+++ b/ts/components/buttons/PanelButton.tsx
@@ -1,4 +1,4 @@
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import styled, { CSSProperties } from 'styled-components';
import { Flex } from '../basic/Flex';
diff --git a/ts/components/buttons/PanelIconButton.tsx b/ts/components/buttons/PanelIconButton.tsx
index 79d5f32d61..b7a065a716 100644
--- a/ts/components/buttons/PanelIconButton.tsx
+++ b/ts/components/buttons/PanelIconButton.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { SessionIcon, SessionIconType } from '../icon';
import { PanelButton, PanelButtonProps, PanelButtonText, StyledContent } from './PanelButton';
diff --git a/ts/components/buttons/PanelRadioButton.tsx b/ts/components/buttons/PanelRadioButton.tsx
index 4db2594b9f..26c477e0ef 100644
--- a/ts/components/buttons/PanelRadioButton.tsx
+++ b/ts/components/buttons/PanelRadioButton.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { SessionRadio } from '../basic/SessionRadio';
import { PanelButton, PanelButtonProps, PanelButtonText, StyledContent } from './PanelButton';
diff --git a/ts/components/calling/CallButtons.tsx b/ts/components/calling/CallButtons.tsx
index 74ca159b91..17de2e0865 100644
--- a/ts/components/calling/CallButtons.tsx
+++ b/ts/components/calling/CallButtons.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { MouseEvent, useEffect, useState } from 'react';
import { contextMenu, Item, Menu } from 'react-contexify';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
@@ -40,7 +40,7 @@ const VideoInputMenu = ({
const showVideoInputMenu = (
currentConnectedCameras: Array,
- e: React.MouseEvent
+ e: MouseEvent
) => {
if (currentConnectedCameras.length === 0) {
ToastUtils.pushNoCameraFound();
@@ -113,7 +113,7 @@ const AudioInputMenu = ({
const showAudioInputMenu = (
currentConnectedAudioInputs: Array,
- e: React.MouseEvent
+ e: MouseEvent
) => {
if (currentConnectedAudioInputs.length === 0) {
ToastUtils.pushNoAudioInputFound();
@@ -182,7 +182,7 @@ const AudioOutputMenu = ({
const showAudioOutputMenu = (
currentConnectedAudioOutputs: Array,
- e: React.MouseEvent
+ e: MouseEvent
) => {
if (currentConnectedAudioOutputs.length === 0) {
ToastUtils.pushNoAudioOutputFound();
diff --git a/ts/components/calling/CallInFullScreenContainer.tsx b/ts/components/calling/CallInFullScreenContainer.tsx
index 952a88e34f..f855fb4daf 100644
--- a/ts/components/calling/CallInFullScreenContainer.tsx
+++ b/ts/components/calling/CallInFullScreenContainer.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect } from 'react';
+import { useEffect, useRef } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import useKey from 'react-use/lib/useKey';
@@ -52,8 +52,8 @@ export const CallInFullScreenContainer = () => {
localStreamVideoIsMuted,
} = useVideoCallEventsListener('CallInFullScreenContainer', true);
- const videoRefRemote = React.useRef(null);
- const videoRefLocal = React.useRef(null);
+ const videoRefRemote = useRef(null);
+ const videoRefLocal = useRef(null);
function toggleFullScreenOFF() {
dispatch(setFullScreenCall(false));
diff --git a/ts/components/calling/DraggableCallContainer.tsx b/ts/components/calling/DraggableCallContainer.tsx
index d3a14e361b..39ac345e56 100644
--- a/ts/components/calling/DraggableCallContainer.tsx
+++ b/ts/components/calling/DraggableCallContainer.tsx
@@ -1,16 +1,16 @@
-import React, { useEffect, useRef, useState } from 'react';
-import { useSelector } from 'react-redux';
+import { useEffect, useRef, useState } from 'react';
import Draggable, { DraggableData, DraggableEvent } from 'react-draggable';
+import { useSelector } from 'react-redux';
import styled from 'styled-components';
-import { getHasOngoingCall, getHasOngoingCallWith } from '../../state/selectors/call';
-import { openConversationWithMessages } from '../../state/ducks/conversations';
-import { Avatar, AvatarSize } from '../avatar/Avatar';
import { useVideoCallEventsListener } from '../../hooks/useVideoEventListener';
-import { VideoLoadingSpinner } from './InConversationCallContainer';
-import { getSection } from '../../state/selectors/section';
+import { openConversationWithMessages } from '../../state/ducks/conversations';
import { SectionType } from '../../state/ducks/section';
+import { getHasOngoingCall, getHasOngoingCallWith } from '../../state/selectors/call';
+import { getSection } from '../../state/selectors/section';
import { useSelectedConversationKey } from '../../state/selectors/selectedConversation';
+import { Avatar, AvatarSize } from '../avatar/Avatar';
+import { VideoLoadingSpinner } from './InConversationCallContainer';
export const DraggableCallWindow = styled.div`
position: absolute;
diff --git a/ts/components/calling/InConversationCallContainer.tsx b/ts/components/calling/InConversationCallContainer.tsx
index dfedb85ae6..d9c0e58315 100644
--- a/ts/components/calling/InConversationCallContainer.tsx
+++ b/ts/components/calling/InConversationCallContainer.tsx
@@ -1,9 +1,9 @@
+import { useRef, useState } from 'react';
import { useSelector } from 'react-redux';
-import React, { useRef, useState } from 'react';
-import styled from 'styled-components';
-import useInterval from 'react-use/lib/useInterval';
import moment from 'moment';
+import useInterval from 'react-use/lib/useInterval';
+import styled from 'styled-components';
import { CallManager, UserUtils } from '../../session/utils';
import {
getCallIsInFullScreen,
@@ -13,15 +13,15 @@ import {
getHasOngoingCallWithFocusedConvo,
getHasOngoingCallWithPubkey,
} from '../../state/selectors/call';
-import { StyledVideoElement } from './DraggableCallContainer';
import { Avatar, AvatarSize } from '../avatar/Avatar';
+import { StyledVideoElement } from './DraggableCallContainer';
-import { useVideoCallEventsListener } from '../../hooks/useVideoEventListener';
import { useModuloWithTripleDots } from '../../hooks/useModuloWithTripleDots';
-import { CallWindowControls } from './CallButtons';
+import { useVideoCallEventsListener } from '../../hooks/useVideoEventListener';
import { DEVICE_DISABLED_DEVICE_ID } from '../../session/utils/calling/CallManager';
+import { CallWindowControls } from './CallButtons';
-import { SessionSpinner } from '../basic/SessionSpinner';
+import { SessionSpinner } from '../loading';
const VideoContainer = styled.div`
height: 100%;
diff --git a/ts/components/calling/IncomingCallDialog.tsx b/ts/components/calling/IncomingCallDialog.tsx
index a3ec501d58..dedf8c2cbc 100644
--- a/ts/components/calling/IncomingCallDialog.tsx
+++ b/ts/components/calling/IncomingCallDialog.tsx
@@ -1,15 +1,15 @@
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { useConversationUsername } from '../../hooks/useParamSelector';
import { CallManager } from '../../session/utils';
+import { ed25519Str } from '../../session/utils/String';
import { callTimeoutMs } from '../../session/utils/calling/CallManager';
import { getHasIncomingCall, getHasIncomingCallFrom } from '../../state/selectors/call';
+import { SessionWrapperModal } from '../SessionWrapperModal';
import { Avatar, AvatarSize } from '../avatar/Avatar';
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
-import { SessionWrapperModal } from '../SessionWrapperModal';
-import { ed25519Str } from '../../session/utils/String';
export const CallWindow = styled.div`
position: absolute;
@@ -72,6 +72,7 @@ export const IncomingCallDialog = () => {
if (!hasIncomingCall || !incomingCallFromPubkey) {
return null;
}
+ // #endregion
if (hasIncomingCall) {
return (
diff --git a/ts/components/conversation/AddMentions.tsx b/ts/components/conversation/AddMentions.tsx
index 0246683267..40878f8df0 100644
--- a/ts/components/conversation/AddMentions.tsx
+++ b/ts/components/conversation/AddMentions.tsx
@@ -1,9 +1,8 @@
-import React from 'react';
import styled from 'styled-components';
-import { RenderTextCallbackType } from '../../types/Util';
-import { PubKey } from '../../session/types';
-import { getConversationController } from '../../session/conversations';
import { isUsAnySogsFromCache } from '../../session/apis/open_group_api/sogsv3/knownBlindedkeys';
+import { getConversationController } from '../../session/conversations';
+import { PubKey } from '../../session/types';
+import { RenderTextCallbackType } from '../../types/Util';
interface MentionProps {
key: string;
diff --git a/ts/components/conversation/AddNewLines.tsx b/ts/components/conversation/AddNewLines.tsx
index 303d87a748..171f9ef7cc 100644
--- a/ts/components/conversation/AddNewLines.tsx
+++ b/ts/components/conversation/AddNewLines.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { RenderTextCallbackType } from '../../types/Util';
type Props = {
diff --git a/ts/components/conversation/ContactName.tsx b/ts/components/conversation/ContactName.tsx
index d370980f26..020c03607e 100644
--- a/ts/components/conversation/ContactName.tsx
+++ b/ts/components/conversation/ContactName.tsx
@@ -1,5 +1,5 @@
import classNames from 'classnames';
-import React from 'react';
+import { CSSProperties } from 'react';
import {
useIsPrivate,
@@ -28,7 +28,7 @@ export const ContactName = (props: Props) => {
'min-width': 0,
'text-overflow': 'ellipsis',
overflow: 'hidden',
- } as React.CSSProperties;
+ } as CSSProperties;
const styles = (
boldProfileName
@@ -37,7 +37,7 @@ export const ContactName = (props: Props) => {
...commonStyles,
}
: commonStyles
- ) as React.CSSProperties;
+ ) as CSSProperties;
const textProfile = profileName || name || convoName || window.i18n('anonymous');
return (
diff --git a/ts/components/conversation/Emojify.tsx b/ts/components/conversation/Emojify.tsx
index 0eb210536f..948d335ae1 100644
--- a/ts/components/conversation/Emojify.tsx
+++ b/ts/components/conversation/Emojify.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SizeClassType } from '../../util/emoji';
import { RenderTextCallbackType } from '../../types/Util';
diff --git a/ts/components/conversation/ExpireTimer.tsx b/ts/components/conversation/ExpireTimer.tsx
index 3aa8012864..099748a6e9 100644
--- a/ts/components/conversation/ExpireTimer.tsx
+++ b/ts/components/conversation/ExpireTimer.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useState } from 'react';
+import { useCallback, useState } from 'react';
import useInterval from 'react-use/lib/useInterval';
import styled, { CSSProperties } from 'styled-components';
diff --git a/ts/components/conversation/H5AudioPlayer.tsx b/ts/components/conversation/H5AudioPlayer.tsx
index 2ace8bde95..4581426dd8 100644
--- a/ts/components/conversation/H5AudioPlayer.tsx
+++ b/ts/components/conversation/H5AudioPlayer.tsx
@@ -1,5 +1,5 @@
// Audio Player
-import React, { useEffect, useRef, useState } from 'react';
+import { useEffect, useRef, useState } from 'react';
import H5AudioPlayer, { RHAP_UI } from 'react-h5-audio-player';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
diff --git a/ts/components/conversation/Image.tsx b/ts/components/conversation/Image.tsx
index dc051e2197..07ee2e577f 100644
--- a/ts/components/conversation/Image.tsx
+++ b/ts/components/conversation/Image.tsx
@@ -1,12 +1,12 @@
import classNames from 'classnames';
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import styled from 'styled-components';
import { isNumber } from 'lodash';
import { useDisableDrag } from '../../hooks/useDisableDrag';
import { useEncryptedFileFetch } from '../../hooks/useEncryptedFileFetch';
import { AttachmentType, AttachmentTypeWithPath } from '../../types/Attachment';
-import { Spinner } from '../basic/Spinner';
+import { Spinner } from '../loading';
type Props = {
alt: string;
diff --git a/ts/components/conversation/ImageGrid.tsx b/ts/components/conversation/ImageGrid.tsx
index d4f9c3ce7c..7e6120b91d 100644
--- a/ts/components/conversation/ImageGrid.tsx
+++ b/ts/components/conversation/ImageGrid.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import {
diff --git a/ts/components/conversation/MessageRequestButtons.tsx b/ts/components/conversation/MessageRequestButtons.tsx
index e06748a042..f2b4a6f31f 100644
--- a/ts/components/conversation/MessageRequestButtons.tsx
+++ b/ts/components/conversation/MessageRequestButtons.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { useIsIncomingRequest } from '../../hooks/useParamSelector';
diff --git a/ts/components/conversation/SessionConversation.tsx b/ts/components/conversation/SessionConversation.tsx
index 8e74d07e6e..e0bb247ce6 100644
--- a/ts/components/conversation/SessionConversation.tsx
+++ b/ts/components/conversation/SessionConversation.tsx
@@ -1,10 +1,10 @@
import _ from 'lodash';
-import React from 'react';
import autoBind from 'auto-bind';
import { blobToArrayBuffer } from 'blob-util';
import loadImage from 'blueimp-load-image';
import classNames from 'classnames';
+import { Component, RefObject, createRef } from 'react';
import styled from 'styled-components';
import {
CompositionBox,
@@ -45,7 +45,7 @@ import {
} from '../../types/attachments/VisualAttachment';
import { AttachmentUtil, GoogleChrome, arrayBufferToObjectURL } from '../../util';
import { getCurrentRecoveryPhrase } from '../../util/storage';
-import { MessageView } from '../MainViewController';
+import { EmptyMessageView } from '../EmptyMessageView';
import { SplitViewContainer } from '../SplitViewContainer';
import { SessionButtonColor } from '../basic/SessionButton';
import { InConversationCallContainer } from '../calling/InConversationCallContainer';
@@ -56,10 +56,11 @@ import { ConversationHeaderWithDetails } from './header/ConversationHeader';
import { isAudio } from '../../types/MIME';
import { HTMLDirection } from '../../util/i18n';
import { NoticeBanner } from '../NoticeBanner';
-import { SessionSpinner } from '../basic/SessionSpinner';
+import { SessionSpinner } from '../loading';
import { RightPanel, StyledRightPanelContainer } from './right-panel/RightPanel';
const DEFAULT_JPEG_QUALITY = 0.85;
+
interface State {
isDraggingFile: boolean;
}
@@ -102,8 +103,8 @@ const ConvoLoadingSpinner = () => {
);
};
-export class SessionConversation extends React.Component {
- private readonly messageContainerRef: React.RefObject;
+export class SessionConversation extends Component {
+ private readonly messageContainerRef: RefObject;
private dragCounter: number;
private publicMembersRefreshTimeout?: NodeJS.Timeout;
private readonly updateMemberList: () => any;
@@ -114,7 +115,7 @@ export class SessionConversation extends React.Component {
this.state = {
isDraggingFile: false,
};
- this.messageContainerRef = React.createRef();
+ this.messageContainerRef = createRef();
this.dragCounter = 0;
this.updateMemberList = _.debounce(this.updateMemberListBouncy.bind(this), 10000);
@@ -208,8 +209,8 @@ export class SessionConversation extends React.Component {
if (msg.body.replace(/\s/g, '').includes(recoveryPhrase.replace(/\s/g, ''))) {
window.inboxStore?.dispatch(
updateConfirmModal({
- title: window.i18n('sendRecoveryPhraseTitle'),
- message: window.i18n('sendRecoveryPhraseMessage'),
+ title: window.i18n('warning'),
+ message: window.i18n('recoveryPasswordWarningSendDescription'),
okTheme: SessionButtonColor.Danger,
onClickOk: () => {
void sendAndScroll();
@@ -243,8 +244,7 @@ export class SessionConversation extends React.Component {
} = this.props;
if (!selectedConversation || !messagesProps) {
- // return an empty message view
- return ;
+ return ;
}
// TODOLATER break selectionMode into it's own container component so we can use hooks to fetch relevant state from the store
const selectionMode = selectedMessages.length > 0;
diff --git a/ts/components/conversation/SessionEmojiPanel.tsx b/ts/components/conversation/SessionEmojiPanel.tsx
index 6da033cccf..1f6fc34633 100644
--- a/ts/components/conversation/SessionEmojiPanel.tsx
+++ b/ts/components/conversation/SessionEmojiPanel.tsx
@@ -1,9 +1,10 @@
-import React, { forwardRef } from 'react';
+import Picker from '@emoji-mart/react';
import classNames from 'classnames';
-import styled from 'styled-components';
+import { forwardRef } from 'react';
import { useSelector } from 'react-redux';
-import Picker from '@emoji-mart/react';
+import styled from 'styled-components';
+import { getPrimaryColor } from '../../state/selectors/primaryColor';
import { getTheme, isDarkTheme } from '../../state/selectors/theme';
import {
COLORS,
@@ -11,12 +12,10 @@ import {
PrimaryColorStateType,
THEMES,
ThemeStateType,
- // eslint-disable-next-line import/extensions
-} from '../../themes/constants/colors.js';
-import { hexColorToRGB } from '../../util/hexColorToRGB';
-import { getPrimaryColor } from '../../state/selectors/primaryColor';
-import { i18nEmojiData } from '../../util/emoji';
+} from '../../themes/constants/colors';
import { FixedBaseEmoji } from '../../types/Reaction';
+import { i18nEmojiData } from '../../util/emoji';
+import { hexColorToRGB } from '../../util/hexColorToRGB';
export const StyledEmojiPanel = styled.div<{
isModal: boolean;
diff --git a/ts/components/conversation/SessionFileDropzone.tsx b/ts/components/conversation/SessionFileDropzone.tsx
index 9a6b874301..ded1e41937 100644
--- a/ts/components/conversation/SessionFileDropzone.tsx
+++ b/ts/components/conversation/SessionFileDropzone.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { Flex } from '../basic/Flex';
import { SessionIcon } from '../icon';
diff --git a/ts/components/conversation/SessionLastSeenIndicator.tsx b/ts/components/conversation/SessionLastSeenIndicator.tsx
index 31ff6458af..56eda2cc60 100644
--- a/ts/components/conversation/SessionLastSeenIndicator.tsx
+++ b/ts/components/conversation/SessionLastSeenIndicator.tsx
@@ -1,4 +1,4 @@
-import React, { useLayoutEffect } from 'react';
+import { useLayoutEffect } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { useScrollToLoadedMessage } from '../../contexts/ScrollToLoadedMessage';
diff --git a/ts/components/conversation/SessionMessagesList.tsx b/ts/components/conversation/SessionMessagesList.tsx
index 3f7f4d42aa..744d8a7006 100644
--- a/ts/components/conversation/SessionMessagesList.tsx
+++ b/ts/components/conversation/SessionMessagesList.tsx
@@ -1,4 +1,4 @@
-import React, { useLayoutEffect, useState } from 'react';
+import { useLayoutEffect, useState } from 'react';
import { useSelector } from 'react-redux';
import useKey from 'react-use/lib/useKey';
diff --git a/ts/components/conversation/SessionMessagesListContainer.tsx b/ts/components/conversation/SessionMessagesListContainer.tsx
index 5da6eccfca..76319376fb 100644
--- a/ts/components/conversation/SessionMessagesListContainer.tsx
+++ b/ts/components/conversation/SessionMessagesListContainer.tsx
@@ -1,17 +1,16 @@
-import React from 'react';
-
import { contextMenu } from 'react-contexify';
import { connect } from 'react-redux';
import autoBind from 'auto-bind';
+import { Component, RefObject } from 'react';
import styled from 'styled-components';
import {
- quotedMessageToAnimate,
ReduxConversationType,
+ SortedMessageModelProps,
+ quotedMessageToAnimate,
resetOldBottomMessageId,
resetOldTopMessageId,
- SortedMessageModelProps,
} from '../../state/ducks/conversations';
import { SessionScrollButton } from '../SessionScrollButton';
@@ -31,7 +30,7 @@ import { SessionMessagesList } from './SessionMessagesList';
import { TypingBubble } from './TypingBubble';
export type SessionMessageListProps = {
- messageContainerRef: React.RefObject;
+ messageContainerRef: RefObject;
};
export const messageContainerDomID = 'messages-container';
@@ -70,7 +69,7 @@ const StyledTypingBubble = styled(TypingBubble)`
margin: var(--margins-xs) var(--margins-lg) 0;
`;
-class SessionMessagesListContainerInner extends React.Component {
+class SessionMessagesListContainerInner extends Component {
private timeoutResetQuotedScroll: NodeJS.Timeout | null = null;
public constructor(props: Props) {
diff --git a/ts/components/conversation/SessionQuotedMessageComposition.tsx b/ts/components/conversation/SessionQuotedMessageComposition.tsx
index fc53712091..d13817a790 100644
--- a/ts/components/conversation/SessionQuotedMessageComposition.tsx
+++ b/ts/components/conversation/SessionQuotedMessageComposition.tsx
@@ -1,7 +1,6 @@
-import React from 'react';
-import styled from 'styled-components';
import { useDispatch, useSelector } from 'react-redux';
import useKey from 'react-use/lib/useKey';
+import styled from 'styled-components';
import { SessionIcon, SessionIconButton } from '../icon';
import { quoteMessage } from '../../state/ducks/conversations';
@@ -11,9 +10,9 @@ import { AUDIO_MP3 } from '../../types/MIME';
import { Flex } from '../basic/Flex';
import { Image } from './Image';
+import { findAndFormatContact } from '../../models/message';
import { getAbsoluteAttachmentPath } from '../../types/MessageAttachment';
import { GoogleChrome } from '../../util';
-import { findAndFormatContact } from '../../models/message';
const QuotedMessageComposition = styled(Flex)`
border-top: 1px solid var(--border-color);
diff --git a/ts/components/conversation/SessionRecording.tsx b/ts/components/conversation/SessionRecording.tsx
index d2f30b417e..72c55091f8 100644
--- a/ts/components/conversation/SessionRecording.tsx
+++ b/ts/components/conversation/SessionRecording.tsx
@@ -1,15 +1,16 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
-import React from 'react';
+
import classNames from 'classnames';
import moment from 'moment';
import autoBind from 'auto-bind';
import MicRecorder from 'mic-recorder-to-mp3';
+import { Component } from 'react';
import styled from 'styled-components';
-import { SessionIconButton } from '../icon';
import { Constants } from '../../session';
-import { ToastUtils } from '../../session/utils';
import { MAX_ATTACHMENT_FILESIZE_BYTES } from '../../session/constants';
+import { ToastUtils } from '../../session/utils';
+import { SessionIconButton } from '../icon';
interface Props {
onExitVoiceNoteView: () => void;
@@ -49,7 +50,7 @@ const StyledFlexWrapper = styled.div`
}
`;
-export class SessionRecording extends React.Component {
+export class SessionRecording extends Component {
private recorder?: any;
private audioBlobMp3?: Blob;
private audioElement?: HTMLAudioElement | null;
@@ -162,12 +163,7 @@ export class SessionRecording extends React.Component {
) : null}
{!isRecording && (
-
+
void;
diff --git a/ts/components/conversation/StagedAttachmentList.tsx b/ts/components/conversation/StagedAttachmentList.tsx
index cf5d3218a1..9c37d7f3e5 100644
--- a/ts/components/conversation/StagedAttachmentList.tsx
+++ b/ts/components/conversation/StagedAttachmentList.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { useDispatch } from 'react-redux';
import styled from 'styled-components';
import {
diff --git a/ts/components/conversation/StagedGenericAttachment.tsx b/ts/components/conversation/StagedGenericAttachment.tsx
index 7ce239c491..52d9d6ec07 100644
--- a/ts/components/conversation/StagedGenericAttachment.tsx
+++ b/ts/components/conversation/StagedGenericAttachment.tsx
@@ -1,36 +1,32 @@
-import React from 'react';
-
import { AttachmentType, getExtensionForDisplay } from '../../types/Attachment';
-interface Props {
+type Props = {
attachment: AttachmentType;
onClose: (attachment: AttachmentType) => void;
-}
+};
-export class StagedGenericAttachment extends React.Component {
- public render() {
- const { attachment, onClose } = this.props;
- const { fileName, contentType } = attachment;
- const extension = getExtensionForDisplay({ contentType, fileName });
+export function StagedGenericAttachment(props: Props) {
+ const { attachment, onClose } = props;
+ const { fileName, contentType } = attachment;
+ const extension = getExtensionForDisplay({ contentType, fileName });
- return (
-
-
{
- if (onClose) {
- onClose(attachment);
- }
- }}
- />
-
- {extension ? (
-
{extension}
- ) : null}
-
-
{fileName}
+ return (
+
+
{
+ if (onClose) {
+ onClose(attachment);
+ }
+ }}
+ />
+
+ {extension ? (
+
{extension}
+ ) : null}
- );
- }
+
{fileName}
+
+ );
}
diff --git a/ts/components/conversation/StagedLinkPreview.tsx b/ts/components/conversation/StagedLinkPreview.tsx
index bec1a2db98..64d51fced7 100644
--- a/ts/components/conversation/StagedLinkPreview.tsx
+++ b/ts/components/conversation/StagedLinkPreview.tsx
@@ -1,14 +1,13 @@
-import React from 'react';
import styled from 'styled-components';
import { Image } from './Image';
-import { SessionSpinner } from '../basic/SessionSpinner';
-import { StagedLinkPreviewImage } from './composition/CompositionBox';
-import { isImage } from '../../types/MIME';
import { fromArrayBufferToBase64 } from '../../session/utils/String';
+import { isImage } from '../../types/MIME';
import { Flex } from '../basic/Flex';
import { SessionIconButton } from '../icon';
+import { SessionSpinner } from '../loading';
+import { StagedLinkPreviewImage } from './composition/CompositionBox';
type Props = {
isLoaded: boolean;
diff --git a/ts/components/conversation/StagedPlaceholderAttachment.tsx b/ts/components/conversation/StagedPlaceholderAttachment.tsx
index 99b91ff06d..6edf2fe21a 100644
--- a/ts/components/conversation/StagedPlaceholderAttachment.tsx
+++ b/ts/components/conversation/StagedPlaceholderAttachment.tsx
@@ -1,4 +1,4 @@
-import React, { MouseEvent } from 'react';
+import { MouseEvent } from 'react';
import styled from 'styled-components';
interface Props {
diff --git a/ts/components/conversation/SubtleNotification.tsx b/ts/components/conversation/SubtleNotification.tsx
index 1a1730b9d5..336fe03e2c 100644
--- a/ts/components/conversation/SubtleNotification.tsx
+++ b/ts/components/conversation/SubtleNotification.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { useIsIncomingRequest } from '../../hooks/useParamSelector';
@@ -47,7 +46,7 @@ export const ConversationRequestExplanation = () => {
return (
- {window.i18n('respondingToRequestWarning')}
+ {window.i18n('messageRequestsAcceptDescription')}
);
};
diff --git a/ts/components/conversation/TimerNotification.tsx b/ts/components/conversation/TimerNotification.tsx
index 6c3791eacd..ab1513256b 100644
--- a/ts/components/conversation/TimerNotification.tsx
+++ b/ts/components/conversation/TimerNotification.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { useDispatch } from 'react-redux';
import styled from 'styled-components';
import { PropsForExpirationTimer } from '../../state/ducks/conversations';
diff --git a/ts/components/conversation/Timestamp.tsx b/ts/components/conversation/Timestamp.tsx
index de2ee1139e..f21913f725 100644
--- a/ts/components/conversation/Timestamp.tsx
+++ b/ts/components/conversation/Timestamp.tsx
@@ -1,9 +1,8 @@
-import React from 'react';
import moment from 'moment';
import useInterval from 'react-use/lib/useInterval';
-import styled from 'styled-components';
import useUpdate from 'react-use/lib/useUpdate';
+import styled from 'styled-components';
type Props = {
timestamp?: number;
diff --git a/ts/components/conversation/TypingAnimation.tsx b/ts/components/conversation/TypingAnimation.tsx
index 7ec13f7f52..4294b6056f 100644
--- a/ts/components/conversation/TypingAnimation.tsx
+++ b/ts/components/conversation/TypingAnimation.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
const StyledTypingContainer = styled.div`
diff --git a/ts/components/conversation/TypingBubble.tsx b/ts/components/conversation/TypingBubble.tsx
index 0e2ed1fdfc..813b516c5d 100644
--- a/ts/components/conversation/TypingBubble.tsx
+++ b/ts/components/conversation/TypingBubble.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { ConversationTypeEnum } from '../../models/conversationAttributes';
diff --git a/ts/components/conversation/composition/CompositionBox.tsx b/ts/components/conversation/composition/CompositionBox.tsx
index 466a9aeb00..e6da1fe9a5 100644
--- a/ts/components/conversation/composition/CompositionBox.tsx
+++ b/ts/components/conversation/composition/CompositionBox.tsx
@@ -1,5 +1,5 @@
import _, { debounce, isEmpty } from 'lodash';
-import React from 'react';
+
import { connect } from 'react-redux';
import styled from 'styled-components';
@@ -7,6 +7,7 @@ import { AbortController } from 'abort-controller';
import { Mention, MentionsInput, SuggestionDataItem } from 'react-mentions';
import autoBind from 'auto-bind';
+import { Component, RefObject, createRef } from 'react';
import * as MIME from '../../../types/MIME';
import { SessionEmojiPanel, StyledEmojiPanel } from '../SessionEmojiPanel';
@@ -268,10 +269,10 @@ const StyledSendMessageInput = styled.div<{ dir?: HTMLDirection }>`
}
`;
-class CompositionBoxInner extends React.Component
{
- private readonly textarea: React.RefObject;
- private readonly fileInput: React.RefObject;
- private readonly emojiPanel: React.RefObject;
+class CompositionBoxInner extends Component {
+ private readonly textarea: RefObject;
+ private readonly fileInput: RefObject;
+ private readonly emojiPanel: RefObject;
private readonly emojiPanelButton: any;
private linkPreviewAbortController?: AbortController;
private container: HTMLDivElement | null;
@@ -281,13 +282,13 @@ class CompositionBoxInner extends React.Component {
super(props);
this.state = getDefaultState(props.selectedConversationKey);
- this.textarea = React.createRef();
- this.fileInput = React.createRef();
+ this.textarea = createRef();
+ this.fileInput = createRef();
this.container = null;
// Emojis
- this.emojiPanel = React.createRef();
- this.emojiPanelButton = React.createRef();
+ this.emojiPanel = createRef();
+ this.emojiPanelButton = createRef();
autoBind(this);
this.toggleEmojiPanel = debounce(this.toggleEmojiPanel.bind(this), 100);
}
diff --git a/ts/components/conversation/composition/CompositionButtons.tsx b/ts/components/conversation/composition/CompositionButtons.tsx
index 3b145e2975..4a5d3cb89e 100644
--- a/ts/components/conversation/composition/CompositionButtons.tsx
+++ b/ts/components/conversation/composition/CompositionButtons.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { forwardRef } from 'react';
import styled from 'styled-components';
import { SessionIconButton } from '../../icon';
@@ -49,7 +49,7 @@ export const StartRecordingButton = (props: { onClick: () => void }) => {
};
// eslint-disable-next-line react/display-name
-export const ToggleEmojiButton = React.forwardRef void }>(
+export const ToggleEmojiButton = forwardRef void }>(
(props, ref) => {
return (
@@ -71,7 +71,7 @@ export const ToggleEmojiButton = React.forwardRef void }) => {
return (
-
+
{
+export class EmptyState extends Component {
public render() {
const { label } = this.props;
diff --git a/ts/components/conversation/media-gallery/MediaGallery.tsx b/ts/components/conversation/media-gallery/MediaGallery.tsx
index 9cd558233e..571b8f9779 100644
--- a/ts/components/conversation/media-gallery/MediaGallery.tsx
+++ b/ts/components/conversation/media-gallery/MediaGallery.tsx
@@ -1,5 +1,5 @@
import classNames from 'classnames';
-import React, { useCallback, useState } from 'react';
+import { useCallback, useState } from 'react';
import { MediaItemType } from '../../lightbox/LightboxGallery';
import { AttachmentSection } from './AttachmentSection';
diff --git a/ts/components/conversation/media-gallery/MediaGridItem.tsx b/ts/components/conversation/media-gallery/MediaGridItem.tsx
index 1b4822afae..a71d211638 100644
--- a/ts/components/conversation/media-gallery/MediaGridItem.tsx
+++ b/ts/components/conversation/media-gallery/MediaGridItem.tsx
@@ -1,12 +1,12 @@
-import React, { useState } from 'react';
import classNames from 'classnames';
+import { useState } from 'react';
-import { isImageTypeSupported, isVideoTypeSupported } from '../../../util/GoogleChrome';
+import { useDisableDrag } from '../../../hooks/useDisableDrag';
import { useEncryptedFileFetch } from '../../../hooks/useEncryptedFileFetch';
import { showLightBox } from '../../../state/ducks/conversations';
-import { useDisableDrag } from '../../../hooks/useDisableDrag';
-import { LightBoxOptions } from '../SessionConversation';
+import { isImageTypeSupported, isVideoTypeSupported } from '../../../util/GoogleChrome';
import { MediaItemType } from '../../lightbox/LightboxGallery';
+import { LightBoxOptions } from '../SessionConversation';
type Props = {
mediaItem: MediaItemType;
diff --git a/ts/components/conversation/message/message-content/ClickToTrustSender.tsx b/ts/components/conversation/message/message-content/ClickToTrustSender.tsx
index d54733a1ac..ba976e9382 100644
--- a/ts/components/conversation/message/message-content/ClickToTrustSender.tsx
+++ b/ts/components/conversation/message/message-content/ClickToTrustSender.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { Data } from '../../../../data/data';
import { getConversationController } from '../../../../session/conversations';
diff --git a/ts/components/conversation/message/message-content/MessageAttachment.tsx b/ts/components/conversation/message/message-content/MessageAttachment.tsx
index 99adbbba49..ba5161b761 100644
--- a/ts/components/conversation/message/message-content/MessageAttachment.tsx
+++ b/ts/components/conversation/message/message-content/MessageAttachment.tsx
@@ -1,6 +1,6 @@
import classNames from 'classnames';
import { clone } from 'lodash';
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { Data } from '../../../../data/data';
@@ -28,7 +28,7 @@ import {
isVideo,
} from '../../../../types/Attachment';
import { saveAttachmentToDisk } from '../../../../util/attachmentsUtil';
-import { Spinner } from '../../../basic/Spinner';
+import { Spinner } from '../../../loading';
import { AudioPlayerWithEncryptedFile } from '../../H5AudioPlayer';
import { ImageGrid } from '../../ImageGrid';
import { LightBoxOptions } from '../../SessionConversation';
diff --git a/ts/components/conversation/message/message-content/MessageAuthorText.tsx b/ts/components/conversation/message/message-content/MessageAuthorText.tsx
index 4aedcaeb17..845c5f3d5a 100644
--- a/ts/components/conversation/message/message-content/MessageAuthorText.tsx
+++ b/ts/components/conversation/message/message-content/MessageAuthorText.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { PubKey } from '../../../../session/types';
import {
diff --git a/ts/components/conversation/message/message-content/MessageAvatar.tsx b/ts/components/conversation/message/message-content/MessageAvatar.tsx
index e9b0dd9ff8..13e195a69c 100644
--- a/ts/components/conversation/message/message-content/MessageAvatar.tsx
+++ b/ts/components/conversation/message/message-content/MessageAvatar.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { OpenGroupData } from '../../../../data/opengroups';
@@ -62,7 +62,7 @@ export const MessageAvatar = (props: Props) => {
return;
}
if (isPublic && !PubKey.isBlinded(sender)) {
- // public chat but session id not blinded. disable showing user details if we do not have an active convo with that user.
+ // public chat but account id not blinded. disable showing user details if we do not have an active convo with that user.
// an unactive convo with that user means that we never chatted with that id directyly, but only through a sogs
const convoWithSender = getConversationController().get(sender);
if (!convoWithSender || !convoWithSender.get('active_at')) {
diff --git a/ts/components/conversation/message/message-content/MessageBody.tsx b/ts/components/conversation/message/message-content/MessageBody.tsx
index e455c6f0c0..cd1c9a3059 100644
--- a/ts/components/conversation/message/message-content/MessageBody.tsx
+++ b/ts/components/conversation/message/message-content/MessageBody.tsx
@@ -1,5 +1,5 @@
import LinkifyIt from 'linkify-it';
-import React from 'react';
+
import { useDispatch } from 'react-redux';
import styled from 'styled-components';
diff --git a/ts/components/conversation/message/message-content/MessageContent.tsx b/ts/components/conversation/message/message-content/MessageContent.tsx
index 805e8fd313..1f0c872195 100644
--- a/ts/components/conversation/message/message-content/MessageContent.tsx
+++ b/ts/components/conversation/message/message-content/MessageContent.tsx
@@ -1,7 +1,7 @@
import classNames from 'classnames';
import { isEmpty } from 'lodash';
import moment from 'moment';
-import React, { useCallback, useLayoutEffect, useState } from 'react';
+import { MouseEvent, useCallback, useLayoutEffect, useState } from 'react';
import { InView } from 'react-intersection-observer';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
@@ -40,7 +40,7 @@ type Props = {
// TODO not too sure what is this doing? It is not preventDefault()
// or stopPropagation() so I think this is never cancelling a click event?
-function onClickOnMessageInnerContainer(event: React.MouseEvent) {
+function onClickOnMessageInnerContainer(event: MouseEvent) {
const selection = window.getSelection();
// Text is being selected
if (selection && selection.type === 'Range') {
diff --git a/ts/components/conversation/message/message-content/MessageContentWithStatus.tsx b/ts/components/conversation/message/message-content/MessageContentWithStatus.tsx
index a49f084f1f..5c2f3fba90 100644
--- a/ts/components/conversation/message/message-content/MessageContentWithStatus.tsx
+++ b/ts/components/conversation/message/message-content/MessageContentWithStatus.tsx
@@ -1,5 +1,5 @@
import classNames from 'classnames';
-import React, { useCallback, useState } from 'react';
+import { MouseEvent, useCallback, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { useIsDetailMessageView } from '../../../../contexts/isDetailViewContext';
@@ -66,7 +66,7 @@ export const MessageContentWithStatuses = (props: Props) => {
const multiSelectMode = useSelector(isMessageSelectionMode);
const onClickOnMessageOuterContainer = useCallback(
- (event: React.MouseEvent) => {
+ (event: MouseEvent) => {
if (multiSelectMode && props?.messageId) {
event.preventDefault();
event.stopPropagation();
@@ -76,7 +76,7 @@ export const MessageContentWithStatuses = (props: Props) => {
[dispatch, props?.messageId, multiSelectMode]
);
- const onDoubleClickReplyToMessage = (e: React.MouseEvent) => {
+ const onDoubleClickReplyToMessage = (e: MouseEvent) => {
const currentSelection = window.getSelection();
const currentSelectionString = currentSelection?.toString() || undefined;
diff --git a/ts/components/conversation/message/message-content/MessageContextMenu.tsx b/ts/components/conversation/message/message-content/MessageContextMenu.tsx
index d8112c676e..bb64cbd355 100644
--- a/ts/components/conversation/message/message-content/MessageContextMenu.tsx
+++ b/ts/components/conversation/message/message-content/MessageContextMenu.tsx
@@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
-import React, { Dispatch, useCallback, useEffect, useRef, useState } from 'react';
+import { Dispatch, useCallback, useEffect, useRef, useState } from 'react';
import { isNumber } from 'lodash';
import { Item, ItemParams, Menu, useContextMenu } from 'react-contexify';
diff --git a/ts/components/conversation/message/message-content/MessageHighlighter.tsx b/ts/components/conversation/message/message-content/MessageHighlighter.tsx
index d468cacac6..5925b687ac 100644
--- a/ts/components/conversation/message/message-content/MessageHighlighter.tsx
+++ b/ts/components/conversation/message/message-content/MessageHighlighter.tsx
@@ -1,29 +1,29 @@
-import styled, { css, keyframes } from 'styled-components';
+import { motion } from 'framer-motion';
+import { MouseEvent, ReactNode } from 'react';
+import styled from 'styled-components';
-const opacityAnimation = keyframes`
- 0% {
- opacity: 1;
- }
- 25% {
- opacity: 0.2;
- }
- 50% {
- opacity: 1;
- }
- 75% {
- opacity: 0.2;
- }
- 100% {
- opacity: 1;
- }
-`;
+const StyledMessageHighlighter = styled(motion.div)``;
-export const MessageHighlighter = styled.div<{
+export function MessageHighlighter(props: {
+ children: ReactNode;
highlight: boolean;
-}>`
- ${props =>
- props.highlight &&
- css`
- animation: ${opacityAnimation} 1s linear;
- `}
-`;
+ role?: string;
+ className?: string;
+ onClick?: (event: MouseEvent) => void;
+}) {
+ const { className, children, highlight, role, onClick } = props;
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/ts/components/conversation/message/message-content/MessageLinkPreview.tsx b/ts/components/conversation/message/message-content/MessageLinkPreview.tsx
index 2c55150e55..4d093084d4 100644
--- a/ts/components/conversation/message/message-content/MessageLinkPreview.tsx
+++ b/ts/components/conversation/message/message-content/MessageLinkPreview.tsx
@@ -1,5 +1,5 @@
import classNames from 'classnames';
-import React from 'react';
+
import { useDispatch } from 'react-redux';
import { MessageRenderingProps } from '../../../../models/messageType';
import {
diff --git a/ts/components/conversation/message/message-content/MessageQuote.tsx b/ts/components/conversation/message/message-content/MessageQuote.tsx
index 12e20a289c..f48c199feb 100644
--- a/ts/components/conversation/message/message-content/MessageQuote.tsx
+++ b/ts/components/conversation/message/message-content/MessageQuote.tsx
@@ -1,5 +1,6 @@
import { isEmpty, toNumber } from 'lodash';
-import React from 'react';
+
+import { MouseEvent } from 'react';
import { useSelector } from 'react-redux';
import { useIsDetailMessageView } from '../../../../contexts/isDetailViewContext';
import { Data } from '../../../../data/data';
@@ -36,7 +37,7 @@ export const MessageQuote = (props: Props) => {
quote.referencedMessageNotFound || !quote?.author || !quote.id || !quote.convoId
);
- const onQuoteClick = async (event: React.MouseEvent) => {
+ const onQuoteClick = async (event: MouseEvent) => {
event.preventDefault();
event.stopPropagation();
diff --git a/ts/components/conversation/message/message-content/MessageReactBar.tsx b/ts/components/conversation/message/message-content/MessageReactBar.tsx
index 060e12ceab..bf9ec25ee3 100644
--- a/ts/components/conversation/message/message-content/MessageReactBar.tsx
+++ b/ts/components/conversation/message/message-content/MessageReactBar.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { isEmpty } from 'lodash';
diff --git a/ts/components/conversation/message/message-content/MessageReactions.tsx b/ts/components/conversation/message/message-content/MessageReactions.tsx
index 36e8b9bf9c..803bcafbc1 100644
--- a/ts/components/conversation/message/message-content/MessageReactions.tsx
+++ b/ts/components/conversation/message/message-content/MessageReactions.tsx
@@ -1,5 +1,5 @@
import { isEmpty, isEqual } from 'lodash';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import styled from 'styled-components';
import { useIsDetailMessageView } from '../../../../contexts/isDetailViewContext';
import { useMessageReactsPropsById } from '../../../../hooks/useParamSelector';
diff --git a/ts/components/conversation/message/message-content/MessageStatus.tsx b/ts/components/conversation/message/message-content/MessageStatus.tsx
index 4e4a98184b..307e2cb4df 100644
--- a/ts/components/conversation/message/message-content/MessageStatus.tsx
+++ b/ts/components/conversation/message/message-content/MessageStatus.tsx
@@ -1,5 +1,5 @@
import { ipcRenderer } from 'electron';
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { useMessageExpirationPropsById } from '../../../../hooks/useParamSelector';
diff --git a/ts/components/conversation/message/message-content/MessageText.tsx b/ts/components/conversation/message/message-content/MessageText.tsx
index 18a0f39b63..4ba31bee99 100644
--- a/ts/components/conversation/message/message-content/MessageText.tsx
+++ b/ts/components/conversation/message/message-content/MessageText.tsx
@@ -1,15 +1,15 @@
import classNames from 'classnames';
-import React from 'react';
+
import { useSelector } from 'react-redux';
import { isOpenOrClosedGroup } from '../../../../models/conversationAttributes';
import { MessageRenderingProps } from '../../../../models/messageType';
+import { StateType } from '../../../../state/reducer';
import {
getMessageTextProps,
isMessageSelectionMode,
} from '../../../../state/selectors/conversations';
import { SessionIcon } from '../../../icon';
import { MessageBody } from './MessageBody';
-import { StateType } from '../../../../state/reducer';
type Props = {
messageId: string;
diff --git a/ts/components/conversation/message/message-content/Quote.tsx b/ts/components/conversation/message/message-content/Quote.tsx
index 5df515025c..94f151b7d0 100644
--- a/ts/components/conversation/message/message-content/Quote.tsx
+++ b/ts/components/conversation/message/message-content/Quote.tsx
@@ -1,6 +1,6 @@
import classNames from 'classnames';
import { noop } from 'lodash';
-import React, { useState } from 'react';
+import { MouseEvent, useState } from 'react';
import * as MIME from '../../../../types/MIME';
import * as GoogleChrome from '../../../../util/GoogleChrome';
@@ -27,7 +27,7 @@ export type QuotePropsWithoutListener = {
};
export type QuotePropsWithListener = QuotePropsWithoutListener & {
- onClick?: (e: React.MouseEvent) => void;
+ onClick?: (e: MouseEvent) => void;
};
export interface QuotedAttachmentType {
diff --git a/ts/components/conversation/message/message-content/quote/Quote.tsx b/ts/components/conversation/message/message-content/quote/Quote.tsx
index 3c42b14ca7..5181e2e1db 100644
--- a/ts/components/conversation/message/message-content/quote/Quote.tsx
+++ b/ts/components/conversation/message/message-content/quote/Quote.tsx
@@ -1,4 +1,4 @@
-import React, { MouseEvent, useState } from 'react';
+import { MouseEvent, useState } from 'react';
import { isEmpty } from 'lodash';
import styled from 'styled-components';
@@ -51,7 +51,7 @@ export type QuoteProps = {
text?: string;
attachment?: QuotedAttachmentType;
- onClick?: (e: React.MouseEvent) => void;
+ onClick?: (e: MouseEvent) => void;
};
export interface QuotedAttachmentThumbnailType {
diff --git a/ts/components/conversation/message/message-content/quote/QuoteAuthor.tsx b/ts/components/conversation/message/message-content/quote/QuoteAuthor.tsx
index e2b92b3485..75ade98911 100644
--- a/ts/components/conversation/message/message-content/quote/QuoteAuthor.tsx
+++ b/ts/components/conversation/message/message-content/quote/QuoteAuthor.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { useQuoteAuthorName } from '../../../../../hooks/useParamSelector';
import { PubKey } from '../../../../../session/types';
diff --git a/ts/components/conversation/message/message-content/quote/QuoteIconContainer.tsx b/ts/components/conversation/message/message-content/quote/QuoteIconContainer.tsx
index e479a35629..0f1855b031 100644
--- a/ts/components/conversation/message/message-content/quote/QuoteIconContainer.tsx
+++ b/ts/components/conversation/message/message-content/quote/QuoteIconContainer.tsx
@@ -1,13 +1,12 @@
-import React from 'react';
import { isEmpty, noop } from 'lodash';
import styled from 'styled-components';
-import { QuotedAttachmentThumbnailType, QuoteProps } from './Quote';
-import { GoogleChrome } from '../../../../../util';
import { MIME } from '../../../../../types';
+import { GoogleChrome } from '../../../../../util';
+import { QuotedAttachmentThumbnailType, QuoteProps } from './Quote';
-import { QuoteImage } from './QuoteImage';
import { icons, SessionIconType } from '../../../../icon';
+import { QuoteImage } from './QuoteImage';
function getObjectUrl(thumbnail: QuotedAttachmentThumbnailType | undefined): string | undefined {
if (thumbnail && thumbnail.objectUrl) {
diff --git a/ts/components/conversation/message/message-content/quote/QuoteImage.tsx b/ts/components/conversation/message/message-content/quote/QuoteImage.tsx
index 24b29ab545..e7910a95da 100644
--- a/ts/components/conversation/message/message-content/quote/QuoteImage.tsx
+++ b/ts/components/conversation/message/message-content/quote/QuoteImage.tsx
@@ -1,6 +1,5 @@
-import React from 'react';
-import styled from 'styled-components';
import { isEmpty } from 'lodash';
+import styled from 'styled-components';
import { useDisableDrag } from '../../../../../hooks/useDisableDrag';
import { useEncryptedFileFetch } from '../../../../../hooks/useEncryptedFileFetch';
diff --git a/ts/components/conversation/message/message-content/quote/QuoteText.tsx b/ts/components/conversation/message/message-content/quote/QuoteText.tsx
index 39e825b1b5..f680ace6ca 100644
--- a/ts/components/conversation/message/message-content/quote/QuoteText.tsx
+++ b/ts/components/conversation/message/message-content/quote/QuoteText.tsx
@@ -1,5 +1,5 @@
import { isEmpty } from 'lodash';
-import React from 'react';
+
import styled from 'styled-components';
import { useSelectedIsGroupOrCommunity } from '../../../../../state/selectors/selectedConversation';
import { MIME } from '../../../../../types';
diff --git a/ts/components/conversation/message/message-item/DataExtractionNotification.tsx b/ts/components/conversation/message/message-item/DataExtractionNotification.tsx
index 9d93625fea..989a635c6a 100644
--- a/ts/components/conversation/message/message-item/DataExtractionNotification.tsx
+++ b/ts/components/conversation/message/message-item/DataExtractionNotification.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { PropsForDataExtractionNotification } from '../../../../models/messageType';
import { SignalService } from '../../../../protobuf';
import { ExpirableReadableMessage } from './ExpirableReadableMessage';
diff --git a/ts/components/conversation/message/message-item/DateBreak.tsx b/ts/components/conversation/message/message-item/DateBreak.tsx
index 2b672fa6af..0124882933 100644
--- a/ts/components/conversation/message/message-item/DateBreak.tsx
+++ b/ts/components/conversation/message/message-item/DateBreak.tsx
@@ -1,5 +1,5 @@
import moment from 'moment';
-import React from 'react';
+
import styled from 'styled-components';
const DateBreakContainer = styled.div``;
diff --git a/ts/components/conversation/message/message-item/ExpirableReadableMessage.tsx b/ts/components/conversation/message/message-item/ExpirableReadableMessage.tsx
index 3fc0a194d9..2eeab699b7 100644
--- a/ts/components/conversation/message/message-item/ExpirableReadableMessage.tsx
+++ b/ts/components/conversation/message/message-item/ExpirableReadableMessage.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useState } from 'react';
+import { useCallback, useState } from 'react';
import { useDispatch } from 'react-redux';
import { useInterval, useMount } from 'react-use';
import styled from 'styled-components';
diff --git a/ts/components/conversation/message/message-item/GenericReadableMessage.tsx b/ts/components/conversation/message/message-item/GenericReadableMessage.tsx
index ab1254b970..1beaec9006 100644
--- a/ts/components/conversation/message/message-item/GenericReadableMessage.tsx
+++ b/ts/components/conversation/message/message-item/GenericReadableMessage.tsx
@@ -1,6 +1,6 @@
import classNames from 'classnames';
import { isNil, isString, toNumber } from 'lodash';
-import React, { useCallback, useEffect, useState } from 'react';
+import { MouseEvent, useCallback, useEffect, useState } from 'react';
import { contextMenu } from 'react-contexify';
import { useSelector } from 'react-redux';
import styled, { keyframes } from 'styled-components';
@@ -86,7 +86,7 @@ export const GenericReadableMessage = (props: Props) => {
}, [isRightClicked]);
const handleContextMenu = useCallback(
- (e: React.MouseEvent) => {
+ (e: MouseEvent) => {
// this is quite dirty but considering that we want the context menu of the message to show on click on the attachment
// and the context menu save attachment item to save the right attachment I did not find a better way for now.
diff --git a/ts/components/conversation/message/message-item/GroupInvitation.tsx b/ts/components/conversation/message/message-item/GroupInvitation.tsx
index 90926ec50f..23638c67b6 100644
--- a/ts/components/conversation/message/message-item/GroupInvitation.tsx
+++ b/ts/components/conversation/message/message-item/GroupInvitation.tsx
@@ -1,5 +1,5 @@
import classNames from 'classnames';
-import React from 'react';
+
import styled from 'styled-components';
import { acceptOpenGroupInvitation } from '../../../../interactions/messageInteractions';
diff --git a/ts/components/conversation/message/message-item/GroupUpdateMessage.tsx b/ts/components/conversation/message/message-item/GroupUpdateMessage.tsx
index c16f31d46c..8e8df627fa 100644
--- a/ts/components/conversation/message/message-item/GroupUpdateMessage.tsx
+++ b/ts/components/conversation/message/message-item/GroupUpdateMessage.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { useConversationsUsernameWithQuoteOrFullPubkey } from '../../../../hooks/useParamSelector';
import { arrayContainsUsOnly } from '../../../../models/message';
import {
diff --git a/ts/components/conversation/message/message-item/InteractionNotification.tsx b/ts/components/conversation/message/message-item/InteractionNotification.tsx
index b4d30c6353..4cd90c5eb5 100644
--- a/ts/components/conversation/message/message-item/InteractionNotification.tsx
+++ b/ts/components/conversation/message/message-item/InteractionNotification.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { isEmpty } from 'lodash';
import styled from 'styled-components';
import { useIsPrivate, useIsPublic } from '../../../../hooks/useParamSelector';
diff --git a/ts/components/conversation/message/message-item/Message.tsx b/ts/components/conversation/message/message-item/Message.tsx
index b038a3de8a..897a8cfc3c 100644
--- a/ts/components/conversation/message/message-item/Message.tsx
+++ b/ts/components/conversation/message/message-item/Message.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { useSelector } from 'react-redux';
import { v4 as uuidv4 } from 'uuid';
import { StateType } from '../../../../state/reducer';
diff --git a/ts/components/conversation/message/message-item/MessageRequestResponse.tsx b/ts/components/conversation/message/message-item/MessageRequestResponse.tsx
index 23076369c4..b98befc230 100644
--- a/ts/components/conversation/message/message-item/MessageRequestResponse.tsx
+++ b/ts/components/conversation/message/message-item/MessageRequestResponse.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useConversationUsername } from '../../../../hooks/useParamSelector';
import { PropsForMessageRequestResponse } from '../../../../models/messageType';
import { UserUtils } from '../../../../session/utils';
diff --git a/ts/components/conversation/message/message-item/ReadableMessage.tsx b/ts/components/conversation/message/message-item/ReadableMessage.tsx
index 0d436d9d86..39491913f3 100644
--- a/ts/components/conversation/message/message-item/ReadableMessage.tsx
+++ b/ts/components/conversation/message/message-item/ReadableMessage.tsx
@@ -1,5 +1,13 @@
import { debounce, noop } from 'lodash';
-import React, { AriaRole, MouseEventHandler, useCallback, useLayoutEffect, useState } from 'react';
+import {
+ AriaRole,
+ MouseEvent,
+ MouseEventHandler,
+ ReactNode,
+ useCallback,
+ useLayoutEffect,
+ useState,
+} from 'react';
import { InView } from 'react-intersection-observer';
import { useDispatch, useSelector } from 'react-redux';
import { useScrollToLoadedMessage } from '../../../../contexts/ScrollToLoadedMessage';
@@ -24,7 +32,7 @@ import { getIsAppFocused } from '../../../../state/selectors/section';
import { useSelectedConversationKey } from '../../../../state/selectors/selectedConversation';
export type ReadableMessageProps = {
- children: React.ReactNode;
+ children: ReactNode;
messageId: string;
className?: string;
receivedAt: number | undefined;
@@ -33,7 +41,7 @@ export type ReadableMessageProps = {
onDoubleClickCapture?: MouseEventHandler;
role?: AriaRole;
dataTestId: string;
- onContextMenu?: (e: React.MouseEvent) => void;
+ onContextMenu?: (e: MouseEvent) => void;
isControlMessage?: boolean;
};
diff --git a/ts/components/conversation/message/message-item/notification-bubble/CallNotification.tsx b/ts/components/conversation/message/message-item/notification-bubble/CallNotification.tsx
index ea983a8961..2dbdef429e 100644
--- a/ts/components/conversation/message/message-item/notification-bubble/CallNotification.tsx
+++ b/ts/components/conversation/message/message-item/notification-bubble/CallNotification.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { PubKey } from '../../../../../session/types';
import {
diff --git a/ts/components/conversation/message/message-item/notification-bubble/NotificationBubble.tsx b/ts/components/conversation/message/message-item/notification-bubble/NotificationBubble.tsx
index 959f72d8cd..7f1b7e6eff 100644
--- a/ts/components/conversation/message/message-item/notification-bubble/NotificationBubble.tsx
+++ b/ts/components/conversation/message/message-item/notification-bubble/NotificationBubble.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { SessionIcon, SessionIconType } from '../../../../icon';
diff --git a/ts/components/conversation/message/reactions/Reaction.tsx b/ts/components/conversation/message/reactions/Reaction.tsx
index 2d789b2b1a..0ab95666fe 100644
--- a/ts/components/conversation/message/reactions/Reaction.tsx
+++ b/ts/components/conversation/message/reactions/Reaction.tsx
@@ -1,4 +1,4 @@
-import React, { useRef, useState } from 'react';
+import { useRef, useState } from 'react';
import { useMouse } from 'react-use';
import styled from 'styled-components';
import { useRightOverlayMode } from '../../../../hooks/useUI';
diff --git a/ts/components/conversation/message/reactions/ReactionPopup.tsx b/ts/components/conversation/message/reactions/ReactionPopup.tsx
index f438266cff..1c64091208 100644
--- a/ts/components/conversation/message/reactions/ReactionPopup.tsx
+++ b/ts/components/conversation/message/reactions/ReactionPopup.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { Data } from '../../../../data/data';
diff --git a/ts/components/conversation/right-panel/RightPanel.tsx b/ts/components/conversation/right-panel/RightPanel.tsx
index 8dc6c1b3f1..42529ffac3 100644
--- a/ts/components/conversation/right-panel/RightPanel.tsx
+++ b/ts/components/conversation/right-panel/RightPanel.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import styled from 'styled-components';
import { useRightOverlayMode } from '../../../hooks/useUI';
import { isRtlBody } from '../../../util/i18n';
@@ -11,23 +9,18 @@ import { OverlayMessageInfo } from './overlay/message-info/OverlayMessageInfo';
export const StyledRightPanelContainer = styled.div`
position: absolute;
height: var(--right-panel-height);
+ width: var(--right-panel-width);
right: 0vw;
- transition: transform var(--default-duration) ease-in-out;
+ transition: transform var(--right-panel-duration) linear;
transform: translateX(100%);
- will-change: transform;
- width: var(--right-panel-width);
- z-index: 5;
+ z-index: 3;
background-color: var(--background-primary-color);
border-left: 1px solid var(--border-color);
- visibility: hidden;
&.show {
- transform: none;
- transition: transform var(--default-duration) ease-in-out;
- z-index: 3;
- visibility: visible;
+ transform: translateX(0);
}
`;
diff --git a/ts/components/conversation/right-panel/overlay/OverlayRightPanelSettings.tsx b/ts/components/conversation/right-panel/overlay/OverlayRightPanelSettings.tsx
index d3db66a94d..52582c50d3 100644
--- a/ts/components/conversation/right-panel/overlay/OverlayRightPanelSettings.tsx
+++ b/ts/components/conversation/right-panel/overlay/OverlayRightPanelSettings.tsx
@@ -1,5 +1,5 @@
import { compact, flatten, isEqual } from 'lodash';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { useDispatch } from 'react-redux';
import useInterval from 'react-use/lib/useInterval';
diff --git a/ts/components/conversation/right-panel/overlay/components/Header.tsx b/ts/components/conversation/right-panel/overlay/components/Header.tsx
index b2a84712ff..0ba4ccadc1 100644
--- a/ts/components/conversation/right-panel/overlay/components/Header.tsx
+++ b/ts/components/conversation/right-panel/overlay/components/Header.tsx
@@ -1,4 +1,4 @@
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import { useDispatch } from 'react-redux';
import styled from 'styled-components';
import { closeRightPanel } from '../../../../../state/ducks/conversations';
diff --git a/ts/components/conversation/right-panel/overlay/disappearing-messages/DisappearingModes.tsx b/ts/components/conversation/right-panel/overlay/disappearing-messages/DisappearingModes.tsx
index 3683119cc9..1463db5543 100644
--- a/ts/components/conversation/right-panel/overlay/disappearing-messages/DisappearingModes.tsx
+++ b/ts/components/conversation/right-panel/overlay/disappearing-messages/DisappearingModes.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { DisappearingMessageConversationModeType } from '../../../../../session/disappearing_messages/types';
import { PanelButtonGroup, PanelLabel } from '../../../../buttons/PanelButton';
import { PanelRadioButton } from '../../../../buttons/PanelRadioButton';
diff --git a/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages.tsx b/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages.tsx
index 087074d372..ddaa235ed2 100644
--- a/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages.tsx
+++ b/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { useTimerOptionsByMode } from '../../../../../hooks/useParamSelector';
diff --git a/ts/components/conversation/right-panel/overlay/disappearing-messages/TimeOptions.tsx b/ts/components/conversation/right-panel/overlay/disappearing-messages/TimeOptions.tsx
index cb8273bbb8..7de69115d2 100644
--- a/ts/components/conversation/right-panel/overlay/disappearing-messages/TimeOptions.tsx
+++ b/ts/components/conversation/right-panel/overlay/disappearing-messages/TimeOptions.tsx
@@ -1,5 +1,5 @@
import { isEmpty } from 'lodash';
-import React from 'react';
+
import { TimerOptionsArray } from '../../../../../session/disappearing_messages/timerOptions';
import { PanelButtonGroup, PanelLabel } from '../../../../buttons/PanelButton';
import { PanelRadioButton } from '../../../../buttons/PanelRadioButton';
diff --git a/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx b/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx
index bbd1fb53c9..e7605d19fa 100644
--- a/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx
+++ b/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
diff --git a/ts/components/conversation/right-panel/overlay/message-info/components/AttachmentCarousel.tsx b/ts/components/conversation/right-panel/overlay/message-info/components/AttachmentCarousel.tsx
index 3470c3b5f4..2a299cee6c 100644
--- a/ts/components/conversation/right-panel/overlay/message-info/components/AttachmentCarousel.tsx
+++ b/ts/components/conversation/right-panel/overlay/message-info/components/AttachmentCarousel.tsx
@@ -1,5 +1,5 @@
import { isEmpty } from 'lodash';
-import React, { useCallback, useState } from 'react';
+import { useCallback, useState } from 'react';
import styled, { CSSProperties } from 'styled-components';
import { PropsForAttachment } from '../../../../../../state/ducks/conversations';
import { getAlt, getThumbnailUrl, isVideoAttachment } from '../../../../../../types/Attachment';
diff --git a/ts/components/conversation/right-panel/overlay/message-info/components/AttachmentInfo.tsx b/ts/components/conversation/right-panel/overlay/message-info/components/AttachmentInfo.tsx
index 44344b5a64..0623ec3c3a 100644
--- a/ts/components/conversation/right-panel/overlay/message-info/components/AttachmentInfo.tsx
+++ b/ts/components/conversation/right-panel/overlay/message-info/components/AttachmentInfo.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { LabelWithInfo } from '.';
import { PropsForAttachment } from '../../../../../../state/ducks/conversations';
diff --git a/ts/components/conversation/right-panel/overlay/message-info/components/MessageFrom.tsx b/ts/components/conversation/right-panel/overlay/message-info/components/MessageFrom.tsx
index e7c90df471..520fad45d7 100644
--- a/ts/components/conversation/right-panel/overlay/message-info/components/MessageFrom.tsx
+++ b/ts/components/conversation/right-panel/overlay/message-info/components/MessageFrom.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { MessageInfoLabel } from '.';
import { useConversationUsername } from '../../../../../../hooks/useParamSelector';
diff --git a/ts/components/conversation/right-panel/overlay/message-info/components/MessageInfo.tsx b/ts/components/conversation/right-panel/overlay/message-info/components/MessageInfo.tsx
index 4bda46496e..e165f63b33 100644
--- a/ts/components/conversation/right-panel/overlay/message-info/components/MessageInfo.tsx
+++ b/ts/components/conversation/right-panel/overlay/message-info/components/MessageInfo.tsx
@@ -3,7 +3,6 @@ import { ipcRenderer } from 'electron';
import { isEmpty } from 'lodash';
import moment from 'moment';
-import React from 'react';
import styled from 'styled-components';
import { MessageFrom } from '.';
import {
diff --git a/ts/components/dialog/BanOrUnbanUserDialog.tsx b/ts/components/dialog/BanOrUnbanUserDialog.tsx
index 41348238cc..7f55b9ca97 100644
--- a/ts/components/dialog/BanOrUnbanUserDialog.tsx
+++ b/ts/components/dialog/BanOrUnbanUserDialog.tsx
@@ -1,4 +1,4 @@
-import React, { useRef, useState } from 'react';
+import { ChangeEvent, useRef, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useFocusMount } from '../../hooks/useFocusMount';
@@ -17,8 +17,8 @@ import { SessionHeaderSearchInput } from '../SessionHeaderSearchInput';
import { SessionWrapperModal } from '../SessionWrapperModal';
import { Flex } from '../basic/Flex';
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
-import { SessionSpinner } from '../basic/SessionSpinner';
import { SpacerSM } from '../basic/Text';
+import { SessionSpinner } from '../loading';
async function banOrUnBanUserCall(
convo: ConversationModel,
@@ -108,7 +108,7 @@ export const BanOrUnBanUserDialog = (props: {
const chatName = convo.getNicknameOrRealUsernameOrPlaceholder();
const title = `${isBan ? window.i18n('banUser') : window.i18n('unbanUser')}: ${chatName}`;
- const onPubkeyBoxChanges = (e: React.ChangeEvent) => {
+ const onPubkeyBoxChanges = (e: ChangeEvent) => {
setInputBoxValue(e.target.value?.trim() || '');
};
@@ -134,7 +134,7 @@ export const BanOrUnBanUserDialog = (props: {
ref={inputRef}
type="text"
darkMode={darkMode}
- placeholder={i18n('enterSessionID')}
+ placeholder={i18n('accountIdEnter')}
dir="auto"
onChange={onPubkeyBoxChanges}
disabled={inProgress || wasGivenAPubkey}
diff --git a/ts/components/dialog/DeleteAccountModal.tsx b/ts/components/dialog/DeleteAccountModal.tsx
index 3f394850ca..d577dd7b3f 100644
--- a/ts/components/dialog/DeleteAccountModal.tsx
+++ b/ts/components/dialog/DeleteAccountModal.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useState } from 'react';
+import { useCallback, useState } from 'react';
import { useDispatch } from 'react-redux';
import { SnodeAPI } from '../../session/apis/snode_api/SNodeAPI';
@@ -6,19 +6,19 @@ import { forceSyncConfigurationNowIfNeeded } from '../../session/utils/sync/sync
import { updateConfirmModal, updateDeleteAccountModal } from '../../state/ducks/modalDialog';
import { SessionWrapperModal } from '../SessionWrapperModal';
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
-import { SessionSpinner } from '../basic/SessionSpinner';
import { SpacerLG } from '../basic/Text';
+import { SessionSpinner } from '../loading';
import { Data } from '../../data/data';
import { deleteAllLogs } from '../../node/logs';
import { clearInbox } from '../../session/apis/open_group_api/sogsv3/sogsV3ClearInbox';
import { getAllValidOpenGroupV2ConversationRoomInfos } from '../../session/apis/open_group_api/utils/OpenGroupUtils';
-import { SessionRadioGroup } from '../basic/SessionRadioGroup';
import { ed25519Str } from '../../session/utils/String';
+import { SessionRadioGroup } from '../basic/SessionRadioGroup';
const deleteDbLocally = async () => {
window?.log?.info('last message sent successfully. Deleting everything');
- window.persistStore?.purge();
+ await window.persistStore?.purge();
window?.log?.info('store purged');
await deleteAllLogs();
diff --git a/ts/components/dialog/EditProfileDialog.tsx b/ts/components/dialog/EditProfileDialog.tsx
index 87816a3b2a..ef5996ee07 100644
--- a/ts/components/dialog/EditProfileDialog.tsx
+++ b/ts/components/dialog/EditProfileDialog.tsx
@@ -1,6 +1,6 @@
import { useDispatch } from 'react-redux';
// eslint-disable-next-line import/no-named-default
-import { ChangeEvent, MouseEvent, default as React, useState } from 'react';
+import { ChangeEvent, MouseEvent, useState } from 'react';
import { QRCode } from 'react-qr-svg';
import styled from 'styled-components';
import { Avatar, AvatarSize } from '../avatar/Avatar';
@@ -10,7 +10,7 @@ import { YourSessionIDPill, YourSessionIDSelectable } from '../basic/YourSession
import { useOurAvatarPath, useOurConversationUsername } from '../../hooks/useParamSelector';
import { ConversationTypeEnum } from '../../models/conversationAttributes';
-import { MAX_USERNAME_BYTES } from '../../session/constants';
+import { MAX_NAME_LENGTH_BYTES } from '../../session/constants';
import { getConversationController } from '../../session/conversations';
import { sanitizeSessionUsername } from '../../session/utils/String';
import { editProfileModal, updateEditProfilePictureModel } from '../../state/ducks/modalDialog';
@@ -18,8 +18,8 @@ import { saveQRCode } from '../../util/saveQRCode';
import { setLastProfileUpdateTimestamp } from '../../util/storage';
import { SessionWrapperModal } from '../SessionWrapperModal';
import { SessionButton, SessionButtonType } from '../basic/SessionButton';
-import { SessionSpinner } from '../basic/SessionSpinner';
import { SessionIconButton } from '../icon';
+import { SessionSpinner } from '../loading';
const handleSaveQRCode = (event: MouseEvent) => {
event.preventDefault();
@@ -152,7 +152,7 @@ export const EditProfileDialog = () => {
try {
const newName = profileName ? profileName.trim() : '';
- if (newName.length === 0 || newName.length > MAX_USERNAME_BYTES) {
+ if (newName.length === 0 || newName.length > MAX_NAME_LENGTH_BYTES) {
return;
}
@@ -257,7 +257,7 @@ export const EditProfileDialog = () => {
value={profileName}
placeholder={window.i18n('displayName')}
onChange={onNameEdited}
- maxLength={MAX_USERNAME_BYTES}
+ maxLength={MAX_NAME_LENGTH_BYTES}
tabIndex={0}
required={true}
aria-required={true}
diff --git a/ts/components/dialog/EditProfilePictureModal.tsx b/ts/components/dialog/EditProfilePictureModal.tsx
index 7828d951bf..b1b5fc74a9 100644
--- a/ts/components/dialog/EditProfilePictureModal.tsx
+++ b/ts/components/dialog/EditProfilePictureModal.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { useDispatch } from 'react-redux';
import styled from 'styled-components';
import { clearOurAvatar, uploadOurAvatar } from '../../interactions/conversationInteractions';
@@ -7,31 +7,33 @@ import { editProfileModal, updateEditProfilePictureModel } from '../../state/duc
import { pickFileForAvatar } from '../../types/attachments/VisualAttachment';
import { SessionWrapperModal } from '../SessionWrapperModal';
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
-import { SessionSpinner } from '../basic/SessionSpinner';
import { SpacerLG } from '../basic/Text';
import { SessionIconButton } from '../icon';
+import { SessionSpinner } from '../loading';
import { ProfileAvatar } from './EditProfileDialog';
import type { EditProfilePictureModalProps } from '../../types/ReduxTypes';
const StyledAvatarContainer = styled.div`
cursor: pointer;
`;
+
+const StyledUploadButton = styled.div`
+ background-color: var(--chat-buttons-background-color);
+ border-radius: 50%;
+ overflow: hidden;
+`;
+
const UploadImageButton = () => {
return (
-
-
-
+
+
+
{
const confirmModalState = useSelector(getConfirmModal);
diff --git a/ts/components/dialog/ModeratorsAddDialog.tsx b/ts/components/dialog/ModeratorsAddDialog.tsx
index b8b3b3b35d..ef1e95996b 100644
--- a/ts/components/dialog/ModeratorsAddDialog.tsx
+++ b/ts/components/dialog/ModeratorsAddDialog.tsx
@@ -1,17 +1,17 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
+import { sogsV3AddAdmin } from '../../session/apis/open_group_api/sogsv3/sogsV3AddRemoveMods';
+import { getConversationController } from '../../session/conversations';
import { PubKey } from '../../session/types';
import { ToastUtils } from '../../session/utils';
-import { Flex } from '../basic/Flex';
-import { getConversationController } from '../../session/conversations';
import { updateAddModeratorsModal } from '../../state/ducks/modalDialog';
-import { SessionButton, SessionButtonType } from '../basic/SessionButton';
-import { SessionSpinner } from '../basic/SessionSpinner';
-import { SessionWrapperModal } from '../SessionWrapperModal';
-import { sogsV3AddAdmin } from '../../session/apis/open_group_api/sogsv3/sogsV3AddRemoveMods';
-import { SessionHeaderSearchInput } from '../SessionHeaderSearchInput';
import { isDarkTheme } from '../../state/selectors/theme';
+import { SessionHeaderSearchInput } from '../SessionHeaderSearchInput';
+import { SessionWrapperModal } from '../SessionWrapperModal';
+import { Flex } from '../basic/Flex';
+import { SessionButton, SessionButtonType } from '../basic/SessionButton';
+import { SessionSpinner } from '../loading';
type Props = {
conversationId: string;
@@ -86,7 +86,7 @@ export const AddModeratorsDialog = (props: Props) => {
`
font-size: var(--font-size-md);
diff --git a/ts/components/dialog/SessionNicknameDialog.tsx b/ts/components/dialog/SessionNicknameDialog.tsx
index 008d341854..5e1b0a2630 100644
--- a/ts/components/dialog/SessionNicknameDialog.tsx
+++ b/ts/components/dialog/SessionNicknameDialog.tsx
@@ -1,13 +1,13 @@
-import React, { useState } from 'react';
import _ from 'lodash';
+import { useState } from 'react';
import { useDispatch } from 'react-redux';
import { getConversationController } from '../../session/conversations';
-import { SpacerLG } from '../basic/Text';
import { changeNickNameModal } from '../../state/ducks/modalDialog';
-import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
import { SessionWrapperModal } from '../SessionWrapperModal';
+import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
+import { SpacerLG } from '../basic/Text';
type Props = {
conversationId: string;
diff --git a/ts/components/dialog/SessionPasswordDialog.tsx b/ts/components/dialog/SessionPasswordDialog.tsx
index 7de8b4435a..5c8c73f2d4 100644
--- a/ts/components/dialog/SessionPasswordDialog.tsx
+++ b/ts/components/dialog/SessionPasswordDialog.tsx
@@ -1,17 +1,18 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
-import React from 'react';
+
import autoBind from 'auto-bind';
-import { ToastUtils } from '../../session/utils';
+import { Component } from 'react';
import { Data } from '../../data/data';
-import { SpacerSM } from '../basic/Text';
+import { ToastUtils } from '../../session/utils';
import { sessionPassword } from '../../state/ducks/modalDialog';
import { LocalizerKeys } from '../../types/LocalizerKeys';
-import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
-import { SessionWrapperModal } from '../SessionWrapperModal';
-import { matchesHash, validatePassword } from '../../util/passwordUtils';
-import { assertUnreachable } from '../../types/sqlSharedTypes';
import type { PasswordAction } from '../../types/ReduxTypes';
+import { assertUnreachable } from '../../types/sqlSharedTypes';
+import { matchesHash, validatePassword } from '../../util/passwordUtils';
+import { SessionWrapperModal } from '../SessionWrapperModal';
+import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
+import { SpacerSM } from '../basic/Text';
interface Props {
passwordAction: PasswordAction;
@@ -25,7 +26,7 @@ interface State {
currentPasswordRetypeEntered: string | null;
}
-export class SessionPasswordDialog extends React.Component {
+export class SessionPasswordDialog extends Component {
private passportInput: HTMLInputElement | null = null;
constructor(props: any) {
diff --git a/ts/components/dialog/SessionSeedModal.tsx b/ts/components/dialog/SessionSeedModal.tsx
index 63fb672a9a..ec658973d1 100644
--- a/ts/components/dialog/SessionSeedModal.tsx
+++ b/ts/components/dialog/SessionSeedModal.tsx
@@ -1,4 +1,4 @@
-import React, { MouseEvent, useState } from 'react';
+import { MouseEvent, useState } from 'react';
import { QRCode } from 'react-qr-svg';
import { useDispatch } from 'react-redux';
import useMount from 'react-use/lib/useMount';
@@ -223,7 +223,7 @@ const SessionSeedModalInner = (props: ModalInnerProps) => {
<>
{!loadingSeed && (
diff --git a/ts/components/dialog/TermsOfServicePrivacyDialog.tsx b/ts/components/dialog/TermsOfServicePrivacyDialog.tsx
new file mode 100644
index 0000000000..703d6236dd
--- /dev/null
+++ b/ts/components/dialog/TermsOfServicePrivacyDialog.tsx
@@ -0,0 +1,64 @@
+import { shell } from 'electron';
+import { useDispatch } from 'react-redux';
+import styled from 'styled-components';
+import { updateTermsOfServicePrivacyModal } from '../../state/onboarding/ducks/modals';
+import { SessionWrapperModal } from '../SessionWrapperModal';
+import { Flex } from '../basic/Flex';
+import { SessionButton, SessionButtonType } from '../basic/SessionButton';
+import { SpacerSM } from '../basic/Text';
+
+// NOTE we want to bypass the padding on the modal body so the buttons take up the full space
+const ConfirmButtonContainer = styled(Flex)`
+ margin: 0px calc(var(--margins-lg) * -1) calc(var(--margins-lg) * -1) calc(var(--margins-lg) * -1);
+`;
+
+export type TermsOfServicePrivacyDialogProps = {
+ show: boolean;
+};
+
+export function TermsOfServicePrivacyDialog(props: TermsOfServicePrivacyDialogProps) {
+ const { show } = props;
+
+ const dispatch = useDispatch();
+
+ const onClose = () => {
+ dispatch(updateTermsOfServicePrivacyModal(null));
+ };
+
+ if (!show) {
+ return null;
+ }
+
+ return (
+
+
+ {window.i18n('urlOpenBrowser')}
+
+
+ {
+ void shell.openExternal('https://getsession.org/terms-of-service');
+ }}
+ dataTestId="terms-of-service-button"
+ />
+ {
+ void shell.openExternal('https://getsession.org/privacy-policy');
+ }}
+ dataTestId="privacy-policy-button"
+ />
+
+
+
+ );
+}
diff --git a/ts/components/dialog/UpdateGroupMembersDialog.tsx b/ts/components/dialog/UpdateGroupMembersDialog.tsx
index e00132e861..a08342a11b 100644
--- a/ts/components/dialog/UpdateGroupMembersDialog.tsx
+++ b/ts/components/dialog/UpdateGroupMembersDialog.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import _ from 'lodash';
import { useDispatch } from 'react-redux';
import useKey from 'react-use/lib/useKey';
@@ -6,11 +5,11 @@ import styled from 'styled-components';
import { ToastUtils, UserUtils } from '../../session/utils';
-import { SpacerLG, Text } from '../basic/Text';
import { updateGroupMembersModal } from '../../state/ducks/modalDialog';
-import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
import { MemberListItem } from '../MemberListItem';
import { SessionWrapperModal } from '../SessionWrapperModal';
+import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
+import { SpacerLG, Text } from '../basic/Text';
import { useConversationPropsById, useWeAreAdmin } from '../../hooks/useParamSelector';
diff --git a/ts/components/dialog/UpdateGroupNameDialog.tsx b/ts/components/dialog/UpdateGroupNameDialog.tsx
index c7c1830336..d02bb641a6 100644
--- a/ts/components/dialog/UpdateGroupNameDialog.tsx
+++ b/ts/components/dialog/UpdateGroupNameDialog.tsx
@@ -1,8 +1,8 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
import autoBind from 'auto-bind';
import classNames from 'classnames';
-import React from 'react';
+import { Component } from 'react';
import { ConversationModel } from '../../models/conversation';
import { Constants } from '../../session';
import { getConversationController } from '../../session/conversations';
@@ -27,7 +27,7 @@ interface State {
newAvatarObjecturl: string | null;
}
-export class UpdateGroupNameDialog extends React.Component {
+export class UpdateGroupNameDialog extends Component {
private readonly convo: ConversationModel;
constructor(props: Props) {
diff --git a/ts/components/dialog/UserDetailsDialog.tsx b/ts/components/dialog/UserDetailsDialog.tsx
index 87be42e49a..37fc5edf0a 100644
--- a/ts/components/dialog/UserDetailsDialog.tsx
+++ b/ts/components/dialog/UserDetailsDialog.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import useCopyToClipboard from 'react-use/lib/useCopyToClipboard';
diff --git a/ts/components/icon/DropDownAndToggleButton.tsx b/ts/components/icon/DropDownAndToggleButton.tsx
index 98db7b0810..458fdfa72f 100644
--- a/ts/components/icon/DropDownAndToggleButton.tsx
+++ b/ts/components/icon/DropDownAndToggleButton.tsx
@@ -1,10 +1,10 @@
-import React from 'react';
-import styled from 'styled-components';
+import { MouseEvent } from 'react';
import { contextMenu } from 'react-contexify';
+import styled from 'styled-components';
type SProps = {
- onArrowClick: (e: React.MouseEvent) => void;
- onMainButtonClick: (e: React.MouseEvent) => void;
+ onArrowClick: (e: MouseEvent) => void;
+ onMainButtonClick: (e: MouseEvent) => void;
isMuted?: boolean;
isFullScreen?: boolean;
iconType: 'microphone' | 'camera' | 'volume';
@@ -86,12 +86,12 @@ const MicrophoneIcon = (
export const DropDownAndToggleButton = (props: SProps) => {
const { iconType, isFullScreen = false, onArrowClick, onMainButtonClick, isMuted } = props;
- const arrowClickHandler = (e: React.MouseEvent) => {
+ const arrowClickHandler = (e: MouseEvent) => {
e.stopPropagation();
onArrowClick(e);
};
- const mainButtonClickHandler = (e: React.MouseEvent) => {
+ const mainButtonClickHandler = (e: MouseEvent) => {
e.stopPropagation();
contextMenu.hideAll();
onMainButtonClick(e);
diff --git a/ts/components/icon/Icons.tsx b/ts/components/icon/Icons.tsx
index b237f3316b..86bcf24da0 100644
--- a/ts/components/icon/Icons.tsx
+++ b/ts/components/icon/Icons.tsx
@@ -28,6 +28,7 @@ export type SessionIconType =
| 'emoji'
| 'error'
| 'eye'
+ | 'eyeDisabled'
| 'exit'
| 'file'
| 'fullscreen'
@@ -62,12 +63,16 @@ export type SessionIconType =
| 'shield'
| 'star'
| 'sun'
+ | 'question'
| 'qr'
| 'users'
| 'warning'
| 'sending'
| 'doubleCheckCircle'
| 'gallery'
+ | 'session'
+ | 'recoveryPasswordFill'
+ | 'recoveryPasswordOutline'
| 'stop'
| 'thumbnail'
| 'timerFixed'
@@ -122,8 +127,8 @@ export const icons: Record = {
ratio: 1,
},
brand: {
- path: 'm 216.456,315.282 c 36.104,0 66.415,-29.551 65.565,-65.646 -0.59,-25.135 -14.478,-48.161 -36.54,-60.386 l -83.435,-46.234 v 69.229 c 0,5.18855 -4.20645,9.39455 -9.395,9.394 H 67.847 c -26.603,0 -48.093,22.297 -46.765,49.183 1.242,25.15 22.941,44.46 48.123,44.46 h 147.251 m -75.437,-121.993 0.016,-69.217 c 0.002,-5.186 4.19,-9.391 9.376,-9.392 l 84.808,-0.014 c 26.602,0 48.092,-22.297 46.764,-49.181 C 280.74,40.334 259.041,21.023 233.858,21.023 H 86.608 c -36.103,0 -66.415,29.551 -65.565,65.646 0.591,25.136 14.479,48.161 36.541,60.386 z m 114.65,-22.427 c 29.233,16.2 47.395,47.023 47.395,80.448 0,46.865 -38.129,84.995 -84.995,84.995 H 67.847 C 30.437,336.305 0,305.867 0,268.459 0,231.051 30.437,200.616 67.847,200.616 h 43.026 L 47.396,165.445 C 18.162,149.243 0,118.42 0,84.995 0,38.131 38.13,0 84.995,0 h 150.224 c 37.408,0 67.845,30.438 67.845,67.846 0,37.409 -30.437,67.843 -67.845,67.843 h -43.028 l 63.478,35.173',
- viewBox: '0 0 404.085 448.407',
+ path: 'm25.08 17.26-6.21-3.4h4.2c1.77 0 3.45-.7 4.7-1.93a6.53 6.53 0 0 0 0-9.28 6.67 6.67 0 0 0-4.7-1.93H8.4c-2.2 0-4.32.87-5.88 2.41A8.2 8.2 0 0 0 .08 8.95a8.84 8.84 0 0 0 4.64 7.79l6.2 3.4h-4.2a6.7 6.7 0 0 0-6.2 4.04 6.51 6.51 0 0 0 3.63 8.62 6.7 6.7 0 0 0 2.56.48h14.7c2.2 0 4.3-.87 5.86-2.42a8.2 8.2 0 0 0 2.44-5.81 8.84 8.84 0 0 0-4.63-7.79ZM5.7 14.96A6.91 6.91 0 0 1 2.14 9.1a6.35 6.35 0 0 1 6.4-6.35h14.4a4.65 4.65 0 0 1 4.71 4.3 4.5 4.5 0 0 1-2.77 4.4c-.57.24-1.18.36-1.8.36h-8.3c-.24 0-.47.1-.64.27a.9.9 0 0 0-.27.64v6.7l-8.16-4.47Zm15.53 16.28H6.84a4.64 4.64 0 0 1-4.7-4.3 4.5 4.5 0 0 1 2.77-4.4 4.62 4.62 0 0 1 1.8-.36h8.3a.93.93 0 0 0 .84-.56.9.9 0 0 0 .07-.35v-6.7l8.16 4.47a6.91 6.91 0 0 1 3.57 5.85 6.35 6.35 0 0 1-6.4 6.35Z',
+ viewBox: '0 0 30 34',
ratio: 1,
},
callIncoming: {
@@ -236,8 +241,13 @@ export const icons: Record = {
ratio: 1,
},
eye: {
- path: 'M12,3 C15.3798024,3 18.3386923,4.63249094 20.8545372,7.31605887 C21.7188737,8.23801779 22.4694995,9.22244509 23.1056644,10.2074746 C23.4900327,10.8026256 23.7538591,11.2716502 23.8944272,11.5527864 C24.0351909,11.8343139 24.0351909,12.1656861 23.8944272,12.4472136 C23.7538591,12.7283498 23.4900327,13.1973744 23.1056644,13.7925254 C22.4694995,14.7775549 21.7188737,15.7619822 20.8545372,16.6839411 C18.3386923,19.3675091 15.3798024,21 12,21 C8.62019756,21 5.66130774,19.3675091 3.1454628,16.6839411 C2.28112631,15.7619822 1.5305005,14.7775549 0.894335622,13.7925254 C0.50996726,13.1973744 0.246140906,12.7283498 0.105572809,12.4472136 C-0.0351909363,12.1656861 -0.0351909363,11.8343139 0.105572809,11.5527864 C0.246140906,11.2716502 0.50996726,10.8026256 0.894335622,10.2074746 C1.5305005,9.22244509 2.28112631,8.23801779 3.1454628,7.31605887 C5.66130774,4.63249094 8.62019756,3 12,3 Z M12,5 C9.25480244,5 6.77619226,6.36750906 4.6045372,8.68394113 C3.82824869,9.51198221 3.149187,10.4025549 2.57441438,11.2925254 C2.41127724,11.5451249 2.26658862,11.7823697 2.14071218,12 C2.26658862,12.2176303 2.41127724,12.4548751 2.57441438,12.7074746 C3.149187,13.5974451 3.82824869,14.4880178 4.6045372,15.3160589 C6.77619226,17.6324909 9.25480244,19 12,19 C14.7451976,19 17.2238077,17.6324909 19.3954628,15.3160589 C20.1717513,14.4880178 20.850813,13.5974451 21.4255856,12.7074746 C21.5887228,12.4548751 21.7334114,12.2176303 21.8592878,12 C21.7334114,11.7823697 21.5887228,11.5451249 21.4255856,11.2925254 C20.850813,10.4025549 20.1717513,9.51198221 19.3954628,8.68394113 C17.2238077,6.36750906 14.7451976,5 12,5 Z M12,8 C14.209139,8 16,9.790861 16,12 C16,14.209139 14.209139,16 12,16 C9.790861,16 8,14.209139 8,12 C8,9.790861 9.790861,8 12,8 Z M12,10 C10.8954305,10 10,10.8954305 10,12 C10,13.1045695 10.8954305,14 12,14 C13.1045695,14 14,13.1045695 14,12 C14,10.8954305 13.1045695,10 12,10',
- viewBox: '0 3 24 18',
+ path: 'M37.5,55.3c15.9,0,26.7-12.9,26.7-16.8s-10.8-16.8-26.7-16.8-26.7,12.8-26.7,16.8,11,16.8,26.7,16.8Z M37.5,51.6c-12.4,0-22.3-10.4-22.3-13.1s9.9-13.1,22.3-13.1,22.3,10.8,22.3,13.1-9.9,13.1-22.3,13.1Z M37.5,27.5c-6.1,0-11,4.8-11,11,0,6,4.9,11,11,11s11-5,11-11-4.9-11-11-11ZM37.5,42c-2,0-3.6-1.6-3.6-3.6s1.6-3.5,3.6-3.5,3.6,1.6,3.6,3.5-1.6,3.6-3.6,3.6Z',
+ viewBox: '0 0 75 76',
+ ratio: 1,
+ },
+ eyeDisabled: {
+ path: 'M37.5,55.2c3.7,0,7-.7,10-1.7l-2.6-2.6c-2.3.7-4.8,1.2-7.5,1.2-12.9,0-23.4-10.9-23.4-13.7s3.6-5.9,9.4-9.4l-2.5-2.4c-6.5,4-10.4,9.5-10.4,11.8,0,4,11.1,16.8,26.8,16.8ZM37.5,21.7c-3.4,0-6.5.6-9.4,1.5l2.6,2.6c2.2-.7,4.5-1,6.8-1,12.9,0,23.3,11.4,23.3,13.7s-3.4,5.8-8.8,9.2l2.4,2.4c6.2-4,9.9-9.3,9.9-11.6,0-4-11-16.8-26.8-16.8ZM37.5,49.4c1.8,0,3.4-.4,4.8-1.2l-14.7-14.7c-.8,1.5-1.1,3.2-1.1,4.8,0,6.1,5,11,11,11ZM47.6,42.7c.6-1.3.9-2.8.9-4.3,0-6.1-4.9-11-11-11s-3,.3-4.3.9c0,0,14.4,14.4,14.4,14.4ZM52.8,55.4c.6.6,1.5.6,2.1,0,.6-.7.6-1.5,0-2.1L22.1,20.6c-.6-.6-1.5-.6-2.1,0-.6.6-.6,1.5,0,2.1l32.8,32.7h0Z',
+ viewBox: '0 0 75 76',
ratio: 1,
},
exit: {
@@ -395,6 +405,23 @@ export const icons: Record = {
viewBox: '-1 -2 15 15',
ratio: 1,
},
+ session: {
+ path: 'M0 68h26c-1 7 8 13 28 14 19 0 33-3 33-11 0-19-85 3-85-39C2 12 23 0 54 0c32 0 54 13 54 34H82c0-7-7-14-26-14-17 0-30 3-30 11 0 18 85-2 85 39 0 20-22 32-55 32-34 0-56-13-56-34M126 2h95v21h-71v18h70v19h-70v20h71v20h-95V2zm108 66h26c0 7 8 13 28 14 19 0 33-3 33-11 0-19-84 3-84-39 0-20 20-32 51-32 32 0 54 13 54 34h-25c0-7-7-14-27-14-17 0-29 3-29 11 0 18 84-2 84 39 0 20-22 32-55 32-34 0-56-13-56-34m120 0h26c0 7 8 13 28 14 19 0 33-3 33-11 0-19-85 3-85-39 0-20 21-32 52-32 32 0 54 13 54 34h-26c1-7-7-14-26-14-17 0-29 3-29 11 0 18 84-2 84 39 0 20-22 32-55 32-34 0-56-13-56-34M480 2h24v98h-24V2zm136 49c0-20-14-31-37-31-24 0-38 11-38 31s14 31 38 31c23 0 37-11 37-31m-99 0c0-31 24-51 62-51s61 20 61 51-23 51-61 51-62-20-62-51M654 2h20l68 62V2h24v98h-20l-69-62v62h-24V2z',
+ viewBox: '0 0 766.2 102.3',
+ ratio: 1,
+ },
+ recoveryPasswordFill: {
+ path: 'M14.78.73c.45-.21.91-.33 1.39-.33v.02c.47 0 .92.1 1.37.32l1.7.8.65.3 3.07 1.44a3394.44 3394.44 0 0 1 7.36 3.43 3.4 3.4 0 0 1 2 3.45V17.78c0 .68-.01 1.36-.03 2.02a23.75 23.75 0 0 1-.64 4.69l-.02.08-.02.08a32.7 32.7 0 0 1-.87 2.71c-.48 1.23-1.1 2.5-1.9 3.89l-.04.05-.04.06a24.75 24.75 0 0 1-2.79 3.62A20.72 20.72 0 0 1 20.75 39l-.1.06-.09.05-.1.06-.1.05c-.93.43-2.05.92-3.27 1.26l-.03.01h-.02a3.48 3.48 0 0 1-1.78 0c-1.14-.32-2.3-.78-3.45-1.36l-.02-.02h-.02c-3.28-1.72-6-4.28-8.1-7.58l-.09-.11-.1-.18a28.05 28.05 0 0 1-1.72-3.43c-.37-.9-.64-1.78-.9-2.63l-.02-.06-.1-.32-.04-.16-.04-.16-.06-.31-.06-.31-.01-.08c-.14-.7-.28-1.4-.36-2.15-.15-1.24-.15-2.4-.15-3.53V9.87a3.2 3.2 0 0 1 1.87-3.1l3.94-1.84 3.94-1.84 2.38-1.12.1-.05.17-.08.05-.03.31-.14.57-.26a135.73 135.73 0 0 1 1.43-.68Zm3.41 18.12 3.11 1.79c.7.4 1.3 1 1.7 1.72.41.72.63 1.54.63 2.37 0 1.15-.44 2.25-1.22 3.06a4.1 4.1 0 0 1-2.95 1.26h-7.37a3.22 3.22 0 0 1-2.38-1 3.46 3.46 0 0 1-.98-2.45 3.56 3.56 0 0 1 .98-2.45 3.32 3.32 0 0 1 2.38-1h2.11l-3.1-1.79c-.71-.4-1.3-1-1.71-1.71a4.81 4.81 0 0 1-.63-2.38c0-1.14.44-2.24 1.23-3.05a4.1 4.1 0 0 1 2.94-1.27h7.37c.88 0 1.73.36 2.35 1.01a3.52 3.52 0 0 1 0 4.88 3.27 3.27 0 0 1-2.35 1.01h-2.11Zm-7.9-.7c.32.53.77.97 1.3 1.28l4.1 2.35v-3.52c0-.13.04-.25.13-.34.08-.09.2-.14.32-.14h4.16a2.23 2.23 0 0 0 1.66-.74 2.4 2.4 0 0 0 .63-1.76 2.38 2.38 0 0 0-2.36-2.26h-7.22a3.26 3.26 0 0 0-3.21 3.34c.01.63.18 1.24.5 1.78Zm1.87 9.84h7.22c1.77 0 3.26-1.5 3.22-3.34a3.7 3.7 0 0 0-.5-1.79 3.54 3.54 0 0 0-1.3-1.28l-4.09-2.36v3.52a.5.5 0 0 1-.13.34.46.46 0 0 1-.33.14H12.1a2.23 2.23 0 0 0-1.66.74 2.4 2.4 0 0 0-.63 1.76A2.38 2.38 0 0 0 12.16 28Z',
+ viewBox: '0 0 33 41',
+ ratio: 1,
+ clipRule: 'evenodd',
+ fillRule: 'evenodd',
+ },
+ recoveryPasswordOutline: {
+ path: 'm21.3 20.64-3.11-1.79h2.11c.88 0 1.73-.36 2.35-1a3.52 3.52 0 0 0 0-4.89 3.27 3.27 0 0 0-2.35-1.01h-7.37A4.1 4.1 0 0 0 10 13.22a4.41 4.41 0 0 0-1.23 3.05c0 .84.22 1.66.63 2.38.4.72 1 1.31 1.7 1.71l3.11 1.8h-2.1a3.22 3.22 0 0 0-2.39.99 3.46 3.46 0 0 0-.98 2.45 3.56 3.56 0 0 0 .98 2.46 3.32 3.32 0 0 0 2.38 1h7.37a4.1 4.1 0 0 0 2.95-1.27 4.41 4.41 0 0 0 1.22-3.06c0-.83-.22-1.65-.63-2.37a4.6 4.6 0 0 0-1.7-1.72Zm-9.71-1.21c-.53-.3-.98-.75-1.3-1.29a3.7 3.7 0 0 1-.5-1.78 3.26 3.26 0 0 1 3.22-3.34h7.22a2.38 2.38 0 0 1 2.22 3.2 2.4 2.4 0 0 1-1.25 1.37c-.28.13-.59.2-.9.2h-4.16a.45.45 0 0 0-.32.13.49.49 0 0 0-.14.34v3.52l-4.1-2.35Zm7.79 8.56h-7.22a2.38 2.38 0 0 1-2.22-3.21 2.4 2.4 0 0 1 1.25-1.36c.28-.13.59-.2.9-.2h4.16a.45.45 0 0 0 .33-.14.48.48 0 0 0 .13-.34v-3.52l4.1 2.36c.52.3.97.75 1.28 1.28.32.54.5 1.16.5 1.79a3.26 3.26 0 0 1-3.21 3.34Z M16.15 0c-.48 0-.94.11-1.4.34-.46.23-.95.45-1.43.68l-.87.42-.03.01-.02.02-.17.08-.1.05-2.38 1.14-7.89 3.75A3.27 3.27 0 0 0 0 9.66v8.13c0 1.22-.01 2.5.15 3.85.09.8.23 1.55.37 2.28l.12.63.04.17.04.16.1.33c.27.89.54 1.8.92 2.74.45 1.1 1 2.22 1.72 3.5l.1.18.1.12a21.46 21.46 0 0 0 8.09 7.73h.02l.02.02c1.15.6 2.3 1.06 3.45 1.38a3.35 3.35 0 0 0 1.78 0h.05c1.22-.36 2.33-.85 3.27-1.3l.1-.05.1-.05.19-.12a20.78 20.78 0 0 0 5.22-4.1c.95-1.02 1.84-2.19 2.8-3.7l.03-.05.03-.06c.81-1.4 1.43-2.7 1.9-3.96.36-.96.63-1.88.87-2.76l.03-.08.02-.09c.28-1.28.6-2.98.64-4.77.02-.68.02-1.38.03-2.08V16.96a289.3 289.3 0 0 1 0-5.9V9.96a3.48 3.48 0 0 0-2-3.51l-7.36-3.5-3.08-1.48-.65-.3-1.69-.82c-.45-.22-.9-.33-1.37-.33V0Zm-.02 38.13c-.05 0-.12 0-.22-.03-.97-.27-1.97-.67-2.97-1.18a18.71 18.71 0 0 1-7.07-6.76l-.08-.13-.05-.07a24.85 24.85 0 0 1-1.55-3.14c-.32-.81-.56-1.63-.82-2.5l-.1-.32-.13-.66c-.13-.7-.26-1.36-.34-2.05-.14-1.17-.13-2.3-.13-3.5v-7.31c0-.3.02-.6 0-.94 0-.14-.01-.29.28-.43l7.88-3.75 2.39-1.14.02-.02.03-.01.1-.05.17-.09.88-.41 1.48-.7c.12-.07.2-.07.25-.07.06 0 .14 0 .26.06l1.73.83.64.3 3.08 1.48c2.46 1.17 4.9 2.35 7.36 3.51.43.2.44.45.43.69a7 7 0 0 0 0 .84v7.1l-.03 2.04a22.57 22.57 0 0 1-.57 4.2 34 34 0 0 1-.79 2.5c-.41 1.1-.97 2.27-1.7 3.53a22.66 22.66 0 0 1-2.48 3.3 17.99 17.99 0 0 1-4.55 3.56l-.1.05-.09.06-.06.04c-.84.4-1.84.84-2.88 1.14l-.26.03Z',
+ viewBox: '0 0 33 41',
+ ratio: 1,
+ },
star: {
path: 'M9.80779568,8.70262392 C9.66225594,8.99747141 9.38107073,9.20193068 9.05571654,9.24948607 L4.1495,9.9666031 L7.69882113,13.4236419 C7.93469487,13.6533829 8.0423575,13.9845141 7.98669695,14.3090433 L7.14926913,19.1916734 L11.5356371,16.8849265 C11.8270199,16.7316912 12.1751567,16.7316912 12.4665396,16.8849265 L16.8529075,19.1916734 L16.0154797,14.3090433 C15.9598192,13.9845141 16.0674818,13.6533829 16.3033555,13.4236419 L19.8526767,9.9666031 L14.9464601,9.24948607 C14.6211059,9.20193068 14.3399207,8.99747141 14.194381,8.70262392 L12.0010883,4.25925434 L9.80779568,8.70262392 Z M8.24682697,7.3464661 L11.104381,1.55737608 C11.4712164,0.814207972 12.5309603,0.814207972 12.8977957,1.55737608 L15.7553497,7.3464661 L22.1457165,8.28051393 C22.9656312,8.40035674 23.2924147,9.40819801 22.6988211,9.98635811 L18.0756101,14.4893656 L19.166697,20.8509567 C19.3068155,21.6679189 18.4492666,22.2908819 17.7156371,21.9050735 L12.0010883,18.8998497 L6.28653961,21.9050735 C5.55291004,22.2908819 4.69536119,21.6679189 4.83547972,20.8509567 L5.92656655,14.4893656 L1.30335554,9.98635811 C0.709762006,9.40819801 1.03654545,8.40035674 1.85646012,8.28051393 L8.24682697,7.3464661',
viewBox: '0 0 22 21',
@@ -415,6 +442,11 @@ export const icons: Record = {
viewBox: '0 0 512 512',
ratio: 1,
},
+ question: {
+ path: 'M4.7 5.34c.43 0 .77-.15 1.04-.46.28-.3.42-.71.42-1.22v-.08a2 2 0 0 0-.15-.78 1.83 1.83 0 0 0-1.05-1.06 2.05 2.05 0 0 0-.84-.18c-.67 0-1.2.21-1.58.62-.39.41-.58.95-.58 1.62v.6H.8v-.68a3.13 3.13 0 0 1 .85-2.27c.28-.3.63-.53 1.05-.71.42-.18.9-.27 1.46-.27.46 0 .9.08 1.29.24a3 3 0 0 1 1.9 2.74v.26a2.87 2.87 0 0 1-.71 1.9c-.23.24-.5.44-.8.59-.3.14-.63.2-.98.2h-.2c-.26 0-.4.15-.4.43v1.03H3.15V6.55c0-.36.11-.65.34-.87.22-.22.5-.34.86-.34h.37ZM2.74 9.68c0-.27.1-.5.28-.68.2-.2.43-.3.7-.3.27 0 .5.1.69.3a.96.96 0 0 1 0 1.39.93.93 0 0 1-.69.27c-.27 0-.5-.09-.7-.28a.98.98 0 0 1-.28-.7ZM4.15.72c-.53 0-.98.09-1.36.25a2.78 2.78 0 0 0-1.56 1.6c-.13.37-.2.75-.2 1.15v.42h.68V3.8c0-.72.21-1.32.64-1.79a2.3 2.3 0 0 1 1.77-.7A2.3 2.3 0 0 1 5.78 2a2.24 2.24 0 0 1 .63 1.59v.08c0 .56-.15 1.03-.48 1.39-.32.36-.73.54-1.22.54h-.37c-.3 0-.52.1-.69.27a.93.93 0 0 0-.26.69V7.6H4v-.78a.7.7 0 0 1 .16-.49c.13-.13.3-.18.48-.18h.2c.32 0 .6-.06.87-.19a2.4 2.4 0 0 0 1.19-1.3c.12-.31.18-.63.18-.96v-.26a2.7 2.7 0 0 0-.82-1.9 2.75 2.75 0 0 0-.93-.6 3.15 3.15 0 0 0-1.2-.23ZM2.59.51A3.97 3.97 0 0 1 5.53.48a3.25 3.25 0 0 1 2.06 2.97v.26a3.12 3.12 0 0 1-.78 2.07 2.9 2.9 0 0 1-.87.64c-.34.16-.7.24-1.1.24h-.19c-.09 0-.1.02-.11.02 0 .01-.03.04-.03.15V8.1H2.89V6.55c0-.41.13-.77.4-1.05.29-.27.64-.4 1.05-.4h.37c.35 0 .62-.13.85-.38.23-.26.35-.6.35-1.06v-.08c0-.25-.04-.48-.13-.69a1.58 1.58 0 0 0-.91-.92h-.01a1.8 1.8 0 0 0-.74-.16 1.8 1.8 0 0 0-1.4.54c-.33.36-.5.83-.5 1.45v.84H.53v-.92a3.38 3.38 0 0 1 .92-2.44c.3-.33.69-.58 1.13-.77Zm1.12 8.44a.7.7 0 0 0-.52.23c-.14.13-.2.3-.2.5s.06.38.2.53c.15.14.32.2.52.2s.37-.06.51-.2a.7.7 0 0 0 .22-.53c0-.2-.07-.36-.21-.5h-.01a.66.66 0 0 0-.5-.23Zm-.87-.13c.24-.24.53-.37.87-.37.34 0 .63.13.87.37s.36.53.36.86c0 .34-.12.64-.36.88s-.53.35-.87.35c-.33 0-.63-.11-.87-.34v-.01a1.23 1.23 0 0 1-.36-.88c0-.33.12-.62.36-.86Z',
+ viewBox: '0 0 8 11',
+ ratio: 1,
+ },
users: {
path: 'M9.38,2.17c-1.73,0-3.12,1.4-3.12,3.12s1.4,3.12,3.12,3.12s3.12-1.4,3.12-3.12S11.1,2.17,9.38,2.17z M16.93,0.25c2.3,0.59,3.92,2.67,3.92,5.05s-1.61,4.46-3.92,5.05c-0.56,0.14-1.12-0.19-1.27-0.75c-0.14-0.56,0.19-1.12,0.75-1.27 c1.38-0.35,2.35-1.6,2.35-3.03s-0.97-2.67-2.35-3.03c-0.56-0.14-0.9-0.71-0.75-1.27C15.8,0.44,16.37,0.11,16.93,0.25z M9.38,0.08 c2.88,0,5.21,2.33,5.21,5.21s-2.33,5.21-5.21,5.21S4.17,8.17,4.17,5.29C4.17,2.42,6.5,0.08,9.38,0.08z M21.09,12.75 c2.22,0.57,3.8,2.53,3.9,4.81L25,17.79v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08 c0-1.42-0.96-2.67-2.34-3.02c-0.56-0.14-0.89-0.71-0.75-1.27C19.97,12.94,20.54,12.61,21.09,12.75z M13.54,12.58 c2.8,0,5.09,2.21,5.2,4.99v0.22v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08 c0-1.67-1.3-3.03-2.95-3.12h-0.18H5.21c-1.67,0-3.03,1.3-3.12,2.95v0.18v2.08c0,0.58-0.47,1.04-1.04,1.04 c-0.54,0-0.98-0.41-1.04-0.93L0,19.88V17.8c0-2.8,2.21-5.09,4.99-5.2h0.22h8.33V12.58z',
viewBox: '0 0 25 21',
diff --git a/ts/components/icon/MemberAvatarPlaceHolder.tsx b/ts/components/icon/MemberAvatarPlaceHolder.tsx
index 1616ff8145..c2a4bbffc6 100644
--- a/ts/components/icon/MemberAvatarPlaceHolder.tsx
+++ b/ts/components/icon/MemberAvatarPlaceHolder.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
export const MemberAvatarPlaceHolder = () => {
return (
diff --git a/ts/components/icon/SessionIcon.tsx b/ts/components/icon/SessionIcon.tsx
index 366832348c..74e96eaaec 100644
--- a/ts/components/icon/SessionIcon.tsx
+++ b/ts/components/icon/SessionIcon.tsx
@@ -1,6 +1,6 @@
-import React, { memo } from 'react';
import styled, { css, CSSProperties, keyframes } from 'styled-components';
+import { memo } from 'react';
import { icons, SessionIconSize, SessionIconType } from '.';
import { ClipRule, FillRule } from './Icons';
@@ -38,8 +38,6 @@ const getIconDimensionFromIconSize = (iconSize: SessionIconSize | number) => {
return 30;
case 'huge2':
return 40;
- case 'max':
- return 80;
default:
return 20;
}
diff --git a/ts/components/icon/SessionIconButton.tsx b/ts/components/icon/SessionIconButton.tsx
index adf81cb127..e5275517cc 100644
--- a/ts/components/icon/SessionIconButton.tsx
+++ b/ts/components/icon/SessionIconButton.tsx
@@ -1,20 +1,22 @@
import classNames from 'classnames';
import _ from 'lodash';
-import React, { KeyboardEvent } from 'react';
+import { KeyboardEvent, MouseEvent, ReactNode, forwardRef, memo } from 'react';
import styled from 'styled-components';
import { SessionIcon, SessionIconProps } from './SessionIcon';
interface SProps extends SessionIconProps {
- onClick?: (e?: React.MouseEvent) => void;
+ onClick?: (e?: MouseEvent) => void;
isSelected?: boolean;
isHidden?: boolean;
margin?: string;
+ padding?: string;
dataTestId?: string;
dataTestIdIcon?: string;
id?: string;
+ title?: string;
style?: object;
tabIndex?: number;
- children?: React.ReactNode;
+ children?: ReactNode;
}
const StyledSessionIconButton = styled.button<{ color?: string; isSelected?: boolean }>`
@@ -38,7 +40,7 @@ const StyledSessionIconButton = styled.button<{ color?: string; isSelected?: boo
`;
// eslint-disable-next-line react/display-name
-const SessionIconButtonInner = React.forwardRef((props, ref) => {
+const SessionIconButtonInner = forwardRef((props, ref) => {
const {
iconType,
iconSize,
@@ -53,14 +55,16 @@ const SessionIconButtonInner = React.forwardRef((prop
borderRadius,
iconPadding,
margin,
+ padding,
id,
+ title,
dataTestId,
dataTestIdIcon,
style,
tabIndex,
children,
} = props;
- const clickHandler = (e: React.MouseEvent) => {
+ const clickHandler = (e: MouseEvent) => {
if (props.onClick) {
e.stopPropagation();
props.onClick(e);
@@ -80,10 +84,16 @@ const SessionIconButtonInner = React.forwardRef((prop
className={classNames('session-icon-button', iconSize)}
ref={ref}
id={id}
+ title={title}
onClick={clickHandler}
- style={{ ...style, display: isHidden ? 'none' : 'flex', margin: margin || '' }}
+ style={{
+ ...style,
+ display: isHidden ? 'none' : 'flex',
+ margin: margin || '',
+ padding: padding || '',
+ }}
tabIndex={tabIndex}
- onKeyPress={keyPressHandler}
+ onKeyDown={keyPressHandler}
data-testid={dataTestId}
>
((prop
);
});
-export const SessionIconButton = React.memo(SessionIconButtonInner, _.isEqual);
+export const SessionIconButton = memo(SessionIconButtonInner, _.isEqual);
diff --git a/ts/components/icon/SessionNotificationCount.tsx b/ts/components/icon/SessionNotificationCount.tsx
index 66b3fc6681..1da25b010a 100644
--- a/ts/components/icon/SessionNotificationCount.tsx
+++ b/ts/components/icon/SessionNotificationCount.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { Constants } from '../../session';
diff --git a/ts/components/inputs/SessionInput.tsx b/ts/components/inputs/SessionInput.tsx
new file mode 100644
index 0000000000..d5895bbff4
--- /dev/null
+++ b/ts/components/inputs/SessionInput.tsx
@@ -0,0 +1,347 @@
+import { ChangeEvent, ReactNode, useEffect, useState } from 'react';
+
+import { motion } from 'framer-motion';
+import { isEmpty, isEqual } from 'lodash';
+import styled, { CSSProperties } from 'styled-components';
+import { THEME_GLOBALS } from '../../themes/globals';
+import { useHTMLDirection } from '../../util/i18n';
+import { Flex } from '../basic/Flex';
+import { SpacerMD } from '../basic/Text';
+import { SessionIconButton } from '../icon';
+
+const StyledInput = styled(motion.input)<{
+ error: boolean;
+ centerText?: boolean;
+ monospaced?: boolean;
+}>`
+ border: 1px solid var(--input-border-color);
+ border-radius: 13px;
+ outline: 0;
+ width: 100%;
+ background: transparent;
+ color: ${props => (props.error ? 'var(--danger-color)' : 'var(--input-text-color)')};
+
+ font-family: ${props => (props.monospaced ? 'var(--font-mono)' : 'var(--font-default)')};
+ font-size: 12px;
+ line-height: 14px;
+ padding: var(--margins-lg);
+ ${props => props.centerText && 'text-align: center;'}
+
+ &::placeholder {
+ color: var(--input-text-placeholder-color);
+ ${props => props.centerText && 'text-align: center;'}
+ }
+`;
+
+const StyledTextAreaContainer = styled(motion.div)<{
+ error: boolean;
+ centerText?: boolean;
+ monospaced?: boolean;
+}>`
+ border: 1px solid var(--input-border-color);
+ border-radius: 13px;
+ outline: 0;
+ width: 100%;
+ background: transparent;
+ color: ${props => (props.error ? 'var(--danger-color)' : 'var(--input-text-color)')};
+
+ font-family: ${props => (props.monospaced ? 'var(--font-mono)' : 'var(--font-default)')};
+ font-size: 12px;
+ line-height: 14px;
+
+ ${props => props.centerText && 'text-align: center;'}
+
+ textarea {
+ width: 100%;
+ outline: 0;
+ border: none;
+ background: transparent;
+
+ resize: none;
+ overflow: hidden;
+ overflow-wrap: break-word;
+ user-select: all;
+
+ display: inline-block;
+ padding: var(--margins-lg);
+ margin: var(--margins-xs) 0;
+
+ ${props => props.centerText && 'text-align: center;'}
+
+ &:placeholder-shown {
+ font-family: ${props => (props.monospaced ? 'var(--font-mono)' : 'var(--font-default)')};
+ font-size: 12px;
+ height: 48px;
+ margin: var(--margins-md) 0;
+ }
+
+ &::placeholder {
+ color: var(--input-text-placeholder-color);
+ ${props => props.centerText && 'text-align: center;'}
+ }
+ }
+`;
+
+const StyledInputContainer = styled(Flex)<{ error: boolean; biggerText?: boolean }>`
+ position: relative;
+ width: 100%;
+
+ label {
+ color: var(--text-primary-color);
+ opacity: 0;
+ transition: opacity var(--default-duration);
+ text-align: center;
+
+ &.filled {
+ opacity: 1;
+ }
+
+ &.error {
+ color: var(--danger-color);
+ font-weight: 700;
+ }
+ }
+
+ input::placeholder,
+ textarea::placeholder {
+ transition: opacity var(--default-duration) color var(--default-duration);
+ ${props => props.error && `color: var(--danger-color); opacity: 1;`}
+ }
+
+ ${props =>
+ props.biggerText &&
+ `
+ ${StyledInput} {
+ font-size: var(--font-size-md);
+ line-height: 18px;
+ }
+
+ ${StyledTextAreaContainer} {
+ font-size: var(--font-size-md);
+ line-height: 18px;
+
+ textarea {
+ &:placeholder-shown {
+ font-size: var(--font-size-md);
+ height: 56px;
+ }
+ }
+ }
+ `}
+`;
+
+const ErrorItem = (props: { id: string; error: string }) => {
+ return (
+
+ {props.error}
+
+ );
+};
+
+const ShowHideButton = (props: {
+ forceShow: boolean;
+ toggleForceShow: () => void;
+ error: boolean;
+}) => {
+ const htmlDirection = useHTMLDirection();
+ const style: CSSProperties = {
+ position: 'absolute',
+ top: '50%',
+ transform: 'translateY(-50%)',
+ left: htmlDirection === 'ltr' ? undefined : 'var(--margins-sm)',
+ right: htmlDirection === 'ltr' ? 'var(--margins-sm)' : undefined,
+ };
+
+ if (props.forceShow) {
+ return (
+
+ );
+ }
+
+ return (
+
+ );
+};
+
+const StyledCtaContainer = styled(motion.div)`
+ width: 100%;
+`;
+
+type Props = {
+ error?: string;
+ type?: string;
+ value?: string;
+ placeholder?: string;
+ maxLength?: number;
+ enableShowHide?: boolean;
+ onValueChanged?: (value: string) => any;
+ onEnterPressed?: (value: string) => any;
+ autoFocus?: boolean;
+ disabledOnBlur?: boolean;
+ ref?: any;
+ inputDataTestId?: string;
+ id?: string;
+ ctaButton?: ReactNode;
+ monospaced?: boolean;
+ biggerText?: boolean;
+ centerText?: boolean;
+ editable?: boolean;
+ isTextArea?: boolean;
+ className?: string;
+};
+
+export const SessionInput = (props: Props) => {
+ const {
+ placeholder,
+ type = 'text',
+ value,
+ maxLength,
+ enableShowHide,
+ error,
+ onValueChanged,
+ onEnterPressed,
+ autoFocus,
+ disabledOnBlur,
+ inputDataTestId,
+ id = 'session-input-floating-label',
+ ctaButton,
+ monospaced,
+ biggerText,
+ centerText,
+ editable = true,
+ isTextArea,
+ className,
+ } = props;
+ const [inputValue, setInputValue] = useState('');
+ const [errorString, setErrorString] = useState('');
+ const [forceShow, setForceShow] = useState(false);
+
+ const correctType = forceShow ? 'text' : type;
+
+ const updateInputValue = (e: ChangeEvent) => {
+ if (!editable) {
+ return;
+ }
+ e.preventDefault();
+ const val = e.target.value;
+ setInputValue(val);
+ if (onValueChanged) {
+ onValueChanged(val);
+ }
+ };
+
+ // TODO[epic=ses-893] Type inputProps properly
+ const inputProps: any = {
+ id,
+ type: correctType,
+ placeholder,
+ value,
+ disabled: !editable,
+ maxLength,
+ autoFocus,
+ 'data-testid': inputDataTestId,
+ onChange: updateInputValue,
+ style: { paddingInlineEnd: enableShowHide ? '48px' : undefined },
+ // just in case onChange isn't triggered
+ onBlur: (event: ChangeEvent) => {
+ if (editable && !disabledOnBlur) {
+ updateInputValue(event);
+ }
+ },
+ onKeyDown: (event: KeyboardEvent) => {
+ if (!editable) {
+ return;
+ }
+ if (event.key === 'Enter' && onEnterPressed) {
+ if (isTextArea && event.shiftKey) {
+ return;
+ }
+ event.preventDefault();
+ onEnterPressed(inputValue);
+ setErrorString('');
+ }
+ },
+ initial: {
+ borderColor: errorString ? 'var(--input-border-color)' : undefined,
+ },
+ animate: {
+ borderColor: errorString ? 'var(--danger-color)' : undefined,
+ },
+ transition: { duration: THEME_GLOBALS['--default-duration-seconds'] },
+ };
+
+ const containerProps = {
+ error: Boolean(error),
+ centerText,
+ monospaced,
+ };
+
+ // if we have an error, we want to show it even if the input changes to a valid value
+ useEffect(() => {
+ if (error && !isEmpty(error) && !isEqual(error, errorString)) {
+ setErrorString(error);
+ }
+ }, [error, errorString]);
+
+ return (
+
+
+ {isTextArea ? (
+
+
+
+ ) : (
+
+ )}
+ {editable && enableShowHide && (
+ {
+ setForceShow(!forceShow);
+ }}
+ error={Boolean(errorString)}
+ />
+ )}
+
+
+ {ctaButton || errorString ? : null}
+ {errorString ? : null}
+
+
+ {ctaButton}
+
+
+ );
+};
diff --git a/ts/components/inputs/index.tsx b/ts/components/inputs/index.tsx
new file mode 100644
index 0000000000..0e2b3f7195
--- /dev/null
+++ b/ts/components/inputs/index.tsx
@@ -0,0 +1,3 @@
+import { SessionInput } from './SessionInput';
+
+export { SessionInput };
diff --git a/ts/components/leftpane/ActionsPanel.tsx b/ts/components/leftpane/ActionsPanel.tsx
index 319300713d..0b72c06e32 100644
--- a/ts/components/leftpane/ActionsPanel.tsx
+++ b/ts/components/leftpane/ActionsPanel.tsx
@@ -1,5 +1,5 @@
import { ipcRenderer } from 'electron';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { debounce, isEmpty, isString } from 'lodash';
import { useDispatch, useSelector } from 'react-redux';
@@ -172,7 +172,7 @@ const setupTheme = async () => {
await switchThemeTo(themeConfig);
};
-// Do this only if we created a new Session ID, or if we already received the initial configuration message
+// Do this only if we created a new account id, or if we already received the initial configuration message
const triggerSyncIfNeeded = async () => {
const us = UserUtils.getOurPubKeyStrFromCache();
await getConversationController().get(us).setDidApproveMe(true, true);
diff --git a/ts/components/leftpane/ContactListItem.tsx b/ts/components/leftpane/ContactListItem.tsx
index 818bfc4ded..d92e82fc68 100644
--- a/ts/components/leftpane/ContactListItem.tsx
+++ b/ts/components/leftpane/ContactListItem.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import classNames from 'classnames';
import { useConversationUsername, useIsMe, useIsPrivate } from '../../hooks/useParamSelector';
import { Avatar, AvatarSize } from '../avatar/Avatar';
diff --git a/ts/components/leftpane/LeftPane.tsx b/ts/components/leftpane/LeftPane.tsx
index 62e9480f82..2629c79f86 100644
--- a/ts/components/leftpane/LeftPane.tsx
+++ b/ts/components/leftpane/LeftPane.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { SectionType } from '../../state/ducks/section';
diff --git a/ts/components/leftpane/LeftPaneMessageSection.tsx b/ts/components/leftpane/LeftPaneMessageSection.tsx
index 0ed21cf58c..f3d04411e8 100644
--- a/ts/components/leftpane/LeftPaneMessageSection.tsx
+++ b/ts/components/leftpane/LeftPaneMessageSection.tsx
@@ -1,5 +1,6 @@
import autoBind from 'auto-bind';
-import React from 'react';
+
+import { Component } from 'react';
import { useSelector } from 'react-redux';
import { AutoSizer, List, ListRowProps } from 'react-virtualized';
import styled from 'styled-components';
@@ -65,7 +66,7 @@ const ClosableOverlay = () => {
}
};
-export class LeftPaneMessageSection extends React.Component {
+export class LeftPaneMessageSection extends Component {
public constructor(props: Props) {
super(props);
autoBind(this);
diff --git a/ts/components/leftpane/LeftPaneSectionHeader.tsx b/ts/components/leftpane/LeftPaneSectionHeader.tsx
index 198da2ff4c..907b124fd6 100644
--- a/ts/components/leftpane/LeftPaneSectionHeader.tsx
+++ b/ts/components/leftpane/LeftPaneSectionHeader.tsx
@@ -1,15 +1,17 @@
-import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { recoveryPhraseModal } from '../../state/ducks/modalDialog';
import { SectionType } from '../../state/ducks/section';
import { disableRecoveryPhrasePrompt } from '../../state/ducks/userConfig';
import { getFocusedSection, getIsMessageRequestOverlayShown } from '../../state/selectors/section';
+import { getTheme } from '../../state/selectors/theme';
import { getShowRecoveryPhrasePrompt } from '../../state/selectors/userConfig';
import { isSignWithRecoveryPhrase } from '../../util/storage';
import { Flex } from '../basic/Flex';
import { SessionButton } from '../basic/SessionButton';
+import { SpacerMD } from '../basic/Text';
import { MenuButton } from '../buttons';
+import { SessionIcon } from '../icon';
const SectionTitle = styled.h1`
padding-top: var(--margins-xs);
@@ -27,45 +29,50 @@ const StyledProgressBarContainer = styled.div`
const StyledProgressBarInner = styled.div`
background: var(--primary-color);
- width: 90%;
+ width: 100%;
transition: width var(--default-duration) ease-in;
height: 100%;
`;
-export const StyledBannerTitle = styled.div`
- line-height: 1.3;
- font-size: var(--font-size-md);
- font-weight: bold;
- margin: var(--margins-sm) var(--margins-sm) 0 var(--margins-sm);
-
- span {
- color: var(--primary-color);
- }
-`;
-
-export const StyledLeftPaneBanner = styled.div`
- background: var(--background-primary-color);
- display: flex;
- flex-direction: column;
- border-bottom: 1px solid var(--border-color);
-`;
-
-const StyledBannerInner = styled.div`
+const StyledBanner = styled(Flex)`
p {
+ padding: 0;
margin: 0;
+ line-height: 1.2;
}
- .left-pane-banner___phrase {
- margin-top: var(--margins-md);
+ p:nth-child(2) {
+ font-size: 12px;
}
.session-button {
- margin-top: var(--margins-md);
- flex-grow: 1;
+ width: 100%;
}
+
+ svg {
+ margin-top: -3px;
+ margin-left: var(--margins-xs);
+ }
+`;
+
+const StyledBannerTitle = styled.p`
+ font-size: var(--font-size-h4);
+ font-weight: 500;
+ line-height: 1;
+`;
+
+const StyledLeftPaneBanner = styled.div`
+ background: var(--background-secondary-color);
+ display: flex;
+ flex-direction: column;
+ border-bottom: 1px solid var(--border-color);
`;
-const BannerInner = () => {
+export const LeftPaneBanner = () => {
+ const theme = useSelector(getTheme);
+ const section = useSelector(getFocusedSection);
+ const isSignInWithRecoveryPhrase = isSignWithRecoveryPhrase();
+
const dispatch = useDispatch();
const showRecoveryPhraseModal = () => {
@@ -73,24 +80,6 @@ const BannerInner = () => {
dispatch(recoveryPhraseModal({}));
};
- return (
-
- {window.i18n('recoveryPhraseRevealMessage')}
-
-
-
-
- );
-};
-
-export const LeftPaneBanner = () => {
- const section = useSelector(getFocusedSection);
- const isSignInWithRecoveryPhrase = isSignWithRecoveryPhrase();
-
if (section !== SectionType.Message || isSignInWithRecoveryPhrase) {
return null;
}
@@ -100,12 +89,29 @@ export const LeftPaneBanner = () => {
-
- {window.i18n('recoveryPhraseSecureTitle')} 90%
-
-
-
-
+
+
+ {window.i18n('saveRecoveryPassword')}
+
+
+ {window.i18n('saveRecoveryPasswordDescription')}
+
+
+
);
};
diff --git a/ts/components/leftpane/LeftPaneSettingSection.tsx b/ts/components/leftpane/LeftPaneSettingSection.tsx
index 8f154d157b..4a002b5157 100644
--- a/ts/components/leftpane/LeftPaneSettingSection.tsx
+++ b/ts/components/leftpane/LeftPaneSettingSection.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
@@ -11,9 +10,9 @@ import {
showSettingsSection,
} from '../../state/ducks/section';
import { getFocusedSettingsSection } from '../../state/selectors/section';
+import type { SessionSettingCategory } from '../../types/ReduxTypes';
import { SessionIcon } from '../icon';
import { LeftPaneSectionHeader } from './LeftPaneSectionHeader';
-import type { SessionSettingCategory } from '../../types/ReduxTypes';
const StyledSettingsSectionTitle = styled.strong`
font-family: var(--font-accent), var(--font-default);
@@ -73,8 +72,8 @@ const getCategories = (): Array<{ id: SessionSettingCategory; title: string }> =
title: window.i18n('helpSettingsTitle'),
},
{
- id: 'recoveryPhrase' as const,
- title: window.i18n('recoveryPhrase'),
+ id: 'recoveryPassword' as const,
+ title: window.i18n('sessionRecoveryPassword'),
},
{
id: 'clearData' as const,
@@ -108,7 +107,7 @@ const LeftPaneSettingsCategoryRow = (props: {
dispatch(setLeftOverlayMode('message-requests'));
dispatch(resetConversationExternal());
break;
- case 'recoveryPhrase':
+ case 'recoveryPassword':
dispatch(recoveryPhraseModal({}));
break;
case 'clearData':
diff --git a/ts/components/leftpane/MessageRequestsBanner.tsx b/ts/components/leftpane/MessageRequestsBanner.tsx
index 8f06487f5a..5fde567846 100644
--- a/ts/components/leftpane/MessageRequestsBanner.tsx
+++ b/ts/components/leftpane/MessageRequestsBanner.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { MouseEvent, ReactNode } from 'react';
import { contextMenu } from 'react-contexify';
import { createPortal } from 'react-dom';
import { useSelector } from 'react-redux';
@@ -105,7 +105,7 @@ export const MessageRequestsBanner = (props: { handleOnClick: () => any }) => {
});
};
- const openRequests = (e: React.MouseEvent) => {
+ const openRequests = (e: MouseEvent) => {
if (e.button === 0) {
handleOnClick();
}
@@ -137,6 +137,6 @@ export const MessageRequestsBanner = (props: { handleOnClick: () => any }) => {
);
};
-const Portal = ({ children }: { children: React.ReactNode }) => {
+const Portal = ({ children }: { children: ReactNode }) => {
return createPortal(children, document.querySelector('.inbox.index') as Element);
};
diff --git a/ts/components/leftpane/conversation-list-item/ConversationListItem.tsx b/ts/components/leftpane/conversation-list-item/ConversationListItem.tsx
index a15090ceb0..a1d95ba474 100644
--- a/ts/components/leftpane/conversation-list-item/ConversationListItem.tsx
+++ b/ts/components/leftpane/conversation-list-item/ConversationListItem.tsx
@@ -1,6 +1,6 @@
import classNames from 'classnames';
import { isNil } from 'lodash';
-import React, { useCallback } from 'react';
+import { MouseEvent, ReactNode, useCallback } from 'react';
import { contextMenu } from 'react-contexify';
import { createPortal } from 'react-dom';
import { useDispatch, useSelector } from 'react-redux';
@@ -34,7 +34,7 @@ type PropsHousekeeping = {
type Props = { conversationId: string } & PropsHousekeeping;
-const Portal = ({ children }: { children: React.ReactNode }) => {
+const Portal = ({ children }: { children: ReactNode }) => {
return createPortal(children, document.querySelector('.inbox.index') as Element);
};
@@ -88,7 +88,7 @@ const ConversationListItemInner = (props: Props) => {
const triggerId = `${key}-ctxmenu`;
const openConvo = useCallback(
- (e: React.MouseEvent) => {
+ (e: MouseEvent) => {
// mousedown is invoked sooner than onClick, but for both right and left click
if (e.button === 0) {
void openConversationWithMessages({ conversationKey: conversationId, messageId: null });
diff --git a/ts/components/leftpane/conversation-list-item/HeaderItem.tsx b/ts/components/leftpane/conversation-list-item/HeaderItem.tsx
index ffdcd1f176..344abb0634 100644
--- a/ts/components/leftpane/conversation-list-item/HeaderItem.tsx
+++ b/ts/components/leftpane/conversation-list-item/HeaderItem.tsx
@@ -1,5 +1,6 @@
import classNames from 'classnames';
-import React from 'react';
+
+import { MouseEvent } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { useConvoIdFromContext } from '../../../contexts/ConvoIdContext';
@@ -115,10 +116,7 @@ const MentionAtSymbol = styled.span`
/**
* When clicking on the `@` symbol of a conversation, we open the conversation to the first unread message tagging us (with the @pubkey syntax)
*/
-async function openConvoToLastMention(
- e: React.MouseEvent,
- conversationId: string
-) {
+async function openConvoToLastMention(e: MouseEvent, conversationId: string) {
e.stopPropagation();
e.preventDefault();
diff --git a/ts/components/leftpane/conversation-list-item/InteractionItem.tsx b/ts/components/leftpane/conversation-list-item/InteractionItem.tsx
index 29b836bced..a4614ca8dd 100644
--- a/ts/components/leftpane/conversation-list-item/InteractionItem.tsx
+++ b/ts/components/leftpane/conversation-list-item/InteractionItem.tsx
@@ -1,5 +1,5 @@
import { isEmpty } from 'lodash';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import styled from 'styled-components';
import { useIsPrivate, useIsPublic } from '../../../hooks/useParamSelector';
diff --git a/ts/components/leftpane/conversation-list-item/MessageItem.tsx b/ts/components/leftpane/conversation-list-item/MessageItem.tsx
index 792e9c8a85..ec0f6f8e24 100644
--- a/ts/components/leftpane/conversation-list-item/MessageItem.tsx
+++ b/ts/components/leftpane/conversation-list-item/MessageItem.tsx
@@ -1,6 +1,6 @@
import classNames from 'classnames';
import { isEmpty } from 'lodash';
-import React from 'react';
+
import { useSelector } from 'react-redux';
import { useConvoIdFromContext } from '../../../contexts/ConvoIdContext';
import {
diff --git a/ts/components/leftpane/conversation-list-item/UserItem.tsx b/ts/components/leftpane/conversation-list-item/UserItem.tsx
index fc6ad9028b..ac92de6014 100644
--- a/ts/components/leftpane/conversation-list-item/UserItem.tsx
+++ b/ts/components/leftpane/conversation-list-item/UserItem.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useSelector } from 'react-redux';
import { useConvoIdFromContext } from '../../../contexts/ConvoIdContext';
import {
diff --git a/ts/components/leftpane/overlay/OverlayClosedGroup.tsx b/ts/components/leftpane/overlay/OverlayClosedGroup.tsx
index f141f38099..35281d215d 100644
--- a/ts/components/leftpane/overlay/OverlayClosedGroup.tsx
+++ b/ts/components/leftpane/overlay/OverlayClosedGroup.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import useKey from 'react-use/lib/useKey';
@@ -6,7 +6,7 @@ import styled from 'styled-components';
import { SessionButton } from '../../basic/SessionButton';
import { SessionIdEditable } from '../../basic/SessionIdEditable';
-import { SessionSpinner } from '../../basic/SessionSpinner';
+import { SessionSpinner } from '../../loading';
import { MemberListItem } from '../../MemberListItem';
import { OverlayHeader } from './OverlayHeader';
diff --git a/ts/components/leftpane/overlay/OverlayCommunity.tsx b/ts/components/leftpane/overlay/OverlayCommunity.tsx
index e97210c092..284cc984a4 100644
--- a/ts/components/leftpane/overlay/OverlayCommunity.tsx
+++ b/ts/components/leftpane/overlay/OverlayCommunity.tsx
@@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
-import React, { useState } from 'react';
+import { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import useKey from 'react-use/lib/useKey';
@@ -14,7 +14,7 @@ import { ToastUtils } from '../../../session/utils';
import { resetLeftOverlayMode } from '../../../state/ducks/section';
import { SessionButton } from '../../basic/SessionButton';
import { SessionIdEditable } from '../../basic/SessionIdEditable';
-import { SessionSpinner } from '../../basic/SessionSpinner';
+import { SessionSpinner } from '../../loading';
import { OverlayHeader } from './OverlayHeader';
import {
diff --git a/ts/components/leftpane/overlay/OverlayHeader.tsx b/ts/components/leftpane/overlay/OverlayHeader.tsx
index b2f1509903..4616c0dab6 100644
--- a/ts/components/leftpane/overlay/OverlayHeader.tsx
+++ b/ts/components/leftpane/overlay/OverlayHeader.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useDispatch } from 'react-redux';
import styled from 'styled-components';
import { setLeftOverlayMode } from '../../../state/ducks/section';
diff --git a/ts/components/leftpane/overlay/OverlayMessage.tsx b/ts/components/leftpane/overlay/OverlayMessage.tsx
index 779bfb8b22..761d78addb 100644
--- a/ts/components/leftpane/overlay/OverlayMessage.tsx
+++ b/ts/components/leftpane/overlay/OverlayMessage.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import useKey from 'react-use/lib/useKey';
import styled from 'styled-components';
@@ -11,7 +11,7 @@ import { openConversationWithMessages } from '../../../state/ducks/conversations
import { resetLeftOverlayMode } from '../../../state/ducks/section';
import { SessionButton } from '../../basic/SessionButton';
import { SessionIdEditable } from '../../basic/SessionIdEditable';
-import { SessionSpinner } from '../../basic/SessionSpinner';
+import { SessionSpinner } from '../../loading';
import { OverlayHeader } from './OverlayHeader';
import { ONSResolve } from '../../../session/apis/snode_api/onsResolve';
@@ -51,8 +51,8 @@ export const OverlayMessage = () => {
const title = window.i18n('newMessage');
const buttonText = window.i18n('next');
- const subtitle = window.i18n('enterSessionID');
- const placeholder = window.i18n('enterSessionIDOrONSName');
+ const subtitle = window.i18n('accountIdEnter');
+ const placeholder = window.i18n('accountIdEnterYourFriends');
const disableNextButton = !pubkeyOrOns || loading;
@@ -80,7 +80,7 @@ export const OverlayMessage = () => {
async function handleMessageButtonClick() {
if ((!pubkeyOrOns && !pubkeyOrOns.length) || !pubkeyOrOns.trim().length) {
- ToastUtils.pushToastError('invalidPubKey', window.i18n('invalidNumberError')); // or ons name
+ ToastUtils.pushToastError('invalidPubKey', window.i18n('onsErrorNotRecognised')); // or ons name
return;
}
const pubkeyorOnsTrimmed = pubkeyOrOns.trim();
@@ -93,14 +93,14 @@ export const OverlayMessage = () => {
// this might be an ONS, validate the regex first
const mightBeOnsName = new RegExp(ONSResolve.onsNameRegex, 'g').test(pubkeyorOnsTrimmed);
if (!mightBeOnsName) {
- ToastUtils.pushToastError('invalidPubKey', window.i18n('invalidNumberError'));
+ ToastUtils.pushToastError('invalidPubKey', window.i18n('onsErrorNotRecognised'));
return;
}
setLoading(true);
try {
const resolvedSessionID = await ONSResolve.getSessionIDForOnsName(pubkeyorOnsTrimmed);
if (PubKey.validateWithErrorNoBlinding(resolvedSessionID)) {
- throw new Error('Got a resolved ONS but the returned entry is not a vlaid SessionID');
+ throw new Error('Got a resolved ONS but the returned entry is not a valid SessionID');
}
// this is a pubkey
await openConvoOnceResolved(resolvedSessionID);
@@ -126,7 +126,7 @@ export const OverlayMessage = () => {
- {window.i18n('startNewConversationBy...')}
+ {window.i18n('messageNewDescription')}
diff --git a/ts/components/leftpane/overlay/OverlayMessageRequest.tsx b/ts/components/leftpane/overlay/OverlayMessageRequest.tsx
index a8afda3e2b..3845f8e890 100644
--- a/ts/components/leftpane/overlay/OverlayMessageRequest.tsx
+++ b/ts/components/leftpane/overlay/OverlayMessageRequest.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { useDispatch, useSelector } from 'react-redux';
import useKey from 'react-use/lib/useKey';
import styled from 'styled-components';
diff --git a/ts/components/leftpane/overlay/SessionJoinableDefaultRooms.tsx b/ts/components/leftpane/overlay/SessionJoinableDefaultRooms.tsx
index 3325213867..7bd08775f8 100644
--- a/ts/components/leftpane/overlay/SessionJoinableDefaultRooms.tsx
+++ b/ts/components/leftpane/overlay/SessionJoinableDefaultRooms.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
@@ -9,8 +9,8 @@ import { StateType } from '../../../state/reducer';
import { Avatar, AvatarSize } from '../../avatar/Avatar';
import { Flex } from '../../basic/Flex';
import { PillContainerHoverable, StyledPillContainerHoverable } from '../../basic/PillContainer';
-import { SessionSpinner } from '../../basic/SessionSpinner';
import { H3 } from '../../basic/Text';
+import { SessionSpinner } from '../../loading';
export type JoinableRoomProps = {
completeUrl: string;
diff --git a/ts/components/leftpane/overlay/choose-action/ContactRow.tsx b/ts/components/leftpane/overlay/choose-action/ContactRow.tsx
index be65ad6730..3bf2e95ccd 100644
--- a/ts/components/leftpane/overlay/choose-action/ContactRow.tsx
+++ b/ts/components/leftpane/overlay/choose-action/ContactRow.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useDispatch } from 'react-redux';
import styled, { CSSProperties } from 'styled-components';
import { useAvatarPath } from '../../../../hooks/useParamSelector';
diff --git a/ts/components/leftpane/overlay/choose-action/ContactsListWithBreaks.tsx b/ts/components/leftpane/overlay/choose-action/ContactsListWithBreaks.tsx
index df8c4f9ae1..5e10e6b7fb 100644
--- a/ts/components/leftpane/overlay/choose-action/ContactsListWithBreaks.tsx
+++ b/ts/components/leftpane/overlay/choose-action/ContactsListWithBreaks.tsx
@@ -1,5 +1,5 @@
import { isString } from 'lodash';
-import React from 'react';
+
import { useSelector } from 'react-redux';
import { AutoSizer, Index, List, ListRowProps } from 'react-virtualized';
import styled, { CSSProperties } from 'styled-components';
diff --git a/ts/components/leftpane/overlay/choose-action/OverlayChooseAction.tsx b/ts/components/leftpane/overlay/choose-action/OverlayChooseAction.tsx
index d162a5fa72..cd18c699f4 100644
--- a/ts/components/leftpane/overlay/choose-action/OverlayChooseAction.tsx
+++ b/ts/components/leftpane/overlay/choose-action/OverlayChooseAction.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useEffect } from 'react';
+import { useCallback, useEffect } from 'react';
import { isEmpty, isString } from 'lodash';
import { useDispatch } from 'react-redux';
diff --git a/ts/components/lightbox/Lightbox.tsx b/ts/components/lightbox/Lightbox.tsx
index 5b80915b40..f7ab461b39 100644
--- a/ts/components/lightbox/Lightbox.tsx
+++ b/ts/components/lightbox/Lightbox.tsx
@@ -1,17 +1,17 @@
-import React, { useRef } from 'react';
+import { CSSProperties, MouseEvent, MutableRefObject, useRef } from 'react';
-import useUnmount from 'react-use/lib/useUnmount';
-import { useDispatch } from 'react-redux';
import { isUndefined } from 'lodash';
+import { useDispatch } from 'react-redux';
+import useUnmount from 'react-use/lib/useUnmount';
import styled from 'styled-components';
import { useDisableDrag } from '../../hooks/useDisableDrag';
import { useEncryptedFileFetch } from '../../hooks/useEncryptedFileFetch';
import { showLightBox } from '../../state/ducks/conversations';
+import * as MIME from '../../types/MIME';
+import { assertUnreachable } from '../../types/sqlSharedTypes';
import { GoogleChrome } from '../../util';
import { Flex } from '../basic/Flex';
import { SessionIconButton, SessionIconSize, SessionIconType } from '../icon';
-import * as MIME from '../../types/MIME';
-import { assertUnreachable } from '../../types/sqlSharedTypes';
const colorSVG = (url: string, color: string) => {
return {
@@ -46,7 +46,7 @@ const styles = {
top: 0,
bottom: 0,
backgroundColor: 'var(--lightbox-background-color)',
- } as React.CSSProperties,
+ } as CSSProperties,
mainContainer: {
display: 'flex',
flexDirection: 'row',
@@ -58,13 +58,13 @@ const styles = {
minHeight: 0,
overflow: 'hidden',
minWidth: 0,
- } as React.CSSProperties,
+ } as CSSProperties,
objectContainer: {
position: 'relative',
flexGrow: 1,
display: 'inline-flex',
justifyContent: 'center',
- } as React.CSSProperties,
+ } as CSSProperties,
objectParentContainer: {
flexGrow: 1,
textAlign: 'center' as const,
@@ -76,7 +76,7 @@ const styles = {
maxWidth: '80vw',
maxHeight: '80vh',
objectFit: 'contain',
- } as React.CSSProperties,
+ } as CSSProperties,
caption: {
position: 'absolute',
bottom: 0,
@@ -88,7 +88,7 @@ const styles = {
paddingLeft: '3em',
paddingRight: '3em',
backgroundColor: 'var(--lightbox-caption-background-color)',
- } as React.CSSProperties,
+ } as CSSProperties,
controlsOffsetPlaceholder: {
width: CONTROLS_WIDTH,
marginRight: CONTROLS_SPACING,
@@ -101,7 +101,7 @@ const styles = {
flexDirection: 'column',
marginLeft: CONTROLS_SPACING,
justifyContent: 'space-between',
- } as React.CSSProperties,
+ } as CSSProperties,
navigationContainer: {
flexShrink: 0,
display: 'flex',
@@ -109,7 +109,7 @@ const styles = {
justifyContent: 'center',
padding: 10,
height: '50px', // force it so the buttons stick to the bottom
- } as React.CSSProperties,
+ } as CSSProperties,
saveButton: {
marginTop: 10,
},
@@ -134,7 +134,7 @@ const StyledIconButton = styled.div`
interface IconButtonProps {
onClick?: () => void;
- style?: React.CSSProperties;
+ style?: CSSProperties;
type: 'save' | 'close' | 'previous' | 'next';
}
@@ -186,7 +186,7 @@ const Icon = ({
onClick,
url,
}: {
- onClick?: (event: React.MouseEvent) => void;
+ onClick?: (event: MouseEvent) => void;
url: string;
}) => (
;
+ renderedRef: MutableRefObject
;
onObjectClick: (event: any) => any;
}) => {
const { urlToLoad } = useEncryptedFileFetch(objectURL, contentType, false);
@@ -280,7 +280,7 @@ export const Lightbox = (props: Props) => {
dispatch(showLightBox(undefined));
};
- const onContainerClick = (event: React.MouseEvent) => {
+ const onContainerClick = (event: MouseEvent) => {
if (renderedRef && event.target === renderedRef.current) {
return;
}
diff --git a/ts/components/lightbox/LightboxGallery.tsx b/ts/components/lightbox/LightboxGallery.tsx
index 5ff18f6d51..f89e261060 100644
--- a/ts/components/lightbox/LightboxGallery.tsx
+++ b/ts/components/lightbox/LightboxGallery.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
import { useDispatch } from 'react-redux';
import useKey from 'react-use/lib/useKey';
diff --git a/ts/components/loading/bar/SessionProgressBar.tsx b/ts/components/loading/bar/SessionProgressBar.tsx
new file mode 100644
index 0000000000..7bc8ae0f87
--- /dev/null
+++ b/ts/components/loading/bar/SessionProgressBar.tsx
@@ -0,0 +1,84 @@
+import { motion } from 'framer-motion';
+import styled from 'styled-components';
+import { Flex } from '../../basic/Flex';
+import { SpacerMD, SpacerXL } from '../../basic/Text';
+
+const ProgressContainer = styled.div<{ color: string }>`
+ background: ${({ color }) => color};
+ border-radius: 10px;
+ overflow: hidden;
+`;
+
+const Progress = styled(motion.div)<{ color: string }>`
+ background: ${({ color }) => color};
+ border-radius: 10px;
+ height: 17px;
+`;
+
+const StyledText = styled.span`
+ margin: 0;
+`;
+
+const StyledTitle = styled(StyledText)`
+ font-size: 26px;
+ font-weight: 700;
+`;
+
+type Props = {
+ /** a percentage value */
+ initialValue: number;
+ /** a percentage value */
+ progress: number;
+ color?: string;
+ backgroundColor?: string;
+ margin?: string;
+ /** pixels is preferred */
+ width?: string;
+ title?: string;
+ subtitle?: string;
+ showPercentage?: boolean;
+};
+
+export function SessionProgressBar(props: Props) {
+ const {
+ initialValue,
+ progress,
+ width = '100%',
+ backgroundColor = 'var(--border-color)',
+ color = 'var(--primary-color)',
+ margin,
+ title,
+ subtitle,
+ showPercentage,
+ } = props;
+
+ return (
+
+ {title ? (
+ <>
+ {title}
+
+ >
+ ) : null}
+
+ {subtitle ? {subtitle} : null}
+ {showPercentage ? {Math.floor(progress)}% : null}
+
+ {subtitle || showPercentage ? : null}
+
+
+
+
+ );
+}
diff --git a/ts/components/loading/index.tsx b/ts/components/loading/index.tsx
new file mode 100644
index 0000000000..0b43e72a85
--- /dev/null
+++ b/ts/components/loading/index.tsx
@@ -0,0 +1,5 @@
+import { SessionProgressBar } from './bar/SessionProgressBar';
+import { SessionSpinner } from './spinner/SessionSpinner';
+import { Spinner } from './spinner/Spinner';
+
+export { SessionProgressBar, SessionSpinner, Spinner };
diff --git a/ts/components/loading/spinner/SessionSpinner.tsx b/ts/components/loading/spinner/SessionSpinner.tsx
new file mode 100644
index 0000000000..2b57cc99ac
--- /dev/null
+++ b/ts/components/loading/spinner/SessionSpinner.tsx
@@ -0,0 +1,76 @@
+import styled from 'styled-components';
+
+type Props = {
+ loading: boolean;
+};
+
+const StyledSessionSpinner = styled.div`
+ display: inline-block;
+ position: relative;
+ width: 80px;
+ height: 80px;
+ flex-shrink: 0;
+
+ div {
+ position: absolute;
+ top: 33px;
+ width: 13px;
+ height: 13px;
+ border-radius: 50%;
+ background: var(--primary-color);
+ animation-timing-function: cubic-bezier(0, 1, 1, 0);
+ }
+ div:nth-child(1) {
+ left: 8px;
+ animation: session-loader1 0.6s infinite;
+ }
+ div:nth-child(2) {
+ left: 8px;
+ animation: session-loader2 0.6s infinite;
+ }
+ div:nth-child(3) {
+ left: 32px;
+ animation: session-loader2 0.6s infinite;
+ }
+ div:nth-child(4) {
+ left: 56px;
+ animation: session-loader3 0.6s infinite;
+ }
+ @keyframes session-loader1 {
+ 0% {
+ transform: scale(0);
+ }
+ 100% {
+ transform: scale(1);
+ }
+ }
+ @keyframes session-loader3 {
+ 0% {
+ transform: scale(1);
+ }
+ 100% {
+ transform: scale(0);
+ }
+ }
+ @keyframes session-loader2 {
+ 0% {
+ transform: translate(0, 0);
+ }
+ 100% {
+ transform: translate(24px, 0);
+ }
+ }
+`;
+
+export const SessionSpinner = (props: Props) => {
+ const { loading } = props;
+
+ return loading ? (
+
+
+
+
+
+
+ ) : null;
+};
diff --git a/ts/components/basic/Spinner.tsx b/ts/components/loading/spinner/Spinner.tsx
similarity index 98%
rename from ts/components/basic/Spinner.tsx
rename to ts/components/loading/spinner/Spinner.tsx
index 02e7b79b14..915dfb1822 100644
--- a/ts/components/basic/Spinner.tsx
+++ b/ts/components/loading/spinner/Spinner.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
type Props = {
diff --git a/ts/components/menu/ConversationListItemContextMenu.tsx b/ts/components/menu/ConversationListItemContextMenu.tsx
index d0e2808e94..43f5efde40 100644
--- a/ts/components/menu/ConversationListItemContextMenu.tsx
+++ b/ts/components/menu/ConversationListItemContextMenu.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { Item, Menu } from 'react-contexify';
import { useSelector } from 'react-redux';
diff --git a/ts/components/menu/Menu.tsx b/ts/components/menu/Menu.tsx
index 407dfe289d..4057068335 100644
--- a/ts/components/menu/Menu.tsx
+++ b/ts/components/menu/Menu.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { Item, Submenu } from 'react-contexify';
import { useDispatch, useSelector } from 'react-redux';
import { useConvoIdFromContext } from '../../contexts/ConvoIdContext';
@@ -303,7 +301,7 @@ export const CopyMenuItem = (): JSX.Element | null => {
// we want to show the copyId for open groups and private chats only
if ((isPrivate && !isBlinded) || isPublic) {
- const copyIdLabel = isPublic ? window.i18n('copyOpenGroupURL') : window.i18n('copySessionID');
+ const copyIdLabel = isPublic ? window.i18n('copyOpenGroupURL') : window.i18n('accountIDCopy');
return (
- {
diff --git a/ts/components/menu/MessageRequestBannerContextMenu.tsx b/ts/components/menu/MessageRequestBannerContextMenu.tsx
index a8ef676398..da3d337ce7 100644
--- a/ts/components/menu/MessageRequestBannerContextMenu.tsx
+++ b/ts/components/menu/MessageRequestBannerContextMenu.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { Item, Menu } from 'react-contexify';
import { useDispatch } from 'react-redux';
diff --git a/ts/components/registration/AccentText.tsx b/ts/components/registration/AccentText.tsx
deleted file mode 100644
index fcaa0d909b..0000000000
--- a/ts/components/registration/AccentText.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react';
-
-export const AccentText = () => (
-
-
{window.i18n('beginYourSession')}
-
-);
diff --git a/ts/components/registration/ModalContainer.tsx b/ts/components/registration/ModalContainer.tsx
new file mode 100644
index 0000000000..75fd214983
--- /dev/null
+++ b/ts/components/registration/ModalContainer.tsx
@@ -0,0 +1,15 @@
+import { useSelector } from 'react-redux';
+import { getTermsOfServicePrivacyModalState } from '../../state/onboarding/selectors/modals';
+import { TermsOfServicePrivacyDialog } from '../dialog/TermsOfServicePrivacyDialog';
+
+export const ModalContainer = () => {
+ const termsOfServicePrivacyModalState = useSelector(getTermsOfServicePrivacyModalState);
+
+ return (
+ <>
+ {termsOfServicePrivacyModalState && (
+
+ )}
+ >
+ );
+};
diff --git a/ts/components/registration/RegistrationStages.tsx b/ts/components/registration/RegistrationStages.tsx
index fe29943f41..6840cad709 100644
--- a/ts/components/registration/RegistrationStages.tsx
+++ b/ts/components/registration/RegistrationStages.tsx
@@ -1,21 +1,24 @@
-import React, { createContext, useEffect, useState } from 'react';
+import { shell } from 'electron';
+import { AnimatePresence } from 'framer-motion';
+import styled from 'styled-components';
import { Data } from '../../data/data';
-import { SettingsKey } from '../../data/settings-key';
-import { getSwarmPollingInstance } from '../../session/apis/snode_api';
import { getConversationController } from '../../session/conversations';
-import { mnDecode } from '../../session/crypto/mnemonic';
-import { PromiseUtils, StringUtils, ToastUtils } from '../../session/utils';
-import { fromHex } from '../../session/utils/String';
-import { trigger } from '../../shims/events';
import {
- generateMnemonic,
- registerSingleDevice,
- sessionGenerateKeyPair,
- signInByLinkingDevice,
-} from '../../util/accountManager';
-import { Storage, setSignInByLinking, setSignWithRecoveryPhrase } from '../../util/storage';
-import { SignInMode, SignInTab } from './SignInTab';
-import { SignUpMode, SignUpTab } from './SignUpTab';
+ AccountCreation,
+ AccountRestoration,
+ Onboarding,
+} from '../../state/onboarding/ducks/registration';
+import {
+ useOnboardAccountCreationStep,
+ useOnboardAccountRestorationStep,
+ useOnboardStep,
+} from '../../state/onboarding/selectors/registration';
+import { Storage } from '../../util/storage';
+import { Flex } from '../basic/Flex';
+import { SpacerSM, SpacerXL, SpacerXS } from '../basic/Text';
+import { SessionIcon, SessionIconButton } from '../icon';
+import { OnboardContainer } from './components';
+import { CreateAccount, RestoreAccount, Start } from './stages';
export async function resetRegistration() {
await Data.removeAll();
@@ -25,221 +28,76 @@ export async function resetRegistration() {
await getConversationController().load();
}
-/**
- * Returns undefined if an error happened, or the trim userName.
- *
- * Be sure to use the trimmed userName for creating the account.
- */
-const displayNameIsValid = (displayName: string): undefined | string => {
- const trimName = displayName.trim();
-
- if (!trimName) {
- window?.log?.warn('invalid trimmed name for registration');
- ToastUtils.pushToastError('invalidDisplayName', window.i18n('displayNameEmpty'));
- return undefined;
- }
- return trimName;
-};
-
-export async function signUp(signUpDetails: {
- displayName: string;
- generatedRecoveryPhrase: string;
-}) {
- const { displayName, generatedRecoveryPhrase } = signUpDetails;
- window?.log?.info('SIGNING UP');
-
- const trimName = displayNameIsValid(displayName);
- // shows toast to user about the error
- if (!trimName) {
- return;
- }
-
- try {
- await resetRegistration();
- await registerSingleDevice(generatedRecoveryPhrase, 'english', trimName);
- await Storage.put(SettingsKey.hasSyncedInitialConfigurationItem, Date.now());
- await setSignWithRecoveryPhrase(false);
- trigger('openInbox');
- } catch (e) {
- await resetRegistration();
-
- ToastUtils.pushToastError('registrationError', `Error: ${e.message || 'Something went wrong'}`);
- window?.log?.warn('exception during registration:', e);
+const StyledRegistrationContainer = styled(Flex)`
+ width: 348px;
+ .session-button {
+ width: 100%;
+ margin: 0;
}
-}
-
-/**
- * Sign in/restore from seed.
- * Ask for a display name, as we will drop incoming ConfigurationMessages if any are saved on the swarm.
- * We will handle a ConfigurationMessage
- */
-export async function signInWithRecovery(signInDetails: {
- displayName: string;
- userRecoveryPhrase: string;
-}) {
- const { displayName, userRecoveryPhrase } = signInDetails;
- window?.log?.info('RESTORING FROM SEED');
- const trimName = displayNameIsValid(displayName);
- // shows toast to user about the error
- if (!trimName) {
- return;
- }
-
- try {
- await resetRegistration();
-
- await registerSingleDevice(userRecoveryPhrase, 'english', trimName);
- await setSignWithRecoveryPhrase(true);
-
- trigger('openInbox');
- } catch (e) {
- await resetRegistration();
- ToastUtils.pushToastError('registrationError', `Error: ${e.message || 'Something went wrong'}`);
- window?.log?.warn('exception during registration:', e);
- }
-}
-
-/**
- * This is will try to sign in with the user recovery phrase.
- * If no ConfigurationMessage is received in 60seconds, the loading will be canceled.
- */
-export async function signInWithLinking(
- signInDetails: { userRecoveryPhrase: string },
- setSignInMode: (phase: SignInMode) => void
-) {
- const { userRecoveryPhrase } = signInDetails;
- window?.log?.info('LINKING DEVICE');
-
- try {
- await resetRegistration();
- await signInByLinkingDevice(userRecoveryPhrase, 'english');
- let displayNameFromNetwork = '';
- await getSwarmPollingInstance().start();
-
- await PromiseUtils.waitForTask(done => {
- window.Whisper.events.on('configurationMessageReceived', async (displayName: string) => {
- window.Whisper.events.off('configurationMessageReceived');
- await setSignInByLinking(false);
- await setSignWithRecoveryPhrase(true);
- done(displayName);
-
- displayNameFromNetwork = displayName;
- });
- }, 60000);
- if (displayNameFromNetwork.length) {
- // display name, avatars, groups and contacts should already be handled when this event was triggered.
- window?.log?.info(`We got a displayName from network: "${displayNameFromNetwork}"`);
- } else {
- window?.log?.info('Got a config message from network but without a displayName...');
- throw new Error('Got a config message from network but without a displayName...');
- }
- // Do not set the lastProfileUpdateTimestamp.
- // We expect to get a display name from a configuration message while we are loading messages of this user
- trigger('openInbox');
- } catch (e) {
- await resetRegistration();
- ToastUtils.pushToastError('registrationError', window.i18n('displayNameErrorNew'));
- window?.log?.error(
- '[signInWithLinking] Error during sign in by linking lets try and sign in by recovery phrase',
- e.message || e
- );
- getSwarmPollingInstance().stop(e);
- await setSignWithRecoveryPhrase(false);
- setSignInMode(SignInMode.UsingRecoveryPhrase);
- }
-}
-
-export enum RegistrationPhase {
- Start,
- SignIn,
- SignUp,
-}
-
-interface RegistrationPhaseContext {
- registrationPhase: RegistrationPhase;
- signUpMode: SignUpMode;
- signInMode: SignInMode;
- setRegistrationPhase: (phase: RegistrationPhase) => void;
- setSignInMode: (phase: SignInMode) => void;
- setSignUpMode: (phase: SignUpMode) => void;
- generatedRecoveryPhrase: string;
- hexGeneratedPubKey: string;
-}
-
-export const RegistrationContext = createContext({
- registrationPhase: RegistrationPhase.Start,
- signInMode: SignInMode.Default,
- signUpMode: SignUpMode.Default,
- setRegistrationPhase: () => undefined,
- setSignUpMode: () => undefined,
- setSignInMode: () => undefined,
- generatedRecoveryPhrase: '',
- hexGeneratedPubKey: '',
-});
+`;
export const RegistrationStages = () => {
- const [generatedRecoveryPhrase, setGeneratedRecoveryPhrase] = useState('');
- const [hexGeneratedPubKey, setHexGeneratedPubKey] = useState('');
- const [registrationPhase, setRegistrationPhase] = useState(RegistrationPhase.Start);
- const [signInMode, setSignInMode] = useState(SignInMode.Default);
- const [signUpMode, setSignUpMode] = useState(SignUpMode.Default);
-
- const generateMnemonicAndKeyPair = async () => {
- if (generatedRecoveryPhrase === '') {
- const mnemonic = await generateMnemonic();
-
- let seedHex = mnDecode(mnemonic);
- // handle shorter than 32 bytes seeds
- const privKeyHexLength = 32 * 2;
- if (seedHex.length !== privKeyHexLength) {
- seedHex = seedHex.concat('0'.repeat(32));
- seedHex = seedHex.substring(0, privKeyHexLength);
- }
- const seed = fromHex(seedHex);
- const keyPair = await sessionGenerateKeyPair(seed);
- const newHexPubKey = StringUtils.decode(keyPair.pubKey, 'hex');
-
- setGeneratedRecoveryPhrase(mnemonic);
- setHexGeneratedPubKey(newHexPubKey); // our 'frontend' sessionID
- }
- };
-
- useEffect(() => {
- void generateMnemonicAndKeyPair();
- void resetRegistration();
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
-
- const memoizedValue = React.useMemo(() => {
- return {
- registrationPhase,
- signInMode,
- signUpMode,
- setSignInMode,
- setSignUpMode,
- setRegistrationPhase,
- generatedRecoveryPhrase,
- hexGeneratedPubKey,
- };
- }, [
- registrationPhase,
- signInMode,
- signUpMode,
- setSignInMode,
- setSignUpMode,
- setRegistrationPhase,
- generatedRecoveryPhrase,
- hexGeneratedPubKey,
- ]);
+ const step = useOnboardStep();
+ const creationStep = useOnboardAccountCreationStep();
+ const restorationStep = useOnboardAccountRestorationStep();
return (
-
-
- {(registrationPhase === RegistrationPhase.Start ||
- registrationPhase === RegistrationPhase.SignUp) && }
- {(registrationPhase === RegistrationPhase.Start ||
- registrationPhase === RegistrationPhase.SignIn) && }
-
-
+
+
+
+
+
+
+
+
+
+ {
+ void shell.openExternal('https://getsession.org/faq');
+ }}
+ />
+
+ {
+ void shell.openExternal('https://getsession.org');
+ }}
+ />
+
+
+
+
+
+
+ {step === Onboarding.Start ? : null}
+ {step === Onboarding.CreateAccount ? : null}
+ {step === Onboarding.RestoreAccount ? : null}
+
+
+
+
);
};
diff --git a/ts/components/registration/RegistrationUserDetails.tsx b/ts/components/registration/RegistrationUserDetails.tsx
deleted file mode 100644
index ab17a76e02..0000000000
--- a/ts/components/registration/RegistrationUserDetails.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import classNames from 'classnames';
-import React from 'react';
-import { MAX_USERNAME_BYTES } from '../../session/constants';
-import { SessionInput } from '../basic/SessionInput';
-
-const DisplayNameInput = (props: {
- stealAutoFocus?: boolean;
- displayName: string;
- onDisplayNameChanged: (val: string) => any;
- handlePressEnter: () => any;
-}) => {
- return (
-
- );
-};
-
-const RecoveryPhraseInput = (props: {
- recoveryPhrase: string;
- onSeedChanged: (val: string) => any;
- handlePressEnter: () => any;
- stealAutoFocus?: boolean;
-}) => {
- return (
-
- );
-};
-
-export interface Props {
- showDisplayNameField: boolean;
- showSeedField: boolean;
- stealAutoFocus?: boolean;
- recoveryPhrase?: string;
- displayName: string;
- handlePressEnter: () => any;
- onSeedChanged?: (val: string) => any;
- onDisplayNameChanged: (val: string) => any;
-}
-
-export const RegistrationUserDetails = (props: Props) => {
- if (props.showSeedField && (props.recoveryPhrase === undefined || !props.onSeedChanged)) {
- throw new Error('if show seed is true, we need callback + value');
- }
- return (
-
- {props.showSeedField && (
-
- )}
-
- {props.showDisplayNameField && (
-
- )}
-
-
- );
-};
diff --git a/ts/components/registration/SessionRegistrationView.tsx b/ts/components/registration/SessionRegistrationView.tsx
index 0e1e24b4b3..cea12f50c5 100644
--- a/ts/components/registration/SessionRegistrationView.tsx
+++ b/ts/components/registration/SessionRegistrationView.tsx
@@ -1,38 +1,85 @@
-import React from 'react';
-import { AccentText } from './AccentText';
+import { Provider } from 'react-redux';
+import styled from 'styled-components';
-import { RegistrationStages } from './RegistrationStages';
-import { SessionIcon } from '../icon';
-import { SessionToastContainer } from '../SessionToastContainer';
+import { useMount } from 'react-use';
+import { onboardingStore } from '../../state/onboarding/store';
import { SessionTheme } from '../../themes/SessionTheme';
-import { Flex } from '../basic/Flex';
import { setSignInByLinking } from '../../util/storage';
+import { SessionToastContainer } from '../SessionToastContainer';
+import { Flex } from '../basic/Flex';
+import { ModalContainer } from './ModalContainer';
+import { RegistrationStages } from './RegistrationStages';
+import { Hero } from './components';
+
+const StyledFullscreenContainer = styled(Flex)`
+ position: relative;
+ width: 100%;
+ height: 100%;
+ background-color: var(--background-primary-color);
+ color: var(--text-primary-color);
+`;
+
+const StyledSessionContent = styled(Flex)`
+ z-index: 1;
+ &-accent {
+ &-text {
+ font-family: var(--font-accent), var(--font-default);
+ text-align: center;
+ .title {
+ font-size: 90px;
+ font-weight: 700;
+ line-height: 100px;
+ }
+ }
+ }
+
+ &-registration {
+ padding-inline-end: 128px;
+ }
+
+ &-header {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+ justify-content: space-between;
+ padding: 17px 20px;
+ }
+
+ &-body {
+ display: flex;
+ flex-direction: row;
+ flex: 1;
+ align-items: center;
+ width: 100%;
+ padding-bottom: 20px;
+ }
+`;
export const SessionRegistrationView = () => {
- React.useEffect(() => {
+ useMount(() => {
void setSignInByLinking(false);
- }, []);
+ });
+
return (
-
-
-
+
+
+
+
);
};
diff --git a/ts/components/registration/SignInTab.tsx b/ts/components/registration/SignInTab.tsx
deleted file mode 100644
index 7392a137e4..0000000000
--- a/ts/components/registration/SignInTab.tsx
+++ /dev/null
@@ -1,221 +0,0 @@
-import React, { useContext, useState } from 'react';
-import { ToastUtils } from '../../session/utils';
-import { sanitizeSessionUsername } from '../../session/utils/String';
-import { Flex } from '../basic/Flex';
-import { SessionButton } from '../basic/SessionButton';
-import { SessionSpinner } from '../basic/SessionSpinner';
-import { SpacerLG } from '../basic/Text';
-import {
- RegistrationContext,
- RegistrationPhase,
- signInWithLinking,
- signInWithRecovery,
-} from './RegistrationStages';
-import { RegistrationUserDetails } from './RegistrationUserDetails';
-import { GoBackMainMenuButton } from './SignUpTab';
-import { TermsAndConditions } from './TermsAndConditions';
-
-export enum SignInMode {
- Default,
- UsingRecoveryPhrase,
- LinkDevice,
-}
-
-const LinkDeviceButton = (props: { onLinkDeviceButtonClicked: () => any }) => {
- return (
-
- );
-};
-
-const RestoreUsingRecoveryPhraseButton = (props: { onRecoveryButtonClicked: () => any }) => {
- return (
-
- );
-};
-
-const ContinueYourSessionButton = (props: {
- handleContinueYourSessionClick: () => any;
- disabled: boolean;
-}) => {
- return (
-
- );
-};
-
-const SignInContinueButton = (props: {
- signInMode: SignInMode;
- disabled: boolean;
- handleContinueYourSessionClick: () => any;
-}) => {
- if (props.signInMode === SignInMode.Default) {
- return null;
- }
- return (
-
- );
-};
-
-const SignInButtons = (props: {
- signInMode: SignInMode;
- onRecoveryButtonClicked: () => any;
- onLinkDeviceButtonClicked: () => any;
-}) => {
- if (props.signInMode !== SignInMode.Default) {
- return null;
- }
- return (
-
-
-
-
-
- );
-};
-
-export function sanitizeDisplayNameOrToast(
- displayName: string,
- setDisplayName: (sanitized: string) => void,
- setDisplayNameError: (error: string | undefined) => void
-) {
- try {
- const sanitizedName = sanitizeSessionUsername(displayName);
- const trimName = sanitizedName.trim();
- setDisplayName(sanitizedName);
- setDisplayNameError(!trimName ? window.i18n('displayNameEmpty') : undefined);
- } catch (e) {
- setDisplayName(displayName);
- setDisplayNameError(window.i18n('displayNameTooLong'));
- ToastUtils.pushToastError('toolong', window.i18n('displayNameTooLong'));
- }
-}
-
-export const SignInTab = () => {
- const { setRegistrationPhase, signInMode, setSignInMode } = useContext(RegistrationContext);
-
- const [recoveryPhrase, setRecoveryPhrase] = useState('');
- const [recoveryPhraseError, setRecoveryPhraseError] = useState(undefined as string | undefined);
- const [displayName, setDisplayName] = useState('');
- const [displayNameError, setDisplayNameError] = useState('');
- const [loading, setIsLoading] = useState(false);
-
- const isRecovery = signInMode === SignInMode.UsingRecoveryPhrase;
- const isLinking = signInMode === SignInMode.LinkDevice;
- const showTermsAndConditions = signInMode !== SignInMode.Default;
-
- // show display name input only if we are trying to recover from seed.
- // We don't need a display name when we link a device, as the display name
- // from the configuration message will be used.
- const showDisplayNameField = isRecovery;
-
- // Display name is required only on isRecoveryMode or if linking a device fails
- const displayNameOK = (isRecovery && !displayNameError && !!displayName) || isLinking;
-
- // Seed is mandatory no matter which mode
- const seedOK = recoveryPhrase && !recoveryPhraseError;
-
- const activateContinueButton = seedOK && displayNameOK && !loading;
-
- const continueYourSession = async () => {
- if (isRecovery) {
- await signInWithRecovery({
- displayName,
- userRecoveryPhrase: recoveryPhrase,
- });
- } else if (isLinking) {
- setIsLoading(true);
- await signInWithLinking(
- {
- userRecoveryPhrase: recoveryPhrase,
- },
- setSignInMode
- );
- setIsLoading(false);
- }
- };
-
- return (
-
- {signInMode !== SignInMode.Default && (
- <>
-
-
- {
- sanitizeDisplayNameOrToast(name, setDisplayName, setDisplayNameError);
- }}
- onSeedChanged={(seed: string) => {
- setRecoveryPhrase(seed);
- setRecoveryPhraseError(!seed ? window.i18n('recoveryPhraseEmpty') : undefined);
- }}
- recoveryPhrase={recoveryPhrase}
- stealAutoFocus={true}
- />
- >
- )}
-
- {
- setRegistrationPhase(RegistrationPhase.SignIn);
- setSignInMode(SignInMode.UsingRecoveryPhrase);
- setRecoveryPhrase('');
- setDisplayName('');
- setIsLoading(false);
- }}
- onLinkDeviceButtonClicked={() => {
- setRegistrationPhase(RegistrationPhase.SignIn);
- setSignInMode(SignInMode.LinkDevice);
- setRecoveryPhrase('');
- setDisplayName('');
- setIsLoading(false);
- }}
- />
-
- {loading && (
-
-
-
- )}
-
- {showTermsAndConditions && }
-
- );
-};
diff --git a/ts/components/registration/SignUpTab.tsx b/ts/components/registration/SignUpTab.tsx
deleted file mode 100644
index 9a5f27ab8f..0000000000
--- a/ts/components/registration/SignUpTab.tsx
+++ /dev/null
@@ -1,144 +0,0 @@
-import React, { useContext, useEffect, useState } from 'react';
-import { Flex } from '../basic/Flex';
-import { SessionButton } from '../basic/SessionButton';
-import { SessionIdEditable } from '../basic/SessionIdEditable';
-import { SessionIconButton } from '../icon';
-import { RegistrationContext, RegistrationPhase, signUp } from './RegistrationStages';
-import { RegistrationUserDetails } from './RegistrationUserDetails';
-import { sanitizeDisplayNameOrToast, SignInMode } from './SignInTab';
-import { TermsAndConditions } from './TermsAndConditions';
-
-export enum SignUpMode {
- Default,
- SessionIDShown,
- EnterDetails,
-}
-
-const CreateSessionIdButton = ({ createSessionID }: { createSessionID: any }) => {
- return ;
-};
-
-const ContinueSignUpButton = ({ continueSignUp }: { continueSignUp: any }) => {
- return ;
-};
-
-const SignUpDefault = (props: { createSessionID: () => void }) => {
- return (
-
-
-
- );
-};
-
-export const GoBackMainMenuButton = () => {
- const { setRegistrationPhase, setSignInMode, setSignUpMode } = useContext(RegistrationContext);
- return (
- {
- setRegistrationPhase(RegistrationPhase.Start);
- setSignInMode(SignInMode.Default);
- setSignUpMode(SignUpMode.Default);
- }}
- />
- );
-};
-
-const SignUpSessionIDShown = (props: { continueSignUp: () => void }) => {
- return (
-
-
-
-
-
- {window.i18n('yourUniqueSessionID')}
-
-
-
-
{window.i18n('allUsersAreRandomly...')}
-
-
-
- );
-};
-
-export const SignUpTab = () => {
- const {
- signUpMode,
- setRegistrationPhase,
- generatedRecoveryPhrase,
- hexGeneratedPubKey,
- setSignUpMode,
- } = useContext(RegistrationContext);
- const [displayName, setDisplayName] = useState('');
- const [displayNameError, setDisplayNameError] = useState('');
-
- useEffect(() => {
- if (signUpMode === SignUpMode.SessionIDShown) {
- window.Session.setNewSessionID(hexGeneratedPubKey);
- }
- }, [signUpMode, hexGeneratedPubKey]);
-
- if (signUpMode === SignUpMode.Default) {
- return (
- {
- setSignUpMode(SignUpMode.SessionIDShown);
- setRegistrationPhase(RegistrationPhase.SignUp);
- }}
- />
- );
- }
-
- if (signUpMode === SignUpMode.SessionIDShown) {
- return (
- {
- setSignUpMode(SignUpMode.EnterDetails);
- }}
- />
- );
- }
-
- // can only be the EnterDetails step
-
- // Display name is required
- const displayNameOK = !displayNameError && !!displayName;
-
- const enableCompleteSignUp = displayNameOK;
- const signUpWithDetails = async () => {
- await signUp({
- displayName,
- generatedRecoveryPhrase,
- });
- };
-
- return (
-
-
-
-
- {window.i18n('welcomeToYourSession')}
-
-
- {
- sanitizeDisplayNameOrToast(name, setDisplayName, setDisplayNameError);
- }}
- stealAutoFocus={true}
- />
-
-
-
- );
-};
diff --git a/ts/components/registration/TermsAndConditions.tsx b/ts/components/registration/TermsAndConditions.tsx
index 740355b774..0d2fb4d6f8 100644
--- a/ts/components/registration/TermsAndConditions.tsx
+++ b/ts/components/registration/TermsAndConditions.tsx
@@ -1,10 +1,30 @@
-import React from 'react';
+import { useDispatch } from 'react-redux';
+import styled from 'styled-components';
+import { updateTermsOfServicePrivacyModal } from '../../state/onboarding/ducks/modals';
import { SessionHtmlRenderer } from '../basic/SessionHTMLRenderer';
+const StyledTermsAndConditions = styled.div`
+ text-align: center;
+ font-size: 12px;
+
+ b {
+ font-weight: bold;
+ }
+
+ &:hover {
+ cursor: pointer;
+ }
+`;
+
export const TermsAndConditions = () => {
+ const dispatch = useDispatch();
+
return (
-
-
-
+ dispatch(updateTermsOfServicePrivacyModal({ show: true }))}
+ data-testid="open-url"
+ >
+
+
);
};
diff --git a/ts/components/registration/components/BackButton.tsx b/ts/components/registration/components/BackButton.tsx
new file mode 100644
index 0000000000..c5fed85733
--- /dev/null
+++ b/ts/components/registration/components/BackButton.tsx
@@ -0,0 +1,69 @@
+import { ReactNode } from 'react';
+import { useDispatch } from 'react-redux';
+import {
+ AccountRestoration,
+ Onboarding,
+ setAccountRestorationStep,
+ setDirection,
+ setOnboardingStep,
+} from '../../../state/onboarding/ducks/registration';
+import {
+ useOnboardAccountRestorationStep,
+ useOnboardStep,
+} from '../../../state/onboarding/selectors/registration';
+import { Flex } from '../../basic/Flex';
+import { SessionIconButton } from '../../icon';
+
+export const BackButtonWithinContainer = ({
+ children,
+ margin,
+ callback,
+}: {
+ children: ReactNode;
+ margin?: string;
+ callback?: () => void;
+}) => {
+ return (
+
+
+
+
+ {children}
+
+ );
+};
+
+export const BackButton = ({ callback }: { callback?: () => void }) => {
+ const step = useOnboardStep();
+ const restorationStep = useOnboardAccountRestorationStep();
+
+ const dispatch = useDispatch();
+
+ return (
+ {
+ dispatch(setDirection('backward'));
+ if (step === Onboarding.CreateAccount) {
+ dispatch(setOnboardingStep(Onboarding.Start));
+ }
+
+ if (step === Onboarding.RestoreAccount) {
+ if (restorationStep === AccountRestoration.RecoveryPassword) {
+ dispatch(setOnboardingStep(Onboarding.Start));
+ } else if (restorationStep === AccountRestoration.DisplayName) {
+ dispatch(setAccountRestorationStep(AccountRestoration.RecoveryPassword));
+ }
+ }
+
+ if (callback) {
+ callback();
+ }
+ }}
+ />
+ );
+};
diff --git a/ts/components/registration/components/Hero.tsx b/ts/components/registration/components/Hero.tsx
new file mode 100644
index 0000000000..3abcf7fb64
--- /dev/null
+++ b/ts/components/registration/components/Hero.tsx
@@ -0,0 +1,29 @@
+import styled from 'styled-components';
+
+const StyledHeroContainer = styled.div`
+ width: 40%;
+ height: 100%;
+
+ div {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ }
+`;
+
+const StyledHero = styled.img`
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ object-position: right center;
+`;
+
+export const Hero = () => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/ts/components/registration/components/OnboardingContainer.tsx b/ts/components/registration/components/OnboardingContainer.tsx
new file mode 100644
index 0000000000..3af3742d0a
--- /dev/null
+++ b/ts/components/registration/components/OnboardingContainer.tsx
@@ -0,0 +1,36 @@
+import { motion } from 'framer-motion';
+import { ReactNode } from 'react';
+import styled from 'styled-components';
+
+const OnboardContainerInner = styled(motion.div)`
+ width: 100%;
+`;
+
+const fadeSlideVariants = {
+ initial: { opacity: 0 },
+ animate: { opacity: 1 },
+ exit: { opacity: 0 },
+};
+
+type OnboardContainerProps = {
+ animate?: boolean;
+ children: ReactNode;
+ key: string;
+};
+
+export const OnboardContainer = (props: OnboardContainerProps) => {
+ const { animate = false, children, key } = props;
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/ts/components/registration/components/index.tsx b/ts/components/registration/components/index.tsx
new file mode 100644
index 0000000000..d9cdc114ad
--- /dev/null
+++ b/ts/components/registration/components/index.tsx
@@ -0,0 +1,18 @@
+import styled from 'styled-components';
+import { BackButton } from './BackButton';
+import { Hero } from './Hero';
+import { OnboardContainer } from './OnboardingContainer';
+
+const OnboardHeading = styled.h3`
+ padding: 0;
+ margin: 0;
+ font-size: var(--font-size-h2);
+`;
+
+const OnboardDescription = styled.p`
+ padding: 0;
+ margin: 0;
+ letter-spacing: normal;
+`;
+
+export { BackButton, Hero, OnboardContainer, OnboardDescription, OnboardHeading };
diff --git a/ts/components/registration/hooks/index.tsx b/ts/components/registration/hooks/index.tsx
new file mode 100644
index 0000000000..cbee953dd9
--- /dev/null
+++ b/ts/components/registration/hooks/index.tsx
@@ -0,0 +1,86 @@
+import { isEmpty } from 'lodash';
+import { useCallback, useEffect } from 'react';
+import { useDispatch } from 'react-redux';
+import { ONBOARDING_TIMES } from '../../../session/constants';
+import {
+ AccountRestoration,
+ setAccountRestorationStep,
+ setProgress,
+} from '../../../state/onboarding/ducks/registration';
+import {
+ useDisplayName,
+ useOnboardAccountRestorationStep,
+ useOnboardHexGeneratedPubKey,
+ useProgress,
+} from '../../../state/onboarding/selectors/registration';
+import { finishRestore } from '../stages/RestoreAccount';
+
+let interval: NodeJS.Timeout;
+
+/** Effect to handle the progress rate of the recovery loading animation */
+export const useRecoveryProgressEffect = () => {
+ const totalProgress = 100;
+
+ const step = useOnboardAccountRestorationStep();
+ const ourPubkey = useOnboardHexGeneratedPubKey();
+ const displayName = useDisplayName();
+ const progress = useProgress();
+ const dispatch = useDispatch();
+
+ const recoveryComplete = useCallback(async () => {
+ await finishRestore(ourPubkey, displayName);
+ }, [displayName, ourPubkey]);
+
+ useEffect(() => {
+ switch (step) {
+ case AccountRestoration.Loading:
+ interval = setInterval(() => {
+ if (progress < totalProgress) {
+ dispatch(setProgress(progress + 1));
+ }
+
+ if (progress >= totalProgress) {
+ clearInterval(interval);
+ // if we didn't get the display name in time, we need to enter it manually
+ dispatch(setAccountRestorationStep(AccountRestoration.DisplayName));
+ }
+ }, ONBOARDING_TIMES.RECOVERY_TIMEOUT / totalProgress);
+ break;
+ case AccountRestoration.Finishing:
+ interval = setInterval(() => {
+ if (progress < totalProgress) {
+ dispatch(setProgress(progress + 1));
+ }
+
+ if (progress >= totalProgress) {
+ clearInterval(interval);
+ dispatch(setAccountRestorationStep(AccountRestoration.Finished));
+ }
+ }, ONBOARDING_TIMES.RECOVERY_FINISHING / totalProgress);
+ break;
+ case AccountRestoration.Finished:
+ interval = setInterval(() => {
+ clearInterval(interval);
+ if (!isEmpty(displayName)) {
+ dispatch(setAccountRestorationStep(AccountRestoration.Complete));
+ } else {
+ // if we didn't get the display name in time, we need to enter it manually
+ dispatch(setAccountRestorationStep(AccountRestoration.DisplayName));
+ }
+ }, ONBOARDING_TIMES.RECOVERY_FINISHED);
+ break;
+ case AccountRestoration.Complete:
+ clearInterval(interval);
+ if (!isEmpty(ourPubkey) && !isEmpty(displayName)) {
+ void recoveryComplete();
+ } else {
+ window.log.debug(`[onboarding] restore account: We don't have a pubkey or display name`);
+ dispatch(setAccountRestorationStep(AccountRestoration.DisplayName));
+ }
+ break;
+ default:
+ }
+
+ return () => clearInterval(interval);
+ }, [dispatch, displayName, ourPubkey, progress, recoveryComplete, step]);
+};
diff --git a/ts/components/registration/stages/CreateAccount.tsx b/ts/components/registration/stages/CreateAccount.tsx
new file mode 100644
index 0000000000..2b9bc69921
--- /dev/null
+++ b/ts/components/registration/stages/CreateAccount.tsx
@@ -0,0 +1,155 @@
+import { isEmpty } from 'lodash';
+import { useDispatch } from 'react-redux';
+import { useMount } from 'react-use';
+import { SettingsKey } from '../../../data/settings-key';
+import { mnDecode } from '../../../session/crypto/mnemonic';
+import { StringUtils } from '../../../session/utils';
+import { fromHex } from '../../../session/utils/String';
+import { trigger } from '../../../shims/events';
+import {
+ AccountCreation,
+ setAccountCreationStep,
+ setDisplayName,
+ setDisplayNameError,
+ setHexGeneratedPubKey,
+ setRecoveryPassword,
+} from '../../../state/onboarding/ducks/registration';
+import {
+ useDisplayName,
+ useDisplayNameError,
+ useRecoveryPassword,
+} from '../../../state/onboarding/selectors/registration';
+import {
+ generateMnemonic,
+ registerSingleDevice,
+ sessionGenerateKeyPair,
+} from '../../../util/accountManager';
+import { Storage, setSignWithRecoveryPhrase } from '../../../util/storage';
+import { Flex } from '../../basic/Flex';
+import { SessionButton, SessionButtonColor } from '../../basic/SessionButton';
+import { SpacerLG, SpacerSM } from '../../basic/Text';
+import { SessionInput } from '../../inputs';
+import { resetRegistration } from '../RegistrationStages';
+import { OnboardDescription, OnboardHeading } from '../components';
+import { BackButtonWithinContainer } from '../components/BackButton';
+import { displayNameIsValid, sanitizeDisplayNameOrToast } from '../utils';
+
+export type AccountDetails = {
+ recoveryPassword: string;
+ displayName?: string;
+};
+
+async function signUp(signUpDetails: AccountDetails) {
+ const { displayName, recoveryPassword } = signUpDetails;
+
+ try {
+ const validDisplayName = displayNameIsValid(displayName);
+ await resetRegistration();
+ await registerSingleDevice(recoveryPassword, 'english', validDisplayName);
+ await Storage.put(SettingsKey.hasSyncedInitialConfigurationItem, Date.now());
+ await setSignWithRecoveryPhrase(false);
+ trigger('openInbox');
+ } catch (e) {
+ await resetRegistration();
+ throw e;
+ }
+}
+
+export const CreateAccount = () => {
+ const recoveryPassword = useRecoveryPassword();
+ const displayName = useDisplayName();
+ const displayNameError = useDisplayNameError();
+
+ const dispatch = useDispatch();
+
+ const generateMnemonicAndKeyPair = async () => {
+ if (recoveryPassword === '') {
+ const mnemonic = await generateMnemonic();
+
+ let seedHex = mnDecode(mnemonic);
+ // handle shorter than 32 bytes seeds
+ const privKeyHexLength = 32 * 2;
+ if (seedHex.length !== privKeyHexLength) {
+ seedHex = seedHex.concat('0'.repeat(32));
+ seedHex = seedHex.substring(0, privKeyHexLength);
+ }
+ const seed = fromHex(seedHex);
+ const keyPair = await sessionGenerateKeyPair(seed);
+ const newHexPubKey = StringUtils.decode(keyPair.pubKey, 'hex');
+
+ dispatch(setRecoveryPassword(mnemonic));
+ dispatch(setHexGeneratedPubKey(newHexPubKey)); // our 'frontend' account ID
+ }
+ };
+
+ useMount(() => {
+ void generateMnemonicAndKeyPair();
+ });
+
+ const signUpWithDetails = async () => {
+ if (isEmpty(displayName) || !isEmpty(displayNameError)) {
+ return;
+ }
+
+ try {
+ await signUp({
+ displayName,
+ recoveryPassword,
+ });
+
+ dispatch(setAccountCreationStep(AccountCreation.Done));
+ } catch (e) {
+ window.log.error(
+ `[onboarding] create account: signUpWithDetails failed! Error: ${e.message || e}`
+ );
+ dispatch(setAccountCreationStep(AccountCreation.DisplayName));
+ dispatch(setDisplayNameError(e.message || String(e)));
+ }
+ };
+
+ return (
+ {
+ dispatch(setDisplayName(''));
+ dispatch(setRecoveryPassword(''));
+ dispatch(setDisplayNameError(undefined));
+ }}
+ >
+
+ {window.i18n('displayNamePick')}
+
+ {window.i18n('displayNameDescription')}
+
+ {
+ const sanitizedName = sanitizeDisplayNameOrToast(name, setDisplayNameError, dispatch);
+ dispatch(setDisplayName(sanitizedName));
+ }}
+ onEnterPressed={signUpWithDetails}
+ error={displayNameError}
+ inputDataTestId="display-name-input"
+ />
+
+
+
+
+ );
+};
diff --git a/ts/components/registration/stages/RestoreAccount.tsx b/ts/components/registration/stages/RestoreAccount.tsx
new file mode 100644
index 0000000000..fa2a29e33b
--- /dev/null
+++ b/ts/components/registration/stages/RestoreAccount.tsx
@@ -0,0 +1,319 @@
+import { Dispatch } from '@reduxjs/toolkit';
+import { isEmpty } from 'lodash';
+import { useDispatch } from 'react-redux';
+import { ONBOARDING_TIMES } from '../../../session/constants';
+import { InvalidWordsError, NotEnoughWordsError } from '../../../session/crypto/mnemonic';
+import { PromiseUtils } from '../../../session/utils';
+import { TaskTimedOutError } from '../../../session/utils/Promise';
+import { NotFoundError } from '../../../session/utils/errors';
+import { trigger } from '../../../shims/events';
+import {
+ AccountRestoration,
+ setAccountRestorationStep,
+ setDisplayName,
+ setDisplayNameError,
+ setHexGeneratedPubKey,
+ setProgress,
+ setRecoveryPassword,
+ setRecoveryPasswordError,
+} from '../../../state/onboarding/ducks/registration';
+import {
+ useDisplayName,
+ useDisplayNameError,
+ useOnboardAccountRestorationStep,
+ useProgress,
+ useRecoveryPassword,
+ useRecoveryPasswordError,
+} from '../../../state/onboarding/selectors/registration';
+import {
+ registerSingleDevice,
+ registrationDone,
+ signInByLinkingDevice,
+} from '../../../util/accountManager';
+import { setSignInByLinking, setSignWithRecoveryPhrase } from '../../../util/storage';
+import { Flex } from '../../basic/Flex';
+import { SessionButton, SessionButtonColor } from '../../basic/SessionButton';
+import { SpacerLG, SpacerSM } from '../../basic/Text';
+import { SessionIcon } from '../../icon';
+import { SessionInput } from '../../inputs';
+import { SessionProgressBar } from '../../loading';
+import { resetRegistration } from '../RegistrationStages';
+import { OnboardDescription, OnboardHeading } from '../components';
+import { BackButtonWithinContainer } from '../components/BackButton';
+import { useRecoveryProgressEffect } from '../hooks';
+import { displayNameIsValid, sanitizeDisplayNameOrToast } from '../utils';
+import { AccountDetails } from './CreateAccount';
+
+type AccountRestoreDetails = AccountDetails & { dispatch: Dispatch; abortSignal?: AbortSignal };
+
+export async function finishRestore(pubkey: string, displayName: string) {
+ await setSignWithRecoveryPhrase(true);
+ await registrationDone(pubkey, displayName);
+
+ trigger('openInbox');
+}
+
+/**
+ * This will try to sign in with the user recovery password.
+ * If no ConfigurationMessage is received within ONBOARDING_RECOVERY_TIMEOUT, the user will be asked to enter a display name.
+ */
+async function signInAndFetchDisplayName({
+ recoveryPassword,
+ dispatch,
+ abortSignal,
+}: AccountRestoreDetails) {
+ try {
+ await resetRegistration();
+ const promiseLink = signInByLinkingDevice(recoveryPassword, 'english', abortSignal);
+ const promiseWait = PromiseUtils.waitForTask(done => {
+ window.Whisper.events.on(
+ 'configurationMessageReceived',
+ async (ourPubkey: string, displayName: string) => {
+ window.Whisper.events.off('configurationMessageReceived');
+ await setSignInByLinking(false);
+ dispatch(setHexGeneratedPubKey(ourPubkey));
+ dispatch(setDisplayName(displayName));
+ dispatch(setAccountRestorationStep(AccountRestoration.Finishing));
+ done(displayName);
+ }
+ );
+ }, ONBOARDING_TIMES.RECOVERY_TIMEOUT);
+
+ await Promise.all([promiseLink, promiseWait]);
+ } catch (e) {
+ await resetRegistration();
+ throw e;
+ }
+}
+
+/**
+ * Sign in/restore from seed.
+ * Ask for a display name, as we will drop incoming ConfigurationMessages if any are saved on the swarm.
+ * We will handle a ConfigurationMessage
+ */
+async function signInWithNewDisplayName({
+ displayName,
+ recoveryPassword,
+ dispatch,
+}: AccountRestoreDetails) {
+ try {
+ const validDisplayName = displayNameIsValid(displayName);
+
+ await resetRegistration();
+ await registerSingleDevice(
+ recoveryPassword,
+ 'english',
+ validDisplayName,
+ async (pubkey: string) => {
+ dispatch(setHexGeneratedPubKey(pubkey));
+ dispatch(setDisplayName(validDisplayName));
+ await finishRestore(pubkey, validDisplayName);
+ }
+ );
+ } catch (e) {
+ await resetRegistration();
+ throw e;
+ }
+}
+
+export const RestoreAccount = () => {
+ const step = useOnboardAccountRestorationStep();
+ const recoveryPassword = useRecoveryPassword();
+ const recoveryPasswordError = useRecoveryPasswordError();
+ const displayName = useDisplayName();
+ const displayNameError = useDisplayNameError();
+ const progress = useProgress();
+
+ const dispatch = useDispatch();
+
+ useRecoveryProgressEffect();
+
+ const recoverAndFetchDisplayName = async () => {
+ if (!(!!recoveryPassword && !recoveryPasswordError)) {
+ return;
+ }
+
+ const abortController = new AbortController();
+ try {
+ dispatch(setProgress(0));
+ dispatch(setAccountRestorationStep(AccountRestoration.Loading));
+ await signInAndFetchDisplayName({
+ recoveryPassword,
+ dispatch,
+ abortSignal: abortController.signal,
+ });
+ } catch (e) {
+ if (e instanceof NotFoundError || e instanceof TaskTimedOutError) {
+ // abort display name polling if we get either error
+ if (!abortController.signal.aborted) {
+ abortController.abort();
+ }
+ window.log.error(
+ `[onboarding] restore account: Failed to fetch a display name, so we will have to enter it manually. Error: ${e.message || e} `
+ );
+ return;
+ }
+
+ if (e instanceof NotEnoughWordsError) {
+ dispatch(setRecoveryPasswordError(window.i18n('recoveryPasswordErrorMessageShort')));
+ } else if (e instanceof InvalidWordsError) {
+ dispatch(setRecoveryPasswordError(window.i18n('recoveryPasswordErrorMessageIncorrect')));
+ } else {
+ dispatch(setRecoveryPasswordError(window.i18n('recoveryPasswordErrorMessageGeneric')));
+ }
+ dispatch(setAccountRestorationStep(AccountRestoration.RecoveryPassword));
+ }
+ };
+
+ const recoverAndEnterDisplayName = async () => {
+ if (
+ isEmpty(recoveryPassword) ||
+ !isEmpty(recoveryPasswordError) ||
+ isEmpty(displayName) ||
+ !isEmpty(displayNameError)
+ ) {
+ return;
+ }
+
+ try {
+ await signInWithNewDisplayName({
+ displayName,
+ recoveryPassword,
+ dispatch,
+ });
+ } catch (e) {
+ window.log.error(
+ `[onboarding] restore account: Failed with new display name! Error: ${e.message || e}`
+ );
+ dispatch(setAccountRestorationStep(AccountRestoration.DisplayName));
+ dispatch(setDisplayNameError(e.message || String(e)));
+ }
+ };
+
+ return (
+ <>
+ {step === AccountRestoration.RecoveryPassword || step === AccountRestoration.DisplayName ? (
+ {
+ dispatch(setRecoveryPassword(''));
+ dispatch(setDisplayName(''));
+ dispatch(setProgress(0));
+ dispatch(setRecoveryPasswordError(undefined));
+ dispatch(setDisplayNameError(undefined));
+ }}
+ >
+
+ {step === AccountRestoration.RecoveryPassword ? (
+ <>
+
+ {window.i18n('sessionRecoveryPassword')}
+
+
+
+ {window.i18n('onboardingRecoveryPassword')}
+
+ {
+ dispatch(setRecoveryPassword(seed));
+ dispatch(
+ setRecoveryPasswordError(
+ !seed ? window.i18n('recoveryPasswordEnter') : undefined
+ )
+ );
+ }}
+ onEnterPressed={recoverAndFetchDisplayName}
+ error={recoveryPasswordError}
+ enableShowHide={true}
+ inputDataTestId="recovery-phrase-input"
+ />
+
+
+ >
+ ) : (
+
+ {window.i18n('displayNameNew')}
+
+ {window.i18n('displayNameErrorNew')}
+
+ {
+ const sanitizedName = sanitizeDisplayNameOrToast(
+ name,
+ setDisplayNameError,
+ dispatch
+ );
+ dispatch(setDisplayName(sanitizedName));
+ }}
+ onEnterPressed={recoverAndEnterDisplayName}
+ error={displayNameError}
+ inputDataTestId="display-name-input"
+ />
+
+
+
+ )}
+
+
+ ) : (
+
+
+
+ )}
+ >
+ );
+};
diff --git a/ts/components/registration/stages/Start.tsx b/ts/components/registration/stages/Start.tsx
new file mode 100644
index 0000000000..b42c206e48
--- /dev/null
+++ b/ts/components/registration/stages/Start.tsx
@@ -0,0 +1,53 @@
+import { useDispatch } from 'react-redux';
+import { useMount } from 'react-use';
+import {
+ AccountCreation,
+ AccountRestoration,
+ Onboarding,
+ resetOnboardingState,
+ setAccountCreationStep,
+ setAccountRestorationStep,
+ setDirection,
+ setOnboardingStep,
+} from '../../../state/onboarding/ducks/registration';
+import { SessionButton, SessionButtonColor } from '../../basic/SessionButton';
+import { SpacerLG } from '../../basic/Text';
+import { resetRegistration } from '../RegistrationStages';
+import { TermsAndConditions } from '../TermsAndConditions';
+
+export const Start = () => {
+ const dispatch = useDispatch();
+
+ useMount(() => {
+ dispatch(resetOnboardingState());
+ void resetRegistration();
+ });
+
+ return (
+ <>
+ {
+ dispatch(setDirection('forward'));
+ dispatch(setAccountCreationStep(AccountCreation.DisplayName));
+ dispatch(setOnboardingStep(Onboarding.CreateAccount));
+ }}
+ text={window.i18n('onboardingAccountCreate')}
+ dataTestId="create-account-button"
+ />
+
+ {
+ dispatch(setDirection('forward'));
+ dispatch(setOnboardingStep(Onboarding.RestoreAccount));
+ dispatch(setAccountRestorationStep(AccountRestoration.RecoveryPassword));
+ }}
+ text={window.i18n('onboardingAccountExists')}
+ dataTestId="existing-account-button"
+ />
+
+
+ >
+ );
+};
diff --git a/ts/components/registration/stages/index.tsx b/ts/components/registration/stages/index.tsx
new file mode 100644
index 0000000000..5900dacb55
--- /dev/null
+++ b/ts/components/registration/stages/index.tsx
@@ -0,0 +1,5 @@
+import { CreateAccount } from './CreateAccount';
+import { RestoreAccount } from './RestoreAccount';
+import { Start } from './Start';
+
+export { CreateAccount, RestoreAccount, Start };
diff --git a/ts/components/registration/utils/index.tsx b/ts/components/registration/utils/index.tsx
new file mode 100644
index 0000000000..49ad75e57d
--- /dev/null
+++ b/ts/components/registration/utils/index.tsx
@@ -0,0 +1,36 @@
+import { AnyAction, Dispatch } from '@reduxjs/toolkit';
+import { sanitizeSessionUsername } from '../../../session/utils/String';
+
+export function sanitizeDisplayNameOrToast(
+ displayName: string,
+ setDisplayNameError: (error: string | undefined) => AnyAction,
+ dispatch: Dispatch
+) {
+ try {
+ const sanitizedName = sanitizeSessionUsername(displayName);
+ const trimName = sanitizedName.trim();
+ dispatch(setDisplayNameError(!trimName ? window.i18n('displayNameEmpty') : undefined));
+ return sanitizedName;
+ } catch (e) {
+ dispatch(setDisplayNameError(window.i18n('displayNameErrorDescriptionShorter')));
+ return displayName;
+ }
+}
+
+/**
+ * Returns undefined if an error happened, or the trim userName.
+ *
+ * Be sure to use the trimmed userName for creating the account.
+ */
+export const displayNameIsValid = (displayName?: string): string => {
+ if (!displayName) {
+ throw new Error(window.i18n('displayNameEmpty'));
+ }
+
+ const trimName = displayName.trim();
+ if (!trimName) {
+ throw new Error(window.i18n('displayNameEmpty'));
+ }
+
+ return trimName;
+};
diff --git a/ts/components/search/MessageSearchResults.tsx b/ts/components/search/MessageSearchResults.tsx
index e452d194c3..eb67b04d38 100644
--- a/ts/components/search/MessageSearchResults.tsx
+++ b/ts/components/search/MessageSearchResults.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled, { CSSProperties } from 'styled-components';
import { useConversationUsername, useIsPrivate } from '../../hooks/useParamSelector';
diff --git a/ts/components/search/SearchResults.tsx b/ts/components/search/SearchResults.tsx
index f9b151b917..7597c1307c 100644
--- a/ts/components/search/SearchResults.tsx
+++ b/ts/components/search/SearchResults.tsx
@@ -1,5 +1,4 @@
import { isString } from 'lodash';
-import React from 'react';
import { useSelector } from 'react-redux';
import { AutoSizer, List } from 'react-virtualized';
import styled, { CSSProperties } from 'styled-components';
diff --git a/ts/components/settings/BlockedList.tsx b/ts/components/settings/BlockedList.tsx
index 10b622b53a..d23b6ab377 100644
--- a/ts/components/settings/BlockedList.tsx
+++ b/ts/components/settings/BlockedList.tsx
@@ -1,14 +1,14 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import useUpdate from 'react-use/lib/useUpdate';
import styled from 'styled-components';
import { useSet } from '../../hooks/useSet';
import { ToastUtils } from '../../session/utils';
import { BlockedNumberController } from '../../util';
+import { MemberListItem } from '../MemberListItem';
import { SessionButton, SessionButtonColor } from '../basic/SessionButton';
import { SpacerLG } from '../basic/Text';
import { SessionIconButton } from '../icon';
-import { MemberListItem } from '../MemberListItem';
import { SettingsTitleAndDescription } from './SessionSettingListItem';
const BlockedEntriesContainer = styled.div`
diff --git a/ts/components/settings/SessionNotificationGroupSettings.tsx b/ts/components/settings/SessionNotificationGroupSettings.tsx
index 73dec2535f..f9088760ec 100644
--- a/ts/components/settings/SessionNotificationGroupSettings.tsx
+++ b/ts/components/settings/SessionNotificationGroupSettings.tsx
@@ -1,5 +1,4 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
-import React from 'react';
import useUpdate from 'react-use/lib/useUpdate';
import styled from 'styled-components';
diff --git a/ts/components/settings/SessionSettingListItem.tsx b/ts/components/settings/SessionSettingListItem.tsx
index c2b111b231..b7af229375 100644
--- a/ts/components/settings/SessionSettingListItem.tsx
+++ b/ts/components/settings/SessionSettingListItem.tsx
@@ -1,6 +1,6 @@
-import React from 'react';
import styled from 'styled-components';
+import { ReactNode } from 'react';
import {
SessionButton,
SessionButtonColor,
@@ -75,7 +75,7 @@ const StyledSettingItemClickable = styled(StyledSettingItemInline)`
export const SettingsTitleAndDescription = (props: {
title?: string;
description?: string;
- childrenDescription?: React.ReactNode;
+ childrenDescription?: ReactNode;
}) => {
const { description, childrenDescription, title } = props;
return (
@@ -95,8 +95,8 @@ export const SessionSettingsItemWrapper = (props: {
inline: boolean;
title?: string;
description?: string;
- children?: React.ReactNode;
- childrenDescription?: React.ReactNode;
+ children?: ReactNode;
+ childrenDescription?: ReactNode;
}) => {
const { inline, children, description, title, childrenDescription } = props;
const ComponentToRender = inline ? StyledSettingItemInline : StyledSettingItem;
@@ -128,7 +128,7 @@ export const SessionToggleWithDescription = (props: {
active: boolean;
onClickToggle: () => void;
confirmationDialogParams?: SessionConfirmDialogProps;
- childrenDescription?: React.ReactNode; // if set, those elements will be appended next to description field (only used for typing message settings as of now)
+ childrenDescription?: ReactNode; // if set, those elements will be appended next to description field (only used for typing message settings as of now)
dataTestId?: string;
}) => {
const {
diff --git a/ts/components/settings/SessionSettings.tsx b/ts/components/settings/SessionSettings.tsx
index 8c67da1a65..9899e88dbe 100644
--- a/ts/components/settings/SessionSettings.tsx
+++ b/ts/components/settings/SessionSettings.tsx
@@ -1,5 +1,5 @@
import { shell } from 'electron';
-import React, { useState } from 'react';
+import { useState } from 'react';
import styled from 'styled-components';
import { useDispatch } from 'react-redux';
@@ -13,12 +13,12 @@ import { SessionNotificationGroupSettings } from './SessionNotificationGroupSett
import { Data } from '../../data/data';
import { sessionPassword } from '../../state/ducks/modalDialog';
import { SectionType, showLeftPaneSection } from '../../state/ducks/section';
+import type { PasswordAction, SessionSettingCategory } from '../../types/ReduxTypes';
import { SettingsCategoryAppearance } from './section/CategoryAppearance';
import { CategoryConversations } from './section/CategoryConversations';
import { SettingsCategoryHelp } from './section/CategoryHelp';
import { SettingsCategoryPermissions } from './section/CategoryPermissions';
import { SettingsCategoryPrivacy } from './section/CategoryPrivacy';
-import type { SessionSettingCategory, PasswordAction } from '../../types/ReduxTypes';
export function displayPasswordModal(
passwordAction: PasswordAction,
@@ -119,7 +119,7 @@ const SettingInCategory = (props: {
// these three down there have no options, they are just a button
case 'clearData':
case 'messageRequests':
- case 'recoveryPhrase':
+ case 'recoveryPassword':
default:
return null;
}
diff --git a/ts/components/settings/SessionSettingsHeader.tsx b/ts/components/settings/SessionSettingsHeader.tsx
index f2ed4646f9..471c146938 100644
--- a/ts/components/settings/SessionSettingsHeader.tsx
+++ b/ts/components/settings/SessionSettingsHeader.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import styled from 'styled-components';
import { assertUnreachable } from '../../types/sqlSharedTypes';
import { SettingsViewProps } from './SessionSettings';
@@ -46,7 +45,7 @@ export const SettingsHeader = (props: Props) => {
break;
case 'clearData':
case 'messageRequests':
- case 'recoveryPhrase':
+ case 'recoveryPassword':
throw new Error(`no header for should be tried to be rendered for "${category}"`);
default:
diff --git a/ts/components/settings/SettingsThemeSwitcher.tsx b/ts/components/settings/SettingsThemeSwitcher.tsx
index ac2ea11b22..fb1e7d0bc4 100644
--- a/ts/components/settings/SettingsThemeSwitcher.tsx
+++ b/ts/components/settings/SettingsThemeSwitcher.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { getPrimaryColor } from '../../state/selectors/primaryColor';
diff --git a/ts/components/settings/ZoomingSessionSlider.tsx b/ts/components/settings/ZoomingSessionSlider.tsx
index cab3ab269d..03b93ffe3b 100644
--- a/ts/components/settings/ZoomingSessionSlider.tsx
+++ b/ts/components/settings/ZoomingSessionSlider.tsx
@@ -1,5 +1,5 @@
import Slider from 'rc-slider';
-import React from 'react';
+
import { isNumber } from 'lodash';
import useUpdate from 'react-use/lib/useUpdate';
diff --git a/ts/components/settings/section/CategoryAppearance.tsx b/ts/components/settings/section/CategoryAppearance.tsx
index 343c465a48..8d565a4a22 100644
--- a/ts/components/settings/section/CategoryAppearance.tsx
+++ b/ts/components/settings/section/CategoryAppearance.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import useUpdate from 'react-use/lib/useUpdate';
import { SettingsKey } from '../../../data/settings-key';
import { useHasFollowSystemThemeEnabled } from '../../../state/selectors/settings';
diff --git a/ts/components/settings/section/CategoryConversations.tsx b/ts/components/settings/section/CategoryConversations.tsx
index 4fd0a20741..ffe8b000d6 100644
--- a/ts/components/settings/section/CategoryConversations.tsx
+++ b/ts/components/settings/section/CategoryConversations.tsx
@@ -1,10 +1,10 @@
-import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import useUpdate from 'react-use/lib/useUpdate';
import { SettingsKey } from '../../../data/settings-key';
import { ToastUtils } from '../../../session/utils';
import { toggleAudioAutoplay } from '../../../state/ducks/userConfig';
+import { useHasEnterSendEnabled } from '../../../state/selectors/settings';
import { getAudioAutoplay } from '../../../state/selectors/userConfig';
import { SessionRadioGroup } from '../../basic/SessionRadioGroup';
import { BlockedContactsList } from '../BlockedList';
@@ -12,7 +12,6 @@ import {
SessionSettingsItemWrapper,
SessionToggleWithDescription,
} from '../SessionSettingListItem';
-import { useHasEnterSendEnabled } from '../../../state/selectors/settings';
async function toggleCommunitiesPruning() {
try {
diff --git a/ts/components/settings/section/CategoryHelp.tsx b/ts/components/settings/section/CategoryHelp.tsx
index 9dfee2debc..efd82673dc 100644
--- a/ts/components/settings/section/CategoryHelp.tsx
+++ b/ts/components/settings/section/CategoryHelp.tsx
@@ -1,5 +1,5 @@
import { ipcRenderer, shell } from 'electron';
-import React from 'react';
+
import { SessionButtonShape, SessionButtonType } from '../../basic/SessionButton';
import { SessionSettingButtonItem, SessionSettingsTitleWithLink } from '../SessionSettingListItem';
diff --git a/ts/components/settings/section/CategoryPermissions.tsx b/ts/components/settings/section/CategoryPermissions.tsx
index 4473742ce9..2b70ca37cb 100644
--- a/ts/components/settings/section/CategoryPermissions.tsx
+++ b/ts/components/settings/section/CategoryPermissions.tsx
@@ -1,5 +1,4 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
-import React from 'react';
import useUpdate from 'react-use/lib/useUpdate';
import { SettingsKey } from '../../../data/settings-key';
diff --git a/ts/components/settings/section/CategoryPrivacy.tsx b/ts/components/settings/section/CategoryPrivacy.tsx
index 4c48f54267..1e54cdea4d 100644
--- a/ts/components/settings/section/CategoryPrivacy.tsx
+++ b/ts/components/settings/section/CategoryPrivacy.tsx
@@ -1,5 +1,4 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
-import React from 'react';
import useUpdate from 'react-use/lib/useUpdate';
import { SettingsKey } from '../../../data/settings-key';
@@ -110,7 +109,7 @@ export const SettingsCategoryPrivacy = (props: {
{!props.hasPassword ? (
{
displayPasswordModal('set', props.onPasswordUpdated);
diff --git a/ts/contexts/ConvoIdContext.tsx b/ts/contexts/ConvoIdContext.tsx
index 685460f630..638fe8c3d8 100644
--- a/ts/contexts/ConvoIdContext.tsx
+++ b/ts/contexts/ConvoIdContext.tsx
@@ -1,10 +1,10 @@
-import React, { useContext } from 'react';
+import { createContext, useContext } from 'react';
/**
* This React context is used to share deeply in the tree of the ConversationListItem what is the ID we are currently rendering.
* This is to avoid passing the prop to all the subtree component
*/
-const ContextConversationId = React.createContext('');
+const ContextConversationId = createContext('');
export const ContextConversationProvider = ContextConversationId.Provider;
diff --git a/ts/hooks/useFocusMount.ts b/ts/hooks/useFocusMount.ts
index 8bd2575017..6a5418fce8 100644
--- a/ts/hooks/useFocusMount.ts
+++ b/ts/hooks/useFocusMount.ts
@@ -1,8 +1,7 @@
-import React from 'react';
-
+import { RefObject } from 'react';
import useMount from 'react-use/lib/useMount';
-export function useFocusMount(ref: React.RefObject, isEditable?: boolean) {
+export function useFocusMount(ref: RefObject, isEditable?: boolean) {
useMount(() => {
if (isEditable) {
ref?.current?.focus();
diff --git a/ts/hooks/useModulo.ts b/ts/hooks/useModulo.ts
index f681c317e8..7f57fb844a 100644
--- a/ts/hooks/useModulo.ts
+++ b/ts/hooks/useModulo.ts
@@ -1,9 +1,8 @@
-import React from 'react';
-
+import { useState } from 'react';
import useInterval from 'react-use/lib/useInterval';
export function useModulo(loopBackAt: number, delay: number) {
- const [count, setCount] = React.useState(0);
+ const [count, setCount] = useState(0);
useInterval(() => {
if (count >= loopBackAt) {
diff --git a/ts/mains/about_start.tsx b/ts/mains/about_start.tsx
index fec0529f5d..2370c8bc07 100644
--- a/ts/mains/about_start.tsx
+++ b/ts/mains/about_start.tsx
@@ -1,6 +1,6 @@
-// const $body = $(document.body);
-
-import React from 'react';
+import { createRoot } from 'react-dom/client';
import { AboutView } from '../components/AboutView';
-window.ReactDOM.render( , document.getElementById('root'));
+const container = document.getElementById('root');
+const root = createRoot(container!);
+root.render( );
diff --git a/ts/mains/debug_log_start.tsx b/ts/mains/debug_log_start.tsx
index 26edbfc3bd..235a9b36a3 100644
--- a/ts/mains/debug_log_start.tsx
+++ b/ts/mains/debug_log_start.tsx
@@ -1,4 +1,6 @@
-import React from 'react';
+import { createRoot } from 'react-dom/client';
import { DebugLogView } from '../components/DebugLogView';
-window.ReactDOM.render( , document.getElementById('root'));
+const container = document.getElementById('root');
+const root = createRoot(container!);
+root.render( );
diff --git a/ts/mains/main_renderer.tsx b/ts/mains/main_renderer.tsx
index cbb1fcd25d..6a46e3341a 100644
--- a/ts/mains/main_renderer.tsx
+++ b/ts/mains/main_renderer.tsx
@@ -1,11 +1,10 @@
import Backbone from 'backbone';
import _ from 'lodash';
-import ReactDOM from 'react-dom';
+import { createRoot } from 'react-dom/client';
import nativeEmojiData from '@emoji-mart/data';
import { ipcRenderer } from 'electron';
// eslint-disable-next-line import/no-named-default
-import { default as React } from 'react';
import { isMacOS } from '../OS';
import { SessionInboxView } from '../components/SessionInboxView';
@@ -285,11 +284,9 @@ async function start() {
window.log.info('Cleanup: complete');
window.log.info('listening for registration events');
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
- WhisperEvents.on('registration_done', async () => {
- window.log.info('handling registration event');
-
- await connect();
+ WhisperEvents.on('registration_done', () => {
+ window.log.info('[onboarding] handling registration event');
+ void connect();
});
function switchBodyToRtlIfNeeded() {
@@ -310,14 +307,19 @@ async function start() {
void getConversationController()
.loadPromise()
?.then(() => {
- ReactDOM.render( , document.getElementById('root'));
+ const container = document.getElementById('root');
+ const root = createRoot(container!);
+ root.render( );
});
}
function showRegistrationView() {
- ReactDOM.render( , document.getElementById('root'));
+ const container = document.getElementById('root');
+ const root = createRoot(container!);
+ root.render( );
switchBodyToRtlIfNeeded();
}
+
DisappearingMessages.initExpiringMessageListener();
if (Registration.isDone() && !isSignInByLinking()) {
@@ -404,7 +406,10 @@ async function start() {
window.showWindow();
if (conversationKey) {
// do not put the messageId here so the conversation is loaded on the last unread instead
- await window.openConversationWithMessages({ conversationKey, messageId: null });
+ await window.openConversationWithMessages({
+ conversationKey,
+ messageId: null,
+ });
} else {
openInbox();
}
@@ -506,90 +511,3 @@ function onEmpty() {
Notifications.enable();
}
-
-class TextScramble {
- private frame: any;
- private queue: any;
- private readonly el: any;
- private readonly chars: any;
- private resolve: any;
- private frameRequest: any;
-
- constructor(el: any) {
- this.el = el;
- this.chars = '0123456789abcdef';
- this.update = this.update.bind(this);
- }
-
- public async setText(newText: string) {
- const oldText = this.el.value;
- const length = Math.max(oldText.length, newText.length);
- // eslint-disable-next-line no-return-assign, no-promise-executor-return
- const promise = new Promise(resolve => (this.resolve = resolve));
- this.queue = [];
-
- for (let i = 0; i < length; i++) {
- const from = oldText[i] || '';
- const to = newText[i] || '';
- const startNumber = Math.floor(Math.random() * 40);
- const end = startNumber + Math.floor(Math.random() * 40);
- this.queue.push({
- from,
- to,
- start: startNumber,
- end,
- });
- }
-
- cancelAnimationFrame(this.frameRequest);
- this.frame = 0;
- this.update();
- return promise;
- }
-
- public update() {
- let output = '';
- let complete = 0;
-
- for (let i = 0, n = this.queue.length; i < n; i++) {
- const { from, to, start: startNumber, end } = this.queue[i];
- let { char } = this.queue[i];
-
- if (this.frame >= end) {
- complete++;
- output += to;
- } else if (this.frame >= startNumber) {
- if (!char || Math.random() < 0.28) {
- char = this.randomChar();
- this.queue[i].char = char;
- }
- output += char;
- } else {
- output += from;
- }
- }
-
- this.el.value = output;
-
- if (complete === this.queue.length) {
- this.resolve();
- } else {
- this.frameRequest = requestAnimationFrame(this.update);
- this.frame++;
- }
- }
-
- public randomChar() {
- return this.chars[Math.floor(Math.random() * this.chars.length)];
- }
-}
-window.Session = window.Session || {};
-
-window.Session.setNewSessionID = (sessionID: string) => {
- const el = document.querySelector('.session-id-editable-textarea');
- const fx = new TextScramble(el);
- if (el) {
- (el as any).value = sessionID;
- }
- void fx.setText(sessionID);
-};
diff --git a/ts/mains/password_start.tsx b/ts/mains/password_start.tsx
index b6a65176d6..55ac6c155c 100644
--- a/ts/mains/password_start.tsx
+++ b/ts/mains/password_start.tsx
@@ -1,6 +1,6 @@
-// const $body = $(document.body);
-
-import React from 'react';
+import { createRoot } from 'react-dom/client';
import { SessionPasswordPrompt } from '../components/SessionPasswordPrompt';
-window.ReactDOM.render( , document.getElementById('root'));
+const container = document.getElementById('root');
+const root = createRoot(container!);
+root.render( );
diff --git a/ts/receiver/configMessage.ts b/ts/receiver/configMessage.ts
index f1fbcca327..fc5b3b5e2a 100644
--- a/ts/receiver/configMessage.ts
+++ b/ts/receiver/configMessage.ts
@@ -35,12 +35,7 @@ import { assertUnreachable } from '../types/sqlSharedTypes';
import { BlockedNumberController } from '../util';
import { Registration } from '../util/registration';
import { ReleasedFeatures } from '../util/releaseFeature';
-import {
- Storage,
- getLastProfileUpdateTimestamp,
- isSignInByLinking,
- setLastProfileUpdateTimestamp,
-} from '../util/storage';
+import { Storage, isSignInByLinking, setLastProfileUpdateTimestamp } from '../util/storage';
// eslint-disable-next-line import/no-unresolved
import { ConfigWrapperObjectTypes } from '../webworker/workers/browser/libsession_worker_functions';
@@ -858,6 +853,7 @@ async function processMergingResults(results: Map latestProfileUpdateTimestamp) {
- window?.log?.info(
- `Handling our profileUdpate ourLastUpdate:${latestProfileUpdateTimestamp}, envelope sent at: ${sentAt}`
- );
- const { profileKey, profilePicture, displayName } = configMessage;
-
- await updateOurProfileLegacyOrViaLibSession({
- sentAt: toNumber(sentAt),
- displayName,
- profileUrl: profilePicture,
- profileKey,
- priority: null, // passing null to say do not set the priority, as we do not get one from the legacy config message
- });
- }
-}
-
async function handleGroupsAndContactsFromConfigMessageLegacy(
envelope: EnvelopePlus,
configMessage: SignalService.ConfigurationMessage
@@ -1139,7 +1110,6 @@ async function handleConfigurationMessageLegacy(
return;
}
- await handleOurProfileUpdateLegacy(envelope.timestamp, configurationMessage);
await handleGroupsAndContactsFromConfigMessageLegacy(envelope, configurationMessage);
await removeFromCache(envelope);
}
diff --git a/ts/receiver/queuedJob.ts b/ts/receiver/queuedJob.ts
index c730bd85ae..b4b4c79807 100644
--- a/ts/receiver/queuedJob.ts
+++ b/ts/receiver/queuedJob.ts
@@ -102,9 +102,9 @@ async function copyFromQuotedMessage(
: quotedMessage.propsForMessage.text) || '';
if (isMessageModel(quotedMessage)) {
- window.inboxStore.dispatch(pushQuotedMessageDetails(quotedMessage.getMessageModelProps()));
+ window.inboxStore?.dispatch(pushQuotedMessageDetails(quotedMessage.getMessageModelProps()));
} else {
- window.inboxStore.dispatch(pushQuotedMessageDetails(quotedMessage));
+ window.inboxStore?.dispatch(pushQuotedMessageDetails(quotedMessage));
}
// no attachments, just save the quote with the body
diff --git a/ts/session/apis/open_group_api/sogsv3/knownBlindedkeys.ts b/ts/session/apis/open_group_api/sogsv3/knownBlindedkeys.ts
index e569eb40b5..491adb440e 100644
--- a/ts/session/apis/open_group_api/sogsv3/knownBlindedkeys.ts
+++ b/ts/session/apis/open_group_api/sogsv3/knownBlindedkeys.ts
@@ -1,20 +1,20 @@
-import { from_hex, to_hex } from 'libsodium-wrappers-sumo';
import { crypto_sign_curve25519_pk_to_ed25519 } from 'curve25519-js';
+import { from_hex, to_hex } from 'libsodium-wrappers-sumo';
import { cloneDeep, flatten, isEmpty, isEqual, isString, uniqBy } from 'lodash';
-import { getConversationController } from '../../../conversations';
-import { LibSodiumWrappers } from '../../../crypto';
-import { KeyPrefixType, PubKey } from '../../../types';
import { Data } from '../../../../data/data';
-import { combineKeys, generateBlindingFactor } from '../../../utils/SodiumUtils';
import { OpenGroupData } from '../../../../data/opengroups';
-import { ConversationModel } from '../../../../models/conversation';
-import { UserUtils } from '../../../utils';
-import { SogsBlinding } from './sogsBlinding';
-import { fromHexToArray } from '../../../utils/String';
import { KNOWN_BLINDED_KEYS_ITEM } from '../../../../data/settings-key';
+import { ConversationModel } from '../../../../models/conversation';
import { roomHasBlindEnabled } from '../../../../types/sqlSharedTypes';
import { Storage } from '../../../../util/storage';
+import { getConversationController } from '../../../conversations';
+import { LibSodiumWrappers } from '../../../crypto';
+import { KeyPrefixType, PubKey } from '../../../types';
+import { UserUtils } from '../../../utils';
+import { combineKeys, generateBlindingFactor } from '../../../utils/SodiumUtils';
+import { fromHexToArray } from '../../../utils/String';
+import { SogsBlinding } from './sogsBlinding';
export type BlindedIdMapping = {
blindedId: string;
@@ -157,7 +157,7 @@ export function tryMatchBlindWithStandardKey(
const blindedIdNoPrefix = PubKey.removePrefixIfNeeded(PubKey.cast(blindedSessionId).key);
const kBytes = generateBlindingFactor(serverPubKey, sodium);
- // From the session id (ignoring 05 prefix) we have two possible ed25519 pubkeys; the first is
+ // From the account id (ignoring 05 prefix) we have two possible ed25519 pubkeys; the first is
// the positive(which is what Signal's XEd25519 conversion always uses)
const inbin = from_hex(sessionIdNoPrefix);
diff --git a/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts b/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts
index 9a2edf3816..ff7eeebf80 100644
--- a/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts
+++ b/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts
@@ -267,7 +267,7 @@ const handleMessagesResponseV4 = async (
);
const roomDetails: OpenGroupRequestCommonType = pick(roomInfos, 'serverUrl', 'roomId');
- // then we try to find matching real session ids with the blinded ids we have.
+ // then we try to find matching real account ids with the blinded ids we have.
// this is where we override the blindedId with the real one in case we already know that user real sessionId
const messagesWithResolvedBlindedIdsIfFound = [];
diff --git a/ts/session/apis/snode_api/onsResolve.ts b/ts/session/apis/snode_api/onsResolve.ts
index a0a27d0a10..c7555266e1 100644
--- a/ts/session/apis/snode_api/onsResolve.ts
+++ b/ts/session/apis/snode_api/onsResolve.ts
@@ -103,7 +103,7 @@ async function getSessionIDForOnsName(onsNameCase: string) {
throw new Error('ONSresolve: Validation failed');
}
- // assert all the returned session ids are the same
+ // assert all the returned account ids are the same
if (_.uniq(allResolvedSessionIds).length !== 1) {
throw new Error('ONSresolve: Validation failed');
}
diff --git a/ts/session/apis/snode_api/retrieveRequest.ts b/ts/session/apis/snode_api/retrieveRequest.ts
index 50d94eadac..b70b8309bb 100644
--- a/ts/session/apis/snode_api/retrieveRequest.ts
+++ b/ts/session/apis/snode_api/retrieveRequest.ts
@@ -112,7 +112,7 @@ async function retrieveNextMessages(
configHashesToBump: Array | null
): Promise {
if (namespaces.length !== lastHashes.length) {
- throw new Error('namespaces and lasthashes does not match');
+ throw new Error('namespaces and last hashes do not match');
}
const retrieveRequestsParams = await buildRetrieveRequest(
@@ -131,33 +131,33 @@ async function retrieveNextMessages(
// just to make sure that we don't hang for more than timeOutMs
const results = await Promise.race([timeoutPromise(), fetchPromise()]);
- if (!results || !isArray(results) || !results.length) {
- window?.log?.warn(
- `_retrieveNextMessages - sessionRpc could not talk to ${targetNode.ip}:${targetNode.port}`
- );
- throw new Error(
- `_retrieveNextMessages - sessionRpc could not talk to ${targetNode.ip}:${targetNode.port}`
- );
- }
+ try {
+ if (!results || !isArray(results) || !results.length) {
+ window?.log?.warn(
+ `_retrieveNextMessages - sessionRpc could not talk to ${targetNode.ip}:${targetNode.port}`
+ );
+ throw new Error(
+ `_retrieveNextMessages - sessionRpc could not talk to ${targetNode.ip}:${targetNode.port}`
+ );
+ }
- // the +1 is to take care of the extra `expire` method added once user config is released
- if (results.length !== namespaces.length && results.length !== namespaces.length + 1) {
- throw new Error(
- `We asked for updates about ${namespaces.length} messages but got results of length ${results.length}`
- );
- }
+ // the +1 is to take care of the extra `expire` method added once user config is released
+ if (results.length !== namespaces.length && results.length !== namespaces.length + 1) {
+ throw new Error(
+ `We asked for updates about ${namespaces.length} messages but got results of length ${results.length}`
+ );
+ }
- // do a basic check to know if we have something kind of looking right (status 200 should always be there for a retrieve)
- const firstResult = results[0];
+ // do a basic check to know if we have something kind of looking right (status 200 should always be there for a retrieve)
+ const firstResult = results[0];
- if (firstResult.code !== 200) {
- window?.log?.warn(`retrieveNextMessages result is not 200 but ${firstResult.code}`);
- throw new Error(
- `_retrieveNextMessages - retrieve result is not 200 with ${targetNode.ip}:${targetNode.port} but ${firstResult.code}`
- );
- }
+ if (firstResult.code !== 200) {
+ window?.log?.warn(`_retrieveNextMessages result is not 200 but ${firstResult.code}`);
+ throw new Error(
+ `_retrieveNextMessages - retrieve result is not 200 with ${targetNode.ip}:${targetNode.port} but ${firstResult.code}`
+ );
+ }
- try {
// we rely on the code of the first one to check for online status
const bodyFirstResult = firstResult.body;
if (!window.inboxStore?.getState().onionPaths.isOnline) {
diff --git a/ts/session/apis/snode_api/swarmPolling.ts b/ts/session/apis/snode_api/swarmPolling.ts
index cedebc9378..910a6e9130 100644
--- a/ts/session/apis/snode_api/swarmPolling.ts
+++ b/ts/session/apis/snode_api/swarmPolling.ts
@@ -1,7 +1,7 @@
/* eslint-disable no-await-in-loop */
/* eslint-disable more/no-then */
/* eslint-disable @typescript-eslint/no-misused-promises */
-import { compact, concat, flatten, last, sample, toNumber, uniqBy } from 'lodash';
+import { compact, concat, flatten, isEmpty, last, sample, toNumber, uniqBy } from 'lodash';
import { Data, Snode } from '../../../data/data';
import { SignalService } from '../../../protobuf';
import * as Receiver from '../../../receiver/receiver';
@@ -17,17 +17,19 @@ import { updateIsOnline } from '../../../state/ducks/onion';
import { ReleasedFeatures } from '../../../util/releaseFeature';
import {
GenericWrapperActions,
+ UserConfigWrapperActions,
UserGroupsWrapperActions,
} from '../../../webworker/workers/browser/libsession_worker_interface';
import { DURATION, SWARM_POLLING_TIMEOUT } from '../../constants';
import { getConversationController } from '../../conversations';
import { IncomingMessage } from '../../messages/incoming/IncomingMessage';
import { StringUtils, UserUtils } from '../../utils';
+import { ed25519Str } from '../../utils/String';
+import { NotFoundError } from '../../utils/errors';
import { LibSessionUtil } from '../../utils/libsession/libsession_utils';
import { SnodeNamespace, SnodeNamespaces } from './namespaces';
import { SnodeAPIRetrieve } from './retrieveRequest';
import { RetrieveMessageItem, RetrieveMessagesResultsBatched } from './types';
-import { ed25519Str } from '../../utils/String';
export function extractWebSocketContent(
message: string,
@@ -101,13 +103,11 @@ export class SwarmPolling {
this.hasStarted = false;
}
- // TODO[epic=ses-50] this is a temporary solution until onboarding is merged
- public stop(e: Error) {
- window.log.error(`[swarmPolling] stopped polling due to error: ${e.message || e}`);
+ public stop(e?: Error) {
+ window.log.info('[swarmPolling] stopped swarm polling', e?.message || e || '');
for (let i = 0; i < timeouts.length; i++) {
clearTimeout(timeouts[i]);
- window.log.debug(`[swarmPolling] cleared timeout ${timeouts[i]} `);
}
this.resetSwarmPolling();
}
@@ -365,7 +365,10 @@ export class SwarmPolling {
}
}
- private async handleSharedConfigMessages(userConfigMessagesMerged: Array) {
+ private async handleSharedConfigMessages(
+ userConfigMessagesMerged: Array,
+ returnDisplayNameOnly?: boolean
+ ): Promise {
const extractedUserConfigMessage = compact(
userConfigMessagesMerged.map((m: RetrieveMessageItem) => {
return extractWebSocketContent(m.data, m.hash);
@@ -410,6 +413,42 @@ export class SwarmPolling {
window.log.info(
`handleConfigMessagesViaLibSession of "${allDecryptedConfigMessages.length}" messages with libsession`
);
+
+ if (returnDisplayNameOnly) {
+ try {
+ const keypair = await UserUtils.getUserED25519KeyPairBytes();
+ if (!keypair || !keypair.privKeyBytes) {
+ throw new Error('edkeypair not found for current user');
+ }
+
+ const privateKeyEd25519 = keypair.privKeyBytes;
+
+ // we take the lastest config message to create the wrapper in memory
+ const incomingConfigMessages = allDecryptedConfigMessages.map(m => ({
+ data: m.message.data,
+ hash: m.messageHash,
+ }));
+
+ await GenericWrapperActions.init('UserConfig', privateKeyEd25519, null);
+ await GenericWrapperActions.merge('UserConfig', incomingConfigMessages);
+
+ const userInfo = await UserConfigWrapperActions.getUserInfo();
+ if (!userInfo) {
+ throw new Error('UserInfo not found');
+ }
+ return userInfo.name;
+ } catch (e) {
+ window.log.warn(
+ 'LibSessionUtil.initializeLibSessionUtilWrappers failed with',
+ e.message
+ );
+ } finally {
+ await GenericWrapperActions.free('UserConfig');
+ }
+
+ return '';
+ }
+
await ConfigMessageHandler.handleConfigMessagesViaLibSession(allDecryptedConfigMessages);
} catch (e) {
const allMessageHases = allDecryptedConfigMessages.map(m => m.messageHash).join(',');
@@ -418,6 +457,7 @@ export class SwarmPolling {
);
}
}
+ return '';
}
// Fetches messages for `pubkey` from `node` potentially updating
@@ -627,4 +667,78 @@ export class SwarmPolling {
// return the cached value
return this.lastHashes[nodeEdKey][pubkey][namespace];
}
+
+ public async pollOnceForOurDisplayName(abortSignal?: AbortSignal): Promise {
+ if (abortSignal?.aborted) {
+ throw new NotFoundError('[pollOnceForOurDisplayName] aborted right away');
+ }
+
+ const pubkey = UserUtils.getOurPubKeyFromCache();
+
+ const swarmSnodes = await snodePool.getSwarmFor(pubkey.key);
+ const toPollFrom = sample(swarmSnodes);
+
+ if (!toPollFrom) {
+ throw new Error(
+ `[pollOnceForOurDisplayName] no snode in swarm for ${ed25519Str(pubkey.key)}`
+ );
+ }
+
+ if (abortSignal?.aborted) {
+ throw new NotFoundError(
+ '[pollOnceForOurDisplayName] aborted after selecting nodes to poll from'
+ );
+ }
+
+ // Note: always print something so we know if the polling is hanging
+ window.log.info(
+ `WIP: [onboarding] about to pollOnceForOurDisplayName of ${ed25519Str(pubkey.key)} from snode: ${ed25519Str(toPollFrom.pubkey_ed25519)} namespaces: ${[SnodeNamespaces.UserProfile]} `
+ );
+
+ const resultsFromUserProfile = await SnodeAPIRetrieve.retrieveNextMessages(
+ toPollFrom,
+ [''],
+ pubkey.key,
+ [SnodeNamespaces.UserProfile],
+ pubkey.key,
+ null
+ );
+
+ // Note: always print something so we know if the polling is hanging
+ window.log.info(
+ `WIP: [onboarding] pollOnceForOurDisplayName of ${ed25519Str(pubkey.key)} from snode: ${ed25519Str(toPollFrom.pubkey_ed25519)} namespaces: ${[SnodeNamespaces.UserProfile]} returned: ${resultsFromUserProfile?.length}`
+ );
+
+ // check if we just fetched the details from the config namespaces.
+ // If yes, merge them together and exclude them from the rest of the messages.
+ if (!resultsFromUserProfile?.length) {
+ throw new NotFoundError('[pollOnceForOurDisplayName] resultsFromUserProfile is empty');
+ }
+
+ if (abortSignal?.aborted) {
+ throw new NotFoundError(
+ '[pollOnceForOurDisplayName] aborted after retrieving user profile config messages'
+ );
+ }
+
+ const userConfigMessages = resultsFromUserProfile
+ .filter(m => SnodeNamespace.isUserConfigNamespace(m.namespace))
+ .map(r => r.messages.messages);
+
+ const userConfigMessagesMerged = flatten(compact(userConfigMessages));
+ if (!userConfigMessagesMerged.length) {
+ throw new NotFoundError(
+ '[pollOnceForOurDisplayName] after merging there are no user config messages'
+ );
+ }
+ const displayName = await this.handleSharedConfigMessages(userConfigMessagesMerged, true);
+
+ if (isEmpty(displayName)) {
+ throw new NotFoundError(
+ '[pollOnceForOurDisplayName] Got a config message from network but without a displayName...'
+ );
+ }
+
+ return displayName;
+ }
}
diff --git a/ts/session/apis/snode_api/types.ts b/ts/session/apis/snode_api/types.ts
index 3650251af1..6a27ff44d0 100644
--- a/ts/session/apis/snode_api/types.ts
+++ b/ts/session/apis/snode_api/types.ts
@@ -3,7 +3,7 @@ import { SnodeNamespaces } from './namespaces';
export type RetrieveMessageItem = {
hash: string;
expiration: number;
- data: string; // base64 encrypted content of the emssage
+ data: string; // base64 encrypted content of the message
timestamp: number;
};
diff --git a/ts/session/constants.ts b/ts/session/constants.ts
index 968f035f31..27f2baf19f 100644
--- a/ts/session/constants.ts
+++ b/ts/session/constants.ts
@@ -78,9 +78,19 @@ export const VALIDATION = {
export const DEFAULT_RECENT_REACTS = ['😂', '🥰', '😢', '😡', '😮', '😈'];
export const REACT_LIMIT = 6;
-export const MAX_USERNAME_BYTES = 64;
+/** character limit for a display name based on libsession MAX_NAME_LENGTH */
+export const MAX_NAME_LENGTH_BYTES = 100;
export const FEATURE_RELEASE_TIMESTAMPS = {
DISAPPEARING_MESSAGES_V2: 1710284400000, // 13/03/2024 10:00 Melbourne time
USER_CONFIG: 1690761600000, // Monday July 31st at 10am Melbourne time
};
+
+export const ONBOARDING_TIMES = {
+ /** 15 seconds */
+ RECOVERY_TIMEOUT: 15 * DURATION.SECONDS,
+ /** 0.3 seconds */
+ RECOVERY_FINISHING: 0.3 * DURATION.SECONDS,
+ /** 0.2 seconds */
+ RECOVERY_FINISHED: 0.2 * DURATION.SECONDS,
+};
diff --git a/ts/session/crypto/mnemonic.ts b/ts/session/crypto/mnemonic.ts
index ffac2d96b1..d4fd261987 100644
--- a/ts/session/crypto/mnemonic.ts
+++ b/ts/session/crypto/mnemonic.ts
@@ -1,14 +1,55 @@
-/* eslint-disable camelcase */
import crc32 from 'buffer-crc32';
-class MnemonicError extends Error {}
+class MnemonicError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = this.constructor.name; // Set the error name to the class name
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ }
+ // restore prototype chain
+ Object.setPrototypeOf(this, MnemonicError.prototype);
+ }
+}
+
+export class NotEnoughWordsError extends MnemonicError {
+ constructor(message = "You've entered too few words, please try again") {
+ super(message);
+ // restore prototype chain
+ Object.setPrototypeOf(this, NotEnoughWordsError.prototype);
+ }
+}
+
+export class InvalidWordsError extends MnemonicError {
+ constructor(message = "You've entered too few words, please try again") {
+ super(message);
+ // restore prototype chain
+ Object.setPrototypeOf(this, InvalidWordsError.prototype);
+ }
+}
+
+export class DecodingError extends MnemonicError {
+ constructor(message = 'Something went wrong when decoding your private key, please try again') {
+ super(message);
+ // restore prototype chain
+ Object.setPrototypeOf(this, DecodingError.prototype);
+ }
+}
+
+export class VerificationError extends MnemonicError {
+ constructor(message = 'Your private key could not be verified, please verify the checksum word') {
+ super(message);
+ // restore prototype chain
+ Object.setPrototypeOf(this, VerificationError.prototype);
+ }
+}
/*
- mnemonic.js : Converts between 4-byte aligned strings and a human-readable
+ mnemonic.ts : Converts between 4-byte aligned strings and a human-readable
sequence of words. Uses 1626 common words taken from wikipedia article:
http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists/Contemporary_poetry
Originally written in python special for Electrum (lightweight Bitcoin client).
- This version has been reimplemented in javascript and placed in public domain.
+ This version has been reimplemented in javascript and placed in public domain and has further been converted to TypeScript as part of the Session project.
*/
const MN_DEFAULT_WORDSET = 'english';
@@ -60,18 +101,19 @@ export function mnDecode(str: string, wordsetName: string = MN_DEFAULT_WORDSET):
const wlist = str.split(' ');
let checksumWord = '';
if (wlist.length < 12) {
- throw new MnemonicError("You've entered too few words, please try again");
+ throw new NotEnoughWordsError();
}
if (
(wordset.prefixLen === 0 && wlist.length % 3 !== 0) ||
(wordset.prefixLen > 0 && wlist.length % 3 === 2)
) {
- throw new MnemonicError("You've entered too few words, please try again");
+ throw new NotEnoughWordsError();
}
if (wordset.prefixLen > 0 && wlist.length % 3 === 0) {
- throw new MnemonicError(
- 'You seem to be missing the last word in your private key, please try again'
+ window.log.error(
+ 'mnDecode(): You seem to be missing the last word in your private key, please try again'
);
+ throw new NotEnoughWordsError();
}
if (wordset.prefixLen > 0) {
// Pop checksum from mnemonic
@@ -92,14 +134,12 @@ export function mnDecode(str: string, wordsetName: string = MN_DEFAULT_WORDSET):
w3 = wordset.truncWords.indexOf(wlist[i + 2].slice(0, wordset.prefixLen));
}
if (w1 === -1 || w2 === -1 || w3 === -1) {
- throw new MnemonicError('invalid word in mnemonic');
+ throw new InvalidWordsError();
}
const x = w1 + n * ((n - w1 + w2) % n) + n * n * ((n - w2 + w3) % n);
if (x % n !== w1) {
- throw new MnemonicError(
- 'Something went wrong when decoding your private key, please try again'
- );
+ throw new DecodingError();
}
out += mn_swap_endian_4byte(`0000000${x.toString(16)}`.slice(-8));
}
@@ -110,9 +150,7 @@ export function mnDecode(str: string, wordsetName: string = MN_DEFAULT_WORDSET):
if (
expectedChecksumWord.slice(0, wordset.prefixLen) !== checksumWord.slice(0, wordset.prefixLen)
) {
- throw new MnemonicError(
- 'Your private key could not be verified, please verify the checksum word'
- );
+ throw new VerificationError();
}
}
return out;
diff --git a/ts/session/types/PubKey.ts b/ts/session/types/PubKey.ts
index 2320bf6463..10acdd9bec 100644
--- a/ts/session/types/PubKey.ts
+++ b/ts/session/types/PubKey.ts
@@ -134,7 +134,7 @@ export class PubKey {
// Check if it's hex
const isHex = pubkey.replace(/[\s]*/g, '').match(/^[0-9a-fA-F]+$/);
if (!isHex) {
- return window.i18n('invalidSessionId');
+ return window.i18n('accountIdErrorInvalid');
}
// Check if the pubkey length is 33 and leading with 05 or of length 32
diff --git a/ts/session/utils/String.ts b/ts/session/utils/String.ts
index 68713e5e5d..d44d63a76f 100644
--- a/ts/session/utils/String.ts
+++ b/ts/session/utils/String.ts
@@ -1,5 +1,5 @@
import ByteBuffer from 'bytebuffer';
-import { MAX_USERNAME_BYTES } from '../constants';
+import { MAX_NAME_LENGTH_BYTES } from '../constants';
export type Encoding = 'base64' | 'hex' | 'binary' | 'utf8';
export type BufferType = ByteBuffer | Buffer | ArrayBuffer | Uint8Array;
@@ -57,7 +57,7 @@ const forbiddenDisplayCharRegex = /\uFFD2*/g;
* This does not trim it as otherwise, a user cannot type User A as when he hits the space, it gets trimmed right away.
* The trimming should hence happen after calling this and on saving the display name.
*
- * This functions makes sure that the MAX_USERNAME_BYTES is verified for utf8 byte length
+ * This function makes sure that the MAX_NAME_LENGTH_BYTES is verified for utf8 byte length.
* @param inputName the input to sanitize
* @returns a sanitized string, untrimmed
*/
@@ -65,7 +65,7 @@ export const sanitizeSessionUsername = (inputName: string) => {
const validChars = inputName.replace(forbiddenDisplayCharRegex, '');
const lengthBytes = encode(validChars, 'utf8').byteLength;
- if (lengthBytes > MAX_USERNAME_BYTES) {
+ if (lengthBytes > MAX_NAME_LENGTH_BYTES) {
throw new Error('Display name is too long');
}
diff --git a/ts/session/utils/Toast.tsx b/ts/session/utils/Toast.tsx
index a6673aa594..acb8ec9350 100644
--- a/ts/session/utils/Toast.tsx
+++ b/ts/session/utils/Toast.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { toast } from 'react-toastify';
import { SessionToast, SessionToastType } from '../../components/basic/SessionToast';
import { SectionType, showLeftPaneSection, showSettingsSection } from '../../state/ducks/section';
diff --git a/ts/session/utils/errors.ts b/ts/session/utils/errors.ts
index 0807b10c0d..9e5f0029d0 100644
--- a/ts/session/utils/errors.ts
+++ b/ts/session/utils/errors.ts
@@ -25,7 +25,7 @@ export class EmptySwarmError extends Error {
export class NotFoundError extends Error {
public error: any;
- constructor(message: string, error: any) {
+ constructor(message: string, error?: any) {
// 'Error' breaks prototype chain here
super(message);
this.error = error;
diff --git a/ts/session/utils/libsession/libsession_utils.ts b/ts/session/utils/libsession/libsession_utils.ts
index 0e6208df45..37855f4385 100644
--- a/ts/session/utils/libsession/libsession_utils.ts
+++ b/ts/session/utils/libsession/libsession_utils.ts
@@ -36,6 +36,9 @@ export type OutgoingConfResult = {
oldMessageHashes: Array;
};
+/**
+ * Initializes the libsession wrappers for the required user variants if the dumps are not already in the database. It will use an empty dump if the dump is not found.
+ */
async function initializeLibSessionUtilWrappers() {
const keypair = await UserUtils.getUserED25519KeyPairBytes();
if (!keypair || !keypair.privKeyBytes) {
diff --git a/ts/state/onboarding/ducks/modals.ts b/ts/state/onboarding/ducks/modals.ts
new file mode 100644
index 0000000000..9fa1ea20fa
--- /dev/null
+++ b/ts/state/onboarding/ducks/modals.ts
@@ -0,0 +1,28 @@
+import { PayloadAction, createSlice } from '@reduxjs/toolkit';
+import { TermsOfServicePrivacyDialogProps } from '../../../components/dialog/TermsOfServicePrivacyDialog';
+
+export type TermsOfServicePrivacyModalState = TermsOfServicePrivacyDialogProps | null;
+
+export type ModalsState = {
+ termsOfServicePrivacyModalState: TermsOfServicePrivacyModalState | null;
+};
+
+const initialState: ModalsState = {
+ termsOfServicePrivacyModalState: null,
+};
+
+export const modalsSlice = createSlice({
+ name: 'modals',
+ initialState,
+ reducers: {
+ updateTermsOfServicePrivacyModal(
+ state,
+ action: PayloadAction
+ ) {
+ return { ...state, termsOfServicePrivacyModalState: action.payload };
+ },
+ },
+});
+
+export const { updateTermsOfServicePrivacyModal } = modalsSlice.actions;
+export default modalsSlice.reducer;
diff --git a/ts/state/onboarding/ducks/registration.ts b/ts/state/onboarding/ducks/registration.ts
new file mode 100644
index 0000000000..ef52f4bacd
--- /dev/null
+++ b/ts/state/onboarding/ducks/registration.ts
@@ -0,0 +1,115 @@
+import { PayloadAction, createSlice } from '@reduxjs/toolkit';
+
+export enum Onboarding {
+ /** starting screen */
+ Start,
+ /** uses AccountCreation internally */
+ CreateAccount,
+ /** uses AccountRestoration internally */
+ RestoreAccount,
+}
+
+export enum AccountCreation {
+ /** starting screen */
+ DisplayName,
+ /** show conversation screen */
+ Done,
+}
+
+export enum AccountRestoration {
+ /** starting screen */
+ RecoveryPassword,
+ /** fetching account details, so we increment progress to 100% over 15s */
+ Loading,
+ /** found account details, so we increment the remaining progress to 100% over 0.3s */
+ Finishing,
+ /** found the account details and the progress is now 100%, so we wait for 0.2s */
+ Finished,
+ /** we failed to fetch account details in time, so we enter it manually */
+ DisplayName,
+ /** we have restored successfuly, show the conversation screen */
+ Complete,
+}
+
+export type OnboardDirection = 'backward' | 'forward';
+
+export type OnboardingState = {
+ step: Onboarding;
+ direction: OnboardDirection;
+ accountCreationStep: AccountCreation;
+ accountRestorationStep: AccountRestoration;
+ progress: number;
+ recoveryPassword: string;
+ recoveryPasswordError: string | undefined;
+ hexGeneratedPubKey: string;
+ displayName: string;
+ displayNameError: string | undefined;
+};
+
+const initialState: OnboardingState = {
+ step: Onboarding.Start,
+ direction: 'forward',
+ accountCreationStep: AccountCreation.DisplayName,
+ accountRestorationStep: AccountRestoration.RecoveryPassword,
+ progress: 0,
+ recoveryPassword: '',
+ recoveryPasswordError: undefined,
+ hexGeneratedPubKey: '',
+ displayName: '',
+ displayNameError: undefined,
+};
+
+export const registrationSlice = createSlice({
+ name: 'registration',
+ initialState,
+ reducers: {
+ resetOnboardingState() {
+ return { ...initialState };
+ },
+ setOnboardingStep(state, action: PayloadAction) {
+ return { ...state, step: action.payload };
+ },
+ setDirection(state, action: PayloadAction) {
+ return { ...state, direction: action.payload };
+ },
+ setAccountCreationStep(state, action: PayloadAction) {
+ return { ...state, accountCreationStep: action.payload };
+ },
+ setAccountRestorationStep(state, action: PayloadAction) {
+ return { ...state, accountRestorationStep: action.payload };
+ },
+ setProgress(state, action: PayloadAction) {
+ return { ...state, progress: action.payload };
+ },
+ setRecoveryPassword(state, action: PayloadAction) {
+ return { ...state, recoveryPassword: action.payload };
+ },
+ setRecoveryPasswordError(state, action: PayloadAction) {
+ return { ...state, recoveryPasswordError: action.payload };
+ },
+ setHexGeneratedPubKey(state, action: PayloadAction) {
+ return { ...state, hexGeneratedPubKey: action.payload };
+ },
+ setDisplayName(state, action: PayloadAction) {
+ return { ...state, displayName: action.payload };
+ },
+ setDisplayNameError(state, action: PayloadAction) {
+ return { ...state, displayNameError: action.payload };
+ },
+ },
+});
+
+export const {
+ resetOnboardingState,
+ setOnboardingStep,
+ setDirection,
+ setAccountCreationStep,
+ setAccountRestorationStep,
+ setProgress,
+ setRecoveryPassword,
+ setRecoveryPasswordError,
+ setHexGeneratedPubKey,
+ setDisplayName,
+ setDisplayNameError,
+} = registrationSlice.actions;
+export default registrationSlice.reducer;
diff --git a/ts/state/onboarding/selectors/modals.ts b/ts/state/onboarding/selectors/modals.ts
new file mode 100644
index 0000000000..3f6483c1cc
--- /dev/null
+++ b/ts/state/onboarding/selectors/modals.ts
@@ -0,0 +1,12 @@
+import { createSelector } from '@reduxjs/toolkit';
+import { ModalsState, TermsOfServicePrivacyModalState } from '../ducks/modals';
+import { OnboardingStoreState } from '../store';
+
+const getModals = (state: OnboardingStoreState): ModalsState => {
+ return state.modals;
+};
+
+export const getTermsOfServicePrivacyModalState = createSelector(
+ getModals,
+ (state: ModalsState): TermsOfServicePrivacyModalState => state.termsOfServicePrivacyModalState
+);
diff --git a/ts/state/onboarding/selectors/registration.ts b/ts/state/onboarding/selectors/registration.ts
new file mode 100644
index 0000000000..ba22b51919
--- /dev/null
+++ b/ts/state/onboarding/selectors/registration.ts
@@ -0,0 +1,108 @@
+import { createSelector } from '@reduxjs/toolkit';
+import { useSelector } from 'react-redux';
+import {
+ AccountCreation,
+ AccountRestoration,
+ OnboardDirection,
+ Onboarding,
+ OnboardingState,
+} from '../ducks/registration';
+import { OnboardingStoreState } from '../store';
+
+// #region Getters
+const getRegistration = (state: OnboardingStoreState): OnboardingState => {
+ return state.registration;
+};
+
+const getOnboardingStep = createSelector(
+ getRegistration,
+ (state: OnboardingState): Onboarding => state.step
+);
+
+const getDirection = createSelector(
+ getRegistration,
+ (state: OnboardingState): OnboardDirection => state.direction
+);
+
+const getAccountCreationStep = createSelector(
+ getRegistration,
+ (state: OnboardingState): AccountCreation => state.accountCreationStep
+);
+
+const getAccountRestorationStep = createSelector(
+ getRegistration,
+ (state: OnboardingState): AccountRestoration => state.accountRestorationStep
+);
+
+const getProgress = createSelector(
+ getRegistration,
+ (state: OnboardingState): number => state.progress
+);
+
+const getRecoveryPassword = createSelector(
+ getRegistration,
+ (state: OnboardingState): string => state.recoveryPassword
+);
+
+const getRecoveryPasswordError = createSelector(
+ getRegistration,
+ (state: OnboardingState): string | undefined => state.recoveryPasswordError
+);
+
+const getHexGeneratedPubKey = createSelector(
+ getRegistration,
+ (state: OnboardingState): string => state.hexGeneratedPubKey
+);
+
+const getDisplayName = createSelector(
+ getRegistration,
+ (state: OnboardingState): string => state.displayName
+);
+
+const getDisplayNameError = createSelector(
+ getRegistration,
+ (state: OnboardingState): string | undefined => state.displayNameError
+);
+// #endregion
+
+// #region Hooks
+export const useOnboardStep = () => {
+ return useSelector(getOnboardingStep);
+};
+
+export const useOnboardDirection = () => {
+ return useSelector(getDirection);
+};
+
+export const useOnboardAccountCreationStep = () => {
+ return useSelector(getAccountCreationStep);
+};
+
+export const useOnboardAccountRestorationStep = () => {
+ return useSelector(getAccountRestorationStep);
+};
+
+export const useProgress = () => {
+ return useSelector(getProgress);
+};
+
+export const useRecoveryPassword = () => {
+ return useSelector(getRecoveryPassword);
+};
+
+export const useRecoveryPasswordError = () => {
+ return useSelector(getRecoveryPasswordError);
+};
+
+export const useOnboardHexGeneratedPubKey = () => {
+ return useSelector(getHexGeneratedPubKey);
+};
+
+export const useDisplayName = () => {
+ return useSelector(getDisplayName);
+};
+
+export const useDisplayNameError = () => {
+ return useSelector(getDisplayNameError);
+};
+// #endregion
diff --git a/ts/state/onboarding/store.ts b/ts/state/onboarding/store.ts
new file mode 100644
index 0000000000..06fa8dd5be
--- /dev/null
+++ b/ts/state/onboarding/store.ts
@@ -0,0 +1,10 @@
+import { configureStore } from '@reduxjs/toolkit';
+import modalsReducer from './ducks/modals';
+import registrationReducer from './ducks/registration';
+
+export const onboardingStore = configureStore({
+ reducer: { modals: modalsReducer, registration: registrationReducer },
+});
+
+export type OnboardingStoreState = ReturnType;
+export type OnboardingStoreDispatch = typeof onboardingStore.dispatch;
diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts
index cc80b57581..86ca8d2315 100644
--- a/ts/state/selectors/conversations.ts
+++ b/ts/state/selectors/conversations.ts
@@ -443,6 +443,13 @@ export const getLeftPaneConversationIds = createSelector(
_getLeftPaneConversationIds
);
+export const getLeftPaneConversationIdsCount = createSelector(
+ getLeftPaneConversationIds,
+ (convoIds: Array) => {
+ return convoIds.length;
+ }
+);
+
const getDirectContacts = createSelector(getSortedConversations, _getPrivateFriendsConversations);
export const getPrivateContactsPubkeys = createSelector(getDirectContacts, state =>
diff --git a/ts/state/selectors/modal.ts b/ts/state/selectors/modal.ts
index 6bbfaa9da4..beaa1ce411 100644
--- a/ts/state/selectors/modal.ts
+++ b/ts/state/selectors/modal.ts
@@ -1,6 +1,5 @@
import { createSelector } from '@reduxjs/toolkit';
-import { StateType } from '../reducer';
import {
AddModeratorsModalState,
BanOrUnbanUserModalState,
@@ -20,6 +19,7 @@ import {
UpdateGroupNameModalState,
UserDetailsModalState,
} from '../ducks/modalDialog';
+import { StateType } from '../reducer';
export const getModal = (state: StateType): ModalState => {
return state.modals;
diff --git a/ts/test/session/unit/onboarding/Onboarding_test.ts b/ts/test/session/unit/onboarding/Onboarding_test.ts
new file mode 100644
index 0000000000..18d99d1c31
--- /dev/null
+++ b/ts/test/session/unit/onboarding/Onboarding_test.ts
@@ -0,0 +1,154 @@
+import { expect } from 'chai';
+import Sinon from 'sinon';
+import { displayNameIsValid } from '../../../../components/registration/utils';
+import { getSwarmPollingInstance } from '../../../../session/apis/snode_api';
+import { PubKey } from '../../../../session/types';
+import {
+ generateMnemonic,
+ registerSingleDevice,
+ signInByLinkingDevice,
+} from '../../../../util/accountManager';
+import { TestUtils } from '../../../test-utils';
+import { stubWindow } from '../../../test-utils/utils';
+
+describe('Onboarding', () => {
+ const polledDisplayName = 'Hello World';
+
+ beforeEach(() => {
+ TestUtils.stubWindowLog();
+ TestUtils.stubWindowWhisper();
+ TestUtils.stubStorage();
+ TestUtils.stubI18n();
+ TestUtils.stubData('createOrUpdateItem').resolves();
+ TestUtils.stubData('removeItemById').resolves();
+ stubWindow('setOpengroupPruning', () => {});
+ Sinon.stub(getSwarmPollingInstance(), 'pollOnceForOurDisplayName').resolves(polledDisplayName);
+ });
+
+ afterEach(() => {
+ Sinon.restore();
+ });
+
+ describe('displayNameIsValid', () => {
+ it('should throw an error if the display name is undefined', async () => {
+ try {
+ displayNameIsValid(undefined);
+ } catch (error) {
+ error.should.be.an.instanceOf(Error);
+ error.message.should.equal(window.i18n('displayNameEmpty'));
+ }
+ });
+ it('should throw an error if the display name is empty after trimming', async () => {
+ try {
+ displayNameIsValid(' ');
+ } catch (error) {
+ error.should.be.an.instanceOf(Error);
+ error.message.should.equal(window.i18n('displayNameEmpty'));
+ }
+ });
+ it('if the display name is valid it should be returned', async () => {
+ try {
+ const displayName = 'Hello World';
+ const validDisplayName = displayNameIsValid(displayName);
+ expect(validDisplayName, `should equal ${displayName}`).to.equal(displayName);
+ } catch (error) {
+ error.should.not.be.an.instanceOf(Error);
+ error.message.should.not.equal(window.i18n('displayNameEmpty'));
+ }
+ });
+ });
+
+ describe('registerSingleDevice', () => {
+ it('should return a valid pubkey/account id given a valid recovery password and display name', async () => {
+ const recoveryPassword = await generateMnemonic();
+ const validDisplayName = 'Hello World';
+ let accountId = null;
+
+ await registerSingleDevice(
+ recoveryPassword,
+ 'english',
+ validDisplayName,
+ async (pubkey: string) => {
+ accountId = pubkey;
+ }
+ );
+
+ expect(accountId, 'should not be null').to.not.be.null;
+ expect(accountId, 'should be a string').to.be.a('string');
+ expect(PubKey.validate(accountId!), 'should be a valid pubkey').to.equal(true);
+ });
+ it('should throw an error if the recovery password is empty', async () => {
+ try {
+ const recoveryPassword = '';
+ const validDisplayName = 'Hello World';
+
+ await registerSingleDevice(recoveryPassword, 'english', validDisplayName, async () => {});
+ } catch (error) {
+ error.should.be.an.instanceOf(Error);
+ error.message.should.equal(
+ 'Session always needs a mnemonic. Either generated or given by the user'
+ );
+ }
+ });
+ it('should throw an error if the mnemonicLanguage is empty', async () => {
+ try {
+ const recoveryPassword = await generateMnemonic();
+ const validDisplayName = 'Hello World';
+
+ await registerSingleDevice(recoveryPassword, '', validDisplayName, async () => {});
+ } catch (error) {
+ error.should.be.an.instanceOf(Error);
+ error.message.should.equal('We always need a mnemonicLanguage');
+ }
+ });
+ it('should throw an error if the display name is empty', async () => {
+ try {
+ const recoveryPassword = await generateMnemonic();
+ const validDisplayName = '';
+
+ await registerSingleDevice(recoveryPassword, 'english', validDisplayName, async () => {});
+ } catch (error) {
+ error.should.be.an.instanceOf(Error);
+ error.message.should.equal('We always need a displayName');
+ }
+ });
+ });
+
+ describe('signInByLinkingDevice', () => {
+ const abortController = new AbortController();
+
+ it('should return a valid pubkey/account id and display name given a valid recovery password', async () => {
+ const recoveryPassword = await generateMnemonic();
+ const { displayName, pubKeyString } = await signInByLinkingDevice(
+ recoveryPassword,
+ 'english',
+ abortController.signal
+ );
+ expect(pubKeyString, 'should not be null').to.not.be.null;
+ expect(pubKeyString, 'should be a string').to.be.a('string');
+ expect(PubKey.validate(pubKeyString!), 'should be a valid pubkey').to.equal(true);
+ expect(displayName, 'should not be null').to.not.be.null;
+ expect(displayName, 'should be a string').to.be.a('string');
+ expect(displayName, `should equal ${polledDisplayName}`).to.equal(polledDisplayName);
+ });
+ it('should throw an error if the recovery password is empty', async () => {
+ try {
+ await signInByLinkingDevice('', 'english', abortController.signal);
+ } catch (error) {
+ error.should.be.an.instanceOf(Error);
+ error.message.should.equal(
+ 'Session always needs a mnemonic. Either generated or given by the user'
+ );
+ }
+ });
+ it('should throw an error if the mnemonicLanguage is empty', async () => {
+ try {
+ const recoveryPassword = await generateMnemonic();
+ await signInByLinkingDevice(recoveryPassword, '', abortController.signal);
+ } catch (error) {
+ error.should.be.an.instanceOf(Error);
+ error.message.should.equal('We always need a mnemonicLanguage');
+ }
+ });
+ });
+});
diff --git a/ts/test/session/unit/utils/String_test.ts b/ts/test/session/unit/utils/String_test.ts
index 3f8bcf9c90..cd934d358b 100644
--- a/ts/test/session/unit/utils/String_test.ts
+++ b/ts/test/session/unit/utils/String_test.ts
@@ -1,11 +1,11 @@
/* eslint-disable no-unused-expressions */
-import chai from 'chai';
import ByteBuffer from 'bytebuffer';
+import chai from 'chai';
import chaiAsPromised from 'chai-as-promised';
// Can't import type as StringUtils.Encoding
-import { Encoding } from '../../../../session/utils/String';
import { StringUtils } from '../../../../session/utils';
+import { Encoding } from '../../../../session/utils/String';
chai.use(chaiAsPromised as any);
@@ -220,4 +220,49 @@ describe('String Utils', () => {
});
});
});
+
+ describe('sanitizeSessionUsername', () => {
+ it('should remove invalid characters', () => {
+ const invalidChars = ['\uFFD2', '\uFFD2\uFFD2', '\uFFD2\uFFD2\uFFD2'];
+
+ invalidChars.forEach(invalidChar => {
+ const validUsername = StringUtils.sanitizeSessionUsername(invalidChar);
+ expect(
+ validUsername,
+ 'should return an empty string if there are no valid characters'
+ ).to.equal('');
+ });
+ });
+
+ it('should not remove valid characters', () => {
+ const validChars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
+
+ validChars.forEach(validChar => {
+ const validUsername = StringUtils.sanitizeSessionUsername(validChar);
+ expect(validUsername).to.equal(validChar);
+ });
+ });
+
+ it('should remove invalid characters and keep valid characters', () => {
+ const input = 'a\uFFD2b\uFFD2c\uFFD2d\uFFD2e\uFFD2f\uFFD2g\uFFD2h\uFFD2i\uFFD2j';
+ const expected = 'abcdefghij';
+ const validUsername = StringUtils.sanitizeSessionUsername(input);
+ expect(validUsername).to.equal(expected);
+ });
+
+ it('should remove invalid characters and keep valid characters with spaces', () => {
+ const input = 'a\uFFD2 b\uFFD2 c\uFFD2 d\uFFD2 e\uFFD2 f\uFFD2 g\uFFD2 h\uFFD2 i\uFFD2 j';
+ const expected = 'a b c d e f g h i j';
+ const validUsername = StringUtils.sanitizeSessionUsername(input);
+ expect(validUsername).to.equal(expected);
+ });
+
+ it('should remove invalid characters and keep valid characters with spaces and special characters', () => {
+ const input =
+ 'a\uFFD2 b\uFFD2 c\uFFD2 d\uFFD2 e\uFFD2 f\uFFD2 g\uFFD2 h\uFFD2 i\uFFD2 j\uFFD2 !@#$%^&*()_+';
+ const expected = 'a b c d e f g h i j !@#$%^&*()_+';
+ const validUsername = StringUtils.sanitizeSessionUsername(input);
+ expect(validUsername).to.equal(expected);
+ });
+ });
});
diff --git a/ts/test/test-utils/utils/stubbing.ts b/ts/test/test-utils/utils/stubbing.ts
index bbfe547e68..8a5f63a7bb 100644
--- a/ts/test/test-utils/utils/stubbing.ts
+++ b/ts/test/test-utils/utils/stubbing.ts
@@ -5,6 +5,8 @@ import { ConfigDumpData } from '../../../data/configDump/configDump';
import { Data } from '../../../data/data';
import { OpenGroupData } from '../../../data/opengroups';
+import { load } from '../../../node/locale';
+import { setupi18n } from '../../../util/i18n';
import * as libsessionWorker from '../../../webworker/workers/browser/libsession_worker_interface';
import * as utilWorker from '../../../webworker/workers/browser/util_worker_interface';
@@ -99,6 +101,23 @@ export const stubWindowFeatureFlags = () => {
stubWindow('sessionFeatureFlags', { debug: {} } as any);
};
+export const stubWindowWhisper = () => {
+ stubWindow('Whisper', {
+ events: {
+ on: (name: string, callback: (param1?: any, param2?: any) => void) => {
+ if (enableLogRedirect) {
+ console.info(`Whisper Event registered ${name} ${callback}`);
+ }
+ callback();
+ },
+ trigger: (name: string, param1?: any, param2?: any) =>
+ enableLogRedirect
+ ? console.info(`Whisper Event triggered ${name} ${param1} ${param2}`)
+ : {},
+ },
+ });
+};
+
export async function expectAsyncToThrow(toAwait: () => Promise, errorMessageToCatch: string) {
try {
await toAwait();
@@ -108,3 +127,31 @@ export async function expectAsyncToThrow(toAwait: () => Promise, errorMessa
expect(e.message).to.be.eq(errorMessageToCatch);
}
}
+
+/** You must call stubWindowLog() before using */
+export const stubI18n = () => {
+ const locale = load({ appLocale: 'en', logger: window.log });
+ stubWindow('i18n', setupi18n('en', locale.messages));
+};
+
+export const stubStorage = () => {
+ return {
+ get: (key: string, defaultValue?: any) => {
+ if (enableLogRedirect) {
+ console.info(`Storage.get ${key} returns ${defaultValue || key}`);
+ }
+
+ return defaultValue || key;
+ },
+ put: (key: string, value: any) => {
+ if (enableLogRedirect) {
+ console.info(`Storage.put ${key} with ${value}`);
+ }
+ },
+ remove: (key: string) => {
+ if (enableLogRedirect) {
+ console.info(`Storage.remove ${key}`);
+ }
+ },
+ };
+};
diff --git a/ts/themes/SessionTheme.tsx b/ts/themes/SessionTheme.tsx
index 01231796b4..ef0694aff3 100644
--- a/ts/themes/SessionTheme.tsx
+++ b/ts/themes/SessionTheme.tsx
@@ -1,5 +1,6 @@
import { ipcRenderer } from 'electron';
-import React from 'react';
+
+import { ReactNode } from 'react';
import { createGlobalStyle } from 'styled-components';
import { getOppositeTheme, isThemeMismatched } from '../util/theme';
import { classicDark } from './classicDark';
@@ -14,7 +15,7 @@ const SessionGlobalStyles = createGlobalStyle`
};
`;
-export const SessionTheme = ({ children }: { children: React.ReactNode }) => (
+export const SessionTheme = ({ children }: { children: ReactNode }) => (
<>
{children}
diff --git a/ts/themes/classicDark.ts b/ts/themes/classicDark.ts
index 323ebcb037..b9aec7f7e6 100644
--- a/ts/themes/classicDark.ts
+++ b/ts/themes/classicDark.ts
@@ -25,9 +25,12 @@ export const classicDark: ThemeColorVariables = {
'--message-bubbles-sent-text-color': 'var(--background-primary-color)',
'--message-bubbles-received-text-color': 'var(--text-primary-color)',
- '--menu-button-background-color': 'var(--primary-color)',
- '--menu-button-background-hover-color': THEMES.CLASSIC_DARK.COLOR4,
- '--menu-button-icon-color': THEMES.CLASSIC_DARK.COLOR6,
+ '--menu-button-background-color': 'transparent',
+ '--menu-button-background-hover-color': 'var(--primary-color)',
+ '--menu-button-icon-color': 'var(--primary-color)',
+ '--menu-button-icon-hover-color': 'var(--text-primary-color)',
+ '--menu-button-border-color': 'var(--primary-color)',
+ '--menu-button-border-hover-color': 'var(--primary-color)',
'--chat-buttons-background-color': THEMES.CLASSIC_DARK.COLOR2,
'--chat-buttons-background-hover-color': THEMES.CLASSIC_DARK.COLOR3,
@@ -55,6 +58,10 @@ export const classicDark: ThemeColorVariables = {
'--button-solid-disabled-color': THEMES.CLASSIC_DARK.COLOR4,
'--button-solid-shadow-color': 'none',
+ '--button-ghost-background-color': 'none',
+ '--button-ghost-background-hover-color': THEMES.CLASSIC_DARK.COLOR2,
+ '--button-ghost-disabled-color': 'none',
+
'--button-simple-text-color': 'var(--text-primary-color)',
'--button-simple-disabled-color': 'var(--disabled-color)',
diff --git a/ts/themes/classicLight.ts b/ts/themes/classicLight.ts
index 87584cd382..a4001157c2 100644
--- a/ts/themes/classicLight.ts
+++ b/ts/themes/classicLight.ts
@@ -25,9 +25,12 @@ export const classicLight: ThemeColorVariables = {
'--message-bubbles-sent-text-color': 'var(--text-primary-color)',
'--message-bubbles-received-text-color': 'var(--text-primary-color)',
- '--menu-button-background-color': THEMES.CLASSIC_LIGHT.COLOR0,
- '--menu-button-background-hover-color': THEMES.CLASSIC_LIGHT.COLOR1,
- '--menu-button-icon-color': THEMES.CLASSIC_LIGHT.COLOR6,
+ '--menu-button-background-color': 'transparent',
+ '--menu-button-background-hover-color': 'var(--text-primary-color)',
+ '--menu-button-icon-color': 'var(--text-primary-color)',
+ '--menu-button-icon-hover-color': THEMES.CLASSIC_LIGHT.COLOR6,
+ '--menu-button-border-color': 'var(--text-primary-color)',
+ '--menu-button-border-hover-color': 'var(--text-primary-color)',
'--chat-buttons-background-color': THEMES.CLASSIC_LIGHT.COLOR4,
'--chat-buttons-background-hover-color': THEMES.CLASSIC_LIGHT.COLOR3,
@@ -55,6 +58,10 @@ export const classicLight: ThemeColorVariables = {
'--button-solid-disabled-color': THEMES.CLASSIC_LIGHT.COLOR4,
'--button-solid-shadow-color': `rgba(${hexColorToRGB(THEMES.CLASSIC_LIGHT.COLOR0)}, 0.25)`,
+ '--button-ghost-background-color': 'none',
+ '--button-ghost-background-hover-color': THEMES.CLASSIC_LIGHT.COLOR4,
+ '--button-ghost-disabled-color': 'none',
+
'--button-simple-text-color': 'var(--text-primary-color)',
'--button-simple-disabled-color': 'var(--disabled-color)',
diff --git a/ts/themes/globals.tsx b/ts/themes/globals.tsx
index d0743586ca..cc28ec4339 100644
--- a/ts/themes/globals.tsx
+++ b/ts/themes/globals.tsx
@@ -2,6 +2,10 @@ import { isTestIntegration } from '../shared/env_vars';
import { hexColorToRGB } from '../util/hexColorToRGB';
import { COLORS } from './constants/colors';
+function setDuration(duration: number | string) {
+ return `${!isTestIntegration() ? duration : typeof duration === 'string' ? '0s' : '0'}`;
+}
+
// These variables are independent of the current theme
export type ThemeGlobals = {
/* Fonts */
@@ -25,6 +29,7 @@ export type ThemeGlobals = {
'--margins-lg': string;
'--margins-xl': string;
'--margins-2xl': string;
+ '--margins-3xl': string;
/* Padding */
'--padding-message-content': string;
@@ -42,6 +47,7 @@ export type ThemeGlobals = {
/* Animations */
'--default-duration': string;
+ '--default-duration-seconds': string;
/* Colors */
'--green-color': string;
@@ -92,6 +98,7 @@ export type ThemeGlobals = {
'--right-panel-height': string;
'--right-panel-attachment-width': string;
'--right-panel-attachment-height': string;
+ '--right-panel-duration': string;
};
// These are only set once in the global style (at root).
@@ -115,6 +122,7 @@ export const THEME_GLOBALS: ThemeGlobals = {
'--margins-lg': '20px',
'--margins-xl': '25px',
'--margins-2xl': '30px',
+ '--margins-3xl': '35px',
'--padding-message-content': '7px 13px',
'--padding-link-preview': '-7px -13px 7px -13px', // bottom has positive value because a link preview has always a body below
@@ -127,7 +135,8 @@ export const THEME_GLOBALS: ThemeGlobals = {
'--composition-container-height': '60px',
'--search-input-height': '34px',
- '--default-duration': isTestIntegration() ? '0s' : '0.25s',
+ '--default-duration': setDuration('0.25s'),
+ '--default-duration-seconds': setDuration(0.25), // framer-motion requires a number
'--green-color': COLORS.PRIMARY.GREEN,
'--blue-color': COLORS.PRIMARY.BLUE,
@@ -166,6 +175,7 @@ export const THEME_GLOBALS: ThemeGlobals = {
'--right-panel-attachment-width': 'calc(var(--right-panel-width) - 2 * var(--margins-2xl) - 7px)',
'--right-panel-attachment-height':
'calc(var(--right-panel-height) - 2 * var(--margins-2xl) -7px)',
+ '--right-panel-duration': setDuration('0.3s'),
};
// These should only be needed for the global style (at root).
diff --git a/ts/themes/oceanDark.ts b/ts/themes/oceanDark.ts
index 158c8d7989..c60d16bd4c 100644
--- a/ts/themes/oceanDark.ts
+++ b/ts/themes/oceanDark.ts
@@ -25,9 +25,12 @@ export const oceanDark: ThemeColorVariables = {
'--message-bubbles-sent-text-color': THEMES.OCEAN_DARK.COLOR0,
'--message-bubbles-received-text-color': 'var(--text-primary-color)',
- '--menu-button-background-color': 'var(--primary-color)',
- '--menu-button-background-hover-color': THEMES.OCEAN_DARK.COLOR6,
- '--menu-button-icon-color': THEMES.OCEAN_DARK.COLOR7!,
+ '--menu-button-background-color': 'transparent',
+ '--menu-button-background-hover-color': 'var(--primary-color)',
+ '--menu-button-icon-color': 'var(--primary-color)',
+ '--menu-button-icon-hover-color': 'var(--text-primary-color)',
+ '--menu-button-border-color': 'var(--primary-color)',
+ '--menu-button-border-hover-color': 'var(--primary-color)',
'--chat-buttons-background-color': THEMES.OCEAN_DARK.COLOR2,
'--chat-buttons-background-hover-color': THEMES.OCEAN_DARK.COLOR4,
@@ -55,6 +58,10 @@ export const oceanDark: ThemeColorVariables = {
'--button-solid-disabled-color': THEMES.OCEAN_DARK.COLOR4,
'--button-solid-shadow-color': 'none',
+ '--button-ghost-background-color': 'none',
+ '--button-ghost-background-hover-color': THEMES.OCEAN_DARK.COLOR6,
+ '--button-ghost-disabled-color': 'none',
+
'--button-simple-text-color': 'var(--text-primary-color)',
'--button-simple-disabled-color': 'var(--disabled-color)',
diff --git a/ts/themes/oceanLight.ts b/ts/themes/oceanLight.ts
index 96544f6df7..43fe0d7c03 100644
--- a/ts/themes/oceanLight.ts
+++ b/ts/themes/oceanLight.ts
@@ -25,9 +25,12 @@ export const oceanLight: ThemeColorVariables = {
'--message-bubbles-sent-text-color': 'var(--text-primary-color)',
'--message-bubbles-received-text-color': 'var(--text-primary-color)',
- '--menu-button-background-color': 'var(--primary-color)',
- '--menu-button-background-hover-color': THEMES.OCEAN_LIGHT.COLOR3,
- '--menu-button-icon-color': THEMES.OCEAN_LIGHT.COLOR1,
+ '--menu-button-background-color': 'transparent',
+ '--menu-button-background-hover-color': 'var(--primary-color)',
+ '--menu-button-icon-color': 'var(--primary-color)',
+ '--menu-button-icon-hover-color': THEMES.OCEAN_LIGHT.COLOR5,
+ '--menu-button-border-color': 'var(--primary-color)',
+ '--menu-button-border-hover-color': 'var(--primary-color)',
'--chat-buttons-background-color': THEMES.OCEAN_LIGHT.COLOR5,
'--chat-buttons-background-hover-color': THEMES.OCEAN_LIGHT.COLOR3,
@@ -55,6 +58,10 @@ export const oceanLight: ThemeColorVariables = {
'--button-solid-disabled-color': THEMES.OCEAN_LIGHT.COLOR4,
'--button-solid-shadow-color': `rgba(${hexColorToRGB(THEMES.OCEAN_LIGHT.COLOR0)}, 0.25)`,
+ '--button-ghost-background-color': 'none',
+ '--button-ghost-background-hover-color': THEMES.OCEAN_LIGHT.COLOR6,
+ '--button-ghost-disabled-color': 'none',
+
'--button-simple-text-color': 'var(--text-primary-color)',
'--button-simple-disabled-color': 'var(--disabled-color)',
diff --git a/ts/themes/variableColors.tsx b/ts/themes/variableColors.tsx
index 79d317135b..e28f11cee2 100644
--- a/ts/themes/variableColors.tsx
+++ b/ts/themes/variableColors.tsx
@@ -31,6 +31,9 @@ export type ThemeColorVariables = {
'--menu-button-background-color': string;
'--menu-button-background-hover-color': string;
'--menu-button-icon-color': string;
+ '--menu-button-icon-hover-color': string;
+ '--menu-button-border-color': string;
+ '--menu-button-border-hover-color': string;
/* Chat (Interaction) Buttons */
/* Also used for Reaction Bar Buttons */
@@ -66,6 +69,12 @@ export type ThemeColorVariables = {
'--button-solid-disabled-color': string;
'--button-solid-shadow-color': string;
+ /* Ghost */
+ '--button-ghost-background-color': string;
+ '--button-ghost-background-hover-color': string;
+ /* Ghost buttons don't change color and use a disabled pointer instead */
+ '--button-ghost-disabled-color': string;
+
/* Simple */
'--button-simple-text-color': string;
'--button-simple-disabled-color': string;
diff --git a/ts/types/LocalizerKeys.ts b/ts/types/LocalizerKeys.ts
index 14aa1aba96..6d428ce8ee 100644
--- a/ts/types/LocalizerKeys.ts
+++ b/ts/types/LocalizerKeys.ts
@@ -1,7 +1,11 @@
export type LocalizerKeys =
- | 'ByUsingThisService...'
| 'about'
| 'accept'
+ | 'accountIDCopy'
+ | 'accountIdEnter'
+ | 'accountIdEnterYourFriends'
+ | 'accountIdErrorInvalid'
+ | 'accountIdYours'
| 'activeMembers'
| 'add'
| 'addACaption'
@@ -9,7 +13,6 @@ export type LocalizerKeys =
| 'addModerator'
| 'addModerators'
| 'addingContacts'
- | 'allUsersAreRandomly...'
| 'anonymous'
| 'answeredACall'
| 'appMenuHide'
@@ -38,7 +41,6 @@ export type LocalizerKeys =
| 'autoUpdateSettingTitle'
| 'banUser'
| 'banUserAndDeleteAll'
- | 'beginYourSession'
| 'blindedMsgReqsSettingDesc'
| 'blindedMsgReqsSettingTitle'
| 'block'
@@ -101,24 +103,21 @@ export type LocalizerKeys =
| 'contactsHeader'
| 'contextMenuNoSuggestions'
| 'continue'
- | 'continueYourSession'
| 'conversationsHeader'
+ | 'conversationsNone'
| 'conversationsSettingsTitle'
| 'copiedToClipboard'
| 'copyErrorAndQuit'
| 'copyMessage'
| 'copyOpenGroupURL'
- | 'copySessionID'
| 'couldntFindServerMatching'
| 'create'
- | 'createAccount'
| 'createClosedGroupNamePrompt'
| 'createClosedGroupPlaceholder'
| 'createConversationNewContact'
| 'createConversationNewGroup'
| 'createGroup'
| 'createPassword'
- | 'createSessionID'
| 'databaseError'
| 'debugLog'
| 'debugLogExplanation'
@@ -161,8 +160,12 @@ export type LocalizerKeys =
| 'disappearingMessagesModeOutdated'
| 'disappears'
| 'displayName'
+ | 'displayNameDescription'
| 'displayNameEmpty'
+ | 'displayNameErrorDescriptionShorter'
| 'displayNameErrorNew'
+ | 'displayNameNew'
+ | 'displayNamePick'
| 'displayNameTooLong'
| 'document'
| 'documents'
@@ -191,11 +194,7 @@ export type LocalizerKeys =
| 'enterNewLineDescription'
| 'enterNewPassword'
| 'enterPassword'
- | 'enterRecoveryPhrase'
| 'enterSendNewMessageDescription'
- | 'enterSessionID'
- | 'enterSessionIDOfRecipient'
- | 'enterSessionIDOrONSName'
| 'entireAccount'
| 'error'
| 'establishingConnection'
@@ -239,12 +238,10 @@ export type LocalizerKeys =
| 'incomingError'
| 'invalidGroupNameTooLong'
| 'invalidGroupNameTooShort'
- | 'invalidNumberError'
| 'invalidOldPassword'
| 'invalidOpenGroupUrl'
| 'invalidPassword'
| 'invalidPubkeyFormat'
- | 'invalidSessionId'
| 'inviteContacts'
| 'join'
| 'joinACommunity'
@@ -271,13 +268,14 @@ export type LocalizerKeys =
| 'leaving'
| 'leftTheGroup'
| 'lightboxImageAlt'
- | 'linkDevice'
| 'linkPreviewDescription'
| 'linkPreviewsConfirmMessage'
| 'linkPreviewsTitle'
| 'linkVisitWarningMessage'
| 'linkVisitWarningTitle'
+ | 'loadAccountProgressMessage'
| 'loading'
+ | 'lockApp'
| 'mainMenuEdit'
| 'mainMenuFile'
| 'mainMenuHelp'
@@ -302,11 +300,13 @@ export type LocalizerKeys =
| 'messageDeletionForbidden'
| 'messageHash'
| 'messageInfo'
+ | 'messageNewDescription'
| 'messageRequestAccepted'
| 'messageRequestAcceptedOurs'
| 'messageRequestAcceptedOursNoName'
| 'messageRequestPending'
| 'messageRequests'
+ | 'messageRequestsAcceptDescription'
| 'messageWillDisappear'
| 'messagesHeader'
| 'moreInformation'
@@ -355,12 +355,20 @@ export type LocalizerKeys =
| 'oceanLightThemeTitle'
| 'offline'
| 'ok'
+ | 'onboardingAccountCreate'
+ | 'onboardingAccountCreated'
+ | 'onboardingAccountExists'
+ | 'onboardingBubbleWelcomeToSession'
+ | 'onboardingHitThePlusButton'
+ | 'onboardingRecoveryPassword'
+ | 'onboardingTosPrivacy'
| 'oneNonImageAtATimeToast'
| 'onionPathIndicatorDescription'
| 'onionPathIndicatorTitle'
| 'onlyAdminCanRemoveMembers'
| 'onlyAdminCanRemoveMembersDesc'
| 'onlyGroupAdminsCanChange'
+ | 'onsErrorNotRecognised'
| 'open'
| 'openGroupInvitation'
| 'openGroupURL'
@@ -371,8 +379,8 @@ export type LocalizerKeys =
| 'originalMessageNotFound'
| 'otherPlural'
| 'otherSingular'
- | 'password'
| 'passwordCharacterError'
+ | 'passwordCreate'
| 'passwordLengthError'
| 'passwordTypeError'
| 'passwordViewTitle'
@@ -391,6 +399,7 @@ export type LocalizerKeys =
| 'primaryColorPurple'
| 'primaryColorRed'
| 'primaryColorYellow'
+ | 'privacyPolicy'
| 'privacySettingsTitle'
| 'pruneSettingDescription'
| 'pruneSettingTitle'
@@ -409,12 +418,12 @@ export type LocalizerKeys =
| 'readReceiptSettingDescription'
| 'readReceiptSettingTitle'
| 'received'
- | 'recoveryPhrase'
- | 'recoveryPhraseEmpty'
- | 'recoveryPhraseRevealButtonText'
- | 'recoveryPhraseRevealMessage'
+ | 'recoveryPasswordEnter'
+ | 'recoveryPasswordErrorMessageGeneric'
+ | 'recoveryPasswordErrorMessageIncorrect'
+ | 'recoveryPasswordErrorMessageShort'
+ | 'recoveryPasswordWarningSendDescription'
| 'recoveryPhraseSavePromptMain'
- | 'recoveryPhraseSecureTitle'
| 'remove'
| 'removeAccountPasswordDescription'
| 'removeAccountPasswordTitle'
@@ -432,11 +441,11 @@ export type LocalizerKeys =
| 'requestsSubtitle'
| 'resend'
| 'resolution'
- | 'respondingToRequestWarning'
- | 'restoreUsingRecoveryPhrase'
| 'ringing'
| 'save'
| 'saveLogToDesktop'
+ | 'saveRecoveryPassword'
+ | 'saveRecoveryPasswordDescription'
| 'saved'
| 'savedMessages'
| 'savedTheFile'
@@ -446,15 +455,13 @@ export type LocalizerKeys =
| 'selectMessage'
| 'sendFailed'
| 'sendMessage'
- | 'sendRecoveryPhraseMessage'
- | 'sendRecoveryPhraseTitle'
| 'sending'
| 'sent'
| 'serverId'
| 'sessionMessenger'
+ | 'sessionRecoveryPassword'
| 'set'
| 'setAccountPasswordDescription'
- | 'setAccountPasswordTitle'
| 'setDisplayPicture'
| 'setPassword'
| 'setPasswordFail'
@@ -467,8 +474,6 @@ export type LocalizerKeys =
| 'shareBugDetails'
| 'show'
| 'showDebugLog'
- | 'showRecoveryPhrase'
- | 'showRecoveryPhrasePasswordRequest'
| 'showUserDetails'
| 'someOfYourDeviceUseOutdatedVersion'
| 'spellCheckDescription'
@@ -479,10 +484,10 @@ export type LocalizerKeys =
| 'startConversation'
| 'startInTrayDescription'
| 'startInTrayTitle'
- | 'startNewConversationBy...'
| 'startedACall'
| 'support'
| 'surveyTitle'
+ | 'termsOfService'
| 'themesSettingTitle'
| 'theyChangedTheTimer'
| 'theyChangedTheTimerLegacy'
@@ -549,6 +554,8 @@ export type LocalizerKeys =
| 'unreadMessages'
| 'updateGroupDialogTitle'
| 'updatedTheGroup'
+ | 'urlOpen'
+ | 'urlOpenBrowser'
| 'userAddedToModerators'
| 'userBanFailed'
| 'userBanned'
@@ -563,6 +570,8 @@ export type LocalizerKeys =
| 'viewMenuZoomIn'
| 'viewMenuZoomOut'
| 'voiceMessage'
+ | 'waitOneMoment'
+ | 'warning'
| 'welcomeToYourSession'
| 'windowMenuClose'
| 'windowMenuMinimize'
@@ -577,6 +586,4 @@ export type LocalizerKeys =
| 'youHaveANewFriendRequest'
| 'youLeftTheGroup'
| 'youSetYourDisappearingMessages'
- | 'yourSessionID'
- | 'yourUniqueSessionID'
| 'zoomFactorSettingTitle';
diff --git a/ts/types/ReduxTypes.d.ts b/ts/types/ReduxTypes.d.ts
index d744b0f140..e00b2b394e 100644
--- a/ts/types/ReduxTypes.d.ts
+++ b/ts/types/ReduxTypes.d.ts
@@ -11,7 +11,7 @@ export type SessionSettingCategory =
| 'appearance'
| 'permissions'
| 'help'
- | 'recoveryPhrase'
+ | 'recoveryPassword'
| 'clearData';
export type PasswordAction = 'set' | 'change' | 'remove' | 'enter';
diff --git a/ts/util/accountManager.ts b/ts/util/accountManager.ts
index dcdb12e1a4..3a4cbf0567 100644
--- a/ts/util/accountManager.ts
+++ b/ts/util/accountManager.ts
@@ -1,23 +1,19 @@
+import { isEmpty } from 'lodash';
import { getConversationController } from '../session/conversations';
import { getSodiumRenderer } from '../session/crypto';
import { fromArrayBufferToBase64, fromHex, toHex } from '../session/utils/String';
-import { getOurPubKeyStrFromCache } from '../session/utils/User';
-import { trigger } from '../shims/events';
+import { configurationMessageReceived, trigger } from '../shims/events';
-import { actions as userActions } from '../state/ducks/user';
-import { mnDecode, mnEncode } from '../session/crypto/mnemonic';
import { SettingsKey } from '../data/settings-key';
-import {
- saveRecoveryPhrase,
- setLastProfileUpdateTimestamp,
- setLocalPubKey,
- setSignInByLinking,
- Storage,
-} from './storage';
-import { Registration } from './registration';
import { ConversationTypeEnum } from '../models/conversationAttributes';
import { SessionKeyPair } from '../receiver/keypairs';
+import { getSwarmPollingInstance } from '../session/apis/snode_api';
+import { mnDecode, mnEncode } from '../session/crypto/mnemonic';
+import { getOurPubKeyStrFromCache } from '../session/utils/User';
import { LibSessionUtil } from '../session/utils/libsession/libsession_utils';
+import { actions as userActions } from '../state/ducks/user';
+import { Registration } from './registration';
+import { Storage, saveRecoveryPhrase, setLocalPubKey, setSignInByLinking } from './storage';
/**
* Might throw
@@ -60,71 +56,83 @@ const generateKeypair = async (
};
/**
- * Sign in with a recovery phrase. We won't try to recover an existing profile name
- * @param mnemonic the mnemonic the user duly saved in a safe place. We will restore his sessionID based on this.
- * @param mnemonicLanguage 'english' only is supported
- * @param profileName the displayName to use for this user
+ * This registers a user account. It can also be used if an account restore fails and the user instead registers a new display name
+ * @param mnemonic The mnemonic generated on first app loading and to use for this brand new user
+ * @param mnemonicLanguage only 'english' is supported
+ * @param displayName the display name to register, character limit is MAX_NAME_LENGTH_BYTES
+ * @param registerCallback when restoring an account, registration completion is handled elsewhere so we need to pass the pubkey back up to the caller
*/
-export async function signInWithRecovery(
- mnemonic: string,
+export async function registerSingleDevice(
+ generatedMnemonic: string,
mnemonicLanguage: string,
- profileName: string
+ displayName: string,
+ registerCallback?: (pubkey: string) => Promise
) {
- return registerSingleDevice(mnemonic, mnemonicLanguage, profileName);
-}
-
-/**
- * Sign in with a recovery phrase but trying to recover display name and avatar from the first encountered configuration message.
- * @param mnemonic the mnemonic the user duly saved in a safe place. We will restore his sessionID based on this.
- * @param mnemonicLanguage 'english' only is supported
- */
-export async function signInByLinkingDevice(mnemonic: string, mnemonicLanguage: string) {
- if (!mnemonic) {
+ if (isEmpty(generatedMnemonic)) {
throw new Error('Session always needs a mnemonic. Either generated or given by the user');
}
- if (!mnemonicLanguage) {
- throw new Error('We always needs a mnemonicLanguage');
+ if (isEmpty(mnemonicLanguage)) {
+ throw new Error('We always need a mnemonicLanguage');
+ }
+ if (isEmpty(displayName)) {
+ throw new Error('We always need a displayName');
}
- const identityKeyPair = await generateKeypair(mnemonic, mnemonicLanguage);
- await setSignInByLinking(true);
+ const identityKeyPair = await generateKeypair(generatedMnemonic, mnemonicLanguage);
+
await createAccount(identityKeyPair);
- await saveRecoveryPhrase(mnemonic);
+ await saveRecoveryPhrase(generatedMnemonic);
+
const pubKeyString = toHex(identityKeyPair.pubKey);
+ if (isEmpty(pubKeyString)) {
+ throw new Error("We don't have a pubkey from the recovery password...");
+ }
- // await for the first configuration message to come in.
- await registrationDone(pubKeyString, '');
- return pubKeyString;
+ if (registerCallback) {
+ await registerCallback(pubKeyString);
+ } else {
+ await registrationDone(pubKeyString, displayName);
+ }
}
+
/**
- * This is a signup. User has no recovery and does not try to link a device
- * @param mnemonic The mnemonic generated on first app loading and to use for this brand new user
- * @param mnemonicLanguage only 'english' is supported
- * @param profileName the display name to register toi
+ * Restores a users account with their recovery password and try to recover display name and avatar from the first encountered configuration message.
+ * @param mnemonic the mnemonic the user duly saved in a safe place. We will restore his sessionID based on this.
+ * @param mnemonicLanguage 'english' only is supported
+ * @param loadingAnimationCallback a callback to trigger a loading animation while fetching
+ *
+ * @returns the display name of the user if found on the network
*/
-export async function registerSingleDevice(
- generatedMnemonic: string,
+export async function signInByLinkingDevice(
+ mnemonic: string,
mnemonicLanguage: string,
- profileName: string
+ abortSignal?: AbortSignal
) {
- if (!generatedMnemonic) {
+ if (isEmpty(mnemonic)) {
throw new Error('Session always needs a mnemonic. Either generated or given by the user');
}
- if (!profileName) {
- throw new Error('We always needs a profileName');
- }
- if (!mnemonicLanguage) {
- throw new Error('We always needs a mnemonicLanguage');
+ if (isEmpty(mnemonicLanguage)) {
+ throw new Error('We always need a mnemonicLanguage');
}
- const identityKeyPair = await generateKeypair(generatedMnemonic, mnemonicLanguage);
+ const identityKeyPair = await generateKeypair(mnemonic, mnemonicLanguage);
+ await setSignInByLinking(true);
await createAccount(identityKeyPair);
- await saveRecoveryPhrase(generatedMnemonic);
- await setLastProfileUpdateTimestamp(Date.now());
+ await saveRecoveryPhrase(mnemonic);
const pubKeyString = toHex(identityKeyPair.pubKey);
- await registrationDone(pubKeyString, profileName);
+
+ if (isEmpty(pubKeyString)) {
+ throw new Error("We don't have a pubkey from the recovery password...");
+ }
+
+ const displayName = await getSwarmPollingInstance().pollOnceForOurDisplayName(abortSignal);
+
+ // NOTE the registration is not yet finished until the configurationMessageReceived event has been processed
+ trigger(configurationMessageReceived, pubKeyString, displayName);
+ // for testing purposes
+ return { displayName, pubKeyString };
}
export async function generateMnemonic() {
@@ -177,12 +185,14 @@ async function createAccount(identityKeyPair: SessionKeyPair) {
}
/**
- *
+ * When a user sucessfully registers, we need to initialise the libession wrappers and create a conversation for the user
* @param ourPubkey the pubkey recovered from the seed
- * @param displayName the display name entered by the user, if any. This is not a display name found from a config message in the network.
+ * @param displayName the display name entered by the user. Can be what is fetched from the last config message or what is entered manually by the user
*/
-async function registrationDone(ourPubkey: string, displayName: string) {
- window?.log?.info(`registration done with user provided displayName "${displayName}"`);
+export async function registrationDone(ourPubkey: string, displayName: string) {
+ window?.log?.info(
+ `[onboarding] registration done with user provided displayName "${displayName}" and pubkey "${ourPubkey}"`
+ );
// initializeLibSessionUtilWrappers needs our publicKey to be set
await Storage.put('primaryDevicePubKey', ourPubkey);
@@ -191,8 +201,13 @@ async function registrationDone(ourPubkey: string, displayName: string) {
try {
await LibSessionUtil.initializeLibSessionUtilWrappers();
} catch (e) {
- window.log.warn('LibSessionUtil.initializeLibSessionUtilWrappers failed with', e.message);
+ window.log.warn(
+ '[onboarding] registration done but LibSessionUtil.initializeLibSessionUtilWrappers failed with',
+ e.message || e
+ );
+ throw e;
}
+
// Ensure that we always have a conversation for ourself
const conversation = await getConversationController().getOrCreateAndWait(
ourPubkey,
@@ -213,7 +228,7 @@ async function registrationDone(ourPubkey: string, displayName: string) {
};
window.inboxStore?.dispatch(userActions.userChanged(user));
- window?.log?.info('dispatching registration event');
- // this will make the poller start fetching messages, needed to find a configuration message
+ window?.log?.info('[onboarding] dispatching registration event');
+ // this will make the poller start fetching messages
trigger('registration_done');
}
diff --git a/ts/util/storage.ts b/ts/util/storage.ts
index 5710d30bcd..cf87cf422d 100644
--- a/ts/util/storage.ts
+++ b/ts/util/storage.ts
@@ -47,7 +47,7 @@ function get(key: string, defaultValue?: ValueType) {
async function remove(key: string) {
if (!ready) {
- window.log.warn('Called storage.get before storage is ready. key:', key);
+ window.log.warn('Called storage.remove before storage is ready. key:', key);
}
delete items[key];
@@ -113,10 +113,13 @@ export function isSignInByLinking() {
return isByLinking;
}
+/** this is a loading state to prevent config sync jobs while we are trying to sign in through link a device. It should be set to false after the linking is complete */
export async function setSignInByLinking(isLinking: boolean) {
await put('is_sign_in_by_linking', isLinking);
}
+/** if we sign in with an existing recovery password, then we don't need to show any of the onboarding ui once we login
+ */
export function isSignWithRecoveryPhrase() {
const isRecoveryPhraseUsed = get('is_sign_in_recovery_phrase');
if (isRecoveryPhraseUsed === undefined) {
@@ -129,10 +132,6 @@ export async function setSignWithRecoveryPhrase(isRecoveryPhraseUsed: boolean) {
await put('is_sign_in_recovery_phrase', isRecoveryPhraseUsed);
}
-export function getLastProfileUpdateTimestamp() {
- return get('last_profile_update_timestamp');
-}
-
export async function setLastProfileUpdateTimestamp(lastUpdateTimestamp: number) {
if (await ReleasedFeatures.checkIsUserConfigFeatureReleased()) {
return;
diff --git a/ts/webworker/workers/browser/libsession_worker_functions.d.ts b/ts/webworker/workers/browser/libsession_worker_functions.d.ts
index 4cb0048163..f64f5426d8 100644
--- a/ts/webworker/workers/browser/libsession_worker_functions.d.ts
+++ b/ts/webworker/workers/browser/libsession_worker_functions.d.ts
@@ -1,9 +1,9 @@
import {
BaseConfigActions,
ContactsConfigActionsType,
+ ConvoInfoVolatileConfigActionsType,
UserConfigActionsType,
UserGroupsConfigActionsType,
- ConvoInfoVolatileConfigActionsType,
} from 'libsession_util_nodejs';
// we can only have one of those wrapper for our current user (but we can have a few configs for it to be merged into one)
diff --git a/ts/webworker/workers/browser/libsession_worker_interface.ts b/ts/webworker/workers/browser/libsession_worker_interface.ts
index 4c463578c5..b9476dd4b3 100644
--- a/ts/webworker/workers/browser/libsession_worker_interface.ts
+++ b/ts/webworker/workers/browser/libsession_worker_interface.ts
@@ -46,6 +46,11 @@ export const GenericWrapperActions = {
) =>
/** base wrapper generic actions */
callLibSessionWorker([wrapperId, 'init', ed25519Key, dump]) as Promise,
+ /** This function is used to free wrappers from memory only.
+ *
+ * See freeUserWrapper() in libsession.worker.ts */
+ free: async (wrapperId: ConfigWrapperObjectTypes) =>
+ callLibSessionWorker([wrapperId, 'free']) as Promise,
confirmPushed: async (wrapperId: ConfigWrapperObjectTypes, seqno: number, hash: string) =>
callLibSessionWorker([wrapperId, 'confirmPushed', seqno, hash]) as ReturnType<
BaseWrapperActionsCalls['confirmPushed']
@@ -87,6 +92,7 @@ export const UserConfigWrapperActions: UserConfigWrapperActionsCalls = {
/* Reuse the GenericWrapperActions with the UserConfig argument */
init: async (ed25519Key: Uint8Array, dump: Uint8Array | null) =>
GenericWrapperActions.init('UserConfig', ed25519Key, dump),
+ free: async () => GenericWrapperActions.free('UserConfig'),
confirmPushed: async (seqno: number, hash: string) =>
GenericWrapperActions.confirmPushed('UserConfig', seqno, hash),
dump: async () => GenericWrapperActions.dump('UserConfig'),
@@ -135,6 +141,7 @@ export const ContactsWrapperActions: ContactsWrapperActionsCalls = {
/* Reuse the GenericWrapperActions with the ContactConfig argument */
init: async (ed25519Key: Uint8Array, dump: Uint8Array | null) =>
GenericWrapperActions.init('ContactsConfig', ed25519Key, dump),
+ free: async () => GenericWrapperActions.free('ContactsConfig'),
confirmPushed: async (seqno: number, hash: string) =>
GenericWrapperActions.confirmPushed('ContactsConfig', seqno, hash),
dump: async () => GenericWrapperActions.dump('ContactsConfig'),
@@ -171,6 +178,7 @@ export const UserGroupsWrapperActions: UserGroupsWrapperActionsCalls = {
/* Reuse the GenericWrapperActions with the ContactConfig argument */
init: async (ed25519Key: Uint8Array, dump: Uint8Array | null) =>
GenericWrapperActions.init('UserGroupsConfig', ed25519Key, dump),
+ free: async () => GenericWrapperActions.free('UserGroupsConfig'),
confirmPushed: async (seqno: number, hash: string) =>
GenericWrapperActions.confirmPushed('UserGroupsConfig', seqno, hash),
dump: async () => GenericWrapperActions.dump('UserGroupsConfig'),
@@ -244,6 +252,7 @@ export const ConvoInfoVolatileWrapperActions: ConvoInfoVolatileWrapperActionsCal
/* Reuse the GenericWrapperActions with the ContactConfig argument */
init: async (ed25519Key: Uint8Array, dump: Uint8Array | null) =>
GenericWrapperActions.init('ConvoInfoVolatileConfig', ed25519Key, dump),
+ free: async () => GenericWrapperActions.free('ConvoInfoVolatileConfig'),
confirmPushed: async (seqno: number, hash: string) =>
GenericWrapperActions.confirmPushed('ConvoInfoVolatileConfig', seqno, hash),
dump: async () => GenericWrapperActions.dump('ConvoInfoVolatileConfig'),
diff --git a/ts/webworker/workers/node/libsession/libsession.worker.ts b/ts/webworker/workers/node/libsession/libsession.worker.ts
index 75100a511a..c842f9cef9 100644
--- a/ts/webworker/workers/node/libsession/libsession.worker.ts
+++ b/ts/webworker/workers/node/libsession/libsession.worker.ts
@@ -1,6 +1,5 @@
/* eslint-disable consistent-return */
/* eslint-disable no-case-declarations */
-import { isEmpty, isNull } from 'lodash';
import {
BaseConfigWrapperNode,
ContactsConfigWrapperNode,
@@ -8,6 +7,7 @@ import {
UserConfigWrapperNode,
UserGroupsWrapperNode,
} from 'libsession_util_nodejs';
+import { isEmpty, isNull } from 'lodash';
// eslint-disable-next-line import/no-unresolved, import/extensions
import { ConfigWrapperObjectTypes } from '../../browser/libsession_worker_functions';
@@ -119,6 +119,37 @@ function initUserWrapper(options: Array, wrapperType: ConfigWrapperObjectTy
}
}
+/**
+ * This function is used to free wrappers from memory only
+ *
+ * NOTE only use this function for wrappers that have not been saved to the database.
+ *
+ * EXAMPLE When restoring an account and fetching the display name of a user. We want to fetch a UserProfile config message and make a temporary wrapper for it in order to look up the display name.
+ */
+function freeUserWrapper(wrapperType: ConfigWrapperObjectTypes) {
+ const userWrapperType = assertUserWrapperType(wrapperType);
+
+ switch (userWrapperType) {
+ case 'UserConfig':
+ userProfileWrapper = undefined;
+ break;
+ case 'ContactsConfig':
+ contactsConfigWrapper = undefined;
+ break;
+ case 'UserGroupsConfig':
+ userGroupsConfigWrapper = undefined;
+ break;
+ case 'ConvoInfoVolatileConfig':
+ convoInfoVolatileConfigWrapper = undefined;
+ break;
+ default:
+ assertUnreachable(
+ userWrapperType,
+ `freeUserWrapper: Missing case error "${userWrapperType}"`
+ );
+ }
+}
+
onmessage = async (e: { data: [number, ConfigWrapperObjectTypes, string, ...any] }) => {
const [jobId, config, action, ...args] = e.data;
@@ -128,6 +159,13 @@ onmessage = async (e: { data: [number, ConfigWrapperObjectTypes, string, ...any]
postMessage([jobId, null, null]);
return;
}
+
+ if (action === 'free') {
+ freeUserWrapper(config);
+ postMessage([jobId, null, null]);
+ return;
+ }
+
const wrapper = getCorrespondingWrapper(config);
const fn = (wrapper as any)[action];
diff --git a/ts/window.d.ts b/ts/window.d.ts
index b90a6b03b8..101125ff7d 100644
--- a/ts/window.d.ts
+++ b/ts/window.d.ts
@@ -1,6 +1,8 @@
// eslint-disable-next-line import/no-unresolved
import {} from 'styled-components/cssprop';
+import { Store } from '@reduxjs/toolkit';
+import { Persistor } from 'redux-persist/es/types';
import { LocalizerType } from './types/Util';
import { ConversationCollection } from './models/conversation';
diff --git a/tsconfig.json b/tsconfig.json
index a47a46a27f..5d7b415cdd 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -7,7 +7,7 @@
"dom", // Required to access `window`
"es2021"
],
- "jsx": "react", // Specify JSX code generation: 'preserve', 'react-native', or 'react'.
+ "jsx": "react-jsx", // Specify JSX code generation: 'preserve', 'react-native', or 'react-jsx'.
// "noEmitHelpers": false,
"rootDir": "./", // Specify the root directory of input files. Use to control the output directory structure with --outDir
"removeComments": true, // Do not emit comments to output.
diff --git a/yarn.lock b/yarn.lock
index 7c2d431cca..3ad51a61e8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -702,15 +702,15 @@
to-fast-properties "^2.0.0"
"@commitlint/cli@^17.7.1":
- version "17.7.1"
- resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.7.1.tgz#f3ab35bd38d82fcd4ab03ec5a1e9db26d57fe1b0"
- integrity sha512-BCm/AT06SNCQtvFv921iNhudOHuY16LswT0R3OeolVGLk8oP+Rk9TfQfgjH7QPMjhvp76bNqGFEcpKojxUNW1g==
- dependencies:
- "@commitlint/format" "^17.4.4"
- "@commitlint/lint" "^17.7.0"
- "@commitlint/load" "^17.7.1"
- "@commitlint/read" "^17.5.1"
- "@commitlint/types" "^17.4.4"
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.8.1.tgz#10492114a022c91dcfb1d84dac773abb3db76d33"
+ integrity sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==
+ dependencies:
+ "@commitlint/format" "^17.8.1"
+ "@commitlint/lint" "^17.8.1"
+ "@commitlint/load" "^17.8.1"
+ "@commitlint/read" "^17.8.1"
+ "@commitlint/types" "^17.8.1"
execa "^5.0.0"
lodash.isfunction "^3.0.9"
resolve-from "5.0.0"
@@ -718,73 +718,73 @@
yargs "^17.0.0"
"@commitlint/config-conventional@^17.7.0":
- version "17.7.0"
- resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.7.0.tgz#1bbf2bce7851db63c1a8aa8d924277ad4938247e"
- integrity sha512-iicqh2o6et+9kWaqsQiEYZzfLbtoWv9uZl8kbI8EGfnc0HeGafQBF7AJ0ylN9D/2kj6txltsdyQs8+2fTMwWEw==
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz#e5bcf0cfec8da7ac50bc04dc92e0a4ea74964ce0"
+ integrity sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==
dependencies:
conventional-changelog-conventionalcommits "^6.1.0"
-"@commitlint/config-validator@^17.6.7":
- version "17.6.7"
- resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.6.7.tgz#c664d42a1ecf5040a3bb0843845150f55734df41"
- integrity sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==
+"@commitlint/config-validator@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.8.1.tgz#5cc93b6b49d5524c9cc345a60e5bf74bcca2b7f9"
+ integrity sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==
dependencies:
- "@commitlint/types" "^17.4.4"
+ "@commitlint/types" "^17.8.1"
ajv "^8.11.0"
-"@commitlint/ensure@^17.6.7":
- version "17.6.7"
- resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.6.7.tgz#77a77a0c05e6a1c34589f59e82e6cb937101fc4b"
- integrity sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==
+"@commitlint/ensure@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.8.1.tgz#59183557844999dbb6aab6d03629a3d104d01a8d"
+ integrity sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==
dependencies:
- "@commitlint/types" "^17.4.4"
+ "@commitlint/types" "^17.8.1"
lodash.camelcase "^4.3.0"
lodash.kebabcase "^4.1.1"
lodash.snakecase "^4.1.1"
lodash.startcase "^4.4.0"
lodash.upperfirst "^4.3.1"
-"@commitlint/execute-rule@^17.4.0":
- version "17.4.0"
- resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939"
- integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==
+"@commitlint/execute-rule@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz#504ed69eb61044eeb84fdfd10cc18f0dab14f34c"
+ integrity sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==
-"@commitlint/format@^17.4.4":
- version "17.4.4"
- resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.4.4.tgz#0f6e1b4d7a301c7b1dfd4b6334edd97fc050b9f5"
- integrity sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==
+"@commitlint/format@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.8.1.tgz#6108bb6b4408e711006680649927e1b559bdc5f8"
+ integrity sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==
dependencies:
- "@commitlint/types" "^17.4.4"
+ "@commitlint/types" "^17.8.1"
chalk "^4.1.0"
-"@commitlint/is-ignored@^17.7.0":
- version "17.7.0"
- resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz#df9b284420bdb1aed5fdb2be44f4e98cc4826014"
- integrity sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==
+"@commitlint/is-ignored@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz#cf25bcd8409c79684b63f8bdeb35df48edda244e"
+ integrity sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==
dependencies:
- "@commitlint/types" "^17.4.4"
+ "@commitlint/types" "^17.8.1"
semver "7.5.4"
-"@commitlint/lint@^17.7.0":
- version "17.7.0"
- resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.7.0.tgz#33f831298dc43679e4de6b088aea63d1f884c7e7"
- integrity sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA==
- dependencies:
- "@commitlint/is-ignored" "^17.7.0"
- "@commitlint/parse" "^17.7.0"
- "@commitlint/rules" "^17.7.0"
- "@commitlint/types" "^17.4.4"
-
-"@commitlint/load@^17.7.1":
- version "17.7.1"
- resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.7.1.tgz#0723b11723a20043a304a74960602dead89b5cdd"
- integrity sha512-S/QSOjE1ztdogYj61p6n3UbkUvweR17FQ0zDbNtoTLc+Hz7vvfS7ehoTMQ27hPSjVBpp7SzEcOQu081RLjKHJQ==
- dependencies:
- "@commitlint/config-validator" "^17.6.7"
- "@commitlint/execute-rule" "^17.4.0"
- "@commitlint/resolve-extends" "^17.6.7"
- "@commitlint/types" "^17.4.4"
- "@types/node" "20.4.7"
+"@commitlint/lint@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.8.1.tgz#bfc21215f6b18d41d4d43e2aa3cb79a5d7726cd8"
+ integrity sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==
+ dependencies:
+ "@commitlint/is-ignored" "^17.8.1"
+ "@commitlint/parse" "^17.8.1"
+ "@commitlint/rules" "^17.8.1"
+ "@commitlint/types" "^17.8.1"
+
+"@commitlint/load@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.8.1.tgz#fa061e7bfa53281eb03ca8517ca26d66a189030c"
+ integrity sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==
+ dependencies:
+ "@commitlint/config-validator" "^17.8.1"
+ "@commitlint/execute-rule" "^17.8.1"
+ "@commitlint/resolve-extends" "^17.8.1"
+ "@commitlint/types" "^17.8.1"
+ "@types/node" "20.5.1"
chalk "^4.1.0"
cosmiconfig "^8.0.0"
cosmiconfig-typescript-loader "^4.0.0"
@@ -793,72 +793,72 @@
lodash.uniq "^4.5.0"
resolve-from "^5.0.0"
ts-node "^10.8.1"
- typescript "^4.6.4 || ^5.0.0"
+ typescript "^4.6.4 || ^5.2.2"
-"@commitlint/message@^17.4.2":
- version "17.4.2"
- resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.4.2.tgz#f4753a79701ad6db6db21f69076e34de6580e22c"
- integrity sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==
+"@commitlint/message@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.8.1.tgz#a5cd226c419be20ee03c3d237db6ac37b95958b3"
+ integrity sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==
-"@commitlint/parse@^17.7.0":
- version "17.7.0"
- resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.7.0.tgz#aacb2d189e50ab8454154b1df150aaf20478ae47"
- integrity sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==
+"@commitlint/parse@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.8.1.tgz#6e00b8f50ebd63562d25dcf4230da2c9f984e626"
+ integrity sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==
dependencies:
- "@commitlint/types" "^17.4.4"
+ "@commitlint/types" "^17.8.1"
conventional-changelog-angular "^6.0.0"
conventional-commits-parser "^4.0.0"
-"@commitlint/read@^17.5.1":
- version "17.5.1"
- resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.5.1.tgz#fec903b766e2c41e3cefa80630040fcaba4f786c"
- integrity sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==
+"@commitlint/read@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.8.1.tgz#b3f28777607c756078356cc133368b0e8c08092f"
+ integrity sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==
dependencies:
- "@commitlint/top-level" "^17.4.0"
- "@commitlint/types" "^17.4.4"
+ "@commitlint/top-level" "^17.8.1"
+ "@commitlint/types" "^17.8.1"
fs-extra "^11.0.0"
git-raw-commits "^2.0.11"
minimist "^1.2.6"
-"@commitlint/resolve-extends@^17.6.7":
- version "17.6.7"
- resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz#9c53a4601c96ab2dd20b90fb35c988639307735d"
- integrity sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==
+"@commitlint/resolve-extends@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz#9af01432bf2fd9ce3dd5a00d266cce14e4c977e7"
+ integrity sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==
dependencies:
- "@commitlint/config-validator" "^17.6.7"
- "@commitlint/types" "^17.4.4"
+ "@commitlint/config-validator" "^17.8.1"
+ "@commitlint/types" "^17.8.1"
import-fresh "^3.0.0"
lodash.mergewith "^4.6.2"
resolve-from "^5.0.0"
resolve-global "^1.0.0"
-"@commitlint/rules@^17.7.0":
- version "17.7.0"
- resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.7.0.tgz#b97a4933c5cba11a659a19ee467f6f000f31533e"
- integrity sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==
+"@commitlint/rules@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.8.1.tgz#da49cab1b7ebaf90d108de9f58f684dc4ccb65a0"
+ integrity sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==
dependencies:
- "@commitlint/ensure" "^17.6.7"
- "@commitlint/message" "^17.4.2"
- "@commitlint/to-lines" "^17.4.0"
- "@commitlint/types" "^17.4.4"
+ "@commitlint/ensure" "^17.8.1"
+ "@commitlint/message" "^17.8.1"
+ "@commitlint/to-lines" "^17.8.1"
+ "@commitlint/types" "^17.8.1"
execa "^5.0.0"
-"@commitlint/to-lines@^17.4.0":
- version "17.4.0"
- resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.4.0.tgz#9bd02e911e7d4eab3fb4a50376c4c6d331e10d8d"
- integrity sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==
+"@commitlint/to-lines@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.8.1.tgz#a5c4a7cf7dff3dbdd69289fc0eb19b66f3cfe017"
+ integrity sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==
-"@commitlint/top-level@^17.4.0":
- version "17.4.0"
- resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.4.0.tgz#540cac8290044cf846fbdd99f5cc51e8ac5f27d6"
- integrity sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==
+"@commitlint/top-level@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.8.1.tgz#206d37d6782f33c9572e44fbe3758392fdeea7bc"
+ integrity sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==
dependencies:
find-up "^5.0.0"
-"@commitlint/types@^17.4.4":
- version "17.4.4"
- resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.4.tgz#1416df936e9aad0d6a7bbc979ecc31e55dade662"
- integrity sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==
+"@commitlint/types@^17.4.4", "@commitlint/types@^17.8.1":
+ version "17.8.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.8.1.tgz#883a0ad35c5206d5fef7bc6ce1bbe648118af44e"
+ integrity sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==
dependencies:
chalk "^4.1.0"
@@ -898,9 +898,9 @@
global-agent "^3.0.0"
"@electron/notarize@^2.1.0":
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3"
- integrity sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.3.0.tgz#9659cf6c92563dd69411afce229f52f9f7196227"
+ integrity sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w==
dependencies:
debug "^4.1.1"
fs-extra "^9.0.1"
@@ -959,9 +959,9 @@
eslint-visitor-keys "^3.3.0"
"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
- version "4.8.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005"
- integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
+ integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
"@eslint/eslintrc@^2.1.4":
version "2.1.4"
@@ -1010,19 +1010,21 @@
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
"@humanwhocodes/object-schema@^2.0.2":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917"
- integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
+ integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
-"@iconify/icons-mdi@~1.1.0":
- version "1.1.47"
- resolved "https://registry.yarnpkg.com/@iconify/icons-mdi/-/icons-mdi-1.1.47.tgz#4bbe1e5d126de7acde05a66addd869c66bd97ca0"
- integrity sha512-6AZfvWru20Rl9pXULStkVvTWnua6VG56zOIKdkCzLh25XVeTDEp6f1dL7iX9w+way5+1hI0BBuqTQd61qYaKdg==
+"@iconify/react@^4.1.1":
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/@iconify/react/-/react-4.1.1.tgz#da1bf03cdca9427f07cf22cf5b63fa8f02db4722"
+ integrity sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==
+ dependencies:
+ "@iconify/types" "^2.0.0"
-"@iconify/react@^3.1.3":
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/@iconify/react/-/react-3.2.2.tgz#ab5241dc01562076bae3b0c22238aff7e5f029cc"
- integrity sha512-z3+Jno3VcJzgNHsN5mEvYMsgCkOZkydqdIwOxjXh45+i2Vs9RGH68Y52vt39izwFSfuYUXhaW+1u7m7+IhCn/g==
+"@iconify/types@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57"
+ integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==
"@isaacs/ttlcache@^1.4.1":
version "1.4.1"
@@ -1088,7 +1090,7 @@
"@types/yargs" "^17.0.8"
chalk "^4.0.0"
-"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5":
+"@jridgewell/gen-mapping@^0.3.5":
version "0.3.5"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
@@ -1098,9 +1100,9 @@
"@jridgewell/trace-mapping" "^0.3.24"
"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0":
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
- integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
"@jridgewell/set-array@^1.2.1":
version "1.2.1"
@@ -1108,14 +1110,14 @@
integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
"@jridgewell/source-map@^0.3.3":
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91"
- integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a"
+ integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==
dependencies:
- "@jridgewell/gen-mapping" "^0.3.0"
- "@jridgewell/trace-mapping" "^0.3.9"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
-"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15":
version "1.4.15"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
@@ -1128,7 +1130,7 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
-"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9":
+"@jridgewell/trace-mapping@^0.3.20", "@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==
@@ -1137,9 +1139,9 @@
"@jridgewell/sourcemap-codec" "^1.4.14"
"@jsdoc/salty@^0.2.1":
- version "0.2.5"
- resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.5.tgz#1b2fa5bb8c66485b536d86eee877c263d322f692"
- integrity sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.7.tgz#98ddce519fd95d7bee605a658fabf6e8cbf7556d"
+ integrity sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==
dependencies:
lodash "^4.17.21"
@@ -1558,9 +1560,9 @@
integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
"@signalapp/better-sqlite3@^8.4.3":
- version "8.5.2"
- resolved "https://registry.yarnpkg.com/@signalapp/better-sqlite3/-/better-sqlite3-8.5.2.tgz#910669f44e76a46d06df45fabefcd3ac2e7c4cce"
- integrity sha512-t7XalDxuRP115EratM6i1kbvIXJvzETcl8wqnt3NlWZdzil7kelS/RYz+PE1G+z8ZwtFyn/ViAFMt76AsArifw==
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/@signalapp/better-sqlite3/-/better-sqlite3-8.7.1.tgz#0a09293aa833b836ec6b17f6ab0e790097f3fdeb"
+ integrity sha512-T/7OXR0RfSJ8jXK837wXmad0c4XESBHoGDCLDZFTrd4l0nzfbTxEbXo6VCvUyxDTGrKUfIHCo5JtffIl8jQL5Q==
dependencies:
bindings "^1.5.0"
tar "^6.1.0"
@@ -1638,9 +1640,9 @@
integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
"@tsconfig/node10@^1.0.7":
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
- integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
+ integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
"@tsconfig/node12@^1.0.7":
version "1.0.11"
@@ -1671,23 +1673,23 @@
integrity sha512-e7s6CdDCUoBQdCe62Q6OS+DF68M8+ABxCEMh2Isjt4Fl3xuddljCHMN8mak48AMSVGGwUUtNRaZbkzgL5PEWew==
"@types/buffer-crc32@^0.2.0":
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/@types/buffer-crc32/-/buffer-crc32-0.2.2.tgz#e115de47913ce34cc2662be43d708d8bef874ab7"
- integrity sha512-UpJyUKgG33LVehYtv9k2x4HUEY5ThV62YNGFBbQNBgtoky/0tQCceh8BPI9r3XL5hQ1tGmq34jGWNRBKf2P1UQ==
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/@types/buffer-crc32/-/buffer-crc32-0.2.4.tgz#d70dbf4d968fe98913324d580934b8fb0c857512"
+ integrity sha512-GSrhSZOK1/wazf2CjDp3CVJQKWzSc5Ugq3NyZ/RQqg1MWtmA9mAT6i6LzGKhzcRxDOl8aLB+AzvObDSlrMpvLw==
dependencies:
"@types/node" "*"
"@types/bunyan@^1.8.8":
- version "1.8.8"
- resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.8.tgz#8d6d33f090f37c07e2a80af30ae728450a101008"
- integrity sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==
+ version "1.8.11"
+ resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.11.tgz#0b9e7578a5aa2390faf12a460827154902299638"
+ integrity sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==
dependencies:
"@types/node" "*"
"@types/bytebuffer@^5.0.41":
- version "5.0.44"
- resolved "https://registry.yarnpkg.com/@types/bytebuffer/-/bytebuffer-5.0.44.tgz#553015fb34db1fc3eb3f7b232bff91c006c251a1"
- integrity sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==
+ version "5.0.48"
+ resolved "https://registry.yarnpkg.com/@types/bytebuffer/-/bytebuffer-5.0.48.tgz#0e6b0e8b8dbafde3314148ed378b8aed6eaac4f1"
+ integrity sha512-ormKm68NtTOtR8C/4jyRJEYbwKABXRkHHR/1fmkiuFbCQkltgtXSUGfldCSmJzvuyJvmBzWjBbOi79Ry/oJQug==
dependencies:
"@types/long" "^3.0.0"
"@types/node" "*"
@@ -1703,16 +1705,16 @@
"@types/responselike" "^1.0.0"
"@types/chai-as-promised@^7.1.2":
- version "7.1.6"
- resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz#3b08cbe1e7206567a480dc6538bade374b19e4e1"
- integrity sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==
+ version "7.1.8"
+ resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9"
+ integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==
dependencies:
"@types/chai" "*"
"@types/chai@*":
- version "4.3.6"
- resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6"
- integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==
+ version "4.3.14"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.14.tgz#ae3055ea2be43c91c9fd700a36d67820026d96e6"
+ integrity sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==
"@types/chai@4.2.18":
version "4.2.18"
@@ -1730,9 +1732,9 @@
integrity sha512-jWi9DXx77hnzN4kHCNEvP/kab+nchRLTg9yjXYxjTcMBkuc5iBb3QuwJ4sPrb+nzy1GQjrfyfMqZOdR4i7opRQ==
"@types/debug@^4.1.6":
- version "4.1.8"
- resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317"
- integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==
+ version "4.1.12"
+ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917"
+ integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==
dependencies:
"@types/ms" "*"
@@ -1744,32 +1746,32 @@
"@types/trusted-types" "*"
"@types/electron-localshortcut@^3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@types/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz#eb3c270bb47f1e0b583749c7e988f5c5c1e7e4a1"
- integrity sha512-upKSXMxBPRdz5kmcXfdfn+hWH9PCAvwhyVozDXTIwwHQ1lUJcdSgGUfxOC1QBlnAPKPqcW/r4icWfMosKz8ibg==
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/@types/electron-localshortcut/-/electron-localshortcut-3.1.3.tgz#f248a9c8016ff28cd783708d8664b806e45c4787"
+ integrity sha512-D+CRdDTRZ4/9UmcSaZ5qvW4uq2VyyVmqsH9cdNReB4CL6MSIgyhr9w2PKeNEb0J/ZS7db7irJM/+ZiA5uSQsLw==
dependencies:
electron "*"
"@types/eslint-scope@^3.7.3":
- version "3.7.4"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
- integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==
+ version "3.7.7"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5"
+ integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==
dependencies:
"@types/eslint" "*"
"@types/estree" "*"
"@types/eslint@*":
- version "8.44.2"
- resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a"
- integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==
+ version "8.56.7"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.7.tgz#c33b5b5a9cfb66881beb7b5be6c34aa3e81d3366"
+ integrity sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
-"@types/estree@*", "@types/estree@^1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194"
- integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==
+"@types/estree@*", "@types/estree@^1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
+ integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
"@types/filesize@3.6.0":
version "3.6.0"
@@ -1777,9 +1779,9 @@
integrity sha512-rOWxCKMjt2DBuwddUnl5GOpf/jAkkqteB+XldncpVxVX+HPTmK2c5ACMOVEbp9gaH81IlhTdC3TwvRa5nopasw==
"@types/firstline@^2.0.2":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@types/firstline/-/firstline-2.0.2.tgz#b7b051c235a667f25f205eaedbfaeeb6c92b8488"
- integrity sha512-/Qjs+MO7PwS7EI2k6Iwcc7jHLqf7AlIMDyEmPGB7LrIUFqQWZtbk6UsQxqlPMpOM10f0XiSc6RMsEIKbEGOrGw==
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/firstline/-/firstline-2.0.4.tgz#b8d3f8f7396d1589efea89db183c047a42efaf04"
+ integrity sha512-EYoMzk783ncj3soLGADXD/rklDMw1PAO5Hc3lRZa5G21vkfacwkdTlIdhTJ39omqDLezTSmxjDG1psd4A/mUHg==
dependencies:
"@types/node" "*"
@@ -1814,17 +1816,17 @@
"@types/node" "*"
"@types/hoist-non-react-statics@*", "@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1":
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
- integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
+ version "3.3.5"
+ resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494"
+ integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==
dependencies:
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
"@types/http-cache-semantics@*":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
- integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4"
+ integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
version "2.0.6"
@@ -1846,9 +1848,9 @@
"@types/istanbul-lib-report" "*"
"@types/jquery@*":
- version "3.5.18"
- resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.18.tgz#2a4979866954e601361ddc62ea304c9e46311b77"
- integrity sha512-sNm7O6LECFhHmF+3KYo6QIl2fIbjlPYa0PDgDQwfOaEJzwpK20Eub9Ke7VKkGsSJ2K0HUR50S266qYzRX4GlSw==
+ version "3.5.29"
+ resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.29.tgz#3c06a1f519cd5fc3a7a108971436c00685b5dcea"
+ integrity sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==
dependencies:
"@types/sizzle" "*"
@@ -1858,9 +1860,9 @@
integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==
"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
- version "7.0.12"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
- integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
+ version "7.0.15"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
"@types/json5@^0.0.29":
version "0.0.29"
@@ -1875,26 +1877,26 @@
"@types/node" "*"
"@types/libsodium-wrappers-sumo@^0.7.5":
- version "0.7.6"
- resolved "https://registry.yarnpkg.com/@types/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.6.tgz#3ebaf627ddb4957fd6417dd1823490cc2633f01d"
- integrity sha512-86R2bYU/DKVWw3q2btxTUlFO3lYKLyodbCsxxSybNQonPzPxmQkNtKCYmkV0dWQ9ZQsGIOzNNPU9RjJUALjoEg==
+ version "0.7.8"
+ resolved "https://registry.yarnpkg.com/@types/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.8.tgz#33e32b454fb6b340758c9ffdb1f9657e1be058ff"
+ integrity sha512-N2+df4MB/A+W0RAcTw7A5oxKgzD+Vh6Ye7lfjWIi5SdTzVLfHPzxUjhwPqHLO5Ev9fv/+VHl+sUaUuTg4fUPqw==
dependencies:
"@types/libsodium-wrappers" "*"
"@types/libsodium-wrappers@*":
- version "0.7.11"
- resolved "https://registry.yarnpkg.com/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz#4ac53b8a16a4c80d062e32b3849e9d5b8c2f92ed"
- integrity sha512-8avZYJny690B6lFZQEDz4PEdCgC8D8qmGE/mhJBzCwzZvsqne61tCRbtJOhxsjYMItEZd3k4SoR4xKKLnI9Ztg==
+ version "0.7.13"
+ resolved "https://registry.yarnpkg.com/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#769c4ea01de96bb297207586a70777ebf066dcb4"
+ integrity sha512-KeAKtlObirLJk/na6jHBFEdTDjDfFS6Vcr0eG2FjiHKn3Nw8axJFfIu0Y9TpwaauRldQBj/pZm/MHtK76r6OWg==
"@types/linkify-it@*", "@types/linkify-it@^3.0.2":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.3.tgz#15a0712296c5041733c79efe233ba17ae5a7587b"
- integrity sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.5.tgz#1e78a3ac2428e6d7e6c05c1665c242023a4601d8"
+ integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==
"@types/lodash@^4.14.194":
- version "4.14.198"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.198.tgz#4d27465257011aedc741a809f1269941fa2c5d4c"
- integrity sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.0.tgz#d774355e41f372d5350a4d0714abb48194a489c3"
+ integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==
"@types/long@^3.0.0":
version "3.0.32"
@@ -1910,9 +1912,9 @@
"@types/mdurl" "*"
"@types/mdurl@*":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9"
- integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.5.tgz#3e0d2db570e9fb6ccb2dc8fde0be1d79ac810d39"
+ integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==
"@types/minimatch@*", "@types/minimatch@^5.1.2":
version "5.1.2"
@@ -1920,9 +1922,9 @@
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
"@types/minimist@^1.2.0":
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
- integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e"
+ integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
"@types/mocha@5.0.0":
version "5.0.0"
@@ -1930,37 +1932,41 @@
integrity sha512-ZS0vBV7Jn5Z/Q4T3VXauEKMDCV8nWOtJJg90OsDylkYJiQwcWtKuLzohWzrthBkerUF7DLMmJcwOPEP0i/AOXw==
"@types/ms@*":
- version "0.7.31"
- resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
- integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
+ version "0.7.34"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433"
+ integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
"@types/node-fetch@^2.5.7":
- version "2.6.4"
- resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660"
- integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==
+ version "2.6.11"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
+ integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==
dependencies:
"@types/node" "*"
- form-data "^3.0.0"
+ form-data "^4.0.0"
-"@types/node@*", "@types/node@>=13.7.0":
- version "20.5.9"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a"
- integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==
+"@types/node@*", "@types/node@>=13.7.0", "@types/node@^20.9.0":
+ version "20.12.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.3.tgz#d6658c2c7776c1cad93534bb45428195ed840c65"
+ integrity sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==
+ dependencies:
+ undici-types "~5.26.4"
-"@types/node@20.4.7":
- version "20.4.7"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.7.tgz#74d323a93f1391a63477b27b9aec56669c98b2ab"
- integrity sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==
+"@types/node@20.5.1":
+ version "20.5.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30"
+ integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==
"@types/node@^18.11.18":
- version "18.17.14"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.14.tgz#a621ad26e7eb076d6846dd3d39557ddf9d89f04b"
- integrity sha512-ZE/5aB73CyGqgQULkLG87N9GnyGe5TcQjv34pwS8tfBs1IkCh0ASM69mydb2znqd6v0eX+9Ytvk6oQRqu8T1Vw==
+ version "18.19.29"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.29.tgz#e7e9d796c1e195be7e7daf82b4abc50d017fb9db"
+ integrity sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==
+ dependencies:
+ undici-types "~5.26.4"
"@types/normalize-package-data@^2.4.0":
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
- integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
+ integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
"@types/pify@3.0.2":
version "3.0.2"
@@ -1968,29 +1974,29 @@
integrity sha512-a5AKF1/9pCU3HGMkesgY6LsBdXHUY3WU+I2qgpU0J+I8XuJA1aFr59eS84/HP0+dxsyBSNbt+4yGI2adUpHwSg==
"@types/plist@^3.0.1":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01"
- integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0"
+ integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==
dependencies:
"@types/node" "*"
xmlbuilder ">=11.0.1"
"@types/prop-types@*":
- version "15.7.5"
- resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
- integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
+ version "15.7.12"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
+ integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
-"@types/react-dom@^17.0.2":
- version "17.0.20"
- resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.20.tgz#e0c8901469d732b36d8473b40b679ad899da1b53"
- integrity sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==
+"@types/react-dom@^18.2.19":
+ version "18.2.23"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.23.tgz#112338760f622a16d64271b408355f2f27f6302c"
+ integrity sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==
dependencies:
- "@types/react" "^17"
+ "@types/react" "*"
"@types/react-mentions@^4.1.8":
- version "4.1.8"
- resolved "https://registry.yarnpkg.com/@types/react-mentions/-/react-mentions-4.1.8.tgz#4bebe54c5c74181d8eedf1e613a208d03b4a8d7e"
- integrity sha512-Go86ozdnh0FTNbiGiDPAcNqYqtab9iGzLOgZPYUKrnhI4539jGzfJtP6rFHcXgi9Koe58yhkeyKYib6Ucul/sQ==
+ version "4.1.13"
+ resolved "https://registry.yarnpkg.com/@types/react-mentions/-/react-mentions-4.1.13.tgz#293e56e14c502f6a73217fece0b870e54a0cc657"
+ integrity sha512-kRulAAjlmhCtsJ9bapO0foocknaE/rEuFKpmFEU81fBfnXZmZNBaJ9J/DBjwigT3WDHjQVUmYoi5sxEXrcdzAw==
dependencies:
"@types/react" "*"
@@ -2002,9 +2008,9 @@
react-native "*"
"@types/react-redux@^7.1.24":
- version "7.1.26"
- resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.26.tgz#84149f5614e40274bb70fcbe8f7cae6267d548b1"
- integrity sha512-UKPo7Cm7rswYU6PH6CmTNCRv5NYF3HrgKuHEYTK8g/3czYLrUux50gQ2pkxc9c7ZpQZi+PNhgmI8oNIRoiVIxg==
+ version "7.1.33"
+ resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15"
+ integrity sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==
dependencies:
"@types/hoist-non-react-statics" "^3.3.0"
"@types/react" "*"
@@ -2019,21 +2025,21 @@
"@types/prop-types" "*"
"@types/react" "*"
-"@types/react@*", "@types/react@17.0.2", "@types/react@^17":
- version "17.0.2"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.2.tgz#3de24c4efef902dd9795a49c75f760cbe4f7a5a8"
- integrity sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==
+"@types/react@*", "@types/react@18.2.55":
+ version "18.2.55"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.55.tgz#38141821b7084404b5013742bc4ae08e44da7a67"
+ integrity sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==
dependencies:
"@types/prop-types" "*"
+ "@types/scheduler" "*"
csstype "^3.0.2"
-"@types/react@^17.0.2":
- version "17.0.65"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.65.tgz#95f6a2ab61145ffb69129d07982d047f9e0870cd"
- integrity sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==
+"@types/react@^18.2.55":
+ version "18.2.74"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.74.tgz#2d52eb80e4e7c4ea8812c89181d6d590b53f958c"
+ integrity sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==
dependencies:
"@types/prop-types" "*"
- "@types/scheduler" "*"
csstype "^3.0.2"
"@types/redux-logger@3.0.7":
@@ -2044,9 +2050,9 @@
redux "^3.6.0"
"@types/responselike@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
- integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50"
+ integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==
dependencies:
"@types/node" "*"
@@ -2064,9 +2070,9 @@
"@types/node" "*"
"@types/scheduler@*":
- version "0.16.3"
- resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5"
- integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==
+ version "0.23.0"
+ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.23.0.tgz#0a6655b3e2708eaabca00b7372fafd7a792a7b09"
+ integrity sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==
"@types/semver@5.5.0":
version "5.5.0"
@@ -2074,9 +2080,9 @@
integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==
"@types/semver@^7.3.6", "@types/semver@^7.5.0":
- version "7.5.1"
- resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367"
- integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==
+ version "7.5.8"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
+ integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
"@types/sinon@9.0.4":
version "9.0.4"
@@ -2086,14 +2092,14 @@
"@types/sinonjs__fake-timers" "*"
"@types/sinonjs__fake-timers@*":
- version "8.1.2"
- resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e"
- integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==
+ version "8.1.5"
+ resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2"
+ integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==
"@types/sizzle@*":
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef"
- integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627"
+ integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==
"@types/stack-utils@^2.0.0":
version "2.0.3"
@@ -2111,14 +2117,14 @@
csstype "^2.2.0"
"@types/trusted-types@*":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311"
- integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11"
+ integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==
"@types/underscore@*":
- version "1.11.9"
- resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.9.tgz#76a071d27e544e422dbf00f956818b1057f377b2"
- integrity sha512-M63wKUdsjDFUfyFt1TCUZHGFk9KDAa5JP0adNUErbm0U45Lr06HtANdYRP+GyleEopEoZ4UyBcdAC5TnW4Uz2w==
+ version "1.11.15"
+ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.15.tgz#29c776daecf6f1935da9adda17509686bf979947"
+ integrity sha512-HP38xE+GuWGlbSRq9WrZkousaQ7dragtZCruBVMi0oX1migFZavZ3OROKHSkNp/9ouq82zrWtZpg18jFnVN96g==
"@types/use-sync-external-store@^0.0.3":
version "0.0.3"
@@ -2131,14 +2137,14 @@
integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==
"@types/verror@^1.10.3":
- version "1.10.6"
- resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.6.tgz#3e600c62d210c5826460858f84bcbb65805460bb"
- integrity sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==
+ version "1.10.10"
+ resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.10.tgz#d5a4b56abac169bfbc8b23d291363a682e6fa087"
+ integrity sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==
"@types/yargs-parser@*":
- version "21.0.0"
- resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
- integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
+ version "21.0.3"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
+ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==
"@types/yargs@^15.0.0":
version "15.0.19"
@@ -2155,9 +2161,9 @@
"@types/yargs-parser" "*"
"@types/yauzl@^2.9.1":
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599"
- integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==
+ version "2.10.3"
+ resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999"
+ integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==
dependencies:
"@types/node" "*"
@@ -2257,10 +2263,10 @@
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
-"@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", "@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"
@@ -2275,10 +2281,10 @@
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-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"
@@ -2294,15 +2300,15 @@
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-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"
@@ -2323,59 +2329,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/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==
- dependencies:
- "@webassemblyjs/ast" "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.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.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"
"@webpack-cli/configtest@^2.1.1":
@@ -2457,14 +2463,14 @@ acorn-jsx@^5.3.2:
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn-walk@^8.1.1:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
- integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa"
+ integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==
acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0:
- version "8.10.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
- integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
+ version "8.11.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
+ integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
agent-base@6:
version "6.0.2"
@@ -2700,14 +2706,15 @@ array-ify@^1.0.0:
integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==
array-includes@^3.1.6, array-includes@^3.1.7:
- version "3.1.7"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda"
- integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==
+ version "3.1.8"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
+ integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
- get-intrinsic "^1.2.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
is-string "^1.0.7"
array-union@^2.1.0:
@@ -2715,26 +2722,16 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-array.prototype.filter@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e"
- integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
- es-array-method-boxes-properly "^1.0.0"
- is-string "^1.0.7"
-
array.prototype.findlastindex@^1.2.3:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz#d1c50f0b3a9da191981ff8942a0aedd82794404f"
- integrity sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d"
+ integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==
dependencies:
- call-bind "^1.0.5"
+ call-bind "^1.0.7"
define-properties "^1.2.1"
- es-abstract "^1.22.3"
+ es-abstract "^1.23.2"
es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
es-shim-unscopables "^1.0.2"
array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2:
@@ -2758,15 +2755,15 @@ array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2:
es-shim-unscopables "^1.0.0"
array.prototype.tosorted@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532"
- integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8"
+ integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
- es-shim-unscopables "^1.0.0"
- get-intrinsic "^1.1.3"
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ es-abstract "^1.22.3"
+ es-errors "^1.1.0"
+ es-shim-unscopables "^1.0.2"
arraybuffer.prototype.slice@^1.0.3:
version "1.0.3"
@@ -2848,13 +2845,6 @@ async@^2.6.4, async@^3.2.3:
dependencies:
lodash "^4.17.14"
-asynciterator.prototype@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62"
- integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==
- dependencies:
- has-symbols "^1.0.3"
-
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -2870,19 +2860,19 @@ auto-bind@^4.0.0:
resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb"
integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==
-available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.6:
+available-typed-arrays@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
dependencies:
possible-typed-array-names "^1.0.0"
-axios@^1.3.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2"
- integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==
+axios@^1.6.5:
+ version "1.6.8"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66"
+ integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==
dependencies:
- follow-redirects "^1.15.0"
+ follow-redirects "^1.15.6"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
@@ -2956,9 +2946,9 @@ big.js@^5.2.2:
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
binary-extensions@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
- integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
bindings@^1.5.0:
version "1.5.0"
@@ -3037,7 +3027,7 @@ browser-stdout@1.3.1:
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
-browserslist@^4.14.5, browserslist@^4.22.2, browserslist@^4.23.0:
+browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0:
version "4.23.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab"
integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
@@ -3205,7 +3195,7 @@ cacheable-request@^7.0.2:
normalize-url "^6.0.1"
responselike "^2.0.0"
-call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
@@ -3265,9 +3255,9 @@ camelize@^1.0.0:
integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==
caniuse-lite@^1.0.30001587:
- version "1.0.30001600"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079"
- integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==
+ version "1.0.30001605"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6"
+ integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==
catharsis@^0.9.0:
version "0.9.0"
@@ -3289,17 +3279,17 @@ chai-bytes@^0.1.2:
integrity sha512-0ol6oJS0y1ozj6AZK8n1pyv1/G+l44nqUJygAkK1UrYl+IOGie5vcrEdrAlwmLYGIA9NVvtHWosPYwWWIXf/XA==
chai@^4.3.4:
- version "4.3.8"
- resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c"
- integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1"
+ integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==
dependencies:
assertion-error "^1.1.0"
- check-error "^1.0.2"
- deep-eql "^4.1.2"
- get-func-name "^2.0.0"
- loupe "^2.3.1"
+ check-error "^1.0.3"
+ deep-eql "^4.1.3"
+ get-func-name "^2.0.2"
+ loupe "^2.3.6"
pathval "^1.1.1"
- type-detect "^4.0.5"
+ type-detect "^4.0.8"
chalk@5.3.0:
version "5.3.0"
@@ -3323,12 +3313,14 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-check-error@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
- integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==
+check-error@^1.0.2, check-error@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694"
+ integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==
+ dependencies:
+ get-func-name "^2.0.2"
-chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0":
+chokidar@3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@@ -3343,6 +3335,21 @@ chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0":
optionalDependencies:
fsevents "~2.3.2"
+"chokidar@>=3.0.0 <4.0.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
@@ -3386,9 +3393,9 @@ ci-info@^2.0.0:
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
ci-info@^3.2.0:
- version "3.8.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
- integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+ integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
classnames@2.2.5:
version "2.2.5"
@@ -3396,9 +3403,9 @@ classnames@2.2.5:
integrity sha512-DTt3GhOUDKhh4ONwIJW4lmhyotQmV2LjNlGK/J2hkwUcqcbKkCLAdJPtxQnxnlc7SR3f1CEXCyMmc7WLUsWbNA==
classnames@^2.2.5:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
- integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
+ integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
cli-boxes@^2.2.1:
version "2.2.1"
@@ -3494,23 +3501,23 @@ clsx@^1.0.4, clsx@^1.1.1, clsx@^1.2.1:
integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==
cmake-js@^7.2.1:
- version "7.2.1"
- resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-7.2.1.tgz#757c0d39994121b084bab96290baf115ee7712cd"
- integrity sha512-AdPSz9cSIJWdKvm0aJgVu3X8i0U3mNTswJkSHzZISqmYVjZk7Td4oDFg0mCBA383wO+9pG5Ix7pEP1CZH9x2BA==
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-7.3.0.tgz#6fd6234b7aeec4545c1c806f9e3f7ffacd9798b2"
+ integrity sha512-dXs2zq9WxrV87bpJ+WbnGKv8WUBXDw8blNiwNHoRe/it+ptscxhQHKB1SJXa1w+kocLMeP28Tk4/eTCezg4o+w==
dependencies:
- axios "^1.3.2"
+ axios "^1.6.5"
debug "^4"
- fs-extra "^10.1.0"
+ fs-extra "^11.2.0"
lodash.isplainobject "^4.0.6"
memory-stream "^1.0.0"
- node-api-headers "^0.0.2"
+ node-api-headers "^1.1.0"
npmlog "^6.0.2"
rc "^1.2.7"
- semver "^7.3.8"
- tar "^6.1.11"
+ semver "^7.5.4"
+ tar "^6.2.0"
url-join "^4.0.1"
which "^2.0.2"
- yargs "^17.6.0"
+ yargs "^17.7.2"
color-convert@^1.9.0:
version "1.9.3"
@@ -3752,9 +3759,9 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0:
parse-json "^4.0.0"
cosmiconfig@^8.0.0:
- version "8.3.4"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.4.tgz#ee1356e7f24e248a6bb34ec5d438c3dcebeb410c"
- integrity sha512-SF+2P8+o/PTV05rgsAjDzL4OFdVXAulSfC/L19VaeVT7+tpOOSscCt2QLxDZ+CLxF2WOiq6y1K5asvs8qUJT/Q==
+ version "8.3.6"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3"
+ integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==
dependencies:
import-fresh "^3.3.0"
js-yaml "^4.1.0"
@@ -3818,18 +3825,18 @@ css-in-js-utils@^3.1.0:
hyphenate-style-name "^1.0.3"
css-loader@^6.7.2:
- version "6.8.1"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88"
- integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==
+ version "6.10.0"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7"
+ integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==
dependencies:
icss-utils "^5.1.0"
- postcss "^8.4.21"
+ postcss "^8.4.33"
postcss-modules-extract-imports "^3.0.0"
- postcss-modules-local-by-default "^4.0.3"
- postcss-modules-scope "^3.0.0"
+ postcss-modules-local-by-default "^4.0.4"
+ postcss-modules-scope "^3.1.1"
postcss-modules-values "^4.0.0"
postcss-value-parser "^4.2.0"
- semver "^7.3.8"
+ semver "^7.5.4"
css-to-react-native@^3.0.0:
version "3.2.0"
@@ -3865,10 +3872,10 @@ csstype@^2.2.0:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e"
integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==
-csstype@^3.0.2, csstype@^3.0.6:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
- integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
+csstype@^3.0.2, csstype@^3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
"curve25519-js@https://github.com/oxen-io/curve25519-js":
version "0.0.4"
@@ -3888,10 +3895,37 @@ data-urls@^4.0.0:
whatwg-mimetype "^3.0.0"
whatwg-url "^12.0.0"
+data-view-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
+ integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2"
+ integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a"
+ integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
date-fns@^3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.3.1.tgz#7581daca0892d139736697717a168afbb908cfed"
- integrity sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf"
+ integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==
dayjs@^1.8.15:
version "1.11.10"
@@ -3954,7 +3988,7 @@ deep-diff@^0.3.5:
resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
integrity sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==
-deep-eql@^4.1.2:
+deep-eql@^4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d"
integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==
@@ -3988,7 +4022,7 @@ defer-to-connect@^2.0.0:
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
-define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4:
+define-data-property@^1.0.1, define-data-property@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
@@ -3997,7 +4031,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^
es-errors "^1.3.0"
gopd "^1.0.1"
-define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1:
+define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
@@ -4144,9 +4178,9 @@ domexception@^4.0.0:
webidl-conversions "^7.0.0"
dompurify@^2.0.7:
- version "2.4.7"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc"
- integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==
+ version "2.4.9"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.9.tgz#9ccdd9e1780653156b09de873f5372bc1eaf2c40"
+ integrity sha512-iHtnxYMotKgOTvxIqq677JsKHvCOkAFqj9x8Mek2zdeHW1XjuFKwjpmZeMaXQRQ8AbJZDbcRz/+r1QhwvFtmQg==
dot-prop@^5.1.0, dot-prop@^5.2.0:
version "5.3.0"
@@ -4254,9 +4288,9 @@ electron-publish@23.6.0:
mime "^2.5.2"
electron-to-chromium@^1.4.668:
- version "1.4.717"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.717.tgz#99db370cae8cd090d5b01f8748e9ad369924d0f8"
- integrity sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==
+ version "1.4.724"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz#e0a86fe4d3d0e05a4d7b032549d79608078f830d"
+ integrity sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA==
electron-updater@^4.2.2:
version "4.6.5"
@@ -4273,12 +4307,12 @@ electron-updater@^4.2.2:
semver "^7.3.5"
electron@*:
- version "26.1.0"
- resolved "https://registry.yarnpkg.com/electron/-/electron-26.1.0.tgz#d26fefba5a5c68069b07a117d87aee1c4e5d172d"
- integrity sha512-qEh19H09Pysn3ibms5nZ0haIh5pFoOd7/5Ww7gzmAwDQOulRi8Sa2naeueOyIb1GKpf+6L4ix3iceYRAuA5r5Q==
+ version "29.1.6"
+ resolved "https://registry.yarnpkg.com/electron/-/electron-29.1.6.tgz#3804545a7570e88717f01e02ec871c667c55e596"
+ integrity sha512-UIYfpHR9gRBFKHyejHuXUVQ7nNzZRnoPVOHlijkvqR+DSLwgJ2ZcVVt0LNduNeO8PhPkY1+6kHonL52OTC1cOw==
dependencies:
"@electron/get" "^2.0.0"
- "@types/node" "^18.11.18"
+ "@types/node" "^20.9.0"
extract-zip "^2.0.1"
electron@25.8.4:
@@ -4322,10 +4356,10 @@ end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
-enhanced-resolve@^5.0.0, enhanced-resolve@^5.12.0, 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==
+enhanced-resolve@^5.0.0, enhanced-resolve@^5.12.0, enhanced-resolve@^5.16.0:
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787"
+ integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@@ -4377,18 +4411,22 @@ errorhandler@^1.5.1:
accepts "~1.3.7"
escape-html "~1.0.3"
-es-abstract@^1.20.4, es-abstract@^1.22.1, es-abstract@^1.22.3:
- version "1.22.4"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.4.tgz#26eb2e7538c3271141f5754d31aabfdb215f27bf"
- integrity sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==
+es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2:
+ version "1.23.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
+ integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
dependencies:
array-buffer-byte-length "^1.0.1"
arraybuffer.prototype.slice "^1.0.3"
- available-typed-arrays "^1.0.6"
+ available-typed-arrays "^1.0.7"
call-bind "^1.0.7"
+ data-view-buffer "^1.0.1"
+ data-view-byte-length "^1.0.1"
+ data-view-byte-offset "^1.0.0"
es-define-property "^1.0.0"
es-errors "^1.3.0"
- es-set-tostringtag "^2.0.2"
+ es-object-atoms "^1.0.0"
+ es-set-tostringtag "^2.0.3"
es-to-primitive "^1.2.1"
function.prototype.name "^1.1.6"
get-intrinsic "^1.2.4"
@@ -4396,15 +4434,16 @@ es-abstract@^1.20.4, es-abstract@^1.22.1, es-abstract@^1.22.3:
globalthis "^1.0.3"
gopd "^1.0.1"
has-property-descriptors "^1.0.2"
- has-proto "^1.0.1"
+ has-proto "^1.0.3"
has-symbols "^1.0.3"
- hasown "^2.0.1"
+ hasown "^2.0.2"
internal-slot "^1.0.7"
is-array-buffer "^3.0.4"
is-callable "^1.2.7"
- is-negative-zero "^2.0.2"
+ is-data-view "^1.0.1"
+ is-negative-zero "^2.0.3"
is-regex "^1.1.4"
- is-shared-array-buffer "^1.0.2"
+ is-shared-array-buffer "^1.0.3"
is-string "^1.0.7"
is-typed-array "^1.1.13"
is-weakref "^1.0.2"
@@ -4412,22 +4451,17 @@ es-abstract@^1.20.4, es-abstract@^1.22.1, es-abstract@^1.22.3:
object-keys "^1.1.1"
object.assign "^4.1.5"
regexp.prototype.flags "^1.5.2"
- safe-array-concat "^1.1.0"
+ safe-array-concat "^1.1.2"
safe-regex-test "^1.0.3"
- string.prototype.trim "^1.2.8"
- string.prototype.trimend "^1.0.7"
- string.prototype.trimstart "^1.0.7"
- typed-array-buffer "^1.0.1"
- typed-array-byte-length "^1.0.0"
- typed-array-byte-offset "^1.0.0"
- typed-array-length "^1.0.4"
+ string.prototype.trim "^1.2.9"
+ string.prototype.trimend "^1.0.8"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.2"
+ typed-array-byte-length "^1.0.1"
+ typed-array-byte-offset "^1.0.2"
+ typed-array-length "^1.0.6"
unbox-primitive "^1.0.2"
- which-typed-array "^1.1.14"
-
-es-array-method-boxes-properly@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
- integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
+ which-typed-array "^1.1.15"
es-define-property@^1.0.0:
version "1.0.0"
@@ -4436,37 +4470,44 @@ es-define-property@^1.0.0:
dependencies:
get-intrinsic "^1.2.4"
-es-errors@^1.0.0, es-errors@^1.2.1, es-errors@^1.3.0:
+es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
es-iterator-helpers@^1.0.12:
- version "1.0.14"
- resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz#19cd7903697d97e21198f3293b55e8985791c365"
- integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==
+ version "1.0.18"
+ resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d"
+ integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==
dependencies:
- asynciterator.prototype "^1.0.0"
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
- es-set-tostringtag "^2.0.1"
- function-bind "^1.1.1"
- get-intrinsic "^1.2.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.0"
+ es-errors "^1.3.0"
+ es-set-tostringtag "^2.0.3"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
globalthis "^1.0.3"
- has-property-descriptors "^1.0.0"
- has-proto "^1.0.1"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.0.3"
has-symbols "^1.0.3"
- internal-slot "^1.0.5"
- iterator.prototype "^1.1.0"
- safe-array-concat "^1.0.0"
+ internal-slot "^1.0.7"
+ iterator.prototype "^1.1.2"
+ safe-array-concat "^1.1.2"
es-module-lexer@^1.2.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
- integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236"
+ integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==
+
+es-object-atoms@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+ integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+ dependencies:
+ es-errors "^1.3.0"
-es-set-tostringtag@^2.0.1, es-set-tostringtag@^2.0.2:
+es-set-tostringtag@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
@@ -4497,9 +4538,9 @@ es6-error@^4.1.1:
integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
escalade@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
- integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
+ integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
escape-goat@^2.0.0:
version "2.1.1"
@@ -4576,9 +4617,9 @@ eslint-import-resolver-typescript@3.6.1:
is-glob "^4.0.3"
eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0:
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49"
- integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34"
+ integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==
dependencies:
debug "^3.2.7"
@@ -4606,12 +4647,13 @@ eslint-plugin-import@2.29.1:
tsconfig-paths "^3.15.0"
eslint-plugin-mocha@^10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz#69325414f875be87fb2cb00b2ef33168d4eb7c8d"
- integrity sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==
+ version "10.4.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.1.tgz#7975a3dbb0de80a5f3ea69c30f6f1f1c931f8800"
+ integrity sha512-G85ALUgKaLzuEuHhoW3HVRgPTmia6njQC3qCG6CEvA8/Ja9PDZnRZOuzekMki+HaViEQXINuYsmhp5WR5/4MfA==
dependencies:
eslint-utils "^3.0.0"
- rambda "^7.1.0"
+ globals "^13.24.0"
+ rambda "^7.4.0"
eslint-plugin-more@^1.0.5:
version "1.0.5"
@@ -4857,9 +4899,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-glob@^3.2.9, fast-glob@^3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
- integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -4905,9 +4947,9 @@ fastest-stable-stringify@^2.0.2:
integrity sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==
fastq@^1.6.0:
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
- integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
dependencies:
reusify "^1.0.4"
@@ -5019,11 +5061,11 @@ firstline@1.2.1:
integrity sha512-6eMQNJtDzyXSC1yeCBWspqA6LeV5la2XHGTXQq4O0xkglAutpyny/sB+zVdXTZ9nzcDW9ZGLxwXXkB+ZEtJuPw==
flat-cache@^3.0.4:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f"
- integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
dependencies:
- flatted "^3.2.7"
+ flatted "^3.2.9"
keyv "^4.5.3"
rimraf "^3.0.2"
@@ -5032,10 +5074,10 @@ flat@^5.0.2:
resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
-flatted@^3.2.7:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
- integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
+flatted@^3.2.9:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
+ integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
flow-enums-runtime@^0.0.6:
version "0.0.6"
@@ -5067,10 +5109,10 @@ focus-trap@^7.5.4:
dependencies:
tabbable "^6.2.0"
-follow-redirects@^1.15.0:
- version "1.15.3"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a"
- integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==
+follow-redirects@^1.15.6:
+ version "1.15.6"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+ integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
for-each@^0.3.3:
version "0.3.3"
@@ -5079,15 +5121,6 @@ for-each@^0.3.3:
dependencies:
is-callable "^1.1.3"
-form-data@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
- integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.8"
- 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"
@@ -5097,6 +5130,13 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
+framer-motion@^11.0.3:
+ version "11.0.24"
+ resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.0.24.tgz#d6ac88cd7d627e2ce57eb9bac05c60469fca6223"
+ integrity sha512-l2iM8NR53qtcujgAqYvGPJJGModPNWEVUaATRDLfnaLvUoFpImovBm0AHalSSsY8tW6knP8mfJTW4WYGbnAe4w==
+ dependencies:
+ tslib "^2.4.0"
+
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
@@ -5121,10 +5161,10 @@ fs-extra@^10.0.0, fs-extra@^10.1.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
-fs-extra@^11.0.0:
- version "11.1.1"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d"
- integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==
+fs-extra@^11.0.0, fs-extra@^11.2.0:
+ version "11.2.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
+ integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
@@ -5166,7 +5206,7 @@ fsevents@^2.3.2, fsevents@~2.3.2:
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-function-bind@^1.1.1, function-bind@^1.1.2:
+function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
@@ -5210,12 +5250,12 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-func-name@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
- integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==
+get-func-name@^2.0.1, get-func-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
+ integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
-get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
@@ -5248,9 +5288,9 @@ get-symbol-description@^1.0.2:
get-intrinsic "^1.2.4"
get-tsconfig@^4.5.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.0.tgz#06ce112a1463e93196aa90320c35df5039147e34"
- integrity sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==
+ version "4.7.3"
+ resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83"
+ integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==
dependencies:
resolve-pkg-maps "^1.0.0"
@@ -5371,10 +5411,10 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^13.19.0:
- version "13.21.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571"
- integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==
+globals@^13.19.0, globals@^13.24.0:
+ version "13.24.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
dependencies:
type-fest "^0.20.2"
@@ -5421,7 +5461,7 @@ got@^11.8.5, got@^9.6.0:
p-cancelable "^2.0.0"
responselike "^2.0.0"
-graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, 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==
@@ -5456,24 +5496,24 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1, has-property-descriptors@^1.0.2:
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
dependencies:
es-define-property "^1.0.0"
-has-proto@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
- integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+has-proto@^1.0.1, has-proto@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
has-symbols@^1.0.2, has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
-has-tostringtag@^1.0.0, has-tostringtag@^1.0.1, has-tostringtag@^1.0.2:
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
@@ -5490,10 +5530,10 @@ has-yarn@^2.1.0:
resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
-hasown@^2.0.0, hasown@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa"
- integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
dependencies:
function-bind "^1.1.2"
@@ -5651,9 +5691,9 @@ ieee754@^1.1.13:
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore@^5.2.0, ignore@^5.2.4:
- version "5.2.4"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
- integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
+ integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
image-size@^1.0.2:
version "1.1.1"
@@ -5675,9 +5715,9 @@ immer@^9.0.7:
integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
immutable@^4.0.0:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f"
- integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0"
+ integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==
import-fresh@^2.0.0:
version "2.0.0"
@@ -5736,15 +5776,15 @@ ini@2.0.0, ini@^1.3.4, ini@^1.3.6, ini@~1.3.0:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-inline-style-prefixer@^6.0.0:
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz#4290ed453ab0e4441583284ad86e41ad88384f44"
- integrity sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==
+inline-style-prefixer@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-7.0.0.tgz#991d550735d42069f528ac1bcdacd378d1305442"
+ integrity sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==
dependencies:
css-in-js-utils "^3.1.0"
fast-loops "^1.1.3"
-internal-slot@^1.0.5, internal-slot@^1.0.7:
+internal-slot@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
@@ -5831,13 +5871,20 @@ is-ci@^3.0.0:
dependencies:
ci-info "^3.2.0"
-is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.9.0:
+is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0:
version "2.13.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
dependencies:
hasown "^2.0.0"
+is-data-view@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f"
+ integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
+ dependencies:
+ is-typed-array "^1.1.13"
+
is-date-object@^1.0.1, is-date-object@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
@@ -5909,15 +5956,15 @@ is-interactive@^1.0.0:
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
-is-map@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
- integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+is-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
+ integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
-is-negative-zero@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
- integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
is-npm@^5.0.0:
version "5.0.0"
@@ -5976,17 +6023,17 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-set@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
- integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+is-set@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
+ integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
-is-shared-array-buffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
- integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
+ integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
dependencies:
- call-bind "^1.0.2"
+ call-bind "^1.0.7"
is-stream@^2.0.0:
version "2.0.1"
@@ -6019,7 +6066,7 @@ is-text-path@^1.0.1:
dependencies:
text-extensions "^1.0.0"
-is-typed-array@^1.1.10, is-typed-array@^1.1.13, is-typed-array@^1.1.9:
+is-typed-array@^1.1.13:
version "1.1.13"
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
@@ -6036,10 +6083,10 @@ is-unicode-supported@^0.1.0:
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
-is-weakmap@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
- integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+is-weakmap@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
+ integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
is-weakref@^1.0.2:
version "1.0.2"
@@ -6048,13 +6095,13 @@ is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
-is-weakset@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d"
- integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+is-weakset@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007"
+ integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==
dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.1.1"
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
is-wsl@^1.1.0:
version "1.1.0"
@@ -6110,15 +6157,16 @@ isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
-iterator.prototype@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.1.tgz#ab5b790e23ec00658f5974e032a2b05188bd3a5c"
- integrity sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==
+iterator.prototype@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0"
+ integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
dependencies:
- define-properties "^1.2.0"
+ define-properties "^1.2.1"
get-intrinsic "^1.2.1"
has-symbols "^1.0.3"
- reflect.getprototypeof "^1.0.3"
+ reflect.getprototypeof "^1.0.4"
+ set-function-name "^2.0.1"
jake@^10.8.5:
version "10.8.7"
@@ -6449,9 +6497,9 @@ keyboardevents-areequal@^0.2.1:
integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==
keyv@^4.0.0, keyv@^4.5.3:
- version "4.5.3"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25"
- integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
dependencies:
json-buffer "3.0.1"
@@ -6526,24 +6574,25 @@ levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
-"libsession_util_nodejs@https://github.com/oxen-io/libsession-util-nodejs/releases/download/v0.3.1/libsession_util_nodejs-v0.3.1.tar.gz":
- version "0.3.1"
- resolved "https://github.com/oxen-io/libsession-util-nodejs/releases/download/v0.3.1/libsession_util_nodejs-v0.3.1.tar.gz#d2c94bfaae6e3ef594609abb08cf8be485fa5d39"
+"libsession_util_nodejs@https://github.com/oxen-io/libsession-util-nodejs/releases/download/v0.3.4/libsession_util_nodejs-v0.3.4.tar.gz":
+ version "0.3.4"
+ resolved "https://github.com/oxen-io/libsession-util-nodejs/releases/download/v0.3.4/libsession_util_nodejs-v0.3.4.tar.gz#e8ef383ae0dbb2e54060c23fe930e8649f189870"
dependencies:
cmake-js "^7.2.1"
node-addon-api "^6.1.0"
+ run-script-os "^1.1.6"
-libsodium-sumo@^0.7.11:
- version "0.7.11"
- resolved "https://registry.yarnpkg.com/libsodium-sumo/-/libsodium-sumo-0.7.11.tgz#ab0389e2424fca5c1dc8c4fd394906190da88a11"
- integrity sha512-bY+7ph7xpk51Ez2GbE10lXAQ5sJma6NghcIDaSPbM/G9elfrjLa0COHl/7P6Wb/JizQzl5UQontOOP1z0VwbLA==
+libsodium-sumo@^0.7.13:
+ version "0.7.13"
+ resolved "https://registry.yarnpkg.com/libsodium-sumo/-/libsodium-sumo-0.7.13.tgz#533b97d2be44b1277e59c1f9f60805978ac5542d"
+ integrity sha512-zTGdLu4b9zSNLfovImpBCbdAA4xkpkZbMnSQjP8HShyOutnGjRHmSOKlsylh1okao6QhLiz7nG98EGn+04cZjQ==
libsodium-wrappers-sumo@^0.7.9:
- version "0.7.11"
- resolved "https://registry.yarnpkg.com/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.11.tgz#d96329ee3c0e7ec7f5fcf4cdde16cc3a1ae91d82"
- integrity sha512-DGypHOmJbB1nZn89KIfGOAkDgfv5N6SBGC3Qvmy/On0P0WD1JQvNRS/e3UL3aFF+xC0m+MYz5M+MnRnK2HMrKQ==
+ version "0.7.13"
+ resolved "https://registry.yarnpkg.com/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.13.tgz#a33aea845a0bb56db067548f04feba28c730ab8e"
+ integrity sha512-lz4YdplzDRh6AhnLGF2Dj2IUj94xRN6Bh8T0HLNwzYGwPehQJX6c7iYVrFUPZ3QqxE0bqC+K0IIqqZJYWumwSQ==
dependencies:
- libsodium-sumo "^0.7.11"
+ libsodium-sumo "^0.7.13"
lighthouse-logger@^1.0.0:
version "1.4.2"
@@ -6776,12 +6825,12 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
-loupe@^2.3.1:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53"
- integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==
+loupe@^2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697"
+ integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==
dependencies:
- get-func-name "^2.0.0"
+ get-func-name "^2.0.1"
lowercase-keys@^2.0.0:
version "2.0.0"
@@ -6945,53 +6994,53 @@ merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-metro-babel-transformer@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.7.tgz#5024e3e7a0c9dcd8a3a55ac2e5e514766c915851"
- integrity sha512-b773yA16DsDQiM4OOzCsr1gwEd+iio9au98o3bj7F/bxVyoz1LuYox06BIdsiLL1o4kV5VtzTu3UXSJ2X0ZGXg==
+metro-babel-transformer@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.8.tgz#2951eeab76630b3c59f3874d04f4f12a6e73b2bd"
+ integrity sha512-TTzNwRZb2xxyv4J/+yqgtDAP2qVqH3sahsnFu6Xv4SkLqzrivtlnyUbaeTdJ9JjtADJUEjCbgbFgUVafrXdR9Q==
dependencies:
"@babel/core" "^7.20.0"
hermes-parser "0.20.1"
nullthrows "^1.1.1"
-metro-cache-key@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.7.tgz#29b0a6c79f4d889a8e35deede90366263fff54e5"
- integrity sha512-sfCOtooMqmmm2v0a4EsYr5knYJGIArZJ5Y7MAcmsVU2pcqg+JQyPhYr/zqSkXBBipRxXr7aNXul9StKzKjsnbw==
+metro-cache-key@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.8.tgz#d57af9c25f9fe7e755644594d602ef89124ee06b"
+ integrity sha512-qWKzxrLsRQK5m3oH8ePecqCc+7PEhR03cJE6Z6AxAj0idi99dHOSitTmY0dclXVB9vP2tQIAE8uTd8xkYGk8fA==
-metro-cache@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.7.tgz#d15d5d7d2ae0663a710b811ac3a5d4a1f11eae87"
- integrity sha512-N6HyLjwDKusqJDaVyP57SVZKP51m1FFVcbIWQXu938W30nCXQEuWOx4e6adKgfEOZpscisWojfrCFN42/A8uug==
+metro-cache@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.8.tgz#bc7d38611e4f31686a99045d4f2956c0bff4dd3b"
+ integrity sha512-5svz+89wSyLo7BxdiPDlwDTgcB9kwhNMfNhiBZPNQQs1vLFXxOkILwQiV5F2EwYT9DEr6OPZ0hnJkZfRQ8lDYQ==
dependencies:
- metro-core "0.80.7"
+ metro-core "0.80.8"
rimraf "^3.0.2"
-metro-config@0.80.7, metro-config@^0.80.3:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.7.tgz#6aa34a624efc83ff42b878bdfbfb90024bf14855"
- integrity sha512-kpXCidthS/kFlEoXjWQp+IyCU5ICCOESVgwXEzViSDOv5bPJz2ytIr2lF623e50QzyrpFBSnOPjnyd1JbsVPvQ==
+metro-config@0.80.8, metro-config@^0.80.3:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.8.tgz#1961feed6334601951ea72600901dafade56a973"
+ integrity sha512-VGQJpfJawtwRzGzGXVUoohpIkB0iPom4DmSbAppKfumdhtLA8uVeEPp2GM61kL9hRvdbMhdWA7T+hZFDlo4mJA==
dependencies:
connect "^3.6.5"
cosmiconfig "^5.0.5"
jest-validate "^29.6.3"
- metro "0.80.7"
- metro-cache "0.80.7"
- metro-core "0.80.7"
- metro-runtime "0.80.7"
+ metro "0.80.8"
+ metro-cache "0.80.8"
+ metro-core "0.80.8"
+ metro-runtime "0.80.8"
-metro-core@0.80.7, metro-core@^0.80.3:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.7.tgz#0bfb641588aa06eaef1683429a64e243590fd33b"
- integrity sha512-bl3D6TtIa2mSdVTbkskMPcJSdoivO0F06u8ip/oS/T6RsbjkMTN3OZBjJXclY9I0FcN14q8I5YQt1oriySY/2Q==
+metro-core@0.80.8, metro-core@^0.80.3:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.8.tgz#85cf9745e767a33fe96bc5f166b71e213a482978"
+ integrity sha512-g6lud55TXeISRTleW6SHuPFZHtYrpwNqbyFIVd9j9Ofrb5IReiHp9Zl8xkAfZQp8v6ZVgyXD7c130QTsCz+vBw==
dependencies:
lodash.throttle "^4.1.1"
- metro-resolver "0.80.7"
+ metro-resolver "0.80.8"
-metro-file-map@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.7.tgz#7449e5241bf534c3378096acc8889a17cff24222"
- integrity sha512-A9IAmFZu/Ch7zJ4LzJChsvhedNOipuIXaOz6N8J44rqVZHI0uIqDKVGCne7lzc97djF1Ti4tH9nP64u4IdhpSg==
+metro-file-map@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.8.tgz#216e54db4dc8496815bd38bb806d469c5f5b66fd"
+ integrity sha512-eQXMFM9ogTfDs2POq7DT2dnG7rayZcoEgRbHPXvhUWkVwiKkro2ngcBE++ck/7A36Cj5Ljo79SOkYwHaWUDYDw==
dependencies:
anymatch "^3.0.3"
debug "^2.2.0"
@@ -7006,55 +7055,55 @@ metro-file-map@0.80.7:
optionalDependencies:
fsevents "^2.3.2"
-metro-minify-terser@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.7.tgz#aec2ad94b4accb1d88d0d83e0e150e769bdc9d28"
- integrity sha512-9/mYV1tMGeoFSTMFr94oigJM2qMXJO3hvlibkaQ21HZjVyrfb54bSYyfIIRvAsjY2RCBRg9r2OrT+YbxnMypig==
+metro-minify-terser@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.8.tgz#166413d2286900e7fd764aa30497a1596bc18c00"
+ integrity sha512-y8sUFjVvdeUIINDuW1sejnIjkZfEF+7SmQo0EIpYbWmwh+kq/WMj74yVaBWuqNjirmUp1YNfi3alT67wlbBWBQ==
dependencies:
terser "^5.15.0"
-metro-resolver@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.7.tgz#57c4bd56cfbf64b4e3dec7a5dd3f7cd063b4f1b1"
- integrity sha512-xW7M0TITuKs2rYQqbIQn297+MVWfDuGptPnfZ+RBG9afdN//Zpmg14KFMIYU4r5AH2WS+nxwL57DbZft1MyoHg==
+metro-resolver@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.8.tgz#bcc8f8d7f874a9c5fee9ebbde8541d6dc88783df"
+ integrity sha512-JdtoJkP27GGoZ2HJlEsxs+zO7jnDUCRrmwXJozTlIuzLHMRrxgIRRby9fTCbMhaxq+iA9c+wzm3iFb4NhPmLbQ==
-metro-runtime@0.80.7, metro-runtime@^0.80.3:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.7.tgz#fa11c35d5d7307329c0efc0cbbe98280a2a215ea"
- integrity sha512-gWqzfm9YQw9I08L23hcLmY7XNx48W0c0vLEkVEF5P7ZNIOSfX9CkEv0JvTTJWshRYkbgIqsdtpMAHq13LJJ6iA==
+metro-runtime@0.80.8, metro-runtime@^0.80.3:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.8.tgz#8f265369c05d9a3f05f9915842fac5d4e93f44bd"
+ integrity sha512-2oScjfv6Yb79PelU1+p8SVrCMW9ZjgEiipxq7jMRn8mbbtWzyv3g8Mkwr+KwOoDFI/61hYPUbY8cUnu278+x1g==
dependencies:
"@babel/runtime" "^7.0.0"
-metro-source-map@0.80.7, metro-source-map@^0.80.3:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.7.tgz#822e9817bc3e731122db1ed3300d2234c5a51e75"
- integrity sha512-6a1m/51ekkAl+ISNBcKQUXTU+AldbbPUHDE3DDDU17Y0HNoovkQR23DB/uH/SzUHQszYxK1fnwUTSxpzOjx+pw==
+metro-source-map@0.80.8, metro-source-map@^0.80.3:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.8.tgz#fe92c2b82739c34cf46372a2be07d4e9cac8eb09"
+ integrity sha512-+OVISBkPNxjD4eEKhblRpBf463nTMk3KMEeYS8Z4xM/z3qujGJGSsWUGRtH27+c6zElaSGtZFiDMshEb8mMKQg==
dependencies:
"@babel/traverse" "^7.20.0"
"@babel/types" "^7.20.0"
invariant "^2.2.4"
- metro-symbolicate "0.80.7"
+ metro-symbolicate "0.80.8"
nullthrows "^1.1.1"
- ob1 "0.80.7"
+ ob1 "0.80.8"
source-map "^0.5.6"
vlq "^1.0.0"
-metro-symbolicate@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.7.tgz#e9538f4c7584d5c916825a7c0214138af59c6ab5"
- integrity sha512-WrBR5FQhVf/Y2N3zBS5TvNdwYzcQTLdJj9kcn0MIt+DpdgfLuUDjHXYaq4G9fZubofInx2dUcqr4WCn6fkIxuA==
+metro-symbolicate@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.8.tgz#881afc90453450208bf519b22e54962fc909d432"
+ integrity sha512-nwhYySk79jQhwjL9QmOUo4wS+/0Au9joEryDWw7uj4kz2yvw1uBjwmlql3BprQCBzRdB3fcqOP8kO8Es+vE31g==
dependencies:
invariant "^2.2.4"
- metro-source-map "0.80.7"
+ metro-source-map "0.80.8"
nullthrows "^1.1.1"
source-map "^0.5.6"
through2 "^2.0.1"
vlq "^1.0.0"
-metro-transform-plugins@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.7.tgz#0cd5ca5787158158453f0b5868ae6779a5f39a99"
- integrity sha512-ENGvQF7wZCtn2rO6jwsYy3XRSPrlm0G/1TgDC8AXdvz0yjfAe1ODSCYWxP8S3JXfjKL5m3b6j9RsV8sQIxsUjQ==
+metro-transform-plugins@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.8.tgz#2ed3162cec7fa7549279a6031e6d910198332a77"
+ integrity sha512-sSu8VPL9Od7w98MftCOkQ1UDeySWbsIAS5I54rW22BVpPnI3fQ42srvqMLaJUQPjLehUanq8St6OMBCBgH/UWw==
dependencies:
"@babel/core" "^7.20.0"
"@babel/generator" "^7.20.0"
@@ -7062,28 +7111,28 @@ metro-transform-plugins@0.80.7:
"@babel/traverse" "^7.20.0"
nullthrows "^1.1.1"
-metro-transform-worker@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.7.tgz#3f503dfc83671c73fb0360cd92d0762913103335"
- integrity sha512-QcgKpx3WZo71jTtXMEeeFuGpA+nG8YuWjxPTIsIYTjgDxcArS8zDDRzS18mmYkP65yyzH4dT94B1FJH9+flRag==
+metro-transform-worker@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.8.tgz#df3bc21928e1c99b077cd1e2feec9f13d6c351c6"
+ integrity sha512-+4FG3TQk3BTbNqGkFb2uCaxYTfsbuFOCKMMURbwu0ehCP8ZJuTUramkaNZoATS49NSAkRgUltgmBa4YaKZ5mqw==
dependencies:
"@babel/core" "^7.20.0"
"@babel/generator" "^7.20.0"
"@babel/parser" "^7.20.0"
"@babel/types" "^7.20.0"
- metro "0.80.7"
- metro-babel-transformer "0.80.7"
- metro-cache "0.80.7"
- metro-cache-key "0.80.7"
- metro-minify-terser "0.80.7"
- metro-source-map "0.80.7"
- metro-transform-plugins "0.80.7"
+ metro "0.80.8"
+ metro-babel-transformer "0.80.8"
+ metro-cache "0.80.8"
+ metro-cache-key "0.80.8"
+ metro-minify-terser "0.80.8"
+ metro-source-map "0.80.8"
+ metro-transform-plugins "0.80.8"
nullthrows "^1.1.1"
-metro@0.80.7, metro@^0.80.3:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.7.tgz#b9731b052e63d8a650f9e707afc905ffd470fd40"
- integrity sha512-con7RTEulmefHplqusjpoGD+r4CBuDLaeI261hFcSuTv6+Arm5FgSYmUcBa3MeqJbC/U8v0uT6MbdkEFCEl1xg==
+metro@0.80.8, metro@^0.80.3:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.8.tgz#42faa80ea8f1c43bea022b55baa3162e90878868"
+ integrity sha512-in7S0W11mg+RNmcXw+2d9S3zBGmCARDxIwoXJAmLUQOQoYsRP3cpGzyJtc7WOw8+FXfpgXvceD0u+PZIHXEL7g==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/core" "^7.20.0"
@@ -7106,18 +7155,18 @@ metro@0.80.7, metro@^0.80.3:
jest-worker "^29.6.3"
jsc-safe-url "^0.2.2"
lodash.throttle "^4.1.1"
- metro-babel-transformer "0.80.7"
- metro-cache "0.80.7"
- metro-cache-key "0.80.7"
- metro-config "0.80.7"
- metro-core "0.80.7"
- metro-file-map "0.80.7"
- metro-resolver "0.80.7"
- metro-runtime "0.80.7"
- metro-source-map "0.80.7"
- metro-symbolicate "0.80.7"
- metro-transform-plugins "0.80.7"
- metro-transform-worker "0.80.7"
+ metro-babel-transformer "0.80.8"
+ metro-cache "0.80.8"
+ metro-cache-key "0.80.8"
+ metro-config "0.80.8"
+ metro-core "0.80.8"
+ metro-file-map "0.80.8"
+ metro-resolver "0.80.8"
+ metro-runtime "0.80.8"
+ metro-source-map "0.80.8"
+ metro-symbolicate "0.80.8"
+ metro-transform-plugins "0.80.8"
+ metro-transform-worker "0.80.8"
mime-types "^2.1.27"
node-fetch "^2.2.0"
nullthrows "^1.1.1"
@@ -7192,11 +7241,12 @@ min-indent@^1.0.0:
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
mini-css-extract-plugin@^2.7.5:
- version "2.7.6"
- resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d"
- integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz#75245f3f30ce3a56dbdd478084df6fe475f02dc7"
+ integrity sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==
dependencies:
schema-utils "^4.0.0"
+ tapable "^2.2.1"
"minimatch@2 || 3", minimatch@3.0.4, minimatch@5.0.1, minimatch@9.0.3, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^5.0.1:
version "3.1.2"
@@ -7285,9 +7335,9 @@ mocha@10.0.0:
yargs-unparser "2.0.0"
moment@^2.19.3, moment@^2.29.4:
- version "2.29.4"
- resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
- integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
+ version "2.30.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
+ integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
ms@2.0.0:
version "2.0.0"
@@ -7313,29 +7363,29 @@ mv@~2:
ncp "~2.0.0"
rimraf "~2.4.0"
-nano-css@^5.3.1:
- version "5.3.5"
- resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.3.5.tgz#3075ea29ffdeb0c7cb6d25edb21d8f7fa8e8fe8e"
- integrity sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==
+nano-css@^5.6.1:
+ version "5.6.1"
+ resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.6.1.tgz#964120cb1af6cccaa6d0717a473ccd876b34c197"
+ integrity sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==
dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
css-tree "^1.1.2"
- csstype "^3.0.6"
+ csstype "^3.1.2"
fastest-stable-stringify "^2.0.2"
- inline-style-prefixer "^6.0.0"
- rtl-css-js "^1.14.0"
- sourcemap-codec "^1.4.8"
+ inline-style-prefixer "^7.0.0"
+ rtl-css-js "^1.16.1"
stacktrace-js "^2.0.2"
- stylis "^4.0.6"
+ stylis "^4.3.0"
nanoid@3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25"
integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==
-nanoid@^3.3.6:
- version "3.3.6"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
- integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
+nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
natural-compare@^1.4.0:
version "1.4.0"
@@ -7393,10 +7443,10 @@ node-addon-api@^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-api-headers@^0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/node-api-headers/-/node-api-headers-0.0.2.tgz#31f4c6c2750b63e598128e76a60aefca6d76ac5d"
- integrity sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==
+node-api-headers@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/node-api-headers/-/node-api-headers-1.1.0.tgz#3f9dd7bb10b29e1c3e3db675979605a308b2373c"
+ integrity sha512-ucQW+SbYCUPfprvmzBsnjT034IGRB2XK8rRc78BgjNKhTdFKgAwAmgW704bKIBmcYW48it0Gkjpkd39Azrwquw==
node-dir@^0.1.17:
version "0.1.17"
@@ -7472,9 +7522,9 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1:
path-key "^3.0.0"
npm-run-path@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
- integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f"
+ integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==
dependencies:
path-key "^4.0.0"
@@ -7498,17 +7548,17 @@ nwsapi@^2.2.4:
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30"
integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==
-ob1@0.80.7:
- version "0.80.7"
- resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.7.tgz#3884b45717092ebc4bb641db833c5e2390eac442"
- integrity sha512-+m1cCNckRtDEnurNSVqywpN6LhFWc1Z3MdX7PX7boCwEdSzh4evlUjBIUzao1lBOpB7G5FvwfFagTVQGCMa0Yw==
+ob1@0.80.8:
+ version "0.80.8"
+ resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.8.tgz#08be1b8398d004719074ad702c975a5c7e1b29f2"
+ integrity sha512-QHJQk/lXMmAW8I7AIM3in1MSlwe1umR72Chhi8B7Xnq6mzjhBKkA6Fy/zAhQnGkA4S912EPCEvTij5yh+EQTAA==
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-object-inspect@^1.13.1, object-inspect@^1.9.0:
+object-inspect@^1.13.1:
version "1.13.1"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
@@ -7529,50 +7579,50 @@ object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5:
object-keys "^1.1.1"
object.entries@^1.1.5, object.entries@^1.1.6:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131"
- integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41"
+ integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
object.fromentries@^2.0.6, object.fromentries@^2.0.7:
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616"
- integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
+ integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
object.groupby@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.2.tgz#494800ff5bab78fd0eff2835ec859066e00192ec"
- integrity sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e"
+ integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==
dependencies:
- array.prototype.filter "^1.0.3"
- call-bind "^1.0.5"
+ call-bind "^1.0.7"
define-properties "^1.2.1"
- es-abstract "^1.22.3"
- es-errors "^1.0.0"
+ es-abstract "^1.23.2"
object.hasown@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae"
- integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc"
+ integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==
dependencies:
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
object.values@^1.1.6, object.values@^1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a"
- integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
+ integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
on-finished@2.4.1:
version "2.4.1"
@@ -7937,19 +7987,19 @@ postcss-modules-extract-imports@^3.0.0:
resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d"
integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==
-postcss-modules-local-by-default@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524"
- integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==
+postcss-modules-local-by-default@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6"
+ integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==
dependencies:
icss-utils "^5.0.0"
postcss-selector-parser "^6.0.2"
postcss-value-parser "^4.1.0"
-postcss-modules-scope@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06"
- integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==
+postcss-modules-scope@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134"
+ integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==
dependencies:
postcss-selector-parser "^6.0.4"
@@ -7961,9 +8011,9 @@ postcss-modules-values@^4.0.0:
icss-utils "^5.0.0"
postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
- version "6.0.13"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b"
- integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
+ version "6.0.16"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04"
+ integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
@@ -7973,14 +8023,14 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-postcss@^8.4.21:
- version "8.4.29"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd"
- integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==
+postcss@^8.4.33:
+ version "8.4.38"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
+ integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
dependencies:
- nanoid "^3.3.6"
+ nanoid "^3.3.7"
picocolors "^1.0.0"
- source-map-js "^1.0.2"
+ source-map-js "^1.2.0"
postinstall-prepare@^1.0.1:
version "1.0.1"
@@ -8080,9 +8130,9 @@ protobufjs-cli@^1.1.1:
uglify-js "^3.7.7"
protobufjs@^7.2.4:
- version "7.2.5"
- resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d"
- integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==
+ version "7.2.6"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215"
+ integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==
dependencies:
"@protobufjs/aspromise" "^1.1.2"
"@protobufjs/base64" "^1.1.2"
@@ -8116,9 +8166,9 @@ pump@^3.0.0:
once "^1.3.1"
punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
- integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
pupa@^2.1.1:
version "2.1.1"
@@ -8159,7 +8209,7 @@ quick-lru@^5.1.1:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
-rambda@^7.1.0:
+rambda@^7.4.0:
version "7.5.0"
resolved "https://registry.yarnpkg.com/rambda/-/rambda-7.5.0.tgz#1865044c59bc0b16f63026c6e5a97e4b1bbe98fe"
integrity sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==
@@ -8177,21 +8227,21 @@ range-parser@~1.2.1:
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
rc-slider@^10.2.1:
- version "10.2.1"
- resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.2.1.tgz#9b571d19f740adcacdde271f44901a47717fd8da"
- integrity sha512-l355C/65iV4UFp7mXq5xBTNX2/tF2g74VWiTVlTpNp+6vjE/xaHHNiQq5Af+Uu28uUiqCuH/QXs5HfADL9KJ/A==
+ version "10.5.0"
+ resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.5.0.tgz#1bd4853d114cb3403b67c485125887adb6a2a117"
+ integrity sha512-xiYght50cvoODZYI43v3Ylsqiw14+D7ELsgzR40boDZaya1HFa1Etnv9MDkQE8X/UrXAffwv2AcNAhslgYuDTw==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.5"
rc-util "^5.27.0"
rc-util@^5.27.0:
- version "5.37.0"
- resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.37.0.tgz#6df9a55cb469b41b6995530a45b5f3dd3219a4ea"
- integrity sha512-cPMV8DzaHI1KDaS7XPRXAf4J7mtBqjvjikLpQieaeOO7+cEbqY2j7Kso/T0R0OiEZTNcLS/8Zl9YrlXiO9UbjQ==
+ version "5.39.1"
+ resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.39.1.tgz#7bca4fb55e20add0eef5c23166cd9f9e5f51a8a1"
+ integrity sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ==
dependencies:
"@babel/runtime" "^7.18.3"
- react-is "^16.12.0"
+ react-is "^18.2.0"
rc@1.2.8, rc@^1.2.7, rc@^1.2.8:
version "1.2.8"
@@ -8218,47 +8268,45 @@ react-devtools-core@^4.27.7:
shell-quote "^1.6.1"
ws "^7"
-react-dom@^17.0.2:
- version "17.0.2"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
- integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
+react-dom@^18.2.0:
+ version "18.2.0"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
+ integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
dependencies:
loose-envify "^1.1.0"
- object-assign "^4.1.1"
- scheduler "^0.20.2"
+ scheduler "^0.23.0"
react-draggable@^4.4.4:
- version "4.4.5"
- resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.5.tgz#9e37fe7ce1a4cf843030f521a0a4cc41886d7e7c"
- integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==
+ version "4.4.6"
+ resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.6.tgz#63343ee945770881ca1256a5b6fa5c9f5983fe1e"
+ integrity sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==
dependencies:
clsx "^1.1.1"
prop-types "^15.8.1"
react-h5-audio-player@^3.2.0:
- version "3.8.6"
- resolved "https://registry.yarnpkg.com/react-h5-audio-player/-/react-h5-audio-player-3.8.6.tgz#e7ee69ba6c0a82d317d4f987d83bb18b356a4415"
- integrity sha512-eyViI47jRRybCcCkGdoAMd6yfhg3UMyXp39mqOWCbNQfAYI8U6zC0+0DLZjhrB7//DJtHhZx8h1q99HMxYkMWQ==
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/react-h5-audio-player/-/react-h5-audio-player-3.9.1.tgz#8a9721fd7a5ff6a9185ce626435207bee1774e83"
+ integrity sha512-ILJdTXZgHEfv7WsvYPoN7afJncroYyg5Cxvs2qqrsnTzhtBdEuzlM0ETkhUhjqXOsAkbwAdHF9YgnEwgBJ8dCQ==
dependencies:
"@babel/runtime" "^7.10.2"
- "@iconify/icons-mdi" "~1.1.0"
- "@iconify/react" "^3.1.3"
+ "@iconify/react" "^4.1.1"
react-intersection-observer@^9.7.0:
- version "9.7.0"
- resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.7.0.tgz#da65834ace0852e04b73cb97f0c48bdaa5b13589"
- integrity sha512-euleEjBVaMRwSOMNVcMX5WGn74GfZ9I78nx9SUb5a0eXd0IhegjJcUliSO9Jd+xiaZ5rgFvbGoVln66lpMyUUg==
-
-react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0:
- version "16.13.1"
- resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
- integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+ version "9.8.1"
+ resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.8.1.tgz#9c3631c0c9acd624a2af1c192318752ea73b5d91"
+ integrity sha512-QzOFdROX8D8MH3wE3OVKH0f3mLjKTtEN1VX/rkNuECCff+aKky0pIjulDhr3Ewqj5el/L+MhBkM3ef0Tbt+qUQ==
-"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0:
+"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
+react-is@^16.13.1, react-is@^16.7.0:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
react-is@^17.0.1:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
@@ -8381,9 +8429,9 @@ react-universal-interface@^0.6.2:
integrity sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==
react-use@^17.4.0:
- version "17.4.0"
- resolved "https://registry.yarnpkg.com/react-use/-/react-use-17.4.0.tgz#cefef258b0a6c534a5c8021c2528ac6e1a4cdc6d"
- integrity sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==
+ version "17.5.0"
+ resolved "https://registry.yarnpkg.com/react-use/-/react-use-17.5.0.tgz#1fae45638828a338291efa0f0c61862db7ee6442"
+ integrity sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==
dependencies:
"@types/js-cookie" "^2.2.6"
"@xobotyi/scrollbar-width" "^1.9.5"
@@ -8391,7 +8439,7 @@ react-use@^17.4.0:
fast-deep-equal "^3.1.3"
fast-shallow-equal "^1.0.0"
js-cookie "^2.2.1"
- nano-css "^5.3.1"
+ nano-css "^5.6.1"
react-universal-interface "^0.6.2"
resize-observer-polyfill "^1.5.1"
screenfull "^5.1.0"
@@ -8412,13 +8460,12 @@ react-virtualized@^9.22.4:
prop-types "^15.7.2"
react-lifecycles-compat "^3.0.4"
-react@17.0.2, react@^17.0.2:
- version "17.0.2"
- resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
- integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
+react@18.2.0, react@^18.2.0:
+ version "18.2.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
+ integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
- object-assign "^4.1.1"
read-config-file@6.2.0:
version "6.2.0"
@@ -8527,9 +8574,9 @@ redux-persist@^6.0.0:
integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==
redux-promise-middleware@^6.1.2:
- version "6.1.3"
- resolved "https://registry.yarnpkg.com/redux-promise-middleware/-/redux-promise-middleware-6.1.3.tgz#315f6a9fcabe1f02a9c2f30fa615f838d7b01b66"
- integrity sha512-B/Hi5Ct5d9y5d/KG0f6MZUXKA0nrQh5583mHCx13HY3Avte8KfpoRH/TB5QT6k/FcjT6JCxjv7jedymidy2A1A==
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/redux-promise-middleware/-/redux-promise-middleware-6.2.0.tgz#d139dfef50992d456860f8cf07a12085bd53f89d"
+ integrity sha512-TEzfMeLX63gju2WqkdFQlQMvUGYzFvJNePIJJsBlbPHs3Txsbc/5Rjhmtha1XdMU6lkeiIlp1Qx7AR3Zo9he9g==
redux-thunk@^2.4.1:
version "2.4.2"
@@ -8560,15 +8607,16 @@ redux@^4.0.0, redux@^4.1.2:
dependencies:
"@babel/runtime" "^7.9.2"
-reflect.getprototypeof@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3"
- integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==
+reflect.getprototypeof@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859"
+ integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
- get-intrinsic "^1.2.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.1"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
globalthis "^1.0.3"
which-builtin-type "^1.1.3"
@@ -8590,11 +8638,11 @@ regenerator-runtime@^0.13.2:
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
regenerator-runtime@^0.14.0:
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
- integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
-regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.2:
+regexp.prototype.flags@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
@@ -8723,11 +8771,11 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4:
supports-preserve-symlinks-flag "^1.0.0"
resolve@^2.0.0-next.4:
- version "2.0.0-next.4"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660"
- integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==
+ version "2.0.0-next.5"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
+ integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
dependencies:
- is-core-module "^2.9.0"
+ is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -8770,9 +8818,9 @@ reusify@^1.0.4:
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rfdc@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
- integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
+ integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
rimraf@2.6.2:
version "2.6.2"
@@ -8788,7 +8836,7 @@ rimraf@^2.6.3:
dependencies:
glob "^7.1.3"
-rimraf@^3.0.0, rimraf@^3.0.2:
+rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -8826,7 +8874,7 @@ rrweb-cssom@^0.6.0:
resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1"
integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==
-rtl-css-js@^1.14.0:
+rtl-css-js@^1.16.1:
version "1.16.1"
resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80"
integrity sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==
@@ -8845,13 +8893,13 @@ run-script-os@^1.1.6:
resolved "https://registry.yarnpkg.com/run-script-os/-/run-script-os-1.1.6.tgz#8b0177fb1b54c99a670f95c7fdc54f18b9c72347"
integrity sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==
-safe-array-concat@^1.0.0, safe-array-concat@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692"
- integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==
+safe-array-concat@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
+ integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
dependencies:
- call-bind "^1.0.5"
- get-intrinsic "^1.2.2"
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
has-symbols "^1.0.3"
isarray "^2.0.5"
@@ -8897,25 +8945,25 @@ sanitize.css@^12.0.1:
integrity sha512-QbusSBnWHaRBZeTxsJyknwI0q+q6m1NtLBmB76JfW/rdVN7Ws6Zz70w65+430/ouVcdNVT3qwrDgrM6PaYyRtw==
sass-loader@^13.2.2:
- version "13.3.2"
- resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6"
- integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==
+ version "13.3.3"
+ resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133"
+ integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==
dependencies:
neo-async "^2.6.2"
sass@^1.60.0:
- version "1.66.1"
- resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1"
- integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==
+ version "1.72.0"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c"
+ integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
sax@^1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
- integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0"
+ integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==
saxes@^6.0.0:
version "6.0.0"
@@ -8931,13 +8979,12 @@ scheduler@0.24.0-canary-efb381bbf-20230505:
dependencies:
loose-envify "^1.1.0"
-scheduler@^0.20.2:
- version "0.20.2"
- resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
- integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
+scheduler@^0.23.0:
+ version "0.23.0"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
+ integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
dependencies:
loose-envify "^1.1.0"
- object-assign "^4.1.1"
schema-utils@^3.1.1, schema-utils@^3.2.0:
version "3.3.0"
@@ -8997,7 +9044,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.4:
+semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.4:
version "7.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
@@ -9043,9 +9090,9 @@ serialize-javascript@6.0.0:
randombytes "^2.1.0"
serialize-javascript@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c"
- integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"
+ integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
dependencies:
randombytes "^2.1.0"
@@ -9065,18 +9112,18 @@ set-blocking@^2.0.0:
integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
set-function-length@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425"
- integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
dependencies:
- define-data-property "^1.1.2"
+ define-data-property "^1.1.4"
es-errors "^1.3.0"
function-bind "^1.1.2"
- get-intrinsic "^1.2.3"
+ get-intrinsic "^1.2.4"
gopd "^1.0.1"
- has-property-descriptors "^1.0.1"
+ has-property-descriptors "^1.0.2"
-set-function-name@^2.0.1:
+set-function-name@^2.0.1, set-function-name@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
@@ -9137,14 +9184,15 @@ shell-quote@^1.6.1, shell-quote@^1.7.3:
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
-side-channel@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
- integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+side-channel@^1.0.4, side-channel@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
dependencies:
- call-bind "^1.0.0"
- get-intrinsic "^1.0.2"
- object-inspect "^1.9.0"
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
version "3.0.7"
@@ -9210,10 +9258,10 @@ smart-buffer@^4.0.2:
resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
-"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
- integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
+ integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@~0.5.20:
version "0.5.21"
@@ -9238,16 +9286,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@^0.7.3:
+source-map@^0.7.3, source-map@^0.7.4:
version "0.7.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
-sourcemap-codec@^1.4.8:
- version "1.4.8"
- resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
- integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
-
spdx-correct@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
@@ -9257,9 +9300,9 @@ spdx-correct@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-exceptions@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
- integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66"
+ integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
spdx-expression-parse@^3.0.0:
version "3.0.1"
@@ -9270,9 +9313,9 @@ spdx-expression-parse@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.13"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5"
- integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==
+ version "3.0.17"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c"
+ integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==
split2@^3.0.0, split2@^3.2.2:
version "3.2.2"
@@ -9282,9 +9325,9 @@ split2@^3.0.0, split2@^3.2.2:
readable-stream "^3.0.0"
sprintf-js@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
- integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
+ integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
sprintf-js@~1.0.2:
version "1.0.3"
@@ -9373,45 +9416,50 @@ string-width@^5.0.0, string-width@^5.0.1:
strip-ansi "^7.0.1"
string.prototype.matchall@^4.0.8:
- version "4.0.9"
- resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d"
- integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a"
+ integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
- get-intrinsic "^1.2.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
has-symbols "^1.0.3"
- internal-slot "^1.0.5"
- regexp.prototype.flags "^1.5.0"
- side-channel "^1.0.4"
+ internal-slot "^1.0.7"
+ regexp.prototype.flags "^1.5.2"
+ set-function-name "^2.0.2"
+ side-channel "^1.0.6"
-string.prototype.trim@^1.2.8:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd"
- integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
+string.prototype.trim@^1.2.9:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
+ integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.0"
+ es-object-atoms "^1.0.0"
-string.prototype.trimend@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e"
- integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
+string.prototype.trimend@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
+ integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
-string.prototype.trimstart@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298"
- integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
string_decoder@^1.1.1:
version "1.3.0"
@@ -9501,10 +9549,10 @@ styled-components@5.1.1:
shallowequal "^1.1.0"
supports-color "^5.5.0"
-stylis@^4.0.6:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c"
- integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==
+stylis@^4.3.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb"
+ integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==
substyle@^9.1.0:
version "9.4.1"
@@ -9567,15 +9615,15 @@ tabbable@^6.2.0:
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
-tapable@^2.1.1, tapable@^2.2.0:
+tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
-tar@^6.1.0, tar@^6.1.11:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73"
- integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==
+tar@^6.1.0, tar@^6.1.11, tar@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
+ integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
dependencies:
chownr "^2.0.0"
fs-minipass "^2.0.0"
@@ -9604,21 +9652,21 @@ temp@^0.8.4:
dependencies:
rimraf "~2.6.2"
-terser-webpack-plugin@^5.3.7:
- 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==
+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.17"
+ "@jridgewell/trace-mapping" "^0.3.20"
jest-worker "^27.4.5"
schema-utils "^3.1.1"
serialize-javascript "^6.0.1"
- terser "^5.16.8"
+ terser "^5.26.0"
-terser@^5.14.2, terser@^5.15.0, terser@^5.16.8:
- version "5.19.4"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd"
- integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==
+terser@^5.14.2, terser@^5.15.0, terser@^5.26.0:
+ version "5.30.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.2.tgz#79fc2222c241647cea54ab928ac987ffbe8ce9e2"
+ integrity sha512-vTDjRKYKip4dOFL5VizdoxHTYDfEXPdz5t+FbxCC5Rp2s+KbEO8w5wqMDPgj7CtFKZuzq7PXv28fZoXfqqBVuw==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@@ -9685,11 +9733,9 @@ tmp@^0.0.33:
os-tmpdir "~1.0.2"
tmp@^0.2.0, tmp@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
- integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
- dependencies:
- rimraf "^3.0.0"
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae"
+ integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==
tmpl@1.0.5:
version "1.0.5"
@@ -9753,9 +9799,9 @@ truncate-utf8-bytes@^1.0.0:
utf8-byte-length "^1.0.1"
ts-api-utils@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.2.tgz#7c094f753b6705ee4faee25c3c684ade52d66d99"
- integrity sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
+ integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
ts-easing@^0.2.0:
version "0.2.0"
@@ -9763,19 +9809,20 @@ ts-easing@^0.2.0:
integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==
ts-loader@^9.4.2:
- version "9.4.4"
- resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4"
- integrity sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==
+ version "9.5.1"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89"
+ integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==
dependencies:
chalk "^4.1.0"
enhanced-resolve "^5.0.0"
micromatch "^4.0.0"
semver "^7.3.4"
+ source-map "^0.7.4"
ts-node@^10.8.1:
- version "10.9.1"
- resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b"
- integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==
+ version "10.9.2"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f"
+ integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==
dependencies:
"@cspotcode/source-map-support" "^0.8.0"
"@tsconfig/node10" "^1.0.7"
@@ -9801,7 +9848,7 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@^2.0.1, tslib@^2.1.0:
+tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
@@ -9820,7 +9867,7 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"
-type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8:
+type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
@@ -9860,7 +9907,7 @@ type-fest@^1.0.2:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1"
integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==
-typed-array-buffer@^1.0.1:
+typed-array-buffer@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
@@ -9869,35 +9916,40 @@ typed-array-buffer@^1.0.1:
es-errors "^1.3.0"
is-typed-array "^1.1.13"
-typed-array-byte-length@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0"
- integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==
+typed-array-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
+ integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
dependencies:
- call-bind "^1.0.2"
+ call-bind "^1.0.7"
for-each "^0.3.3"
- has-proto "^1.0.1"
- is-typed-array "^1.1.10"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
-typed-array-byte-offset@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b"
- integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==
+typed-array-byte-offset@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
+ integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
dependencies:
- available-typed-arrays "^1.0.5"
- call-bind "^1.0.2"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
for-each "^0.3.3"
- has-proto "^1.0.1"
- is-typed-array "^1.1.10"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
-typed-array-length@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
- integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+typed-array-length@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
+ integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
dependencies:
- call-bind "^1.0.2"
+ call-bind "^1.0.7"
for-each "^0.3.3"
- is-typed-array "^1.1.9"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
typedarray-to-buffer@^3.1.5:
version "3.1.5"
@@ -9906,10 +9958,10 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
-"typescript@^4.6.4 || ^5.0.0", typescript@^5.1.6:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
- integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
+"typescript@^4.6.4 || ^5.2.2", typescript@^5.1.6:
+ version "5.4.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff"
+ integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==
uc.micro@^1.0.1, uc.micro@^1.0.5:
version "1.0.6"
@@ -9936,6 +9988,11 @@ underscore@>=1.8.3, underscore@~1.13.2:
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441"
integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
@@ -9982,9 +10039,9 @@ universalify@^1.0.0:
integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==
universalify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
- integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
unpipe@~1.0.0:
version "1.0.0"
@@ -10115,10 +10172,10 @@ walker@^1.0.7:
dependencies:
makeerror "1.0.12"
-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.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff"
+ integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==
dependencies:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
@@ -10160,11 +10217,12 @@ webpack-cli@^5.1.4:
webpack-merge "^5.7.3"
webpack-merge@^5.7.3:
- version "5.9.0"
- resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826"
- integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177"
+ integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==
dependencies:
clone-deep "^4.0.1"
+ flat "^5.0.2"
wildcard "^2.0.0"
webpack-sources@^3.2.3:
@@ -10173,33 +10231,33 @@ webpack-sources@^3.2.3:
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
webpack@^5.76.3:
- version "5.88.2"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e"
- integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==
+ version "5.91.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9"
+ integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==
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"
+ "@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"
+ browserslist "^4.21.10"
chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.15.0"
+ enhanced-resolve "^5.16.0"
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"
webrtc-adapter@^4.1.1:
@@ -10272,30 +10330,30 @@ which-builtin-type@^1.1.3:
which-typed-array "^1.1.9"
which-collection@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
- integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
+ integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
dependencies:
- is-map "^2.0.1"
- is-set "^2.0.1"
- is-weakmap "^2.0.1"
- is-weakset "^2.0.1"
+ is-map "^2.0.3"
+ is-set "^2.0.3"
+ is-weakmap "^2.0.2"
+ is-weakset "^2.0.3"
which-module@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
-which-typed-array@^1.1.14, which-typed-array@^1.1.9:
- version "1.1.14"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06"
- integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==
+which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
+ integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
dependencies:
- available-typed-arrays "^1.0.6"
- call-bind "^1.0.5"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
for-each "^0.3.3"
gopd "^1.0.1"
- has-tostringtag "^1.0.1"
+ has-tostringtag "^1.0.2"
which@^1.2.9:
version "1.3.1"
@@ -10404,9 +10462,9 @@ ws@^7, ws@^7.5.1:
integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
ws@^8.13.0:
- version "8.14.0"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.0.tgz#6c5792c5316dc9266ba8e780433fc45e6680aecd"
- integrity sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==
+ version "8.16.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4"
+ integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
xdg-basedir@^4.0.0:
version "4.0.0"
@@ -10536,7 +10594,7 @@ yargs@^15.1.0:
y18n "^4.0.0"
yargs-parser "^18.1.2"
-yargs@^17.0.0, yargs@^17.0.1, yargs@^17.6.0, yargs@^17.6.2:
+yargs@^17.0.0, yargs@^17.0.1, yargs@^17.6.2, 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==