diff --git a/.babelrc b/.babelrc index 07c345907f..7e699a75db 100644 --- a/.babelrc +++ b/.babelrc @@ -11,15 +11,5 @@ }, } ] - ], - "plugins": [ - "@babel/plugin-proposal-optional-chaining", - [ - "formatjs", - { - "idInterpolationPattern": "[sha512:contenthash:base64:6]", - "ast": true - } - ] ] } diff --git a/.env.dev b/.env.dev index 1e023959f7..951b40aa01 100644 --- a/.env.dev +++ b/.env.dev @@ -29,6 +29,10 @@ NEXT_PUBLIC_LOGBOOKS_URL=https://logbooks-vercel.matters.town NEXT_PUBLIC_ALCHEMY_KEY=1dMo8xjAFo8M6Y4sQ45WTD3Zie2-MA4C NEXT_PUBLIC_USDT_CONTRACT_ADDRESS=0xfe4F5145f6e09952a5ba9e956ED0C25e3Fa4c7F1 NEXT_PUBLIC_CURATION_CONTRACT_ADDRESS=0xa219c6722008aa22828b31a13ab9ba93bb91222c +NEXT_PUBLIC_GOOGLE_CLIENT_ID=315393900359-2r9fundftis7dc0tdeo2hf8630nfdd8h.apps.googleusercontent.com +NEXT_PUBLIC_TWITTER_CLIENT_ID=X3d6Szg5bnVCMm5wRWxSVmhXUTc6MTpjaQ +NEXT_PUBLIC_FACEBOOK_CLIENT_ID=823885921293850 +NEXT_PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY=0x4AAAAAAAKiedvR5qiLUhIs DEBUG=false PLAYWRIGHT_RUNTIME_ENV=ci PLAYWRIGHT_TEST_BASE_URL=https://web-develop.matters.town diff --git a/.env.prod b/.env.prod index f3246d8c6e..c0d1487bc5 100644 --- a/.env.prod +++ b/.env.prod @@ -8,6 +8,8 @@ NEXT_PUBLIC_RUNTIME_ENV=production NEXT_PUBLIC_SITE_DOMAIN=matters.town NEXT_PUBLIC_SITE_BRAND_NAME=Matters.Town +NEXT_PUBLIC_SITE_DOMAIN_TLD=matters.town +NEXT_PUBLIC_SITE_DOMAIN_TLD_OLD=matters.news NEXT_PUBLIC_EMBED_ASSET_DOMAIN=assets.matters.news NEXT_PUBLIC_CF_IMAGE_URL=https://imagedelivery.net/kDRCweMmqLnTPNlbum-pYA/prod NEXT_PUBLIC_NEXT_ASSET_DOMAIN=assets-next.mattersprotocol.io @@ -27,4 +29,8 @@ NEXT_PUBLIC_LOGBOOKS_URL=https://logbook.matters.town NEXT_PUBLIC_ALCHEMY_KEY=bOu-fCphi9mvePsxg968Qe-pidHQNdlT NEXT_PUBLIC_USDT_CONTRACT_ADDRESS=0xc2132D05D31c914a87C6611C10748AEb04B58e8F NEXT_PUBLIC_CURATION_CONTRACT_ADDRESS=0x5edebbdae7b5c79a69aacf7873796bb1ec664db8 +NEXT_PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY=0x4AAAAAAAKVODkJMwfIxG78 DEBUG=false +NEXT_PUBLIC_GOOGLE_CLIENT_ID=44467013562-jg111f44kohi2s2fqqm6uq7ifudvvorq.apps.googleusercontent.com +NEXT_PUBLIC_TWITTER_CLIENT_ID=cmdKbUlyd1ZZZDZYa3dTampidGo6MTpjaQ +NEXT_PUBLIC_FACEBOOK_CLIENT_ID=1415638158583454 diff --git a/.eslintrc.json b/.eslintrc.json index dc9e1b922b..03eff5688d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,12 +5,22 @@ "plugin:storybook/recommended" ], "plugins": [ - "simple-import-sort" + "simple-import-sort", + "formatjs" ], "rules": { "simple-import-sort/imports": "error", "simple-import-sort/exports": "error", "react-hooks/exhaustive-deps": "off", - "@next/next/no-img-element": "off" + "@next/next/no-img-element": "off", + "formatjs/no-offset": "error", + "formatjs/enforce-default-message": "error", + "formatjs/no-multiple-whitespaces": "error", + "formatjs/enforce-id": [ + "error", + { + "idInterpolationPattern": "[sha512:contenthash:base64:6]" + } + ] } } diff --git a/.gitignore b/.gitignore index 8235f9beb7..1b1f597068 100644 --- a/.gitignore +++ b/.gitignore @@ -135,3 +135,4 @@ compiled-lang # Relay build output *__generated__* +*.diff diff --git a/crowdin.yml b/crowdin.yml index 2469310f19..3c57cbce58 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,6 @@ +commit_message: 'docs: new translation %original_file_name% (%language%) [ci skip]' +append_commit_message: false + files: - source: /lang/default.json translation: /lang/%locale%.json diff --git a/lang/default.json b/lang/default.json index 8b33fac25a..6e91ccf880 100644 --- a/lang/default.json +++ b/lang/default.json @@ -1,4 +1,12 @@ { + "+51DoZ": { + "defaultMessage": "Please verify email first", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" + }, + "+63O1f": { + "defaultMessage": "Incorrect email or password", + "description": "USER_PASSWORD_INVALID" + }, "+7SAix": { "defaultMessage": "Must be between 2-12 characters long." }, @@ -16,13 +24,32 @@ "defaultMessage": "Are you sure you want to remove ‘{article}’ from this collection?", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, + "+o9W2T": { + "defaultMessage": "File upload failed, please verify the file link is valid, or manually download and upload again.", + "description": "UNABLE_TO_UPLOAD_FROM_URL" + }, + "+rB5Am": { + "defaultMessage": "Article not found", + "description": "ARTICLE_NOT_FOUND" + }, + "+vVZ/G": { + "defaultMessage": "Connect" + }, "/3kw6k": { "defaultMessage": "Adding contents into IPFS network, and it usually takes some times, please wait. You can accelerate the process by publishing new article.", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, + "/BQWEh": { + "defaultMessage": "Last 1 month", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, "/IMR+8": { "defaultMessage": "Top Supporters" }, + "/TXBJR": { + "defaultMessage": "Unknown error. Please try again later.", + "description": "UNKNOWN_ERROR" + }, "/asuIY": { "defaultMessage": "Enter Community", "description": "src/components/Forms/EmailSignUpForm/Complete.tsx" @@ -30,8 +57,9 @@ "/jJLYy": { "defaultMessage": "Transactions" }, - "/ns2st": { - "defaultMessage": "Download App" + "/pnYHM": { + "defaultMessage": "Circle not found", + "description": "CIRCLE_NOT_FOUND" }, "/podGX": { "defaultMessage": "Public", @@ -40,6 +68,10 @@ "0Azlrb": { "defaultMessage": "Manage" }, + "0CyECR": { + "defaultMessage": "Matters ID has been set up. More account info can be found in Settings", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "0JLcHr": { "defaultMessage": "Caution: The following content may include age-restricted or explicit content, violence, gore, etc. Some may experience discomfort and psychological distress.", "description": "src/views/ArticleDetail/Wall/Sensitive/index.tsx" @@ -51,6 +83,18 @@ "defaultMessage": "Create collection", "description": "src/views/User/Collections/UserCollections.tsx" }, + "0e1xjL": { + "defaultMessage": "Email can be modified up to {count} times per day.", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, + "0iyH+q": { + "defaultMessage": "Last 7 days", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, + "0jvbdb": { + "defaultMessage": "Oops. Something went wrong. Please try again later.", + "description": "INTERNAL_SERVER_ERROR" + }, "0qagOO": { "defaultMessage": "Circle Subscription", "description": "src/components/Transaction/index.tsx" @@ -59,18 +103,34 @@ "defaultMessage": "Failed", "description": "src/components/Transaction/State/index.tsx" }, + "1QrwIl": { + "defaultMessage": "Take a look", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "1Z1M77": { "defaultMessage": "No data yet", "description": "src/views/Me/History/index.tsx" }, + "1hyiZ8": { + "defaultMessage": "Confirm Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "1qQzV0": { "defaultMessage": "Invitees", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "1y1U9f": { + "defaultMessage": "Liker ID is already taken.", + "description": "LIKER_USER_ID_EXISTS" + }, "1zVIWy": { "defaultMessage": "mentioned you in a comment at {commentArticle}", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" }, + "202PEj": { + "defaultMessage": "Confirm Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "20bImY": { "defaultMessage": "Discussion" }, @@ -81,48 +141,64 @@ "defaultMessage": "Total", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "2DkkhD": { + "defaultMessage": "Settings - Notifications", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "2P5JII": { + "defaultMessage": "Disconnect", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "2W0f9h": { "defaultMessage": "Bio" }, "2atspc": { "defaultMessage": "Drafts" }, + "2ef/Xl": { + "defaultMessage": "Block", + "description": "src/views/Me/Settings/Blocked/ToggleBlockButton.tsx" + }, "2oxLHg": { "defaultMessage": "Up to 3 articles/collections can be pinned" }, "2slIPX": { "defaultMessage": "Likes" }, + "2vpUYs": { + "defaultMessage": "New replies to discussions", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "32bml8": { "defaultMessage": "Following", "description": "src/components/Layout/SideNav/index.tsx" }, + "39AHJm": { + "defaultMessage": "Sign Up" + }, "3KNMbJ": { "defaultMessage": "Articles" }, - "3kbIhS": { - "defaultMessage": "Untitled" + "3Tg548": { + "defaultMessage": "Sign In", + "description": "src/components/Forms/SelectAuthMethodForm/AuthTabs.tsx" }, - "3uQKhx": { - "defaultMessage": "Please email", - "description": "src/views/Help/index.tsx" + "3phEFL": { + "defaultMessage": "Continued use indicates your agreement to", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" }, "3yk8fB": { "defaultMessage": "Wallet" }, - "3ynsJ3": { - "defaultMessage": "Want to know more? Check the", - "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" - }, "47FYwb": { "defaultMessage": "Cancel" }, "4CrCbD": { "defaultMessage": "Community" }, - "4giHJT": { - "defaultMessage": "Have wallet questions on mobile device ? Click the", - "description": "src/components/Forms/WalletAuthForm/Select.tsx" + "4KuZ0o": { + "defaultMessage": "Asset not found", + "description": "ASSET_NOT_FOUND" }, "4l6vz1": { "defaultMessage": "Copy" @@ -135,16 +211,29 @@ "defaultMessage": "No discussion yet", "description": "src/views/Circle/Discussion/Discussion.tsx" }, + "5CcjZy": { + "defaultMessage": "Do you want to disconnect from {type}?", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "5FO4vn": { "defaultMessage": "You do not have permission to perform this operation" }, - "5MDGuM": { - "defaultMessage": "Enter your email" + "5JN+nl": { + "defaultMessage": "Check your inbox", + "description": "src/components/Forms/Verification/LinkSent.tsx" + }, + "5MDA6O": { + "defaultMessage": "This tag is already taken", + "description": "DUPLICATE_TAG" }, "5iii3x": { "defaultMessage": "Circle:", "description": "src/components/CircleDigest/UserProfile/index.tsx" }, + "5sWnog": { + "defaultMessage": "Liker ID email is already taken.", + "description": "LIKER_EMAIL_EXISTS" + }, "5sg7KC": { "defaultMessage": "Password" }, @@ -159,6 +248,10 @@ "defaultMessage": "Set threshold for circle (per month)", "description": "src/components/Forms/CreateCircleForm/Init.tsx" }, + "6N2LKY": { + "defaultMessage": "Please log in again.", + "description": "OAUTH_TOKEN_INVALID" + }, "6OBAOi": { "defaultMessage": "subscribers_empty", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -171,12 +264,17 @@ "defaultMessage": "All", "description": "src/views/Me/Transactions/index.tsx" }, - "6flWFg": { - "defaultMessage": "Term of Services" + "6e8teX": { + "defaultMessage": "Notifications", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" }, "6kMb9Z": { "defaultMessage": "On-chain records" }, + "6lwWCu": { + "defaultMessage": "Misc", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" + }, "6q0G5e": { "defaultMessage": "Successfully added", "description": "src/components/Dialogs/CollectionSelectDialog/index.tsx" @@ -185,6 +283,14 @@ "defaultMessage": "Cancelled", "description": "src/components/Transaction/State/index.tsx" }, + "70UCEy": { + "defaultMessage": "Have wallet questions on mobile device ? Click the", + "description": "src/components/Forms/WalletAuthForm/Select.tsx" + }, + "73iajM": { + "defaultMessage": "Oops. Something went wrong. Please try again later.", + "description": "BAD_USER_INPUT" + }, "77tYPg": { "defaultMessage": "After deletion, the {commentType} will be removed immediately", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" @@ -196,6 +302,9 @@ "7JlauX": { "defaultMessage": "Explore" }, + "7cwoRo": { + "defaultMessage": "The author has disabled comments for this article" + }, "7jjWxF": { "defaultMessage": "No results", "description": "src/components/Dialogs/AddArticlesCollectionDialog/SearchingDialogContent.tsx" @@ -211,13 +320,25 @@ "8KFsZN": { "defaultMessage": "Read Counts" }, - "8PWD05": { - "defaultMessage": "invites you to {tag} collaborator", - "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx" - }, "8cv9D4": { "defaultMessage": "Next Step" }, + "8iciCA": { + "defaultMessage": "Entity not found", + "description": "ENTITY_NOT_FOUND" + }, + "8qGjpr": { + "defaultMessage": "Settings", + "description": "src/views/Me/Settings/Misc/index.tsx" + }, + "8rMZWb": { + "defaultMessage": "replied to your discussion on", + "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" + }, + "8t6Cs8": { + "defaultMessage": "Matters Daily Report", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, "8w3GEA": { "defaultMessage": "mentioned you in {article}", "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx" @@ -226,15 +347,15 @@ "defaultMessage": "Unsubscribe Circle", "description": "src/views/Circle/Profile/DropdownActions/index.tsx" }, - "9+Ddtu": { - "defaultMessage": "Next" - }, "9Fpc9S": { "defaultMessage": "Bug Report" }, "9J0iCw": { "defaultMessage": "Deleted user" }, + "9Vkz9W": { + "defaultMessage": "Maximum image area is limited to 100 megapixels (for example, 10,000×10,000 pixels)." + }, "9mfw9c": { "defaultMessage": "Wallet address", "description": "src/components/UserProfile/WalletLabel/WalletDialog/index.tsx" @@ -243,19 +364,22 @@ "defaultMessage": "Discussion sent", "description": "src/views/Circle/Discussion/Discussion.tsx" }, + "A0KB7s": { + "defaultMessage": "New replies to broadcast", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "A3g33H": { "defaultMessage": "Archived articles can only be seen by you, and this operation cannot be undone. If this article has been added to collections, it will be removed. (IPFS version will not be effected)" }, - "A3rLZt": { - "defaultMessage": "Last {months} months", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" - }, "A41QIy": { "defaultMessage": "Enter Password" }, "A6ozr9": { "defaultMessage": "Collection name" }, + "A6r2p1": { + "defaultMessage": "Enter Matters" + }, "A7ugfn": { "defaultMessage": "More Actions" }, @@ -263,6 +387,10 @@ "defaultMessage": "Payment suspended or returned by card issuer when there are doubts about the transaction", "description": "src/components/Transaction/index.tsx" }, + "AEiogR": { + "defaultMessage": "This Google account is connected to a Matters account. Sign in to that account to disconnect it then try again", + "description": "USER_SOCIAL_ACCOUNT_EXISTS" + }, "AGcU5J": { "defaultMessage": "Pin Broadcast", "description": "src/components/Comment/DropdownActions/PinButton.tsx" @@ -283,6 +411,18 @@ "defaultMessage": "Followers", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "At8Qd2": { + "defaultMessage": "Account", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" + }, + "Avukw5": { + "defaultMessage": "The payment amount is too small, please re-enter.", + "description": "PAYMENT_AMOUNT_TOO_SMALL" + }, + "AwQHHA": { + "defaultMessage": "Please set your transcation password.", + "description": "PAYMENT_PASSWORD_NOT_SET" + }, "B2As08": { "defaultMessage": "That's all", "description": "src/components/Interaction/InfiniteScroll/EndOfResults/index.tsx" @@ -291,6 +431,13 @@ "defaultMessage": "commented in {commentCircle}", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" }, + "BMGZE2": { + "defaultMessage": "Mention me", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "BY343C": { + "defaultMessage": "Change" + }, "Bc20la": { "defaultMessage": "days" }, @@ -298,6 +445,14 @@ "defaultMessage": "followers_empty", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "BnMru1": { + "defaultMessage": "Language", + "description": "src/views/Me/Settings/Misc/Language.tsx" + }, + "C3NKBg": { + "defaultMessage": "Connected to {type}", + "description": "src/views/Me/Settings/Settings/Socials/index.tsx" + }, "C8GQaD": { "defaultMessage": "upadted {date}", "description": "src/components/CollectionDigest/Feed/index.tsx" @@ -309,10 +464,6 @@ "defaultMessage": "bookmarked", "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx" }, - "CNbggD": { - "defaultMessage": "became the maintainer of {tag}", - "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx" - }, "Cdkhl8": { "defaultMessage": "Delete {commentType}", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" @@ -320,16 +471,20 @@ "CnPG8j": { "defaultMessage": "Featured" }, + "CoF9qv": { + "defaultMessage": "Are you sure you want to disconnect from this?", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, "Cu3Cty": { "defaultMessage": "month" }, - "CwSpld": { - "defaultMessage": "Not for login", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "CxYcYR": { "defaultMessage": "Recommended square image." }, + "D+N1Q6": { + "defaultMessage": "This {type} account is connected to a Matters account. Sign in to that account to disconnect it then try again", + "description": "src/views/Me/Settings/Settings/Socials/index.tsx" + }, "D2Sw/t": { "defaultMessage": "Add any URL in the following list into RSS reader", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" @@ -337,14 +492,26 @@ "D3idYv": { "defaultMessage": "Settings" }, - "DFieKt": { - "defaultMessage": "resigned from {tag} collaborator", - "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx" + "DUoV1W": { + "defaultMessage": "Over 140 words, current {numbers}", + "description": "src/components/Dialogs/EditProfileDialog/Content.tsx" }, "DYrDcG": { "defaultMessage": "Badges", "description": "src/components/UserProfile/index.tsx" }, + "Dq29Hb": { + "defaultMessage": "You have not connected your email yet. For security, email is required for top-up.", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, + "DqQvtL": { + "defaultMessage": "Unblock", + "description": "src/views/Me/Settings/Blocked/ToggleBlockButton.tsx" + }, + "Dt1o78": { + "defaultMessage": "Wallet is linked to a different account", + "description": "src/components/AuthMethodFeed/AuthWalletFeed.tsx" + }, "DyuHBH": { "defaultMessage": "Unpin from profile", "description": "src/components/CollectionDigest/DropdownActions/PinButton.tsx" @@ -364,12 +531,17 @@ "defaultMessage": "commented broadcast in {circleName}", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, - "EfJYPI": { - "defaultMessage": "Verification Code", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "EoeUjA": { + "defaultMessage": "You do not have permission to perform this operation", + "description": "FORBIDDEN_BY_STATE" + }, + "EwbNbl": { + "defaultMessage": "Oops!This link has expired", + "description": "src/views/Callback/GoogleCallback.tsx" }, - "EwVnoC": { - "defaultMessage": "I have read and agree to" + "FEI5Fv": { + "defaultMessage": "Email address", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" }, "FOOymB": { "defaultMessage": "No members yet", @@ -396,6 +568,18 @@ "defaultMessage": "Collection is deleted", "description": "src/components/CollectionDigest/DropdownActions/DeleteCollection/Dialog.tsx" }, + "FxrSCh": { + "defaultMessage": "This ID cannot be modified. Are you sure you want to use {id} as your Matters ID?", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, + "GG9uXH": { + "defaultMessage": "Please go to the relevant page to resend the link. You can also", + "description": "src/views/Callback/GoogleCallback.tsx" + }, + "GHxtae": { + "defaultMessage": "Wallet", + "description": "src/components/Forms/SelectAuthMethodForm/AuthTabs.tsx" + }, "GRtGnZ": { "defaultMessage": "Resign From Maintainer", "description": "src/views/TagDetail/DropdownActions/index.tsx" @@ -414,6 +598,14 @@ "GcvLBC": { "defaultMessage": "Understood" }, + "GhogWq": { + "defaultMessage": "Subscription cancellations", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "Gt7K6r": { + "defaultMessage": "Wallet address", + "description": "src/views/Me/Settings/Settings/Wallet/index.tsx" + }, "GugBCe": { "defaultMessage": "New Followers This Month", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" @@ -434,17 +626,36 @@ "HJ0iZJ": { "defaultMessage": "Confirm Archiving" }, + "HPVOw/": { + "defaultMessage": "Wallet", + "description": "src/views/Me/Settings/Settings/index.tsx" + }, + "HkozYU": { + "defaultMessage": "Switch wallet", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, + "HnxG15": { + "defaultMessage": "Set" + }, + "HqnUd1": { + "defaultMessage": "Add hash from IPFS into compatible reader such as", + "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" + }, "HxcjQl": { "defaultMessage": "Matters continues to provide services that combine creativity with blockchain technology. You will be the first to experience them after completing connecting wallet.", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, - "HzaRKA": { - "defaultMessage": "Migrate to Matters" - }, "IKPYe9": { "defaultMessage": "View", "description": "src/components/Dialogs/CollectionSelectDialog/index.tsx" }, + "IPqNCS": { + "defaultMessage": "Confirm use", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, + "IXycMo": { + "defaultMessage": "Resend" + }, "Ihwz5K": { "defaultMessage": "Unpinned from profile" }, @@ -452,10 +663,6 @@ "defaultMessage": "invites you to join the circle {circleName} , and you can experience it for {freePeriod} days for free", "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx" }, - "J+LXrH": { - "defaultMessage": "User registered by email can login and enable wallet login later", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" - }, "JTWayV": { "defaultMessage": "Add description", "description": "src/views/User/CollectionDetail/Content.tsx" @@ -467,6 +674,10 @@ "defaultMessage": "Enter Circle", "description": "src/components/CircleDigest/UserProfile/index.tsx" }, + "JkWLg6": { + "defaultMessage": "New followers", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "JpS59y": { "defaultMessage": "Accepted", "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx" @@ -475,13 +686,17 @@ "defaultMessage": "This article has been removed from Trending", "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx" }, - "JxlxVc": { - "defaultMessage": "Forget Password", - "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + "K2/mHF": { + "defaultMessage": "Unable to disconnect from {type} temporarily because you do not have any other log in methods (Email/Crypto wallet/Social account).", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" }, "K3r6DQ": { "defaultMessage": "Delete" }, + "KIQUHo": { + "defaultMessage": "Login password", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" + }, "KLQ1/z": { "defaultMessage": "Circle successfully created", "description": "src/components/Forms/CreateCircleForm/Profile.tsx" @@ -493,10 +708,22 @@ "KQi/UZ": { "defaultMessage": "Archive works" }, + "KlJEP9": { + "defaultMessage": "Wallet connected", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, + "KxVlDj": { + "defaultMessage": "Settings - Blocked Users", + "description": "src/views/Me/Settings/Blocked/index.tsx" + }, "L0J61B": { "defaultMessage": "Free", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "L34EMG": { + "defaultMessage": "No account?", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "L4Fcr8": { "defaultMessage": "New Collection" }, @@ -526,24 +753,49 @@ "defaultMessage": "IPNS Subscription", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, - "LphWYP": { - "defaultMessage": "Terms and Privacy Policy" + "LmiUWG": { + "defaultMessage": "You do not have permissionn to perform this operation", + "description": "FORBIDDEN_BY_TARGET_STATE" + }, + "Lp6CiR": { + "defaultMessage": "Settings - Misc", + "description": "src/views/Me/Settings/Misc/index.tsx" }, "LqxIEU": { "defaultMessage": "Wallet address will be part of your digital identity and shown in your profile page.", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, + "LwFJTy": { + "defaultMessage": "Matters ID is your unique identifier, and cannot be modified once set.", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "MDNaxs": { "defaultMessage": "followers", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "MPEeBy": { + "defaultMessage": "Operation failed, please try again later.", + "description": "ACTION_FAILED" + }, + "Me4s4Q": { + "defaultMessage": "Please connect email", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, + "Me5cJu": { + "defaultMessage": "Connect wallet", + "description": "src/components/Dialogs/AddWalletLoginDialog/Content.tsx" + }, + "Mn7GEf": { + "defaultMessage": "Selected activities related to you in the past 24 hours", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, + "MoyOR+": { + "defaultMessage": "Settings - Circle notifications", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "N2IrpM": { "defaultMessage": "Confirm" }, - "N3K1H9": { - "defaultMessage": "Matters will never ask for your wallet mnemonic through any channel.", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "NAidKb": { "defaultMessage": "Notifications" }, @@ -551,6 +803,14 @@ "defaultMessage": "Supports", "description": "src/views/Me/Transactions/index.tsx" }, + "NEKHMm": { + "defaultMessage": "Email", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, + "NNF+3f": { + "defaultMessage": "Tag not found", + "description": "TAG_NOT_FOUND" + }, "NONfAh": { "defaultMessage": "Douban", "description": "src/components/Share/Buttons/Douban.tsx" @@ -559,10 +819,22 @@ "defaultMessage": "Enter password again", "description": "src/components/Forms/EmailSignUpForm/Password.tsx" }, + "O0MQs/": { + "defaultMessage": "Please add email first", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" + }, "O0QB1v": { "defaultMessage": "Friends will receive free trial invitations to Circle. Set up your invitations now!", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx" }, + "O2Nqk8": { + "defaultMessage": "Forgot password?", + "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + }, + "OAc8+i": { + "defaultMessage": "The email verification link has been sent to {email}, please check your inbox", + "description": "src/components/GlobalToast/index.tsx" + }, "OIj8pQ": { "defaultMessage": "Invitation Sent", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx" @@ -570,13 +842,24 @@ "OKhRC6": { "defaultMessage": "Share" }, - "Po+kJe": { - "defaultMessage": "Last {month} month", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + "Opaa0R": { + "defaultMessage": "New likes", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "OyvGvT": { + "defaultMessage": "Images have a 5 megabyte (MB) size limit." + }, + "PLBmDT": { + "defaultMessage": "Password", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" }, "Pp/0po": { "defaultMessage": "Shuffle" }, + "PtV68+": { + "defaultMessage": "Incorrect email or password", + "description": "USER_EMAIL_NOT_FOUND" + }, "Q8Qw5B": { "defaultMessage": "Description" }, @@ -588,6 +871,10 @@ "defaultMessage": "Failed to republish article", "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx" }, + "QXJQ5G": { + "defaultMessage": "Please log in again.", + "description": "TOKEN_INVALID" + }, "QZXKhG": { "defaultMessage": "Set the Circle URL (cannot be modified after creation)", "description": "src/components/Forms/CreateCircleForm/Init.tsx" @@ -604,10 +891,22 @@ "defaultMessage": "Archived", "description": "src/components/ArticleDigest/Archive/index.tsx" }, + "ROPCC0": { + "defaultMessage": "Please add email first", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/Email.tsx" + }, + "Ro0CuW": { + "defaultMessage": "You do not have permission to perform this operation", + "description": "FORBIDDEN" + }, "RxiHr/": { "defaultMessage": "friends have not accepted your invitations.", "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx" }, + "S/hoJx": { + "defaultMessage": "User not found", + "description": "USER_NOT_FOUND" + }, "S8PcQf": { "defaultMessage": "Unpin from profile", "description": "src/components/ArticleDigest/DropdownActions/PinButton.tsx" @@ -630,6 +929,14 @@ "Szd1tH": { "defaultMessage": "Failed to log out, please try again." }, + "SzrjpI": { + "defaultMessage": "Article revision content is invalid", + "description": "ARTICLE_REVISION_CONTENT_INVALID" + }, + "T2kMnM": { + "defaultMessage": "Each user can only create one circle.", + "description": "CIRCLE_CREATION_REACH_LIMIT" + }, "T73SwS": { "defaultMessage": "Subscriptions", "description": "src/views/Me/Transactions/index.tsx" @@ -637,6 +944,9 @@ "T9oZC8": { "defaultMessage": "Are you sure you want to delete this collection ‘{collection}’?" }, + "TF1OhT": { + "defaultMessage": "This login code has expired, please try to resend" + }, "TSDiqB": { "defaultMessage": "Subscribers", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -648,10 +958,6 @@ "TzhzIH": { "defaultMessage": "Creators" }, - "U/Tqmx": { - "defaultMessage": "commented on your bookmarked article", - "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx" - }, "U7o9Ba": { "defaultMessage": "Accumulated read time" }, @@ -666,6 +972,9 @@ "defaultMessage": "Successfully removed", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, + "Ub+AGc": { + "defaultMessage": "Sign In" + }, "Udp4Bm": { "defaultMessage": "Move to bottom", "description": "src/components/ArticleDigest/DropdownActions/SetBottomCollectionButton.tsx" @@ -674,6 +983,10 @@ "defaultMessage": "Tags added", "description": "src/views/TagDetail/DropdownActions/index.tsx" }, + "V5OMr4": { + "defaultMessage": "What is a digital wallet?", + "description": "src/components/Forms/SelectAuthMethodForm/WalletFeed.tsx" + }, "V8msLJ": { "defaultMessage": "left comments and mentioned you in your circle", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" @@ -699,9 +1012,21 @@ "VzzYJk": { "defaultMessage": "Create" }, + "W0sZaX": { + "defaultMessage": "Last 3 months", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, + "W66Eyq": { + "defaultMessage": "Password must be at least 8 characters long, support letter, numbers and symbols.", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" + }, "W8OZ3G": { "defaultMessage": "Confirm Deletion" }, + "WDZndZ": { + "defaultMessage": "Please sign message in your wallet", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, "WQT8ZA": { "defaultMessage": "Edit collection" }, @@ -709,6 +1034,10 @@ "defaultMessage": "Add to Featured", "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx" }, + "Wg0ZvI": { + "defaultMessage": "Articles has been bookmarked", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "WpvsPu": { "defaultMessage": "Subscribe", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -736,15 +1065,31 @@ "XVYrS/": { "defaultMessage": "No followers yet" }, + "XYUhx0": { + "defaultMessage": "Disconnect from {type}", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "Xd0J7Y": { "defaultMessage": "Open Source" }, + "XdLnXf": { + "defaultMessage": "Insufficient wallet balance.", + "description": "PAYMENT_BALANCE_INSUFFICIENT" + }, + "XfRKZY": { + "defaultMessage": "Go to Settings", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, "XgdZSb": { "defaultMessage": "Authors" }, "Xi40U9": { "defaultMessage": "This action cannot be undone. Are you sure you want to delete this collection?" }, + "XmnzQT": { + "defaultMessage": "Maximum 4 editors allowed for each tag", + "description": "TAG_EDITORS_REACH_LIMIT" + }, "XuYhBC": { "defaultMessage": "Pinned to profile" }, @@ -756,12 +1101,16 @@ "defaultMessage": "commented in your circle broadcast", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, - "YUtHE9": { - "defaultMessage": "selected your work {articleTitle} to {tag} featured", - "description": "src/components/Notice/ArticleTagNotice/ArticleTagAddedNotice.tsx" + "Y7N/Jg": { + "defaultMessage": "Maximum image dimension is 12,000 pixels." + }, + "YPMn9n": { + "defaultMessage": "Please log in.", + "description": "UNAUTHENTICATED" }, - "YjNkcK": { - "defaultMessage": "To change, switch it directly on your wallet" + "YUXRsM": { + "defaultMessage": "Blocked Users", + "description": "src/views/Me/Settings/Blocked/index.tsx" }, "YlPCRU": { "defaultMessage": "connected", @@ -779,9 +1128,6 @@ "defaultMessage": "Edit", "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx" }, - "ZjDH42": { - "defaultMessage": "About Us" - }, "a/YQ1Z": { "defaultMessage": "Archived", "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx" @@ -797,6 +1143,10 @@ "defaultMessage": "comment_circle", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, + "aacIz8": { + "defaultMessage": "Email", + "description": "src/views/Me/Settings/Settings/Email/index.tsx" + }, "adThp5": { "defaultMessage": "Latest" }, @@ -804,14 +1154,6 @@ "defaultMessage": "Processing", "description": "src/components/Transaction/State/index.tsx" }, - "b+LSgI": { - "defaultMessage": "replied to your discussion on", - "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" - }, - "b3onWZ": { - "defaultMessage": "Last {days} days", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" - }, "b6zdPs": { "defaultMessage": "{count} articles", "description": "src/components/Book/index.tsx" @@ -827,6 +1169,10 @@ "beLe/F": { "defaultMessage": "Broadcast" }, + "c/z318": { + "defaultMessage": "Incorrect email or password", + "description": "src/components/Forms/EmailLoginForm/index.tsx" + }, "cAP9g5": { "defaultMessage": "pinned your comment in {commentArticle}", "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx" @@ -834,16 +1180,16 @@ "cE4Hfw": { "defaultMessage": "Discover" }, - "cd/II9": { - "defaultMessage": "{totalCount, plural, =1 {article} other {articles}}" + "cQYXjl": { + "defaultMessage": "Currency", + "description": "src/views/Me/Settings/Misc/Currency/index.tsx" }, - "cf37Zy": { - "defaultMessage": "Add hash from IPFS into compatible reader such as", - "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" + "cYvIpp": { + "defaultMessage": "Already subscribed to this circle.", + "description": "DUPLICATE_CIRCLE_SUBSCRIPTION" }, - "cfL5uk": { - "defaultMessage": "Over 200 words, current {numbers}", - "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx" + "cd/II9": { + "defaultMessage": "{totalCount, plural, =1 {article} other {articles}}" }, "cg1VJ2": { "defaultMessage": "Connect Wallet" @@ -852,13 +1198,37 @@ "defaultMessage": "You haven‘t published any articles yet, so there is no data available. Create one now to introduce yourself!", "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" }, + "ctl5tq": { + "defaultMessage": "New articles", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "cufo9X": { + "defaultMessage": "The daily limit is 5000 HKD", + "description": "PAYMENT_REACH_MAXIMUM_LIMIT" + }, "cyR7Kh": { "defaultMessage": "Back" }, + "d1mBsg": { + "defaultMessage": "Following circles", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "d4waan": { "defaultMessage": "Income", "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" }, + "dAvP6d": { + "defaultMessage": "No blocked users yet", + "description": "src/views/Me/Settings/Blocked/SettingsBlocked.tsx" + }, + "dSjI7E": { + "defaultMessage": "Unable to disconnect the wallet because you have not added or associated another login (Email/Wallet/Social account).", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, + "dVbKzB": { + "defaultMessage": "Comments and replies", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "deEeEI": { "defaultMessage": "Register" }, @@ -868,13 +1238,9 @@ "djJp6c": { "defaultMessage": "History" }, - "dnsfmR": { - "defaultMessage": "for bug reports or suggestions. We will reply to you as soon we can!", - "description": "src/views/Help/index.tsx" - }, - "eJ131z": { - "defaultMessage": "resigned as the maintainer of {tag}", - "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx" + "dzF4ci": { + "defaultMessage": "Resend", + "description": "src/components/Forms/EmailLoginForm/index.tsx" }, "eTpiYa": { "defaultMessage": "No data yet." @@ -906,17 +1272,33 @@ "defaultMessage": "Your work {articleTitle} has been republished to decentralized network", "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx" }, + "gW/KWu": { + "defaultMessage": "Comments has been pinned", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "ggS9L7": { + "defaultMessage": "The payment amount is invalid, please re-enter.", + "description": "PAYMENT_AMOUNT_INVALID" + }, "h+punE": { "defaultMessage": "Updated {date}", "description": "src/views/User/CollectionDetail/Content.tsx" }, + "h7sMQs": { + "defaultMessage": "New followers", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "h9A6AT": { + "defaultMessage": "For security, we will {resetHint} for this. You can set your password again after verifying new email address.", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, "h9CG9E": { "defaultMessage": "{commentType} has been deleted", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" }, - "hWs95P": { - "defaultMessage": "Important information will be notified by email. So filling in your email address will be required.", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "hASeng": { + "defaultMessage": "Blocked Users", + "description": "src/views/Me/Settings/Misc/BlockedUsers.tsx" }, "hYG5fb": { "defaultMessage": "are following", @@ -926,17 +1308,9 @@ "defaultMessage": "followed your circle", "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx" }, - "hrfF+i": { - "defaultMessage": "Don't have a wallet yet? Check the", - "description": "src/components/Forms/WalletAuthForm/Select.tsx" - }, "hrgo+E": { "defaultMessage": "Archive" }, - "iCFXtS": { - "defaultMessage": "For unregistered or users enabled wallet login", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" - }, "ieGrWo": { "defaultMessage": "Follow" }, @@ -947,20 +1321,21 @@ "itPgxd": { "defaultMessage": "Profile" }, + "iu3XKs": { + "defaultMessage": "Wallet disconnected", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, "izWS4J": { "defaultMessage": "Unfollow" }, + "jBx/nm": { + "defaultMessage": "Sign up with email", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "jJ1Brc": { "defaultMessage": "Pin Comment", "description": "src/components/Comment/DropdownActions/PinButton.tsx" }, - "jL2ZHb": { - "defaultMessage": "Code will expire after 20 minutes" - }, - "jgLiba": { - "defaultMessage": "Enter verification code", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "jkrM1r": { "defaultMessage": "Open IPNS page", "description": "src/components/UserProfile/WalletLabel/index.tsx" @@ -979,15 +1354,44 @@ "k97/u7": { "defaultMessage": "Add Articles" }, + "kPylKK": { + "defaultMessage": "Circle", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "kS3vTS": { + "defaultMessage": "Liker ID", + "description": "src/views/Me/Settings/Misc/LikerID.tsx" + }, "kc79d3": { "defaultMessage": "Topics" }, + "kf5NAv": { + "defaultMessage": "English letters, numbers, and underscores", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "kkZioy": { "defaultMessage": "Remove", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, - "lD4FPZ": { - "defaultMessage": "Enter Email" + "l/f7bu": { + "defaultMessage": "Want to know more? Check the", + "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" + }, + "l0/EvT": { + "defaultMessage": "Last step: Set Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, + "l02bPO": { + "defaultMessage": "Articles has been collected", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "l9LpDx": { + "defaultMessage": "{q} - Matters Search", + "description": "src/views/Search/AggregateResults/Articles.tsx" + }, + "lI2l2/": { + "defaultMessage": "Incorrect verification code. Please check your input, or try resend", + "description": "CODE_INVALID" }, "lIir/P": { "defaultMessage": "I see" @@ -1010,6 +1414,10 @@ "m4GG4b": { "defaultMessage": "Delete collection" }, + "m4KtjK": { + "defaultMessage": "New subscribers", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "mCAIcg": { "defaultMessage": "Hottest", "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx" @@ -1039,6 +1447,26 @@ "ml3SZN": { "defaultMessage": "Minimum 8 characters. Uppercase/lowercase letters, numbers and symbols are allowed" }, + "mp9SBo": { + "defaultMessage": "Circle notifications", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "mu01Gw": { + "defaultMessage": "Verification code is no longer valid. Please use the latest code we sent, or try resend", + "description": "CODE_INACTIVE" + }, + "n2Sc6g": { + "defaultMessage": "My profile", + "description": "src/views/Me/Settings/Settings/MyProfile/index.tsx" + }, + "n3shsQ": { + "defaultMessage": "Invalid name", + "description": "NAME_INVALID" + }, + "n6ZdqD": { + "defaultMessage": "This circle is already taken.", + "description": "DUPLICATE_CIRCLE" + }, "nGBrvw": { "defaultMessage": "Bookmarks" }, @@ -1046,13 +1474,17 @@ "defaultMessage": "replied your comment in", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, - "nYeDrI": { - "defaultMessage": "Not Registered?", - "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" - }, "nYrKWp": { "defaultMessage": "Edit profile" }, + "no7l8z": { + "defaultMessage": "Disconnect wallet", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, + "nozN+j": { + "defaultMessage": "Invalid Email", + "description": "USER_EMAIL_INVALID" + }, "o2Na0B": { "defaultMessage": "Back to All" }, @@ -1060,6 +1492,10 @@ "defaultMessage": "{articleCount} articles", "description": "src/components/CollectionDigest/Feed/index.tsx" }, + "ohbnFU": { + "defaultMessage": "Social Login", + "description": "src/views/Me/Settings/Settings/index.tsx" + }, "ohgTH4": { "defaultMessage": "Following", "description": "src/components/UserProfile/index.tsx" @@ -1068,16 +1504,17 @@ "defaultMessage": "liked", "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx" }, - "pCcbaC": { - "defaultMessage": "remove your work {articleTitle} from {tag}", - "description": "src/components/Notice/ArticleTagNotice/ArticleTagRemovedNotice.tsx" + "pHg5Ju": { + "defaultMessage": "Set password succeed", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" }, "pRV+UD": { "defaultMessage": "Collapse", "description": "src/components/Comment/DropdownActions/CollapseComment/Button.tsx" }, - "pwlQEY": { - "defaultMessage": "Display Name" + "pjunBi": { + "defaultMessage": "1 MB maximum", + "description": "MIGRATION_REACH_LIMIT" }, "pzTOmv": { "defaultMessage": "Followers" @@ -1089,6 +1526,10 @@ "q9oMKE": { "defaultMessage": "Circle Name" }, + "qNuRmA": { + "defaultMessage": "Send login code", + "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + }, "qYzBk8": { "defaultMessage": "unsubscribed your circle", "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx" @@ -1101,13 +1542,14 @@ "defaultMessage": "Remove Article", "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx" }, - "qswU4E": { - "defaultMessage": "Email will not be used as a login but only as a contact channel." - }, "r66dXx": { "defaultMessage": "mentioned you in broadcast comment in {circleName}", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, + "rADhX5": { + "defaultMessage": "Unavailable", + "description": "FORBIDDEN_BY_STATE" + }, "rBjwQy": { "defaultMessage": "Weibo", "description": "src/components/Share/Buttons/Weibo.tsx" @@ -1118,6 +1560,10 @@ "rXnmeE": { "defaultMessage": "Confirm and Send" }, + "rZyVay": { + "defaultMessage": "Verification code expired, try resend", + "description": "CODE_EXPIRED" + }, "rbrahO": { "defaultMessage": "Close" }, @@ -1128,6 +1574,10 @@ "rfz/fN": { "defaultMessage": "Recommended size: 1600px x 900px" }, + "rqS2aA": { + "defaultMessage": "Sign in to that account to unlink it then try again", + "description": "src/components/AuthMethodFeed/AuthWalletFeed.tsx" + }, "s5JCCO": { "defaultMessage": "This post may include sensitive content and has been marked by the {actor} as restricted content. Are you sure you want to expand the full text?", "description": "src/views/ArticleDetail/Wall/Sensitive/index.tsx" @@ -1136,6 +1586,10 @@ "defaultMessage": "This Month", "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" }, + "sg3nVO": { + "defaultMessage": "This email has been used, please go to login or try another one", + "description": "USER_EMAIL_EXISTS" + }, "skbUBl": { "defaultMessage": "Log in", "description": "src/components/Buttons/Login/index.tsx" @@ -1147,34 +1601,39 @@ "sy+pv5": { "defaultMessage": "Email" }, - "t8/r8X": { - "defaultMessage": "Continue with Wallet", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" + "tBt9u0": { + "defaultMessage": "Sign in", + "description": "src/components/Forms/EmailLoginForm/index.tsx" }, "tEeEJT": { "defaultMessage": "Your work {articleTitle} has been published to decentralized network", "description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx" }, + "tQ3+Xo": { + "defaultMessage": "Add up to 5 tags", + "description": "TOO_MANY_TAGS_FOR_ARTICLE" + }, + "tQimre": { + "defaultMessage": "go to the homepage", + "description": "src/views/Callback/GoogleCallback.tsx" + }, "tzq2+W": { "defaultMessage": "Send", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx" }, + "u+cgOo": { + "defaultMessage": "My circle", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "u5aHb4": { "defaultMessage": "Copy Link" }, "uJkv2X": { "defaultMessage": "Edit Tag" }, - "uVCg1l": { - "defaultMessage": "Explore Matters" - }, "ub1kHa": { "defaultMessage": "Add to collection" }, - "uclzDH": { - "defaultMessage": "{q}: {totalCount, plural, =0 {} one {} other {# Results}} - Matters Search", - "description": "src/views/Search/AggregateResults/Articles.tsx" - }, "ui1+QC": { "defaultMessage": "End of the results" }, @@ -1192,19 +1651,43 @@ "defaultMessage": "Account", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, + "v8dGSd": { + "defaultMessage": "Wallet is linked to a different account", + "description": "CRYPTO_WALLET_EXISTS" + }, "vAc1Bw": { "defaultMessage": "Block User" }, + "vCt85u": { + "defaultMessage": "Don't have a wallet yet? Check the", + "description": "src/components/Forms/WalletAuthForm/Select.tsx" + }, "vH8sCb": { "defaultMessage": "Circle" }, + "vJd1we": { + "defaultMessage": "Comment not found", + "description": "COMMENT_NOT_FOUND" + }, "vLEnrs": { "defaultMessage": "supported", "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx" }, + "viMrzF": { + "defaultMessage": "New broadcasts", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "vsD2wm": { + "defaultMessage": "reset your login password", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, "wCgTu5": { "defaultMessage": "Comments" }, + "wDX7zn": { + "defaultMessage": "Draft not found", + "description": "DRAFT_NOT_FOUND" + }, "wEQDC6": { "defaultMessage": "Edit" }, @@ -1212,19 +1695,31 @@ "defaultMessage": "left a comment in {circleName} and mentioned you", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, - "wSEOxH": { - "defaultMessage": "Contact Channel", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "wK4kLf": { + "defaultMessage": "Continue", + "description": "src/components/Forms/EmailSignUpForm/Init.tsx" + }, + "wMNZJa": { + "defaultMessage": "Notification not found", + "description": "NOTICE_NOT_FOUND" }, "wXzTZ0": { "defaultMessage": "Enter the name of your Circle" }, + "wbIHgJ": { + "defaultMessage": "The login code has been sent to your inbox", + "description": "src/components/Forms/EmailLoginForm/OtherOptions.tsx" + }, "wbcwKd": { "defaultMessage": "View All" }, - "xGh9O7": { - "defaultMessage": "As a reminder, the email address will not be used as a login but only as a contact channel.", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "wm9xNB": { + "defaultMessage": "{type} disconnected", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, + "x7O1/5": { + "defaultMessage": "This ID has been taken, please try another one", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" }, "xMaFCO": { "defaultMessage": "Articles", @@ -1238,9 +1733,13 @@ "defaultMessage": "{follower, plural, =1 {follower} other {followers}}", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, - "xiKjd/": { - "defaultMessage": "Continue with Email", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" + "xafreT": { + "defaultMessage": "New discussions", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "xjHiYx": { + "defaultMessage": "Article revision count reach limit", + "description": "ARTICLE_REVISION_REACH_LIMIT" }, "xkr+zo": { "defaultMessage": "Terms" @@ -1248,10 +1747,18 @@ "xmcVZ0": { "defaultMessage": "Search" }, + "xxDjET": { + "defaultMessage": "Invalid display name", + "description": "DISPLAYNAME_INVALID" + }, "y0b6Kp": { "defaultMessage": "Pay", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "y4Lyf1": { + "defaultMessage": "This name is already taken.", + "description": "NAME_EXISTS" + }, "yBUiiy": { "defaultMessage": "This operation cannot be undone, confirm archiving?" }, @@ -1271,6 +1778,14 @@ "defaultMessage": "Add Articles into Featured", "description": "src/views/TagDetail/DropdownActions/index.tsx" }, + "ySSF/a": { + "defaultMessage": "In order to ensure the identity security of the citizens of Matters City, we've upgraded some security settings. Please confirm your Matters ID (cannot be modified once confirmation).", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, + "yToCTn": { + "defaultMessage": "Please refresh the page and try again.", + "description": "NETWORK_ERROR" + }, "yZfKI4": { "defaultMessage": "discussion and mentioned you", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" @@ -1279,10 +1794,22 @@ "defaultMessage": "Refund", "description": "src/components/Transaction/index.tsx" }, + "z+a1SW": { + "defaultMessage": "Settings", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "zAK5G+": { + "defaultMessage": "The login link has been sent to {email}", + "description": "src/components/Forms/Verification/LinkSent.tsx" + }, "zKOr2x": { "defaultMessage": "Conversion Rate of Followers", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "zOZ77e": { + "defaultMessage": "the User Agreement and Privacy Policy.", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "zQvVDJ": { "defaultMessage": "All" }, @@ -1293,6 +1820,10 @@ "defaultMessage": "left a comment in {circleName}", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, + "zvNfwL": { + "defaultMessage": "Operation too frequent, please try again later.", + "description": "ACTION_LIMIT_EXCEEDED" + }, "zxlwbc": { "defaultMessage": "Waiting ...", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" diff --git a/lang/en.json b/lang/en.json index acdf3d3de9..4c742d93c6 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,6 +1,13 @@ { + "+51DoZ": { + "defaultMessage": "Please verify email first", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" + }, + "+63O1f": { + "defaultMessage": "Incorrect email or password", + "description": "USER_PASSWORD_INVALID" + }, "+7SAix": { - "description": "", "defaultMessage": "Must be between 2-12 characters long." }, "+S8mxW": { @@ -17,13 +24,32 @@ "defaultMessage": "Are you sure you want to remove ‘{article}’ from this collection?", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, + "+o9W2T": { + "defaultMessage": "File upload failed, please verify the file link is valid, or manually download and upload again.", + "description": "UNABLE_TO_UPLOAD_FROM_URL" + }, + "+rB5Am": { + "defaultMessage": "Article not found", + "description": "ARTICLE_NOT_FOUND" + }, + "+vVZ/G": { + "defaultMessage": "Connect" + }, "/3kw6k": { "defaultMessage": "Adding contents into IPFS network, and it usually takes some times, please wait. You can accelerate the process by publishing new article.", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, + "/BQWEh": { + "defaultMessage": "Last 1 month", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, "/IMR+8": { "defaultMessage": "Top Supporters" }, + "/TXBJR": { + "defaultMessage": "Unknown error. Please try again later.", + "description": "UNKNOWN_ERROR" + }, "/asuIY": { "defaultMessage": "Enter Community", "description": "src/components/Forms/EmailSignUpForm/Complete.tsx" @@ -31,8 +57,9 @@ "/jJLYy": { "defaultMessage": "Transactions" }, - "/ns2st": { - "defaultMessage": "Download App" + "/pnYHM": { + "defaultMessage": "Circle not found", + "description": "CIRCLE_NOT_FOUND" }, "/podGX": { "defaultMessage": "Public", @@ -41,6 +68,10 @@ "0Azlrb": { "defaultMessage": "Manage" }, + "0CyECR": { + "defaultMessage": "Matters ID has been set up. More account info can be found in Settings", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "0JLcHr": { "defaultMessage": "Caution: The following content may include age-restricted or explicit content, violence, gore, etc. Some may experience discomfort and psychological distress.", "description": "src/views/ArticleDetail/Wall/Sensitive/index.tsx" @@ -52,6 +83,18 @@ "defaultMessage": "Create collection", "description": "src/views/User/Collections/UserCollections.tsx" }, + "0e1xjL": { + "defaultMessage": "Email can be modified up to {count} times per day.", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, + "0iyH+q": { + "defaultMessage": "Last 7 days", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, + "0jvbdb": { + "defaultMessage": "Oops. Something went wrong. Please try again later.", + "description": "INTERNAL_SERVER_ERROR" + }, "0qagOO": { "defaultMessage": "Circle Subscription", "description": "src/components/Transaction/index.tsx" @@ -60,18 +103,34 @@ "defaultMessage": "Failed", "description": "src/components/Transaction/State/index.tsx" }, + "1QrwIl": { + "defaultMessage": "Take a look", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "1Z1M77": { "defaultMessage": "No data yet", "description": "src/views/Me/History/index.tsx" }, + "1hyiZ8": { + "defaultMessage": "Confirm Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "1qQzV0": { "defaultMessage": "Invitees", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "1y1U9f": { + "defaultMessage": "Liker ID is already taken.", + "description": "LIKER_USER_ID_EXISTS" + }, "1zVIWy": { "defaultMessage": "mentioned you in a comment at {commentArticle}", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" }, + "202PEj": { + "defaultMessage": "Confirm Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "20bImY": { "defaultMessage": "Discussion" }, @@ -82,48 +141,64 @@ "defaultMessage": "Total", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "2DkkhD": { + "defaultMessage": "Settings - Notifications", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "2P5JII": { + "defaultMessage": "Disconnect", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "2W0f9h": { "defaultMessage": "Bio" }, "2atspc": { "defaultMessage": "Drafts" }, + "2ef/Xl": { + "defaultMessage": "Block", + "description": "src/views/Me/Settings/Blocked/ToggleBlockButton.tsx" + }, "2oxLHg": { "defaultMessage": "Up to 3 articles/collections can be pinned" }, "2slIPX": { "defaultMessage": "Likes" }, + "2vpUYs": { + "defaultMessage": "New replies to discussions", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "32bml8": { "defaultMessage": "Following", "description": "src/components/Layout/SideNav/index.tsx" }, + "39AHJm": { + "defaultMessage": "Sign Up" + }, "3KNMbJ": { "defaultMessage": "Articles" }, - "3kbIhS": { - "defaultMessage": "Untitled" + "3Tg548": { + "defaultMessage": "Sign In", + "description": "src/components/Forms/SelectAuthMethodForm/AuthTabs.tsx" }, - "3uQKhx": { - "defaultMessage": "Please email", - "description": "src/views/Help/index.tsx" + "3phEFL": { + "defaultMessage": "Continued use indicates your agreement to ", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" }, "3yk8fB": { "defaultMessage": "Wallet" }, - "3ynsJ3": { - "defaultMessage": "Want to know more? Check the ", - "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" - }, "47FYwb": { "defaultMessage": "Cancel" }, "4CrCbD": { "defaultMessage": "Community" }, - "4giHJT": { - "defaultMessage": "Have wallet questions on mobile device ? Click the ", - "description": "src/components/Forms/WalletAuthForm/Select.tsx" + "4KuZ0o": { + "defaultMessage": "Asset not found", + "description": "ASSET_NOT_FOUND" }, "4l6vz1": { "defaultMessage": "Copy" @@ -136,16 +211,29 @@ "defaultMessage": "No discussion yet", "description": "src/views/Circle/Discussion/Discussion.tsx" }, + "5CcjZy": { + "defaultMessage": "Do you want to disconnect from {type}?", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "5FO4vn": { "defaultMessage": "You do not have permission to perform this operation" }, - "5MDGuM": { - "defaultMessage": "Enter your email" + "5JN+nl": { + "defaultMessage": "Check your inbox", + "description": "src/components/Forms/Verification/LinkSent.tsx" + }, + "5MDA6O": { + "defaultMessage": "This tag is already taken", + "description": "DUPLICATE_TAG" }, "5iii3x": { "defaultMessage": "Circle:", "description": "src/components/CircleDigest/UserProfile/index.tsx" }, + "5sWnog": { + "defaultMessage": "Liker ID email is already taken.", + "description": "LIKER_EMAIL_EXISTS" + }, "5sg7KC": { "defaultMessage": "Password" }, @@ -160,6 +248,10 @@ "defaultMessage": "Set threshold for circle (per month)", "description": "src/components/Forms/CreateCircleForm/Init.tsx" }, + "6N2LKY": { + "defaultMessage": "Please log in again.", + "description": "OAUTH_TOKEN_INVALID" + }, "6OBAOi": { "defaultMessage": "subscribers_empty", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -172,12 +264,17 @@ "defaultMessage": "All", "description": "src/views/Me/Transactions/index.tsx" }, - "6flWFg": { - "defaultMessage": "Term of Services" + "6e8teX": { + "defaultMessage": "Notifications", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" }, "6kMb9Z": { "defaultMessage": "On-chain records" }, + "6lwWCu": { + "defaultMessage": "Misc", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" + }, "6q0G5e": { "defaultMessage": "Successfully added", "description": "src/components/Dialogs/CollectionSelectDialog/index.tsx" @@ -186,6 +283,14 @@ "defaultMessage": "Cancelled", "description": "src/components/Transaction/State/index.tsx" }, + "70UCEy": { + "defaultMessage": "Have wallet questions on mobile device ? Click the", + "description": "src/components/Forms/WalletAuthForm/Select.tsx" + }, + "73iajM": { + "defaultMessage": "Oops. Something went wrong. Please try again later.", + "description": "BAD_USER_INPUT" + }, "77tYPg": { "defaultMessage": "After deletion, the {commentType} will be removed immediately", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" @@ -197,6 +302,9 @@ "7JlauX": { "defaultMessage": "Explore" }, + "7cwoRo": { + "defaultMessage": "The author has disabled comments for this article" + }, "7jjWxF": { "defaultMessage": "No results", "description": "src/components/Dialogs/AddArticlesCollectionDialog/SearchingDialogContent.tsx" @@ -212,13 +320,25 @@ "8KFsZN": { "defaultMessage": "Read Counts" }, - "8PWD05": { - "defaultMessage": "invites you to {tag} collaborator", - "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx" - }, "8cv9D4": { "defaultMessage": "Next Step" }, + "8iciCA": { + "defaultMessage": "Entity not found", + "description": "ENTITY_NOT_FOUND" + }, + "8qGjpr": { + "defaultMessage": "Settings", + "description": "src/views/Me/Settings/Misc/index.tsx" + }, + "8rMZWb": { + "defaultMessage": "replied to your discussion on", + "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" + }, + "8t6Cs8": { + "defaultMessage": "Matters Daily Report", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, "8w3GEA": { "defaultMessage": "mentioned you in {article}", "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx" @@ -227,15 +347,14 @@ "defaultMessage": "Unsubscribe Circle", "description": "src/views/Circle/Profile/DropdownActions/index.tsx" }, - "9+Ddtu": { - "defaultMessage": "Next" - }, "9Fpc9S": { "defaultMessage": "Bug Report" }, "9J0iCw": { - "defaultMessage": "Deleted user", - "description": "src/components/UserProfile/index.tsx" + "defaultMessage": "Deleted user" + }, + "9Vkz9W": { + "defaultMessage": "Maximum image area is limited to 100 megapixels (for example, 10,000×10,000 pixels)." }, "9mfw9c": { "defaultMessage": "Wallet address", @@ -245,19 +364,22 @@ "defaultMessage": "Discussion sent", "description": "src/views/Circle/Discussion/Discussion.tsx" }, + "A0KB7s": { + "defaultMessage": "New replies to broadcast", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "A3g33H": { "defaultMessage": "Archived articles can only be seen by you, and this operation cannot be undone. If this article has been added to collections, it will be removed. (IPFS version will not be effected)" }, - "A3rLZt": { - "defaultMessage": "Last {months} months", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" - }, "A41QIy": { "defaultMessage": "Enter Password" }, "A6ozr9": { "defaultMessage": "Collection name" }, + "A6r2p1": { + "defaultMessage": "Enter Matters" + }, "A7ugfn": { "defaultMessage": "More Actions" }, @@ -265,6 +387,10 @@ "defaultMessage": "Payment suspended or returned by card issuer when there are doubts about the transaction", "description": "src/components/Transaction/index.tsx" }, + "AEiogR": { + "defaultMessage": "This Google account is connected to a Matters account. Sign in to that account to disconnect it then try again", + "description": "USER_SOCIAL_ACCOUNT_EXISTS" + }, "AGcU5J": { "defaultMessage": "Pin Broadcast", "description": "src/components/Comment/DropdownActions/PinButton.tsx" @@ -285,6 +411,18 @@ "defaultMessage": "Followers", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "At8Qd2": { + "defaultMessage": "Account", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" + }, + "Avukw5": { + "defaultMessage": "The payment amount is too small, please re-enter.", + "description": "PAYMENT_AMOUNT_TOO_SMALL" + }, + "AwQHHA": { + "defaultMessage": "Please set your transcation password.", + "description": "PAYMENT_PASSWORD_NOT_SET" + }, "B2As08": { "defaultMessage": "That's all", "description": "src/components/Interaction/InfiniteScroll/EndOfResults/index.tsx" @@ -293,6 +431,13 @@ "defaultMessage": " commented in {commentCircle}", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" }, + "BMGZE2": { + "defaultMessage": "Mention me", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "BY343C": { + "defaultMessage": "Change" + }, "Bc20la": { "defaultMessage": "days" }, @@ -300,6 +445,14 @@ "defaultMessage": "followers_empty", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "BnMru1": { + "defaultMessage": "Language", + "description": "src/views/Me/Settings/Misc/Language.tsx" + }, + "C3NKBg": { + "defaultMessage": "Connected to {type}", + "description": "src/views/Me/Settings/Settings/Socials/index.tsx" + }, "C8GQaD": { "defaultMessage": "Upadted {date}", "description": "src/components/CollectionDigest/Feed/index.tsx" @@ -311,10 +464,6 @@ "defaultMessage": "bookmarked", "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx" }, - "CNbggD": { - "defaultMessage": "became the maintainer of {tag}", - "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx" - }, "Cdkhl8": { "defaultMessage": "Delete {commentType}", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" @@ -322,16 +471,20 @@ "CnPG8j": { "defaultMessage": "Featured" }, + "CoF9qv": { + "defaultMessage": "Are you sure you want to disconnect from this?", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, "Cu3Cty": { "defaultMessage": "month" }, - "CwSpld": { - "defaultMessage": "Not for login", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "CxYcYR": { "defaultMessage": "Recommended square image." }, + "D+N1Q6": { + "defaultMessage": "This {type} account is connected to a Matters account. Sign in to that account to disconnect it then try again", + "description": "src/views/Me/Settings/Settings/Socials/index.tsx" + }, "D2Sw/t": { "defaultMessage": "Add any URL in the following list into RSS reader", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" @@ -339,14 +492,26 @@ "D3idYv": { "defaultMessage": "Settings" }, - "DFieKt": { - "defaultMessage": "resigned from {tag} collaborator", - "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx" + "DUoV1W": { + "defaultMessage": "Over 140 words, current {numbers}", + "description": "src/components/Dialogs/EditProfileDialog/Content.tsx" }, "DYrDcG": { "defaultMessage": "Badges", "description": "src/components/UserProfile/index.tsx" }, + "Dq29Hb": { + "defaultMessage": "You have not connected your email yet. For security, email is required for top-up.", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, + "DqQvtL": { + "defaultMessage": "Unblock", + "description": "src/views/Me/Settings/Blocked/ToggleBlockButton.tsx" + }, + "Dt1o78": { + "defaultMessage": "Wallet is linked to a different account", + "description": "src/components/AuthMethodFeed/AuthWalletFeed.tsx" + }, "DyuHBH": { "defaultMessage": "Unpin from profile", "description": "src/components/CollectionDigest/DropdownActions/PinButton.tsx" @@ -366,12 +531,17 @@ "defaultMessage": "commented broadcast in {circleName}", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, - "EfJYPI": { - "defaultMessage": "Verification Code", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "EoeUjA": { + "defaultMessage": "You do not have permission to perform this operation", + "description": "FORBIDDEN_BY_STATE" + }, + "EwbNbl": { + "defaultMessage": "Oops!This link has expired", + "description": "src/views/Callback/GoogleCallback.tsx" }, - "EwVnoC": { - "defaultMessage": "I have read and agree to" + "FEI5Fv": { + "defaultMessage": "Email address", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" }, "FOOymB": { "defaultMessage": "No members yet", @@ -392,13 +562,24 @@ "defaultMessage": "Matters Community" }, "FmWYRt": { - "description": "", "defaultMessage": "Free trial period" }, "Ft76YC": { "defaultMessage": "Collection is deleted", "description": "src/components/CollectionDigest/DropdownActions/DeleteCollection/Dialog.tsx" }, + "FxrSCh": { + "defaultMessage": "This ID cannot be modified. Are you sure you want to use {id} as your Matters ID?", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, + "GG9uXH": { + "defaultMessage": "Please go to the relevant page to resend the link. You can also", + "description": "src/views/Callback/GoogleCallback.tsx" + }, + "GHxtae": { + "defaultMessage": "Wallet", + "description": "src/components/Forms/SelectAuthMethodForm/AuthTabs.tsx" + }, "GRtGnZ": { "defaultMessage": "Resign From Maintainer", "description": "src/views/TagDetail/DropdownActions/index.tsx" @@ -417,9 +598,17 @@ "GcvLBC": { "defaultMessage": "Understood" }, + "GhogWq": { + "defaultMessage": "Subscription cancellations", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "Gt7K6r": { + "defaultMessage": "Wallet address", + "description": "src/views/Me/Settings/Settings/Wallet/index.tsx" + }, "GugBCe": { - "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx", - "defaultMessage": "New Followers This Month" + "defaultMessage": "New Followers This Month", + "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, "H0JBH6": { "defaultMessage": "Log Out" @@ -437,17 +626,36 @@ "HJ0iZJ": { "defaultMessage": "Confirm Archiving" }, + "HPVOw/": { + "defaultMessage": "Wallet", + "description": "src/views/Me/Settings/Settings/index.tsx" + }, + "HkozYU": { + "defaultMessage": "Switch wallet", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, + "HnxG15": { + "defaultMessage": "Set" + }, + "HqnUd1": { + "defaultMessage": "Add hash from IPFS into compatible reader such as", + "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" + }, "HxcjQl": { "defaultMessage": "Matters continues to provide services that combine creativity with blockchain technology. You will be the first to experience them after completing connecting wallet.", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, - "HzaRKA": { - "defaultMessage": "Migrate to Matters" - }, "IKPYe9": { "defaultMessage": "View", "description": "src/components/Dialogs/CollectionSelectDialog/index.tsx" }, + "IPqNCS": { + "defaultMessage": "Confirm use", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, + "IXycMo": { + "defaultMessage": "Resend" + }, "Ihwz5K": { "defaultMessage": "Unpinned from profile" }, @@ -455,10 +663,6 @@ "defaultMessage": "invites you to join the circle {circleName} , and you can experience it for {freePeriod} days for free", "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx" }, - "J+LXrH": { - "defaultMessage": "User registered by email can login and enable wallet login later", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" - }, "JTWayV": { "defaultMessage": "Add description", "description": "src/views/User/CollectionDetail/Content.tsx" @@ -470,24 +674,32 @@ "defaultMessage": "Enter Circle", "description": "src/components/CircleDigest/UserProfile/index.tsx" }, + "JkWLg6": { + "defaultMessage": "New followers", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "JpS59y": { - "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx", - "defaultMessage": "Accepted" + "defaultMessage": "Accepted", + "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx" }, "Js/Fij": { "defaultMessage": "This article has been removed from Trending", "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx" }, - "JxlxVc": { - "defaultMessage": "Forget Password", - "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + "K2/mHF": { + "defaultMessage": "Unable to disconnect from {type} temporarily because you do not have any other log in methods (Email/Crypto wallet/Social account).", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" }, "K3r6DQ": { "defaultMessage": "Delete" }, + "KIQUHo": { + "defaultMessage": "Login password", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" + }, "KLQ1/z": { - "description": "src/components/Forms/CreateCircleForm/Profile.tsx", - "defaultMessage": "Circle successfully created" + "defaultMessage": "Circle successfully created", + "description": "src/components/Forms/CreateCircleForm/Profile.tsx" }, "KMcrz8": { "defaultMessage": "Maintain Tag", @@ -496,16 +708,28 @@ "KQi/UZ": { "defaultMessage": "Archive works" }, + "KlJEP9": { + "defaultMessage": "Wallet connected", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, + "KxVlDj": { + "defaultMessage": "Settings - Blocked Users", + "description": "src/views/Me/Settings/Blocked/index.tsx" + }, "L0J61B": { - "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx", - "defaultMessage": "Free" + "defaultMessage": "Free", + "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" + }, + "L34EMG": { + "defaultMessage": "No account?", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" }, "L4Fcr8": { "defaultMessage": "New Collection" }, "L4NXXh": { - "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx", - "defaultMessage": "Total" + "defaultMessage": "Total", + "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" }, "L7Si5/": { "defaultMessage": "Manage Community", @@ -515,8 +739,8 @@ "defaultMessage": "Followed" }, "LOefol": { - "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx", - "defaultMessage": "Paywalled" + "defaultMessage": "Paywalled", + "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx" }, "LQxY1o": { "defaultMessage": "{articleCount} Articles", @@ -529,24 +753,49 @@ "defaultMessage": "IPNS Subscription", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, - "LphWYP": { - "defaultMessage": "Terms and Privacy Policy" + "LmiUWG": { + "defaultMessage": "You do not have permissionn to perform this operation", + "description": "FORBIDDEN_BY_TARGET_STATE" + }, + "Lp6CiR": { + "defaultMessage": "Settings - Misc", + "description": "src/views/Me/Settings/Misc/index.tsx" }, "LqxIEU": { "defaultMessage": "Wallet address will be part of your digital identity and shown in your profile page.", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, + "LwFJTy": { + "defaultMessage": "Matters ID is your unique identifier, and cannot be modified once set.", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "MDNaxs": { - "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx", - "defaultMessage": "followers" + "defaultMessage": "followers", + "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" + }, + "MPEeBy": { + "defaultMessage": "Operation failed, please try again later.", + "description": "ACTION_FAILED" + }, + "Me4s4Q": { + "defaultMessage": "Please connect email", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, + "Me5cJu": { + "defaultMessage": "Connect wallet", + "description": "src/components/Dialogs/AddWalletLoginDialog/Content.tsx" + }, + "Mn7GEf": { + "defaultMessage": "Selected activities related to you in the past 24 hours", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, + "MoyOR+": { + "defaultMessage": "Settings - Circle notifications", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" }, "N2IrpM": { "defaultMessage": "Confirm" }, - "N3K1H9": { - "defaultMessage": "Matters will never ask for your wallet mnemonic through any channel.", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "NAidKb": { "defaultMessage": "Notifications" }, @@ -554,6 +803,14 @@ "defaultMessage": "Supports", "description": "src/views/Me/Transactions/index.tsx" }, + "NEKHMm": { + "defaultMessage": "Email", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, + "NNF+3f": { + "defaultMessage": "Tag not found", + "description": "TAG_NOT_FOUND" + }, "NONfAh": { "defaultMessage": "Douban", "description": "src/components/Share/Buttons/Douban.tsx" @@ -562,38 +819,65 @@ "defaultMessage": "Enter password again", "description": "src/components/Forms/EmailSignUpForm/Password.tsx" }, + "O0MQs/": { + "defaultMessage": "Please add email first", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" + }, "O0QB1v": { - "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx", - "defaultMessage": "Friends will receive free trial invitations to Circle. Set up your invitations now!" + "defaultMessage": "Friends will receive free trial invitations to Circle. Set up your invitations now!", + "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx" + }, + "O2Nqk8": { + "defaultMessage": "Forgot password?", + "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + }, + "OAc8+i": { + "defaultMessage": "The email verification link has been sent to {email}, please check your inbox", + "description": "src/components/GlobalToast/index.tsx" }, "OIj8pQ": { - "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx", - "defaultMessage": "Invitation Sent" + "defaultMessage": "Invitation Sent", + "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx" }, "OKhRC6": { "defaultMessage": "Share" }, - "Po+kJe": { - "defaultMessage": "Last {months} month", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + "Opaa0R": { + "defaultMessage": "New likes", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "OyvGvT": { + "defaultMessage": "Images have a 5 megabyte (MB) size limit." + }, + "PLBmDT": { + "defaultMessage": "Password", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" }, "Pp/0po": { "defaultMessage": "Shuffle" }, + "PtV68+": { + "defaultMessage": "Incorrect email or password", + "description": "USER_EMAIL_NOT_FOUND" + }, "Q8Qw5B": { "defaultMessage": "Description" }, "QUqfbW": { - "description": "src/components/Forms/CreateCircleForm/Profile.tsx", - "defaultMessage": "Describe more about your Circle" + "defaultMessage": "Describe more about your Circle", + "description": "src/components/Forms/CreateCircleForm/Profile.tsx" }, "QV19cI": { "defaultMessage": "Failed to republish article", "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx" }, + "QXJQ5G": { + "defaultMessage": "Please log in again.", + "description": "TOKEN_INVALID" + }, "QZXKhG": { - "description": "src/components/Forms/CreateCircleForm/Init.tsx", - "defaultMessage": "Set the Circle URL (cannot be modified after creation)" + "defaultMessage": "Set the Circle URL (cannot be modified after creation)", + "description": "src/components/Forms/CreateCircleForm/Init.tsx" }, "R7yHDl": { "defaultMessage": "Circle Revenue", @@ -607,24 +891,35 @@ "defaultMessage": "Archived", "description": "src/components/ArticleDigest/Archive/index.tsx" }, + "ROPCC0": { + "defaultMessage": "Please add email first", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/Email.tsx" + }, + "Ro0CuW": { + "defaultMessage": "You do not have permission to perform this operation", + "description": "FORBIDDEN" + }, "RxiHr/": { - "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx", - "defaultMessage": "friends have not accepted your invitations." + "defaultMessage": "friends have not accepted your invitations.", + "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx" + }, + "S/hoJx": { + "defaultMessage": "User not found", + "description": "USER_NOT_FOUND" }, "S8PcQf": { "defaultMessage": "Unpin from profile", "description": "src/components/ArticleDigest/DropdownActions/PinButton.tsx" }, "SNh1n0": { - "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx", - "defaultMessage": "View Members" + "defaultMessage": "View Members", + "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, "SdXoXI": { - "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx", - "defaultMessage": "Invitations have been sent. You can check invitation status on the invitation management page." + "defaultMessage": "Invitations have been sent. You can check invitation status on the invitation management page.", + "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx" }, "Seanpx": { - "description": "", "defaultMessage": "Required" }, "Sep44m": { @@ -634,6 +929,14 @@ "Szd1tH": { "defaultMessage": "Failed to log out, please try again." }, + "SzrjpI": { + "defaultMessage": "Article revision content is invalid", + "description": "ARTICLE_REVISION_CONTENT_INVALID" + }, + "T2kMnM": { + "defaultMessage": "Each user can only create one circle.", + "description": "CIRCLE_CREATION_REACH_LIMIT" + }, "T73SwS": { "defaultMessage": "Subscriptions", "description": "src/views/Me/Transactions/index.tsx" @@ -641,9 +944,12 @@ "T9oZC8": { "defaultMessage": "Are you sure you want to delete this collection ‘{collection}’?" }, + "TF1OhT": { + "defaultMessage": "This login code has expired, please try to resend" + }, "TSDiqB": { - "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx", - "defaultMessage": "Subscribers" + "defaultMessage": "Subscribers", + "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, "TjWWxF": { "defaultMessage": "Broadcast sent", @@ -652,10 +958,6 @@ "TzhzIH": { "defaultMessage": "Creators" }, - "U/Tqmx": { - "defaultMessage": " commented on your bookmarked article ", - "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx" - }, "U7o9Ba": { "defaultMessage": "Accumulated read time" }, @@ -670,6 +972,9 @@ "defaultMessage": "Successfully removed", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, + "Ub+AGc": { + "defaultMessage": "Sign In" + }, "Udp4Bm": { "defaultMessage": "Move to bottom", "description": "src/components/ArticleDigest/DropdownActions/SetBottomCollectionButton.tsx" @@ -678,6 +983,10 @@ "defaultMessage": "Tags added", "description": "src/views/TagDetail/DropdownActions/index.tsx" }, + "V5OMr4": { + "defaultMessage": "What is a digital wallet?", + "description": "src/components/Forms/SelectAuthMethodForm/WalletFeed.tsx" + }, "V8msLJ": { "defaultMessage": "left comments and mentioned you in your circle", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" @@ -697,25 +1006,41 @@ "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, "VwuiYK": { - "description": "src/components/Forms/CreateCircleForm/Init.tsx", - "defaultMessage": "This URL name has already been used, try another one" + "defaultMessage": "This URL name has already been used, try another one", + "description": "src/components/Forms/CreateCircleForm/Init.tsx" }, "VzzYJk": { "defaultMessage": "Create" }, + "W0sZaX": { + "defaultMessage": "Last 3 months", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, + "W66Eyq": { + "defaultMessage": "Password must be at least 8 characters long, support letter, numbers and symbols.", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" + }, "W8OZ3G": { "defaultMessage": "Confirm Deletion" }, + "WDZndZ": { + "defaultMessage": "Please sign message in your wallet", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, "WQT8ZA": { "defaultMessage": "Edit collection" }, "WSUAwk": { - "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx", - "defaultMessage": "Add to Featured" + "defaultMessage": "Add to Featured", + "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx" + }, + "Wg0ZvI": { + "defaultMessage": "Articles has been bookmarked", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" }, "WpvsPu": { - "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx", - "defaultMessage": "Subscribe" + "defaultMessage": "Subscribe", + "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, "WuvE8X": { "defaultMessage": "Followers of {circleName}", @@ -730,8 +1055,8 @@ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx" }, "XHMco9": { - "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx", - "defaultMessage": "subscribers" + "defaultMessage": "subscribers", + "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, "XQTBu6": { "defaultMessage": "mentioned you in your circle broadcast comment", @@ -740,52 +1065,69 @@ "XVYrS/": { "defaultMessage": "No followers yet" }, + "XYUhx0": { + "defaultMessage": "Disconnect from {type}", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "Xd0J7Y": { "defaultMessage": "Open Source" }, + "XdLnXf": { + "defaultMessage": "Insufficient wallet balance.", + "description": "PAYMENT_BALANCE_INSUFFICIENT" + }, + "XfRKZY": { + "defaultMessage": "Go to Settings", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, "XgdZSb": { "defaultMessage": "Authors" }, "Xi40U9": { "defaultMessage": "This action cannot be undone. Are you sure you want to delete this collection?" }, + "XmnzQT": { + "defaultMessage": "Maximum 4 editors allowed for each tag", + "description": "TAG_EDITORS_REACH_LIMIT" + }, "XuYhBC": { "defaultMessage": "Pinned to profile" }, "Xz/AHp": { - "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx", - "defaultMessage": "broadcast and mentioned you" + "defaultMessage": "broadcast and mentioned you", + "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" }, "Y+spJC": { "defaultMessage": "commented in your circle broadcast", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, - "YUtHE9": { - "defaultMessage": "selected your work {articleTitle} to {tag} featured", - "description": "src/components/Notice/ArticleTagNotice/ArticleTagAddedNotice.tsx" + "Y7N/Jg": { + "defaultMessage": "Maximum image dimension is 12,000 pixels." }, - "YjNkcK": { - "defaultMessage": "To change, switch it directly on your wallet" + "YPMn9n": { + "defaultMessage": "Please log in.", + "description": "UNAUTHENTICATED" + }, + "YUXRsM": { + "defaultMessage": "Blocked Users", + "description": "src/views/Me/Settings/Blocked/index.tsx" }, "YlPCRU": { "defaultMessage": "connected", "description": "src/components/Notice/ArticleArticleNotice/ArticleNewCollectedNotice.tsx" }, "ZAs170": { - "description": "src/views/Circle/Settings/index.tsx", - "defaultMessage": "Profile" + "defaultMessage": "Profile", + "description": "src/views/Circle/Settings/index.tsx" }, "ZUPQzl": { - "defaultMessage": "", + "defaultMessage": " ", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, "ZVoJan": { "defaultMessage": "Edit", "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx" }, - "ZjDH42": { - "defaultMessage": "About Us" - }, "a/YQ1Z": { "defaultMessage": "Archived", "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx" @@ -798,9 +1140,13 @@ "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx" }, "aaUBvF": { - "defaultMessage": "", + "defaultMessage": "comment_circle", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, + "aacIz8": { + "defaultMessage": "Email", + "description": "src/views/Me/Settings/Settings/Email/index.tsx" + }, "adThp5": { "defaultMessage": "Latest" }, @@ -808,21 +1154,13 @@ "defaultMessage": "Processing", "description": "src/components/Transaction/State/index.tsx" }, - "b+LSgI": { - "defaultMessage": " replied to your discussion on ", - "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" - }, - "b3onWZ": { - "defaultMessage": "Last {days} days", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" - }, "b6zdPs": { "defaultMessage": "{count} Articles", "description": "src/components/Book/index.tsx" }, "b8ogKp": { - "description": "src/views/Circle/Settings/ManageInvitation/AddButton/index.tsx", - "defaultMessage": "Add Invitation" + "defaultMessage": "Add Invitation", + "description": "src/views/Circle/Settings/ManageInvitation/AddButton/index.tsx" }, "bBYO6x": { "defaultMessage": "Unblock", @@ -831,6 +1169,10 @@ "beLe/F": { "defaultMessage": "Broadcast" }, + "c/z318": { + "defaultMessage": "Incorrect email or password", + "description": "src/components/Forms/EmailLoginForm/index.tsx" + }, "cAP9g5": { "defaultMessage": "pinned your comment in {commentArticle}", "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx" @@ -838,17 +1180,16 @@ "cE4Hfw": { "defaultMessage": "Discover" }, - "cd/II9": { - "description": "", - "defaultMessage": "{totalCount, plural, =1 {article} other {articles}}" + "cQYXjl": { + "defaultMessage": "Currency", + "description": "src/views/Me/Settings/Misc/Currency/index.tsx" }, - "cf37Zy": { - "defaultMessage": "Add hash from IPFS into compatible reader such as ", - "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" + "cYvIpp": { + "defaultMessage": "Already subscribed to this circle.", + "description": "DUPLICATE_CIRCLE_SUBSCRIPTION" }, - "cfL5uk": { - "defaultMessage": "Over 200 words, current {numbers}", - "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx" + "cd/II9": { + "defaultMessage": "{totalCount, plural, =1 {article} other {articles}}" }, "cg1VJ2": { "defaultMessage": "Connect Wallet" @@ -857,12 +1198,36 @@ "defaultMessage": "You haven‘t published any articles yet, so there is no data available. Create one now to introduce yourself!", "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" }, + "ctl5tq": { + "defaultMessage": "New articles", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "cufo9X": { + "defaultMessage": "The daily limit is 5000 HKD", + "description": "PAYMENT_REACH_MAXIMUM_LIMIT" + }, "cyR7Kh": { "defaultMessage": "Back" }, + "d1mBsg": { + "defaultMessage": "Following circles", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "d4waan": { - "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx", - "defaultMessage": "Income" + "defaultMessage": "Income", + "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" + }, + "dAvP6d": { + "defaultMessage": "No blocked users yet", + "description": "src/views/Me/Settings/Blocked/SettingsBlocked.tsx" + }, + "dSjI7E": { + "defaultMessage": "Unable to disconnect the wallet because you have not added or associated another login (Email/Wallet/Social account).", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, + "dVbKzB": { + "defaultMessage": "Comments and replies", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" }, "deEeEI": { "defaultMessage": "Register" @@ -873,13 +1238,9 @@ "djJp6c": { "defaultMessage": "History" }, - "dnsfmR": { - "defaultMessage": "for bug reports or suggestions. We will reply to you as soon we can!", - "description": "src/views/Help/index.tsx" - }, - "eJ131z": { - "defaultMessage": "resigned as the maintainer of {tag}", - "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx" + "dzF4ci": { + "defaultMessage": "Resend", + "description": "src/components/Forms/EmailLoginForm/index.tsx" }, "eTpiYa": { "defaultMessage": "No data yet." @@ -891,12 +1252,11 @@ "defaultMessage": "My Page" }, "eov+J2": { - "description": "", "defaultMessage": "Custom URL Name" }, "fWDtpq": { - "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx", - "defaultMessage": "Pending" + "defaultMessage": "Pending", + "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx" }, "fsB/4p": { "defaultMessage": "Saved" @@ -912,17 +1272,33 @@ "defaultMessage": "Your work {articleTitle} has been republished to decentralized network", "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx" }, + "gW/KWu": { + "defaultMessage": "Comments has been pinned", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "ggS9L7": { + "defaultMessage": "The payment amount is invalid, please re-enter.", + "description": "PAYMENT_AMOUNT_INVALID" + }, "h+punE": { "defaultMessage": "Updated {date}", "description": "src/views/User/CollectionDetail/Content.tsx" }, + "h7sMQs": { + "defaultMessage": "New followers", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "h9A6AT": { + "defaultMessage": "For security, we will {resetHint} for this. You can set your password again after verifying new email address.", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, "h9CG9E": { - "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx", - "defaultMessage": "{commentType} has been deleted" + "defaultMessage": "{commentType} has been deleted", + "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" }, - "hWs95P": { - "defaultMessage": "Important information will be notified by email. So filling in your email address will be required.", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "hASeng": { + "defaultMessage": "Blocked Users", + "description": "src/views/Me/Settings/Misc/BlockedUsers.tsx" }, "hYG5fb": { "defaultMessage": "are following", @@ -932,17 +1308,9 @@ "defaultMessage": "followed your circle", "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx" }, - "hrfF+i": { - "defaultMessage": "Don't have a wallet yet? Check the ", - "description": "src/components/Forms/WalletAuthForm/Select.tsx" - }, "hrgo+E": { "defaultMessage": "Archive" }, - "iCFXtS": { - "defaultMessage": "For unregistered or users enabled wallet login", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" - }, "ieGrWo": { "defaultMessage": "Follow" }, @@ -953,20 +1321,21 @@ "itPgxd": { "defaultMessage": "Profile" }, + "iu3XKs": { + "defaultMessage": "Wallet disconnected", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, "izWS4J": { "defaultMessage": "Unfollow" }, + "jBx/nm": { + "defaultMessage": "Sign up with email", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "jJ1Brc": { "defaultMessage": "Pin Comment", "description": "src/components/Comment/DropdownActions/PinButton.tsx" }, - "jL2ZHb": { - "defaultMessage": "Code will expire after 20 minutes" - }, - "jgLiba": { - "defaultMessage": "Enter verification code", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "jkrM1r": { "defaultMessage": "Open IPNS page", "description": "src/components/UserProfile/WalletLabel/index.tsx" @@ -985,23 +1354,51 @@ "k97/u7": { "defaultMessage": "Add Articles" }, + "kPylKK": { + "defaultMessage": "Circle", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "kS3vTS": { + "defaultMessage": "Liker ID", + "description": "src/views/Me/Settings/Misc/LikerID.tsx" + }, "kc79d3": { "defaultMessage": "Topics" }, + "kf5NAv": { + "defaultMessage": "English letters, numbers, and underscores", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "kkZioy": { "defaultMessage": "Remove", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, - "lD4FPZ": { - "defaultMessage": "Enter Email" + "l/f7bu": { + "defaultMessage": "Want to know more? Check the", + "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" + }, + "l0/EvT": { + "defaultMessage": "Last step: Set Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, + "l02bPO": { + "defaultMessage": "Articles has been collected", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "l9LpDx": { + "defaultMessage": "{q} - Matters Search", + "description": "src/views/Search/AggregateResults/Articles.tsx" + }, + "lI2l2/": { + "defaultMessage": "Incorrect verification code. Please check your input, or try resend", + "description": "CODE_INVALID" }, "lIir/P": { - "description": "", "defaultMessage": "I see" }, "lNjDPr": { - "description": "src/views/Circle/Settings/ManageInvitation/Invites/Pending/index.tsx", - "defaultMessage": "You have not invited anyone yet! Invite friends to join your circle by clicking 'invite friends'." + "defaultMessage": "You have not invited anyone yet! Invite friends to join your circle by clicking 'invite friends'.", + "description": "src/views/Circle/Settings/ManageInvitation/Invites/Pending/index.tsx" }, "lZukEr": { "defaultMessage": "commented", @@ -1017,9 +1414,13 @@ "m4GG4b": { "defaultMessage": "Delete collection" }, + "m4KtjK": { + "defaultMessage": "New subscribers", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "mCAIcg": { - "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx", - "defaultMessage": "Hottest" + "defaultMessage": "Hottest", + "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx" }, "mPe6DK": { "defaultMessage": "subscribed your circle", @@ -1046,6 +1447,26 @@ "ml3SZN": { "defaultMessage": "Minimum 8 characters. Uppercase/lowercase letters, numbers and symbols are allowed" }, + "mp9SBo": { + "defaultMessage": "Circle notifications", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "mu01Gw": { + "defaultMessage": "Verification code is no longer valid. Please use the latest code we sent, or try resend", + "description": "CODE_INACTIVE" + }, + "n2Sc6g": { + "defaultMessage": "My profile", + "description": "src/views/Me/Settings/Settings/MyProfile/index.tsx" + }, + "n3shsQ": { + "defaultMessage": "Invalid name", + "description": "NAME_INVALID" + }, + "n6ZdqD": { + "defaultMessage": "This circle is already taken.", + "description": "DUPLICATE_CIRCLE" + }, "nGBrvw": { "defaultMessage": "Bookmarks" }, @@ -1053,13 +1474,17 @@ "defaultMessage": "replied your comment in", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, - "nYeDrI": { - "defaultMessage": "Not Registered? ", - "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" - }, "nYrKWp": { "defaultMessage": "Edit profile" }, + "no7l8z": { + "defaultMessage": "Disconnect wallet", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, + "nozN+j": { + "defaultMessage": "Invalid Email", + "description": "USER_EMAIL_INVALID" + }, "o2Na0B": { "defaultMessage": "Back to All" }, @@ -1067,6 +1492,10 @@ "defaultMessage": "{articleCount} Articles", "description": "src/components/CollectionDigest/Feed/index.tsx" }, + "ohbnFU": { + "defaultMessage": "Social Login", + "description": "src/views/Me/Settings/Settings/index.tsx" + }, "ohgTH4": { "defaultMessage": "Following", "description": "src/components/UserProfile/index.tsx" @@ -1075,16 +1504,17 @@ "defaultMessage": "liked", "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx" }, - "pCcbaC": { - "defaultMessage": "remove your work {articleTitle} from {tag}", - "description": "src/components/Notice/ArticleTagNotice/ArticleTagRemovedNotice.tsx" + "pHg5Ju": { + "defaultMessage": "Set password succeed", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" }, "pRV+UD": { "defaultMessage": "Collapse", "description": "src/components/Comment/DropdownActions/CollapseComment/Button.tsx" }, - "pwlQEY": { - "defaultMessage": "Display Name" + "pjunBi": { + "defaultMessage": "1MB maximum", + "description": "MIGRATION_REACH_LIMIT" }, "pzTOmv": { "defaultMessage": "Followers" @@ -1094,9 +1524,12 @@ "description": "src/views/Circle/Profile/DropdownActions/index.tsx" }, "q9oMKE": { - "description": "", "defaultMessage": "Circle Name" }, + "qNuRmA": { + "defaultMessage": "Send login code", + "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + }, "qYzBk8": { "defaultMessage": "unsubscribed your circle", "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx" @@ -1109,13 +1542,14 @@ "defaultMessage": "Remove Article", "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx" }, - "qswU4E": { - "defaultMessage": "Email will not be used as a login but only as a contact channel." - }, "r66dXx": { "defaultMessage": "mentioned you in broadcast comment in {circleName}", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, + "rADhX5": { + "defaultMessage": "Unavailable", + "description": "FORBIDDEN_BY_STATE" + }, "rBjwQy": { "defaultMessage": "Weibo", "description": "src/components/Share/Buttons/Weibo.tsx" @@ -1124,9 +1558,12 @@ "defaultMessage": "Tag Name" }, "rXnmeE": { - "description": "", "defaultMessage": "Confirm and Send" }, + "rZyVay": { + "defaultMessage": "Verification code expired, try resend", + "description": "CODE_EXPIRED" + }, "rbrahO": { "defaultMessage": "Close" }, @@ -1137,13 +1574,21 @@ "rfz/fN": { "defaultMessage": "Recommended size: 1600px x 900px" }, + "rqS2aA": { + "defaultMessage": "Sign in to that account to unlink it then try again", + "description": "src/components/AuthMethodFeed/AuthWalletFeed.tsx" + }, "s5JCCO": { "defaultMessage": "This post may include sensitive content and has been marked by the {actor} as restricted content. Are you sure you want to expand the full text?", "description": "src/views/ArticleDetail/Wall/Sensitive/index.tsx" }, "sPgUkN": { - "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx", - "defaultMessage": "This Month" + "defaultMessage": "This Month", + "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" + }, + "sg3nVO": { + "defaultMessage": "This email has been used, please go to login or try another one", + "description": "USER_EMAIL_EXISTS" }, "skbUBl": { "defaultMessage": "Log in", @@ -1156,17 +1601,29 @@ "sy+pv5": { "defaultMessage": "Email" }, - "t8/r8X": { - "defaultMessage": "Continue with Wallet", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" + "tBt9u0": { + "defaultMessage": "Sign in", + "description": "src/components/Forms/EmailLoginForm/index.tsx" }, "tEeEJT": { "defaultMessage": "Your work {articleTitle} has been published to decentralized network", "description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx" }, + "tQ3+Xo": { + "defaultMessage": "Add up to 5 tags", + "description": "TOO_MANY_TAGS_FOR_ARTICLE" + }, + "tQimre": { + "defaultMessage": "go to the homepage", + "description": "src/views/Callback/GoogleCallback.tsx" + }, "tzq2+W": { - "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx", - "defaultMessage": "Send" + "defaultMessage": "Send", + "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx" + }, + "u+cgOo": { + "defaultMessage": "My circle", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" }, "u5aHb4": { "defaultMessage": "Copy Link" @@ -1174,16 +1631,9 @@ "uJkv2X": { "defaultMessage": "Edit Tag" }, - "uVCg1l": { - "defaultMessage": "Explore Matters" - }, "ub1kHa": { "defaultMessage": "Add to collection" }, - "uclzDH": { - "defaultMessage": "{q}: {totalCount, plural, =0 {} one {} other {# Results}} - Matters Search", - "description": "src/views/Search/AggregateResults/Articles.tsx" - }, "ui1+QC": { "defaultMessage": "End of the results" }, @@ -1201,19 +1651,43 @@ "defaultMessage": "Account", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, + "v8dGSd": { + "defaultMessage": "Wallet is linked to a different account", + "description": "CRYPTO_WALLET_EXISTS" + }, "vAc1Bw": { "defaultMessage": "Block User" }, + "vCt85u": { + "defaultMessage": "Don't have a wallet yet? Check the", + "description": "src/components/Forms/WalletAuthForm/Select.tsx" + }, "vH8sCb": { "defaultMessage": "Circle" }, + "vJd1we": { + "defaultMessage": "Comment not found", + "description": "COMMENT_NOT_FOUND" + }, "vLEnrs": { "defaultMessage": "supported", "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx" }, + "viMrzF": { + "defaultMessage": "New broadcasts", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "vsD2wm": { + "defaultMessage": "reset your login password", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, "wCgTu5": { "defaultMessage": "Comments" }, + "wDX7zn": { + "defaultMessage": "Draft not found", + "description": "DRAFT_NOT_FOUND" + }, "wEQDC6": { "defaultMessage": "Edit" }, @@ -1221,20 +1695,31 @@ "defaultMessage": "left a comment in {circleName} and mentioned you", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, - "wSEOxH": { - "defaultMessage": "Contact Channel", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "wK4kLf": { + "defaultMessage": "Continue", + "description": "src/components/Forms/EmailSignUpForm/Init.tsx" + }, + "wMNZJa": { + "defaultMessage": "Notification not found", + "description": "NOTICE_NOT_FOUND" }, "wXzTZ0": { - "description": "", "defaultMessage": "Enter the name of your Circle" }, + "wbIHgJ": { + "defaultMessage": "The login code has been sent to your inbox", + "description": "src/components/Forms/EmailLoginForm/OtherOptions.tsx" + }, "wbcwKd": { "defaultMessage": "View All" }, - "xGh9O7": { - "defaultMessage": "As a reminder, the email address will not be used as a login but only as a contact channel.", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "wm9xNB": { + "defaultMessage": "{type} disconnected", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, + "x7O1/5": { + "defaultMessage": "This ID has been taken, please try another one", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" }, "xMaFCO": { "defaultMessage": "Articles", @@ -1245,12 +1730,16 @@ "description": "src/components/CollectionDigest/DropdownActions/PinButton.tsx" }, "xWZr13": { - "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx", - "defaultMessage": "{follower, plural, =1 {follower} other {followers}}" + "defaultMessage": "{follower, plural, =1 {follower} other {followers}}", + "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, - "xiKjd/": { - "defaultMessage": "Continue with Email", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" + "xafreT": { + "defaultMessage": "New discussions", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "xjHiYx": { + "defaultMessage": "Article revision count reach limit", + "description": "ARTICLE_REVISION_REACH_LIMIT" }, "xkr+zo": { "defaultMessage": "Terms" @@ -1258,9 +1747,17 @@ "xmcVZ0": { "defaultMessage": "Search" }, + "xxDjET": { + "defaultMessage": "Invalid display name", + "description": "DISPLAYNAME_INVALID" + }, "y0b6Kp": { - "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx", - "defaultMessage": "Pay" + "defaultMessage": "Pay", + "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" + }, + "y4Lyf1": { + "defaultMessage": "This name is already taken.", + "description": "NAME_EXISTS" }, "yBUiiy": { "defaultMessage": "This operation cannot be undone, confirm archiving?" @@ -1278,21 +1775,41 @@ "description": "src/components/Transaction/index.tsx" }, "ySGgTo": { - "description": "src/views/TagDetail/DropdownActions/index.tsx", - "defaultMessage": "Add Articles into Featured" + "defaultMessage": "Add Articles into Featured", + "description": "src/views/TagDetail/DropdownActions/index.tsx" + }, + "ySSF/a": { + "defaultMessage": "In order to ensure the identity security of the citizens of Matters City, we've upgraded some security settings. Please confirm your Matters ID (cannot be modified once confirmation).", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, + "yToCTn": { + "defaultMessage": "Please refresh the page and try again.", + "description": "NETWORK_ERROR" }, "yZfKI4": { - "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx", - "defaultMessage": "discussion and mentioned you" + "defaultMessage": "discussion and mentioned you", + "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" }, "yoRaUc": { "defaultMessage": "Refund", "description": "src/components/Transaction/index.tsx" }, + "z+a1SW": { + "defaultMessage": "Settings", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "zAK5G+": { + "defaultMessage": "The login link has been sent to {email}", + "description": "src/components/Forms/Verification/LinkSent.tsx" + }, "zKOr2x": { "defaultMessage": "Conversion Rate of Followers", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "zOZ77e": { + "defaultMessage": "the User Agreement and Privacy Policy.", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "zQvVDJ": { "defaultMessage": "All" }, @@ -1303,12 +1820,17 @@ "defaultMessage": "left a comment in {circleName}", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, + "zvNfwL": { + "defaultMessage": "Operation too frequent, please try again later.", + "description": "ACTION_LIMIT_EXCEEDED" + }, "zxlwbc": { "defaultMessage": "Waiting ...", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, "zxy15q": { - "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx", - "defaultMessage": "{subscriber, plural, =1 {subscriber} other {subscribers}}" + "defaultMessage": "{subscriber, plural, =1 {subscriber} other {subscribers}}", + "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" } -} \ No newline at end of file +} + diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json index 986958487f..b792bf9b7b 100644 --- a/lang/zh-Hans.json +++ b/lang/zh-Hans.json @@ -1,4 +1,12 @@ { + "+51DoZ": { + "defaultMessage": "请先验证邮箱", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" + }, + "+63O1f": { + "defaultMessage": "邮箱或密码错误", + "description": "USER_PASSWORD_INVALID" + }, "+7SAix": { "defaultMessage": "2-12 个字符" }, @@ -16,13 +24,32 @@ "defaultMessage": "确认要将“{article}”从选集中移出吗?", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, + "+o9W2T": { + "defaultMessage": "文件上传失败,请确认文件链接是否有效,或手动下载后再上传", + "description": "UNABLE_TO_UPLOAD_FROM_URL" + }, + "+rB5Am": { + "defaultMessage": "作品不存在", + "description": "ARTICLE_NOT_FOUND" + }, + "+vVZ/G": { + "defaultMessage": "綁定" + }, "/3kw6k": { "defaultMessage": "尝试将内容写入 IPFS 网络中,需要一段时间,请耐心等候。若等候时间过久,可通过发布文章来加速。", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, + "/BQWEh": { + "defaultMessage": "最近 1 个月", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, "/IMR+8": { "defaultMessage": "支持排行榜" }, + "/TXBJR": { + "defaultMessage": "不知道哪里出错了,过几分钟看看", + "description": "UNKNOWN_ERROR" + }, "/asuIY": { "defaultMessage": "进入社区", "description": "src/components/Forms/EmailSignUpForm/Complete.tsx" @@ -30,8 +57,9 @@ "/jJLYy": { "defaultMessage": "交易记录" }, - "/ns2st": { - "defaultMessage": "下载应用" + "/pnYHM": { + "defaultMessage": "围炉不存在", + "description": "CIRCLE_NOT_FOUND" }, "/podGX": { "defaultMessage": "公开", @@ -40,6 +68,10 @@ "0Azlrb": { "defaultMessage": "管理" }, + "0CyECR": { + "defaultMessage": "Matters ID 已设置,更多帐号相关设置可前往设置页修改", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "0JLcHr": { "defaultMessage": "内容可能包含色情、暴力、血腥等限制级内容,部分用户可能不适合观看,或引起不适、心理负担,请谨慎判断是否阅读。", "description": "src/views/ArticleDetail/Wall/Sensitive/index.tsx" @@ -51,6 +83,18 @@ "defaultMessage": "新建选集", "description": "src/views/User/Collections/UserCollections.tsx" }, + "0e1xjL": { + "defaultMessage": "邮箱每天最多可修改 {count} 次", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, + "0iyH+q": { + "defaultMessage": "最近 7 日", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, + "0jvbdb": { + "defaultMessage": "服务器错误,请稍候重试", + "description": "INTERNAL_SERVER_ERROR" + }, "0qagOO": { "defaultMessage": "围炉营收", "description": "src/components/Transaction/index.tsx" @@ -59,17 +103,33 @@ "defaultMessage": "失败", "description": "src/components/Transaction/State/index.tsx" }, + "1QrwIl": { + "defaultMessage": "去看看", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "1Z1M77": { "defaultMessage": "尚无阅读记录", "description": "src/views/Me/History/index.tsx" }, + "1hyiZ8": { + "defaultMessage": "确认 Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "1qQzV0": { "defaultMessage": "免费邀请", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "1y1U9f": { + "defaultMessage": "Liker ID 已被其他人使用", + "description": "LIKER_USER_ID_EXISTS" + }, "1zVIWy": { - "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx", - "defaultMessage": "在 {commentArticle} 评论提到了你" + "defaultMessage": "在 {commentArticle} 评论提到了你", + "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" + }, + "202PEj": { + "defaultMessage": "确认 Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" }, "20bImY": { "defaultMessage": "众聊" @@ -81,48 +141,64 @@ "defaultMessage": "总数", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "2DkkhD": { + "defaultMessage": "设置 - 通知", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "2P5JII": { + "defaultMessage": "解绑", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "2W0f9h": { "defaultMessage": "个人简介" }, "2atspc": { "defaultMessage": "我的草稿" }, + "2ef/Xl": { + "defaultMessage": "屏蔽", + "description": "src/views/Me/Settings/Blocked/ToggleBlockButton.tsx" + }, "2oxLHg": { "defaultMessage": "最多可设置 3 个代表作" }, "2slIPX": { "defaultMessage": "我的赞赏" }, + "2vpUYs": { + "defaultMessage": "回复留言", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "32bml8": { "defaultMessage": "追踪", "description": "src/components/Layout/SideNav/index.tsx" }, + "39AHJm": { + "defaultMessage": "注册" + }, "3KNMbJ": { "defaultMessage": "作品" }, - "3kbIhS": { - "defaultMessage": "未命名" + "3Tg548": { + "defaultMessage": "登录", + "description": "src/components/Forms/SelectAuthMethodForm/AuthTabs.tsx" }, - "3uQKhx": { - "defaultMessage": "若你希望向 Matters 提出建议,或遭遇操作异常,请发送邮件至", - "description": "src/views/Help/index.tsx" + "3phEFL": { + "defaultMessage": "继续使用表示您同意", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" }, "3yk8fB": { "defaultMessage": "我的钱包" }, - "3ynsJ3": { - "defaultMessage": "想了解更多?详见 ", - "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" - }, "47FYwb": { "defaultMessage": "取消" }, "4CrCbD": { "defaultMessage": "自治" }, - "4giHJT": { - "defaultMessage": "在行动装置上使用问题,参考 ", - "description": "src/components/Forms/WalletAuthForm/Select.tsx" + "4KuZ0o": { + "defaultMessage": "资源不存在", + "description": "ASSET_NOT_FOUND" }, "4l6vz1": { "defaultMessage": "复制" @@ -135,16 +211,29 @@ "defaultMessage": "还没有众聊", "description": "src/views/Circle/Discussion/Discussion.tsx" }, + "5CcjZy": { + "defaultMessage": "确认要解绑 {type} 吗?", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "5FO4vn": { "defaultMessage": "你尚无权限进行该操作" }, - "5MDGuM": { - "defaultMessage": "请输入你的注册邮箱" + "5JN+nl": { + "defaultMessage": "请检查邮件", + "description": "src/components/Forms/Verification/LinkSent.tsx" + }, + "5MDA6O": { + "defaultMessage": "标签名称已被使用", + "description": "DUPLICATE_TAG" }, "5iii3x": { "defaultMessage": "围炉:", "description": "src/components/CircleDigest/UserProfile/index.tsx" }, + "5sWnog": { + "defaultMessage": "Liker ID 邮箱已被其他人使用", + "description": "LIKER_EMAIL_EXISTS" + }, "5sg7KC": { "defaultMessage": "密码" }, @@ -159,6 +248,10 @@ "defaultMessage": "设定围炉门槛(每月)", "description": "src/components/Forms/CreateCircleForm/Init.tsx" }, + "6N2LKY": { + "defaultMessage": "授权信息已失效,请重新登入", + "description": "OAUTH_TOKEN_INVALID" + }, "6OBAOi": { "defaultMessage": "目前总订阅人数", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -171,12 +264,17 @@ "defaultMessage": "全部", "description": "src/views/Me/Transactions/index.tsx" }, - "6flWFg": { - "defaultMessage": "用户协议" + "6e8teX": { + "defaultMessage": "通知", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" }, "6kMb9Z": { "defaultMessage": "链上纪录" }, + "6lwWCu": { + "defaultMessage": "其他", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" + }, "6q0G5e": { "defaultMessage": "加入成功", "description": "src/components/Dialogs/CollectionSelectDialog/index.tsx" @@ -185,6 +283,14 @@ "defaultMessage": "已取消", "description": "src/components/Transaction/State/index.tsx" }, + "70UCEy": { + "defaultMessage": "在行动装置上使用问题,参考 ", + "description": "src/components/Forms/WalletAuthForm/Select.tsx" + }, + "73iajM": { + "defaultMessage": "出错了,请检查你输入的内容", + "description": "BAD_USER_INPUT" + }, "77tYPg": { "defaultMessage": "确认删除后,{commentType}会立即消失。", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" @@ -196,6 +302,9 @@ "7JlauX": { "defaultMessage": "指南" }, + "7cwoRo": { + "defaultMessage": "因为作者设置,你无法参与讨论。" + }, "7jjWxF": { "defaultMessage": "无结果", "description": "src/components/Dialogs/AddArticlesCollectionDialog/SearchingDialogContent.tsx" @@ -211,13 +320,25 @@ "8KFsZN": { "defaultMessage": "阅读次数" }, - "8PWD05": { - "defaultMessage": "邀请你成为 {tag} 的协作者", - "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx" - }, "8cv9D4": { "defaultMessage": "下一步" }, + "8iciCA": { + "defaultMessage": "实体不存在", + "description": "ENTITY_NOT_FOUND" + }, + "8qGjpr": { + "defaultMessage": "设置", + "description": "src/views/Me/Settings/Misc/index.tsx" + }, + "8rMZWb": { + "defaultMessage": "回复了你在围炉 ", + "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" + }, + "8t6Cs8": { + "defaultMessage": "Matters 日报", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, "8w3GEA": { "defaultMessage": "在作品 {article} 中提及你", "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx" @@ -226,15 +347,14 @@ "defaultMessage": "离开围炉", "description": "src/views/Circle/Profile/DropdownActions/index.tsx" }, - "9+Ddtu": { - "defaultMessage": "下一步" - }, "9Fpc9S": { "defaultMessage": "漏洞报告" }, "9J0iCw": { - "defaultMessage": "已注销用户", - "description": "src/components/UserProfile/index.tsx" + "defaultMessage": "已注销用户" + }, + "9Vkz9W": { + "defaultMessage": "图片面积不得超过 1 亿像素(如 10,000 x 10,000 像素)" }, "9mfw9c": { "defaultMessage": "钱包地址", @@ -244,19 +364,22 @@ "defaultMessage": "讨论已送出", "description": "src/views/Circle/Discussion/Discussion.tsx" }, + "A0KB7s": { + "defaultMessage": "广播留言", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "A3g33H": { "defaultMessage": "归档的作品仅自己可见,且操作无法撤销。如文章已加入选集,将从选集中移除。(已发布到 IPFS 的版本不受影响)" }, - "A3rLZt": { - "defaultMessage": "最近 {months} 个月", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" - }, "A41QIy": { "defaultMessage": "输入密码" }, "A6ozr9": { "defaultMessage": "选集名称" }, + "A6r2p1": { + "defaultMessage": "进入 Matters" + }, "A7ugfn": { "defaultMessage": "更多操作" }, @@ -264,6 +387,10 @@ "defaultMessage": "信用卡交易内容有疑虑时,发卡机构暂停或退回的款项", "description": "src/components/Transaction/index.tsx" }, + "AEiogR": { + "defaultMessage": "该 Google 账号已关联至其他 Matters 账号,请登录该账号解绑后再试", + "description": "USER_SOCIAL_ACCOUNT_EXISTS" + }, "AGcU5J": { "defaultMessage": "置顶", "description": "src/components/Comment/DropdownActions/PinButton.tsx" @@ -284,6 +411,18 @@ "defaultMessage": "追踪", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "At8Qd2": { + "defaultMessage": "账号", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" + }, + "Avukw5": { + "defaultMessage": "支付金额太少,请重新输入", + "description": "PAYMENT_AMOUNT_TOO_SMALL" + }, + "AwQHHA": { + "defaultMessage": "请先设定交易密码", + "description": "PAYMENT_PASSWORD_NOT_SET" + }, "B2As08": { "defaultMessage": "没有更多", "description": "src/components/Interaction/InfiniteScroll/EndOfResults/index.tsx" @@ -292,6 +431,13 @@ "defaultMessage": " 在围炉 {commentCircle}", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" }, + "BMGZE2": { + "defaultMessage": "作品或评论提及我", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "BY343C": { + "defaultMessage": "修改" + }, "Bc20la": { "defaultMessage": "天" }, @@ -299,6 +445,14 @@ "defaultMessage": "目前总追踪人数", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "BnMru1": { + "defaultMessage": "语言", + "description": "src/views/Me/Settings/Misc/Language.tsx" + }, + "C3NKBg": { + "defaultMessage": "{type} 已绑定", + "description": "src/views/Me/Settings/Settings/Socials/index.tsx" + }, "C8GQaD": { "defaultMessage": "{date}更新", "description": "src/components/CollectionDigest/Feed/index.tsx" @@ -310,10 +464,6 @@ "defaultMessage": "收藏了", "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx" }, - "CNbggD": { - "defaultMessage": "成为了 {tag} 的主理人", - "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx" - }, "Cdkhl8": { "defaultMessage": "刪除{commentType}", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" @@ -321,16 +471,20 @@ "CnPG8j": { "defaultMessage": "精华" }, + "CoF9qv": { + "defaultMessage": "确认要解绑钱包?", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, "Cu3Cty": { "defaultMessage": "月" }, - "CwSpld": { - "defaultMessage": "非登入用途", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "CxYcYR": { "defaultMessage": "建议使用正方形图片" }, + "D+N1Q6": { + "defaultMessage": "该 {type} 账号已关联至其他 Matters 账号,请登录该账号解绑后再试", + "description": "src/views/Me/Settings/Settings/Socials/index.tsx" + }, "D2Sw/t": { "defaultMessage": "添加以下任一网址到 RSS 阅读器", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" @@ -338,14 +492,26 @@ "D3idYv": { "defaultMessage": "设定" }, - "DFieKt": { - "defaultMessage": "辞去了 {tag} 的协作者", - "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx" + "DUoV1W": { + "defaultMessage": "已超过 140 字,目前 {numbers} 字", + "description": "src/components/Dialogs/EditProfileDialog/Content.tsx" }, "DYrDcG": { "defaultMessage": "徽章", "description": "src/components/UserProfile/index.tsx" }, + "Dq29Hb": { + "defaultMessage": "你尚未绑定邮箱。基于资金安全考虑,储值需绑定邮箱。", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, + "DqQvtL": { + "defaultMessage": "解除屏蔽", + "description": "src/views/Me/Settings/Blocked/ToggleBlockButton.tsx" + }, + "Dt1o78": { + "defaultMessage": "该钱包已关联至其他帐号", + "description": "src/components/AuthMethodFeed/AuthWalletFeed.tsx" + }, "DyuHBH": { "defaultMessage": "取消代表作", "description": "src/components/CollectionDigest/DropdownActions/PinButton.tsx" @@ -365,12 +531,17 @@ "defaultMessage": "在 {circleName} 的广播中留言 ", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, - "EfJYPI": { - "defaultMessage": "验证码", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "EoeUjA": { + "defaultMessage": "你无权限进行该操作", + "description": "FORBIDDEN_BY_STATE" + }, + "EwbNbl": { + "defaultMessage": "Oops!链接已失效", + "description": "src/views/Callback/GoogleCallback.tsx" }, - "EwVnoC": { - "defaultMessage": "我已阅读并同意" + "FEI5Fv": { + "defaultMessage": "邮箱", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" }, "FOOymB": { "defaultMessage": "还没有成员", @@ -397,6 +568,18 @@ "defaultMessage": "选集已刪除", "description": "src/components/CollectionDigest/DropdownActions/DeleteCollection/Dialog.tsx" }, + "FxrSCh": { + "defaultMessage": "ID 设置后无法修改,确认使用 {id} 作为 Matters ID 吗?", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, + "GG9uXH": { + "defaultMessage": "请移步相关页面重新获取链接,您也可以 ", + "description": "src/views/Callback/GoogleCallback.tsx" + }, + "GHxtae": { + "defaultMessage": "数字钱包", + "description": "src/components/Forms/SelectAuthMethodForm/AuthTabs.tsx" + }, "GRtGnZ": { "defaultMessage": "辞去权限", "description": "src/views/TagDetail/DropdownActions/index.tsx" @@ -415,6 +598,14 @@ "GcvLBC": { "defaultMessage": "我知道了" }, + "GhogWq": { + "defaultMessage": "退订", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "Gt7K6r": { + "defaultMessage": "钱包地址", + "description": "src/views/Me/Settings/Settings/Wallet/index.tsx" + }, "GugBCe": { "defaultMessage": "本月新增追踪人数", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" @@ -435,17 +626,36 @@ "HJ0iZJ": { "defaultMessage": "确认归档" }, + "HPVOw/": { + "defaultMessage": "数字钱包", + "description": "src/views/Me/Settings/Settings/index.tsx" + }, + "HkozYU": { + "defaultMessage": "更换钱包", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, + "HnxG15": { + "defaultMessage": "设定" + }, + "HqnUd1": { + "defaultMessage": "添加 IPFS 生成的 IPNS 指纹到阅读器,如:", + "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" + }, "HxcjQl": { "defaultMessage": "Matters 将提供更多创作与区块链结合的服务,接入钱包后即可在未来第一时间体验新功能。", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, - "HzaRKA": { - "defaultMessage": "一键搬家" - }, "IKPYe9": { "defaultMessage": "查看", "description": "src/components/Dialogs/CollectionSelectDialog/index.tsx" }, + "IPqNCS": { + "defaultMessage": "确认使用", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, + "IXycMo": { + "defaultMessage": "重新发送" + }, "Ihwz5K": { "defaultMessage": "代表作已取消" }, @@ -453,10 +663,6 @@ "defaultMessage": "邀你加入围炉 {circleName} ,你可以免费体验 {freePeriod} 天", "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx" }, - "J+LXrH": { - "defaultMessage": "使用邮箱进入,未来可随时启用钱包登入", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" - }, "JTWayV": { "defaultMessage": "添加描述", "description": "src/views/User/CollectionDetail/Content.tsx" @@ -468,6 +674,10 @@ "defaultMessage": "进入围炉", "description": "src/components/CircleDigest/UserProfile/index.tsx" }, + "JkWLg6": { + "defaultMessage": "被追踪", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "JpS59y": { "defaultMessage": "已接受", "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx" @@ -476,13 +686,17 @@ "defaultMessage": "作品已取消精选", "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx" }, - "JxlxVc": { - "defaultMessage": "忘记密码", - "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + "K2/mHF": { + "defaultMessage": "暂时无法解绑 {type},因为你没有其他可用于登录的身份(邮箱/数字钱包/社交帐号)。", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" }, "K3r6DQ": { "defaultMessage": "刪除" }, + "KIQUHo": { + "defaultMessage": "登录密码", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" + }, "KLQ1/z": { "defaultMessage": "围炉创建成功", "description": "src/components/Forms/CreateCircleForm/Profile.tsx" @@ -494,10 +708,22 @@ "KQi/UZ": { "defaultMessage": "归档作品" }, + "KlJEP9": { + "defaultMessage": "钱包已绑定", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, + "KxVlDj": { + "defaultMessage": "设置 - 已屏蔽用户", + "description": "src/views/Me/Settings/Blocked/index.tsx" + }, "L0J61B": { "defaultMessage": "免费", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "L34EMG": { + "defaultMessage": "没有帐号?", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "L4Fcr8": { "defaultMessage": "新建选集" }, @@ -527,24 +753,49 @@ "defaultMessage": "IPNS 订阅", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, - "LphWYP": { - "defaultMessage": "用户协议和隐私政策" + "LmiUWG": { + "defaultMessage": "你无法对此对象进行该操作", + "description": "FORBIDDEN_BY_TARGET_STATE" + }, + "Lp6CiR": { + "defaultMessage": "设置 - 其他", + "description": "src/views/Me/Settings/Misc/index.tsx" }, "LqxIEU": { "defaultMessage": "钱包地址将作为身份识别之一在个人页公开显示。", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, + "LwFJTy": { + "defaultMessage": "Matters ID 为用户唯一标识,设置后无法修改。", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "MDNaxs": { "defaultMessage": "人", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "MPEeBy": { + "defaultMessage": "操作失败,请稍候重试", + "description": "ACTION_FAILED" + }, + "Me4s4Q": { + "defaultMessage": "请先绑定邮箱", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, + "Me5cJu": { + "defaultMessage": "绑定钱包", + "description": "src/components/Dialogs/AddWalletLoginDialog/Content.tsx" + }, + "Mn7GEf": { + "defaultMessage": "精选过去 24 小时与你有关的消息", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, + "MoyOR+": { + "defaultMessage": "设置 - 围炉通知", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "N2IrpM": { "defaultMessage": "确认" }, - "N3K1H9": { - "defaultMessage": "Matters 不会透过任何渠道询问你的钱包私钥。", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "NAidKb": { "defaultMessage": "通知" }, @@ -552,6 +803,14 @@ "defaultMessage": "支持", "description": "src/views/Me/Transactions/index.tsx" }, + "NEKHMm": { + "defaultMessage": "邮件", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, + "NNF+3f": { + "defaultMessage": "标签不存在", + "description": "TAG_NOT_FOUND" + }, "NONfAh": { "defaultMessage": "豆瓣", "description": "src/components/Share/Buttons/Douban.tsx" @@ -560,10 +819,22 @@ "defaultMessage": "再次输入密码", "description": "src/components/Forms/EmailSignUpForm/Password.tsx" }, + "O0MQs/": { + "defaultMessage": "请先绑定邮箱", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" + }, "O0QB1v": { "defaultMessage": "用户将收到你的围炉免费资格邀请函,设置免费的时限,邀请他们一起加入吧!", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx" }, + "O2Nqk8": { + "defaultMessage": "忘记密码?", + "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + }, + "OAc8+i": { + "defaultMessage": "邮箱地址验证链接已发送至 {email},请查收邮件", + "description": "src/components/GlobalToast/index.tsx" + }, "OIj8pQ": { "defaultMessage": "成功发送邀请", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx" @@ -571,13 +842,24 @@ "OKhRC6": { "defaultMessage": "分享" }, - "Po+kJe": { - "defaultMessage": "最近 {month} 个月", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + "Opaa0R": { + "defaultMessage": "作品被赞赏", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "OyvGvT": { + "defaultMessage": "图片大小不得超过 5MB" + }, + "PLBmDT": { + "defaultMessage": "登录密码", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" }, "Pp/0po": { "defaultMessage": "换一批" }, + "PtV68+": { + "defaultMessage": "邮箱或密码错误", + "description": "USER_EMAIL_NOT_FOUND" + }, "Q8Qw5B": { "defaultMessage": "描述" }, @@ -589,12 +871,16 @@ "defaultMessage": "你的修订作品发布失败", "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx" }, + "QXJQ5G": { + "defaultMessage": "授权信息已失效,请重新登入", + "description": "TOKEN_INVALID" + }, "QZXKhG": { "defaultMessage": "设置围炉网址(创建后不可修改)", "description": "src/components/Forms/CreateCircleForm/Init.tsx" }, "R7yHDl": { - "defaultMessage": "圍爐營收", + "defaultMessage": "围炉营收", "description": "src/components/Transaction/index.tsx" }, "RFzVUD": { @@ -605,10 +891,22 @@ "defaultMessage": "已归档", "description": "src/components/ArticleDigest/Archive/index.tsx" }, + "ROPCC0": { + "defaultMessage": "请先绑定邮箱", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/Email.tsx" + }, + "Ro0CuW": { + "defaultMessage": "你尚无权限进行该操作", + "description": "FORBIDDEN" + }, "RxiHr/": { "defaultMessage": "还没有任何用户回覆你的邀请喔!", "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx" }, + "S/hoJx": { + "defaultMessage": "用户不存在", + "description": "USER_NOT_FOUND" + }, "S8PcQf": { "defaultMessage": "取消代表作", "description": "src/components/ArticleDigest/DropdownActions/PinButton.tsx" @@ -631,6 +929,14 @@ "Szd1tH": { "defaultMessage": "登出失败,再来一次" }, + "SzrjpI": { + "defaultMessage": "作品正文编辑距离超出上限", + "description": "ARTICLE_REVISION_CONTENT_INVALID" + }, + "T2kMnM": { + "defaultMessage": "每个帐号只允许创建一个围炉", + "description": "CIRCLE_CREATION_REACH_LIMIT" + }, "T73SwS": { "defaultMessage": "订阅", "description": "src/views/Me/Transactions/index.tsx" @@ -638,6 +944,9 @@ "T9oZC8": { "defaultMessage": "确认要删除该选集“{collection}”吗?" }, + "TF1OhT": { + "defaultMessage": "临时密码已过期,请尝试重新发送" + }, "TSDiqB": { "defaultMessage": "付费人数", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -649,10 +958,6 @@ "TzhzIH": { "defaultMessage": "创作者" }, - "U/Tqmx": { - "defaultMessage": "评论了你收藏的作品 ", - "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx" - }, "U7o9Ba": { "defaultMessage": "累计阅读时長" }, @@ -660,13 +965,16 @@ "defaultMessage": "数据" }, "UOdEqi": { - "defaultMessage": "原有透过电子信箱登入方式将为你保留。为维护你的帐户安全,加密钱包连接后无法重设。", + "defaultMessage": "原有透过电子信箱登录方式将为你保留。为维护你的帐户安全,加密钱包连接后无法重设。", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, "URljhZ": { "defaultMessage": "作品已移出", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, + "Ub+AGc": { + "defaultMessage": "登录" + }, "Udp4Bm": { "defaultMessage": "移至底部", "description": "src/components/ArticleDigest/DropdownActions/SetBottomCollectionButton.tsx" @@ -675,6 +983,10 @@ "defaultMessage": "作品已添加标签", "description": "src/views/TagDetail/DropdownActions/index.tsx" }, + "V5OMr4": { + "defaultMessage": "什么是数字钱包?", + "description": "src/components/Forms/SelectAuthMethodForm/WalletFeed.tsx" + }, "V8msLJ": { "defaultMessage": "在你的围炉中留言提及你", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" @@ -700,9 +1012,21 @@ "VzzYJk": { "defaultMessage": "新建" }, + "W0sZaX": { + "defaultMessage": "最近 3 个月", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, + "W66Eyq": { + "defaultMessage": "密码需至少 8 位,支持字母、数字及符号的组合。", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" + }, "W8OZ3G": { "defaultMessage": "确认删除" }, + "WDZndZ": { + "defaultMessage": "请在钱包中完成签名", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, "WQT8ZA": { "defaultMessage": "编辑选集" }, @@ -710,6 +1034,10 @@ "defaultMessage": "添加到精选", "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx" }, + "Wg0ZvI": { + "defaultMessage": "作品被收藏", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "WpvsPu": { "defaultMessage": "订阅", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -737,15 +1065,31 @@ "XVYrS/": { "defaultMessage": "还没有追踪者" }, + "XYUhx0": { + "defaultMessage": "解绑 {type}", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "Xd0J7Y": { "defaultMessage": "开放社区" }, + "XdLnXf": { + "defaultMessage": "钱包余额不足", + "description": "PAYMENT_BALANCE_INSUFFICIENT" + }, + "XfRKZY": { + "defaultMessage": "去绑定", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, "XgdZSb": { "defaultMessage": "值得关注" }, "Xi40U9": { "defaultMessage": "操作无法撤销,确认删除选集吗?" }, + "XmnzQT": { + "defaultMessage": "一个标签最多仅可有 4 名协作者共同管理", + "description": "TAG_EDITORS_REACH_LIMIT" + }, "XuYhBC": { "defaultMessage": "代表作已设置" }, @@ -757,12 +1101,16 @@ "defaultMessage": "在你的围炉中留言", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, - "YUtHE9": { - "defaultMessage": "将你的作品 {articleTitle} 在 {tag} 中选为精华", - "description": "src/components/Notice/ArticleTagNotice/ArticleTagAddedNotice.tsx" + "Y7N/Jg": { + "defaultMessage": "图片边长不得超过 12,000 像素" }, - "YjNkcK": { - "defaultMessage": "若要变更地址,请直接操作钱包切換" + "YPMn9n": { + "defaultMessage": "请先登入再进行操作", + "description": "UNAUTHENTICATED" + }, + "YUXRsM": { + "defaultMessage": "已屏蔽用户", + "description": "src/views/Me/Settings/Blocked/index.tsx" }, "YlPCRU": { "defaultMessage": "关联了", @@ -780,9 +1128,6 @@ "defaultMessage": "修订", "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx" }, - "ZjDH42": { - "defaultMessage": "关于我们" - }, "a/YQ1Z": { "defaultMessage": "作品已归档", "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx" @@ -798,6 +1143,10 @@ "defaultMessage": " 中的发言", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, + "aacIz8": { + "defaultMessage": "邮箱", + "description": "src/views/Me/Settings/Settings/Email/index.tsx" + }, "adThp5": { "defaultMessage": "最新" }, @@ -805,14 +1154,6 @@ "defaultMessage": "进行中…", "description": "src/components/Transaction/State/index.tsx" }, - "b+LSgI": { - "defaultMessage": "回复了你在围炉 ", - "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" - }, - "b3onWZ": { - "defaultMessage": "最近 {days} 天", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" - }, "b6zdPs": { "defaultMessage": "{count} 篇文章", "description": "src/components/Book/index.tsx" @@ -828,6 +1169,10 @@ "beLe/F": { "defaultMessage": "广播" }, + "c/z318": { + "defaultMessage": "邮箱或密码错误", + "description": "src/components/Forms/EmailLoginForm/index.tsx" + }, "cAP9g5": { "defaultMessage": "将你的评论在 {commentArticle} 中置顶", "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx" @@ -835,16 +1180,16 @@ "cE4Hfw": { "defaultMessage": "发现" }, - "cd/II9": { - "defaultMessage": "{totalCount, plural, =1 {篇文章} other {篇文章}}" + "cQYXjl": { + "defaultMessage": "汇率币别", + "description": "src/views/Me/Settings/Misc/Currency/index.tsx" }, - "cf37Zy": { - "defaultMessage": "添加 IPFS 生成的 IPNS 指纹到阅读器,如:", - "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" + "cYvIpp": { + "defaultMessage": "无需重复订阅此围炉", + "description": "DUPLICATE_CIRCLE_SUBSCRIPTION" }, - "cfL5uk": { - "defaultMessage": "已超过 200 字,目前 {numbers} 字", - "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx" + "cd/II9": { + "defaultMessage": "{totalCount, plural, =1 {篇文章} other {篇文章}}" }, "cg1VJ2": { "defaultMessage": "连接加密钱包" @@ -853,13 +1198,37 @@ "defaultMessage": "由于你尚未发布任何作品,这裡还没有任何数据能与你分享哦!发布第一篇作品来介绍你自己,以此开启你的创作之旅吧!", "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" }, + "ctl5tq": { + "defaultMessage": "新作品", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "cufo9X": { + "defaultMessage": "已达到单日支付上限(5000 HKD)", + "description": "PAYMENT_REACH_MAXIMUM_LIMIT" + }, "cyR7Kh": { "defaultMessage": "返回" }, + "d1mBsg": { + "defaultMessage": "新订阅者", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "d4waan": { "defaultMessage": "营收", "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" }, + "dAvP6d": { + "defaultMessage": "尚无屏蔽记录", + "description": "src/views/Me/Settings/Blocked/SettingsBlocked.tsx" + }, + "dSjI7E": { + "defaultMessage": "暂无法断开钱包链接,因为你没有其他可用于登录的身份(邮箱/数字钱包/社交帐号)。", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, + "dVbKzB": { + "defaultMessage": "评论和回复", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "deEeEI": { "defaultMessage": "注册" }, @@ -869,13 +1238,9 @@ "djJp6c": { "defaultMessage": "我的足跡" }, - "dnsfmR": { - "defaultMessage": ",我们会尽快回复!", - "description": "src/views/Help/index.tsx" - }, - "eJ131z": { - "defaultMessage": "辞去了 {tag} 的主理人", - "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx" + "dzF4ci": { + "defaultMessage": "重新发送", + "description": "src/components/Forms/EmailLoginForm/index.tsx" }, "eTpiYa": { "defaultMessage": "尚无支持数据" @@ -907,17 +1272,33 @@ "defaultMessage": "你的修订作品 {articleTitle} 已发布到分布式网络", "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx" }, + "gW/KWu": { + "defaultMessage": "评论被精选", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "ggS9L7": { + "defaultMessage": "支付金额无效,请重新输入", + "description": "PAYMENT_AMOUNT_INVALID" + }, "h+punE": { "defaultMessage": "{date}更新", "description": "src/views/User/CollectionDetail/Content.tsx" }, + "h7sMQs": { + "defaultMessage": "新追踪者", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "h9A6AT": { + "defaultMessage": "为确保帐号安全,修改邮箱將{resetHint},你可在验证邮箱后再次设置密码。", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, "h9CG9E": { "defaultMessage": "{commentType}已刪除", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" }, - "hWs95P": { - "defaultMessage": "重要讯息将透过邮件通知,请填入信箱完成设定。", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "hASeng": { + "defaultMessage": "已屏蔽用户", + "description": "src/views/Me/Settings/Misc/BlockedUsers.tsx" }, "hYG5fb": { "defaultMessage": "人追踪", @@ -927,17 +1308,9 @@ "defaultMessage": "追踪了你的围炉", "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx" }, - "hrfF+i": { - "defaultMessage": "刚接触加密钱包?参考 ", - "description": "src/components/Forms/WalletAuthForm/Select.tsx" - }, "hrgo+E": { "defaultMessage": "归档" }, - "iCFXtS": { - "defaultMessage": "欢迎未注册或已启用钱包登入的朋友使用", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" - }, "ieGrWo": { "defaultMessage": "追踪" }, @@ -948,20 +1321,21 @@ "itPgxd": { "defaultMessage": "个人主页" }, + "iu3XKs": { + "defaultMessage": "钱包已解绑", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, "izWS4J": { "defaultMessage": "取消追踪" }, + "jBx/nm": { + "defaultMessage": "邮箱注册", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "jJ1Brc": { "defaultMessage": "喜欢回应", "description": "src/components/Comment/DropdownActions/PinButton.tsx" }, - "jL2ZHb": { - "defaultMessage": "验证码有效期 20 分钟" - }, - "jgLiba": { - "defaultMessage": "请输入验证码", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "jkrM1r": { "defaultMessage": "打开 IPNS 页面", "description": "src/components/UserProfile/WalletLabel/index.tsx" @@ -980,15 +1354,44 @@ "k97/u7": { "defaultMessage": "添加作品" }, + "kPylKK": { + "defaultMessage": "围炉", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "kS3vTS": { + "defaultMessage": "Liker ID", + "description": "src/views/Me/Settings/Misc/LikerID.tsx" + }, "kc79d3": { "defaultMessage": "找你想看的" }, + "kf5NAv": { + "defaultMessage": "可使用英文、数字及下划线", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "kkZioy": { "defaultMessage": "确认移出", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, - "lD4FPZ": { - "defaultMessage": "请输入邮箱" + "l/f7bu": { + "defaultMessage": "想了解更多?詳見 ", + "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" + }, + "l0/EvT": { + "defaultMessage": "最后一步:设置 Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, + "l02bPO": { + "defaultMessage": "作品被关联", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "l9LpDx": { + "defaultMessage": "{q} - Matters 搜索", + "description": "src/views/Search/AggregateResults/Articles.tsx" + }, + "lI2l2/": { + "defaultMessage": "验证码不正确,请检查输入内容或重新发送", + "description": "CODE_INVALID" }, "lIir/P": { "defaultMessage": "我知道了" @@ -1005,12 +1408,16 @@ "defaultMessage": "热门" }, "m/Wg7b": { - "defaultMessage": "Circle Description", + "defaultMessage": "围炉描述", "description": "src/components/Forms/CreateCircleForm/Profile.tsx" }, "m4GG4b": { "defaultMessage": "删除选集" }, + "m4KtjK": { + "defaultMessage": "新订阅者", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "mCAIcg": { "defaultMessage": "站内阅读热门排行", "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx" @@ -1040,6 +1447,26 @@ "ml3SZN": { "defaultMessage": "至少 8 个字符,支持英文大小写字母、数字和特殊符号" }, + "mp9SBo": { + "defaultMessage": "围炉通知", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "mu01Gw": { + "defaultMessage": "验证码已失效,请使用最新验证码或重新发送", + "description": "CODE_INACTIVE" + }, + "n2Sc6g": { + "defaultMessage": "个人信息", + "description": "src/views/Me/Settings/Settings/MyProfile/index.tsx" + }, + "n3shsQ": { + "defaultMessage": "名称不正确", + "description": "NAME_INVALID" + }, + "n6ZdqD": { + "defaultMessage": "围炉名称已被使用", + "description": "DUPLICATE_CIRCLE" + }, "nGBrvw": { "defaultMessage": "我的收藏" }, @@ -1047,13 +1474,17 @@ "defaultMessage": "在 ", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, - "nYeDrI": { - "defaultMessage": "沒有帐户?", - "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" - }, "nYrKWp": { "defaultMessage": "编辑个人信息" }, + "no7l8z": { + "defaultMessage": "解绑钱包", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, + "nozN+j": { + "defaultMessage": "邮箱不正确", + "description": "USER_EMAIL_INVALID" + }, "o2Na0B": { "defaultMessage": "返回全部" }, @@ -1061,6 +1492,10 @@ "defaultMessage": "{articleCount} 篇文章", "description": "src/components/CollectionDigest/Feed/index.tsx" }, + "ohbnFU": { + "defaultMessage": "社交登录", + "description": "src/views/Me/Settings/Settings/index.tsx" + }, "ohgTH4": { "defaultMessage": "追踪中", "description": "src/components/UserProfile/index.tsx" @@ -1069,16 +1504,17 @@ "defaultMessage": "赞赏了", "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx" }, - "pCcbaC": { - "defaultMessage": "将你的作品 {articleTitle} 从 {tag} 中移除", - "description": "src/components/Notice/ArticleTagNotice/ArticleTagRemovedNotice.tsx" + "pHg5Ju": { + "defaultMessage": "登录密码已设置", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" }, "pRV+UD": { "defaultMessage": "折叠", "description": "src/components/Comment/DropdownActions/CollapseComment/Button.tsx" }, - "pwlQEY": { - "defaultMessage": "姓名" + "pjunBi": { + "defaultMessage": "导入作品累計超过 1MB", + "description": "MIGRATION_REACH_LIMIT" }, "pzTOmv": { "defaultMessage": "追踪者" @@ -1090,6 +1526,10 @@ "q9oMKE": { "defaultMessage": "围炉名称" }, + "qNuRmA": { + "defaultMessage": "发送临时密码", + "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + }, "qYzBk8": { "defaultMessage": "退订了你的围炉", "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx" @@ -1102,13 +1542,14 @@ "defaultMessage": "移除作品", "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx" }, - "qswU4E": { - "defaultMessage": "邮箱将不作为登入使用,仅作为联系渠道" - }, "r66dXx": { "defaultMessage": "在 {circleName} 的广播留言中提及你", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, + "rADhX5": { + "defaultMessage": "不可用", + "description": "FORBIDDEN_BY_STATE" + }, "rBjwQy": { "defaultMessage": "微博", "description": "src/components/Share/Buttons/Weibo.tsx" @@ -1119,6 +1560,10 @@ "rXnmeE": { "defaultMessage": "确认发送" }, + "rZyVay": { + "defaultMessage": "验证码已过期,请重新发送", + "description": "CODE_EXPIRED" + }, "rbrahO": { "defaultMessage": "关闭" }, @@ -1129,6 +1574,10 @@ "rfz/fN": { "defaultMessage": "建議尺寸 1600 x 900 像素" }, + "rqS2aA": { + "defaultMessage": "请登录该帐户解绑钱包后再试", + "description": "src/components/AuthMethodFeed/AuthWalletFeed.tsx" + }, "s5JCCO": { "defaultMessage": "此文已被{actor}标示为限制级内容,是否确定展开全文?", "description": "src/views/ArticleDetail/Wall/Sensitive/index.tsx" @@ -1137,8 +1586,12 @@ "defaultMessage": "本月营收", "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" }, + "sg3nVO": { + "defaultMessage": "邮箱已被使用,请前往登录或尝试另一个", + "description": "USER_EMAIL_EXISTS" + }, "skbUBl": { - "defaultMessage": "登入", + "defaultMessage": "登录", "description": "src/components/Buttons/Login/index.tsx" }, "stjoBH": { @@ -1148,34 +1601,39 @@ "sy+pv5": { "defaultMessage": "邮箱" }, - "t8/r8X": { - "defaultMessage": "连接加密钱包", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" + "tBt9u0": { + "defaultMessage": "登录", + "description": "src/components/Forms/EmailLoginForm/index.tsx" }, "tEeEJT": { "defaultMessage": "你的作品 {articleTitle} 已发布到分布式网络", "description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx" }, + "tQ3+Xo": { + "defaultMessage": "标签添加最多至 5 个", + "description": "TOO_MANY_TAGS_FOR_ARTICLE" + }, + "tQimre": { + "defaultMessage": "前往首页", + "description": "src/views/Callback/GoogleCallback.tsx" + }, "tzq2+W": { "defaultMessage": "寄出邀请", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx" }, + "u+cgOo": { + "defaultMessage": "我的围炉", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "u5aHb4": { "defaultMessage": "复制链接" }, "uJkv2X": { "defaultMessage": "编辑标签" }, - "uVCg1l": { - "defaultMessage": "玩转 Matters 实用指南" - }, "ub1kHa": { "defaultMessage": "加入选集" }, - "uclzDH": { - "defaultMessage": "{q}: {totalCount, plural, =0 {} other {# 条结果}} - Matters 搜索", - "description": "src/views/Search/AggregateResults/Articles.tsx" - }, "ui1+QC": { "defaultMessage": "已显示所有结果" }, @@ -1193,19 +1651,43 @@ "defaultMessage": "账户", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, + "v8dGSd": { + "defaultMessage": "该钱包已关联至其他帐号", + "description": "CRYPTO_WALLET_EXISTS" + }, "vAc1Bw": { - "defaultMessage": "封锁用户" + "defaultMessage": "屏蔽用户" + }, + "vCt85u": { + "defaultMessage": "刚接触加密钱包?参考 ", + "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, "vH8sCb": { "defaultMessage": "我的围炉" }, + "vJd1we": { + "defaultMessage": "评论不存在", + "description": "COMMENT_NOT_FOUND" + }, "vLEnrs": { "defaultMessage": "支持了", "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx" }, + "viMrzF": { + "defaultMessage": "广播", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "vsD2wm": { + "defaultMessage": "重置你的登录密码", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, "wCgTu5": { "defaultMessage": "评论" }, + "wDX7zn": { + "defaultMessage": "草稿不存在", + "description": "DRAFT_NOT_FOUND" + }, "wEQDC6": { "defaultMessage": "编辑资料" }, @@ -1213,19 +1695,31 @@ "defaultMessage": "在 {circleName} 中留言提及你", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, - "wSEOxH": { - "defaultMessage": "联系渠道", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "wK4kLf": { + "defaultMessage": "注册", + "description": "src/components/Forms/EmailSignUpForm/Init.tsx" + }, + "wMNZJa": { + "defaultMessage": "通知不存在", + "description": "NOTICE_NOT_FOUND" }, "wXzTZ0": { "defaultMessage": "給圍爐取一個吸引人的名字吧" }, + "wbIHgJ": { + "defaultMessage": "临时密码已通过邮件发送", + "description": "src/components/Forms/EmailLoginForm/OtherOptions.tsx" + }, "wbcwKd": { "defaultMessage": "查看全部" }, - "xGh9O7": { - "defaultMessage": "提醒:信箱将不作为登入使用,仅作为联系渠道", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "wm9xNB": { + "defaultMessage": "{type} 已解绑", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, + "x7O1/5": { + "defaultMessage": "ID 已被使用,请修改后再试", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" }, "xMaFCO": { "defaultMessage": "阅读", @@ -1239,9 +1733,13 @@ "defaultMessage": "{follower, plural, =1 {人} other {人}}", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, - "xiKjd/": { - "defaultMessage": "使用电子邮箱", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" + "xafreT": { + "defaultMessage": "留言", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "xjHiYx": { + "defaultMessage": "作品修订次数超出上限", + "description": "ARTICLE_REVISION_REACH_LIMIT" }, "xkr+zo": { "defaultMessage": "协议" @@ -1249,10 +1747,18 @@ "xmcVZ0": { "defaultMessage": "搜索" }, + "xxDjET": { + "defaultMessage": "名称不正确", + "description": "DISPLAYNAME_INVALID" + }, "y0b6Kp": { "defaultMessage": "付费", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "y4Lyf1": { + "defaultMessage": "该名称已被其他用户使用", + "description": "NAME_EXISTS" + }, "yBUiiy": { "defaultMessage": "操作无法撤销,确认归档吗?" }, @@ -1272,6 +1778,14 @@ "defaultMessage": "添加精选", "description": "src/views/TagDetail/DropdownActions/index.tsx" }, + "ySSF/a": { + "defaultMessage": "为了保障马特市市民的身份安全,我们升级了管理设定。请确认您的 Matters ID(确认后不可再次修改)", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, + "yToCTn": { + "defaultMessage": "网络错误,请刷新页面", + "description": "NETWORK_ERROR" + }, "yZfKI4": { "defaultMessage": " 眾聊提及你", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" @@ -1280,10 +1794,22 @@ "defaultMessage": "退款", "description": "src/components/Transaction/index.tsx" }, + "z+a1SW": { + "defaultMessage": "设置", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "zAK5G+": { + "defaultMessage": "登录链接已发送至 {email}", + "description": "src/components/Forms/Verification/LinkSent.tsx" + }, "zKOr2x": { "defaultMessage": "已追踪用户占总观看人数比例", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "zOZ77e": { + "defaultMessage": "用户协议及隐私条款", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "zQvVDJ": { "defaultMessage": "全部" }, @@ -1294,6 +1820,10 @@ "defaultMessage": "在 {circleName} 中留言", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, + "zvNfwL": { + "defaultMessage": "操作过于频繁,请稍候重试", + "description": "ACTION_LIMIT_EXCEEDED" + }, "zxlwbc": { "defaultMessage": "等待写入完成...", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" @@ -1302,4 +1832,4 @@ "defaultMessage": "{subscriber, plural, =1 {人} other {人}}", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" } -} \ No newline at end of file +} diff --git a/lang/zh-Hant.json b/lang/zh-Hant.json index 2e3f27d1ac..8d0f70c309 100644 --- a/lang/zh-Hant.json +++ b/lang/zh-Hant.json @@ -1,4 +1,12 @@ { + "+51DoZ": { + "defaultMessage": "請先驗證郵箱", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" + }, + "+63O1f": { + "defaultMessage": "郵件地址或密碼錯誤", + "description": "USER_PASSWORD_INVALID" + }, "+7SAix": { "defaultMessage": "2-12 個字元" }, @@ -16,13 +24,32 @@ "defaultMessage": "確認要將「{article}」從選集中移出嗎?", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, + "+o9W2T": { + "defaultMessage": "檔案上傳失敗,請確認檔案連結是否有效,或手動下載後再上傳", + "description": "UNABLE_TO_UPLOAD_FROM_URL" + }, + "+rB5Am": { + "defaultMessage": "作品不存在", + "description": "ARTICLE_NOT_FOUND" + }, + "+vVZ/G": { + "defaultMessage": "綁定" + }, "/3kw6k": { "defaultMessage": "嘗試將內容寫入 IPFS 網絡中,需要一段時間,請耐心等候。若等候時間過久,可透過發佈文章來加速。", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, + "/BQWEh": { + "defaultMessage": "最近 1 個月", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, "/IMR+8": { "defaultMessage": "支持排行榜" }, + "/TXBJR": { + "defaultMessage": "不知道哪裏出錯了,過幾分鐘看看", + "description": "UNKNOWN_ERROR" + }, "/asuIY": { "defaultMessage": "進入社區", "description": "src/components/Forms/EmailSignUpForm/Complete.tsx" @@ -30,8 +57,9 @@ "/jJLYy": { "defaultMessage": "交易記錄" }, - "/ns2st": { - "defaultMessage": "下載應用" + "/pnYHM": { + "defaultMessage": "圍爐不存在", + "description": "CIRCLE_NOT_FOUND" }, "/podGX": { "defaultMessage": "公開", @@ -40,6 +68,10 @@ "0Azlrb": { "defaultMessage": "管理" }, + "0CyECR": { + "defaultMessage": "Matters ID 已設置,更多帳號相關設置可前往設定頁修改", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "0JLcHr": { "defaultMessage": "內容可能包含色情、暴力、血腥等限制級內容,部分用戶可能不適合觀看,或引起不適、心理負擔,請謹慎判斷是否閱讀。", "description": "src/views/ArticleDetail/Wall/Sensitive/index.tsx" @@ -51,6 +83,18 @@ "defaultMessage": "新建選集", "description": "src/views/User/Collections/UserCollections.tsx" }, + "0e1xjL": { + "defaultMessage": "郵件地址每天最多可修改 {count} 次", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, + "0iyH+q": { + "defaultMessage": "最近 7 日", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, + "0jvbdb": { + "defaultMessage": "伺服器錯誤,請稍候重試", + "description": "INTERNAL_SERVER_ERROR" + }, "0qagOO": { "defaultMessage": "圍爐訂閱", "description": "src/components/Transaction/index.tsx" @@ -59,17 +103,33 @@ "defaultMessage": "失敗", "description": "src/components/Transaction/State/index.tsx" }, + "1QrwIl": { + "defaultMessage": "去看看", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, "1Z1M77": { "defaultMessage": "尚無閱讀紀錄", "description": "src/views/Me/History/index.tsx" }, + "1hyiZ8": { + "defaultMessage": "確認 Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "1qQzV0": { "defaultMessage": "免費邀請", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "1y1U9f": { + "defaultMessage": "Liker ID 已被其他人使用", + "description": "LIKER_USER_ID_EXISTS" + }, "1zVIWy": { - "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx", - "defaultMessage": "在 {commentArticle} 評論提到了你" + "defaultMessage": "在 {commentArticle} 評論提到了你", + "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" + }, + "202PEj": { + "defaultMessage": "確認 Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" }, "20bImY": { "defaultMessage": "眾聊" @@ -81,48 +141,64 @@ "defaultMessage": "總數", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "2DkkhD": { + "defaultMessage": "設定 - 通知", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "2P5JII": { + "defaultMessage": "解綁", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "2W0f9h": { "defaultMessage": "個人簡介" }, "2atspc": { "defaultMessage": "我的草稿" }, + "2ef/Xl": { + "defaultMessage": "封鎖", + "description": "src/views/Me/Settings/Blocked/ToggleBlockButton.tsx" + }, "2oxLHg": { "defaultMessage": "最多可設置 3 個代表作" }, "2slIPX": { "defaultMessage": "讚賞" }, + "2vpUYs": { + "defaultMessage": "回覆留言", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "32bml8": { "defaultMessage": "追蹤", "description": "src/components/Layout/SideNav/index.tsx" }, + "39AHJm": { + "defaultMessage": "註冊" + }, "3KNMbJ": { "defaultMessage": "作品" }, - "3kbIhS": { - "defaultMessage": "未命名" + "3Tg548": { + "defaultMessage": "登入", + "description": "src/components/Forms/SelectAuthMethodForm/AuthTabs.tsx" }, - "3uQKhx": { - "defaultMessage": "若你希望向 Matters 提出建議,或遭遇操作異常,請發送郵件至", - "description": "src/views/Help/index.tsx" + "3phEFL": { + "defaultMessage": "繼續使用表示您同意", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" }, "3yk8fB": { "defaultMessage": "我的錢包" }, - "3ynsJ3": { - "defaultMessage": "想了解更多?詳見 ", - "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" - }, "47FYwb": { "defaultMessage": "取消" }, "4CrCbD": { "defaultMessage": "自治" }, - "4giHJT": { - "defaultMessage": "在行動裝置上使用問題,參考 ", - "description": "src/components/Forms/WalletAuthForm/Select.tsx" + "4KuZ0o": { + "defaultMessage": "資源不存在", + "description": "ASSET_NOT_FOUND" }, "4l6vz1": { "defaultMessage": "複製" @@ -135,16 +211,29 @@ "defaultMessage": "還沒有眾聊", "description": "src/views/Circle/Discussion/Discussion.tsx" }, + "5CcjZy": { + "defaultMessage": "確認要解綁 {type} 嗎?", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "5FO4vn": { "defaultMessage": "你尚無權限進行該操作" }, - "5MDGuM": { - "defaultMessage": "請輸入你的註冊電子信箱" + "5JN+nl": { + "defaultMessage": "請檢查郵件", + "description": "src/components/Forms/Verification/LinkSent.tsx" + }, + "5MDA6O": { + "defaultMessage": "標籤名稱已被使用", + "description": "DUPLICATE_TAG" }, "5iii3x": { "defaultMessage": "圍爐:", "description": "src/components/CircleDigest/UserProfile/index.tsx" }, + "5sWnog": { + "defaultMessage": "Liker ID 電子信箱已被其他人使用", + "description": "LIKER_EMAIL_EXISTS" + }, "5sg7KC": { "defaultMessage": "密碼" }, @@ -159,6 +248,10 @@ "defaultMessage": "設定圍爐門檻(每月)", "description": "src/components/Forms/CreateCircleForm/Init.tsx" }, + "6N2LKY": { + "defaultMessage": "授權信息已失效,請重新登入", + "description": "OAUTH_TOKEN_INVALID" + }, "6OBAOi": { "defaultMessage": "目前總訂閱人數", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -171,12 +264,17 @@ "defaultMessage": "全部", "description": "src/views/Me/Transactions/index.tsx" }, - "6flWFg": { - "defaultMessage": "用戶協議" + "6e8teX": { + "defaultMessage": "通知", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" }, "6kMb9Z": { "defaultMessage": "鏈上紀錄" }, + "6lwWCu": { + "defaultMessage": "其他", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" + }, "6q0G5e": { "defaultMessage": "加入成功", "description": "src/components/Dialogs/CollectionSelectDialog/index.tsx" @@ -185,6 +283,14 @@ "defaultMessage": "已取消", "description": "src/components/Transaction/State/index.tsx" }, + "70UCEy": { + "defaultMessage": "在行動裝置上使用問題,參考 ", + "description": "src/components/Forms/WalletAuthForm/Select.tsx" + }, + "73iajM": { + "defaultMessage": "出錯了,請檢查你輸入的內容", + "description": "BAD_USER_INPUT" + }, "77tYPg": { "defaultMessage": "確認刪除後,{commentType}會立即消失。", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" @@ -196,6 +302,9 @@ "7JlauX": { "defaultMessage": "指南" }, + "7cwoRo": { + "defaultMessage": "因爲作者設置,你無法參與討論。" + }, "7jjWxF": { "defaultMessage": "無結果", "description": "src/components/Dialogs/AddArticlesCollectionDialog/SearchingDialogContent.tsx" @@ -211,13 +320,25 @@ "8KFsZN": { "defaultMessage": "閱讀次數" }, - "8PWD05": { - "defaultMessage": "邀請你成為 {tag} 的協作者", - "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx" - }, "8cv9D4": { "defaultMessage": "下一步" }, + "8iciCA": { + "defaultMessage": "實體不存在", + "description": "ENTITY_NOT_FOUND" + }, + "8qGjpr": { + "defaultMessage": "設定", + "description": "src/views/Me/Settings/Misc/index.tsx" + }, + "8rMZWb": { + "defaultMessage": "回覆了你在圍爐 ", + "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" + }, + "8t6Cs8": { + "defaultMessage": "Matters 日報", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, "8w3GEA": { "defaultMessage": "在作品 {article} 中提及你", "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx" @@ -226,15 +347,14 @@ "defaultMessage": "離開圍爐", "description": "src/views/Circle/Profile/DropdownActions/index.tsx" }, - "9+Ddtu": { - "defaultMessage": "下一步" - }, "9Fpc9S": { "defaultMessage": "漏洞提報" }, "9J0iCw": { - "defaultMessage": "已註銷用戶", - "description": "src/components/UserProfile/index.tsx" + "defaultMessage": "已註銷用戶" + }, + "9Vkz9W": { + "defaultMessage": "圖片面積不得超過 1 億像素(如 10,000x10,000 像素)" }, "9mfw9c": { "defaultMessage": "錢包地址", @@ -244,19 +364,22 @@ "defaultMessage": "討論已送出", "description": "src/views/Circle/Discussion/Discussion.tsx" }, + "A0KB7s": { + "defaultMessage": "廣播留言", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "A3g33H": { "defaultMessage": "封存作品僅自己可見,且操作無法撤銷。如文章已加入選集,將從選集中移除。(已發佈到 IPFS 的版本不受影響)" }, - "A3rLZt": { - "defaultMessage": "最近 {months} 個月", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" - }, "A41QIy": { "defaultMessage": "輸入密碼" }, "A6ozr9": { "defaultMessage": "選集名稱" }, + "A6r2p1": { + "defaultMessage": "進入 Matters" + }, "A7ugfn": { "defaultMessage": "更多操作" }, @@ -264,6 +387,10 @@ "defaultMessage": "信用卡交易內容有疑慮時,發卡機構暫停或退回的款項", "description": "src/components/Transaction/index.tsx" }, + "AEiogR": { + "defaultMessage": "該 Google 帳號已關聯至其他 Matters 帳號,請登入該帳號解綁後再試", + "description": "USER_SOCIAL_ACCOUNT_EXISTS" + }, "AGcU5J": { "defaultMessage": "置頂", "description": "src/components/Comment/DropdownActions/PinButton.tsx" @@ -277,13 +404,25 @@ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx" }, "AVpR3Q": { - "defaultMessage": "Wallet linked", + "defaultMessage": "已綁定錢包", "description": "src/components/UserProfile/WalletLabel/index.tsx" }, "AYTnjk": { "defaultMessage": "追蹤", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "At8Qd2": { + "defaultMessage": "帳號", + "description": "src/views/Me/Settings/Settings/SettingsTabs/index.tsx" + }, + "Avukw5": { + "defaultMessage": "支付金額太少,請重新輸入", + "description": "PAYMENT_AMOUNT_TOO_SMALL" + }, + "AwQHHA": { + "defaultMessage": "請先設定交易密碼", + "description": "PAYMENT_PASSWORD_NOT_SET" + }, "B2As08": { "defaultMessage": "沒有更多", "description": "src/components/Interaction/InfiniteScroll/EndOfResults/index.tsx" @@ -292,6 +431,13 @@ "defaultMessage": " 在圍爐 {commentCircle}", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" }, + "BMGZE2": { + "defaultMessage": "作品或評論提及我", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "BY343C": { + "defaultMessage": "修改" + }, "Bc20la": { "defaultMessage": "天" }, @@ -299,6 +445,14 @@ "defaultMessage": "目前總追蹤人數", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "BnMru1": { + "defaultMessage": "語言", + "description": "src/views/Me/Settings/Misc/Language.tsx" + }, + "C3NKBg": { + "defaultMessage": "{type} 已綁定", + "description": "src/views/Me/Settings/Settings/Socials/index.tsx" + }, "C8GQaD": { "defaultMessage": "{date}更新", "description": "src/components/CollectionDigest/Feed/index.tsx" @@ -310,10 +464,6 @@ "defaultMessage": "收藏了", "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx" }, - "CNbggD": { - "defaultMessage": "成為了 {tag} 的主理人", - "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx" - }, "Cdkhl8": { "defaultMessage": "刪除{commentType}", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" @@ -321,16 +471,20 @@ "CnPG8j": { "defaultMessage": "精華" }, + "CoF9qv": { + "defaultMessage": "確認要解綁錢包?", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, "Cu3Cty": { "defaultMessage": "月" }, - "CwSpld": { - "defaultMessage": "非登入用途", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "CxYcYR": { "defaultMessage": "建議使用正方形圖片" }, + "D+N1Q6": { + "defaultMessage": "該 {type} 帳號已關聯至其他 Matters 帳號,請登入該帳號解綁後再試", + "description": "src/views/Me/Settings/Settings/Socials/index.tsx" + }, "D2Sw/t": { "defaultMessage": "添加以下任一網址到 RSS 閱讀器", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" @@ -338,14 +492,26 @@ "D3idYv": { "defaultMessage": "設定" }, - "DFieKt": { - "defaultMessage": "辭去了 {tag} 的協作者", - "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx" + "DUoV1W": { + "defaultMessage": "已超過 140 字,目前 {numbers} 字", + "description": "src/components/Dialogs/EditProfileDialog/Content.tsx" }, "DYrDcG": { - "defaultMessage": "Badges", + "defaultMessage": "徽章", "description": "src/components/UserProfile/index.tsx" }, + "Dq29Hb": { + "defaultMessage": "你尚未綁定電子郵件。 基於資金安全考慮,儲值需綁定郵箱。", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, + "DqQvtL": { + "defaultMessage": "解除封鎖", + "description": "src/views/Me/Settings/Blocked/ToggleBlockButton.tsx" + }, + "Dt1o78": { + "defaultMessage": "該錢包已關聯至其他帳號", + "description": "src/components/AuthMethodFeed/AuthWalletFeed.tsx" + }, "DyuHBH": { "defaultMessage": "取消代表作", "description": "src/components/CollectionDigest/DropdownActions/PinButton.tsx" @@ -365,12 +531,17 @@ "defaultMessage": "在 {circleName} 的廣播中留言 ", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, - "EfJYPI": { - "defaultMessage": "驗證碼", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "EoeUjA": { + "defaultMessage": "你無權限進行該操作", + "description": "FORBIDDEN_BY_STATE" + }, + "EwbNbl": { + "defaultMessage": "Oops!連結已失效", + "description": "src/views/Callback/GoogleCallback.tsx" }, - "EwVnoC": { - "defaultMessage": "我已閱讀並同意" + "FEI5Fv": { + "defaultMessage": "郵件地址", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" }, "FOOymB": { "defaultMessage": "還沒有成員", @@ -397,6 +568,18 @@ "defaultMessage": "選集已刪除", "description": "src/components/CollectionDigest/DropdownActions/DeleteCollection/Dialog.tsx" }, + "FxrSCh": { + "defaultMessage": "ID 設置後無法修改,確認使用 {id} 作為 Matters ID 嗎?", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, + "GG9uXH": { + "defaultMessage": "請移步相關頁面重新獲取連結,您也可以 ", + "description": "src/views/Callback/GoogleCallback.tsx" + }, + "GHxtae": { + "defaultMessage": "數字錢包", + "description": "src/components/Forms/SelectAuthMethodForm/AuthTabs.tsx" + }, "GRtGnZ": { "defaultMessage": "辭去權限", "description": "src/views/TagDetail/DropdownActions/index.tsx" @@ -415,6 +598,14 @@ "GcvLBC": { "defaultMessage": "我知道了" }, + "GhogWq": { + "defaultMessage": "退訂", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "Gt7K6r": { + "defaultMessage": "錢包地址", + "description": "src/views/Me/Settings/Settings/Wallet/index.tsx" + }, "GugBCe": { "defaultMessage": "本月新增追蹤人數", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" @@ -435,17 +626,36 @@ "HJ0iZJ": { "defaultMessage": "確認封存" }, + "HPVOw/": { + "defaultMessage": "數字錢包", + "description": "src/views/Me/Settings/Settings/index.tsx" + }, + "HkozYU": { + "defaultMessage": "更換錢包", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, + "HnxG15": { + "defaultMessage": "設定" + }, + "HqnUd1": { + "defaultMessage": "添加 IPFS 生成的 IPNS 指紋到閱讀器,如:", + "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" + }, "HxcjQl": { "defaultMessage": "Matters 將提供更多創作與區塊鏈結合的服務,接入錢包後即可在未來第一時間體驗新功能。", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, - "HzaRKA": { - "defaultMessage": "一鍵搬家" - }, "IKPYe9": { "defaultMessage": "查看", "description": "src/components/Dialogs/CollectionSelectDialog/index.tsx" }, + "IPqNCS": { + "defaultMessage": "確認使用", + "description": "src/components/Dialogs/SetUserNameDialog/ConfirmStep.tsx" + }, + "IXycMo": { + "defaultMessage": "重新發送" + }, "Ihwz5K": { "defaultMessage": "代表作已取消" }, @@ -453,10 +663,6 @@ "defaultMessage": "邀你加入圍爐 {circleName} ,你可以免費體驗 {freePeriod} 天", "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx" }, - "J+LXrH": { - "defaultMessage": "使用信箱進入,未來可隨時啟用錢包登入", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" - }, "JTWayV": { "defaultMessage": "添加描述", "description": "src/views/User/CollectionDetail/Content.tsx" @@ -468,6 +674,10 @@ "defaultMessage": "進入圍爐", "description": "src/components/CircleDigest/UserProfile/index.tsx" }, + "JkWLg6": { + "defaultMessage": "被追蹤", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "JpS59y": { "defaultMessage": "已接受", "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx" @@ -476,13 +686,17 @@ "defaultMessage": "作品已取消精選", "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx" }, - "JxlxVc": { - "defaultMessage": "忘記密碼", - "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + "K2/mHF": { + "defaultMessage": "暫時無法解綁 {type},因為你沒有其他登入方式(電子郵件/數字錢包/社交帳號)。", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" }, "K3r6DQ": { "defaultMessage": "刪除" }, + "KIQUHo": { + "defaultMessage": "登入密碼", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" + }, "KLQ1/z": { "defaultMessage": "圍爐創建成功", "description": "src/components/Forms/CreateCircleForm/Profile.tsx" @@ -494,10 +708,22 @@ "KQi/UZ": { "defaultMessage": "封存作品" }, + "KlJEP9": { + "defaultMessage": "錢包已綁定", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, + "KxVlDj": { + "defaultMessage": "設定 - 已封鎖用戶", + "description": "src/views/Me/Settings/Blocked/index.tsx" + }, "L0J61B": { "defaultMessage": "免費", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "L34EMG": { + "defaultMessage": "沒有帳號?", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "L4Fcr8": { "defaultMessage": "新建選集" }, @@ -527,24 +753,49 @@ "defaultMessage": "IPNS 訂閱", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" }, - "LphWYP": { - "defaultMessage": "用戶協議和隱私政策" + "LmiUWG": { + "defaultMessage": "你無法對此對象進行該操作", + "description": "FORBIDDEN_BY_TARGET_STATE" + }, + "Lp6CiR": { + "defaultMessage": "設定 - 其他", + "description": "src/views/Me/Settings/Misc/index.tsx" }, "LqxIEU": { "defaultMessage": "錢包地址將作為身份識別之一在個人頁公開顯示。", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, + "LwFJTy": { + "defaultMessage": "Matters ID 為用戶唯一標識,設置後無法修改。", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "MDNaxs": { "defaultMessage": "人", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "MPEeBy": { + "defaultMessage": "操作失敗,請稍候重試", + "description": "ACTION_FAILED" + }, + "Me4s4Q": { + "defaultMessage": "請先綁定電子郵件", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, + "Me5cJu": { + "defaultMessage": "綁定錢包", + "description": "src/components/Dialogs/AddWalletLoginDialog/Content.tsx" + }, + "Mn7GEf": { + "defaultMessage": "精選過去 24 小時與你有關的消息", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, + "MoyOR+": { + "defaultMessage": "設定 - 圍爐通知", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "N2IrpM": { "defaultMessage": "確認" }, - "N3K1H9": { - "defaultMessage": "Matters 不會透過任何渠道詢問你的錢包私鑰。", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "NAidKb": { "defaultMessage": "通知" }, @@ -552,6 +803,14 @@ "defaultMessage": "支持", "description": "src/views/Me/Transactions/index.tsx" }, + "NEKHMm": { + "defaultMessage": "電子郵件", + "description": "src/views/Me/Settings/Notifications/Email.tsx" + }, + "NNF+3f": { + "defaultMessage": "標籤不存在", + "description": "TAG_NOT_FOUND" + }, "NONfAh": { "defaultMessage": "豆瓣", "description": "src/components/Share/Buttons/Douban.tsx" @@ -560,10 +819,22 @@ "defaultMessage": "再次輸入密碼", "description": "src/components/Forms/EmailSignUpForm/Password.tsx" }, + "O0MQs/": { + "defaultMessage": "請先綁定郵箱", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" + }, "O0QB1v": { "defaultMessage": "用戶將收到你的圍爐免費資格邀請函,設置免費的時限,邀請他們一起加入吧!", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx" }, + "O2Nqk8": { + "defaultMessage": "忘記密碼?", + "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + }, + "OAc8+i": { + "defaultMessage": "郵件地址驗證連結已發送至 {email},請查收郵件", + "description": "src/components/GlobalToast/index.tsx" + }, "OIj8pQ": { "defaultMessage": "成功發送邀請", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx" @@ -571,13 +842,24 @@ "OKhRC6": { "defaultMessage": "分享" }, - "Po+kJe": { - "defaultMessage": "最近 {month} 個月", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + "Opaa0R": { + "defaultMessage": "作品被讚賞", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "OyvGvT": { + "defaultMessage": "圖片大小不得超過 5MB" + }, + "PLBmDT": { + "defaultMessage": "登入密碼", + "description": "src/views/Me/Settings/Settings/Password/index.tsx" }, "Pp/0po": { "defaultMessage": "換一批" }, + "PtV68+": { + "defaultMessage": "郵件地址或密碼錯誤", + "description": "USER_EMAIL_NOT_FOUND" + }, "Q8Qw5B": { "defaultMessage": "描述" }, @@ -589,12 +871,16 @@ "defaultMessage": "你的修訂作品發布失敗", "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx" }, + "QXJQ5G": { + "defaultMessage": "授權信息已失效,請重新登入", + "description": "TOKEN_INVALID" + }, "QZXKhG": { "defaultMessage": "設置圍爐網址(創建後不可修改)", "description": "src/components/Forms/CreateCircleForm/Init.tsx" }, "R7yHDl": { - "defaultMessage": "Circle Revenue", + "defaultMessage": "圍爐營收", "description": "src/components/Transaction/index.tsx" }, "RFzVUD": { @@ -605,10 +891,22 @@ "defaultMessage": "已封存", "description": "src/components/ArticleDigest/Archive/index.tsx" }, + "ROPCC0": { + "defaultMessage": "請先綁定郵箱", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/Email.tsx" + }, + "Ro0CuW": { + "defaultMessage": "你尚無權限進行該操作", + "description": "FORBIDDEN" + }, "RxiHr/": { "defaultMessage": "還沒有任何用戶回覆你的邀請喔!", "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx" }, + "S/hoJx": { + "defaultMessage": "用戶不存在", + "description": "USER_NOT_FOUND" + }, "S8PcQf": { "defaultMessage": "取消代表作", "description": "src/components/ArticleDigest/DropdownActions/PinButton.tsx" @@ -631,6 +929,14 @@ "Szd1tH": { "defaultMessage": "登出失敗,請重試" }, + "SzrjpI": { + "defaultMessage": "作品正文編輯距離超出上限", + "description": "ARTICLE_REVISION_CONTENT_INVALID" + }, + "T2kMnM": { + "defaultMessage": "每個帳號只允許創建一個圍爐", + "description": "CIRCLE_CREATION_REACH_LIMIT" + }, "T73SwS": { "defaultMessage": "訂閱", "description": "src/views/Me/Transactions/index.tsx" @@ -638,6 +944,9 @@ "T9oZC8": { "defaultMessage": "確認要刪除該選集「{collection}」嗎?" }, + "TF1OhT": { + "defaultMessage": "臨時密碼已過期,請嘗試重新發送" + }, "TSDiqB": { "defaultMessage": "付費人數", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -649,10 +958,6 @@ "TzhzIH": { "defaultMessage": "創作者" }, - "U/Tqmx": { - "defaultMessage": "評論了你收藏的作品 ", - "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx" - }, "U7o9Ba": { "defaultMessage": "累計閱讀時數" }, @@ -667,6 +972,9 @@ "defaultMessage": "作品已移出", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, + "Ub+AGc": { + "defaultMessage": "登入" + }, "Udp4Bm": { "defaultMessage": "移至底部", "description": "src/components/ArticleDigest/DropdownActions/SetBottomCollectionButton.tsx" @@ -675,9 +983,13 @@ "defaultMessage": "作品已添加標籤", "description": "src/views/TagDetail/DropdownActions/index.tsx" }, + "V5OMr4": { + "defaultMessage": "什麼是數字錢包?", + "description": "src/components/Forms/SelectAuthMethodForm/WalletFeed.tsx" + }, "V8msLJ": { - "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx", - "defaultMessage": "在你的圍爐中留言並提及你" + "defaultMessage": "在你的圍爐中留言並提及你", + "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, "VZsE96": { "defaultMessage": "選集名稱" @@ -700,9 +1012,21 @@ "VzzYJk": { "defaultMessage": "新建" }, + "W0sZaX": { + "defaultMessage": "最近 3 個月", + "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" + }, + "W66Eyq": { + "defaultMessage": "密碼需至少 8 位,支持字母、數字及符號的組合。", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" + }, "W8OZ3G": { "defaultMessage": "確認刪除" }, + "WDZndZ": { + "defaultMessage": "請在錢包中完成簽名", + "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + }, "WQT8ZA": { "defaultMessage": "編輯選集" }, @@ -710,6 +1034,10 @@ "defaultMessage": "添加到精選", "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx" }, + "Wg0ZvI": { + "defaultMessage": "作品被收藏", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "WpvsPu": { "defaultMessage": "訂閱", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" @@ -737,15 +1065,31 @@ "XVYrS/": { "defaultMessage": "還沒有追蹤者" }, + "XYUhx0": { + "defaultMessage": "解綁 {type}", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, "Xd0J7Y": { "defaultMessage": "開放社區" }, + "XdLnXf": { + "defaultMessage": "錢包餘額不足", + "description": "PAYMENT_BALANCE_INSUFFICIENT" + }, + "XfRKZY": { + "defaultMessage": "去綁定", + "description": "src/components/Dialogs/BindEmailHintDialog/index.tsx" + }, "XgdZSb": { "defaultMessage": "值得關注" }, "Xi40U9": { "defaultMessage": "操作無法撤銷,確認刪除選集嗎?" }, + "XmnzQT": { + "defaultMessage": "一個標籤最多僅可有 4 名協作者共同管理", + "description": "TAG_EDITORS_REACH_LIMIT" + }, "XuYhBC": { "defaultMessage": "代表作已設置" }, @@ -757,12 +1101,16 @@ "defaultMessage": "在你的圍爐中留言", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, - "YUtHE9": { - "defaultMessage": "將你的作品 {articleTitle} 在 {tag} 中選為精华", - "description": "src/components/Notice/ArticleTagNotice/ArticleTagAddedNotice.tsx" + "Y7N/Jg": { + "defaultMessage": "圖片邊長不得超過 12,000 像素" }, - "YjNkcK": { - "defaultMessage": "若要變更地址,請直接操作錢包切換" + "YPMn9n": { + "defaultMessage": "請先登入再進行操作", + "description": "UNAUTHENTICATED" + }, + "YUXRsM": { + "defaultMessage": "已封鎖用戶", + "description": "src/views/Me/Settings/Blocked/index.tsx" }, "YlPCRU": { "defaultMessage": "關聯了", @@ -780,9 +1128,6 @@ "defaultMessage": "修訂", "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx" }, - "ZjDH42": { - "defaultMessage": "關於我們" - }, "a/YQ1Z": { "defaultMessage": "作品已封存", "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx" @@ -798,6 +1143,10 @@ "defaultMessage": " 中的發言", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, + "aacIz8": { + "defaultMessage": "電子郵件", + "description": "src/views/Me/Settings/Settings/Email/index.tsx" + }, "adThp5": { "defaultMessage": "最新" }, @@ -805,14 +1154,6 @@ "defaultMessage": "進行中…", "description": "src/components/Transaction/State/index.tsx" }, - "b+LSgI": { - "defaultMessage": "回覆了你在圍爐 ", - "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" - }, - "b3onWZ": { - "defaultMessage": "最近 {days} 天", - "description": "src/views/Me/Analytics/SelectPeriod/index.tsx" - }, "b6zdPs": { "defaultMessage": "{count} 篇文章", "description": "src/components/Book/index.tsx" @@ -828,6 +1169,10 @@ "beLe/F": { "defaultMessage": "廣播" }, + "c/z318": { + "defaultMessage": "郵件地址或密碼錯誤", + "description": "src/components/Forms/EmailLoginForm/index.tsx" + }, "cAP9g5": { "defaultMessage": "將你的評論在 {commentArticle} 中置頂", "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx" @@ -835,16 +1180,16 @@ "cE4Hfw": { "defaultMessage": "發現" }, - "cd/II9": { - "defaultMessage": "{totalCount, plural, =1 {篇文章} other {篇文章}}" + "cQYXjl": { + "defaultMessage": "匯率幣別", + "description": "src/views/Me/Settings/Misc/Currency/index.tsx" }, - "cf37Zy": { - "defaultMessage": "添加 IPFS 生成的 IPNS 指紋到閱讀器,如:", - "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" + "cYvIpp": { + "defaultMessage": "無需重複訂閱此圍爐", + "description": "DUPLICATE_CIRCLE_SUBSCRIPTION" }, - "cfL5uk": { - "defaultMessage": "已超過 200 字,目前 {numbers} 字", - "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx" + "cd/II9": { + "defaultMessage": "{totalCount, plural, =1 {篇文章} other {篇文章}}" }, "cg1VJ2": { "defaultMessage": "連接加密錢包" @@ -853,13 +1198,37 @@ "defaultMessage": "由於你尚未發布任何作品,這裡還沒有任何數據能與你分享哦!發布第一篇作品來介紹你自己,以此開啟你的創作之旅吧!", "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" }, + "ctl5tq": { + "defaultMessage": "新作品", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "cufo9X": { + "defaultMessage": "已達到單日支付上限(5000 HKD)", + "description": "PAYMENT_REACH_MAXIMUM_LIMIT" + }, "cyR7Kh": { "defaultMessage": "返回" }, + "d1mBsg": { + "defaultMessage": "追蹤的圍爐", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "d4waan": { "defaultMessage": "營收", "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" }, + "dAvP6d": { + "defaultMessage": "尚無封鎖紀錄", + "description": "src/views/Me/Settings/Blocked/SettingsBlocked.tsx" + }, + "dSjI7E": { + "defaultMessage": "暫無法斷開錢包連結,因為你沒有其他可用於登錄的身份(電子郵件/數字錢包/社交帳號)。", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, + "dVbKzB": { + "defaultMessage": "作品或評論提及我", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, "deEeEI": { "defaultMessage": "註冊" }, @@ -869,13 +1238,9 @@ "djJp6c": { "defaultMessage": "我的足跡" }, - "dnsfmR": { - "defaultMessage": ",我們會儘快回覆!", - "description": "src/views/Help/index.tsx" - }, - "eJ131z": { - "defaultMessage": "辭去了 {tag} 的主理人", - "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx" + "dzF4ci": { + "defaultMessage": "重新發送", + "description": "src/components/Forms/EmailLoginForm/index.tsx" }, "eTpiYa": { "defaultMessage": "尚無支持數據" @@ -907,17 +1272,33 @@ "defaultMessage": "你的修訂作品 {articleTitle} 已發布到分佈式網絡", "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx" }, + "gW/KWu": { + "defaultMessage": "評論被精選", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "ggS9L7": { + "defaultMessage": "支付金額無效,請重新輸入", + "description": "PAYMENT_AMOUNT_INVALID" + }, "h+punE": { "defaultMessage": "{date}更新", "description": "src/views/User/CollectionDetail/Content.tsx" }, + "h7sMQs": { + "defaultMessage": "新追蹤者", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "h9A6AT": { + "defaultMessage": "為確保帳號安全,修改郵件地址將{resetHint},你可在驗證郵箱後再次設定密碼。", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, "h9CG9E": { "defaultMessage": "{commentType}已刪除", "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx" }, - "hWs95P": { - "defaultMessage": "重要訊息將透過郵件通知,請填入信箱完成設定。", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "hASeng": { + "defaultMessage": "已封鎖用戶", + "description": "src/views/Me/Settings/Misc/BlockedUsers.tsx" }, "hYG5fb": { "defaultMessage": "人追蹤", @@ -927,17 +1308,9 @@ "defaultMessage": "追蹤了你的圍爐", "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx" }, - "hrfF+i": { - "defaultMessage": "剛接觸加密錢包?參考 ", - "description": "src/components/Forms/WalletAuthForm/Select.tsx" - }, "hrgo+E": { "defaultMessage": "封存" }, - "iCFXtS": { - "defaultMessage": "歡迎未註冊或已啟用錢包登入的朋友使用", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" - }, "ieGrWo": { "defaultMessage": "追蹤" }, @@ -948,20 +1321,21 @@ "itPgxd": { "defaultMessage": "個人主頁" }, + "iu3XKs": { + "defaultMessage": "錢包已解綁", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, "izWS4J": { "defaultMessage": "取消追蹤" }, + "jBx/nm": { + "defaultMessage": "電子郵件註冊", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "jJ1Brc": { "defaultMessage": "喜歡回應", "description": "src/components/Comment/DropdownActions/PinButton.tsx" }, - "jL2ZHb": { - "defaultMessage": "驗證碼有效期 20 分鐘" - }, - "jgLiba": { - "defaultMessage": "請輸入驗證碼", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" - }, "jkrM1r": { "defaultMessage": "打開 IPNS 頁面", "description": "src/components/UserProfile/WalletLabel/index.tsx" @@ -980,15 +1354,44 @@ "k97/u7": { "defaultMessage": "添加作品" }, + "kPylKK": { + "defaultMessage": "圍爐", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "kS3vTS": { + "defaultMessage": "Liker ID", + "description": "src/views/Me/Settings/Misc/LikerID.tsx" + }, "kc79d3": { "defaultMessage": "找你想看的" }, + "kf5NAv": { + "defaultMessage": "可使用英文、數字及下劃線", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, "kkZioy": { "defaultMessage": "確認移出", "description": "src/components/Dialogs/RemoveArticleCollectionDialog/index.tsx" }, - "lD4FPZ": { - "defaultMessage": "請輸入電子信箱" + "l/f7bu": { + "defaultMessage": "想了解更多?詳見 ", + "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx" + }, + "l0/EvT": { + "defaultMessage": "最後一步:设置 Matters ID", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, + "l02bPO": { + "defaultMessage": "作品被關聯", + "description": "src/views/Me/Settings/Notifications/GeneralSettings/index.tsx" + }, + "l9LpDx": { + "defaultMessage": "{q} - Matters 搜尋", + "description": "src/views/Search/AggregateResults/Articles.tsx" + }, + "lI2l2/": { + "defaultMessage": "驗證碼不正確,請檢查輸入內容或重新發送", + "description": "CODE_INVALID" }, "lIir/P": { "defaultMessage": "我知道了" @@ -1005,12 +1408,16 @@ "defaultMessage": "熱門" }, "m/Wg7b": { - "defaultMessage": "Circle Description", + "defaultMessage": "圍爐描述", "description": "src/components/Forms/CreateCircleForm/Profile.tsx" }, "m4GG4b": { "defaultMessage": "刪除選集" }, + "m4KtjK": { + "defaultMessage": "新訂閱者", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "mCAIcg": { "defaultMessage": "站內閱讀熱門排行", "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx" @@ -1040,6 +1447,26 @@ "ml3SZN": { "defaultMessage": "至少 8 個字元,支持英文大小寫字母、數字和特殊符號" }, + "mp9SBo": { + "defaultMessage": "圍爐通知", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "mu01Gw": { + "defaultMessage": "驗證碼已失效,請使用最新驗證碼或重新發送", + "description": "CODE_INACTIVE" + }, + "n2Sc6g": { + "defaultMessage": "個人資料", + "description": "src/views/Me/Settings/Settings/MyProfile/index.tsx" + }, + "n3shsQ": { + "defaultMessage": "名稱不正確", + "description": "NAME_INVALID" + }, + "n6ZdqD": { + "defaultMessage": "圍爐名稱已被使用", + "description": "DUPLICATE_CIRCLE" + }, "nGBrvw": { "defaultMessage": "我的收藏" }, @@ -1047,13 +1474,17 @@ "defaultMessage": "在", "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx" }, - "nYeDrI": { - "defaultMessage": "沒有帳戶?", - "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" - }, "nYrKWp": { "defaultMessage": "編輯個人資料" }, + "no7l8z": { + "defaultMessage": "解綁錢包", + "description": "src/components/Dialogs/RemoveWalletLoginDialog/Content.tsx" + }, + "nozN+j": { + "defaultMessage": "電子信箱不正確", + "description": "USER_EMAIL_INVALID" + }, "o2Na0B": { "defaultMessage": "返回全部" }, @@ -1061,6 +1492,10 @@ "defaultMessage": "{articleCount} 篇文章", "description": "src/components/CollectionDigest/Feed/index.tsx" }, + "ohbnFU": { + "defaultMessage": "社交登入", + "description": "src/views/Me/Settings/Settings/index.tsx" + }, "ohgTH4": { "defaultMessage": "追蹤中", "description": "src/components/UserProfile/index.tsx" @@ -1069,16 +1504,17 @@ "defaultMessage": "讚賞了", "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx" }, - "pCcbaC": { - "defaultMessage": "將你的作品 {articleTitle} 從 {tag} 中移除", - "description": "src/components/Notice/ArticleTagNotice/ArticleTagRemovedNotice.tsx" + "pHg5Ju": { + "defaultMessage": "登入密碼已設定", + "description": "src/components/Dialogs/SetPasswordDialog/Content.tsx" }, "pRV+UD": { "defaultMessage": "闔上", "description": "src/components/Comment/DropdownActions/CollapseComment/Button.tsx" }, - "pwlQEY": { - "defaultMessage": "姓名" + "pjunBi": { + "defaultMessage": "導入作品累計超過 1MB", + "description": "MIGRATION_REACH_LIMIT" }, "pzTOmv": { "defaultMessage": "追蹤者" @@ -1090,6 +1526,10 @@ "q9oMKE": { "defaultMessage": "圍爐名稱" }, + "qNuRmA": { + "defaultMessage": "發送臨時密碼", + "description": "src/components/Forms/EmailLoginForm/Buttons.tsx" + }, "qYzBk8": { "defaultMessage": "退訂了你的圍爐", "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx" @@ -1102,13 +1542,14 @@ "defaultMessage": "移除作品", "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx" }, - "qswU4E": { - "defaultMessage": "信箱將不作為登入使用,僅作為聯繫渠道" - }, "r66dXx": { "defaultMessage": "在 {circleName} 的廣播留言中提及你", "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx" }, + "rADhX5": { + "defaultMessage": "不可用", + "description": "FORBIDDEN_BY_STATE" + }, "rBjwQy": { "defaultMessage": "微博", "description": "src/components/Share/Buttons/Weibo.tsx" @@ -1119,6 +1560,10 @@ "rXnmeE": { "defaultMessage": "確認發送" }, + "rZyVay": { + "defaultMessage": "驗證碼已過期,請重新發送", + "description": "CODE_EXPIRED" + }, "rbrahO": { "defaultMessage": "關閉" }, @@ -1129,6 +1574,10 @@ "rfz/fN": { "defaultMessage": "建議尺寸 1600 x 900 像素" }, + "rqS2aA": { + "defaultMessage": "請登入該帳戶解綁錢包後再試", + "description": "src/components/AuthMethodFeed/AuthWalletFeed.tsx" + }, "s5JCCO": { "defaultMessage": "此文已被{actor}標示為限制級內容,是否確定展開全文?", "description": "src/views/ArticleDetail/Wall/Sensitive/index.tsx" @@ -1137,6 +1586,10 @@ "defaultMessage": "本月營收", "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx" }, + "sg3nVO": { + "defaultMessage": "郵箱已被使用,請前往登入或嘗試另一個", + "description": "USER_EMAIL_EXISTS" + }, "skbUBl": { "defaultMessage": "登入", "description": "src/components/Buttons/Login/index.tsx" @@ -1146,36 +1599,41 @@ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx" }, "sy+pv5": { - "defaultMessage": "電子郵箱" + "defaultMessage": "郵件地址" }, - "t8/r8X": { - "defaultMessage": "連接加密錢包", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" + "tBt9u0": { + "defaultMessage": "登入", + "description": "src/components/Forms/EmailLoginForm/index.tsx" }, "tEeEJT": { "defaultMessage": "你的作品 {articleTitle} 已發布到分佈式網絡", "description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx" }, + "tQ3+Xo": { + "defaultMessage": "標籤添加最多至 5 個", + "description": "TOO_MANY_TAGS_FOR_ARTICLE" + }, + "tQimre": { + "defaultMessage": "前往首頁", + "description": "src/views/Callback/GoogleCallback.tsx" + }, "tzq2+W": { "defaultMessage": "寄出邀請", "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx" }, + "u+cgOo": { + "defaultMessage": "我的圍爐", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, "u5aHb4": { "defaultMessage": "複製連結" }, "uJkv2X": { "defaultMessage": "編輯標籤" }, - "uVCg1l": { - "defaultMessage": "玩轉 Matters 實用指南" - }, "ub1kHa": { "defaultMessage": "加入選集" }, - "uclzDH": { - "defaultMessage": "{q}: {totalCount, plural, =0 {} other {# 條結果}} - Matters 搜尋", - "description": "src/views/Search/AggregateResults/Articles.tsx" - }, "ui1+QC": { "defaultMessage": "已顯示所有結果" }, @@ -1193,19 +1651,43 @@ "defaultMessage": "帳戶", "description": "src/components/Forms/WalletAuthForm/Select.tsx" }, + "v8dGSd": { + "defaultMessage": "該錢包已關聯至其他帳號", + "description": "CRYPTO_WALLET_EXISTS" + }, "vAc1Bw": { "defaultMessage": "封鎖用戶" }, + "vCt85u": { + "defaultMessage": "剛接觸加密錢包?參考 ", + "description": "src/components/Forms/WalletAuthForm/Select.tsx" + }, "vH8sCb": { "defaultMessage": "我的圍爐" }, + "vJd1we": { + "defaultMessage": "評論不存在", + "description": "COMMENT_NOT_FOUND" + }, "vLEnrs": { "defaultMessage": "支持了", "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx" }, + "viMrzF": { + "defaultMessage": "廣播", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "vsD2wm": { + "defaultMessage": "重置你的登入密碼", + "description": "src/components/Dialogs/SetEmailDialog/Content.tsx" + }, "wCgTu5": { "defaultMessage": "評論" }, + "wDX7zn": { + "defaultMessage": "草稿不存在", + "description": "DRAFT_NOT_FOUND" + }, "wEQDC6": { "defaultMessage": "編輯資料" }, @@ -1213,19 +1695,31 @@ "defaultMessage": "在 {circleName} 中留言提及你", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, - "wSEOxH": { - "defaultMessage": "聯繫渠道", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "wK4kLf": { + "defaultMessage": "註冊", + "description": "src/components/Forms/EmailSignUpForm/Init.tsx" + }, + "wMNZJa": { + "defaultMessage": "通知不存在", + "description": "NOTICE_NOT_FOUND" }, "wXzTZ0": { "defaultMessage": "给围炉取一个吸引人的名字吧" }, + "wbIHgJ": { + "defaultMessage": "臨時密碼已通過郵件發送", + "description": "src/components/Forms/EmailLoginForm/OtherOptions.tsx" + }, "wbcwKd": { "defaultMessage": "查看全部" }, - "xGh9O7": { - "defaultMessage": "提醒:信箱將不作為登入使用,僅作為聯繫渠道", - "description": "src/components/Forms/WalletAuthForm/Connect.tsx" + "wm9xNB": { + "defaultMessage": "{type} 已解綁", + "description": "src/components/Dialogs/RemoveSocialLoginDialog/Content.tsx" + }, + "x7O1/5": { + "defaultMessage": "ID 已被使用,請修改後再試", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" }, "xMaFCO": { "defaultMessage": "閱讀", @@ -1239,9 +1733,13 @@ "defaultMessage": "{follower, plural, =1 {人} other {人}}", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, - "xiKjd/": { - "defaultMessage": "使用電子信箱", - "description": "src/components/Forms/SelectAuthMethodForm/index.tsx" + "xafreT": { + "defaultMessage": "留言", + "description": "src/views/Me/Settings/Notifications/Circle/index.tsx" + }, + "xjHiYx": { + "defaultMessage": "作品修訂次數超出上限", + "description": "ARTICLE_REVISION_REACH_LIMIT" }, "xkr+zo": { "defaultMessage": "協議" @@ -1249,10 +1747,18 @@ "xmcVZ0": { "defaultMessage": "搜尋" }, + "xxDjET": { + "defaultMessage": "名稱不正確", + "description": "DISPLAYNAME_INVALID" + }, "y0b6Kp": { "defaultMessage": "付費", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" }, + "y4Lyf1": { + "defaultMessage": "該名稱已被其他使用者使用", + "description": "NAME_EXISTS" + }, "yBUiiy": { "defaultMessage": "操作無法撤銷,確認封存嗎?" }, @@ -1272,6 +1778,14 @@ "defaultMessage": "添加精選", "description": "src/views/TagDetail/DropdownActions/index.tsx" }, + "ySSF/a": { + "defaultMessage": "爲了保障馬特市市民的身份安全,我們升級了管理設定。請確認您的 Matters ID(確認後不可再次修改)", + "description": "src/components/Dialogs/SetUserNameDialog/Content.tsx" + }, + "yToCTn": { + "defaultMessage": "網路錯誤,請刷新頁面", + "description": "NETWORK_ERROR" + }, "yZfKI4": { "defaultMessage": " 众聊提及你", "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx" @@ -1280,10 +1794,22 @@ "defaultMessage": "退款", "description": "src/components/Transaction/index.tsx" }, + "z+a1SW": { + "defaultMessage": "設定", + "description": "src/views/Me/Settings/Notifications/index.tsx" + }, + "zAK5G+": { + "defaultMessage": "登入連結已發送至 {email}", + "description": "src/components/Forms/Verification/LinkSent.tsx" + }, "zKOr2x": { "defaultMessage": "已追蹤用戶佔總觀看人數比例", "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx" }, + "zOZ77e": { + "defaultMessage": "用戶協議及隱私條款", + "description": "src/components/Forms/SelectAuthMethodForm/NormalFeed.tsx" + }, "zQvVDJ": { "defaultMessage": "全部" }, @@ -1294,6 +1820,10 @@ "defaultMessage": "在 {circleName} 中留言", "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx" }, + "zvNfwL": { + "defaultMessage": "操作過於頻繁,請稍候重試", + "description": "ACTION_LIMIT_EXCEEDED" + }, "zxlwbc": { "defaultMessage": "等候寫入完成...", "description": "src/components/Dialogs/RssFeedDialog/Content.tsx" @@ -1302,4 +1832,5 @@ "defaultMessage": "{subscriber, plural, =1 {人} other {人}}", "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx" } -} \ No newline at end of file +} + diff --git a/package-lock.json b/package-lock.json index 5a41a9501f..314d54bff6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "matters-web", - "version": "4.25.0", + "version": "4.26.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "matters-web", - "version": "4.25.0", + "version": "4.26.2", "license": "Apache-2.0", "dependencies": { "@apollo/react-common": "^3.1.3", @@ -15,7 +15,7 @@ "@artsy/fresnel": "^6.1.0", "@ensdomains/content-hash": "^2.5.7", "@matters/apollo-upload-client": "^11.1.0", - "@matters/matters-editor": "^0.2.0", + "@matters/matters-editor": "^0.2.2", "@next/bundle-analyzer": "^13.4.9", "@reach/alert": "^0.18.0", "@reach/dialog": "^0.18.0", @@ -37,7 +37,6 @@ "apollo-link-ws": "^1.0.20", "apollo-utilities": "^1.3.4", "autosize": "^6.0.1", - "babel-plugin-formatjs": "^10.5.3", "classnames": "^2.3.2", "colorthief": "^2.4.0", "d3-array": "^2.12.1", @@ -139,9 +138,10 @@ "babel-polyfill": "^6.26.0", "css-has-pseudo": "^6.0.0", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.44.0", + "eslint": "^8.47.0", "eslint-config-next": "^13.4.9", "eslint-config-prettier": "^8.8.0", + "eslint-plugin-formatjs": "^4.10.3", "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-storybook": "^0.6.12", "file-loader": "^6.2.0", @@ -1278,6 +1278,7 @@ "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2415,9 +2416,9 @@ } }, "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4062,18 +4063,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -4133,9 +4134,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4184,9 +4185,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4971,6 +4972,7 @@ "version": "3.13.3", "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.3.tgz", "integrity": "sha512-W6+huH4dLYx8eZfZue6fcreNzLZHoPboreqJSkickYCKIOicI35zC0Txb4xCT6kau/DXAKTpNEln3V2NgX6Igg==", + "dev": true, "dependencies": { "@formatjs/icu-messageformat-parser": "2.6.0", "@types/json-stable-stringify": "^1.0.32", @@ -4993,6 +4995,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5007,6 +5010,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5022,6 +5026,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5032,12 +5037,14 @@ "node_modules/@formatjs/ts-transformer/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@formatjs/ts-transformer/node_modules/tslib": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true }, "node_modules/@foundry-rs/easy-foundryup": { "version": "0.1.3", @@ -6918,9 +6925,9 @@ } }, "node_modules/@matters/matters-editor": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@matters/matters-editor/-/matters-editor-0.2.0.tgz", - "integrity": "sha512-BivnuI27bP9E7HnDaZ8p5AmasTutigDl6MShqEihB+N/tsL2fHStplQaJE86Y9dorFCNhyJovRaPa+xv8xsH0Q==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@matters/matters-editor/-/matters-editor-0.2.2.tgz", + "integrity": "sha512-tFECZghLH4yvtFz+OM2jqdRQdVMWrfxYsHtEzoXGf8Vypz82YYUbWT62wKN6hdNS7XF94QxPk8zrJfO0vRi7KQ==", "dependencies": { "@tiptap/core": "2.1.0-rc.9", "@tiptap/extension-blockquote": "2.1.0-rc.9", @@ -10100,9 +10107,9 @@ } }, "node_modules/@storybook/manager-api/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -10394,9 +10401,9 @@ } }, "node_modules/@storybook/nextjs/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -12327,6 +12334,7 @@ "version": "7.20.0", "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.0.tgz", "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -12339,22 +12347,16 @@ "version": "7.6.4", "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz", "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, - "node_modules/@types/babel__helper-plugin-utils": { - "version": "7.10.0", - "resolved": "https://registry.npmmirror.com/@types/babel__helper-plugin-utils/-/babel__helper-plugin-utils-7.10.0.tgz", - "integrity": "sha512-60YtHzhQ9HAkToHVV+TB4VLzBn9lrfgrsOjiJMtbv/c1jPdekBxaByd6DMsGBzROXWoIL6U3lEFvvbu69RkUoA==", - "dependencies": { - "@types/babel__core": "*" - } - }, "node_modules/@types/babel__template": { "version": "7.4.1", "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz", "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -12364,6 +12366,7 @@ "version": "7.18.3", "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, "dependencies": { "@babel/types": "^7.3.0" } @@ -12872,7 +12875,8 @@ "node_modules/@types/json-stable-stringify": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz", - "integrity": "sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==" + "integrity": "sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -13002,6 +13006,12 @@ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" }, + "node_modules/@types/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==", + "dev": true + }, "node_modules/@types/pretty-hrtime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", @@ -13584,9 +13594,9 @@ "dev": true }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -13722,9 +13732,9 @@ "dev": true }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -15889,29 +15899,6 @@ "object.assign": "^4.1.0" } }, - "node_modules/babel-plugin-formatjs": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-formatjs/-/babel-plugin-formatjs-10.5.3.tgz", - "integrity": "sha512-PBeryWyN2HY2VUGNFPQS6+DPNQ/I9zDZ97y38i1+LzIpIyTHBePECq/ehEABE73PvvF2irFiN7TCYBrQQw5+lA==", - "dependencies": { - "@babel/core": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "7", - "@babel/traverse": "7", - "@babel/types": "^7.12.11", - "@formatjs/icu-messageformat-parser": "2.6.0", - "@formatjs/ts-transformer": "3.13.3", - "@types/babel__core": "^7.1.7", - "@types/babel__helper-plugin-utils": "^7.10.0", - "@types/babel__traverse": "^7.1.7", - "tslib": "^2.4.0" - } - }, - "node_modules/babel-plugin-formatjs/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -18211,9 +18198,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -18720,9 +18707,9 @@ } }, "node_modules/cypress/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -19925,9 +19912,9 @@ } }, "node_modules/download/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -20467,27 +20454,27 @@ } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -20497,7 +20484,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -20509,7 +20495,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -20696,6 +20681,153 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/eslint-plugin-formatjs": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-4.10.3.tgz", + "integrity": "sha512-EHKuEMCmWhAiMdCc8oZU8qBAvnvHPUiJuhGxPqA+GX2Nb7GBsGm2o616KYnSSffDisK+v0E9TDCrS8oJ0QLgcw==", + "dev": true, + "dependencies": { + "@formatjs/icu-messageformat-parser": "2.6.0", + "@formatjs/ts-transformer": "3.13.3", + "@types/eslint": "7 || 8", + "@types/picomatch": "^2.3.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "emoji-regex": "^10.2.1", + "magic-string": "^0.30.0", + "picomatch": "^2.3.1", + "tslib": "2.5.0", + "typescript": "^4.7 || 5", + "unicode-emoji-utils": "^1.1.1" + }, + "peerDependencies": { + "eslint": "7 || 8" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/emoji-regex": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "dev": true + }, + "node_modules/eslint-plugin-formatjs/node_modules/magic-string": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", + "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint-plugin-formatjs/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/eslint-plugin-import": { "version": "2.26.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", @@ -20921,9 +21053,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -21033,9 +21165,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -21176,9 +21308,9 @@ } }, "node_modules/espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", @@ -26595,6 +26727,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "dev": true, "dependencies": { "jsonify": "^0.0.1" }, @@ -26652,6 +26785,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -26710,9 +26844,9 @@ "dev": true }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -29520,9 +29654,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -31340,9 +31474,9 @@ } }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -32973,16 +33107,6 @@ "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, - "node_modules/react-markdown/node_modules/remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, "node_modules/react-markdown/node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", @@ -34546,9 +34670,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -36991,6 +37115,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -37108,6 +37233,21 @@ "node": ">=4" } }, + "node_modules/unicode-emoji-utils": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unicode-emoji-utils/-/unicode-emoji-utils-1.1.2.tgz", + "integrity": "sha512-b0fe4T08DjwayBPvKtG+tKyNMwx/Qdc50EZJhOJlGDwqU24DaxNrHMT8Kl75hVmLabrXC6TQ+CuMEVV163z1eQ==", + "dev": true, + "dependencies": { + "emoji-regex": "10.2.1" + } + }, + "node_modules/unicode-emoji-utils/node_modules/emoji-regex": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "dev": true + }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", @@ -39757,6 +39897,7 @@ "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -40523,9 +40664,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -41443,15 +41584,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -41493,9 +41634,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -41531,9 +41672,9 @@ } }, "@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true }, "@fal-works/esbuild-plugin-global-externals": { @@ -42285,6 +42426,7 @@ "version": "3.13.3", "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.3.tgz", "integrity": "sha512-W6+huH4dLYx8eZfZue6fcreNzLZHoPboreqJSkickYCKIOicI35zC0Txb4xCT6kau/DXAKTpNEln3V2NgX6Igg==", + "dev": true, "requires": { "@formatjs/icu-messageformat-parser": "2.6.0", "@types/json-stable-stringify": "^1.0.32", @@ -42299,6 +42441,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -42307,6 +42450,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -42316,6 +42460,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -42323,12 +42468,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "tslib": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true } } }, @@ -43909,9 +44056,9 @@ } }, "@matters/matters-editor": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@matters/matters-editor/-/matters-editor-0.2.0.tgz", - "integrity": "sha512-BivnuI27bP9E7HnDaZ8p5AmasTutigDl6MShqEihB+N/tsL2fHStplQaJE86Y9dorFCNhyJovRaPa+xv8xsH0Q==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@matters/matters-editor/-/matters-editor-0.2.2.tgz", + "integrity": "sha512-tFECZghLH4yvtFz+OM2jqdRQdVMWrfxYsHtEzoXGf8Vypz82YYUbWT62wKN6hdNS7XF94QxPk8zrJfO0vRi7KQ==", "requires": { "@tiptap/core": "2.1.0-rc.9", "@tiptap/extension-blockquote": "2.1.0-rc.9", @@ -46233,9 +46380,9 @@ }, "dependencies": { "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -46404,9 +46551,9 @@ } }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -47641,6 +47788,7 @@ "version": "7.20.0", "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.0.tgz", "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, "requires": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -47653,22 +47801,16 @@ "version": "7.6.4", "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz", "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, "requires": { "@babel/types": "^7.0.0" } }, - "@types/babel__helper-plugin-utils": { - "version": "7.10.0", - "resolved": "https://registry.npmmirror.com/@types/babel__helper-plugin-utils/-/babel__helper-plugin-utils-7.10.0.tgz", - "integrity": "sha512-60YtHzhQ9HAkToHVV+TB4VLzBn9lrfgrsOjiJMtbv/c1jPdekBxaByd6DMsGBzROXWoIL6U3lEFvvbu69RkUoA==", - "requires": { - "@types/babel__core": "*" - } - }, "@types/babel__template": { "version": "7.4.1", "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz", "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -47678,6 +47820,7 @@ "version": "7.18.3", "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, "requires": { "@babel/types": "^7.3.0" } @@ -48185,7 +48328,8 @@ "@types/json-stable-stringify": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz", - "integrity": "sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==" + "integrity": "sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==", + "dev": true }, "@types/json5": { "version": "0.0.29", @@ -48315,6 +48459,12 @@ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" }, + "@types/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==", + "dev": true + }, "@types/pretty-hrtime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", @@ -48821,9 +48971,9 @@ "dev": true }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -48904,9 +49054,9 @@ "dev": true }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -50552,31 +50702,6 @@ "object.assign": "^4.1.0" } }, - "babel-plugin-formatjs": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-formatjs/-/babel-plugin-formatjs-10.5.3.tgz", - "integrity": "sha512-PBeryWyN2HY2VUGNFPQS6+DPNQ/I9zDZ97y38i1+LzIpIyTHBePECq/ehEABE73PvvF2irFiN7TCYBrQQw5+lA==", - "requires": { - "@babel/core": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "7", - "@babel/traverse": "7", - "@babel/types": "^7.12.11", - "@formatjs/icu-messageformat-parser": "2.6.0", - "@formatjs/ts-transformer": "3.13.3", - "@types/babel__core": "^7.1.7", - "@types/babel__helper-plugin-utils": "^7.10.0", - "@types/babel__traverse": "^7.1.7", - "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - } - } - }, "babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -52393,9 +52518,9 @@ } }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -52752,9 +52877,9 @@ } }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -53709,9 +53834,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -54173,27 +54298,27 @@ } }, "eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -54203,7 +54328,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -54215,7 +54339,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -54287,9 +54410,9 @@ "dev": true }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -54510,6 +54633,109 @@ } } }, + "eslint-plugin-formatjs": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-4.10.3.tgz", + "integrity": "sha512-EHKuEMCmWhAiMdCc8oZU8qBAvnvHPUiJuhGxPqA+GX2Nb7GBsGm2o616KYnSSffDisK+v0E9TDCrS8oJ0QLgcw==", + "dev": true, + "requires": { + "@formatjs/icu-messageformat-parser": "2.6.0", + "@formatjs/ts-transformer": "3.13.3", + "@types/eslint": "7 || 8", + "@types/picomatch": "^2.3.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "emoji-regex": "^10.2.1", + "magic-string": "^0.30.0", + "picomatch": "^2.3.1", + "tslib": "2.5.0", + "typescript": "^4.7 || 5", + "unicode-emoji-utils": "^1.1.1" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "emoji-regex": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "dev": true + }, + "magic-string": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", + "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, "eslint-plugin-import": { "version": "2.26.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", @@ -54689,15 +54915,15 @@ } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { "acorn": "^8.9.0", @@ -58815,6 +59041,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "dev": true, "requires": { "jsonify": "^0.0.1" } @@ -58857,7 +59084,8 @@ "jsonify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==" + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true }, "jsonparse": { "version": "1.3.1", @@ -58897,9 +59125,9 @@ "dev": true }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -61125,9 +61353,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -62388,9 +62616,9 @@ } }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -63581,16 +63809,6 @@ "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, - "remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, "space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", @@ -64784,9 +65002,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, "send": { "version": "0.18.0", @@ -66653,7 +66871,8 @@ "typescript": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true }, "ua-parser-js": { "version": "0.7.35", @@ -66733,6 +66952,23 @@ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, + "unicode-emoji-utils": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unicode-emoji-utils/-/unicode-emoji-utils-1.1.2.tgz", + "integrity": "sha512-b0fe4T08DjwayBPvKtG+tKyNMwx/Qdc50EZJhOJlGDwqU24DaxNrHMT8Kl75hVmLabrXC6TQ+CuMEVV163z1eQ==", + "dev": true, + "requires": { + "emoji-regex": "10.2.1" + }, + "dependencies": { + "emoji-regex": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "dev": true + } + } + }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", diff --git a/package.json b/package.json index 1225aca0a0..e5aed1b42b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matters-web", - "version": "4.26.1", + "version": "4.26.2", "description": "codebase of Matters' website", "sideEffects": false, "author": "Matters ", @@ -41,7 +41,7 @@ "@artsy/fresnel": "^6.1.0", "@ensdomains/content-hash": "^2.5.7", "@matters/apollo-upload-client": "^11.1.0", - "@matters/matters-editor": "^0.2.0", + "@matters/matters-editor": "^0.2.2", "@next/bundle-analyzer": "^13.4.9", "@reach/alert": "^0.18.0", "@reach/dialog": "^0.18.0", @@ -63,7 +63,6 @@ "apollo-link-ws": "^1.0.20", "apollo-utilities": "^1.3.4", "autosize": "^6.0.1", - "babel-plugin-formatjs": "^10.5.3", "classnames": "^2.3.2", "colorthief": "^2.4.0", "d3-array": "^2.12.1", @@ -165,9 +164,10 @@ "babel-polyfill": "^6.26.0", "css-has-pseudo": "^6.0.0", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.44.0", + "eslint": "^8.47.0", "eslint-config-next": "^13.4.9", "eslint-config-prettier": "^8.8.0", + "eslint-plugin-formatjs": "^4.10.3", "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-storybook": "^0.6.12", "file-loader": "^6.2.0", diff --git a/public/static/favicon-128x128.png b/public/static/favicon-128x128.png new file mode 100644 index 0000000000..0045691799 Binary files /dev/null and b/public/static/favicon-128x128.png differ diff --git a/public/static/icons/16px/copy.svg b/public/static/icons/16px/copy.svg index 6b2e06f9a0..f59ac3b1f7 100644 --- a/public/static/icons/16px/copy.svg +++ b/public/static/icons/16px/copy.svg @@ -1,4 +1,3 @@ - - - + + diff --git a/public/static/icons/16px/external-link.svg b/public/static/icons/16px/external-link.svg index 9f49631360..707176e3d4 100644 --- a/public/static/icons/16px/external-link.svg +++ b/public/static/icons/16px/external-link.svg @@ -1,5 +1,3 @@ - - - - + + diff --git a/public/static/icons/20px/arrow-right.svg b/public/static/icons/20px/arrow-right.svg new file mode 100644 index 0000000000..246034ccad --- /dev/null +++ b/public/static/icons/20px/arrow-right.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/static/icons/20px/left.svg b/public/static/icons/20px/left.svg new file mode 100644 index 0000000000..6d3b8c19b8 --- /dev/null +++ b/public/static/icons/20px/left.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/static/icons/22px/facebook.svg b/public/static/icons/22px/facebook.svg new file mode 100644 index 0000000000..9b8b53bb98 --- /dev/null +++ b/public/static/icons/22px/facebook.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/static/icons/22px/google.svg b/public/static/icons/22px/google.svg new file mode 100644 index 0000000000..8628f33200 --- /dev/null +++ b/public/static/icons/22px/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/static/icons/22px/mail.svg b/public/static/icons/22px/mail.svg new file mode 100644 index 0000000000..1404c37f6f --- /dev/null +++ b/public/static/icons/22px/mail.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/static/icons/22px/metamask.svg b/public/static/icons/22px/metamask.svg new file mode 100644 index 0000000000..ea16510d56 --- /dev/null +++ b/public/static/icons/22px/metamask.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/icons/22px/spinner.svg b/public/static/icons/22px/spinner.svg new file mode 100644 index 0000000000..5d8822c8cb --- /dev/null +++ b/public/static/icons/22px/spinner.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/static/icons/22px/wallet-connect.svg b/public/static/icons/22px/wallet-connect.svg new file mode 100644 index 0000000000..24bb38d109 --- /dev/null +++ b/public/static/icons/22px/wallet-connect.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/static/icons/22px/x.svg b/public/static/icons/22px/x.svg new file mode 100644 index 0000000000..ed7d5a8b71 --- /dev/null +++ b/public/static/icons/22px/x.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/static/images/callback/Illustation.svg b/public/static/images/callback/Illustation.svg new file mode 100644 index 0000000000..e4ce646a1d --- /dev/null +++ b/public/static/images/callback/Illustation.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/callback/logo.svg b/public/static/images/callback/logo.svg new file mode 100644 index 0000000000..a4106dcf27 --- /dev/null +++ b/public/static/images/callback/logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/matters.svg b/public/static/images/matters.svg new file mode 100644 index 0000000000..7d5ded50ca --- /dev/null +++ b/public/static/images/matters.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/common/enums/csp.ts b/src/common/enums/csp.ts index 998fe7e903..6826220da5 100644 --- a/src/common/enums/csp.ts +++ b/src/common/enums/csp.ts @@ -1,3 +1,4 @@ +const isProd = process.env.NEXT_PUBLIC_RUNTIME_ENV === 'production' const site_domain_tld = process.env.NEXT_PUBLIC_SITE_DOMAIN_TLD || 'matters.town', site_domain_tld_old = @@ -18,6 +19,9 @@ const SCRIPT_SRC = [ 'www.google.com/recaptcha/', 'www.gstatic.com/recaptcha/', + // Turnstile + 'challenges.cloudflare.com', + // Programmable Google Search 'cse.google.com', 'www.google.com/cse/', @@ -67,6 +71,13 @@ const IMG_SRC = [ site_domain_tld_old ), + // For image validation + // @see {@url src/common/utils/form/image.tsx} + 'blob:', + `*.${site_domain_tld}`, + isProd ? undefined : 'localhost', + isProd ? undefined : '127.0.0.1', + // Alchemy NFT CDN 'nft-cdn.alchemy.com', @@ -102,6 +113,9 @@ const CONNECT_SRC = [ site_domain_tld_old ), + // Cloudflare Image Upload + 'upload.imagedelivery.net', + // Sentry '*.ingest.sentry.io', @@ -158,6 +172,9 @@ const FRAME_SRC = [ 'www.google.com/recaptcha/', 'recaptcha.google.com/recaptcha/', + // Turnstile + 'challenges.cloudflare.com', + // Stripe 'js.stripe.com', 'hooks.stripe.com', diff --git a/src/common/enums/errorCode.ts b/src/common/enums/errorCode.ts index cf4c5bf2c3..60d3885552 100644 --- a/src/common/enums/errorCode.ts +++ b/src/common/enums/errorCode.ts @@ -1,91 +1,78 @@ -export type ErrorCodeKeys = keyof typeof ERROR_CODES - -export const ERROR_CODES = { +export enum ERROR_CODES { // Common - UNKNOWN_ERROR: 'UNKNOWN_ERROR', - NETWORK_ERROR: 'NETWORK_ERROR', - INTERNAL_SERVER_ERROR: 'INTERNAL_SERVER_ERROR', - BAD_USER_INPUT: 'BAD_USER_INPUT', + UNKNOWN_ERROR = 'UNKNOWN_ERROR', + NETWORK_ERROR = 'NETWORK_ERROR', + INTERNAL_SERVER_ERROR = 'INTERNAL_SERVER_ERROR', + BAD_USER_INPUT = 'BAD_USER_INPUT', - ACTION_LIMIT_EXCEEDED: 'ACTION_LIMIT_EXCEEDED', - ACTION_FAILED: 'ACTION_FAILED', + ACTION_LIMIT_EXCEEDED = 'ACTION_LIMIT_EXCEEDED', + ACTION_FAILED = 'ACTION_FAILED', - UNABLE_TO_UPLOAD_FROM_URL: 'UNABLE_TO_UPLOAD_FROM_URL', + UNABLE_TO_UPLOAD_FROM_URL = 'UNABLE_TO_UPLOAD_FROM_URL', - NAME_INVALID: 'NAME_INVALID', - NAME_EXISTS: 'NAME_EXISTS', - DISPLAYNAME_INVALID: 'DISPLAYNAME_INVALID', + NAME_INVALID = 'NAME_INVALID', + NAME_EXISTS = 'NAME_EXISTS', + DISPLAYNAME_INVALID = 'DISPLAYNAME_INVALID', // Auth - UNAUTHENTICATED: 'UNAUTHENTICATED', - FORBIDDEN: 'FORBIDDEN', - FORBIDDEN_BY_STATE: 'FORBIDDEN_BY_STATE', - FORBIDDEN_BY_TARGET_STATE: 'FORBIDDEN_BY_TARGET_STATE', - TOKEN_INVALID: 'TOKEN_INVALID', - RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED', + UNAUTHENTICATED = 'UNAUTHENTICATED', + FORBIDDEN = 'FORBIDDEN', + FORBIDDEN_BY_STATE = 'FORBIDDEN_BY_STATE', + FORBIDDEN_BY_TARGET_STATE = 'FORBIDDEN_BY_TARGET_STATE', + TOKEN_INVALID = 'TOKEN_INVALID', // Entity - ENTITY_NOT_FOUND: 'ENTITY_NOT_FOUND', - USER_NOT_FOUND: 'USER_NOT_FOUND', - ARTICLE_NOT_FOUND: 'ARTICLE_NOT_FOUND', - COMMENT_NOT_FOUND: 'COMMENT_NOT_FOUND', - DRAFT_NOT_FOUND: 'DRAFT_NOT_FOUND', - // AUDIO_DRAFT_NOT_FOUND: 'AUDIO_DRAFT_NOT_FOUND', - TAG_NOT_FOUND: 'TAG_NOT_FOUND', - NOTICE_NOT_FOUND: 'NOTICE_NOT_FOUND', - ASSET_NOT_FOUND: 'ASSET_NOT_FOUND', - CIRCLE_NOT_FOUND: 'CIRCLE_NOT_FOUND', + ENTITY_NOT_FOUND = 'ENTITY_NOT_FOUND', + USER_NOT_FOUND = 'USER_NOT_FOUND', + COMMENT_NOT_FOUND = 'COMMENT_NOT_FOUND', + ARTICLE_NOT_FOUND = 'ARTICLE_NOT_FOUND', + ASSET_NOT_FOUND = 'ASSET_NOT_FOUND', + DRAFT_NOT_FOUND = 'DRAFT_NOT_FOUND', + TAG_NOT_FOUND = 'TAG_NOT_FOUND', + NOTICE_NOT_FOUND = 'NOTICE_NOT_FOUND', + CIRCLE_NOT_FOUND = 'CIRCLE_NOT_FOUND', // Article - // NOT_ENOUGH_MAT: 'NOT_ENOUGH_MAT', - ARTICLE_REVISION_CONTENT_INVALID: 'ARTICLE_REVISION_CONTENT_INVALID', - ARTICLE_REVISION_REACH_LIMIT: 'ARTICLE_REVISION_REACH_LIMIT', + ARTICLE_REVISION_CONTENT_INVALID = 'ARTICLE_REVISION_CONTENT_INVALID', + ARTICLE_REVISION_REACH_LIMIT = 'ARTICLE_REVISION_REACH_LIMIT', // User - USER_EMAIL_INVALID: 'USER_EMAIL_INVALID', - USER_EMAIL_EXISTS: 'USER_EMAIL_EXISTS', - USER_EMAIL_NOT_FOUND: 'USER_EMAIL_NOT_FOUND', - USER_PASSWORD_INVALID: 'USER_PASSWORD_INVALID', - USER_PASSWORD_NOT_AVAILABLE: 'USER_PASSWORD_NOT_AVAILABLE', + USER_EMAIL_INVALID = 'USER_EMAIL_INVALID', + USER_EMAIL_EXISTS = 'USER_EMAIL_EXISTS', + USER_EMAIL_NOT_FOUND = 'USER_EMAIL_NOT_FOUND', + USER_PASSWORD_INVALID = 'USER_PASSWORD_INVALID', + CRYPTO_WALLET_EXISTS = 'CRYPTO_WALLET_EXISTS', + USER_SOCIAL_ACCOUNT_EXISTS = 'USER_SOCIAL_ACCOUNT_EXISTS', // Tag - DUPLICATE_TAG: 'DUPLICATE_TAG', - TOO_MANY_TAGS_FOR_ARTICLE: 'TOO_MANY_TAGS_FOR_ARTICLE', - NOT_ALLOW_ADD_TAG: 'NOT_ALLOW_ADD_TAG', - NOT_ALLOW_ADD_OFFICIAL_TAG: 'NOT_ALLOW_ADD_OFFICIAL_TAG', - TAG_EDITORS_REACH_LIMIT: 'TAG_EDITORS_REACH_LIMIT', + DUPLICATE_TAG = 'DUPLICATE_TAG', + TOO_MANY_TAGS_FOR_ARTICLE = 'TOO_MANY_TAGS_FOR_ARTICLE', + TAG_EDITORS_REACH_LIMIT = 'TAG_EDITORS_REACH_LIMIT', // Circle - CIRCLE_CREATION_REACH_LIMIT: 'CIRCLE_CREATION_REACH_LIMIT', - DUPLICATE_CIRCLE: 'DUPLICATE_CIRCLE', - DUPLICATE_CIRCLE_SUBSCRIPTION: 'DUPLICATE_CIRCLE_SUBSCRIPTION', + CIRCLE_CREATION_REACH_LIMIT = 'CIRCLE_CREATION_REACH_LIMIT', + DUPLICATE_CIRCLE = 'DUPLICATE_CIRCLE', + DUPLICATE_CIRCLE_SUBSCRIPTION = 'DUPLICATE_CIRCLE_SUBSCRIPTION', // Verification Code - CODE_INVALID: 'CODE_INVALID', - CODE_INACTIVE: 'CODE_INACTIVE', - CODE_EXPIRED: 'CODE_EXPIRED', - - // GQL - QUERY_FIELD_NOT_FOUND: 'QUERY_FIELD_NOT_FOUND', + CODE_INVALID = 'CODE_INVALID', + CODE_INACTIVE = 'CODE_INACTIVE', + CODE_EXPIRED = 'CODE_EXPIRED', // LikeCoin - LIKER_NOT_FOUND: 'LIKER_NOT_FOUND', - LIKER_EMAIL_EXISTS: 'LIKER_EMAIL_EXISTS', - LIKER_USER_ID_EXISTS: 'LIKER_USER_ID_EXISTS', + LIKER_EMAIL_EXISTS = 'LIKER_EMAIL_EXISTS', + LIKER_USER_ID_EXISTS = 'LIKER_USER_ID_EXISTS', // OAuth - OAUTH_TOKEN_INVALID: 'OAUTH_TOKEN_INVALID', + OAUTH_TOKEN_INVALID = 'OAUTH_TOKEN_INVALID', // Migration - MIGRATION_REACH_LIMIT: 'MIGRATION_REACH_LIMIT', + MIGRATION_REACH_LIMIT = 'MIGRATION_REACH_LIMIT', // Payment - PAYMENT_AMOUNT_TOO_SMALL: 'PAYMENT_AMOUNT_TOO_SMALL', - PAYMENT_AMOUNT_INVALID: 'PAYMENT_AMOUNT_INVALID', - PAYMENT_BALANCE_INSUFFICIENT: 'PAYMENT_BALANCE_INSUFFICIENT', - NOTICE_PAYMENT_PAYOUT_ACCOUNT_EXISTS: 'NOTICE_PAYMENT_PAYOUT_ACCOUNT_EXISTS', - PAYMENT_PASSWORD_NOT_SET: 'PAYMENT_PASSWORD_NOT_SET', - NOTICE_PAYMENT_PAYOUT_TRANSACTION_EXISTS: - 'NOTICE_PAYMENT_PAYOUT_TRANSACTION_EXISTS', - PAYMENT_REACH_MAXIMUM_LIMIT: 'PAYMENT_REACH_MAXIMUM_LIMIT', + PAYMENT_AMOUNT_TOO_SMALL = 'PAYMENT_AMOUNT_TOO_SMALL', + PAYMENT_AMOUNT_INVALID = 'PAYMENT_AMOUNT_INVALID', + PAYMENT_BALANCE_INSUFFICIENT = 'PAYMENT_BALANCE_INSUFFICIENT', + PAYMENT_PASSWORD_NOT_SET = 'PAYMENT_PASSWORD_NOT_SET', + PAYMENT_REACH_MAXIMUM_LIMIT = 'PAYMENT_REACH_MAXIMUM_LIMIT', } diff --git a/src/common/enums/events.ts b/src/common/enums/events.ts index a1d1d9588a..dfefae6d55 100644 --- a/src/common/enums/events.ts +++ b/src/common/enums/events.ts @@ -19,10 +19,11 @@ export const REFETCH_DONATORS = 'refetchDonators' export const OPEN_UNIVERSAL_AUTH_DIALOG = 'openUniversalAuthDialog' export const CLOSE_ACTIVE_DIALOG = 'closeActiveDialog' export const OPEN_LIKE_COIN_DIALOG = 'openLikeCoinDialog' -export const CLOSE_ONBOARDING_TASKS_DIALOG = 'closeOnboardingTasksDialog' -export const OPEN_RECOMMEND_AUTHOR_DIALOG = 'openRecommendAuthorDialog' -export const OPEN_RECOMMEND_TAG_DIALOG = 'openRecommendTagDialog' export const OPEN_SUBSCRIBE_CIRCLE_DIALOG = 'openSubscribeCircleDialog' +export const OPEN_SET_USER_NAME_DIALOG = 'openSetUserNameDialog' + +// Toast +export const TOAST_SEND_EMAIL_VERIFICATION = 'toastSendEmailVerification' export enum UNIVERSAL_AUTH_SOURCE { enter = 'enter', @@ -38,8 +39,5 @@ export enum UNIVERSAL_AUTH_SOURCE { support = 'support', } -// Onboarding Tasks -export const ONBOARDING_TASKS_HIDE = 'onboardingTasksHide' - // Support export const SUPPORT_SUCCESS_ANIMATION = 'supportSuccessAnimation' diff --git a/src/common/enums/externalLinks.ts b/src/common/enums/externalLinks.ts index 2a2bd67175..aeecade1a7 100644 --- a/src/common/enums/externalLinks.ts +++ b/src/common/enums/externalLinks.ts @@ -4,6 +4,7 @@ export const EXTERNAL_LINKS = { FACEBOOK: 'https://www.facebook.com/MattersLab2018', WEIBO: 'https://weibo.com/6695370718/profile?topnav=1&wvr=6', TELEGRAM: 'https://t.me/joinchat/BXzlWUhXaWNZ-TXJZJCzDQ', + LIKECOIN_LEGACY: 'https://like.co/in?legacy=1', CIVIC_LIKER_SUPPORT: 'https://docs.like.co/v/zh/user-guide/civic-liker?utm_source=Matters&utm_medium=website', CIVIC_LIKER_JOIN: isProd diff --git a/src/common/enums/file.ts b/src/common/enums/file.ts index adc42aabee..704a7799db 100644 --- a/src/common/enums/file.ts +++ b/src/common/enums/file.ts @@ -1,4 +1,7 @@ -export const UPLOAD_IMAGE_SIZE_LIMIT: number = 5 * 1024 * 1024 +export const UPLOAD_IMAGE_SIZE_LIMIT: number = 5 * 1024 * 1024 // 5MB +export const UPLOAD_IMAGE_DIMENSION_LIMIT: number = 12e3 // 12,000 pixels +export const UPLOAD_IMAGE_AREA_LIMIT: number = 10e3 * 10e3 // 100 megapixels +export const UPLOAD_IMAGE_METADATA_SIZE_LIMIT: number = 1024 // 1024 bytes export const UPLOAD_AUDIO_SIZE_LIMIT: number = 100 * 1024 * 1024 diff --git a/src/common/enums/index.ts b/src/common/enums/index.ts index c37a349486..d3bc65215a 100644 --- a/src/common/enums/index.ts +++ b/src/common/enums/index.ts @@ -56,7 +56,7 @@ export const MAX_ARTICLE_SUPPORT_LENGTH = 140 export const MAX_ARTICLE_REVISION_COUNT = 4 export const MAX_ARTICLE_REVISION_DIFF = 50 export const MAX_ARTICLE_TAG_LENGTH = 3 -export const MAX_ARTICLE_COLLECT_LENGTH = 7 +export const MAX_ARTICLE_COLLECT_LENGTH = 3 export const MAX_TAG_CONTENT_LENGTH = 50 export const MAX_TAG_DESCRIPTION_LENGTH = 200 @@ -77,3 +77,7 @@ export const MAX_DESCRIPTION_LENGTH = 200 export const MIN_USER_DISPLAY_NAME_LENGTH = 2 export const MAX_USER_DISPLAY_NAME_LENGTH = 20 export const MAX_USER_DESCRIPTION_LENGTH = 140 +export const MIN_USER_NAME_LENGTH = 4 +export const MAX_USER_NAME_LENGTH = 15 + +export const MAX_CHANGE_EMAIL_TIME_DAILY = 3 diff --git a/src/common/enums/oauth.ts b/src/common/enums/oauth.ts index 4faf185721..344d976d00 100644 --- a/src/common/enums/oauth.ts +++ b/src/common/enums/oauth.ts @@ -306,3 +306,38 @@ export const OAUTH_SCOPE_TREE = { }, }, } + +export const OAUTH_STORAGE_STATE = 'oauth-storage-state' +export const OAUTH_STORAGE_NONCE = 'oauth-storage-nonce' +export const OAUTH_STORAGE_PATH = 'oauth-storage-path' +export const OAUTH_STORAGE_CODE_VERIFIER = 'oauth-storage-code-verifier' +export const OAUTH_STORAGE_BIND_RESULT = 'oauth-storage-result' +export const OAUTH_STORAGE_BIND_STATE = 'oauth-storage-bind-state' +export const OAUTH_STORAGE_BIND_STATE_SUCCESS = 'oauth-storage-state-success' +export const OAUTH_STORAGE_BIND_STATE_FAILURE = 'oauth-storage-state-failure' +export const OAUTH_STORAGE_BIND_STATE_UNAVAILABLE = + 'oauth-storage-state-unavailable' +export const OAUTH_STORAGE_SEND_EMAIL_CODE_COUNTDOWN = + 'oauth-storage-send-email-code-countdown' + +export const CALLBACK_VERIFIER = { + EmailVerification: 'email-verification', + EmailSignup: 'email-signup', + EmailSignin: 'email-signin', +} + +export const OAUTH_CALLBACK_PROVIDERS = { + Google: 'google', + Facebook: 'facebook', + Twitter: 'twitter', +} + +export const CALLBACK_PROVIDERS = { + ...OAUTH_CALLBACK_PROVIDERS, + ...CALLBACK_VERIFIER, +} + +export const OAUTH_TYPE = { + login: 'lg', + bind: 'bd', +} diff --git a/src/common/enums/route.ts b/src/common/enums/route.ts index 0124d99e11..903eb16e85 100644 --- a/src/common/enums/route.ts +++ b/src/common/enums/route.ts @@ -43,15 +43,12 @@ type ROUTE_KEY = | 'ME_WALLET' | 'ME_WALLET_TRANSACTIONS' | 'ME_SETTINGS' - | 'ME_SETTINGS_CHANGE_USERNAME' - | 'ME_SETTINGS_CHANGE_EMAIL' - | 'ME_SETTINGS_CHANGE_PASSWORD' - | 'ME_SETTINGS_NOTIFICATION' + | 'ME_SETTINGS_NOTIFICATIONS' + | 'ME_SETTINGS_MISC' | 'ME_SETTINGS_BLOCKED' - | 'ME_SETTINGS_CONNECT_WALLET' + | 'ME_DRAFT_NEW' | 'ME_DRAFT_DETAIL' - | 'ME_SETTINGS_NOTIFICATION_GENERAL' - | 'ME_SETTINGS_NOTIFICATION_CIRCLE' + | 'ME_SETTINGS_NOTIFICATIONS_CIRCLE' // Form | 'LOGIN' | 'SIGNUP' @@ -62,8 +59,8 @@ type ROUTE_KEY = | 'OAUTH_CALLBACK_FAILURE' | 'PAY_CALLBACK_SUCCESS' | 'PAY_CALLBACK_FAILURE' + | 'CALLBACK_PROVIDER' // Misc - | 'HELP' | 'MIGRATION' | 'ABOUT' | 'GUIDE' @@ -120,9 +117,9 @@ export const ROUTES: { { key: 'LOGIN', pathname: '/login' }, { key: 'SIGNUP', pathname: '/signup' }, { key: 'FORGET', pathname: '/forget' }, + { key: 'CALLBACK_PROVIDER', pathname: '/callback/[provider]' }, // Misc - { key: 'HELP', pathname: '/help' }, { key: 'MIGRATION', pathname: '/migration' }, { key: 'ABOUT', pathname: '/about' }, { key: 'GUIDE', pathname: '/guide' }, @@ -146,31 +143,19 @@ export const ROUTES: { // Settings { key: 'ME_SETTINGS', pathname: '/me/settings' }, + { key: 'ME_SETTINGS_NOTIFICATIONS', pathname: '/me/settings/notifications' }, { - key: 'ME_SETTINGS_CHANGE_USERNAME', - pathname: '/me/settings/change-username', + key: 'ME_SETTINGS_NOTIFICATIONS_CIRCLE', + pathname: '/me/settings/notifications/circle', }, - { key: 'ME_SETTINGS_CHANGE_EMAIL', pathname: '/me/settings/change-email' }, { - key: 'ME_SETTINGS_CHANGE_PASSWORD', - pathname: '/me/settings/change-password', - }, - { key: 'ME_SETTINGS_NOTIFICATION', pathname: '/me/settings/notification' }, - { - key: 'ME_SETTINGS_NOTIFICATION_GENERAL', - pathname: '/me/settings/notification-general', - }, - { - key: 'ME_SETTINGS_NOTIFICATION_CIRCLE', - pathname: '/me/settings/notification-circle', + key: 'ME_SETTINGS_MISC', + pathname: '/me/settings/misc', }, { key: 'ME_SETTINGS_BLOCKED', pathname: '/me/settings/blocked' }, - { - key: 'ME_SETTINGS_CONNECT_WALLET', - pathname: '/me/settings/connect-wallet', - }, // Draft + { key: 'ME_DRAFT_NEW', pathname: '/me/drafts/new' }, { key: 'ME_DRAFT_DETAIL', pathname: '/me/drafts/[draftId]' }, // OAuth diff --git a/src/common/enums/storage.ts b/src/common/enums/storage.ts index 3956af7f30..fb77948602 100644 --- a/src/common/enums/storage.ts +++ b/src/common/enums/storage.ts @@ -2,8 +2,6 @@ export const STORAGE_KEY_PUSH = '__PUSH' export const STORAGE_KEY_AGENT_HASH = '__AGENT_HASH' -export const STORAGE_KEY_ONBOARDING_TASKS = '__ONBOARDING_TASKS' - export const STORAGE_KEY_CIRCLE_BANNER = '__CIRCLE_BANNER' export const STORAGE_KEY_SEARCH_HISTORY = '__SEARCH_HISTORY' diff --git a/src/common/enums/text.ts b/src/common/enums/text.ts index 6b1bf3210d..e4b823056b 100644 --- a/src/common/enums/text.ts +++ b/src/common/enums/text.ts @@ -6,8 +6,6 @@ export const TEXT = { accountArchived: '已註銷用戶', accountBanned: '已禁言用戶', accountFrozen: '已凍結用戶', - ACTION_FAILED: '操作失敗,請稍候重試', - ACTION_LIMIT_EXCEEDED: '操作過於頻繁,請稍候重試', addArticles: '添加作品', addArticleTag: '添加作品', addCircleInvitation: '新增邀請', @@ -27,20 +25,15 @@ export const TEXT = { allTopics: '熱議廣場', likesReceived: '讚賞我的', likesSent: '我讚賞的', - ARTICLE_NOT_FOUND: '作品不存在', - ARTICLE_REVISION_CONTENT_INVALID: '作品正文編輯距離超出上限', - ARTICLE_REVISION_REACH_LIMIT: '作品修訂次數超出上限', article: '作品', articles: '作品', articleBanned: '作品因違反社區約章被封存', articleFingerprint: '作品指紋', articleManagement: '作品管理', articleResponse: '回應設置', - ASSET_NOT_FOUND: '資源不存在', back: '返回', backToDiscover: '返回發現', backToAll: '返回全部', - BAD_USER_INPUT: '出錯了,請檢查你輸入的內容', basicProfile: '基本資料', bindIPNStoENS: '關聯 ENS', block: '封鎖', @@ -53,20 +46,14 @@ export const TEXT = { changeEmail: '修改電子信箱', changePassword: '修改密碼', changeUserName: '修改 Matters ID', - CIRCLE_NOT_FOUND: '圍爐不存在', circleAnalytics: '數據後台', circleBroadcast: '廣播', circleCreated: '圍爐創建成功', circleCreation: '創建圍爐', - CIRCLE_CREATION_REACH_LIMIT: '無法創建:目前每個帳號只允許創建一個圍爐', circleDiscussion: '衆聊', clear: '清空', close: '關閉', - CODE_EXPIRED: '驗證碼已過期,請重新發送', - CODE_INACTIVE: '驗證碼已失效,請使用最新驗證碼或重新發送', - CODE_INVALID: '驗證碼不正確,請檢查輸入內容或重新發送', collectedOnly: '只看衍生作品', - COMMENT_NOT_FOUND: '評論不存在', community: '社區共建基地', confirm: '確認', confirmPush: '確認開啟', @@ -87,17 +74,12 @@ export const TEXT = { disableResponsesHint: '不允許讀者回應本文(可通過修訂打開回應功能)', disagree: '我不同意', discover: '發現', - DISPLAYNAME_INVALID: '名稱不正確', displayName: '姓名', donation: '支持作者', donationAgain: '再次支持', done: '完成', downloadApp: '下載應用', - DRAFT_NOT_FOUND: '草稿不存在', draft: '草稿', - DUPLICATE_CIRCLE: '圍爐名稱已被使用', - DUPLICATE_CIRCLE_SUBSCRIPTION: '無法重複訂閱此圍爐', - DUPLICATE_TAG: '標籤名稱已被使用', edit: '編輯', editArticle: '修訂作品', editCircle: '編輯圍爐', @@ -120,14 +102,10 @@ export const TEXT = { enterUserName: '請輸入新的 Matters ID', enterUserNameAgain: '請再次輸入新的 Matters ID', enterVerificationCode: '請輸入驗證碼', - ENTITY_NOT_FOUND: '實體不存在', expand: '展開', extend: '關聯', collectArticle: '關聯作品', failureChange: '修改失敗,請稍候重試', - failureCommentBlocked: '因爲作者設置,你無法參與討論。', - failureCommentOnboarding: - '當你獲得 15 次讚賞或積極閱讀作品,即可獲得評論相關權限', failureCopy: '複製失敗', failureLogout: '登出失敗,請重試', failureDonation: '支持失敗', @@ -141,9 +119,6 @@ export const TEXT = { follower: '追蹤者', following: '追蹤中', followingMe: '追蹤我的', - FORBIDDEN_BY_STATE: '你無權限進行該操作', - FORBIDDEN_BY_TARGET_STATE: '你無法對此對象進行該操作', - FORBIDDEN: '你尚無權限進行該操作', forgetPassword: '忘記密碼', forgetPaymentPassword: '忘記交易密碼', frequentSearch: '熱門搜尋', @@ -175,8 +150,7 @@ export const TEXT = { hkd: '港幣', hottest: '熱門', hottestArticles: '熱門作品', - INTERNAL_SERVER_ERROR: '伺服器錯誤,請稍候重試', - invalidEmail: '電子信箱格式有誤', + invalidEmail: '請填寫有效郵件地址', invalidUserName: 'Matters ID 不一致', IPFSEntrance: '分佈式入口', joinCivicLiker: '成為讚賞公民,每月贊助創作者', @@ -188,9 +162,6 @@ export const TEXT = { linkEns: '關聯 ENS 名後,可以', linkEnsBenefit1: '獲得個性化 IPNS 頁連結,如:ipfs.io/ipns/matty.eth', linkEnsBenefit2: '直接使用 ENS 名在閱讀器(如 Planet)中訂閱文章', - LIKER_EMAIL_EXISTS: 'Liker ID 電子信箱已被其他人使用', - LIKER_NOT_FOUND: 'Liker ID 不存在', - LIKER_USER_ID_EXISTS: 'Liker ID 已被其他人使用', logbook: '航行日誌', logbook2LaunchText: 'Logbook 2.0 剛剛推出。如果你是 Traveloggers 的所有者,且尚未領取,你可以從新的日誌頁面領取:', @@ -206,7 +177,6 @@ export const TEXT = { manageCircle: '管理圍爐', manageCircleInvitation: '邀請管理', members: '成員', - MIGRATION_REACH_LIMIT: '導入作品累計超過 1 MB', migration: '搬家到 Matters', migrationSideBar: '一鍵搬家', month: '月', @@ -221,19 +191,11 @@ export const TEXT = { myProfile: '個人主頁', myWallet: '我的錢包', myAnalytics: '數據後台', - NAME_EXISTS: '該名稱已被其他使用者使用', - NAME_INVALID: '名稱不正確', - NETWORK_ERROR: '網路錯誤,請用力刷新', newPassword: '新密碼', nextStep: '下一步', - NOT_ALLOW_ADD_TAG: '無法添加', - NOT_ALLOW_ADD_OFFICIAL_TAG: '無法添加官方標籤', - // NOT_ENOUGH_MAT: '沒有足夠的 MAT 以讚賞', - NOTICE_NOT_FOUND: '通知不存在', noArticlesYet: '尚未發布作品', noTagsUsageYet: '還沒有使用標簽創作', notifications: '通知', - OAUTH_TOKEN_INVALID: '授權信息已失效,請重新登入', oauthAuthorize: '應用授權', openCommunity: '開放社區', password: '密碼', @@ -241,13 +203,6 @@ export const TEXT = { passwordHint: '至少 8 個字元,支持英文大小寫字母、數字和特殊符號', passwordNotMatch: '密碼不一致', pay: '支付', - PAYMENT_AMOUNT_INVALID: '支付金額無效,請重新輸入', - PAYMENT_AMOUNT_TOO_SMALL: '支付金額太少,請重新輸入', - PAYMENT_BALANCE_INSUFFICIENT: '錢包餘額不足', - PAYMENT_PASSWORD_NOT_SET: '請先設定交易密碼', - NOTICE_PAYMENT_PAYOUT_ACCOUNT_EXISTS: '已有提現帳戶', - NOTICE_PAYMENT_PAYOUT_TRANSACTION_EXISTS: '已有一筆提現交易進行中', - PAYMENT_REACH_MAXIMUM_LIMIT: '已達到單日支付上限', paymentPassword: '交易密碼', paymentPayout: '提現', paymentPayoutComplete: '提現流程已啟動', @@ -267,8 +222,6 @@ export const TEXT = { publishToISCNHint_2: ' 用以出版 Writing NFT,費用 ≈1 LIKE,推廣期由平台補助', putComment: '發布評論', - QUERY_FIELD_NOT_FOUND: '要查詢的數據不存在', - RATE_LIMIT_EXCEEDED: '操作過於頻繁,請稍候重試', readCount: '閱讀次數', readHistory: '瀏覽記錄', readTime: '累計閱讀時數', @@ -344,9 +297,6 @@ export const TEXT = { analyticsNoArticle: '由於你尚未發布任何作品,這裡還沒有任何數據能與你分享哦!發布第一篇作品來介紹你自己,以此開啟你的創作之旅吧!', analyticsNoSupporter: '尚無支持數據', - TAG_EDITORS_REACH_LIMIT: '一個標籤最多僅可有 4 名協作者共同管理', - TAG_NOT_FOUND: '標籤不存在', - TOO_MANY_TAGS_FOR_ARTICLE: '標籤添加最多至 5 個', tag: '標籤', tags: '標籤', tagAddArticle: '添加我的作品', @@ -361,17 +311,12 @@ export const TEXT = { termHint: '我們的用戶協議和隱私政策發生了更改,請閱讀並同意後繼續使用。', theFirstSupporter: '第一個支持了這篇作品', thinkAboutIt: '考慮一下', - TOKEN_INVALID: '登入信息已失效,請重新登入', topic: '話題', topUp: '儲值', toYourIPNSPage: '指向到你的 IPNS 頁面', - UNABLE_TO_UPLOAD_FROM_URL: - '檔案上傳失敗,請確認檔案連結是否有效,或手動下載後再上傳', - UNAUTHENTICATED: '請先登入再進行操作', unblockUser: '取消封鎖', understood: '我知道了', unfollow: '取消追蹤', - UNKNOWN_ERROR: '不知道哪裏出錯了,過幾分鐘看看', unknownAddress: '你似乎遨遊到了一個未知空間,請返回重試', unpinArticleComment: '取消精選', unpinCircleComment: '取消置頂', @@ -382,15 +327,6 @@ export const TEXT = { uploadCover: '上傳封面', useEmail: '使用電子信箱', useNewPassword: '請使用新的密碼重新登入', - USER_EMAIL_EXISTS: '電子信箱被其他人用了,換一個吧', - USER_EMAIL_INVALID: '電子信箱不正確', - USER_EMAIL_NOT_FOUND: '帳戶不正確', - USER_NOT_FOUND: '用戶不存在', - USER_PASSWORD_INVALID: '密碼不正確', - USER_PASSWORD_NOT_AVAILABLE: - '當初是否透過錢包註冊?若是的話,請直接使用加密錢包登入,信箱僅作為聯繫渠道', - CRYPTO_WALLET_EXISTS: '錢包地址已存在', - USER_ETH_ADDRESS_NOT_FOUND: '錢包地址不存在', user: '用戶', userDescription: '個人簡介', useWallet: '連接加密錢包', @@ -412,8 +348,6 @@ export const TEXT = { accountArchived: '已注销用户', accountBanned: '已禁言用户', accountFrozen: '已冻结用户', - ACTION_FAILED: '操作失败,请稍候重试', - ACTION_LIMIT_EXCEEDED: '操作过于频繁,请稍候重试', addArticles: '添加作品', addArticleTag: '添加作品', addCircleInvitation: '新增邀请', @@ -433,20 +367,15 @@ export const TEXT = { allTopics: '热议广场', likesReceived: '赞赏我的', likesSent: '我赞赏的', - ARTICLE_NOT_FOUND: '作品不存在', - ARTICLE_REVISION_CONTENT_INVALID: '作品正文编辑距离超出上限', - ARTICLE_REVISION_REACH_LIMIT: '作品修订次数超出上限', article: '作品', articles: '作品', articleBanned: '作品因违反社区约章被歸檔', articleFingerprint: '作品指纹', articleManagement: '作品管理', articleResponse: '回应设置', - ASSET_NOT_FOUND: '资源不存在', back: '返回', backToDiscover: '返回发现', backToAll: '返回全部', - BAD_USER_INPUT: '出错了,请检查你输入的内容', basicProfile: '基本资料', bindIPNStoENS: '关联 ENS', block: '屏蔽', @@ -459,20 +388,14 @@ export const TEXT = { changeEmail: '修改邮箱', changePassword: '修改密码', changeUserName: '修改 Matters ID', - CIRCLE_NOT_FOUND: '围炉不存在', circleAnalytics: '数据后台', circleBroadcast: '广播', circleCreated: '围炉创建成功', circleCreation: '创建围炉', - CIRCLE_CREATION_REACH_LIMIT: '无法创建:目前每个帐号只允许创建一个围炉', circleDiscussion: '众聊', clear: '清空', close: '关闭', - CODE_EXPIRED: '验证码已过期,请重新发送', - CODE_INACTIVE: '验证码已失效,请使用最新验证码或重新发送', - CODE_INVALID: '验证码不正确,请检查输入内容或重新发送', collectedOnly: '只看衍生作品', - COMMENT_NOT_FOUND: '评论不存在', community: '社区共建基地', confirm: '确认', confirmPush: '确认开启', @@ -493,17 +416,12 @@ export const TEXT = { disableResponsesHint: '不允许读者回应本文(可通过编辑打开回应功能)', disagree: '我不同意', discover: '发现', - DISPLAYNAME_INVALID: '名称不正确', displayName: '姓名', donation: '支持作者', donationAgain: '再次支持', done: '完成', downloadApp: '下载应用', - DRAFT_NOT_FOUND: '草稿不存在', draft: '草稿', - DUPLICATE_CIRCLE: '围炉名称已被使用', - DUPLICATE_CIRCLE_SUBSCRIPTION: '无法重复订阅此围炉', - DUPLICATE_TAG: '标签名称已被使用', edit: '编辑', editArticle: '修订作品', editCircle: '编辑围炉', @@ -526,14 +444,10 @@ export const TEXT = { enterUserName: '请输入新的 Matters ID', enterUserNameAgain: '请再次输入新的 Matters ID', enterVerificationCode: '请输入验证码', - ENTITY_NOT_FOUND: '实体不存在', expand: '展开', extend: '关联', collectArticle: '关联作品', failureChange: '修改失败,请稍候重试', - failureCommentBlocked: '因为作者设置,你无法参与讨论。', - failureCommentOnboarding: - '当你获得 15 次赞赏或积极阅读作品,即可获得评论相关权限', failureCopy: '复制失败', failureLogout: '登出失败,再来一次', failureDonation: '支持失败', @@ -547,9 +461,6 @@ export const TEXT = { follower: '追踪者', following: '追踪中', followingMe: '追踪我的', - FORBIDDEN_BY_STATE: '你无权限进行该操作', - FORBIDDEN_BY_TARGET_STATE: '你无法对此对象进行该操作', - FORBIDDEN: '你尚无权限进行该操作', forgetPassword: '忘记密码', forgetPaymentPassword: '忘记交易密码', frequentSearch: '热门搜索', @@ -581,8 +492,7 @@ export const TEXT = { hkd: '港币', hottest: '热门', hottestArticles: '热门作品', - INTERNAL_SERVER_ERROR: '服务器错误,请稍候重试', - invalidEmail: '邮箱格式有误', + invalidEmail: '请填写有效邮箱', invalidUserName: 'Matters ID 不一致', IPFSEntrance: '分布式入口', joinCivicLiker: '成为赞赏公民,每月赞助创作者', @@ -594,9 +504,6 @@ export const TEXT = { linkEns: '关联 ENS 名后,可以:', linkEnsBenefit1: '获得个性化 IPNS 页链接,如:ipfs.io/ipns/matty.eth', linkEnsBenefit2: '直接使用 ENS 名在阅读器(如 Planet)中订阅文章', - LIKER_EMAIL_EXISTS: 'Liker ID 邮箱已被其他人使用', - LIKER_NOT_FOUND: 'Liker ID 不存在', - LIKER_USER_ID_EXISTS: 'Liker ID 已被其他人使用', logbook: '航行日志', logbook2LaunchText: 'Logbook 2.0 刚刚推出。如果你是 Traveloggers 的所有者,且尚未领取,你可以从新的日志页面领取:', @@ -612,7 +519,6 @@ export const TEXT = { manageCircle: '管理围炉', manageCircleInvitation: '邀请管理', members: '成员', - MIGRATION_REACH_LIMIT: '导入作品累計超过 1 MB', migration: '搬家到 Matters', migrationSideBar: '一鍵搬家', month: '月', @@ -627,19 +533,11 @@ export const TEXT = { myProfile: '个人主页', myWallet: '我的钱包', myAnalytics: '数据后台', - NAME_EXISTS: '该名称已被其他用户使用', - NAME_INVALID: '名称不正确', - NETWORK_ERROR: '网络不给力,请用力刷新', newPassword: '新密码', nextStep: '下一步', - NOT_ALLOW_ADD_TAG: '无法添加', - NOT_ALLOW_ADD_OFFICIAL_TAG: '无法添加官方标签', - // NOT_ENOUGH_MAT: '没有足够的 MAT 以赞赏', - NOTICE_NOT_FOUND: '通知不存在', noArticlesYet: '尚未发布作品', noTagsUsageYet: '还没有使用标签创作', notifications: '通知', - OAUTH_TOKEN_INVALID: '授权信息已失效,请重新登入', oauthAuthorize: '应用授权', openCommunity: '开放社区', password: '密码', @@ -647,13 +545,6 @@ export const TEXT = { passwordHint: '至少 8 位,支持英文大小写字母、数字和特殊符号', passwordNotMatch: '密码不一致', pay: '支付', - PAYMENT_AMOUNT_INVALID: '支付金额无效,请重新输入', - PAYMENT_AMOUNT_TOO_SMALL: '支付金额太少,请重新输入', - PAYMENT_BALANCE_INSUFFICIENT: '钱包余额不足', - PAYMENT_PASSWORD_NOT_SET: '请先设定交易密码', - NOTICE_PAYMENT_PAYOUT_ACCOUNT_EXISTS: '已有提现帐户', - NOTICE_PAYMENT_PAYOUT_TRANSACTION_EXISTS: '已有一笔提现交易进行中', - PAYMENT_REACH_MAXIMUM_LIMIT: '已达到单日支付上限', paymentPassword: '交易密码', paymentPayout: '提现', paymentPayoutComplete: '提现流程已启动', @@ -673,8 +564,6 @@ export const TEXT = { publishToISCNHint_2: ' 用以出版 Writing NFT,费用 ≈1 LIKE,推广期由平台补助', putComment: '发布评论', - QUERY_FIELD_NOT_FOUND: '要查询的数据不存在', - RATE_LIMIT_EXCEEDED: '操作过于频繁,请稍候重试', readCount: '阅读次数', readHistory: '浏览记录', readTime: '累计阅读时数', @@ -750,9 +639,6 @@ export const TEXT = { analyticsNoArticle: '由于你尚未发布任何作品,这裡还没有任何数据能与你分享哦!发布第一篇作品来介绍你自己,以此开启你的创作之旅吧!', analyticsNoSupporter: '尚无支持数据', - TAG_EDITORS_REACH_LIMIT: '一个标签最多仅可有 4 名协作者共同管理', - TAG_NOT_FOUND: '标签不存在', - TOO_MANY_TAGS_FOR_ARTICLE: '标签添加最多至 5 个', tag: '标签', tags: '标签', tagAddArticle: '添加我的作品', @@ -767,17 +653,12 @@ export const TEXT = { termHint: '我们的用户协议和隐私政策发生了更改,请阅读并同意后继续使用。', theFirstSupporter: '第一个支持了这篇作品', thinkAboutIt: '考虑一下', - TOKEN_INVALID: '登入信息已失效,请重新登入', topic: '话题', topUp: '储值', toYourIPNSPage: '指向到你的 IPNS 页面', - UNABLE_TO_UPLOAD_FROM_URL: - '文件上传失败,请确认文件链接是否有效,或手动下载后再上传', - UNAUTHENTICATED: '请先登入再进行操作', unblockUser: '取消屏蔽', understood: '我知道了', unfollow: '取消追踪', - UNKNOWN_ERROR: '不知道哪里出错了,过几分钟看看', unknownAddress: '你似乎遨游到了一个未知空间,请返回重试', unpinArticleComment: '取消精选', unpinCircleComment: '取消置顶', @@ -788,15 +669,6 @@ export const TEXT = { uploadCover: '上传封面', useEmail: '使用电子邮箱', useNewPassword: '请使用新的密码重新登入', - USER_EMAIL_EXISTS: '邮箱被其他人用了,换一个吧', - USER_EMAIL_INVALID: '邮箱不正确', - USER_EMAIL_NOT_FOUND: '帐户不正确', - USER_NOT_FOUND: '用户不存在', - USER_PASSWORD_INVALID: '密码不正确', - USER_PASSWORD_NOT_AVAILABLE: - '当初是否透过钱包注册?若是的话,请直接使用加密钱包登入,信箱仅作为联系渠道', - CRYPTO_WALLET_EXISTS: '钱包地址已存在', - USER_ETH_ADDRESS_NOT_FOUND: '钱包地址不存在', user: '用户', userDescription: '个人简介', useWallet: '连接加密钱包', @@ -818,8 +690,6 @@ export const TEXT = { accountArchived: 'Account Archived', accountBanned: 'Account Banned', accountFrozen: 'Account Frozen', - ACTION_FAILED: 'Operation failed, please try again later.', - ACTION_LIMIT_EXCEEDED: 'Operation too frequent, please try again later.', addArticles: 'Add Articles', addArticleTag: 'Add articles', addCircleInvitation: 'Add Invitation', @@ -840,20 +710,15 @@ export const TEXT = { allTopics: 'Recommended Topics', likesReceived: 'Likes Received', likesSent: 'Likes Given', - ARTICLE_NOT_FOUND: 'Article not found', - ARTICLE_REVISION_CONTENT_INVALID: 'Article revision content is invalid', - ARTICLE_REVISION_REACH_LIMIT: 'Article revision count reach limit', article: 'Article', articles: 'Articles', articleBanned: 'The article has been archived due to violation of terms', articleFingerprint: 'Content Hash', articleManagement: 'Article Management', articleResponse: 'Response', - ASSET_NOT_FOUND: 'Asset not found', back: 'Back', backToDiscover: 'Back to discovery', backToAll: 'Back to All', - BAD_USER_INPUT: 'Oops. Something went wrong. Please try again later.', basicProfile: 'Profile', bindIPNStoENS: 'Link ENS', block: 'Block', @@ -866,23 +731,15 @@ export const TEXT = { changeEmail: 'Change Email', changePassword: 'Change Password', changeUserName: 'Change Matters ID', - CIRCLE_NOT_FOUND: 'Circle not found', circleAnalytics: 'Analytics', circleBroadcast: 'Broadcast', circleCreated: 'Circle successfully created', circleCreation: 'Create Circle', - CIRCLE_CREATION_REACH_LIMIT: 'Each user can only create one circle.', circleDiscussion: 'Discussion', clear: 'Clear', close: 'Cancel', - CODE_EXPIRED: 'Verification code expired, try resend', - CODE_INACTIVE: - 'Verification code is no longer valid. Please use the latest code we sent, or try resend', - CODE_INVALID: - 'Incorrect verification code. Please check your input, or try resend', collapseComment: 'Collapse response', collectedOnly: 'Articles Only', - COMMENT_NOT_FOUND: 'Response not found', commentBlocked: 'You have blocked the user.', commentCollapsed: 'Comment collapsed by author.', commentDeleted: 'Comment deleted by author.', @@ -909,17 +766,12 @@ export const TEXT = { 'Disallow readers to respond to this article (you can enable responses later by editing this article)', disagree: 'Disagree', discover: 'Discover', - DISPLAYNAME_INVALID: 'Invalid display name', displayName: 'Display Name', donation: 'Support Author', donationAgain: 'Support Again', done: 'Done', downloadApp: 'Download App', - DRAFT_NOT_FOUND: 'Draft not found', draft: 'Draft', - DUPLICATE_CIRCLE: 'This name is already taken.', - DUPLICATE_CIRCLE_SUBSCRIPTION: 'Already subscribed to this circle.', - DUPLICATE_TAG: 'This name is already taken.', edit: 'Edit', editArticle: 'Edit', editCircle: 'Edit', @@ -942,14 +794,10 @@ export const TEXT = { enterUserName: 'Enter Matters ID', enterUserNameAgain: 'Enter Matters ID again', enterVerificationCode: 'Enter verification code', - ENTITY_NOT_FOUND: 'Entity not found', expand: 'More', extend: 'Collect', collectArticle: 'Collect Article', failureChange: 'Failed to edit, please try again.', - failureCommentBlocked: 'The author has disabled comments for this article', - failureCommentOnboarding: - 'You can comment when you have 15 likes or read more articles.', failureCopy: 'Failed to copy, please try again.', failureLogout: 'Failed to log out, please try again.', failureDonation: 'Failed to Donate', @@ -963,10 +811,6 @@ export const TEXT = { follower: 'Followers', following: 'Following', followingMe: 'Followers', - FORBIDDEN_BY_STATE: 'You do not have permission to perform this operation', - FORBIDDEN_BY_TARGET_STATE: - 'You do not have permissionn to perform this operation', - FORBIDDEN: 'You do not have permission to perform this operation', forgetPassword: 'Forget Password', forgetPaymentPassword: 'Forget Payment Password', frequentSearch: 'Search trends', @@ -1005,9 +849,7 @@ export const TEXT = { hkd: 'HKD', hottest: 'Trending', hottestArticles: 'Trending', - INTERNAL_SERVER_ERROR: - 'Oops. Something went wrong. Please try again later.', - invalidEmail: 'Invalid Email', + invalidEmail: 'Please fill in a valid email address', invalidUserName: 'Invalid Matters ID', IPFSEntrance: 'IPFS', joinCivicLiker: 'Become a Civil Liker and support creators! ', @@ -1019,9 +861,6 @@ export const TEXT = { linkEns: 'By connecting ENS, benefits are:', linkEnsBenefit1: 'Customize IPNS page URL like ipfs.io/ipns/matty.eth', linkEnsBenefit2: 'Subscribers can add ENS to reader such as Planet', - LIKER_EMAIL_EXISTS: 'Liker ID email is already taken.', - LIKER_NOT_FOUND: 'Liker ID not found', - LIKER_USER_ID_EXISTS: 'Liker ID is already taken.', logbook: 'Logbook', logbook2LaunchText: "Logbook 2.0 has just launched. If you are an owner of Traveloggers, and haven't claimed, you may claim one from the new Logbook page:", @@ -1037,7 +876,6 @@ export const TEXT = { manageCircle: 'Manage Circle', manageCircleInvitation: 'Manage Invitation', members: 'Members', - MIGRATION_REACH_LIMIT: '1 MB maximum', migration: 'Settled in Matters', migrationSideBar: 'Migrate to Matters', month: 'month', @@ -1052,19 +890,11 @@ export const TEXT = { myProfile: 'Profile', myWallet: 'Wallet', myAnalytics: 'Analytics', - NAME_EXISTS: 'This name is already taken.', - NAME_INVALID: 'Invalid name', - NETWORK_ERROR: 'Please refresh the page and try again.', newPassword: 'New password', nextStep: 'Next', - NOT_ALLOW_ADD_TAG: 'Unable to add tag', - NOT_ALLOW_ADD_OFFICIAL_TAG: 'Unable to add official tag', - // NOT_ENOUGH_MAT: 'Insufficient MAT', - NOTICE_NOT_FOUND: 'Notification not found', noArticlesYet: 'No published articles yet', noTagsUsageYet: 'No articles using tags', notifications: 'Notifications', - OAUTH_TOKEN_INVALID: 'Please log in again.', oauthAuthorize: 'OAuth authorize', openCommunity: 'Open Source', password: 'Password', @@ -1074,15 +904,6 @@ export const TEXT = { passwordNotMatch: 'The new password and confirmation password do not match.', pay: 'Pay', - PAYMENT_AMOUNT_INVALID: 'The payment amount is invalid, please re-enter.', - PAYMENT_AMOUNT_TOO_SMALL: - 'The payment amount is too small, please re-enter.', - PAYMENT_BALANCE_INSUFFICIENT: 'Insufficient wallet balance.', - PAYMENT_PASSWORD_NOT_SET: 'Please set your transcation password.', - NOTICE_PAYMENT_PAYOUT_ACCOUNT_EXISTS: 'You already have a payout account.', - NOTICE_PAYMENT_PAYOUT_TRANSACTION_EXISTS: - 'Another transcation is on track.', - PAYMENT_REACH_MAXIMUM_LIMIT: 'The daily limit is 5000 HKD', paymentPassword: 'Transaction Password', paymentPayout: 'Withdraw', paymentPayoutComplete: 'The withdrawal process has started.', @@ -1104,8 +925,6 @@ export const TEXT = { publishToISCNHint_2: ' registration is about 1 LIKE. During promotion period it is sponsored by Matters.News.', putComment: 'Comment', - QUERY_FIELD_NOT_FOUND: 'Query not found', - RATE_LIMIT_EXCEEDED: 'Operation too frequent, please try again later.', readCount: 'Read Counts', readHistory: 'Read History', readTime: 'Accumulated Read Time', @@ -1183,9 +1002,6 @@ export const TEXT = { analyticsNoArticle: 'You haven‘t published any articles yet, so there is no data available. Create one now to introduce yourself!', analyticsNoSupporter: 'No data yet.', - TAG_EDITORS_REACH_LIMIT: 'Maximum 4 editors allowed for each tag', - TAG_NOT_FOUND: 'Tag not found', - TOO_MANY_TAGS_FOR_ARTICLE: 'Add up to 5 tags', tag: 'Tag', tags: 'Tags', tagAddArticle: 'Add Article', @@ -1201,19 +1017,14 @@ export const TEXT = { 'We have updated our Terms and Privacy Policy. To continue, you must agree to the Terms.', theFirstSupporter: 'was the first to support this article', thinkAboutIt: 'Maybe later', - TOKEN_INVALID: 'Please log in again', topic: 'Topic', topUp: 'Top Up', toYourIPNSPage: 'to your IPNS page', - UNABLE_TO_UPLOAD_FROM_URL: - 'File upload failed, please verify the file link is valid, or manually download and upload again.', - UNAUTHENTICATED: 'Please log in.', unblockSuccess: 'User unblocked and can reply your articles now.', unblockUser: 'Unblock', uncollapseComment: 'Unfold', understood: 'I see', unfollow: 'Unfollow', - UNKNOWN_ERROR: 'Unknown error. Please try again later.', unknownAddress: "It seems you've come to an unknown space, please go back and retry", unpin: 'Unselected', @@ -1226,18 +1037,6 @@ export const TEXT = { uploadCover: 'Upload Cover', useEmail: 'Continue with Email', useNewPassword: 'Log in with new password.', - USER_DISPLAYNAME_INVALID: 'Invalid displayname', - USER_EMAIL_EXISTS: 'Email is already taken.', - USER_EMAIL_INVALID: 'Invalid Email', - USER_EMAIL_NOT_FOUND: 'Invalid Account', - USER_NOT_FOUND: 'User not found', - USER_PASSWORD_INVALID: 'Invalid Password', - USER_PASSWORD_NOT_AVAILABLE: - 'Please login using your wallet if you registered via wallet login', - USER_USERNAME_EXISTS: 'Matters ID is already used by others.', - USER_USERNAME_INVALID: 'Invalid Matters ID', - CRYPTO_WALLET_EXISTS: 'Wallet address already exists', - USER_ETH_ADDRESS_NOT_FOUND: 'Wallet address not found', user: 'User', userDescription: 'Profile', useWallet: 'Continue with Wallet', diff --git a/src/common/enums/time.ts b/src/common/enums/time.ts index 26fd0e8fad..3bb49cbb81 100644 --- a/src/common/enums/time.ts +++ b/src/common/enums/time.ts @@ -6,4 +6,4 @@ export const TOAST_DURATION = 1000 * 3 export const WINDOW_RESIZE_DEBOUNCE = 300 -export const SEND_CODE_COUNTDOWN = 1000 * 60 +export const SEND_CODE_COUNTDOWN = 60 diff --git a/src/common/enums/url.ts b/src/common/enums/url.ts index 17007a5180..863ca801f5 100644 --- a/src/common/enums/url.ts +++ b/src/common/enums/url.ts @@ -3,9 +3,20 @@ export const URL_FRAGMENT = { } export const URL_QS = { - SHARE_SOURCE_ONBOARDING_TASKS: { - key: 'share_source', - value: 'onboarding_tasks', - }, MODE_EDIT: { key: 'mode', value: 'edit' }, } + +export const URL_ME_SETTINGS = { + OPEN_SET_EMAIL_DIALOG: { key: 'dialog', value: 'set-email' }, +} + +export const URL_COLLECTION_DETAIL = { + // ?sort=seq:asc,date:dsc + SORTER_KEY: 'sort', + SORTER_SEPARATOR: ',', + SORTER_TYPE_SEPARATOR: ':', + SORTER_SEQUENCE: { + key: 'seq', + value: { ASC: 'asc', DSC: 'dsc' }, + }, +} diff --git a/src/common/styles/bases/defaults.css b/src/common/styles/bases/defaults.css index 74581d986c..237b8892e7 100644 --- a/src/common/styles/bases/defaults.css +++ b/src/common/styles/bases/defaults.css @@ -76,6 +76,7 @@ code, kbd, samp, pre { + font-family: var(--font-mono); background: var(--color-grey-lighter); } diff --git a/src/common/styles/bases/reset.css b/src/common/styles/bases/reset.css index 904e2d62b5..59e1411e7c 100644 --- a/src/common/styles/bases/reset.css +++ b/src/common/styles/bases/reset.css @@ -62,7 +62,7 @@ code, kbd, samp, pre { - font-family: monospace; + /* font-family: monospace; */ font-size: 1em; } diff --git a/src/common/styles/components/dialog.css b/src/common/styles/components/dialog.css index b8710b36a0..6d5a27fb69 100644 --- a/src/common/styles/components/dialog.css +++ b/src/common/styles/components/dialog.css @@ -22,5 +22,8 @@ bottom: auto; left: auto; width: 23.4375rem; /* 375px */ + margin-top: auto; + margin-bottom: auto; + transform-origin: center bottom 0; } } diff --git a/src/common/styles/mixins.css b/src/common/styles/mixins.css index c47f6c5a10..e5989a03a3 100644 --- a/src/common/styles/mixins.css +++ b/src/common/styles/mixins.css @@ -143,7 +143,7 @@ @mixin border-grey; height: var(--input-height); - padding: var(--spacing-base); + padding: var(--spacing-tight); font-size: var(--font-size-md); line-height: 1.375rem; color: var(--color-black); @@ -321,3 +321,13 @@ padding-bottom: 0.12em; margin-bottom: -0.12rem; } + +@define-mixin polka-dot-background { + background: + linear-gradient(90deg, var(--color-white) 2px, transparent 1%) center, + linear-gradient(var(--color-white) 2px, transparent 1%) center, + var(--color-grey-light); + background-repeat: repeat; + background-position: -2px -1px; + background-size: 3px 3px; +} diff --git a/src/common/styles/variables/colors.css b/src/common/styles/variables/colors.css index a7faa4080c..6807d89a63 100644 --- a/src/common/styles/variables/colors.css +++ b/src/common/styles/variables/colors.css @@ -10,6 +10,7 @@ --color-grey-light: #ddd; --color-grey-lighter: #f7f7f7; --color-white: #fff; + --color-white-light: #fff9; --color-red-dark: #a04a34; --color-red: #c85c41; --color-red-lighter: #fae7e3; diff --git a/src/common/utils/analytics.ts b/src/common/utils/analytics.ts index 508a2d3385..415843b64b 100644 --- a/src/common/utils/analytics.ts +++ b/src/common/utils/analytics.ts @@ -35,6 +35,7 @@ type EventArgs = | ['banner_exposure', BannerExposureProp] | ['card_exposure', CardExposureProp] | ['tag_exposure', TagExposureProp] + | ['image_upload', ImageUploadProp] /** * Event: Page View @@ -173,6 +174,13 @@ interface TagExposureProp { delay_msecs?: number } +interface ImageUploadProp { + uploadURL: string + type: string + size: number | string + delay_msecs?: number +} + // content type export type ContentType = | 'article' diff --git a/src/common/utils/crypto.ts b/src/common/utils/crypto.ts new file mode 100644 index 0000000000..7606664651 --- /dev/null +++ b/src/common/utils/crypto.ts @@ -0,0 +1,13 @@ +export const generateChallenge = async (code_verifier: string) => { + const buffer = await crypto.subtle.digest( + 'SHA-256', + new TextEncoder().encode(code_verifier) + ) + // Generate base64url string + // btoa is deprecated in Node.js but is used here for web browser compatibility + // (which has no good replacement yet, see also https://github.com/whatwg/html/issues/6811) + return btoa(String.fromCharCode(...new Uint8Array(buffer))) + .replace(/\//g, '_') + .replace(/\+/g, '-') + .replace(/=/g, '') +} diff --git a/src/common/utils/form/error.ts b/src/common/utils/form/error.ts index 74f2915637..5bca0b6b45 100644 --- a/src/common/utils/form/error.ts +++ b/src/common/utils/form/error.ts @@ -1,25 +1,19 @@ import { ApolloError } from 'apollo-client' +import { MessageDescriptor } from 'react-intl' -import { ErrorCodeKeys, TEXT } from '~/common/enums' -import { translate } from '~/common/utils' -import { getErrorCodes } from '~/components/GQL' +import { ERROR_CODES } from '~/common/enums' +import { ERROR_MESSAGES, getErrorCodes } from '~/components/GQL' -type ErrorMessages = { [key in ErrorCodeKeys]: string } +type ErrorMessages = { [key in ERROR_CODES]: MessageDescriptor } export const parseFormSubmitErrors = ( - error: ApolloError, - lang: Language -): [ErrorMessages, ErrorCodeKeys[]] => { + error: ApolloError +): [ErrorMessages, ERROR_CODES[]] => { const codes = getErrorCodes(error) const messages: ErrorMessages = {} as any codes.forEach((code) => { - messages[code] = translate({ - zh_hant: TEXT.zh_hant[code] || TEXT.zh_hant.UNKNOWN_ERROR, - zh_hans: TEXT.zh_hans[code] || TEXT.zh_hans.UNKNOWN_ERROR, - en: TEXT.en[code] || TEXT.en.UNKNOWN_ERROR, - lang, - }) + messages[code] = ERROR_MESSAGES[code] }) return [messages, codes] diff --git a/src/common/utils/form/image.tsx b/src/common/utils/form/image.tsx new file mode 100644 index 0000000000..906eaee7d2 --- /dev/null +++ b/src/common/utils/form/image.tsx @@ -0,0 +1,70 @@ +import { FormattedMessage } from 'react-intl' + +import { + UPLOAD_IMAGE_AREA_LIMIT, + UPLOAD_IMAGE_DIMENSION_LIMIT, + UPLOAD_IMAGE_SIZE_LIMIT, +} from '~/common/enums' +import { toast } from '~/components' + +export const validateImage = (image: File) => + new Promise((resolve, reject) => { + // size limits + const isExceedSizeLimit = image.size > UPLOAD_IMAGE_SIZE_LIMIT + if (isExceedSizeLimit) { + toast.error({ + message: ( + + ), + }) + return resolve(false) + } + + // dimension limits + try { + const $img = new Image() + + $img.onload = () => { + const { width, height } = $img + window.URL.revokeObjectURL($img.src) + + const isExceedDimensionLimit = + width > UPLOAD_IMAGE_DIMENSION_LIMIT || + height > UPLOAD_IMAGE_DIMENSION_LIMIT + const isExceedAreaLimit = width * height > UPLOAD_IMAGE_AREA_LIMIT + + if (isExceedDimensionLimit) { + toast.error({ + message: ( + + ), + }) + return resolve(false) + } + + if (isExceedAreaLimit) { + toast.error({ + message: ( + + ), + }) + return resolve(false) + } + + return resolve(true) + } + + $img.src = window.URL.createObjectURL(image) + } catch (exception) { + return reject(exception) + } + }) diff --git a/src/common/utils/form/index.ts b/src/common/utils/form/index.ts index eb50db6438..842663f7cc 100644 --- a/src/common/utils/form/index.ts +++ b/src/common/utils/form/index.ts @@ -1,2 +1,3 @@ export * from './error' +export * from './image' export * from './validate' diff --git a/src/common/utils/form/validate.ts b/src/common/utils/form/validate.ts index eb8575657e..40b8f62653 100644 --- a/src/common/utils/form/validate.ts +++ b/src/common/utils/form/validate.ts @@ -4,9 +4,11 @@ import { MAX_CIRCLE_NAME_LENGTH, MAX_DESCRIPTION_LENGTH, MAX_USER_DISPLAY_NAME_LENGTH, + MAX_USER_NAME_LENGTH, MIN_CIRCLE_DISPLAY_NAME_LENGTH, MIN_CIRCLE_NAME_LENGTH, MIN_USER_DISPLAY_NAME_LENGTH, + MIN_USER_NAME_LENGTH, PAYMENT_CURRENCY, PAYMENT_MAXIMUM_CIRCLE_AMOUNT, PAYMENT_MINIMAL_ADD_CREDIT_AMOUNT, @@ -114,40 +116,14 @@ export const validateUserName = (value: string, lang: Language) => { return translate({ id: 'required', lang }) } - const en = - 'Must be between 4-15 characters long. Only lowercase letters, numbers and underline are accepted.' - - // 4-15 characters, only accept alphabet, number and _. - if (value.length < 4) { - return translate({ - zh_hant: '輸入字數過短,僅供輸入 4-15 個字元', - zh_hans: '输入字数过短,仅供输入 4-15 个字符', - en, - lang, - }) - } - - if (value.length > 15) { - return translate({ - zh_hant: '輸入字數過長,僅供輸入 4-15 個字元', - zh_hans: '输入字数过长,仅供输入 4-15 个字符', - en, - lang, - }) - } - - if (REGEXP_ALL_PUNCTUATIONS.test(value)) { - return translate({ - zh_hant: '不支持單獨使用標點符號', - zh_hans: '不支持单独使用标点符号', - en, - lang, - }) - } - - if (!/^[a-zA-Z0-9_]*$/.test(value)) { + if ( + value.length < MIN_USER_NAME_LENGTH || + value.length > MAX_USER_NAME_LENGTH + ) { return translate({ - id: 'hintUserName', + zh_hant: `ID 字符數須介於 ${MIN_USER_NAME_LENGTH} 到 ${MAX_USER_NAME_LENGTH} 之間`, + zh_hans: `ID 字符数须介于 ${MIN_USER_NAME_LENGTH} 到 ${MAX_USER_NAME_LENGTH} 之间`, + en: `ID must be between ${MIN_USER_NAME_LENGTH} and ${MAX_USER_NAME_LENGTH} characters long`, lang, }) } diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts index 367eb4afff..64483765b5 100644 --- a/src/common/utils/index.ts +++ b/src/common/utils/index.ts @@ -5,6 +5,7 @@ export * from './browser' export * from './comment' export * from './connections' export * from './cookie' +export * from './crypto' export * from './datetime' export * from './dom' export * from './form' diff --git a/src/common/utils/oauth.ts b/src/common/utils/oauth.ts index 5c4dfbeee2..71cf8fd1bb 100644 --- a/src/common/utils/oauth.ts +++ b/src/common/utils/oauth.ts @@ -1,6 +1,11 @@ import _get from 'lodash/get' -import { OAUTH_SCOPE_TREE } from '~/common/enums' +import { + CALLBACK_PROVIDERS, + OAUTH_SCOPE_TREE, + OAUTH_TYPE, + PATHS, +} from '~/common/enums' export const toReadableScope = ({ scope, @@ -34,3 +39,70 @@ export const toReadableScope = ({ return prefix + text } + +import { + OAUTH_STORAGE_CODE_VERIFIER, + OAUTH_STORAGE_NONCE, + OAUTH_STORAGE_PATH, + OAUTH_STORAGE_STATE, +} from '~/common/enums' +import { generateChallenge, randomString, storage } from '~/common/utils' + +export type OauthType = 'login' | 'bind' + +export const generateSocialOauthParams = async (type: OauthType) => { + const state = OAUTH_TYPE[type] + randomString(8) + const nonce = randomString(8) + const codeVerifier = crypto.randomUUID() + crypto.randomUUID() + const codeChallenge = await generateChallenge(codeVerifier) + storage.set(OAUTH_STORAGE_STATE, state) + storage.set(OAUTH_STORAGE_NONCE, nonce) + storage.set(OAUTH_STORAGE_PATH, window.location.href) + storage.set(OAUTH_STORAGE_CODE_VERIFIER, codeVerifier) + return { state, nonce, codeChallenge } +} + +export const googleOauthUrl = async (type: OauthType) => { + const { state, nonce } = await generateSocialOauthParams(type) + const clientId = process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID + const redirectUri = `https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}/callback/${CALLBACK_PROVIDERS.Google}` + const url = `https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=${clientId}&scope=openid%20email&redirect_uri=${redirectUri}&state=${state}&nonce=${nonce}` + return url +} + +export const twitterOauthUrl = async (type: OauthType) => { + const { state, codeChallenge } = await generateSocialOauthParams(type) + const clientId = process.env.NEXT_PUBLIC_TWITTER_CLIENT_ID + const redirectUri = `https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}/callback/${CALLBACK_PROVIDERS.Twitter}` + const url = `https://twitter.com/i/oauth2/authorize?response_type=code&client_id=${clientId}&redirect_uri=${redirectUri}&scope=users.read%20tweet.read&state=${state}&code_challenge=${codeChallenge}&code_challenge_method=S256` + return url +} + +export const facebookOauthUrl = async (type: OauthType) => { + const { state, codeChallenge } = await generateSocialOauthParams(type) + const clientId = process.env.NEXT_PUBLIC_FACEBOOK_CLIENT_ID + const redirectUri = `https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}/callback/${CALLBACK_PROVIDERS.Facebook}` + const url = `https://www.facebook.com/v17.0/dialog/oauth?response_type=code&scope=openid&client_id=${clientId}&redirect_uri=${redirectUri}&state=${state}&code_challenge=${codeChallenge}&code_challenge_method=S256` + return url +} + +export const signupCallbackUrl = (email: string) => { + return `https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}/callback/${ + CALLBACK_PROVIDERS.EmailSignup + }?email=${encodeURIComponent(email)}` +} + +export const signinCallbackUrl = (email: string) => { + return `https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}/callback/${ + CALLBACK_PROVIDERS.EmailSignin + }?email=${encodeURIComponent(email)}` +} + +export const emailVerifyCallbackUrl = (email: string) => { + const redirectPath = `/callback/${CALLBACK_PROVIDERS.EmailVerification}` + const host = `https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}` + const redirectUrl = `${host}${redirectPath}?email=${encodeURIComponent( + email + )}&target=${encodeURIComponent(host)}${encodeURIComponent(PATHS.ME_SETTINGS)}` + return redirectUrl +} diff --git a/src/common/utils/random.ts b/src/common/utils/random.ts index faed0c5e0a..855fa87c23 100644 --- a/src/common/utils/random.ts +++ b/src/common/utils/random.ts @@ -1 +1,2 @@ -export const randomString = () => Math.random().toString(36).substr(2, 9) +export const randomString = (length = 9) => + Math.random().toString(36).substr(2, length) diff --git a/src/common/utils/resolvers/clientPreference.ts b/src/common/utils/resolvers/clientPreference.ts index 07aa191496..9dac656bce 100644 --- a/src/common/utils/resolvers/clientPreference.ts +++ b/src/common/utils/resolvers/clientPreference.ts @@ -5,10 +5,6 @@ const clientPreferenceResolver = (_: any) => { readCivicLikerDialog: false, wall: true, routeHistory: [], - onboardingTasks: { - enabled: false, - __typename: 'OnboardingTasks', - }, circleBanner: true, } } diff --git a/src/common/utils/route.ts b/src/common/utils/route.ts index edd71449bc..a2831bcee2 100644 --- a/src/common/utils/route.ts +++ b/src/common/utils/route.ts @@ -65,7 +65,7 @@ type ToPathArgs = article?: ArticleArgs | null circle?: CircleArgs | null } - | { page: 'draftDetail'; id: string; slug: string } + | { page: 'draftDetail'; id: string } | { page: 'tagDetail' tag: TagArgs @@ -203,7 +203,7 @@ export const toPath = ( } case 'draftDetail': { return { - href: `/me/drafts/${args.slug}-${args.id}`, + href: `/me/drafts/${args.id}`, } } case 'tagDetail': { @@ -287,6 +287,12 @@ export const redirectToLogin = () => { return Router.push(`${PATHS.LOGIN}?target=${target}`) } +export const redirectToHomePage = () => { + const target = getTarget() || getEncodedCurrent() + + return Router.push(`${PATHS.HOME}?target=${target}`) +} + /** * Append `?target` to the given path. * diff --git a/src/common/utils/storage.ts b/src/common/utils/storage.ts index 6b7773166f..06f5aa7191 100644 --- a/src/common/utils/storage.ts +++ b/src/common/utils/storage.ts @@ -36,6 +36,8 @@ export const storage = { if (process.env.DEBUG) { console.log(`[storage:REMOVE] ${key}`) } - return localStorage.removeItem(key) + const item = parseJSON(localStorage.getItem(key)) + localStorage.removeItem(key) + return item }, } diff --git a/src/common/utils/text/index.ts b/src/common/utils/text/index.ts index e6be55bddb..7b20240ddc 100644 --- a/src/common/utils/text/index.ts +++ b/src/common/utils/text/index.ts @@ -1,5 +1,6 @@ export * from './article' export * from './tag' +export * from './user' // for Twitter and others which do not support non-English in URL export const stripNonEnglishUrl = (url: string) => { diff --git a/src/common/utils/text/user.ts b/src/common/utils/text/user.ts new file mode 100644 index 0000000000..06c90163bb --- /dev/null +++ b/src/common/utils/text/user.ts @@ -0,0 +1,13 @@ +export const normalizeUserName = (userName: string) => { + return userName + .split('') + .filter((c) => /^[a-z0-9_]*$/.test(c)) + .join('') +} + +export const normalizePassowrd = (password: string) => { + return password + .split('') + .filter((c) => /^[\x00-\x7F]*$/.test(c)) + .join('') +} diff --git a/src/common/utils/types/index.ts b/src/common/utils/types/index.ts index a3e1657d34..d5aeaad2aa 100644 --- a/src/common/utils/types/index.ts +++ b/src/common/utils/types/index.ts @@ -32,8 +32,6 @@ export default gql` "Log route history for page back button" routeHistory: [String!] - onboardingTasks: OnboardingTasks! - "Whether cicle banner is shown" circleBanner: Boolean! diff --git a/src/common/utils/url.ts b/src/common/utils/url.ts index 2dda99369e..155147274c 100644 --- a/src/common/utils/url.ts +++ b/src/common/utils/url.ts @@ -1,3 +1,5 @@ +import { URL_COLLECTION_DETAIL } from '../enums' + const pattern = /^(:?\/\/|https?:\/\/)?([^/]*@)?(.+?)(:\d{2,5})?([/?].*)?$/ export const extractDomain = (url: string) => { @@ -88,3 +90,30 @@ export const isUrl = (key: string) => { return false } } + +export const parseSorter = (sorterStr: string) => { + const sorter: any = {} + if (sorterStr === '') { + return sorter + } + const sorters = sorterStr.split(URL_COLLECTION_DETAIL.SORTER_SEPARATOR) + sorters.map((s) => { + const [key, value] = s.split(URL_COLLECTION_DETAIL.SORTER_TYPE_SEPARATOR) + sorter[key] = value + }) + return sorter +} + +export const stringifySorter = (sorter: any) => { + let sorterStr = '' + const keys = Object.keys(sorter) + keys.map((key, index) => { + sorterStr += `${key}${URL_COLLECTION_DETAIL.SORTER_TYPE_SEPARATOR}${sorter[ + key + ].toString()}` + if (index < keys.length - 1) { + sorterStr += URL_COLLECTION_DETAIL.SORTER_SEPARATOR + } + }) + return sorterStr +} diff --git a/src/common/utils/wallet.ts b/src/common/utils/wallet.ts index a1af5f7ac9..b800e020d9 100644 --- a/src/common/utils/wallet.ts +++ b/src/common/utils/wallet.ts @@ -97,3 +97,5 @@ export const WALLET_ERROR_MESSAGES = { export const MaxUint256 = BigInt( '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' ) + +export type WalletType = 'MetaMask' | 'WalletConnect' diff --git a/src/components/ArticleDigest/Archive/index.tsx b/src/components/ArticleDigest/Archived/index.tsx similarity index 88% rename from src/components/ArticleDigest/Archive/index.tsx rename to src/components/ArticleDigest/Archived/index.tsx index df0fc7ca39..31aa227d6e 100644 --- a/src/components/ArticleDigest/Archive/index.tsx +++ b/src/components/ArticleDigest/Archived/index.tsx @@ -8,15 +8,15 @@ import { ArticleDigestTitleArticleFragment } from '~/gql/graphql' import { ArticleDigestTitle } from '../Title' import styles from './styles.module.css' -export type ArticleDigestArchiveProps = { +export type ArticleDigestArchivedProps = { article: ArticleDigestTitleArticleFragment } & UtmParams -export const ArticleDigestArchive = ({ +export const ArticleDigestArchived = ({ article, utm_source, utm_medium, -}: ArticleDigestArchiveProps) => { +}: ArticleDigestArchivedProps) => { const path = toPath({ page: 'articleDetail', article, @@ -38,6 +38,7 @@ export const ArticleDigestArchive = ({
diff --git a/src/components/ArticleDigest/Archive/styles.module.css b/src/components/ArticleDigest/Archived/styles.module.css similarity index 67% rename from src/components/ArticleDigest/Archive/styles.module.css rename to src/components/ArticleDigest/Archived/styles.module.css index a76ba5ca58..53406e1932 100644 --- a/src/components/ArticleDigest/Archive/styles.module.css +++ b/src/components/ArticleDigest/Archived/styles.module.css @@ -2,9 +2,10 @@ @mixin flex-center-space-between; font-size: var(--font-size-sm); - color: var(--color-grey); + color: var(--color-grey-dark); & .right { + color: var(--color-grey); word-break: keep-all; } } diff --git a/src/components/ArticleDigest/DropdownActions/AddCollectionButton.tsx b/src/components/ArticleDigest/DropdownActions/AddCollectionButton.tsx index 9f83c613d4..f3adee4a73 100644 --- a/src/components/ArticleDigest/DropdownActions/AddCollectionButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/AddCollectionButton.tsx @@ -9,7 +9,7 @@ interface AddCollectionButtonProps { const AddCollectionButton = ({ openDialog }: AddCollectionButtonProps) => { return ( } + text={} icon={} onClick={openDialog} ariaHasPopup="dialog" diff --git a/src/components/ArticleDigest/DropdownActions/ArchiveArticle/Button.tsx b/src/components/ArticleDigest/DropdownActions/ArchiveArticle/Button.tsx index 8529d94eb0..e1d455dc3f 100644 --- a/src/components/ArticleDigest/DropdownActions/ArchiveArticle/Button.tsx +++ b/src/components/ArticleDigest/DropdownActions/ArchiveArticle/Button.tsx @@ -5,7 +5,7 @@ import { IconArchive20, Menu } from '~/components' const ArchiveArticleButton = ({ openDialog }: { openDialog: () => void }) => { return ( } + text={} icon={} onClick={openDialog} ariaHasPopup="dialog" diff --git a/src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx b/src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx index 1f8a243245..59c92a0cbe 100644 --- a/src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx +++ b/src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx @@ -83,6 +83,7 @@ const ArchiveArticleDialog = ({ message: ( ), @@ -104,7 +105,9 @@ const ArchiveArticleDialog = ({ } + title={ + + } /> @@ -112,16 +115,23 @@ const ArchiveArticleDialog = ({

{article.title}, }} />
- +

) : (

- +

)} @@ -132,9 +142,12 @@ const ArchiveArticleDialog = ({ + ) : ( - + ) } color={loading ? 'green' : 'red'} @@ -146,9 +159,12 @@ const ArchiveArticleDialog = ({ + ) : ( - + ) } color={loading ? 'green' : 'red'} diff --git a/src/components/ArticleDigest/DropdownActions/EditButton.tsx b/src/components/ArticleDigest/DropdownActions/EditButton.tsx index cf9e1822c6..4398d46899 100644 --- a/src/components/ArticleDigest/DropdownActions/EditButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/EditButton.tsx @@ -32,6 +32,7 @@ const EditArticleButton = ({ text={ } diff --git a/src/components/ArticleDigest/DropdownActions/ExtendButton.tsx b/src/components/ArticleDigest/DropdownActions/ExtendButton.tsx index 5791fa7cb8..b722549623 100644 --- a/src/components/ArticleDigest/DropdownActions/ExtendButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/ExtendButton.tsx @@ -1,13 +1,16 @@ import gql from 'graphql-tag' import { useRouter } from 'next/router' import { useContext } from 'react' +import { FormattedMessage } from 'react-intl' import { + ERROR_CODES, OPEN_UNIVERSAL_AUTH_DIALOG, UNIVERSAL_AUTH_SOURCE, } from '~/common/enums' import { toPath } from '~/common/utils' import { + ERROR_MESSAGES, IconCollection24, Menu, toast, @@ -61,17 +64,19 @@ const ExtendButton = ({ if (viewer.isInactive) { toast.error({ - message: , + message: ( + + ), }) return } const { data } = await collectArticle() - const { slug = '', id } = data?.putDraft || {} + const { id } = data?.putDraft || {} if (id) { - const path = toPath({ page: 'draftDetail', slug, id }) + const path = toPath({ page: 'draftDetail', id }) router.push(path.href) } } diff --git a/src/components/ArticleDigest/DropdownActions/PinButton.tsx b/src/components/ArticleDigest/DropdownActions/PinButton.tsx index 4230ca69d5..6db9006d2a 100644 --- a/src/components/ArticleDigest/DropdownActions/PinButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/PinButton.tsx @@ -53,9 +53,12 @@ const PinButton = ({ article }: PinButtonProps) => { onCompleted: () => { toast.success({ message: article.pinned ? ( - + ) : ( - + ), }) }, @@ -64,7 +67,10 @@ const PinButton = ({ article }: PinButtonProps) => { toastType: 'success', customErrors: { [ERROR_CODES.ACTION_LIMIT_EXCEEDED]: ( - + ), }, } @@ -76,11 +82,13 @@ const PinButton = ({ article }: PinButtonProps) => { article.pinned ? ( ) : ( ) diff --git a/src/components/ArticleDigest/DropdownActions/RemoveArticleCollectionButton.tsx b/src/components/ArticleDigest/DropdownActions/RemoveArticleCollectionButton.tsx index 6bcb692bd2..f5d66d2231 100644 --- a/src/components/ArticleDigest/DropdownActions/RemoveArticleCollectionButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/RemoveArticleCollectionButton.tsx @@ -13,7 +13,9 @@ const RemoveArticleCollectionButton = ({ }: RemoveArticleCollectionButtonProps) => { return ( } + text={ + + } icon={} onClick={() => { onClick() diff --git a/src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx b/src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx index 8d45b078b8..8eeba13745 100644 --- a/src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx @@ -60,6 +60,7 @@ const RemoveTagButton = ({ text={ } diff --git a/src/components/ArticleDigest/DropdownActions/SetBottomCollectionButton.tsx b/src/components/ArticleDigest/DropdownActions/SetBottomCollectionButton.tsx index b93645e0b7..23c0f83e19 100644 --- a/src/components/ArticleDigest/DropdownActions/SetBottomCollectionButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/SetBottomCollectionButton.tsx @@ -49,6 +49,7 @@ const SetBottomCollectionButton = ({ text={ } diff --git a/src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx b/src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx index 46bbb372e9..305ca57b66 100644 --- a/src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx @@ -53,6 +53,7 @@ const SetTagSelectedButton = ({ text={ } @@ -64,6 +65,7 @@ const SetTagSelectedButton = ({ message: ( ), diff --git a/src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx b/src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx index 3cfe243cf0..c31e554636 100644 --- a/src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx @@ -99,6 +99,7 @@ const SetTagUnselectedButton = ({ message: ( ), @@ -110,6 +111,7 @@ const SetTagUnselectedButton = ({ text={ } diff --git a/src/components/ArticleDigest/DropdownActions/SetTopCollectionButton.tsx b/src/components/ArticleDigest/DropdownActions/SetTopCollectionButton.tsx index e46e435e91..2cd6e98f4f 100644 --- a/src/components/ArticleDigest/DropdownActions/SetTopCollectionButton.tsx +++ b/src/components/ArticleDigest/DropdownActions/SetTopCollectionButton.tsx @@ -36,6 +36,7 @@ const SetTopCollectionButton = ({ text={ } diff --git a/src/components/ArticleDigest/DropdownActions/index.tsx b/src/components/ArticleDigest/DropdownActions/index.tsx index f02f4760fa..ebd787fe62 100644 --- a/src/components/ArticleDigest/DropdownActions/index.tsx +++ b/src/components/ArticleDigest/DropdownActions/index.tsx @@ -1,7 +1,9 @@ import _isEmpty from 'lodash/isEmpty' import _pickBy from 'lodash/pickBy' import { useContext } from 'react' +import { FormattedMessage } from 'react-intl' +import { ERROR_CODES } from '~/common/enums' import { translate } from '~/common/utils' import { AddCollectionsArticleDialog, @@ -9,6 +11,7 @@ import { BookmarkButton, Button, Dropdown, + ERROR_MESSAGES, FingerprintDialog, IconMore16, IconSize, @@ -18,7 +21,6 @@ import { ShareDialog, SupportersDialog, toast, - Translate, ViewerContext, } from '~/components' import { DropdownActionsArticleFragment } from '~/gql/graphql' @@ -296,7 +298,9 @@ const DropdownActions = (props: DropdownActionsProps) => { const forbid = () => { toast.error({ - message: , + message: ( + + ), }) } diff --git a/src/components/ArticleDigest/Feed/FooterActions/ReadTime/index.tsx b/src/components/ArticleDigest/Feed/FooterActions/ReadTime/index.tsx index 0ba60ac974..ab34628647 100644 --- a/src/components/ArticleDigest/Feed/FooterActions/ReadTime/index.tsx +++ b/src/components/ArticleDigest/Feed/FooterActions/ReadTime/index.tsx @@ -28,6 +28,7 @@ const ReadTime = ({ article }: ResponseCountProps) => { type="button" title={intl.formatMessage({ defaultMessage: 'Accumulated read time', + id: 'U7o9Ba', })} > } size="xs" color="grey"> diff --git a/src/components/ArticleDigest/index.tsx b/src/components/ArticleDigest/index.tsx index 1d2a24289b..31927390f3 100644 --- a/src/components/ArticleDigest/index.tsx +++ b/src/components/ArticleDigest/index.tsx @@ -1,4 +1,4 @@ -export * from './Archive' +export * from './Archived' export * from './Card' export * from './Dropdown' export * from './Feed' diff --git a/src/components/AuthMethodFeed/AuthNormalFeed.tsx b/src/components/AuthMethodFeed/AuthNormalFeed.tsx new file mode 100644 index 0000000000..84c27303f4 --- /dev/null +++ b/src/components/AuthMethodFeed/AuthNormalFeed.tsx @@ -0,0 +1,140 @@ +import { useEffect, useState } from 'react' +import { FormattedMessage } from 'react-intl' + +import { PATHS } from '~/common/enums' +import { + facebookOauthUrl, + googleOauthUrl, + twitterOauthUrl, +} from '~/common/utils' +import { + IconFacebook22, + IconGoogle22, + IconMail22, + IconSpinner22, + IconX22, + useRoute, +} from '~/components' + +import styles from './styles.module.css' + +interface Props { + gotoEmailSignup: () => void + gotoEmailLogin: () => void +} + +export const AuthNormalFeed = ({ gotoEmailSignup, gotoEmailLogin }: Props) => { + const { router } = useRoute() + const [loadingState, setLoadingState] = useState('') + const isGoogleLoading = loadingState === 'Google' + const isTwitterLoading = loadingState === 'Twitter' + const isFacebookLoading = loadingState === 'Facebook' + useEffect(() => { + return setLoadingState('') + }, []) + + const oauthType = 'login' + + const gotoGoogle = async () => { + setLoadingState('Google') + const url = await googleOauthUrl(oauthType) + router.push(url) + } + + const gotoTwitter = async () => { + setLoadingState('Twitter') + const url = await twitterOauthUrl(oauthType) + router.push(url) + } + + const gotoFacebook = async () => { + setLoadingState('Facebook') + const url = await facebookOauthUrl(oauthType) + router.push(url) + } + + return ( + <> +
    +
  • + + + + + + +
  • +
  • + + + + Google + {isGoogleLoading && ( + + + + )} +
  • +
  • + + + + Twitter + {isTwitterLoading && ( + + + + )} +
  • +
  • + + + + Facebook + {isFacebookLoading && ( + + + + )} +
  • +
+
+
+ + + + + + + +
+
+ + + + +
+
+ + ) +} diff --git a/src/components/AuthMethodFeed/AuthWalletFeed.tsx b/src/components/AuthMethodFeed/AuthWalletFeed.tsx new file mode 100644 index 0000000000..59cf6dd9fc --- /dev/null +++ b/src/components/AuthMethodFeed/AuthWalletFeed.tsx @@ -0,0 +1,150 @@ +import React, { useEffect, useState } from 'react' +import { FormattedMessage } from 'react-intl' +import { useAccount, useConnect } from 'wagmi' + +import { EXTERNAL_LINKS } from '~/common/enums' +import { PATHS } from '~/common/enums' +import { analytics, WalletType } from '~/common/utils' +import { + IconMetamask22, + IconSpinner22, + IconWalletConnect22, +} from '~/components' + +import styles from './styles.module.css' + +export interface Props { + submitCallback: (type: WalletType) => void + closeDialog?: () => void + back?: () => void + hasWalletExist?: boolean + hasUnavailable?: boolean +} + +export const AuthWalletFeed: React.FC = ({ + submitCallback, + hasWalletExist, + hasUnavailable, + closeDialog, + back, +}) => { + const { connectors, connect, pendingConnector } = useConnect() + const { address: account, isConnecting } = useAccount() + const [walletType, setWalletType] = useState('MetaMask') + + const injectedConnector = connectors.find((c) => c.id === 'metaMask') + const walletConnectConnector = connectors.find( + (c) => c.id === 'walletConnect' + ) + const isMetaMaskLoading = + isConnecting && pendingConnector?.id === injectedConnector?.id + const isWalletConnectLoading = + isConnecting && pendingConnector?.id === walletConnectConnector?.id + + // auto switch to next step if account is connected + useEffect(() => { + if (!account) return + + submitCallback(walletType) + }, [account]) + + return ( + <> +
    + {injectedConnector?.ready ? ( +
  • { + analytics.trackEvent('click_button', { + type: 'connectorMetaMask', + }) + setWalletType('MetaMask') + connect({ connector: injectedConnector }) + }} + role="button" + > + + + + MetaMask + {isMetaMaskLoading && ( + + + + )} +
  • + ) : ( + +
  • + + + + MetaMask +
  • +
    + )} +
  • { + analytics.trackEvent('click_button', { + type: 'connectorWalletConnect', + }) + setWalletType('WalletConnect') + connect({ connector: walletConnectConnector }) + }} + role="button" + > + + + + WalletConnect + {isWalletConnectLoading && ( + + + + )} +
  • +
+
+ {hasWalletExist && ( +
+

+ +

+

+ +

+
+ )} + {hasUnavailable && ( +
+

+ +

+
+ )} +
+ + + +
+
+ + ) +} diff --git a/src/components/AuthMethodFeed/index.tsx b/src/components/AuthMethodFeed/index.tsx new file mode 100644 index 0000000000..32b584e49b --- /dev/null +++ b/src/components/AuthMethodFeed/index.tsx @@ -0,0 +1,2 @@ +export * from './AuthNormalFeed' +export * from './AuthWalletFeed' diff --git a/src/components/AuthMethodFeed/styles.module.css b/src/components/AuthMethodFeed/styles.module.css new file mode 100644 index 0000000000..0addb0927a --- /dev/null +++ b/src/components/AuthMethodFeed/styles.module.css @@ -0,0 +1,81 @@ +.feed { + & .item { + @mixin border-grey-light; + @mixin flex-center-all; + @mixin transition; + + position: relative; + padding: var(--spacing-tight) var(--spacing-base); + margin-bottom: var(--spacing-base); + font-size: var(--font-size-sm); + line-height: 1.375rem; + color: var(--color-black); + cursor: pointer; + border-radius: 0.5rem; + transition-property: border-color; + + &:hover, + &:focus { + border-color: var(--color-grey); + } + + & .icon { + position: absolute; + left: var(--spacing-base-loose); + height: 1.375rem; + } + + & .right { + position: absolute; + right: var(--spacing-base-loose); + height: 1.375rem; + } + } +} + +.info { + padding: 0 var(--spacing-base); + color: var(--color-grey); + text-align: center; + + @media (--sm-up) { + padding-bottom: var(--spacing-x-tight); + } + + .errorHint { + margin-bottom: var(--spacing-base); + font-size: var(--font-size-sm); + line-height: 1.375rem; + color: var(--color-red); + } + + .title { + padding-top: var(--spacing-x-tight); + font-size: var(--font-size-sm); + line-height: 1.375rem; + + & .left { + display: inline-block; + margin-right: var(--spacing-xx-tight); + } + + & .right { + line-height: 1.375rem; + color: var(--color-matters-green); + cursor: pointer; + transition-property: color; + @mixin transition; + + &:hover, + &:focus { + color: var(--color-matters-green-dark); + } + } + } + + .policy { + margin-top: var(--spacing-x-tight); + font-size: var(--font-size-xs); + line-height: 1.125rem; + } +} diff --git a/src/components/AuthTabs/index.tsx b/src/components/AuthTabs/index.tsx new file mode 100644 index 0000000000..07c7754486 --- /dev/null +++ b/src/components/AuthTabs/index.tsx @@ -0,0 +1,77 @@ +import classNames from 'classnames' +import Link from 'next/link' +import { FormattedMessage, useIntl } from 'react-intl' + +import { ReactComponent as IconMatters } from '@/public/static/images/matters.svg' +import { PATHS } from '~/common/enums' +import { Tabs, withIcon } from '~/components' + +import styles from './styles.module.css' + +export type AuthFeedType = 'normal' | 'wallet' + +interface AuthTabsProps { + purpose: 'dialog' | 'page' + type: AuthFeedType + setType: (type: AuthFeedType) => void + normalText?: string | React.ReactNode +} + +export const AuthTabs = ({ + purpose, + type, + setType, + normalText, +}: AuthTabsProps) => { + const intl = useIntl() + + const isInPage = purpose === 'page' + + const isNormal = type === 'normal' + const isWallet = type === 'wallet' + + const tabsClasses = classNames({ + [styles.tabs]: true, + [styles.spacingTop]: !isInPage, + }) + + return ( +
+ {isInPage && ( +
+ + + {withIcon(IconMatters)({})} + + +
+ )} + + setType('normal')} selected={isNormal}> + {!!normalText ? ( + normalText + ) : ( + + )} + + + setType('wallet')} selected={isWallet}> + + + +
+ ) +} diff --git a/src/components/AuthTabs/styles.module.css b/src/components/AuthTabs/styles.module.css new file mode 100644 index 0000000000..b4cb09a442 --- /dev/null +++ b/src/components/AuthTabs/styles.module.css @@ -0,0 +1,26 @@ +.tabs { + margin-bottom: var(--spacing-loose); + + & .logo { + @mixin flex-start-center; + + margin-top: var(--spacing-loose); + margin-bottom: var(--spacing-loose); + + @media (--sm-up) { + justify-content: start; + margin-top: 0; + } + + & svg { + width: 96px; + height: 20px; + } + } +} + +.spacingTop { + @media (--sm-up) { + margin-top: var(--spacing-base); + } +} diff --git a/src/components/Avatar/index.tsx b/src/components/Avatar/index.tsx index b6e3d7a96e..859f5d8aae 100644 --- a/src/components/Avatar/index.tsx +++ b/src/components/Avatar/index.tsx @@ -15,6 +15,7 @@ export type AvatarSize = | 'xs' | 'sm' | 'md' + | 'mdS' | 'lg' | 'xl' | 'xxl' diff --git a/src/components/Avatar/styles.module.css b/src/components/Avatar/styles.module.css index 8c02964b94..37f550e757 100644 --- a/src/components/Avatar/styles.module.css +++ b/src/components/Avatar/styles.module.css @@ -77,6 +77,20 @@ } } +/* 22px */ +.mdS { + width: 1.375rem; + height: 1.375rem; + + &.hasBadge { + & .badge { + & svg { + width: calc(1.375rem * 0.4); + } + } + } +} + /* 24px */ .md { width: 1.5rem; diff --git a/src/components/BlockUser/Button/index.tsx b/src/components/BlockUser/Button/index.tsx index cc249fd3d6..0ab25cfdc7 100644 --- a/src/components/BlockUser/Button/index.tsx +++ b/src/components/BlockUser/Button/index.tsx @@ -35,6 +35,7 @@ const BlockUserButton = ({ message: ( ), @@ -47,6 +48,7 @@ const BlockUserButton = ({ text={ } @@ -62,7 +64,7 @@ const BlockUserButton = ({ ariaHasPopup="dialog" textColor="greyDarker" textActiveColor="black" - text={} + text={} icon={} /> ) diff --git a/src/components/BlockUser/Dialog/index.tsx b/src/components/BlockUser/Dialog/index.tsx index eec36fb56b..564a4efa9b 100644 --- a/src/components/BlockUser/Dialog/index.tsx +++ b/src/components/BlockUser/Dialog/index.tsx @@ -54,7 +54,7 @@ const BlockUserDialog = ({ user, children }: BlockUserDialogProps) => { } + title={} /> diff --git a/src/components/Book/index.tsx b/src/components/Book/index.tsx index e6e0926ffd..9a4339e983 100644 --- a/src/components/Book/index.tsx +++ b/src/components/Book/index.tsx @@ -3,7 +3,7 @@ import { useEffect } from 'react' import { FormattedMessage } from 'react-intl' import BOOK_COVER from '@/public/static/images/book-cover.png' -import { TEST_ID } from '@/src/common/enums' +import { TEST_ID } from '~/common/enums' import { countStrWidth } from '~/common/utils' import { IconCamera24, @@ -85,6 +85,7 @@ export const Book: React.FC & {

diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx index e0ff8e52d6..a78c3573e8 100644 --- a/src/components/Button/index.tsx +++ b/src/components/Button/index.tsx @@ -49,6 +49,7 @@ export type ButtonSpacingX = type ButtonColor = | 'white' + | 'whiteLight' | 'black' | 'halfBlack' | 'greyDark' @@ -70,7 +71,14 @@ type ButtonColor = type ButtonTextColor = Extract< ButtonColor, - 'white' | 'black' | 'green' | 'gold' | 'red' | 'grey' | 'greyDarker' + | 'white' + | 'whiteLight' + | 'black' + | 'green' + | 'gold' + | 'red' + | 'grey' + | 'greyDarker' > type ButtonTextActiveColor = Extract< @@ -135,6 +143,7 @@ export type ButtonProps = { disabled?: boolean form?: string rel?: string + testId?: string tabIndex?: number onClick?: (event?: React.MouseEvent) => any onMouseEnter?: (event?: React.MouseEvent) => any @@ -198,6 +207,7 @@ export const Button: React.FC> = type = 'button', children, + testId, ...restProps }, ref diff --git a/src/components/Button/styles.module.css b/src/components/Button/styles.module.css index a815efe5be..98de116e74 100644 --- a/src/components/Button/styles.module.css +++ b/src/components/Button/styles.module.css @@ -16,6 +16,10 @@ span.container { color: var(--color-white); } +.textWhiteLight { + color: var(--color-white-light); +} + .textBlack { color: var(--color-black); } diff --git a/src/components/Buttons/Bookmark/Subscribe.tsx b/src/components/Buttons/Bookmark/Subscribe.tsx index 19e916637d..ae02d9c901 100644 --- a/src/components/Buttons/Bookmark/Subscribe.tsx +++ b/src/components/Buttons/Bookmark/Subscribe.tsx @@ -1,6 +1,8 @@ import { useContext } from 'react' +import { FormattedMessage } from 'react-intl' import { + ERROR_CODES, OPEN_UNIVERSAL_AUTH_DIALOG, TEST_ID, UNIVERSAL_AUTH_SOURCE, @@ -8,6 +10,7 @@ import { import { translate } from '~/common/utils' import { Button, + ERROR_MESSAGES, IconBookmark16, IconBookmark20, IconSize, @@ -52,7 +55,11 @@ const Subscribe = ({ articleId, size, disabled, inCard }: SubscribeProps) => { if (viewer.isFrozen) { toast.error({ - message: , + message: ( + + ), }) return } diff --git a/src/components/Buttons/Bookmark/Unsubscribe.tsx b/src/components/Buttons/Bookmark/Unsubscribe.tsx index 7c5681cb8f..b8548725b6 100644 --- a/src/components/Buttons/Bookmark/Unsubscribe.tsx +++ b/src/components/Buttons/Bookmark/Unsubscribe.tsx @@ -1,9 +1,10 @@ import { useContext } from 'react' import { FormattedMessage } from 'react-intl' -import { TEST_ID } from '~/common/enums' +import { ERROR_CODES, TEST_ID } from '~/common/enums' import { Button, + ERROR_MESSAGES, IconBookmarked16, IconBookmarked20, IconSize, @@ -42,7 +43,11 @@ const Unsubscribe = ({ const onClick = async () => { if (viewer.isFrozen) { toast.error({ - message: , + message: ( + + ), }) return } @@ -66,6 +71,7 @@ const Unsubscribe = ({ text={ } @@ -83,6 +89,7 @@ const Unsubscribe = ({ aria-label={ } diff --git a/src/components/Buttons/ConnectWallet/index.tsx b/src/components/Buttons/ConnectWallet/index.tsx deleted file mode 100644 index 6ab3d704d2..0000000000 --- a/src/components/Buttons/ConnectWallet/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { FormattedMessage } from 'react-intl' - -import { PATHS } from '~/common/enums' -import { Button, TextIcon } from '~/components' - -export const ConnectWalletButton = () => { - return ( - - ) -} diff --git a/src/components/Buttons/CopyButton.tsx b/src/components/Buttons/CopyButton.tsx index ec28855cd8..c5fcce9697 100644 --- a/src/components/Buttons/CopyButton.tsx +++ b/src/components/Buttons/CopyButton.tsx @@ -14,7 +14,10 @@ export const CopyButton: React.FC< diff --git a/src/components/Buttons/Login/index.tsx b/src/components/Buttons/Login/index.tsx index 06049e10f0..0646663a59 100644 --- a/src/components/Buttons/Login/index.tsx +++ b/src/components/Buttons/Login/index.tsx @@ -47,6 +47,7 @@ export const LoginButton: React.FC = ({ diff --git a/src/components/Buttons/Shuffle.tsx b/src/components/Buttons/Shuffle.tsx index f8d483afa9..efd8752f27 100644 --- a/src/components/Buttons/Shuffle.tsx +++ b/src/components/Buttons/Shuffle.tsx @@ -26,7 +26,7 @@ export const ShuffleButton: React.FC = ({ size="xs" weight="md" > - + ) diff --git a/src/components/Buttons/SignUp/index.tsx b/src/components/Buttons/SignUp/index.tsx index a41166cc3f..c27091e259 100644 --- a/src/components/Buttons/SignUp/index.tsx +++ b/src/components/Buttons/SignUp/index.tsx @@ -55,7 +55,7 @@ export const SignUpButton: React.FC< } const ButtonText = () => ( - + ) diff --git a/src/components/Buttons/UnblockUser/index.tsx b/src/components/Buttons/UnblockUser/index.tsx deleted file mode 100644 index 5b35575883..0000000000 --- a/src/components/Buttons/UnblockUser/index.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import gql from 'graphql-tag' -import _isNil from 'lodash/isNil' - -import { Button, TextIcon, toast, Translate, useMutation } from '~/components' -import TOGGLE_BLOCK_USER from '~/components/GQL/mutations/toggleBlockUser' -import { - ToggleBlockUserMutation, - UnblockUserButtonUserPrivateFragment, -} from '~/gql/graphql' - -interface UnblockUserButtonProps { - user: Partial -} - -const fragments = { - user: { - private: gql` - fragment UnblockUserButtonUserPrivate on User { - id - isBlocked - } - `, - }, -} - -export const UnblockUserButton = ({ user }: UnblockUserButtonProps) => { - const [unblockUser] = useMutation( - TOGGLE_BLOCK_USER, - { - variables: { id: user.id, enabled: false }, - optimisticResponse: !_isNil(user.id) - ? { - toggleBlockUser: { - id: user.id, - isBlocked: false, - __typename: 'User', - }, - } - : undefined, - } - ) - - return ( - - ) -} - -UnblockUserButton.fragments = fragments diff --git a/src/components/Buttons/UniversalAuth/index.tsx b/src/components/Buttons/UniversalAuth/index.tsx index 29abb8c3b2..5c9770a8b8 100644 --- a/src/components/Buttons/UniversalAuth/index.tsx +++ b/src/components/Buttons/UniversalAuth/index.tsx @@ -18,8 +18,9 @@ export const UniversalAuthButton: React.FC = () => { window.dispatchEvent(new CustomEvent(OPEN_UNIVERSAL_AUTH_DIALOG)) }, } + const smProps = { - ...appendTarget(PATHS.SIGNUP, true), + ...appendTarget(PATHS.LOGIN, true), onClick: () => { analytics.trackEvent('click_button', { type: 'login/signup', diff --git a/src/components/Buttons/ViewAll/index.tsx b/src/components/Buttons/ViewAll/index.tsx index fd8d640f3f..319caa2a75 100644 --- a/src/components/Buttons/ViewAll/index.tsx +++ b/src/components/Buttons/ViewAll/index.tsx @@ -14,7 +14,7 @@ export const ViewAllButton: React.FC = ({ ...props }) => { {...props} > - + ) diff --git a/src/components/Buttons/Write/index.tsx b/src/components/Buttons/Write/index.tsx index 4b9151bf06..6da1a7f93e 100644 --- a/src/components/Buttons/Write/index.tsx +++ b/src/components/Buttons/Write/index.tsx @@ -1,23 +1,24 @@ -import { useRouter } from 'next/router' import { useContext } from 'react' +import { FormattedMessage } from 'react-intl' import { + ERROR_CODES, OPEN_LIKE_COIN_DIALOG, OPEN_UNIVERSAL_AUTH_DIALOG, + PATHS, UNIVERSAL_AUTH_SOURCE, } from '~/common/enums' -import { analytics, toPath, translate } from '~/common/utils' +import { analytics, translate } from '~/common/utils' import { Button, + ButtonProps, + ERROR_MESSAGES, IconNavCreate32, LanguageContext, toast, Tooltip, - Translate, - useMutation, + useRoute, } from '~/components' -import CREATE_DRAFT from '~/components/GQL/mutations/createDraft' -import { CreateDraftMutation } from '~/gql/graphql' interface Props { allowed: boolean @@ -25,12 +26,7 @@ interface Props { forbidden?: boolean } -const BaseWriteButton = ({ - onClick, -}: { - onClick: () => any - loading?: boolean -}) => { +const BaseWriteButton = (props: ButtonProps) => { const { lang } = useContext(LanguageContext) return ( @@ -42,8 +38,8 @@ const BaseWriteButton = ({ @@ -52,13 +48,8 @@ const BaseWriteButton = ({ } export const WriteButton = ({ allowed, authed, forbidden }: Props) => { - const router = useRouter() - const [putDraft, { loading }] = useMutation( - CREATE_DRAFT, - { - variables: { title: '' }, - } - ) + const { isInPath } = useRoute() + const isInDraftDetail = isInPath('ME_DRAFT_DETAIL') if (!allowed) { return ( @@ -72,6 +63,14 @@ export const WriteButton = ({ allowed, authed, forbidden }: Props) => { return ( { if (!authed) { window.dispatchEvent( @@ -84,24 +83,18 @@ export const WriteButton = ({ allowed, authed, forbidden }: Props) => { if (forbidden) { toast.error({ - message: , + message: ( + + ), }) return } - analytics.trackEvent('click_button', { - type: 'write', - }) - const result = await putDraft() - const { slug = '', id } = result?.data?.putDraft || {} - - if (id) { - const path = toPath({ page: 'draftDetail', slug, id }) - router.push(path.href) - } + analytics.trackEvent('click_button', { type: 'write' }) }} - loading={loading} /> ) } diff --git a/src/components/Buttons/index.tsx b/src/components/Buttons/index.tsx index 0471d50292..55b6f0c0f1 100644 --- a/src/components/Buttons/index.tsx +++ b/src/components/Buttons/index.tsx @@ -1,6 +1,5 @@ export * from './BackToHome' export * from './Bookmark' -export * from './ConnectWallet' export * from './CopyButton' export * from './DonationButton' export * from './FollowUser' @@ -9,7 +8,6 @@ export * from './Login' export * from './Share' export * from './Shuffle' export * from './SignUp' -export * from './UnblockUser' export * from './UniversalAuth' export * from './ViewAll' export * from './ViewMore' diff --git a/src/components/CircleDigest/Price/index.tsx b/src/components/CircleDigest/Price/index.tsx index 92c3287106..af85acbcd5 100644 --- a/src/components/CircleDigest/Price/index.tsx +++ b/src/components/CircleDigest/Price/index.tsx @@ -103,7 +103,7 @@ const Price = ({ circle, onClick }: PriceProps) => { > {price.amount} {price.currency} / - + ) diff --git a/src/components/CircleDigest/UserProfile/index.tsx b/src/components/CircleDigest/UserProfile/index.tsx index 091ec66117..8db13527a8 100644 --- a/src/components/CircleDigest/UserProfile/index.tsx +++ b/src/components/CircleDigest/UserProfile/index.tsx @@ -39,6 +39,7 @@ const UserProfile = ({ {!hasDescription && !hasFooter && ( )} @@ -57,6 +58,7 @@ const UserProfile = ({ diff --git a/src/components/ClientUpdater/index.tsx b/src/components/ClientUpdater/index.tsx index 1e5627b6b4..574cffffc0 100644 --- a/src/components/ClientUpdater/index.tsx +++ b/src/components/ClientUpdater/index.tsx @@ -3,12 +3,7 @@ import differenceInDays from 'date-fns/differenceInDays' import parseISO from 'date-fns/parseISO' import { useContext, useEffect, useRef } from 'react' -import { - ONBOARDING_TASKS_HIDE, - STORAGE_KEY_ONBOARDING_TASKS, -} from '~/common/enums' -import { storage } from '~/common/utils' -import { useEventListener, useRoute, ViewerContext } from '~/components' +import { useRoute, ViewerContext } from '~/components' export const ClientUpdater = () => { const { router, isInPath, setQuery } = useRoute() @@ -42,57 +37,6 @@ export const ClientUpdater = () => { return () => router.events.off('routeChangeComplete', routeChangeComplete) }, []) - /** - * Onboarding Tasks - */ - useEffect(() => { - if (!viewer.id) { - return - } - - let storedOnboardingTasks = storage.get(STORAGE_KEY_ONBOARDING_TASKS) - const isSameViewer = storedOnboardingTasks?.viewerId === viewer.id - - // Store init tasks state into local storage - if (!storedOnboardingTasks || !isSameViewer) { - storedOnboardingTasks = { - // mark `enabled` as `false` if viewer has finished all tasks. - enabled: !viewer.onboardingTasks.finished, - } - storage.set(STORAGE_KEY_ONBOARDING_TASKS, { - ...storedOnboardingTasks, - viewerId: viewer.id, - }) - } - - client.writeData({ - id: 'ClientPreference:local', - data: { - onboardingTasks: { - __typename: 'OnboardingTasks', - ...storedOnboardingTasks, - }, - }, - }) - }, [viewer.id]) - - // hide tasks - useEventListener(ONBOARDING_TASKS_HIDE, () => { - const storedOnboardingTasks = storage.get(STORAGE_KEY_ONBOARDING_TASKS) - - storage.set(STORAGE_KEY_ONBOARDING_TASKS, { - ...storedOnboardingTasks, - enabled: false, - }) - - client.writeData({ - id: 'ClientPreference:local', - data: { - onboardingTasks: { __typename: 'OnboardingTasks', enabled: false }, - }, - }) - }) - /** * Change specific new user's home feed. */ diff --git a/src/components/CollectionDigest/DropdownActions/DeleteCollection/Button.tsx b/src/components/CollectionDigest/DropdownActions/DeleteCollection/Button.tsx index 8f2635884f..9b21dd91ef 100644 --- a/src/components/CollectionDigest/DropdownActions/DeleteCollection/Button.tsx +++ b/src/components/CollectionDigest/DropdownActions/DeleteCollection/Button.tsx @@ -5,7 +5,7 @@ import { IconTrash20, Menu } from '~/components' const DeleteCollectionButton = ({ openDialog }: { openDialog: () => void }) => { return ( } + text={} icon={} onClick={openDialog} ariaHasPopup="dialog" diff --git a/src/components/CollectionDigest/DropdownActions/DeleteCollection/Dialog.tsx b/src/components/CollectionDigest/DropdownActions/DeleteCollection/Dialog.tsx index 8b98514099..e3f560ef53 100644 --- a/src/components/CollectionDigest/DropdownActions/DeleteCollection/Dialog.tsx +++ b/src/components/CollectionDigest/DropdownActions/DeleteCollection/Dialog.tsx @@ -11,15 +11,11 @@ import { useRoute, ViewerContext, } from '~/components' -import { - updateUserArticles, - updateUserCollections, - updateUserProfile, -} from '~/components/GQL' +import { updateUserArticles, updateUserCollections } from '~/components/GQL' import { DeleteCollectionCollectionFragment, DeleteCollectionMutation, - ViewerArticleCountQuery, + ViewerTabsCountQuery, } from '~/gql/graphql' const DELETE_COLLECTION = gql` @@ -28,13 +24,16 @@ const DELETE_COLLECTION = gql` } ` -const VIEWER_ARTICLE_COUNT = gql` - query ViewerArticleCount { +const VIEWER_TABS_COUNT = gql` + query ViewerTabsCount { viewer { id status { articleCount } + collections(input: { first: 0 }) { + totalCount + } } } ` @@ -63,7 +62,7 @@ const DeleteCollectionDialog = ({ setStep('delete') }, 1000) } - + const { USER_PROFILE_PUBLIC } = require('~/views/User/UserProfile/gql') const [deleteCollection, { loading, client }] = useMutation(DELETE_COLLECTION, { variables: { id: collection.id }, @@ -81,24 +80,32 @@ const DeleteCollectionDialog = ({ type: 'delete', }) - const result = updateUserProfile({ - cache, - userName: collection.author.userName!, - type: 'decreaseCollection', - }) - if (result?.collectionCount === 0) { - onEmptyCollection() - } + // FIXME: Why not update user profile tab collection count? + // const result = updateUserProfile({ + // cache, + // userName: collection.author.userName!, + // type: 'decreaseCollection', + // }) + onEmptyCollection() }, + refetchQueries: [ + { + query: USER_PROFILE_PUBLIC, + variables: { userName: collection.author.userName }, + }, + ], }) const onEmptyCollection = async () => { - const result = await client?.query({ - query: VIEWER_ARTICLE_COUNT, + const result = await client?.query({ + query: VIEWER_TABS_COUNT, fetchPolicy: 'network-only', }) - if (result?.data.viewer?.status?.articleCount === 0) + if ( + result?.data.viewer?.status?.articleCount === 0 && + result.data.viewer?.collections.totalCount === 0 + ) router.push( toPath({ page: 'userProfile', userName: viewer.userName || '' }).href ) @@ -111,6 +118,7 @@ const DeleteCollectionDialog = ({ message: ( ), @@ -131,7 +139,9 @@ const DeleteCollectionDialog = ({

} + title={ + + } /> @@ -139,6 +149,7 @@ const DeleteCollectionDialog = ({

{collection.title} @@ -146,12 +157,18 @@ const DeleteCollectionDialog = ({ }} />
- +

)} {isInConfirmDelete && (

- +

)}
@@ -161,7 +178,7 @@ const DeleteCollectionDialog = ({ closeDialog={closeDialog} btns={ } + text={} color="red" onClick={() => { setStep('confirmDelete') @@ -170,7 +187,7 @@ const DeleteCollectionDialog = ({ } smUpBtns={ } + text={} color="red" onClick={() => { setStep('confirmDelete') @@ -185,7 +202,12 @@ const DeleteCollectionDialog = ({ closeDialog={closeDialog} btns={ } + text={ + + } color={loading ? 'green' : 'red'} onClick={async () => { await onDelete() @@ -196,7 +218,12 @@ const DeleteCollectionDialog = ({ } smUpBtns={ } + text={ + + } color={loading ? 'green' : 'red'} onClick={async () => { await onDelete() diff --git a/src/components/CollectionDigest/DropdownActions/EditCollection/Button.tsx b/src/components/CollectionDigest/DropdownActions/EditCollection/Button.tsx index 8c77e242b4..e4a6d3c7ab 100644 --- a/src/components/CollectionDigest/DropdownActions/EditCollection/Button.tsx +++ b/src/components/CollectionDigest/DropdownActions/EditCollection/Button.tsx @@ -5,7 +5,7 @@ import { IconEdit20, Menu } from '~/components' const EditCollectionButton = ({ openDialog }: { openDialog: () => void }) => { return ( } + text={} icon={} onClick={openDialog} ariaHasPopup="dialog" diff --git a/src/components/CollectionDigest/DropdownActions/EditCollection/Dialog/Content.tsx b/src/components/CollectionDigest/DropdownActions/EditCollection/Dialog/Content.tsx index 79166f84c7..2affd362be 100644 --- a/src/components/CollectionDigest/DropdownActions/EditCollection/Dialog/Content.tsx +++ b/src/components/CollectionDigest/DropdownActions/EditCollection/Dialog/Content.tsx @@ -71,6 +71,7 @@ const EditCollectionDialogContent: React.FC = ({ if (!value) { return intl.formatMessage({ defaultMessage: 'Required', + id: 'Seanpx', }) } } @@ -149,6 +150,7 @@ const EditCollectionDialogContent: React.FC = ({ required placeholder={intl.formatMessage({ defaultMessage: 'Collection name', + id: 'A6ozr9', })} value={values.title} hint={`${values.title.length}/${MAX_COLLECTION_TITLE_LENGTH}`} @@ -165,6 +167,7 @@ const EditCollectionDialogContent: React.FC = ({ name="description" placeholder={intl.formatMessage({ defaultMessage: 'Description', + id: 'Q8Qw5B', })} maxLength={MAX_COLLECTION_DESCRIPTION_LENGTH} value={values.description} @@ -182,7 +185,7 @@ const EditCollectionDialogContent: React.FC = ({ type="submit" form={formId} disabled={isSubmitting || coverLoading} - text={} + text={} loading={isSubmitting || coverLoading} /> ) @@ -190,7 +193,9 @@ const EditCollectionDialogContent: React.FC = ({ return ( <> } + title={ + + } closeDialog={closeDialog} rightBtn={SubmitButton} /> @@ -201,7 +206,7 @@ const EditCollectionDialogContent: React.FC = ({ smUpBtns={ <> } + text={} color="greyDarker" onClick={closeDialog} /> diff --git a/src/components/CollectionDigest/DropdownActions/PinButton.tsx b/src/components/CollectionDigest/DropdownActions/PinButton.tsx index 673072b3a1..3fcb999220 100644 --- a/src/components/CollectionDigest/DropdownActions/PinButton.tsx +++ b/src/components/CollectionDigest/DropdownActions/PinButton.tsx @@ -59,15 +59,20 @@ const PinButton = ({ onCompleted: () => { toast.success({ message: collection.pinned ? ( - + ) : ( - + ), actions: collection.pinned ? undefined : [ { - content: , + content: ( + + ), href: toPath({ page: 'userProfile', userName: collection.author.userName!, @@ -81,7 +86,10 @@ const PinButton = ({ toastType: 'success', customErrors: { [ERROR_CODES.ACTION_LIMIT_EXCEEDED]: ( - + ), }, } @@ -93,11 +101,13 @@ const PinButton = ({ collection.pinned ? ( ) : ( ) diff --git a/src/components/CollectionDigest/DropdownActions/index.tsx b/src/components/CollectionDigest/DropdownActions/index.tsx index 702b181915..5cd839b219 100644 --- a/src/components/CollectionDigest/DropdownActions/index.tsx +++ b/src/components/CollectionDigest/DropdownActions/index.tsx @@ -1,13 +1,15 @@ import { useContext } from 'react' +import { FormattedMessage } from 'react-intl' +import { ERROR_CODES } from '~/common/enums' import { translate } from '~/common/utils' import { Dropdown, + ERROR_MESSAGES, IconMore16, LanguageContext, Menu, toast, - Translate, ViewerContext, } from '~/components' import { DropdownActionsCollectionFragment } from '~/gql/graphql' @@ -71,7 +73,9 @@ const DropdownActions = (props: DropdownActionsProps) => { const forbid = () => { toast.error({ - message: , + message: ( + + ), }) } diff --git a/src/components/CollectionDigest/Feed/index.tsx b/src/components/CollectionDigest/Feed/index.tsx index 0401141d41..efdc4ce88e 100644 --- a/src/components/CollectionDigest/Feed/index.tsx +++ b/src/components/CollectionDigest/Feed/index.tsx @@ -62,6 +62,7 @@ const BaseCollectionDigestFeed = ({

@@ -79,6 +80,7 @@ const BaseCollectionDigestFeed = ({ @@ -91,6 +93,7 @@ const BaseCollectionDigestFeed = ({ , @@ -119,7 +122,7 @@ type MemoizedCollectionDigestFeed = React.MemoExoticComponent< fragments: typeof fragments } -const CollectionDigestFeed = React.memo( +export const CollectionDigestFeed = React.memo( BaseCollectionDigestFeed, ({ collection: prevCollection }, { collection }) => { return ( @@ -134,5 +137,3 @@ const CollectionDigestFeed = React.memo( CollectionDigestFeed.Placeholder = Placeholder CollectionDigestFeed.fragments = fragments - -export default CollectionDigestFeed diff --git a/src/components/CollectionDigest/index.tsx b/src/components/CollectionDigest/index.tsx index fc19bf9a1e..f1fc7420e6 100644 --- a/src/components/CollectionDigest/index.tsx +++ b/src/components/CollectionDigest/index.tsx @@ -1,5 +1 @@ -import Feed from './Feed' - -export const CollectionDigest = { - Feed, -} +export * from './Feed' diff --git a/src/components/Comment/DropdownActions/CollapseComment/Button.tsx b/src/components/Comment/DropdownActions/CollapseComment/Button.tsx index cf76019e31..dc2cdda324 100644 --- a/src/components/Comment/DropdownActions/CollapseComment/Button.tsx +++ b/src/components/Comment/DropdownActions/CollapseComment/Button.tsx @@ -8,6 +8,7 @@ const CollapseCommentButton = ({ openDialog }: { openDialog: () => void }) => { text={ } diff --git a/src/components/Comment/DropdownActions/CollapseComment/Dialog.tsx b/src/components/Comment/DropdownActions/CollapseComment/Dialog.tsx index b49df6426d..39e37ea423 100644 --- a/src/components/Comment/DropdownActions/CollapseComment/Dialog.tsx +++ b/src/components/Comment/DropdownActions/CollapseComment/Dialog.tsx @@ -94,7 +94,7 @@ const CollapseCommentDialog = ({ closeDialog={closeDialog} btns={ } + text={} color="red" onClick={() => { onCollapse() @@ -104,7 +104,7 @@ const CollapseCommentDialog = ({ } smUpBtns={ } + text={} color="red" onClick={() => { onCollapse() diff --git a/src/components/Comment/DropdownActions/DeleteComment/Button.tsx b/src/components/Comment/DropdownActions/DeleteComment/Button.tsx index d5f5bf2877..241e97f366 100644 --- a/src/components/Comment/DropdownActions/DeleteComment/Button.tsx +++ b/src/components/Comment/DropdownActions/DeleteComment/Button.tsx @@ -5,7 +5,7 @@ import { IconRemove24, Menu } from '~/components' const DeleteCommentButton = ({ openDialog }: { openDialog: () => void }) => { return ( } + text={} icon={} onClick={openDialog} ariaHasPopup="dialog" diff --git a/src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx b/src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx index af0f19dd1b..a4c77dbac6 100644 --- a/src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx +++ b/src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx @@ -59,6 +59,7 @@ const DeleteCommentDialog = ({ message: ( } + text={} color="red" onClick={() => { onDelete() @@ -111,7 +114,7 @@ const DeleteCommentDialog = ({ } smUpBtns={ } + text={} color="red" onClick={() => { onDelete() diff --git a/src/components/Comment/DropdownActions/EditButton.tsx b/src/components/Comment/DropdownActions/EditButton.tsx index 7f7d25cfff..ff410cd774 100644 --- a/src/components/Comment/DropdownActions/EditButton.tsx +++ b/src/components/Comment/DropdownActions/EditButton.tsx @@ -12,6 +12,7 @@ const EditButton = ({ openEditCommentDialog }: EditButtonProps) => { text={ } diff --git a/src/components/Comment/DropdownActions/PinButton.tsx b/src/components/Comment/DropdownActions/PinButton.tsx index df081f59eb..c9b76b7127 100644 --- a/src/components/Comment/DropdownActions/PinButton.tsx +++ b/src/components/Comment/DropdownActions/PinButton.tsx @@ -108,11 +108,13 @@ const PinButton = ({ circle ? ( ) : ( ) @@ -132,11 +134,13 @@ const PinButton = ({ circle ? ( ) : ( ) diff --git a/src/components/Comment/DropdownActions/index.tsx b/src/components/Comment/DropdownActions/index.tsx index fb7e3d967d..fde0e902ba 100644 --- a/src/components/Comment/DropdownActions/index.tsx +++ b/src/components/Comment/DropdownActions/index.tsx @@ -2,18 +2,20 @@ import gql from 'graphql-tag' import _isEmpty from 'lodash/isEmpty' import _pickBy from 'lodash/pickBy' import { useContext } from 'react' +import { FormattedMessage } from 'react-intl' +import { ERROR_CODES } from '~/common/enums' import { translate } from '~/common/utils' import { Button, CommentFormDialog, CommentFormType, Dropdown, + ERROR_MESSAGES, IconMore16, LanguageContext, Menu, toast, - Translate, ViewerContext, } from '~/components' import { BlockUser } from '~/components/BlockUser' @@ -213,7 +215,9 @@ const DropdownActions = (props: DropdownActionsProps) => { const forbid = () => { toast.error({ - message: , + message: ( + + ), }) } diff --git a/src/components/Comment/FooterActions/index.tsx b/src/components/Comment/FooterActions/index.tsx index 0bfc714194..3e55b128d9 100644 --- a/src/components/Comment/FooterActions/index.tsx +++ b/src/components/Comment/FooterActions/index.tsx @@ -1,13 +1,14 @@ import gql from 'graphql-tag' import { useContext } from 'react' +import { FormattedMessage } from 'react-intl' -import { OPEN_LIKE_COIN_DIALOG, TextId } from '~/common/enums' +import { ERROR_CODES, OPEN_LIKE_COIN_DIALOG } from '~/common/enums' import { translate } from '~/common/utils' import { CommentFormType, + ERROR_MESSAGES, LanguageContext, toast, - Translate, ViewerContext, } from '~/components' import { @@ -108,24 +109,30 @@ const BaseFooterActions = ({ const isActive = state === 'active' const isCollapsed = state === 'collapsed' const isDisabled = disabled || (!isActive && !isCollapsed) - const addToast = (id: TextId) => { + const forbid = () => toast.error({ - message: , + message: ( + + ), }) - } - const forbid = () => addToast('FORBIDDEN_BY_STATE') let onClick if (viewer.shouldSetupLikerID) { onClick = () => window.dispatchEvent(new CustomEvent(OPEN_LIKE_COIN_DIALOG, {})) - } else if (viewer.isOnboarding && targetAuthor?.id !== viewer.id) { - onClick = () => addToast('failureCommentOnboarding') } else if (viewer.isArchived || viewer.isFrozen) { onClick = forbid } else if (targetAuthor?.isBlocking) { - onClick = () => addToast('failureCommentBlocked') + onClick = () => + toast.error({ + message: ( + + ), + }) } const buttonProps = { diff --git a/src/components/Context/Turnstile/container.tsx b/src/components/Context/Turnstile/container.tsx new file mode 100644 index 0000000000..a6c1d69ce2 --- /dev/null +++ b/src/components/Context/Turnstile/container.tsx @@ -0,0 +1,21 @@ +import type { ComponentPropsWithoutRef, ElementType, ForwardedRef } from 'react' +import { forwardRef } from 'react' + +type Props = { + as?: Tag +} & ComponentPropsWithoutRef + +type ComponentProps = + Tag extends keyof JSX.IntrinsicElements + ? Props // @typescript-eslint/no-explicit-any + : // eslint-disable-next-line + Props + +const Component = ( + { as: Element = 'div', ...props }: ComponentProps, + ref: ForwardedRef +) => { + return +} + +export default forwardRef(Component) diff --git a/src/components/Context/Turnstile/index.ts b/src/components/Context/Turnstile/index.ts new file mode 100644 index 0000000000..c98623ccdf --- /dev/null +++ b/src/components/Context/Turnstile/index.ts @@ -0,0 +1,19 @@ +// mostly are MIT License code from +// https://github.com/marsidev/react-turnstile/tree/main/packages/lib/src +// after migrated to React 18, this directory can be dropped to use `@marsidev/react-turnstile` instead + +export * from './lib' +export type { + TurnstileInstance, + TurnstileLangCode, + TurnstileProps, + TurnstileServerValidationErrorCode, + TurnstileServerValidationResponse, + TurnstileTheme, +} from './types' +export { + DEFAULT_CONTAINER_ID as TURNSTILE_DEFAULT_CONTAINER_ID, + DEFAULT_ONLOAD_NAME as TURNSTILE_DEFAULT_ONLOAD_NAME, + DEFAULT_SCRIPT_ID as TURNSTILE_DEFAULT_SCRIPT_ID, + SCRIPT_URL as TURNSTILE_SCRIPT_URL, +} from './utils' diff --git a/src/components/Context/Turnstile/lib.tsx b/src/components/Context/Turnstile/lib.tsx new file mode 100644 index 0000000000..dc29d2be25 --- /dev/null +++ b/src/components/Context/Turnstile/lib.tsx @@ -0,0 +1,304 @@ +import { + forwardRef, + useEffect, + useImperativeHandle, + useMemo, + useRef, + useState, +} from 'react' + +import Container from './container' +import { RenderOptions, TurnstileInstance, TurnstileProps } from './types' +import useObserveScript from './use-observe-script' +import { + checkElementExistence, + CONTAINER_STYLE_SET, + DEFAULT_CONTAINER_ID, + DEFAULT_ONLOAD_NAME, + DEFAULT_SCRIPT_ID, + getTurnstileSizeOpts, + injectTurnstileScript, +} from './utils' + +export const Turnstile = forwardRef< + TurnstileInstance | undefined, + TurnstileProps +>((props, ref) => { + const { + scriptOptions, + options = {}, + siteKey, + onSuccess, + onExpire, + onError, + onBeforeInteractive, + onAfterInteractive, + onUnsupported, + id, + style, + as = 'div', + injectScript = true, + ...divProps + } = props + const widgetSize = options.size ?? 'normal' + + const [containerStyle, setContainerStyle] = useState( + options.execution === 'execute' + ? CONTAINER_STYLE_SET.invisible + : options.appearance === 'interaction-only' + ? CONTAINER_STYLE_SET.interactionOnly + : CONTAINER_STYLE_SET[widgetSize] + ) + const containerRef = useRef(null) + const firstRendered = useRef(false) + const [widgetId, setWidgetId] = useState() + const [turnstileLoaded, setTurnstileLoaded] = useState(false) + const containerId = id ?? DEFAULT_CONTAINER_ID + const scriptId = injectScript + ? scriptOptions?.id || `${DEFAULT_SCRIPT_ID}__${containerId}` + : scriptOptions?.id || DEFAULT_SCRIPT_ID + const scriptLoaded = useObserveScript(scriptId) + + const onLoadCallbackName = scriptOptions?.onLoadCallbackName + ? `${scriptOptions.onLoadCallbackName}__${containerId}` + : `${DEFAULT_ONLOAD_NAME}__${containerId}` + + const renderConfig = useMemo( + (): RenderOptions => ({ + sitekey: siteKey, + action: options.action, + cData: options.cData, + callback: onSuccess, + 'error-callback': onError, + 'expired-callback': onExpire, + 'before-interactive-callback': onBeforeInteractive, + 'after-interactive-callback': onAfterInteractive, + 'unsupported-callback': onUnsupported, + theme: options.theme ?? 'auto', + language: options.language ?? 'auto', + tabindex: options.tabIndex, + 'response-field': options.responseField, + 'response-field-name': options.responseFieldName, + size: getTurnstileSizeOpts(widgetSize), + retry: options.retry ?? 'auto', + 'retry-interval': options.retryInterval ?? 8000, + 'refresh-expired': options.refreshExpired ?? 'auto', + execution: options.execution ?? 'render', + appearance: options.appearance ?? 'always', + }), + [ + siteKey, + options, + onSuccess, + onError, + onExpire, + widgetSize, + onBeforeInteractive, + onAfterInteractive, + onUnsupported, + ] + ) + + const renderConfigStringified = useMemo( + () => JSON.stringify(renderConfig), + [renderConfig] + ) + + useImperativeHandle( + ref, + () => { + if (typeof window === 'undefined' || !scriptLoaded) { + return + } + + const { turnstile } = window + return { + getResponse() { + if (!turnstile?.getResponse || !widgetId) { + console.warn('Turnstile has not been loaded') + return + } + + return turnstile.getResponse(widgetId) + }, + + reset() { + if (!turnstile?.reset || !widgetId) { + console.warn('Turnstile has not been loaded') + return + } + + if (options.execution === 'execute') { + setContainerStyle(CONTAINER_STYLE_SET.invisible) + } + + try { + turnstile.reset(widgetId) + } catch (error) { + console.warn(`Failed to reset Turnstile widget ${widgetId}`, error) + } + }, + + remove() { + if (!turnstile?.remove || !widgetId) { + console.warn('Turnstile has not been loaded') + return + } + + setWidgetId('') + setContainerStyle(CONTAINER_STYLE_SET.invisible) + turnstile.remove(widgetId) + }, + + render() { + if (!turnstile?.render || !containerRef.current || widgetId) { + console.warn( + 'Turnstile has not been loaded or widget already rendered' + ) + return + } + + const id = turnstile.render(containerRef.current, renderConfig) + setWidgetId(id) + + if (options.execution !== 'execute') { + setContainerStyle(CONTAINER_STYLE_SET[widgetSize]) + } + + return id + }, + + execute() { + if (options.execution !== 'execute') { + return + } + + if (!turnstile?.execute || !containerRef.current || !widgetId) { + console.warn( + 'Turnstile has not been loaded or widget has not been rendered' + ) + return + } + + turnstile.execute(containerRef.current, renderConfig) + setContainerStyle(CONTAINER_STYLE_SET[widgetSize]) + }, + } + }, + [ + scriptLoaded, + widgetId, + options.execution, + widgetSize, + renderConfig, + containerRef, + ] + ) + + useEffect(() => { + // @ts-expect-error implicit any + window[onLoadCallbackName] = () => setTurnstileLoaded(true) + + return () => { + // @ts-expect-error implicit any + delete window[onLoadCallbackName] + } + }, [onLoadCallbackName]) + + useEffect(() => { + if (injectScript && !turnstileLoaded) { + injectTurnstileScript({ + onLoadCallbackName, + scriptOptions: { + ...scriptOptions, + id: scriptId, + }, + }) + } + }, [ + injectScript, + turnstileLoaded, + onLoadCallbackName, + scriptOptions, + scriptId, + ]) + + /* Set the turnstile as loaded, in case the onload callback never runs. (e.g., when manually injecting the script without specifying the `onload` param) */ + useEffect(() => { + if (scriptLoaded && !turnstileLoaded && window.turnstile) { + setTurnstileLoaded(true) + } + }, [turnstileLoaded, scriptLoaded]) + + useEffect(() => { + if (!siteKey) { + console.warn('sitekey was not provided') + return + } + + if ( + !scriptLoaded || + !containerRef.current || + !turnstileLoaded || + firstRendered.current + ) { + return + } + + const id = window.turnstile!.render(containerRef.current, renderConfig) + setWidgetId(id) + firstRendered.current = true + }, [scriptLoaded, siteKey, renderConfig, firstRendered, turnstileLoaded]) + + // re-render widget when renderConfig changes + useEffect(() => { + if (!window.turnstile) return + + if (containerRef.current && widgetId) { + if (checkElementExistence(widgetId)) { + window.turnstile.remove(widgetId) + } + const newWidgetId = window.turnstile.render( + containerRef.current, + renderConfig + ) + setWidgetId(newWidgetId) + firstRendered.current = true + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [renderConfigStringified, siteKey]) + + useEffect(() => { + if (!window.turnstile) return + if (!widgetId) return + if (!checkElementExistence(widgetId)) return + + return () => { + window.turnstile!.remove(widgetId) + } + }, [widgetId]) + + useEffect(() => { + setContainerStyle( + options.execution === 'execute' + ? CONTAINER_STYLE_SET.invisible + : renderConfig.appearance === 'interaction-only' + ? CONTAINER_STYLE_SET.interactionOnly + : CONTAINER_STYLE_SET[widgetSize] + ) + }, [options.execution, widgetSize, renderConfig.appearance]) + + return ( + + ) +}) + +Turnstile.displayName = 'Turnstile' + +export default Turnstile diff --git a/src/components/Context/Turnstile/types.ts b/src/components/Context/Turnstile/types.ts new file mode 100644 index 0000000000..1eef131232 --- /dev/null +++ b/src/components/Context/Turnstile/types.ts @@ -0,0 +1,428 @@ +declare global { + interface Window { + turnstile?: _Turnstile + } +} + +/* Available methods in the turnstile instance. */ +interface _Turnstile { + /** + * Method to explicit render a widget. + * @param container - Element ID or HTML node element. + * @param params - Optional. Render parameter options. See {@link https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#configurations the docs} for more info about this options. + * @returns The rendered widget ID. + */ + render: ( + container?: string | HTMLElement, + params?: RenderOptions + ) => string | undefined + + /** + * Method to render a widget when `execution` is set to `'execute'`. This method should be called after the `.render()` method. If `execution` is set to `'render'` this method has no effect. + * @param container - Element ID or HTML node element. + * @param params - Optional. Render parameter options. See {@link https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#configurations the docs} for more info about this options. + */ + execute: (container?: string | HTMLElement, params?: RenderOptions) => void + + /** + * Method to reset a widget. + * @param id - Optional. ID of the widget to reset, if not provided will target the last rendered widget. + */ + reset: (id?: string) => void + + /** + * Method to remove a widget. + * @param id - Optional. ID of the widget to remove, if not provided will target the last rendered widget. + */ + remove: (id?: string) => void + + /** + * Method to get the token of a widget. + * @param id - Optional. ID of the widget to get the token from, if not provided will target the last rendered widget. + * @returns The token response. + */ + getResponse: (id?: string) => string | undefined +} + +/* Same as _Turnstile but without custom widget IDs. */ +interface TurnstileInstance { + /** + * Method to explicit render a widget. + * @returns The rendered widget ID. + */ + render: () => string | undefined + + /** + * Method to render a widget when `options.execution` is set to `'execute'`. This method should be called after the `.render()` method. If `options.execution` is set to `'render'` this method has no effect. + */ + execute: () => void + + /** + * Method to reset the current rendered widget. + */ + reset: () => void + + /** + * Method to remove the current rendered widget. + */ + remove: () => void + + /** + * Method to get the token of the current rendered widget. + * @returns The token response. + */ + getResponse: () => string | undefined +} + +interface RenderOptions { + /** + * The sitekey of your widget. This sitekey is created upon the widget creation. + */ + sitekey: string + + /** + * A customer value that can be used to differentiate widgets under the same sitekey in analytics and which is returned upon validation. This can only contain up to 32 alphanumeric characters including _ and -. + * @default undefined + */ + action?: string + + /** + * A customer payload that can be used to attach customer data to the challenge throughout its issuance and which is returned upon validation. This can only contain up to 255 alphanumeric characters including _ and -. + * @default undefined + */ + cData?: string + + /** + * Callback invoked upon success of the challenge. The callback is passed a token that can be validated. + * @param token - Token response. + */ + callback?: (token: string) => void + + /** + * Callback invoked when there is an error (e.g. network error or the challenge failed). + */ + 'error-callback'?: () => void + + /** + * Execution controls when to obtain the token of the widget and can be on `'render'` (default) or on `'execute'`. See {@link https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#execution-modes the docs} for more info. + */ + execution?: 'render' | 'execute' + + /** + * Callback invoked when a challenge expires and does not reset the widget. + */ + 'expired-callback'?: () => void + + /** + * Callback invoked before the challenge enters interactive mode. + */ + 'before-interactive-callback'?: () => void + + /** + * Callback invoked when challenge has left interactive mode. + */ + 'after-interactive-callback'?: () => void + + /** + * Callback invoked when a given client/browser is not supported by Turnstile. + */ + 'unsupported-callback'?: () => void + + /** + * The widget theme. This can be forced to light or dark by setting the theme accordingly. + * + * @default `auto` + */ + theme?: TurnstileTheme + + /** + * Language to display, must be either: `auto` (default) to use the language that the visitor has chosen, or an ISO 639-1 two-letter language code (e.g. `en`). + * @default `auto` + */ + language?: 'auto' | TurnstileLangCode | (string & Record) + + /** + * The tabindex of Turnstile’s iframe for accessibility purposes. + * @default 0 + */ + tabindex?: number + + /** + * A boolean that controls if an input element with the response token is created. + * @default true + */ + 'response-field'?: boolean + + /** + * Name of the input element. + * @default `cf-turnstile-response` + */ + 'response-field-name'?: string + + /** + * The widget size. Can take the following values: `normal`, `compact`. The normal size is 300x65px, the compact size is 130x120px. + * @default `normal` + */ + size?: 'normal' | 'compact' + + /** + * Controls whether the widget should automatically retry to obtain a token if it did not succeed. The default is `'auto'`, which will retry automatically. This can be set to `'never'` to disable retry upon failure. + * @default `auto` + */ + retry?: 'auto' | 'never' + + /** + * When `retry` is set to `'auto'`, `retry-interval` controls the time between retry attempts in milliseconds. The value must be a positive integer less than `900000`. When `retry` is set to `'never'`, this parameter has no effect. + * @default 8000 + */ + 'retry-interval'?: number + + /** + * Automatically refreshes the token when it expires. Can take `'auto'`, `'manual'` or `'never'`. + * @default `auto` + */ + 'refresh-expired'?: 'auto' | 'manual' | 'never' + + /** + * Appearance controls when the widget is visible. It can be `'always'` (default), `'execute'`, or `'interaction-only'`. See {@link https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#appearance-modes the docs} for more info. + */ + appearance?: 'always' | 'execute' | 'interaction-only' +} + +/** Props needed for the `options` prop in the `` component. */ +interface ComponentRenderOptions + extends Pick< + RenderOptions, + | 'action' + | 'cData' + | 'theme' + | 'retry' + | 'language' + | 'execution' + | 'appearance' + > { + /** + * The tabindex of Turnstile’s iframe for accessibility purposes. + * @default 0 + */ + tabIndex?: RenderOptions['tabindex'] + + /** + * A boolean that controls if an input element with the response token is created. + * @default true + */ + responseField?: RenderOptions['response-field'] + + /** + * Name of the input element. + * @default `cf-turnstile-response` + */ + responseFieldName?: RenderOptions['response-field-name'] + + /** + * When `retry` is set to `'auto'`, `retryInterval` controls the time between retry attempts in milliseconds. The value must be a positive integer less than `900000`. When `retry` is set to `'never'`, this parameter has no effect. + * @default 8000 + */ + retryInterval?: RenderOptions['retry-interval'] + + /** + * The widget size. Can take the following values: `normal`, `compact`, and `invisible`. The normal size is 300x65px, the compact size is 130x120px, invisible will show no widget. + * @default `normal` + */ + size?: RenderOptions['size'] | 'invisible' + + /** + * Automatically refreshes the token when it expires. Can take `'auto'`, `'manual'` or `'never'`. + * @default `auto` + */ + refreshExpired?: RenderOptions['refresh-expired'] +} + +/** Custom options for the injected script. */ +interface ScriptOptions { + /** + * Custom nonce for the injected script. + * @default undefined + */ + nonce?: string + + /** + * Define if set the injected script as defer. + * @default true + */ + defer?: boolean + + /** + * Define if set the injected script as async. + * @default true + */ + async?: boolean + + /** + * compat mode for migrating. + * @default undefined + */ + compat?: 'recaptcha' + + /** + * Define if inject the script in the head or in the body. + * @default `head` + */ + appendTo?: 'head' | 'body' + + /** + * Custom ID of the injected script. + * @default `cf-turnstile-script` + */ + id?: string + + /** + * Custom name of the onload callback. + * @default `onloadTurnstileCallback` + */ + onLoadCallbackName?: string +} + +/** `` component props */ +interface TurnstileProps extends React.HTMLAttributes { + /** + * The sitekey of your widget. This sitekey is created upon the widget creation. + */ + siteKey: RenderOptions['sitekey'] + + /** + * Callback invoked upon success of the challenge. The callback is passed a token that can be validated. + * @param token - Token response. + */ + onSuccess?: RenderOptions['callback'] + + /** + * Callback invoked when a challenge expires and does not reset the widget. + */ + onExpire?: RenderOptions['expired-callback'] + + /** + * Callback invoked when there is an error (e.g. network error or the challenge failed). + */ + onError?: RenderOptions['error-callback'] + + /** + * Callback invoked before the challenge enters interactive mode. + */ + onBeforeInteractive?: RenderOptions['before-interactive-callback'] + + /** + * Callback invoked when challenge has left interactive mode. + */ + onAfterInteractive?: RenderOptions['after-interactive-callback'] + + /** + * Callback invoked when a given client/browser is not supported by Turnstile. + */ + onUnsupported?: RenderOptions['unsupported-callback'] + + /** + * Custom widget render options. See {@link https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#configurations the docs} for more info about this options. + */ + options?: ComponentRenderOptions + + /** + * Custom injected script options. + */ + scriptOptions?: ScriptOptions + + /** + * Define the HTML tag of the widget container. Default to `'div'`. + */ + as?: React.ElementType + + /** + * Controls if the script is automatically injected or not. If you want to inject the script manually, set this property to `false`. Default to `true`. + */ + injectScript?: boolean +} + +interface InjectTurnstileScriptParams { + render?: string + onLoadCallbackName?: string + scriptOptions?: Omit +} + +type ContainerSizeSet = { + [size in + | NonNullable + | 'interactionOnly']: React.CSSProperties +} + +type TurnstileLangCode = + | 'ar' + | 'ar-EG' + | 'de' + | 'en' + | 'es' + | 'fa' + | 'fr' + | 'id' + | 'it' + | 'ja' + | 'ko' + | 'nl' + | 'pl' + | 'pt' + | 'pt-BR' + | 'ru' + | 'tr' + | 'zh-CN' + | 'zh-TW' + +type TurnstileTheme = 'light' | 'dark' | 'auto' + +interface TurnstileServerValidationResponse { + /** Indicate if the token validation was successful or not. */ + success: boolean + /** The ISO timestamp for the time the challenge was solved. */ + challenge_ts?: string + /** The hostname for which the challenge was served. */ + hostname?: string + /** A list of errors that occurred. */ + 'error-codes'?: TurnstileServerValidationErrorCode[] + /** The customer widget identifier passed to the widget on the client side. This is used to differentiate widgets using the same sitekey in analytics. Its integrity is protected by modifications from an attacker. It is recommended to validate that the action matches an expected value. */ + action?: string + /** The customer data passed to the widget on the client side. This can be used by the customer to convey state. It is integrity protected by modifications from an attacker. */ + cdata?: string +} + +/** + * See {@link https://developers.cloudflare.com/turnstile/get-started/server-side-validation/#error-codes the docs} for more info about this error codes. + */ +type TurnstileServerValidationErrorCode = + /** The secret parameter was not passed. */ + | 'missing-input-secret' + /** The secret parameter was invalid or did not exist. */ + | 'invalid-input-secret' + /** The response parameter was not passed. */ + | 'missing-input-response' + /** The response parameter is invalid or has expired. */ + | 'invalid-input-response' + /** The widget ID extracted from the parsed site secret key was invalid or did not exist. */ + | 'invalid-widget-id' + /** The secret extracted from the parsed site secret key was invalid. */ + | 'invalid-parsed-secret' + /** The request was rejected because it was malformed. */ + | 'bad-request' + /** The response parameter has already been validated before. */ + | 'timeout-or-duplicate' + /** An internal error happened while validating the response. The request can be retried. */ + | 'internal-error' + +export type { + ContainerSizeSet, + InjectTurnstileScriptParams, + RenderOptions, + TurnstileInstance, + TurnstileLangCode, + TurnstileProps, + TurnstileServerValidationErrorCode, + TurnstileServerValidationResponse, + TurnstileTheme, +} diff --git a/src/components/Context/Turnstile/use-observe-script.ts b/src/components/Context/Turnstile/use-observe-script.ts new file mode 100644 index 0000000000..92e388eb1d --- /dev/null +++ b/src/components/Context/Turnstile/use-observe-script.ts @@ -0,0 +1,26 @@ +import { useEffect, useState } from 'react' + +import { checkElementExistence, DEFAULT_SCRIPT_ID } from './utils' + +export default function useObserveScript(scriptId = DEFAULT_SCRIPT_ID) { + const [scriptLoaded, setScriptLoaded] = useState(false) + + useEffect(() => { + const checkScriptExists = () => { + if (checkElementExistence(scriptId)) { + setScriptLoaded(true) + } + } + + const observer = new MutationObserver(checkScriptExists) + observer.observe(document, { childList: true, subtree: true }) + + checkScriptExists() + + return () => { + observer.disconnect() + } + }, [scriptId]) + + return scriptLoaded +} diff --git a/src/components/Context/Turnstile/utils.ts b/src/components/Context/Turnstile/utils.ts new file mode 100644 index 0000000000..7bd4770528 --- /dev/null +++ b/src/components/Context/Turnstile/utils.ts @@ -0,0 +1,126 @@ +import { + ContainerSizeSet, + InjectTurnstileScriptParams, + RenderOptions, +} from './types' + +export const SCRIPT_URL = + 'https://challenges.cloudflare.com/turnstile/v0/api.js' +export const DEFAULT_SCRIPT_ID = 'cf-turnstile-script' +export const DEFAULT_CONTAINER_ID = 'cf-turnstile' +export const DEFAULT_ONLOAD_NAME = 'onloadTurnstileCallback' + +/** + * Function to check if an element with the given id exists in the document. + * + * @param id Id of the element to check. + * @returns + */ +export const checkElementExistence = (id: string) => + !!document.getElementById(id) + +/** + * Function to inject the cloudflare turnstile script + * + * @param param0 + * @returns + */ +export const injectTurnstileScript = ({ + render = 'explicit', + onLoadCallbackName = DEFAULT_ONLOAD_NAME, + scriptOptions: { + nonce = '', + defer = true, + async = true, + id = '', + compat, + appendTo, + } = {}, +}: InjectTurnstileScriptParams) => { + const scriptId = id || DEFAULT_SCRIPT_ID + + if (checkElementExistence(scriptId)) { + return + } + + const script = document.createElement('script') + script.id = scriptId + + script.src = `${SCRIPT_URL}?onload=${onLoadCallbackName}&render=${render}` + if (compat) { + script.src = script.src + `&compat=${compat}` + } + + // Prevent duplicate script injection with the same src + if (document.querySelector(`script[src="${script.src}"]`)) { + return + } + + script.defer = !!defer + script.async = !!async + + if (nonce) { + script.nonce = nonce + } + + const parentEl = + appendTo === 'body' + ? document.body + : document.getElementsByTagName('head')[0] + + parentEl!.appendChild(script) +} + +/** + * A list of possible sizes for the container to reserve a place for the widget + * to load. + * + * A note for `invisible` size: The option added for the Invisible type of + * Turnstile. Invisible Turnstile will not show any of the widget, hence there + * is no height and width set to the style. This is only consumed in this + * library, and will not be forwarded to Turnstile. See + * {@link https://github.com/marsidev/react-turnstile/issues/7 marsidev/react-turnstile#7} + * to learn more. + * + * @link https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#widget-size + * + * @link https://developers.cloudflare.com/turnstile/reference/widget-types/#invisible + */ +export const CONTAINER_STYLE_SET: ContainerSizeSet = { + normal: { + width: 300, + height: 65, + }, + compact: { + width: 130, + height: 120, + }, + invisible: { + width: 0, + height: 0, + overflow: 'hidden', + }, + interactionOnly: { + width: 'fit-content', + height: 'auto', + }, +} + +/** + * Convert the size from component props, and filter it for Turnstile parameters + * while keeping the types. + * + * @param size Size from props. + * @returns + */ +export function getTurnstileSizeOpts( + size: keyof ContainerSizeSet +): RenderOptions['size'] { + let result: RenderOptions['size'] + + if (size !== 'invisible') { + result = size as RenderOptions['size'] + } + + return result +} diff --git a/src/components/Context/Viewer/index.tsx b/src/components/Context/Viewer/index.tsx index 28f8eb7c2c..9c41b145f0 100644 --- a/src/components/Context/Viewer/index.tsx +++ b/src/components/Context/Viewer/index.tsx @@ -68,8 +68,18 @@ const ViewerFragments = { private: gql` fragment ViewerUserPrivate on User { id + info { + socialAccounts { + type + userName + email + } + emailVerified + } status { role + hasEmailLoginPassword + changeEmailTimesLeft } articles(input: { first: 0 }) { totalCount @@ -88,20 +98,9 @@ export type Viewer = ViewerUser & { isArchived: boolean isBanned: boolean isFrozen: boolean - isOnboarding: boolean isInactive: boolean isCivicLiker: boolean shouldSetupLikerID: boolean - onboardingTasks: { - finished: boolean - tasks: { - likerId: boolean - followingTag: boolean - article: boolean - followee: boolean - commentPermission: boolean - } - } } export const processViewer = (viewer: ViewerUser): Viewer => { @@ -112,24 +111,10 @@ export const processViewer = (viewer: ViewerUser): Viewer => { const isBanned = state === 'banned' const isArchived = state === 'archived' const isFrozen = state === 'frozen' - const isOnboarding = state === 'onboarding' const isInactive = isAuthed && (isBanned || isFrozen || isArchived) const isCivicLiker = viewer.liker.civicLiker const shouldSetupLikerID = isAuthed && !viewer.liker.likerId - // Onbooarding Tasks - const hasLikerId = !!viewer.liker.likerId - const hasFollowingTag = viewer?.following?.tags.totalCount >= 5 - const hasArticle = viewer?.articles?.totalCount >= 1 - const hasFollowee = viewer?.following.users?.totalCount >= 5 - const hasCommentPermission = isAuthed && !isOnboarding - const isOnboardingTasksFinished = - hasLikerId && - hasFollowingTag && - hasArticle && - hasFollowee && - hasCommentPermission - // Add user info for Sentry import('@sentry/browser').then((Sentry) => { Sentry.configureScope((scope: any) => { @@ -148,20 +133,9 @@ export const processViewer = (viewer: ViewerUser): Viewer => { isBanned, isArchived, isFrozen, - isOnboarding, isInactive, isCivicLiker, shouldSetupLikerID, - onboardingTasks: { - finished: isOnboardingTasksFinished, - tasks: { - likerId: hasLikerId, - followingTag: hasFollowingTag, - article: hasArticle, - followee: hasFollowee, - commentPermission: hasCommentPermission, - }, - }, } } diff --git a/src/components/Context/index.ts b/src/components/Context/index.ts index aad5d0177e..35f6927a7e 100644 --- a/src/components/Context/index.ts +++ b/src/components/Context/index.ts @@ -1,4 +1,5 @@ export * from './Features' export * from './Language' export * from './ReCaptcha' +export * from './Turnstile' export * from './Viewer' diff --git a/src/components/Dialog/Content/index.tsx b/src/components/Dialog/Content/index.tsx index 87aeb772d8..0c430a28d5 100644 --- a/src/components/Dialog/Content/index.tsx +++ b/src/components/Dialog/Content/index.tsx @@ -6,11 +6,15 @@ interface DialogContentProps { noSpacing?: boolean smExtraSpacing?: boolean fixedHeight?: boolean + noSpacingBottom?: boolean + noMaxHeight?: boolean } const DialogContent: React.FC> = ({ noSpacing, smExtraSpacing = true, + noSpacingBottom, + noMaxHeight, fixedHeight, children, }) => { @@ -19,6 +23,8 @@ const DialogContent: React.FC> = ({ [styles.spacing]: !noSpacing, [styles.smExtraSpacing]: smExtraSpacing, [styles.fixedHeight]: !!fixedHeight, + [styles.noSpacingBottom]: !!noSpacingBottom, + [styles.noMaxHeight]: !!noMaxHeight, }) return

{children}
diff --git a/src/components/Dialog/Content/styles.module.css b/src/components/Dialog/Content/styles.module.css index 14df6cb23a..e4b49a410e 100644 --- a/src/components/Dialog/Content/styles.module.css +++ b/src/components/Dialog/Content/styles.module.css @@ -35,3 +35,11 @@ padding: 0 var(--spacing-base-loose); } } + +.noSpacingBottom { + padding-bottom: 0; +} + +.noMaxHeight { + max-height: none; +} diff --git a/src/components/Dialog/Footer/index.tsx b/src/components/Dialog/Footer/index.tsx index 07de64a27b..defa7f22c8 100644 --- a/src/components/Dialog/Footer/index.tsx +++ b/src/components/Dialog/Footer/index.tsx @@ -10,6 +10,8 @@ import styles from './styles.module.css' type FooterProps = { btns?: React.ReactNode smUpBtns?: React.ReactNode + smUpContentNoSpacingBottom?: boolean + smUpSpaceBetween?: boolean closeText?: React.ReactNode closeDialog?: () => any } @@ -17,6 +19,8 @@ type FooterProps = { const Footer: React.FC = ({ btns, smUpBtns, + smUpContentNoSpacingBottom = false, + smUpSpaceBetween = false, closeText, closeDialog, }) => { @@ -24,7 +28,9 @@ const Footer: React.FC = ({ return null } - const text = closeText || + const text = closeText || ( + + ) const footerClasses = classNames({ [styles.footer]: true, @@ -32,6 +38,12 @@ const Footer: React.FC = ({ const hasBtns = btns || closeDialog const hasSmUpBtns = smUpBtns || closeDialog + const smUpContentClasses = classNames({ + [styles.smUpContent]: true, + [styles.smUpSpaceBetween]: !!smUpSpaceBetween, + [styles.smUpContentNoSpacingBottom]: !!smUpContentNoSpacingBottom, + }) + return (